Commit cfbdc0de authored by YSPplayer's avatar YSPplayer Committed by GitHub

Update dialog and bot Zefra (#167)

parent d5995341
...@@ -213,3 +213,8 @@ SUPPORT_MASTER_RULE_2020 ...@@ -213,3 +213,8 @@ SUPPORT_MASTER_RULE_2020
Name=神数不神 Deck=Tearlaments Dialog=Zefra.zh-CN Name=神数不神 Deck=Tearlaments Dialog=Zefra.zh-CN
旧式地天使珠泪哀歌族卡组。 旧式地天使珠泪哀歌族卡组。
AI_LV3 SUPPORT_MASTER_RULE_2020 AI_LV3 SUPPORT_MASTER_RULE_2020
!神数不神-神数
Name=神数不神 Deck=Zefra Dialog=Zefra.zh-CN
神数卡组。
AI_LV3 SUPPORT_MASTER_RULE_2020
...@@ -50,5 +50,10 @@ ...@@ -50,5 +50,10 @@
"乎,我发动{0}!", "乎,我发动{0}!",
"不好意思拉,我有{0}", "不好意思拉,我有{0}",
"哈哈,发动{0}的效果!" "哈哈,发动{0}的效果!"
],
"custom": [
"呱!本体出征!",
"凸(艹皿艹 )卡手不玩拉!!!",
"嘿不慌,还有摆子场( ̄y▽ ̄)╭"
] ]
} }
...@@ -106,6 +106,16 @@ namespace WindBot.Game.AI.Decks ...@@ -106,6 +106,16 @@ namespace WindBot.Game.AI.Decks
private bool HeavymetalfoesElectrumite_activate = false; private bool HeavymetalfoesElectrumite_activate = false;
private bool should_destory = false; private bool should_destory = false;
private List<ClientCard> Odd_EyesMeteorburstDragon_materials = new List<ClientCard>(); private List<ClientCard> Odd_EyesMeteorburstDragon_materials = new List<ClientCard>();
private bool duel_start = true;
private int activate_count = 0;
private int summon_count = 0;
private bool enemy_activate = false;
private enum CustomMessage
{
Happy,
Angry,
Surprise
}
private static class Toos private static class Toos
{ {
public delegate bool Delegate(ClientCard card); public delegate bool Delegate(ClientCard card);
...@@ -437,21 +447,21 @@ namespace WindBot.Game.AI.Decks ...@@ -437,21 +447,21 @@ namespace WindBot.Game.AI.Decks
{ {
AddExecutor(ExecutorType.Activate, CardId.CalledbytheGrave, CalledbytheGraveEffect); AddExecutor(ExecutorType.Activate, CardId.CalledbytheGrave, CalledbytheGraveEffect);
AddExecutor(ExecutorType.Activate, CardId.BorreloadSavageDragon, BorreloadSavageDragonEffect_2); AddExecutor(ExecutorType.Activate, CardId.BorreloadSavageDragon, BorreloadSavageDragonEffect_2);
AddExecutor(ExecutorType.Activate, CardId.F_A_DawnDragster); AddExecutor(ExecutorType.Activate, CardId.F_A_DawnDragster, ResetFlag);
AddExecutor(ExecutorType.Activate, CardId.NinePillarsofYangZing, NinePillarsofYangZingEffect); AddExecutor(ExecutorType.Activate, CardId.NinePillarsofYangZing, NinePillarsofYangZingEffect);
AddExecutor(ExecutorType.Activate, CardId.ZefraDivineStrike, ZefraDivineStrikeEffect); AddExecutor(ExecutorType.Activate, CardId.ZefraDivineStrike, ZefraDivineStrikeEffect);
AddExecutor(ExecutorType.Activate, CardId.HeraldoftheArcLight, HeraldoftheArcLightEffect); AddExecutor(ExecutorType.Activate, CardId.HeraldoftheArcLight, HeraldoftheArcLightEffect);
AddExecutor(ExecutorType.Activate, CardId.TruKingofAllCalamities,TruKingofAllCalamitiesEffect); AddExecutor(ExecutorType.Activate, CardId.TruKingofAllCalamities, TruKingofAllCalamitiesEffect);
AddExecutor(ExecutorType.Activate, CardId.PSY_FramegearGamma); AddExecutor(ExecutorType.Activate, CardId.PSY_FramegearGamma, ResetFlag);
AddExecutor(ExecutorType.Activate, CardId.MaxxC, DefaultMaxxC); AddExecutor(ExecutorType.Activate, CardId.MaxxC, DefaultMaxxC);
AddExecutor(ExecutorType.Activate, CardId.SupremeKingDragonDarkwurm, SupremeKingDragonDarkwurmEffect); AddExecutor(ExecutorType.Activate, CardId.SupremeKingDragonDarkwurm, SupremeKingDragonDarkwurmEffect);
AddExecutor(ExecutorType.Activate, CardId.ServantofEndymion, ServantofEndymionEffect); AddExecutor(ExecutorType.Activate, CardId.ServantofEndymion, ServantofEndymionEffect);
AddExecutor(ExecutorType.Activate, CardId.Terraforming, TerraformingEffect); AddExecutor(ExecutorType.Activate, CardId.Terraforming, TerraformingEffect);
AddExecutor(ExecutorType.Activate, CardId.SpellPowerMastery); AddExecutor(ExecutorType.Activate, CardId.SpellPowerMastery, ResetFlag);
AddExecutor(ExecutorType.Activate, CardId.DragonShrine, DragonShrineEffect); AddExecutor(ExecutorType.Activate, CardId.DragonShrine, DragonShrineEffect);
AddExecutor(ExecutorType.Activate, CardId.FoolishBurial, FoolishBurialEffect); AddExecutor(ExecutorType.Activate, CardId.FoolishBurial, FoolishBurialEffect);
AddExecutor(ExecutorType.Activate, CardId.DarkContractwiththGate, DarkContractwiththGateEffect); AddExecutor(ExecutorType.Activate, CardId.DarkContractwiththGate, DarkContractwiththGateEffect);
AddExecutor(ExecutorType.Activate, CardId.Terraforming); AddExecutor(ExecutorType.Activate, CardId.Terraforming, ResetFlag);
AddExecutor(ExecutorType.Activate, CardId.OracleofZefra, OracleofZefraEffect); AddExecutor(ExecutorType.Activate, CardId.OracleofZefra, OracleofZefraEffect);
AddExecutor(ExecutorType.Activate, CardId.ZefraProvidence, ZefraProvidenceEffect); AddExecutor(ExecutorType.Activate, CardId.ZefraProvidence, ZefraProvidenceEffect);
AddExecutor(ExecutorType.Activate, CardId.AstrographSorcerer, AstrographSorcererEffect); AddExecutor(ExecutorType.Activate, CardId.AstrographSorcerer, AstrographSorcererEffect);
...@@ -487,7 +497,7 @@ namespace WindBot.Game.AI.Decks ...@@ -487,7 +497,7 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Activate, CardId.Blackwing_ZephyrostheElite, Blackwing_ZephyrostheEliteEffect); AddExecutor(ExecutorType.Activate, CardId.Blackwing_ZephyrostheElite, Blackwing_ZephyrostheEliteEffect);
AddExecutor(ExecutorType.SpSummon, CardId.Raidraptor_ForceStrix, Raidraptor_ForceStrixSummon); AddExecutor(ExecutorType.SpSummon, CardId.Raidraptor_ForceStrix, Raidraptor_ForceStrixSummon);
AddExecutor(ExecutorType.Activate, CardId.Raidraptor_ForceStrix, Raidraptor_ForceStrixEffect); AddExecutor(ExecutorType.Activate, CardId.Raidraptor_ForceStrix, Raidraptor_ForceStrixEffect);
AddExecutor(ExecutorType.Activate, CardId.Rank_Up_MagicSoulShaveForce); AddExecutor(ExecutorType.Activate, CardId.Rank_Up_MagicSoulShaveForce, ResetFlag);
AddExecutor(ExecutorType.Activate, CardId.Raider_Wing, Raider_WingEffect); AddExecutor(ExecutorType.Activate, CardId.Raider_Wing, Raider_WingEffect);
AddExecutor(ExecutorType.SpSummon, CardId.Raidraptor_SingingLanius); AddExecutor(ExecutorType.SpSummon, CardId.Raidraptor_SingingLanius);
//xyz mode //xyz mode
...@@ -520,7 +530,7 @@ namespace WindBot.Game.AI.Decks ...@@ -520,7 +530,7 @@ namespace WindBot.Game.AI.Decks
CardId.DDSavantKepler,CardId.StellarknightZefraxciton,CardId.ShaddollZefracore,CardId.SupremeKingDragonDarkwurm}; CardId.DDSavantKepler,CardId.StellarknightZefraxciton,CardId.ShaddollZefracore,CardId.SupremeKingDragonDarkwurm};
for (int i = 0; i < p_summon_ids.Count; ++i) AddExecutor(ExecutorType.Summon, p_summon_ids[i], DefaultSummon); for (int i = 0; i < p_summon_ids.Count; ++i) AddExecutor(ExecutorType.Summon, p_summon_ids[i], DefaultSummon);
AddExecutor(ExecutorType.Summon, DefaultSummon); AddExecutor(ExecutorType.Summon, DefaultSummon);
AddExecutor(ExecutorType.Activate, CardId.Deskbot001); AddExecutor(ExecutorType.Activate, CardId.Deskbot001, ResetFlag);
AddExecutor(ExecutorType.Activate, CardId.TheMightyMasterofMagic, TheMightyMasterofMagicEffect); AddExecutor(ExecutorType.Activate, CardId.TheMightyMasterofMagic, TheMightyMasterofMagicEffect);
AddExecutor(ExecutorType.Activate, CardId.DestrudotheLostDragon_Frisson, DestrudotheLostDragon_FrissonEffect); AddExecutor(ExecutorType.Activate, CardId.DestrudotheLostDragon_Frisson, DestrudotheLostDragon_FrissonEffect);
AddExecutor(ExecutorType.Summon, CardId.Blackwing_ZephyrostheElite, DefaultSummon_2); AddExecutor(ExecutorType.Summon, CardId.Blackwing_ZephyrostheElite, DefaultSummon_2);
...@@ -530,9 +540,15 @@ namespace WindBot.Game.AI.Decks ...@@ -530,9 +540,15 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.SpellSet, SpellSet_2); AddExecutor(ExecutorType.SpellSet, SpellSet_2);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
AddExecutor(ExecutorType.Activate, DefaultPActivate); AddExecutor(ExecutorType.Activate, DefaultPActivate);
AddExecutor(ExecutorType.GoToEndPhase, GoToEndPhase);
} }
public override void OnNewTurn() public override void OnNewTurn()
{ {
if (duel_start)
{
duel_start = false;
AI.SendCustomChat((int)CustomMessage.Happy);
}
activate_SupremeKingDragonDarkwurm_1 = false; activate_SupremeKingDragonDarkwurm_1 = false;
activate_SupremeKingDragonDarkwurm_2 = false; activate_SupremeKingDragonDarkwurm_2 = false;
activate_JetSynchron = false; activate_JetSynchron = false;
...@@ -554,17 +570,25 @@ namespace WindBot.Game.AI.Decks ...@@ -554,17 +570,25 @@ namespace WindBot.Game.AI.Decks
HeavymetalfoesElectrumite_activate = false; HeavymetalfoesElectrumite_activate = false;
spell_activate_count = 0; spell_activate_count = 0;
p_count = 0; p_count = 0;
activate_count = 0;
summon_count = 0;
enemy_activate = false;
} }
private bool ZefraProvidenceEffect() private bool ZefraProvidenceEffect()
{ {
if (Card.Location == CardLocation.Grave) if (ActivateDescription == 96)
{ {
return true; if (should_destory)
{
should_destory = false;
return false;
}
return BeforeResult(ExecutorType.Activate);
} }
else else
{ {
activate_ZefraProvidence = true; activate_ZefraProvidence = true;
return true; return BeforeResult(ExecutorType.Activate);
} }
} }
...@@ -589,7 +613,7 @@ namespace WindBot.Game.AI.Decks ...@@ -589,7 +613,7 @@ namespace WindBot.Game.AI.Decks
List<ClientCard> pSpsummonMonster = func.CardsCheckWhere(spSummonMonster, func.HasType, CardType.Pendulum); List<ClientCard> pSpsummonMonster = func.CardsCheckWhere(spSummonMonster, func.HasType, CardType.Pendulum);
List<ClientCard> monsterCards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone), card => List<ClientCard> monsterCards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone), card =>
{ return card.IsFaceup() && card.HasType(CardType.Pendulum); }); { return card.IsFaceup() && card.HasType(CardType.Pendulum); });
if (Func.MergeList(pSpsummonMonster, monsterCards).Count <= 0) extra_ids.Remove(CardId.HeavymetalfoesElectrumite); if (Func.MergeList(pSpsummonMonster, monsterCards).Count <= 0) extra_ids.Remove(CardId.HeavymetalfoesElectrumite);
} }
else else
...@@ -615,7 +639,7 @@ namespace WindBot.Game.AI.Decks ...@@ -615,7 +639,7 @@ namespace WindBot.Game.AI.Decks
Func.GetZoneCards(Bot, CardLocation.MonsterZone, true).Count > 0)) Func.GetZoneCards(Bot, CardLocation.MonsterZone, true).Count > 0))
{ {
summoned = true; summoned = true;
return true; return BeforeResult(ExecutorType.Summon);
} }
return false; return false;
} }
...@@ -630,11 +654,11 @@ namespace WindBot.Game.AI.Decks ...@@ -630,11 +654,11 @@ namespace WindBot.Game.AI.Decks
{ {
AI.SelectCard(CardId.Raider_Wing); AI.SelectCard(CardId.Raider_Wing);
AI.SelectNextCard(CardId.Raidraptor_SingingLanius); AI.SelectNextCard(CardId.Raidraptor_SingingLanius);
return true; return BeforeResult(ExecutorType.Activate);
} }
private bool Raidraptor_ForceStrixSummon() private bool Raidraptor_ForceStrixSummon()
{ {
return xyz_mode; return xyz_mode && BeforeResult(ExecutorType.Summon);
} }
private bool Blackwing_ZephyrostheEliteEffect_2() private bool Blackwing_ZephyrostheEliteEffect_2()
...@@ -642,22 +666,22 @@ namespace WindBot.Game.AI.Decks ...@@ -642,22 +666,22 @@ namespace WindBot.Game.AI.Decks
if (!xyz_mode && Bot.GetMonstersInMainZone().Count > 4) return false; if (!xyz_mode && Bot.GetMonstersInMainZone().Count > 4) return false;
List<ClientCard> cards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.Onfield, true), card => { List<ClientCard> cards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.Onfield, true), card => {
return !IsNoLinkCards(card) && !card.IsExtraCard() && !(card.Location == CardLocation.SpellZone return !IsNoLinkCards(card) && !card.IsExtraCard() && !(card.Location == CardLocation.SpellZone
&& Func.IsCode(card,CardId.SaryujaSkullDread,CardId.MechaPhantomBeastAuroradon,CardId.HeavymetalfoesElectrumite,CardId.CrystronHalqifibrax,CardId.Raidraptor_WiseStrix, && Func.IsCode(card, CardId.SaryujaSkullDread, CardId.MechaPhantomBeastAuroradon, CardId.HeavymetalfoesElectrumite, CardId.CrystronHalqifibrax, CardId.Raidraptor_WiseStrix,
CardId.Linkuriboh)); CardId.Linkuriboh));
}); });
if (cards.Count <= 0 || (cards.Count < 2 && func.CardsCheckCount(cards, func.HasLevel, 4) == cards.Count)) if (cards.Count <= 0 || (cards.Count < 2 && func.CardsCheckCount(cards, func.HasLevel, 4) == cards.Count))
{ {
Blackwing_ZephyrostheElite_activate = true; Blackwing_ZephyrostheElite_activate = true;
return false; return false;
} }
cards.Sort((cardA, cardB) => cards.Sort((cardA, cardB) =>
{ {
if (cardA.Location != CardLocation.MonsterZone && cardB.Location == CardLocation.MonsterZone) return -1; if (cardA.Location != CardLocation.MonsterZone && cardB.Location == CardLocation.MonsterZone) return -1;
if (cardA.Location == CardLocation.MonsterZone && cardB.Location != CardLocation.MonsterZone) return 1; if (cardA.Location == CardLocation.MonsterZone && cardB.Location != CardLocation.MonsterZone) return 1;
if (cardA.Location == CardLocation.SpellZone && cardB.Location == CardLocation.SpellZone) if (cardA.Location == CardLocation.SpellZone && cardB.Location == CardLocation.SpellZone)
{ {
if(cardA.IsCode(CardId.OracleofZefra) && !cardB.IsCode(CardId.OracleofZefra)) return -1; if (cardA.IsCode(CardId.OracleofZefra) && !cardB.IsCode(CardId.OracleofZefra)) return -1;
if(!cardA.IsCode(CardId.OracleofZefra) && cardB.IsCode(CardId.OracleofZefra))return 1; if (!cardA.IsCode(CardId.OracleofZefra) && cardB.IsCode(CardId.OracleofZefra)) return 1;
return 0; return 0;
} }
if (xyz_mode) if (xyz_mode)
...@@ -673,14 +697,46 @@ namespace WindBot.Game.AI.Decks ...@@ -673,14 +697,46 @@ namespace WindBot.Game.AI.Decks
}); });
Blackwing_ZephyrostheElite_activate = false; Blackwing_ZephyrostheElite_activate = false;
AI.SelectCard(cards); AI.SelectCard(cards);
return BeforeResult(ExecutorType.Activate);
}
public override void OnChaining(int player, ClientCard card)
{
if (card == null) return;
if (player == 1 && Func.IsCode(card, 14558127, 59438930, 94145021, 38814750, 73642296, 97268402))
enemy_activate = true;
base.OnChaining(player, card);
}
private bool BeforeResult(ExecutorType type)
{
if (type == ExecutorType.Activate)
{
ResetFlag();
++activate_count;
}
if (type == ExecutorType.Summon)
{
++summon_count;
}
return true; return true;
} }
private bool GoToEndPhase()
{
if (Duel.Player == 0 && Duel.Turn == 1 && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), IsNoLinkCards) <= 0
&& activate_count + summon_count < 5 && !enemy_activate)
{
AI.SendCustomChat((int)CustomMessage.Angry);
return true;
}
return false;
}
private bool DefaultPActivate() private bool DefaultPActivate()
{ {
if (PendulumActivate() && Func.IsCode(Card,CardId.Zefraxi_TreasureoftheYangZing, CardId.SecretoftheYangZing)) if (PendulumActivate() && Func.IsCode(Card, CardId.Zefraxi_TreasureoftheYangZing, CardId.SecretoftheYangZing))
{ {
return Bot.HasInHandOrInSpellZone(CardId.NinePillarsofYangZing) && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.SpellZone, return Bot.HasInHandOrInSpellZone(CardId.NinePillarsofYangZing) && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.SpellZone,
true), card => { return Func.IsCode(Card, CardId.Zefraxi_TreasureoftheYangZing, CardId.SecretoftheYangZing); }) <= 0; true), card => { return Func.IsCode(Card, CardId.Zefraxi_TreasureoftheYangZing, CardId.SecretoftheYangZing); }) <= 0 && BeforeResult(ExecutorType.Activate);
} }
return false; return false;
} }
...@@ -693,7 +749,7 @@ namespace WindBot.Game.AI.Decks ...@@ -693,7 +749,7 @@ namespace WindBot.Game.AI.Decks
{ {
if (!xyz_mode) return false; if (!xyz_mode) return false;
AI.SelectMaterials(CardId.Raidraptor_ArsenalFalcon, CardId.Blackwing_ZephyrostheElite); AI.SelectMaterials(CardId.Raidraptor_ArsenalFalcon, CardId.Blackwing_ZephyrostheElite);
return true; return BeforeResult(ExecutorType.Summon);
} }
private bool Raidraptor_WiseStrixEffect() private bool Raidraptor_WiseStrixEffect()
{ {
...@@ -705,17 +761,17 @@ namespace WindBot.Game.AI.Decks ...@@ -705,17 +761,17 @@ namespace WindBot.Game.AI.Decks
if (HasInDeck(CardId.Raider_Wing)) ++count; if (HasInDeck(CardId.Raider_Wing)) ++count;
if (count <= 1) return false; if (count <= 1) return false;
AI.SelectCard(CardId.Raider_Wing); AI.SelectCard(CardId.Raider_Wing);
return true; return BeforeResult(ExecutorType.Activate);
} }
return true; return BeforeResult(ExecutorType.Activate);
} }
private bool Raidraptor_ArsenalFalconEffect() private bool Raidraptor_ArsenalFalconEffect()
{ {
if (Card.Location == CardLocation.MonsterZone) if (Card.Location == CardLocation.MonsterZone)
{ {
AI.SelectCard(CardId.SupremeKingGateZero); AI.SelectCard(CardId.SupremeKingGateZero);
AI.SelectNextCard(new int[] {CardId.Blackwing_ZephyrostheElite,CardId.Raider_Wing,CardId.Raidraptor_SingingLanius}); AI.SelectNextCard(new int[] { CardId.Blackwing_ZephyrostheElite, CardId.Raider_Wing, CardId.Raidraptor_SingingLanius });
return true; return BeforeResult(ExecutorType.Activate);
} }
return false; return false;
} }
...@@ -727,7 +783,7 @@ namespace WindBot.Game.AI.Decks ...@@ -727,7 +783,7 @@ namespace WindBot.Game.AI.Decks
if (materials_lists.Count <= 0) return false; if (materials_lists.Count <= 0) return false;
AI.SelectMaterials(materials_lists[0]); AI.SelectMaterials(materials_lists[0]);
xyz_mode = true; xyz_mode = true;
return true; return BeforeResult(ExecutorType.Summon);
} }
private bool Odd_EyesMeteorburstDragonCheck() private bool Odd_EyesMeteorburstDragonCheck()
{ {
...@@ -740,6 +796,14 @@ namespace WindBot.Game.AI.Decks ...@@ -740,6 +796,14 @@ namespace WindBot.Game.AI.Decks
var materials_sy_lists = Util.GetSynchroMaterials(pre_materials, 7, 1, 1, false, true, null, card => { return !card.IsCode(CardId.MythicalBeastJackalKing) && !card.IsCode(CardId.HeraldoftheArcLight); }); var materials_sy_lists = Util.GetSynchroMaterials(pre_materials, 7, 1, 1, false, true, null, card => { return !card.IsCode(CardId.MythicalBeastJackalKing) && !card.IsCode(CardId.HeraldoftheArcLight); });
if (materials_sy_lists.Count <= 0) return false; if (materials_sy_lists.Count <= 0) return false;
Odd_EyesMeteorburstDragon_materials.Clear(); Odd_EyesMeteorburstDragon_materials.Clear();
foreach (var materials in materials_sy_lists)
{
if (func.CardsCheckCount(materials, func.IsCode, CardId.SupremeKingGateZero) > 0)
{
Odd_EyesMeteorburstDragon_materials.AddRange(materials);
return true;
}
}
Odd_EyesMeteorburstDragon_materials.AddRange(materials_sy_lists[0]); Odd_EyesMeteorburstDragon_materials.AddRange(materials_sy_lists[0]);
return true; return true;
} }
...@@ -747,38 +811,38 @@ namespace WindBot.Game.AI.Decks ...@@ -747,38 +811,38 @@ namespace WindBot.Game.AI.Decks
{ {
if (!Odd_EyesMeteorburstDragonCheck()) return false; if (!Odd_EyesMeteorburstDragonCheck()) return false;
AI.SelectMaterials(Odd_EyesMeteorburstDragon_materials); AI.SelectMaterials(Odd_EyesMeteorburstDragon_materials);
return true; return BeforeResult(ExecutorType.Summon);
} }
private bool Odd_EyesMeteorburstDragonEffect() private bool Odd_EyesMeteorburstDragonEffect()
{ {
AI.SelectCard(CardId.SupremeKingGateZero); AI.SelectCard(CardId.SupremeKingGateZero);
return true; return BeforeResult(ExecutorType.Activate);
} }
private bool DDSavantKeplerSummon() private bool DDSavantKeplerSummon()
{ {
if (HasInDeck(CardId.DarkContractwiththGate)) if (HasInDeck(CardId.DarkContractwiththGate))
{ {
summoned = true; summoned = true;
return true; return BeforeResult(ExecutorType.Summon);
} }
return false; return false;
} }
// private void DebugCards(string msg, IList<ClientCard> cards) // private void DebugCards(string msg, IList<ClientCard> cards)
// { // {
//#if DEBUG //#if DEBUG
// Logger.DebugWriteLine(cards.Count + msg); // Logger.DebugWriteLine(cards.Count + msg);
// foreach (var card in cards) // foreach (var card in cards)
// { // {
// if (card == null) continue; // if (card == null) continue;
// NamedCard namedCard = NamedCard.Get(card.Id); // NamedCard namedCard = NamedCard.Get(card.Id);
// if (namedCard == null) continue; // if (namedCard == null) continue;
// Logger.DebugWriteLine(msg + namedCard.Name); // Logger.DebugWriteLine(msg + namedCard.Name);
// } // }
//#endif //#endif
// } // }
private bool ServantofEndymionEffect_2() private bool ServantofEndymionEffect_2()
{ {
if (Card.Location == CardLocation.SpellZone) return true; if (Card.Location == CardLocation.SpellZone) return BeforeResult(ExecutorType.Activate);
return false; return false;
} }
private bool IsSpsummonPMonster(ClientCard card) private bool IsSpsummonPMonster(ClientCard card)
...@@ -808,7 +872,7 @@ namespace WindBot.Game.AI.Decks ...@@ -808,7 +872,7 @@ namespace WindBot.Game.AI.Decks
if (!activate_OracleofZefra && func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.OracleofZefra)) ++count; if (!activate_OracleofZefra && func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.OracleofZefra)) ++count;
if (func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.Terraforming) && HasInDeck(CardId.OracleofZefra)) ++count; if (func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.Terraforming) && HasInDeck(CardId.OracleofZefra)) ++count;
if (func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.FoolishBurial)) ++count; if (func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.FoolishBurial)) ++count;
if (func.CardsCheckCount(Bot.Hand, func.HasType, CardType.Pendulum) > 1 && Bot.SpellZone[0] == null && if (func.CardsCheckCount(Bot.Hand, func.HasType, CardType.Pendulum) > 1 && Bot.SpellZone[0] == null &&
Bot.SpellZone[4] == null) ++count; Bot.SpellZone[4] == null) ++count;
if (!summoned && Bot.HasInHand(CardId.DDSavantKepler) && HasInDeck(CardId.DarkContractwiththGate)) ++count; if (!summoned && Bot.HasInHand(CardId.DDSavantKepler) && HasInDeck(CardId.DarkContractwiththGate)) ++count;
return count; return count;
...@@ -817,7 +881,7 @@ namespace WindBot.Game.AI.Decks ...@@ -817,7 +881,7 @@ namespace WindBot.Game.AI.Decks
{ {
if (PendulumActivate()) if (PendulumActivate())
{ {
return PendulumDefaultActivate(); return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate);
} }
return false; return false;
} }
...@@ -826,15 +890,16 @@ namespace WindBot.Game.AI.Decks ...@@ -826,15 +890,16 @@ namespace WindBot.Game.AI.Decks
if (Duel.LastChainPlayer == 0) return false; if (Duel.LastChainPlayer == 0) return false;
AI.SelectCard(CardId.RitualBeastTamerZeframpilica, CardId.SatellarknightZefrathuban, CardId.StellarknightZefraxciton, CardId.FlameBeastoftheNekroz, CardId.ShaddollZefracore, AI.SelectCard(CardId.RitualBeastTamerZeframpilica, CardId.SatellarknightZefrathuban, CardId.StellarknightZefraxciton, CardId.FlameBeastoftheNekroz, CardId.ShaddollZefracore,
CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing); CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing);
return true; return BeforeResult(ExecutorType.Activate);
} }
private bool NinePillarsofYangZingEffect() private bool NinePillarsofYangZingEffect()
{ {
if (Duel.LastChainPlayer == 0) return false; if (Duel.LastChainPlayer == 0) return false;
List<ClientCard> cards = func.CardsIdToClientCards(new List<int> { CardId.SecretoftheYangZing },Bot.MonsterZone); List<ClientCard> cards = func.CardsIdToClientCards(new List<int> { CardId.SecretoftheYangZing }, Bot.MonsterZone);
cards.AddRange(func.CardsIdToClientCards(new List<int> { CardId.SecretoftheYangZing,CardId.Zefraxi_TreasureoftheYangZing }, Bot.SpellZone)); cards.AddRange(func.CardsIdToClientCards(new List<int> { CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing }, Bot.SpellZone));
AI.SelectCard(cards); AI.SelectCard(cards);
return true; should_destory = true;
return BeforeResult(ExecutorType.Activate);
} }
private bool IsActivateBlackwing_ZephyrostheElite() private bool IsActivateBlackwing_ZephyrostheElite()
{ {
...@@ -848,19 +913,19 @@ namespace WindBot.Game.AI.Decks ...@@ -848,19 +913,19 @@ namespace WindBot.Game.AI.Decks
{ {
if (PendulumActivate()) if (PendulumActivate())
{ {
if (IsActivateBlackwing_ZephyrostheElite()) return true; if (IsActivateBlackwing_ZephyrostheElite()) return BeforeResult(ExecutorType.Activate);
if ((!HasInDeck(CardId.TheMightyMasterofMagic) && !HasInDeck(CardId.MythicalBeastJackalKing) || GetSpellActivateCount() < 2)) return false; if ((!HasInDeck(CardId.TheMightyMasterofMagic) && !HasInDeck(CardId.MythicalBeastJackalKing) || GetSpellActivateCount() < 2)) return false;
return true; return BeforeResult(ExecutorType.Activate);
} }
else if (Card.Location == CardLocation.SpellZone) else if (Card.Location == CardLocation.SpellZone)
{ {
if (func.HasInZone(Bot, CardLocation.Hand | CardLocation.PendulumZone, CardId.Zefraath, true)) if (func.HasInZone(Bot, CardLocation.Hand | CardLocation.PendulumZone, CardId.Zefraath, true))
{ {
return func.CardsCheckAny(Bot.Hand, IsSpsummonPMonster); return func.CardsCheckAny(Bot.Hand, IsSpsummonPMonster) && BeforeResult(ExecutorType.Activate);
} }
return true; return BeforeResult(ExecutorType.Activate);
} }
else if (Card.Location == CardLocation.MonsterZone) return true; else if (Card.Location == CardLocation.MonsterZone) return BeforeResult(ExecutorType.Activate);
else return false; else return false;
} }
private bool IsZefraScaleAbove(ClientCard card) private bool IsZefraScaleAbove(ClientCard card)
...@@ -873,16 +938,16 @@ namespace WindBot.Game.AI.Decks ...@@ -873,16 +938,16 @@ namespace WindBot.Game.AI.Decks
} }
private bool TerraformingEffect() private bool TerraformingEffect()
{ {
return Bot.HasInHand(CardId.OracleofZefra); return Bot.HasInHand(CardId.OracleofZefra) && BeforeResult(ExecutorType.Activate);
} }
private bool DDSavantKeplerEffect() private bool DDSavantKeplerEffect()
{ {
if (PendulumActivate()) return false; if (PendulumActivate()) return false;
return true; return BeforeResult(ExecutorType.Activate);
} }
private bool FoolishBurialEffect() private bool FoolishBurialEffect()
{ {
return true; return BeforeResult(ExecutorType.Activate);
} }
private List<ClientCard> GetSynchroMaterials() private List<ClientCard> GetSynchroMaterials()
{ {
...@@ -892,28 +957,31 @@ namespace WindBot.Game.AI.Decks ...@@ -892,28 +957,31 @@ namespace WindBot.Game.AI.Decks
} }
private bool DestrudotheLostDragon_FrissonEffect() private bool DestrudotheLostDragon_FrissonEffect()
{ {
if (Bot.HasInExtra(CardId.CrystronHalqifibrax)) return true; if (Bot.HasInExtra(CardId.CrystronHalqifibrax)) return BeforeResult(ExecutorType.Activate);
if (!Bot.HasInExtra(CardId.F_A_DawnDragster) && !Bot.HasInExtra(CardId.Odd_EyesMeteorburstDragon)) return false; if (!Bot.HasInExtra(CardId.F_A_DawnDragster) && !Bot.HasInExtra(CardId.Odd_EyesMeteorburstDragon)) return false;
List<ClientCard> pre_materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true),card => { return SecretoftheYangZingCheck(card) && !IsNoLinkCards(card) && !card.HasType(CardType.Tuner) && card.Level > 0;}); List<ClientCard> pre_materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), card => { return SecretoftheYangZingCheck(card) && !IsNoLinkCards(card) && !card.HasType(CardType.Tuner) && card.Level > 0; });
if (pre_materials.Count <= 0) return false; if (pre_materials.Count <= 0) return false;
List<ClientCard> cards = func.CardsCheckWhere(Func.GetZoneCards(Bot,CardLocation.MonsterZone,true),card=> List<ClientCard> cards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), card =>
{ {
return !IsNoLinkCards(card) && card.Level > 0 && !card.HasType(CardType.Tuner); return !IsNoLinkCards(card) && card.Level > 0 && !card.HasType(CardType.Tuner);
}); });
if (cards.Count <= 0) return false; if (cards.Count <= 0) return false;
AI.SelectCard(cards); AI.SelectCard(cards);
return true; return BeforeResult(ExecutorType.Activate);
} }
private bool IsCanSynchroSummon(int level) private bool IsCanSynchroSummon(int level)
{ {
return func.CardsCheckAny(GetSynchroMaterials(), card => { return (card.Level + level == 8 return func.CardsCheckAny(GetSynchroMaterials(), card => {
&& func.CardsCheckAny(Bot.ExtraDeck, synchro_card => { return Func.IsCode(synchro_card, CardId.BorreloadSavageDragon, CardId.PSY_FramelordOmega); })) return (card.Level + level == 8
|| (card.Level + level == 7 && SecretoftheYangZingCheck(card) && func.CardsCheckAny(Bot.ExtraDeck, synchro_card => { return Func.IsCode(synchro_card, CardId.Odd_EyesMeteorburstDragon, CardId.F_A_DawnDragster); })) && func.CardsCheckAny(Bot.ExtraDeck, synchro_card => { return Func.IsCode(synchro_card, CardId.BorreloadSavageDragon, CardId.PSY_FramelordOmega); }))
|| (card.Level + level == 5 && Bot.HasInExtra(CardId.Denglong_FirstoftheYangZing)) || (card.Level + level == 7 && SecretoftheYangZingCheck(card) && func.CardsCheckAny(Bot.ExtraDeck, synchro_card => { return Func.IsCode(synchro_card, CardId.Odd_EyesMeteorburstDragon, CardId.F_A_DawnDragster); }))
|| (card.Level + level == 4 && Bot.HasInExtra(CardId.HeraldoftheArcLight)); }); || (card.Level + level == 5 && Bot.HasInExtra(CardId.Denglong_FirstoftheYangZing))
|| (card.Level + level == 4 && Bot.HasInExtra(CardId.HeraldoftheArcLight));
});
} }
private bool DDLamiaEffect() private bool DDLamiaEffect()
{ {
if (Bot.HasInExtra(CardId.MechaPhantomBeastAuroradon) && Bot.GetMonstersInMainZone().Count >= 3) return false;
if (!Bot.HasInExtra(CardId.CrystronHalqifibrax) && !IsCanSynchroSummon(Card.Level)) return false; if (!Bot.HasInExtra(CardId.CrystronHalqifibrax) && !IsCanSynchroSummon(Card.Level)) return false;
AI.SelectCard(CardId.DarkContractwiththGate, CardId.DDSavantKepler); AI.SelectCard(CardId.DarkContractwiththGate, CardId.DDSavantKepler);
activate_DDLamia = true; activate_DDLamia = true;
...@@ -921,15 +989,15 @@ namespace WindBot.Game.AI.Decks ...@@ -921,15 +989,15 @@ namespace WindBot.Game.AI.Decks
} }
private bool DragonShrineEffect() private bool DragonShrineEffect()
{ {
return true; return BeforeResult(ExecutorType.Activate);
} }
private bool ZefraathEffect() private bool ZefraathEffect()
{ {
if (PendulumActivate()) return !activate_p_Zefraath || IsActivateBlackwing_ZephyrostheElite(); if (PendulumActivate()) return !activate_p_Zefraath || IsActivateBlackwing_ZephyrostheElite();
if (Card.Location == CardLocation.SpellZone) if (Card.Location == CardLocation.SpellZone)
{ {
activate_p_Zefraath = true; activate_p_Zefraath = true;
return true; return BeforeResult(ExecutorType.Activate);
} }
return false; return false;
} }
...@@ -937,9 +1005,9 @@ namespace WindBot.Game.AI.Decks ...@@ -937,9 +1005,9 @@ namespace WindBot.Game.AI.Decks
{ {
if (PendulumActivate()) if (PendulumActivate())
{ {
return PendulumDefaultActivate(); return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate);
} }
return true; return BeforeResult(ExecutorType.Activate);
} }
private bool BorreloadSavageDragonSummon_2() private bool BorreloadSavageDragonSummon_2()
{ {
...@@ -948,19 +1016,19 @@ namespace WindBot.Game.AI.Decks ...@@ -948,19 +1016,19 @@ namespace WindBot.Game.AI.Decks
} }
private bool BorreloadSavageDragonSummon() private bool BorreloadSavageDragonSummon()
{ {
var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone,Card.Level,1,1,false,true,null, var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone, Card.Level, 1, 1, false, true, null,
card=> { return !card.IsCode(CardId.F_A_DawnDragster) && !card.IsCode(CardId.TheMightyMasterofMagic) && !card.IsCode(CardId.HeraldoftheArcLight); }); card => { return !card.IsCode(CardId.F_A_DawnDragster) && !card.IsCode(CardId.TheMightyMasterofMagic) && !card.IsCode(CardId.HeraldoftheArcLight); });
if (materials_lists.Count <= 0) return false; if (materials_lists.Count <= 0) return false;
foreach (var materials in materials_lists) foreach (var materials in materials_lists)
{ {
if (func.CardsCheckAny(materials, func.IsCode, CardId.MechaPhantomBeastToken)) if (func.CardsCheckAny(materials, func.IsCode, CardId.MechaPhantomBeastToken))
{ {
AI.SelectMaterials(materials); AI.SelectMaterials(materials);
return true; return BeforeResult(ExecutorType.Summon);
} }
} }
AI.SelectMaterials(materials_lists[0]); AI.SelectMaterials(materials_lists[0]);
return true; return BeforeResult(ExecutorType.Summon);
} }
private bool BorreloadSavageDragonEffect() private bool BorreloadSavageDragonEffect()
{ {
...@@ -976,23 +1044,23 @@ namespace WindBot.Game.AI.Decks ...@@ -976,23 +1044,23 @@ namespace WindBot.Game.AI.Decks
CardId.CrystronHalqifibrax, CardId.CrystronHalqifibrax,
CardId.Raidraptor_WiseStrix CardId.Raidraptor_WiseStrix
}); });
return true; return BeforeResult(ExecutorType.Activate);
} }
private bool TheMightyMasterofMagicEffect() private bool TheMightyMasterofMagicEffect()
{ {
if (PendulumActivate()) if (PendulumActivate())
{ {
return PendulumDefaultActivate(); return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate);
} }
else if (Card.Location == CardLocation.MonsterZone) else if (Card.Location == CardLocation.MonsterZone)
{ {
if (Duel.LastChainPlayer == 0) return false; if (Duel.LastChainPlayer == 0) return false;
AI.SelectCard(CardId.ServantofEndymion, CardId.TheMightyMasterofMagic); AI.SelectCard(CardId.ServantofEndymion, CardId.TheMightyMasterofMagic);
return true; return BeforeResult(ExecutorType.Activate);
} }
else else
{ {
return true; return BeforeResult(ExecutorType.Activate);
} }
} }
private bool checkPActivate() private bool checkPActivate()
...@@ -1002,31 +1070,33 @@ namespace WindBot.Game.AI.Decks ...@@ -1002,31 +1070,33 @@ namespace WindBot.Game.AI.Decks
if (Bot.HasInHand(CardId.Zefraath) && (Bot.SpellZone[0] != null || Bot.SpellZone[4] != null)) return false; if (Bot.HasInHand(CardId.Zefraath) && (Bot.SpellZone[0] != null || Bot.SpellZone[4] != null)) return false;
if (Bot.SpellZone[0] == null && Bot.SpellZone[4] == null) if (Bot.SpellZone[0] == null && Bot.SpellZone[4] == null)
{ {
if (!Bot.HasInHand(CardId.Zefraath) && !func.CardsCheckAny(Bot.Hand, card => { return IsSpsummonPMonster(card) && if (!Bot.HasInHand(CardId.Zefraath) && !func.CardsCheckAny(Bot.Hand, card => {
(Card.LScale >= 5 ? card.LScale < 5 : card.LScale > 5) && func.GetPSpSummonMonster(Bot,card,Card)?.Count > 0; })) return false; return IsSpsummonPMonster(card) &&
(Card.LScale >= 5 ? card.LScale < 5 : card.LScale > 5) && func.GetPSpSummonMonster(Bot, card, Card)?.Count > 0;
})) return false;
} }
else else
{ {
if (func.GetPSpSummonMonster(Bot, Bot.SpellZone[0], Card)?.Count <= 0 && func.GetPSpSummonMonster(Bot, Bot.SpellZone[4], Card)?.Count <= 0) return false; if (func.GetPSpSummonMonster(Bot, Bot.SpellZone[0], Card)?.Count <= 0 && func.GetPSpSummonMonster(Bot, Bot.SpellZone[4], Card)?.Count <= 0) return false;
} }
return true; return true;
} }
private bool SecretoftheYangZingEffect() private bool SecretoftheYangZingEffect()
{ {
if (PendulumActivate()) if (PendulumActivate())
{ {
return PendulumDefaultActivate(); return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate);
} }
activate_SecretoftheYangZing = true; activate_SecretoftheYangZing = true;
return true; return BeforeResult(ExecutorType.Activate);
} }
private bool SatellarknightZefrathubanEffect() private bool SatellarknightZefrathubanEffect()
{ {
if (PendulumActivate()) if (PendulumActivate())
{ {
return PendulumDefaultActivate(); return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate);
} }
return false; return false;
} }
...@@ -1035,7 +1105,7 @@ namespace WindBot.Game.AI.Decks ...@@ -1035,7 +1105,7 @@ namespace WindBot.Game.AI.Decks
if (Duel.LastChainPlayer == 1) if (Duel.LastChainPlayer == 1)
{ {
ClientCard card = Util.GetLastChainCard(); ClientCard card = Util.GetLastChainCard();
return card != null && !card.HasType(CardType.Continuous | CardType.Field) && card.HasType(CardType.Spell | CardType.Trap); return card != null && !card.HasType(CardType.Continuous | CardType.Field) && card.HasType(CardType.Spell | CardType.Trap) && BeforeResult(ExecutorType.Activate);
} }
return false; return false;
} }
...@@ -1043,42 +1113,42 @@ namespace WindBot.Game.AI.Decks ...@@ -1043,42 +1113,42 @@ namespace WindBot.Game.AI.Decks
{ {
if (PendulumActivate()) if (PendulumActivate())
{ {
return PendulumDefaultActivate(); return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate);
} }
return true; return BeforeResult(ExecutorType.Activate);
} }
private bool OracleofZefraEffect() private bool OracleofZefraEffect()
{ {
activate_OracleofZefra = true; activate_OracleofZefra = true;
return true; return BeforeResult(ExecutorType.Activate);
} }
private bool FlameBeastoftheNekrozEffect() private bool FlameBeastoftheNekrozEffect()
{ {
if (PendulumActivate()) if (PendulumActivate())
{ {
return PendulumDefaultActivate(); return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate);
} }
else else
{ {
return true; return BeforeResult(ExecutorType.Activate);
} }
} }
private bool AstrographSorcererEffect() private bool AstrographSorcererEffect()
{ {
if (PendulumActivate()) return false; if (PendulumActivate()) return false;
return true; return BeforeResult(ExecutorType.Activate);
} }
private bool StellarknightZefraxcitonEffect() private bool StellarknightZefraxcitonEffect()
{ {
if (PendulumActivate()) if (PendulumActivate())
{ {
return PendulumDefaultActivate(); return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate);
} }
else else
{ {
return true; return BeforeResult(ExecutorType.Activate);
} }
} }
private bool IsNoLinkCards(ClientCard card) private bool IsNoLinkCards(ClientCard card)
...@@ -1090,7 +1160,7 @@ namespace WindBot.Game.AI.Decks ...@@ -1090,7 +1160,7 @@ namespace WindBot.Game.AI.Decks
} }
private bool LinkuribohSummon() private bool LinkuribohSummon()
{ {
List<ClientCard> materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true),func.HasLevel,1); List<ClientCard> materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), func.HasLevel, 1);
if (func.CardsCheckCount(materials, Func.NegateFunc(func.HasType), CardType.Tuner) <= 0 && if (func.CardsCheckCount(materials, Func.NegateFunc(func.HasType), CardType.Tuner) <= 0 &&
func.CardsCheckCount(materials, func.HasType, CardType.Tuner) <= 1) return false; func.CardsCheckCount(materials, func.HasType, CardType.Tuner) <= 1) return false;
materials.Sort((cardA, cardB) => materials.Sort((cardA, cardB) =>
...@@ -1106,7 +1176,7 @@ namespace WindBot.Game.AI.Decks ...@@ -1106,7 +1176,7 @@ namespace WindBot.Game.AI.Decks
{ {
if (Card.HasType(CardType.Trap)) if (Card.HasType(CardType.Trap))
{ {
AI.SelectPlace(Zones.z1|Zones.z2|Zones.z3|Zones.z4|Zones.z0); AI.SelectPlace(Zones.z1 | Zones.z2 | Zones.z3 | Zones.z4 | Zones.z0);
return true; return true;
} }
return false; return false;
...@@ -1124,30 +1194,30 @@ namespace WindBot.Game.AI.Decks ...@@ -1124,30 +1194,30 @@ namespace WindBot.Game.AI.Decks
{ {
if (PendulumActivate()) if (PendulumActivate())
{ {
return PendulumDefaultActivate(); return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate);
} }
else else
{ {
return true; return BeforeResult(ExecutorType.Activate);
} }
} }
private bool PSY_FramelordOmegaEffect() private bool PSY_FramelordOmegaEffect()
{ {
if (Card.Location == CardLocation.MonsterZone) if (Card.Location == CardLocation.MonsterZone)
{ {
if (Duel.Player == 0) return true; if (Duel.Player == 0) return BeforeResult(ExecutorType.Activate);
else else
{ {
if (Bot.Banished.Count <= 0) return false; if (Bot.Banished.Count <= 0) return false;
AI.SelectCard(func.CardsIdToClientCards(new List<int> { CardId.JetSynchron, CardId.DDLamia }, Bot.Banished)); AI.SelectCard(func.CardsIdToClientCards(new List<int> { CardId.JetSynchron, CardId.DDLamia }, Bot.Banished));
return true; return BeforeResult(ExecutorType.Activate);
} }
} }
else else
{ {
if (Bot.Graveyard.Count <= 0) return false; if (Bot.Graveyard.Count <= 0) return false;
AI.SelectCard(func.CardsIdToClientCards(new List<int> { CardId.Zefraath, CardId.CrystronHalqifibrax, CardId.Denglong_FirstoftheYangZing,CardId.BorreloadSavageDragon, CardId.DDLamia }, Bot.Graveyard)); AI.SelectCard(func.CardsIdToClientCards(new List<int> { CardId.Zefraath, CardId.CrystronHalqifibrax, CardId.Denglong_FirstoftheYangZing, CardId.BorreloadSavageDragon, CardId.DDLamia }, Bot.Graveyard));
return true; return BeforeResult(ExecutorType.Activate);
} }
} }
private bool Psummon() private bool Psummon()
...@@ -1176,7 +1246,7 @@ namespace WindBot.Game.AI.Decks ...@@ -1176,7 +1246,7 @@ namespace WindBot.Game.AI.Decks
List<ClientCard> materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), func.HasType, CardType.Pendulum); List<ClientCard> materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), func.HasType, CardType.Pendulum);
if (materials.Count > 0) if (materials.Count > 0)
{ {
materials.Sort((cardA,cardB) => materials.Sort((cardA, cardB) =>
{ {
if ((cardA.Level == 3 || cardA.HasType(CardType.Tuner)) && cardB.Level != 3 && !cardB.HasType(CardType.Tuner)) return -1; if ((cardA.Level == 3 || cardA.HasType(CardType.Tuner)) && cardB.Level != 3 && !cardB.HasType(CardType.Tuner)) return -1;
if (cardA.Level != 3 && !cardA.HasType(CardType.Tuner) && (cardB.Level == 3 || cardB.HasType(CardType.Tuner))) return 1; if (cardA.Level != 3 && !cardA.HasType(CardType.Tuner) && (cardB.Level == 3 || cardB.HasType(CardType.Tuner))) return 1;
...@@ -1188,12 +1258,12 @@ namespace WindBot.Game.AI.Decks ...@@ -1188,12 +1258,12 @@ namespace WindBot.Game.AI.Decks
{ {
if (IsExtraZoneCard(material)) result.Insert(0, material); if (IsExtraZoneCard(material)) result.Insert(0, material);
else if (IsNoLinkCards(material) || (material.HasType(CardType.Tuner) && Bot.HasInExtra(CardId.CrystronHalqifibrax) else if (IsNoLinkCards(material) || (material.HasType(CardType.Tuner) && Bot.HasInExtra(CardId.CrystronHalqifibrax)
&& func.CardsCheckCount(Func.GetZoneCards(Bot,CardLocation.MonsterZone,true),func.HasType,CardType.Tuner) <= 0)) continue; && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), func.HasType, CardType.Tuner) <= 0)) continue;
else result.Add(material); else result.Add(material);
} }
if (result.Count < 2) return false; if (result.Count < 2) return false;
AI.SelectMaterials(result); AI.SelectMaterials(result);
return true; return BeforeResult(ExecutorType.Summon);
} }
return false; return false;
} }
...@@ -1202,37 +1272,38 @@ namespace WindBot.Game.AI.Decks ...@@ -1202,37 +1272,38 @@ namespace WindBot.Game.AI.Decks
if (card.IsCode(CardId.SecretoftheYangZing) && Bot.HasInHandOrInSpellZone(CardId.NinePillarsofYangZing)) if (card.IsCode(CardId.SecretoftheYangZing) && Bot.HasInHandOrInSpellZone(CardId.NinePillarsofYangZing))
{ {
return func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.Hand | CardLocation.PendulumZone | CardLocation.MonsterZone, true), p_card => { return func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.Hand | CardLocation.PendulumZone | CardLocation.MonsterZone, true), p_card => {
return p_card.HasSetcode(0xc4) && p_card.HasType(CardType.Pendulum);}) <= 0; return p_card.HasSetcode(0xc4) && p_card.HasType(CardType.Pendulum);
}) <= 0;
} }
return true; return true;
} }
private bool F_A_DawnDragsterSummon() private bool F_A_DawnDragsterSummon()
{ {
List<ClientCard> pre_materials = func.CardsCheckWhere(Func.GetZoneCards(Bot,CardLocation.MonsterZone,true),SecretoftheYangZingCheck); List<ClientCard> pre_materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), SecretoftheYangZingCheck);
var materials_lists = Util.GetSynchroMaterials(pre_materials, 7,1,1,false,true,null,card => { return !card.IsCode(CardId.MythicalBeastJackalKing) && !card.IsCode(CardId.HeraldoftheArcLight); }); var materials_lists = Util.GetSynchroMaterials(pre_materials, 7, 1, 1, false, true, null, card => { return !card.IsCode(CardId.MythicalBeastJackalKing) && !card.IsCode(CardId.HeraldoftheArcLight); });
if (materials_lists.Count <= 0) return false ; if (materials_lists.Count <= 0) return false;
foreach (var materials in materials_lists) foreach (var materials in materials_lists)
{ {
if (func.CardsCheckCount(materials, card=> if (func.CardsCheckCount(materials, card =>
{ {
return card.HasType(CardType.Tuner) && card.HasRace(CardRace.Machine); return card.HasType(CardType.Tuner) && card.HasRace(CardRace.Machine);
})<=0) }) <= 0)
{ {
AI.SelectMaterials(materials); AI.SelectMaterials(materials);
return true; return BeforeResult(ExecutorType.Summon);
} }
} }
AI.SelectMaterials(materials_lists[0]); AI.SelectMaterials(materials_lists[0]);
return true; return BeforeResult(ExecutorType.Summon);
} }
private bool CrystronHalqifibraxEffect() private bool CrystronHalqifibraxEffect()
{ {
return true; return BeforeResult(ExecutorType.Activate);
} }
private bool MechaPhantomBeastAuroradonSummon() private bool MechaPhantomBeastAuroradonSummon()
{ {
if (Bot.GetMonstersInMainZone().Count >= 4 || (!HasInDeck(CardId.MechaPhantomBeastO_Lion) && !IsCanSPSummonTunerLevel1() if (Bot.GetMonstersInMainZone().Count >= 4 || (!HasInDeck(CardId.MechaPhantomBeastO_Lion) && !IsCanSPSummonTunerLevel1()
&& !func.CardsCheckAny(Func.GetZoneCards(Bot,CardLocation.MonsterZone|CardLocation.Grave,true),func.IsCode,CardId.Deskbot001))) return false; && !func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.MonsterZone | CardLocation.Grave, true), func.IsCode, CardId.Deskbot001))) return false;
if (XyzModeCheck()) if (XyzModeCheck())
{ {
List<ClientCard> pre_materials = new List<ClientCard>(); List<ClientCard> pre_materials = new List<ClientCard>();
...@@ -1243,10 +1314,14 @@ namespace WindBot.Game.AI.Decks ...@@ -1243,10 +1314,14 @@ namespace WindBot.Game.AI.Decks
List<ClientCard> key_materials_2 = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.Grave), card => { return card.IsCode(CardId.JetSynchron) && !activate_JetSynchron; }); List<ClientCard> key_materials_2 = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.Grave), card => { return card.IsCode(CardId.JetSynchron) && !activate_JetSynchron; });
pre_materials.AddRange(key_materials); pre_materials.AddRange(key_materials);
pre_materials.AddRange(key_materials_2); pre_materials.AddRange(key_materials_2);
if (!summoned) pre_materials.AddRange(func.CardsCheckWhere(Bot.Hand,Func.NegateFunc(func.IsCode),CardId.DestrudotheLostDragon_Frisson)); if (!summoned) pre_materials.AddRange(func.CardsCheckWhere(Bot.Hand, card => { return !card.IsCode(CardId.DestrudotheLostDragon_Frisson) && card.Level < 5; }));
pre_materials.AddRange(Bot.MonsterZone); pre_materials.AddRange(Bot.MonsterZone);
var materials_lists = Util.GetSynchroMaterials(pre_materials, 7, 1, 1,false,true,null,card=> { return !card.IsCode(CardId.MythicalBeastJackalKing);}); var synchro_materials_lists = Util.GetSynchroMaterials(pre_materials, 7, 1, 1, false, true, null, card => { return !card.IsCode(CardId.MythicalBeastJackalKing); });
if (materials_lists.Count > 0) return false; var xyz_materials_lists = Util.GetXyzMaterials(Func.GetZoneCards(Bot, CardLocation.MonsterZone | CardLocation.PendulumZone), 7, 1, false,
card => { return !card.IsCode(CardId.F_A_DawnDragster) && !card.IsCode(CardId.TheMightyMasterofMagic); });
var xyz_materials_lists_2 = Util.GetXyzMaterials(Func.GetZoneCards(Bot, CardLocation.MonsterZone), 7, 2, false,
card => { return !card.IsCode(CardId.F_A_DawnDragster) && !card.IsCode(CardId.TheMightyMasterofMagic); });
if ((synchro_materials_lists.Count > 0 && xyz_materials_lists.Count > 0) || xyz_materials_lists_2.Count > 0) return false;
} }
List<ClientCard> m = new List<ClientCard>(); List<ClientCard> m = new List<ClientCard>();
int link_count = 0; int link_count = 0;
...@@ -1267,12 +1342,12 @@ namespace WindBot.Game.AI.Decks ...@@ -1267,12 +1342,12 @@ namespace WindBot.Game.AI.Decks
} }
private bool SaryujaSkullDreadEffect() private bool SaryujaSkullDreadEffect()
{ {
if (ActivateDescription == Util.GetStringId(CardId.SaryujaSkullDread, 2)) if (ActivateDescription == Util.GetStringId(CardId.SaryujaSkullDread, 2))
{ {
AI.SelectCard(GetSendToDeckIds()); AI.SelectCard(GetSendToDeckIds());
return true; return BeforeResult(ExecutorType.Activate);
} }
return true; return BeforeResult(ExecutorType.Activate);
} }
private bool SaryujaSkullDreadSummon() private bool SaryujaSkullDreadSummon()
{ {
...@@ -1285,7 +1360,8 @@ namespace WindBot.Game.AI.Decks ...@@ -1285,7 +1360,8 @@ namespace WindBot.Game.AI.Decks
temp_materials.Sort((cardA, cardB) => temp_materials.Sort((cardA, cardB) =>
{ {
if ((cardA.HasType(CardType.Tuner) && cardB.HasType(CardType.Tuner)) if ((cardA.HasType(CardType.Tuner) && cardB.HasType(CardType.Tuner))
|| (!cardA.HasType(CardType.Tuner) && !cardB.HasType(CardType.Tuner))) { || (!cardA.HasType(CardType.Tuner) && !cardB.HasType(CardType.Tuner)))
{
return CardContainer.CompareCardLevel(cardA, cardB); return CardContainer.CompareCardLevel(cardA, cardB);
} }
else if (cardA.HasType(CardType.Tuner) && !cardB.HasType(CardType.Tuner)) return 1; else if (cardA.HasType(CardType.Tuner) && !cardB.HasType(CardType.Tuner)) return 1;
...@@ -1294,15 +1370,15 @@ namespace WindBot.Game.AI.Decks ...@@ -1294,15 +1370,15 @@ namespace WindBot.Game.AI.Decks
foreach (var material in temp_materials) foreach (var material in temp_materials)
{ {
++materials_count; ++materials_count;
if (IsExtraZoneCard(material)) materials.Insert(0, material); if (IsExtraZoneCard(material)) materials.Insert(0, material);
else if (IsNoLinkCards(material)) { --materials_count; continue; } else if (IsNoLinkCards(material)) { --materials_count; continue; }
else materials.Add(material); else materials.Add(material);
link_count += material.HasType(CardType.Link) ? material.LinkCount : 1; link_count += material.HasType(CardType.Link) ? material.LinkCount : 1;
if (link_count >= 4) if (link_count >= 4)
{ {
if (materials_count == 3 && Bot.Deck.Count > 4 && ((func.CardsCheckCount(Bot.Hand, func.HasType, CardType.Tuner) > 0 if (materials_count == 3 && Bot.Deck.Count > 4 && ((func.CardsCheckCount(Bot.Hand, func.HasType, CardType.Tuner) > 0
|| (Bot.HasInMonstersZone(CardId.DDLamia,false,false,true) && !activate_DDLamia && func.CardsCheckCount(Func.GetZoneCards || (Bot.HasInMonstersZone(CardId.DDLamia, false, false, true) && !activate_DDLamia && func.CardsCheckCount(Func.GetZoneCards
(Bot,CardLocation.Onfield|CardLocation.Hand,true),card=> { return Func.HasSetCode(card, 0xaf, 0xae) && card.Id != CardId.DDLamia; }) (Bot, CardLocation.Onfield | CardLocation.Hand, true), card => { return Func.HasSetCode(card, 0xaf, 0xae) && card.Id != CardId.DDLamia; })
> 0) || (Bot.HasInMonstersZone(CardId.JetSynchron, false, false, true) && !activate_JetSynchron)) || xyz_mode)) > 0) || (Bot.HasInMonstersZone(CardId.JetSynchron, false, false, true) && !activate_JetSynchron)) || xyz_mode))
{ {
--link_count; --link_count;
...@@ -1313,7 +1389,7 @@ namespace WindBot.Game.AI.Decks ...@@ -1313,7 +1389,7 @@ namespace WindBot.Game.AI.Decks
} }
if (materials.Count < 3) return false; if (materials.Count < 3) return false;
AI.SelectMaterials(materials); AI.SelectMaterials(materials);
return true; return BeforeResult(ExecutorType.Summon);
} }
private bool CrystronHalqifibraxSummon() private bool CrystronHalqifibraxSummon()
{ {
...@@ -1327,6 +1403,10 @@ namespace WindBot.Game.AI.Decks ...@@ -1327,6 +1403,10 @@ namespace WindBot.Game.AI.Decks
mainMonsters.Sort(CardContainer.CompareCardAttack); mainMonsters.Sort(CardContainer.CompareCardAttack);
materials.AddRange(mainMonsters); materials.AddRange(mainMonsters);
AI.SelectMaterials(materials); AI.SelectMaterials(materials);
if (materials.Distinct().Count() <= 3)
{
AI.SendCustomChat((int)CustomMessage.Surprise);
}
return true; return true;
} }
private bool PendulumActivate() private bool PendulumActivate()
...@@ -1343,13 +1423,13 @@ namespace WindBot.Game.AI.Decks ...@@ -1343,13 +1423,13 @@ namespace WindBot.Game.AI.Decks
} }
private bool SupremeKingGateZeroEffect() private bool SupremeKingGateZeroEffect()
{ {
if (PendulumActivate()) return PendulumDefaultActivate(); if (PendulumActivate()) return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate);
return false; return false;
} }
private bool MythicalBeastJackalKingEffect() private bool MythicalBeastJackalKingEffect()
{ {
if (PendulumActivate()) return PendulumDefaultActivate(); if (PendulumActivate()) return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate);
return true; return BeforeResult(ExecutorType.Activate);
} }
private bool Denglong_FirstoftheYangZingSummon_2() private bool Denglong_FirstoftheYangZingSummon_2()
{ {
...@@ -1362,7 +1442,7 @@ namespace WindBot.Game.AI.Decks ...@@ -1362,7 +1442,7 @@ namespace WindBot.Game.AI.Decks
card => { return !card.IsCode(CardId.HeraldoftheArcLight); }); card => { return !card.IsCode(CardId.HeraldoftheArcLight); });
if (materials_lists.Count <= 0) return false; if (materials_lists.Count <= 0) return false;
AI.SelectMaterials(materials_lists[0]); AI.SelectMaterials(materials_lists[0]);
return true; return BeforeResult(ExecutorType.Summon);
} }
private bool Denglong_FirstoftheYangZingEffect() private bool Denglong_FirstoftheYangZingEffect()
{ {
...@@ -1373,7 +1453,7 @@ namespace WindBot.Game.AI.Decks ...@@ -1373,7 +1453,7 @@ namespace WindBot.Game.AI.Decks
} }
else else
{ {
AI.SelectCard(CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing,CardId.LightoftheYangZing); AI.SelectCard(CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing, CardId.LightoftheYangZing);
} }
return true; return true;
} }
...@@ -1381,17 +1461,17 @@ namespace WindBot.Game.AI.Decks ...@@ -1381,17 +1461,17 @@ namespace WindBot.Game.AI.Decks
{ {
if (SpellActivate()) if (SpellActivate())
{ {
return HasInDeck(CardId.DDLamia) || func.HasInZone(Bot, CardLocation.PendulumZone, CardId.ServantofEndymion, true, true); return (HasInDeck(CardId.DDLamia) || func.HasInZone(Bot, CardLocation.PendulumZone, CardId.ServantofEndymion, true, true)) && BeforeResult(ExecutorType.Activate);
} }
return true; return BeforeResult(ExecutorType.Activate);
} }
private int DisabledSort(ClientCard cardA,ClientCard cardB) private int DisabledSort(ClientCard cardA, ClientCard cardB)
{ {
bool RitualBeastTamerZeframpilica_flag = !summoned && Bot.HasInExtra(CardId.HeraldoftheArcLight) && IsCanSPSummonTunerLevel1(); bool RitualBeastTamerZeframpilica_flag = !summoned && Bot.HasInExtra(CardId.HeraldoftheArcLight) && IsCanSPSummonTunerLevel1();
if (((cardA.IsCode(CardId.RitualBeastTamerZeframpilica) && RitualBeastTamerZeframpilica_flag) || Func.IsCode(cardA, CardId.MaxxC,CardId.Zefraath,CardId.MythicalBeastJackalKing,CardId.TheMightyMasterofMagic) || cardA.HasType(CardType.Trap) || cardA.HasType(CardType.Tuner)) if (((cardA.IsCode(CardId.RitualBeastTamerZeframpilica) && RitualBeastTamerZeframpilica_flag) || Func.IsCode(cardA, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) || cardA.HasType(CardType.Trap) || cardA.HasType(CardType.Tuner))
&& !cardB.IsCode(CardId.RitualBeastTamerZeframpilica) && !cardB.HasType(CardType.Trap) && !Func.IsCode(cardB, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) && !cardB.HasType(CardType.Tuner)) return 1; && !cardB.IsCode(CardId.RitualBeastTamerZeframpilica) && !cardB.HasType(CardType.Trap) && !Func.IsCode(cardB, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) && !cardB.HasType(CardType.Tuner)) return 1;
else if (!cardA.IsCode(CardId.RitualBeastTamerZeframpilica) && !cardA.HasType(CardType.Trap) && !Func.IsCode(cardA, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) && !cardA.HasType(CardType.Tuner) else if (!cardA.IsCode(CardId.RitualBeastTamerZeframpilica) && !cardA.HasType(CardType.Trap) && !Func.IsCode(cardA, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) && !cardA.HasType(CardType.Tuner)
&& ((cardB.IsCode(CardId.RitualBeastTamerZeframpilica) && RitualBeastTamerZeframpilica_flag) || Func.IsCode(cardB, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) || cardB.HasType(CardType.Trap) || cardB.HasType(CardType.Tuner))) return -1; && ((cardB.IsCode(CardId.RitualBeastTamerZeframpilica) && RitualBeastTamerZeframpilica_flag) || Func.IsCode(cardB, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) || cardB.HasType(CardType.Trap) || cardB.HasType(CardType.Tuner))) return -1;
return 0; return 0;
} }
private List<int> GetDisabledIds() private List<int> GetDisabledIds()
...@@ -1426,21 +1506,21 @@ namespace WindBot.Game.AI.Decks ...@@ -1426,21 +1506,21 @@ namespace WindBot.Game.AI.Decks
ids.Add(CardId.LightoftheYangZing); ids.Add(CardId.LightoftheYangZing);
ids.Add(CardId.Rank_Up_MagicSoulShaveForce); ids.Add(CardId.Rank_Up_MagicSoulShaveForce);
if (activate_ZefraProvidence) ids.Add(CardId.ZefraProvidence); if (activate_ZefraProvidence) ids.Add(CardId.ZefraProvidence);
if(activate_OracleofZefra) ids.Add(CardId.OracleofZefra); if (activate_OracleofZefra) ids.Add(CardId.OracleofZefra);
if(activate_DragonShrine) ids.Add(CardId.DragonShrine); if (activate_DragonShrine) ids.Add(CardId.DragonShrine);
if(activate_SpellPowerMastery) ids.Add(CardId.SpellPowerMastery); if (activate_SpellPowerMastery) ids.Add(CardId.SpellPowerMastery);
List<ClientCard> hands = Func.GetZoneCards(Bot, CardLocation.Hand); List<ClientCard> hands = Func.GetZoneCards(Bot, CardLocation.Hand);
hands.Sort(DisabledSort); hands.Sort(DisabledSort);
List<int> hand_ids = Func.ClientCardsToCardsId(hands, true); List<int> hand_ids = Func.ClientCardsToCardsId(hands, true);
ids.AddRange(hand_ids); ids.AddRange(hand_ids);
return ids; return ids;
} }
private bool TruKingofAllCalamitiesEffect() private bool TruKingofAllCalamitiesEffect()
{ {
if (Duel.Player == 1) if (Duel.Player == 1)
{ {
AI.SelectAttributes(new CardAttribute[] { CardAttribute.Divine }); AI.SelectAttributes(new CardAttribute[] { CardAttribute.Divine });
return true; return BeforeResult(ExecutorType.Activate);
} }
return false; return false;
} }
...@@ -1456,18 +1536,18 @@ namespace WindBot.Game.AI.Decks ...@@ -1456,18 +1536,18 @@ namespace WindBot.Game.AI.Decks
List<ClientCard> dcards = func.CardsIdToClientCards(GetDisabledIds(), Bot.Hand); List<ClientCard> dcards = func.CardsIdToClientCards(GetDisabledIds(), Bot.Hand);
if (!Bot.HasInExtra(CardId.CrystronHalqifibrax) && dcards.Count <= 0) return false; if (!Bot.HasInExtra(CardId.CrystronHalqifibrax) && dcards.Count <= 0) return false;
AI.SelectCard(dcards); AI.SelectCard(dcards);
return true; return BeforeResult(ExecutorType.Activate);
} }
} }
return false; return false;
} }
private bool MechaPhantomBeastAuroradonEffect() private bool MechaPhantomBeastAuroradonEffect()
{ {
if (ActivateDescription == -1) { link_summoned = true; return true; } if (ActivateDescription == -1) { link_summoned = true; return true; }
else else
{ {
if (!HasInDeck(CardId.MechaPhantomBeastO_Lion) if (!HasInDeck(CardId.MechaPhantomBeastO_Lion)
&& Func.GetZoneCards(Enemy,CardLocation.Onfield).Count <= 0 && func.CardsCheckCount(Bot.Graveyard,func.HasType,CardType.Trap) <= 0) return false; && Func.GetZoneCards(Enemy, CardLocation.Onfield).Count <= 0) return false;
List<ClientCard> tRelease = new List<ClientCard>(); List<ClientCard> tRelease = new List<ClientCard>();
List<ClientCard> nRelease = new List<ClientCard>(); List<ClientCard> nRelease = new List<ClientCard>();
foreach (var card in Bot.GetMonsters()) foreach (var card in Bot.GetMonsters())
...@@ -1491,39 +1571,41 @@ namespace WindBot.Game.AI.Decks ...@@ -1491,39 +1571,41 @@ namespace WindBot.Game.AI.Decks
if (Card.Location == CardLocation.Grave) if (Card.Location == CardLocation.Grave)
{ {
activate_SupremeKingDragonDarkwurm_1 = true; activate_SupremeKingDragonDarkwurm_1 = true;
return true; return BeforeResult(ExecutorType.Activate);
} }
if (Card.Location == CardLocation.MonsterZone) if (Card.Location == CardLocation.MonsterZone)
{ {
activate_SupremeKingDragonDarkwurm_2 = true; activate_SupremeKingDragonDarkwurm_2 = true;
return true; return BeforeResult(ExecutorType.Activate);
} }
return false; return false;
} }
private bool SupremeKingDragonDarkwurmSummon() private bool SupremeKingDragonDarkwurmSummon()
{ {
if ((!activate_p_Zefraath && Bot.HasInHand(CardId.Zefraath) && !activate_SupremeKingDragonDarkwurm_1 && HasInDeck(CardId.SupremeKingGateZero) && func.CardsCheckAny(Bot.Hand, func.HasType, CardType.Tuner)) if ((!activate_p_Zefraath && Bot.HasInHand(CardId.Zefraath) && !activate_SupremeKingDragonDarkwurm_1 && HasInDeck(CardId.SupremeKingGateZero) && func.CardsCheckAny(Bot.Hand, func.HasType, CardType.Tuner))
||(func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.Hand), card => { return card.LinkCount > 5; }) && || (func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.Hand), card => { return card.LinkCount > 5; }) &&
!Bot.HasInHand(CardId.SupremeKingGateZero) && !activate_SupremeKingDragonDarkwurm_2)) !Bot.HasInHand(CardId.SupremeKingGateZero) && !activate_SupremeKingDragonDarkwurm_2))
{ {
summoned = true; summoned = true;
return true; return BeforeResult(ExecutorType.Summon);
} }
return false; return false;
} }
private bool DefaultSummon_2() private bool DefaultSummon_2()
{ {
if (Card.Location == CardLocation.Hand && Card.Level <= 4 if (Card.Location == CardLocation.Hand && Card.Level <= 4
&& Bot.HasInExtra(CardId.CrystronHalqifibrax) && (func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), card => { return Card.HasType(CardType.Tuner) ? true : card.HasType(CardType.Tuner); }))) { && Bot.HasInExtra(CardId.CrystronHalqifibrax) && (func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), card => { return Card.HasType(CardType.Tuner) ? true : card.HasType(CardType.Tuner); })))
{
summoned = true; summoned = true;
return true; return BeforeResult(ExecutorType.Summon);
} }
return false; return false;
} }
private bool IsCanSPSummonTunerLevel1() { private bool IsCanSPSummonTunerLevel1()
{
return func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.MonsterZone | CardLocation.Grave, true), card => { return func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.MonsterZone | CardLocation.Grave, true), card => {
return (card.IsCode(CardId.DDLamia) && !activate_DDLamia && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.Onfield | CardLocation.Hand, true), scard => { return Func.HasSetCode(scard, 0xaf, 0xae) && scard.Id != CardId.DDLamia; }) return (card.IsCode(CardId.DDLamia) && !activate_DDLamia && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.Onfield | CardLocation.Hand, true), scard => { return Func.HasSetCode(scard, 0xaf, 0xae) && scard.Id != CardId.DDLamia; })
> 0) || (card.IsCode(CardId.JetSynchron) && !activate_JetSynchron) && Bot.GetMonstersInMainZone().Count <= 3; > 0) || (card.IsCode(CardId.JetSynchron) && !activate_JetSynchron) && Bot.GetMonstersInMainZone().Count <= 3;
}); });
} }
private bool DefaultSummon() private bool DefaultSummon()
...@@ -1534,20 +1616,20 @@ namespace WindBot.Game.AI.Decks ...@@ -1534,20 +1616,20 @@ namespace WindBot.Game.AI.Decks
|| (IsCanSPSummonTunerLevel1() && ((Card.Level == 3 && Bot.HasInExtra(CardId.HeraldoftheArcLight)) || ( || (IsCanSPSummonTunerLevel1() && ((Card.Level == 3 && Bot.HasInExtra(CardId.HeraldoftheArcLight)) || (
Card.Level == 4 && Bot.HasInExtra(CardId.Denglong_FirstoftheYangZing)))) || Card.Level == 4 && Bot.HasInExtra(CardId.Denglong_FirstoftheYangZing)))) ||
(Card.Id == CardId.SupremeKingDragonDarkwurm && !activate_SupremeKingDragonDarkwurm_2) (Card.Id == CardId.SupremeKingDragonDarkwurm && !activate_SupremeKingDragonDarkwurm_2)
||(Bot.HasInExtra(CardId.CrystronHalqifibrax) && Bot.HasInHandOrInGraveyard(CardId.DestrudotheLostDragon_Frisson) && !activate_DestrudotheLostDragon_Frisson)) || (Bot.HasInExtra(CardId.CrystronHalqifibrax) && Bot.HasInHandOrInGraveyard(CardId.DestrudotheLostDragon_Frisson) && !activate_DestrudotheLostDragon_Frisson))
{ {
summoned = true; summoned = true;
return true; return BeforeResult(ExecutorType.Summon);
} }
return false; return false;
} }
private bool OneforOneEffect() private bool OneforOneEffect()
{ {
AI.SelectCard(GetDisabledIds()); AI.SelectCard(GetDisabledIds());
AI.SelectNextCard(CardId.JetSynchron, CardId.LightoftheYangZing,CardId.DDLamia); AI.SelectNextCard(CardId.JetSynchron, CardId.LightoftheYangZing, CardId.DDLamia);
return true; return BeforeResult(ExecutorType.Activate);
} }
private void HeavymetalfoesElectrumiteAddIds (List<int> ids) private void HeavymetalfoesElectrumiteAddIds(List<int> ids)
{ {
if (!summoned && HasInDeck(CardId.DarkContractwiththGate) && HasInDeck(CardId.DDLamia)) if (!summoned && HasInDeck(CardId.DarkContractwiththGate) && HasInDeck(CardId.DDLamia))
{ {
...@@ -1569,47 +1651,52 @@ namespace WindBot.Game.AI.Decks ...@@ -1569,47 +1651,52 @@ namespace WindBot.Game.AI.Decks
{ {
if (Card.Location == CardLocation.Grave) if (Card.Location == CardLocation.Grave)
{ {
if (Duel.Player != 0) return true; if (Duel.Player != 0) return BeforeResult(ExecutorType.Activate);
return false; return false;
} }
return true; return BeforeResult(ExecutorType.Activate);
} }
private bool Raider_WingEffect() private bool Raider_WingEffect()
{ {
if (!Bot.HasInMonstersZone(CardId.Raidraptor_ForceStrix, false, true, true)) return false; if (!Bot.HasInMonstersZone(CardId.Raidraptor_ForceStrix, false, true, true)) return false;
AI.SelectCard(CardId.Raidraptor_ForceStrix); AI.SelectCard(CardId.Raidraptor_ForceStrix);
return true; return BeforeResult(ExecutorType.Activate);
} }
private bool HeavymetalfoesElectrumiteEffect() private bool HeavymetalfoesElectrumiteEffect()
{ {
if (ActivateDescription != -1) if (ActivateDescription != -1)
{ {
List<ClientCard> cards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.SpellZone, true),Func.NegateFunc(func.IsCode),CardId.DarkContractwiththGate); List<ClientCard> cards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.SpellZone, true), Func.NegateFunc(func.IsCode), CardId.DarkContractwiththGate);
if (cards.Count <= 0) if (cards.Count <= 0)
{ {
HeavymetalfoesElectrumite_activate = true; HeavymetalfoesElectrumite_activate = true;
return false; return false;
} }
HeavymetalfoesElectrumite_activate = false; HeavymetalfoesElectrumite_activate = false;
return true; return BeforeResult(ExecutorType.Activate);
} }
return true; return BeforeResult(ExecutorType.Activate);
} }
public override bool OnSelectHand() public override bool OnSelectHand()
{ {
return true; return true;
} }
private bool ResetFlag()
{
should_destory = false;
return true;
}
private bool HeraldoftheArcLightEffect() private bool HeraldoftheArcLightEffect()
{ {
if (Card.Location == CardLocation.MonsterZone) if (Card.Location == CardLocation.MonsterZone)
{ {
return Duel.LastChainPlayer != 0; return Duel.LastChainPlayer != 0 && BeforeResult(ExecutorType.Activate);
} }
return false; return false;
} }
private bool CalledbytheGraveEffect() private bool CalledbytheGraveEffect()
{ {
if ((Bot.SpellZone[5] == Card || Bot.SpellZone[0] == Card) && Duel.Player == 0) return true; if ((Bot.SpellZone[5] == Card || Bot.SpellZone[0] == Card) && Duel.Player == 0) return BeforeResult(ExecutorType.Activate);
ClientCard card = Util.GetLastChainCard(); ClientCard card = Util.GetLastChainCard();
if (card == null) return false; if (card == null) return false;
int id = card.Id; int id = card.Id;
...@@ -1619,23 +1706,16 @@ namespace WindBot.Game.AI.Decks ...@@ -1619,23 +1706,16 @@ namespace WindBot.Game.AI.Decks
if (card.Location == CardLocation.Grave && card.HasType(CardType.Monster)) if (card.Location == CardLocation.Grave && card.HasType(CardType.Monster))
{ {
AI.SelectCard(card); AI.SelectCard(card);
return true; return BeforeResult(ExecutorType.Activate);
} }
else if (g_cards.Count() > 0 && card.HasType(CardType.Monster)) else if (g_cards.Count() > 0 && card.HasType(CardType.Monster))
{ {
AI.SelectCard(g_cards); AI.SelectCard(g_cards);
return true; return BeforeResult(ExecutorType.Activate);
} }
} }
return false; return false;
} }
public override bool OnSelectYesNo(int desc)
{
/*
can't get code 74580251 Duel.SelectEffectYesNo(tp,e:GetHandler(),96)
*/
return base.OnSelectYesNo(desc);
}
public override CardPosition OnSelectPosition(int cardId, IList<CardPosition> positions) public override CardPosition OnSelectPosition(int cardId, IList<CardPosition> positions)
{ {
NamedCard card = NamedCard.Get(cardId); NamedCard card = NamedCard.Get(cardId);
...@@ -1653,7 +1733,7 @@ namespace WindBot.Game.AI.Decks ...@@ -1653,7 +1733,7 @@ namespace WindBot.Game.AI.Decks
} }
return base.OnSelectOption(options); return base.OnSelectOption(options);
} }
public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) public override int OnSelectPlace(int cardId, int player, CardLocation location, int available)
{ {
NamedCard card = NamedCard.Get(cardId); NamedCard card = NamedCard.Get(cardId);
...@@ -1691,31 +1771,23 @@ namespace WindBot.Game.AI.Decks ...@@ -1691,31 +1771,23 @@ namespace WindBot.Game.AI.Decks
return base.OnSelectPlace(cardId, player, location, available); return base.OnSelectPlace(cardId, player, location, available);
} }
public override void OnChainEnd() private IList<ClientCard> _OnSelectPendulumSummon(IList<ClientCard> cards, int min, int max)
{
should_destory = false;
base.OnChainEnd();
}
public override IList<ClientCard> OnSelectSynchroMaterial(IList<ClientCard> cards, int sum, int min, int max)
{
return base.OnSelectSynchroMaterial(cards, sum, min, max);
}
private IList<ClientCard> _OnSelectPendulumSummon(IList<ClientCard> cards, int min,int max)
{ {
List<int> ids = func.GetSelectCardIdList(); List<int> ids = func.GetSelectCardIdList();
List<ClientCard> result = func.GetSelectCardList(); List<ClientCard> result = func.GetSelectCardList();
List<ClientCard> exs = func.CardsCheckWhere(cards, func.IsLocation, CardLocation.Extra); List<ClientCard> exs = func.CardsCheckWhere(cards, func.IsLocation, CardLocation.Extra);
List<ClientCard> hs = func.CardsCheckWhere(cards,Func.NegateFunc(func.IsLocation), CardLocation.Extra); List<ClientCard> hs = func.CardsCheckWhere(cards, Func.NegateFunc(func.IsLocation), CardLocation.Extra);
if (func.CardsCheckAny(Func.GetZoneCards(Bot,CardLocation.PendulumZone,true),card=> { if (func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.PendulumZone, true), card => {
return card.HasSetcode(0xc4) && !card.IsCode(CardId.Zefraath);}) && func.CardsCheckAny(exs, func.IsCode, CardId.ShaddollZefracore)) ids.Add(CardId.ShaddollZefracore); return card.HasSetcode(0xc4) && !card.IsCode(CardId.Zefraath);
result = func.CardsIdToClientCards(ids,cards); }) && func.CardsCheckAny(exs, func.IsCode, CardId.ShaddollZefracore)) ids.Add(CardId.ShaddollZefracore);
result = func.CardsIdToClientCards(ids, cards);
List<ClientCard> temp_cards = func.CardsCheckWhere(cards, Func.NegateFunc(func.IsCode), CardId.MaxxC); List<ClientCard> temp_cards = func.CardsCheckWhere(cards, Func.NegateFunc(func.IsCode), CardId.MaxxC);
result.AddRange(temp_cards); result.AddRange(temp_cards);
if(result.Count <= 0) return Func.CheckSelectCount(Util, result, cards, min, min); if (result.Count <= 0) return Func.CheckSelectCount(Util, result, cards, min, min);
if (result[0] != null && result[0].Location != CardLocation.Extra) ++p_count; if (result[0] != null && result[0].Location != CardLocation.Extra) ++p_count;
return Func.CheckSelectCount(Util, result, cards, max, max); return Func.CheckSelectCount(Util, result, cards, max, max);
} }
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)
{ {
if (AI.HaveSelectedCards()) return null; if (AI.HaveSelectedCards()) return null;
...@@ -1735,7 +1807,7 @@ namespace WindBot.Game.AI.Decks ...@@ -1735,7 +1807,7 @@ namespace WindBot.Game.AI.Decks
ids.AddRange(pre_ids); ids.AddRange(pre_ids);
} }
ids.Add(CardId.ZefraDivineStrike); ids.Add(CardId.ZefraDivineStrike);
} }
if (!activate_OracleofZefra) ids.Add(CardId.OracleofZefra); if (!activate_OracleofZefra) ids.Add(CardId.OracleofZefra);
if (!activate_p_Zefraath && !func.HasInZone(Bot, CardLocation.Hand | CardLocation.PendulumZone, CardId.Zefraath, true)) ids.Add(CardId.Zefraath); if (!activate_p_Zefraath && !func.HasInZone(Bot, CardLocation.Hand | CardLocation.PendulumZone, CardId.Zefraath, true)) ids.Add(CardId.Zefraath);
if (func.HasInZone(Bot, CardLocation.Hand | CardLocation.PendulumZone, CardId.SupremeKingGateZero, true) && !func.CardsCheckAny(Bot.Hand, func.HasType, CardType.Tuner) if (func.HasInZone(Bot, CardLocation.Hand | CardLocation.PendulumZone, CardId.SupremeKingGateZero, true) && !func.CardsCheckAny(Bot.Hand, func.HasType, CardType.Tuner)
...@@ -1848,9 +1920,9 @@ namespace WindBot.Game.AI.Decks ...@@ -1848,9 +1920,9 @@ namespace WindBot.Game.AI.Decks
result = func.CardsIdToClientCards(ids, cards); result = func.CardsIdToClientCards(ids, cards);
} }
} }
else if (hint == HintMsg.ToDeck && func.CardsCheckALL(cards, func.IsLocation, true, CardLocation.Hand) && min == 3 && max ==3) else if (hint == HintMsg.ToDeck && func.CardsCheckALL(cards, func.IsLocation, true, CardLocation.Hand) && min == 3 && max == 3)
{ {
result = func.CardsIdToClientCards(GetSendToDeckIds(),cards); result = func.CardsIdToClientCards(GetSendToDeckIds(), cards);
} }
else if (hint == HintMsg.ToGrave && func.CardsCheckALL(cards, func.IsLocation, true, CardLocation.Deck)) else if (hint == HintMsg.ToGrave && func.CardsCheckALL(cards, func.IsLocation, true, CardLocation.Deck))
{ {
...@@ -1933,8 +2005,9 @@ namespace WindBot.Game.AI.Decks ...@@ -1933,8 +2005,9 @@ namespace WindBot.Game.AI.Decks
HeavymetalfoesElectrumiteAddIds(ids); HeavymetalfoesElectrumiteAddIds(ids);
result = func.CardsIdToClientCards(ids, cards); result = func.CardsIdToClientCards(ids, cards);
} }
else if (!(IS_YGOPRO & !(hint == HintMsg.SpSummon)) && func.CardsCheckALL(cards, card =>{return card.IsCode(CardId.TheMightyMasterofMagic) || card.IsCode(CardId.MythicalBeastJackalKing); else if (!(IS_YGOPRO & !(hint == HintMsg.SpSummon)) && func.CardsCheckALL(cards, card => {
}, true)) return card.IsCode(CardId.TheMightyMasterofMagic) || card.IsCode(CardId.MythicalBeastJackalKing);
}, true))
{ {
ids.Add(CardId.MythicalBeastJackalKing); ids.Add(CardId.MythicalBeastJackalKing);
ids.Add(CardId.TheMightyMasterofMagic); ids.Add(CardId.TheMightyMasterofMagic);
...@@ -1945,7 +2018,7 @@ namespace WindBot.Game.AI.Decks ...@@ -1945,7 +2018,7 @@ namespace WindBot.Game.AI.Decks
{ {
p_summoning = false; p_summoning = false;
if (p_count >= 3 && !Bot.HasInExtra(CardId.SaryujaSkullDread) && Bot.HasInExtra(CardId.MechaPhantomBeastAuroradon)) return Func.CheckSelectCount(Util, result, cards, min, min); if (p_count >= 3 && !Bot.HasInExtra(CardId.SaryujaSkullDread) && Bot.HasInExtra(CardId.MechaPhantomBeastAuroradon)) return Func.CheckSelectCount(Util, result, cards, min, min);
return _OnSelectPendulumSummon(cards,min,max); return _OnSelectPendulumSummon(cards, min, max);
} }
else if (hint == HintMsg.Destroy) else if (hint == HintMsg.Destroy)
{ {
...@@ -1955,7 +2028,7 @@ namespace WindBot.Game.AI.Decks ...@@ -1955,7 +2028,7 @@ namespace WindBot.Game.AI.Decks
if (func.CardsCheckALL(cards, func.HasSetCode, true, 0x9e)) if (func.CardsCheckALL(cards, func.HasSetCode, true, 0x9e))
{ {
if (!activate_SecretoftheYangZing) result = func.CardsIdToClientCards(new List<int> { CardId.SecretoftheYangZing }, func.CardsCheckWhere(cards, if (!activate_SecretoftheYangZing) result = func.CardsIdToClientCards(new List<int> { CardId.SecretoftheYangZing }, func.CardsCheckWhere(cards,
func.IsLocation,CardLocation.MonsterZone)); func.IsLocation, CardLocation.MonsterZone));
result.AddRange(func.CardsIdToClientCards(new List<int> { CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing }, func.CardsCheckWhere(cards, result.AddRange(func.CardsIdToClientCards(new List<int> { CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing }, func.CardsCheckWhere(cards,
Func.NegateFunc(func.IsLocation), CardLocation.MonsterZone))); Func.NegateFunc(func.IsLocation), CardLocation.MonsterZone)));
} }
...@@ -1970,7 +2043,7 @@ namespace WindBot.Game.AI.Decks ...@@ -1970,7 +2043,7 @@ namespace WindBot.Game.AI.Decks
}); });
result.AddRange(scards); result.AddRange(scards);
} }
} }
else if (func.CardsCheckAny(cards, card => { return card.Controller == 1 && (card.Location & CardLocation.Onfield) > 0; }) && min == 1 && max == 1) else if (func.CardsCheckAny(cards, card => { return card.Controller == 1 && (card.Location & CardLocation.Onfield) > 0; }) && min == 1 && max == 1)
{ {
...@@ -1995,13 +2068,15 @@ namespace WindBot.Game.AI.Decks ...@@ -1995,13 +2068,15 @@ namespace WindBot.Game.AI.Decks
{ {
CardId.TheMightyMasterofMagic, CardId.MythicalBeastJackalKing, CardId.SecretoftheYangZing CardId.TheMightyMasterofMagic, CardId.MythicalBeastJackalKing, CardId.SecretoftheYangZing
}; };
if (func.CardsCheckALL(cards, func.IsLocation,true,CardLocation.Hand)) if (func.CardsCheckALL(cards, func.IsLocation, true, CardLocation.Hand))
{ {
if(summoned && Bot.HasInExtra(CardId.CrystronHalqifibrax) && func.CardsCheckCount(Bot.MonsterZone,card => {return card.IsFaceup() if (summoned && Bot.HasInExtra(CardId.CrystronHalqifibrax) && func.CardsCheckCount(Bot.MonsterZone, card => {
&& card.HasType(CardType.Tuner);}) <= 0 && !(Bot.HasInGraveyard(CardId.DDLamia) && !activate_DDLamia return card.IsFaceup() && card.HasType(CardType.Tuner);
&& func.CardsCheckCount(Func.GetZoneCards (Bot, CardLocation.Onfield | CardLocation.Hand, true), card => { return Func.HasSetCode(card, 0xaf, 0xae) && card.Id != CardId.DDLamia; }) }) <= 0 && !(Bot.HasInGraveyard(CardId.DDLamia) && !activate_DDLamia
&& func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.Onfield | CardLocation.Hand, true), card => { return Func.HasSetCode(card, 0xaf, 0xae) && card.Id != CardId.DDLamia; })
<= 0) && !(Bot.HasInGraveyard(CardId.JetSynchron) && !activate_JetSynchron) <= 0) && !(Bot.HasInGraveyard(CardId.JetSynchron) && !activate_JetSynchron)
&& !(Bot.HasInGraveyard(CardId.DestrudotheLostDragon_Frisson) && !activate_DestrudotheLostDragon_Frisson)){ && !(Bot.HasInGraveyard(CardId.DestrudotheLostDragon_Frisson) && !activate_DestrudotheLostDragon_Frisson))
{
ids.AddRange(tuner_ids); ids.AddRange(tuner_ids);
ids.AddRange(no_tuner_ids); ids.AddRange(no_tuner_ids);
} }
...@@ -2012,8 +2087,11 @@ namespace WindBot.Game.AI.Decks ...@@ -2012,8 +2087,11 @@ namespace WindBot.Game.AI.Decks
} }
result = func.CardsIdToClientCards(ids, cards); result = func.CardsIdToClientCards(ids, cards);
} }
else if (func.CardsCheckALL(cards, card => { return Func.IsCode(card, CardId.LightoftheYangZing, CardId.PSY_FramegearGamma, else if (func.CardsCheckALL(cards, card => {
CardId.MechaPhantomBeastO_Lion, CardId.JetSynchron, CardId.Deskbot001, CardId.DDLamia); })){ return Func.IsCode(card, CardId.LightoftheYangZing, CardId.PSY_FramegearGamma,
CardId.MechaPhantomBeastO_Lion, CardId.JetSynchron, CardId.Deskbot001, CardId.DDLamia);
}))
{
if (Bot.GetMonstersInMainZone().Count <= 1) ids.Add(CardId.Deskbot001); if (Bot.GetMonstersInMainZone().Count <= 1) ids.Add(CardId.Deskbot001);
ids.Add(CardId.JetSynchron); ids.Add(CardId.JetSynchron);
ids.Add(CardId.Deskbot001); ids.Add(CardId.Deskbot001);
...@@ -2021,7 +2099,7 @@ namespace WindBot.Game.AI.Decks ...@@ -2021,7 +2099,7 @@ namespace WindBot.Game.AI.Decks
ids.Add(CardId.PSY_FramegearGamma); ids.Add(CardId.PSY_FramegearGamma);
result = func.CardsIdToClientCards(ids, cards); result = func.CardsIdToClientCards(ids, cards);
} }
} }
else if (hint == HintMsg.Release && func.CardsCheckAny(cards, func.IsLocation, CardLocation.MonsterZone)) else if (hint == HintMsg.Release && func.CardsCheckAny(cards, func.IsLocation, CardLocation.MonsterZone))
{ {
...@@ -2031,13 +2109,13 @@ namespace WindBot.Game.AI.Decks ...@@ -2031,13 +2109,13 @@ namespace WindBot.Game.AI.Decks
{ {
if (card == null || IsNoLinkCards(card)) continue; if (card == null || IsNoLinkCards(card)) continue;
if (card.Id == CardId.MechaPhantomBeastToken) tRelease.Add(card); if (card.Id == CardId.MechaPhantomBeastToken) tRelease.Add(card);
else if(card.Id == CardId.Raidraptor_WiseStrix) tRelease.Insert(0,card); else if (card.Id == CardId.Raidraptor_WiseStrix) tRelease.Insert(0, card);
else nRelease.Add(card); else nRelease.Add(card);
} }
result.AddRange(tRelease); result.AddRange(tRelease);
result.AddRange(nRelease); result.AddRange(nRelease);
} }
return Func.CheckSelectCount(Util, result, cards, min, max); return Func.CheckSelectCount(Util, result, cards, min, max);
} }
private bool HasInDeck(int id) private bool HasInDeck(int id)
{ {
......
...@@ -34,7 +34,9 @@ namespace WindBot.Game.AI ...@@ -34,7 +34,9 @@ namespace WindBot.Game.AI
[DataMember] [DataMember]
public string[] setmonster { get; set; } public string[] setmonster { get; set; }
[DataMember] [DataMember]
public string[] chaining { get; set; } public string[] chaining { get; set; }
[DataMember]
public string[] custom { get; set; }
} }
public class Dialogs public class Dialogs
{ {
...@@ -53,7 +55,8 @@ namespace WindBot.Game.AI ...@@ -53,7 +55,8 @@ namespace WindBot.Game.AI
private string[] _summon; private string[] _summon;
private string[] _setmonster; private string[] _setmonster;
private string[] _chaining; private string[] _chaining;
private string[] _custom;
public Dialogs(GameClient game) public Dialogs(GameClient game)
{ {
_game = game; _game = game;
...@@ -75,6 +78,7 @@ namespace WindBot.Game.AI ...@@ -75,6 +78,7 @@ namespace WindBot.Game.AI
_summon = data.summon; _summon = data.summon;
_setmonster = data.setmonster; _setmonster = data.setmonster;
_chaining = data.chaining; _chaining = data.chaining;
_custom = data.custom;
} }
} }
...@@ -173,5 +177,14 @@ namespace WindBot.Game.AI ...@@ -173,5 +177,14 @@ namespace WindBot.Game.AI
if (message != "") if (message != "")
_game.Chat(message); _game.Chat(message);
} }
public void SendCustomChat(int index, params object[] opts)
{
if (!_game._chat || _custom == null)
return;
string message = string.Format(_custom[index], opts);
if (message != "")
_game.Chat(message);
}
} }
} }
...@@ -165,6 +165,7 @@ namespace WindBot.Game.AI ...@@ -165,6 +165,7 @@ namespace WindBot.Game.AI
// For overriding // For overriding
return null; return null;
} }
public virtual void OnSelectChain(IList<ClientCard> cards) public virtual void OnSelectChain(IList<ClientCard> cards)
{ {
return; return;
......
...@@ -54,6 +54,14 @@ namespace WindBot.Game ...@@ -54,6 +54,14 @@ namespace WindBot.Game
_dialogs.SendDuelStart(); _dialogs.SendDuelStart();
} }
/// <summary>
/// Customized called when the AI do something in a duel.
/// </summary>
public void SendCustomChat(int index, params object[] opts)
{
_dialogs.SendCustomChat(index, opts);
}
/// <summary> /// <summary>
/// Called when the AI do the rock-paper-scissors. /// Called when the AI do the rock-paper-scissors.
/// </summary> /// </summary>
......
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