Commit 0c4b3474 authored by mercury233's avatar mercury233

update ChainBurn deck by handsomekiwi

parent 745421f7
using YGOSharp.OCGWrapper.Enums; using YGOSharp.OCGWrapper.Enums;
using System.Collections.Generic; using System.Collections.Generic;
using WindBot; using WindBot;
using WindBot.Game; using WindBot.Game;
using WindBot.Game.AI; using WindBot.Game.AI;
namespace WindBot.Game.AI.Decks namespace WindBot.Game.AI.Decks
{ {
[Deck("ChainBurn", "AI_ChainBurn", "Normal")] [Deck("ChainBurn", "AI_ChainBurn", "Normal")]
public class ChainBurnExecutor : DefaultExecutor public class ChainBurnExecutor : DefaultExecutor
{ {
public class CardId public class CardId
{ {
public const int SandaionTheTimloard = 100227025; public const int SandaionTheTimelord = 100227025;
public const int Mathematician = 41386308; public const int MichionTimelord = 100227021;
public const int DiceJar = 3549275; public const int Mathematician = 41386308;
public const int CardcarD = 45812361; public const int DiceJar = 3549275;
public const int BattleFader = 19665973; public const int CardcarD = 45812361;
public const int AbouluteKingBackJack = 60990740; public const int BattleFader = 19665973;
public const int AbouluteKingBackJack = 60990740;
public const int PotOfDesires = 35261759;
public const int CardOfDemise = 59750328; public const int PotOfDesires = 35261759;
public const int PotOfDuality = 98645731; public const int CardOfDemise = 59750328;
public const int ChainStrike = 91623717; public const int PotOfDuality = 98645731;
public const int ChainStrike = 91623717;
public const int Waboku = 12607053;
public const int SecretBlast = 18252559; public const int Waboku = 12607053;
public const int JustDesserts = 24068492; public const int SecretBlast = 18252559;
public const int SectetBarrel = 27053506; public const int JustDesserts = 24068492;
public const int OjamaTrio = 29843091; public const int SectetBarrel = 27053506;
public const int ThreateningRoar = 36361633; public const int OjamaTrio = 29843091;
public const int Ceasefire = 36468556; public const int ThreateningRoar = 36361633;
public const int RecklessGreed = 37576645; public const int Ceasefire = 36468556;
public const int MagicCylinder = 62279055; public const int RecklessGreed = 37576645;
public const int BalanceOfJudgment = 67443336; public const int MagicCylinder = 62279055;
public const int BlazingMirrorForce = 75249652; public const int BalanceOfJudgment = 67443336;
public const int RingOfDestruction = 83555666; public const int BlazingMirrorForce = 75249652;
public const int AccuulatedFortune = 98444741; public const int RingOfDestruction = 83555666;
public const int AccuulatedFortune = 98444741;
public const int Linkuriboh = 41999284;
public const int HarpiesFeatherDuster = 18144506; public const int Linkuriboh = 41999284;
} public const int HarpiesFeatherDuster = 18144506;
}
public ChainBurnExecutor(GameAI ai, Duel duel)
: base(ai, duel) public ChainBurnExecutor(GameAI ai, Duel duel)
{ : base(ai, duel)
//first add {
AddExecutor(ExecutorType.Activate, CardId.PotOfDesires); //first add
AddExecutor(ExecutorType.Activate, CardId.PotOfDuality, PotOfDualityeff); AddExecutor(ExecutorType.Activate, CardId.PotOfDesires);
//normal summon AddExecutor(ExecutorType.Activate, CardId.PotOfDuality, PotOfDualityeff);
AddExecutor(ExecutorType.Summon, CardId.Mathematician); //normal summon
AddExecutor(ExecutorType.Activate, CardId.Mathematician, Mathematicianeff); AddExecutor(ExecutorType.Summon, CardId.MichionTimelord, MichionTimelordsummon);
AddExecutor(ExecutorType.MonsterSet, CardId.DiceJar); AddExecutor(ExecutorType.Summon, CardId.SandaionTheTimelord, SandaionTheTimelord_summon);
AddExecutor(ExecutorType.Activate, CardId.DiceJar); AddExecutor(ExecutorType.Summon, CardId.Mathematician);
AddExecutor(ExecutorType.Summon, CardId.AbouluteKingBackJack, AbouluteKingBackJacksummon); AddExecutor(ExecutorType.Activate, CardId.Mathematician, Mathematicianeff);
AddExecutor(ExecutorType.MonsterSet, CardId.AbouluteKingBackJack); AddExecutor(ExecutorType.MonsterSet, CardId.DiceJar);
AddExecutor(ExecutorType.Activate, CardId.AbouluteKingBackJack, AbouluteKingBackJackeff); AddExecutor(ExecutorType.Activate, CardId.DiceJar);
AddExecutor(ExecutorType.Summon, CardId.CardcarD); AddExecutor(ExecutorType.Summon, CardId.CardcarD);
AddExecutor(ExecutorType.Summon, CardId.SandaionTheTimloard, SandaionTheTimloard_summon); AddExecutor(ExecutorType.Summon, CardId.AbouluteKingBackJack, AbouluteKingBackJacksummon);
AddExecutor(ExecutorType.Activate, CardId.SandaionTheTimloard, SandaionTheTimloardeff); AddExecutor(ExecutorType.MonsterSet, CardId.AbouluteKingBackJack);
// Set traps
AddExecutor(ExecutorType.SpellSet, CardId.Waboku); AddExecutor(ExecutorType.Activate, CardId.MichionTimelord);
AddExecutor(ExecutorType.SpellSet, CardId.ThreateningRoar); AddExecutor(ExecutorType.Activate, CardId.SandaionTheTimelord, SandaionTheTimelordeff);
AddExecutor(ExecutorType.SpellSet, CardId.BlazingMirrorForce); // Set traps
AddExecutor(ExecutorType.SpellSet, CardId.OjamaTrio, OjamaTrioset); AddExecutor(ExecutorType.SpellSet, CardId.Waboku);
AddExecutor(ExecutorType.SpellSet, BrunSpellSet); AddExecutor(ExecutorType.SpellSet, CardId.ThreateningRoar);
//afer set AddExecutor(ExecutorType.SpellSet, CardId.BlazingMirrorForce);
AddExecutor(ExecutorType.Activate, CardId.CardcarD); AddExecutor(ExecutorType.SpellSet, CardId.OjamaTrio, OjamaTrioset);
AddExecutor(ExecutorType.Activate, CardId.CardOfDemise, CardOfDemiseeff); AddExecutor(ExecutorType.SpellSet, BrunSpellSet);
//activate trap //afer set
AddExecutor(ExecutorType.Activate, CardId.BalanceOfJudgment, BalanceOfJudgmenteff); AddExecutor(ExecutorType.Activate, CardId.CardcarD);
AddExecutor(ExecutorType.Activate, CardId.AccuulatedFortune); AddExecutor(ExecutorType.Activate, CardId.CardOfDemise, CardOfDemiseeff);
//battle //activate trap
AddExecutor(ExecutorType.Activate, CardId.BalanceOfJudgment, BalanceOfJudgmenteff);
AddExecutor(ExecutorType.Activate, CardId.ThreateningRoar, ThreateningRoareff); AddExecutor(ExecutorType.Activate, CardId.AccuulatedFortune);
AddExecutor(ExecutorType.Activate, CardId.Waboku, Wabokueff); //battle
AddExecutor(ExecutorType.Activate, CardId.BattleFader, BattleFadereff); AddExecutor(ExecutorType.Activate, CardId.BlazingMirrorForce, BlazingMirrorForceeff);
AddExecutor(ExecutorType.Activate, CardId.MagicCylinder, MagicCylindereff); AddExecutor(ExecutorType.Activate, CardId.MagicCylinder, MagicCylindereff);
AddExecutor(ExecutorType.Activate, CardId.BlazingMirrorForce, BlazingMirrorForceeff); AddExecutor(ExecutorType.Activate, CardId.ThreateningRoar, ThreateningRoareff);
AddExecutor(ExecutorType.Activate, CardId.RingOfDestruction, Ring_act); AddExecutor(ExecutorType.Activate, CardId.Waboku, Wabokueff);
//chain AddExecutor(ExecutorType.Activate, CardId.BattleFader, BattleFadereff);
AddExecutor(ExecutorType.Activate, CardId.JustDesserts, JustDessertseff); AddExecutor(ExecutorType.Activate, CardId.RingOfDestruction, Ring_act);
AddExecutor(ExecutorType.Activate, CardId.OjamaTrio, OjamaTrioeff); //chain
AddExecutor(ExecutorType.Activate, CardId.Ceasefire, Ceasefireeff); AddExecutor(ExecutorType.Activate, CardId.JustDesserts, JustDessertseff);
AddExecutor(ExecutorType.Activate, CardId.SecretBlast, SecretBlasteff); AddExecutor(ExecutorType.Activate, CardId.Ceasefire, Ceasefireeff);
AddExecutor(ExecutorType.Activate, CardId.SectetBarrel, SectetBarreleff); AddExecutor(ExecutorType.Activate, CardId.SecretBlast, SecretBlasteff);
AddExecutor(ExecutorType.Activate, CardId.RecklessGreed, RecklessGreedeff); AddExecutor(ExecutorType.Activate, CardId.SectetBarrel, SectetBarreleff);
AddExecutor(ExecutorType.Activate, CardId.ChainStrike, ChainStrikeeff); AddExecutor(ExecutorType.Activate, CardId.RecklessGreed, RecklessGreedeff);
//sp AddExecutor(ExecutorType.Activate, CardId.OjamaTrio, OjamaTrioeff);
AddExecutor(ExecutorType.SpSummon, CardId.Linkuriboh); AddExecutor(ExecutorType.Activate, CardId.AbouluteKingBackJack, AbouluteKingBackJackeff);
AddExecutor(ExecutorType.Activate, CardId.Linkuriboh, Linkuriboheff); AddExecutor(ExecutorType.Activate, CardId.ChainStrike, ChainStrikeeff);
//sp
} AddExecutor(ExecutorType.SpSummon, CardId.Linkuriboh);
public int[] all_List() AddExecutor(ExecutorType.Activate, CardId.Linkuriboh, Linkuriboheff);
{ AddExecutor(ExecutorType.Repos, MonsterRepos);
return new[]
{ }
CardId.SandaionTheTimloard, public int[] all_List()
CardId.Mathematician, {
CardId.DiceJar, return new[]
CardId.CardcarD, {
CardId.BattleFader, CardId.SandaionTheTimelord,
CardId.AbouluteKingBackJack, CardId.MichionTimelord,
CardId.Mathematician,
CardId.PotOfDesires, CardId.DiceJar,
CardId.CardOfDemise, CardId.CardcarD,
CardId.PotOfDuality, CardId.BattleFader,
CardId.ChainStrike, CardId.AbouluteKingBackJack,
CardId.Waboku, CardId.PotOfDesires,
CardId.SecretBlast, CardId.CardOfDemise,
CardId.JustDesserts, CardId.PotOfDuality,
CardId.OjamaTrio, CardId.ChainStrike,
CardId.SectetBarrel,
CardId.ThreateningRoar, CardId.Waboku,
CardId.Ceasefire, CardId.SecretBlast,
CardId.RecklessGreed, CardId.JustDesserts,
CardId.MagicCylinder, CardId.OjamaTrio,
CardId.BalanceOfJudgment, CardId.SectetBarrel,
CardId.BlazingMirrorForce, CardId.ThreateningRoar,
CardId.RingOfDestruction, CardId.Ceasefire,
CardId.AccuulatedFortune, CardId.RecklessGreed,
}; CardId.MagicCylinder,
} CardId.BalanceOfJudgment,
public int[] AbouluteKingBackJack_List_1() CardId.BlazingMirrorForce,
{ CardId.RingOfDestruction,
return new[] { CardId.AccuulatedFortune,
CardId.BlazingMirrorForce, };
CardId.Waboku, }
CardId.ThreateningRoar, public int[] AbouluteKingBackJack_List_1()
CardId.MagicCylinder, {
CardId.RingOfDestruction, return new[] {
CardId.RecklessGreed, CardId.BlazingMirrorForce,
CardId.SecretBlast, CardId.Waboku,
CardId.JustDesserts, CardId.ThreateningRoar,
CardId.OjamaTrio, CardId.MagicCylinder,
CardId.SectetBarrel, CardId.RingOfDestruction,
CardId.Ceasefire, CardId.RecklessGreed,
CardId.BalanceOfJudgment, CardId.SecretBlast,
CardId.AccuulatedFortune, CardId.JustDesserts,
}; CardId.OjamaTrio,
} CardId.SectetBarrel,
public int[] AbouluteKingBackJack_List_2() CardId.Ceasefire,
{ CardId.BalanceOfJudgment,
return new[] { CardId.AccuulatedFortune,
CardId.SandaionTheTimloard, };
CardId.PotOfDesires, }
CardId.Mathematician, public int[] AbouluteKingBackJack_List_2()
CardId.DiceJar, {
CardId.CardcarD, return new[] {
CardId.BattleFader, CardId.MichionTimelord,
CardId.BlazingMirrorForce, CardId.SandaionTheTimelord,
CardId.Waboku, CardId.PotOfDesires,
CardId.ThreateningRoar, CardId.Mathematician,
CardId.MagicCylinder, CardId.DiceJar,
CardId.RingOfDestruction, CardId.CardcarD,
CardId.RecklessGreed, CardId.BattleFader,
CardId.SecretBlast, CardId.BlazingMirrorForce,
CardId.JustDesserts, CardId.Waboku,
CardId.OjamaTrio, CardId.ThreateningRoar,
CardId.SectetBarrel, CardId.MagicCylinder,
CardId.Ceasefire, CardId.RingOfDestruction,
CardId.BalanceOfJudgment, CardId.RecklessGreed,
CardId.AccuulatedFortune, CardId.SecretBlast,
}; CardId.JustDesserts,
} CardId.OjamaTrio,
public int[] now_List() CardId.SectetBarrel,
{ CardId.Ceasefire,
return new[] CardId.BalanceOfJudgment,
{ CardId.AccuulatedFortune,
};
CardId.Waboku, }
CardId.SecretBlast, public int[] now_List()
CardId.JustDesserts, {
CardId.SectetBarrel, return new[]
CardId.ThreateningRoar, {
CardId.Ceasefire,
CardId.RecklessGreed, CardId.Waboku,
CardId.RingOfDestruction, CardId.SecretBlast,
CardId.JustDesserts,
CardId.SectetBarrel,
}; CardId.ThreateningRoar,
} CardId.Ceasefire,
public int[] pot_list() CardId.RecklessGreed,
{ CardId.RingOfDestruction,
return new[]
{
CardId.PotOfDesires, };
CardId.SandaionTheTimloard, }
CardId.BattleFader, public int[] pot_list()
{
CardId.Waboku, return new[]
CardId.ThreateningRoar, {
CardId.MagicCylinder, CardId.PotOfDesires,
CardId.BlazingMirrorForce, CardId.MichionTimelord,
CardId.RingOfDestruction, CardId.SandaionTheTimelord,
}; CardId.BattleFader,
}
public int GetTotalATK(IList<ClientCard> list) CardId.Waboku,
{ CardId.ThreateningRoar,
int atk = 0; CardId.MagicCylinder,
foreach (ClientCard c in list) CardId.BlazingMirrorForce,
{ CardId.RingOfDestruction,
if (c == null) continue; };
atk += c.Attack; }
} public int GetTotalATK(IList<ClientCard> list)
return atk; {
} int atk = 0;
public bool Has_prevent_list_0(int id) foreach (ClientCard c in list)
{ {
return ( if (c == null) continue;
id == CardId.Waboku || atk += c.Attack;
id == CardId.ThreateningRoar|| }
id == CardId.MagicCylinder|| return atk;
id == CardId.BlazingMirrorForce|| }
id == CardId.RingOfDestruction public bool Has_prevent_list_0(int id)
); {
} return (
public bool Has_prevent_list_1(int id) id == CardId.Waboku ||
{ id == CardId.ThreateningRoar||
return (id == CardId.SandaionTheTimloard || id == CardId.MagicCylinder||
id == CardId.BattleFader id == CardId.BlazingMirrorForce||
); id == CardId.RingOfDestruction
} );
bool no_sp = false; }
bool one_turn_kill = false; public bool Has_prevent_list_1(int id)
bool one_turn_kill_1 = false; {
int expected_blood = 0; return (id == CardId.SandaionTheTimelord ||
bool prevent_used = false; id == CardId.BattleFader ||
int preventcount = 0; id ==CardId.MichionTimelord
bool battleprevent = false; );
bool OjamaTrioused = false; }
bool OjamaTrioused_draw = false; bool no_sp = false;
bool drawfirst = false; bool one_turn_kill = false;
bool Linkuribohused = true; bool one_turn_kill_1 = false;
int Waboku_count = 0; int expected_blood = 0;
int Roar_count = 0; bool prevent_used = false;
int strike_count = 0; int preventcount = 0;
int greed_count = 0; bool OjamaTrioused = false;
int blast_count = 0; bool OjamaTrioused_draw = false;
int barrel_count = 0; bool OjamaTrioused_do = false;
int just_count = 0; bool drawfirst = false;
int Ojama_count = 0; bool Linkuribohused = true;
int HasAccuulatedFortune = 0; bool Timelord_check = false;
public override bool OnSelectHand() int Waboku_count = 0;
{ int Roar_count = 0;
return true; int strike_count = 0;
} int greed_count = 0;
int blast_count = 0;
public override void OnNewTurn() int barrel_count = 0;
{ int just_count = 0;
int Ojama_count = 0;
int HasAccuulatedFortune = 0;
no_sp = false;
prevent_used = false; public override bool OnSelectHand()
Linkuribohused = true; {
return true;
} }
public override void OnNewPhase()
{ public override void OnNewTurn()
preventcount = 0; {
battleprevent = false; if (Bot.HasInHand(CardId.SandaionTheTimelord) ||Bot.HasInHand(CardId.MichionTimelord))
OjamaTrioused = false; Logger.DebugWriteLine("2222222222222222SandaionTheTimelord");
no_sp = false;
IList<ClientCard> trap = Bot.GetSpells(); prevent_used = false;
IList<ClientCard> monster = Bot.GetMonsters(); Linkuribohused = true;
Timelord_check = false;
foreach (ClientCard card in trap) }
{ public override void OnNewPhase()
if (Has_prevent_list_0(card.Id)) {
{ preventcount = 0;
preventcount++; OjamaTrioused = false;
battleprevent = true;
} IList<ClientCard> trap = Bot.GetSpells();
IList<ClientCard> monster = Bot.GetMonsters();
}
foreach (ClientCard card in monster) foreach (ClientCard card in trap)
{ {
if (Has_prevent_list_1(card.Id)) if (Has_prevent_list_0(card.Id))
{ {
preventcount++; preventcount++;
battleprevent = true; }
} }
foreach (ClientCard card in monster)
} {
if (Has_prevent_list_1(card.Id))
expected_blood = 0; {
one_turn_kill = false; preventcount++;
one_turn_kill_1 = false; }
OjamaTrioused_draw = false; }
drawfirst = false; foreach (ClientCard card in monster)
HasAccuulatedFortune = 0; {
strike_count = 0; if (Bot.HasInMonstersZone(CardId.SandaionTheTimelord) ||
greed_count = 0; Bot.HasInMonstersZone(CardId.MichionTimelord))
blast_count = 0; {
barrel_count = 0; prevent_used = true;
just_count = 0; Timelord_check = true;
Waboku_count = 0; }
Roar_count = 0; }
Ojama_count = 0; if(prevent_used && Timelord_check)
{
IList<ClientCard> check = Bot.GetSpells(); if (!Bot.HasInMonstersZone(CardId.SandaionTheTimelord) ||
foreach (ClientCard card in check) !Bot.HasInMonstersZone(CardId.MichionTimelord))
{ prevent_used = false;
if (card.Id == CardId.AccuulatedFortune) }
HasAccuulatedFortune++; expected_blood = 0;
one_turn_kill = false;
} one_turn_kill_1 = false;
foreach (ClientCard card in check) OjamaTrioused_draw = false;
{ OjamaTrioused_do = false;
if (card.Id == CardId.SecretBlast) drawfirst = false;
blast_count++; HasAccuulatedFortune = 0;
strike_count = 0;
} greed_count = 0;
foreach (ClientCard card in check) blast_count = 0;
{ barrel_count = 0;
if (card.Id == CardId.SectetBarrel) just_count = 0;
barrel_count++; Waboku_count = 0;
Roar_count = 0;
} Ojama_count = 0;
foreach (ClientCard card in check)
{ IList<ClientCard> check = Bot.GetSpells();
if (card.Id == CardId.JustDesserts) foreach (ClientCard card in check)
just_count++; {
if (card.Id == CardId.AccuulatedFortune)
} HasAccuulatedFortune++;
foreach (ClientCard card in check)
{ }
if (card.Id == CardId.ChainStrike) foreach (ClientCard card in check)
strike_count++; {
if (card.Id == CardId.SecretBlast)
} blast_count++;
foreach (ClientCard card in Bot.GetSpells())
{ }
if (card.Id == CardId.RecklessGreed) foreach (ClientCard card in check)
greed_count++; {
if (card.Id == CardId.SectetBarrel)
} barrel_count++;
foreach (ClientCard card in check)
{ }
if (card.Id == CardId.Waboku) foreach (ClientCard card in check)
Waboku_count++; {
if (card.Id == CardId.JustDesserts)
} just_count++;
foreach (ClientCard card in check)
{ }
if (card.Id == CardId.ThreateningRoar) foreach (ClientCard card in check)
Roar_count++; {
if (card.Id == CardId.ChainStrike)
} strike_count++;
if (Bot.HasInSpellZone(CardId.OjamaTrio) && Enemy.GetMonsterCount() <= 2 && Enemy.GetMonsterCount() >= 1)
{ }
if (HasAccuulatedFortune>0) OjamaTrioused_draw = true; foreach (ClientCard card in Bot.GetSpells())
} {
if (card.Id == CardId.RecklessGreed)
expected_blood = (Enemy.GetMonsterCount() * 500 * just_count + Enemy.GetFieldHandCount() * 200 * barrel_count + Enemy.GetFieldCount() * 300 * blast_count); greed_count++;
if (Enemy.LifePoints <= expected_blood && Duel.Player == 1)
{ }
Logger.DebugWriteLine(" one_turn_kill"); foreach (ClientCard card in check)
one_turn_kill = true; {
} if (card.Id == CardId.Waboku)
expected_blood = 0; Waboku_count++;
if (greed_count >= 2) greed_count = 1;
if (blast_count >= 2) blast_count = 1; }
if (just_count >= 2) just_count = 1; foreach (ClientCard card in check)
if (barrel_count >= 2) barrel_count = 1; {
if (Waboku_count >= 2) Waboku_count = 1; if (card.Id == CardId.ThreateningRoar)
if (Roar_count >= 2) Roar_count = 1; Roar_count++;
if (strike_count >= 2) strike_count = 1;
int currentchain = 0; }
if (OjamaTrioused_draw) expected_blood = (Enemy.GetMonsterCount() * 500 * just_count + Enemy.GetFieldHandCount() * 200 * barrel_count + Enemy.GetFieldCount() * 300 * blast_count);
currentchain = Duel.CurrentChain.Count + blast_count + just_count + barrel_count + Waboku_count + Waboku_count + Roar_count + greed_count + strike_count + Ojama_count; if (Enemy.LifePoints <= expected_blood && Duel.Player == 1)
else {
currentchain = Duel.CurrentChain.Count + blast_count + just_count + barrel_count + Waboku_count + Waboku_count + greed_count + Roar_count + strike_count; Logger.DebugWriteLine(" one_turn_kill");
//if (currentchain >= 3 && Duel.Player == 1) drawfirst = true; one_turn_kill = true;
currentchain = Duel.CurrentChain.Count+ blast_count + just_count+barrel_count; }
expected_blood = (Enemy.GetMonsterCount() * 500 * just_count + Enemy.GetFieldHandCount() * 200 * barrel_count + Enemy.GetFieldCount() * 300 * blast_count+(currentchain+1)*400); expected_blood = 0;
if (greed_count >= 2) greed_count = 1;
/*if (!one_turn_kill && Enemy.LifePoints <= expected_blood && Duel.Player == 1) if (blast_count >= 2) blast_count = 1;
{ if (just_count >= 2) just_count = 1;
Logger.DebugWriteLine(" one_turn_kill_1"); if (barrel_count >= 2) barrel_count = 1;
one_turn_kill_1 = true; if (Waboku_count >= 2) Waboku_count = 1;
}*/ if (Roar_count >= 2) Roar_count = 1;
} int currentchain = 0;
if (OjamaTrioused_do)
currentchain = Duel.CurrentChain.Count + blast_count + just_count + barrel_count + Waboku_count + Waboku_count + Roar_count + greed_count + Ojama_count;
private bool must_chain() else
{ currentchain = Duel.CurrentChain.Count + blast_count + just_count + barrel_count + Waboku_count + Waboku_count + greed_count + Roar_count;
if (AI.Utils.IsChainTarget(Card)) return true; //if (currentchain >= 3 && Duel.Player == 1) drawfirst = true;
foreach (ClientCard card in Enemy.GetSpells()) if (Bot.HasInSpellZone(CardId.ChainStrike))
{ {
if (card.Id == CardId.HarpiesFeatherDuster&&card.IsFaceup()) if (strike_count == 1)
{ {
return true; if (OjamaTrioused_do)
} expected_blood = ((Enemy.GetMonsterCount() + 3) * 500 * just_count + Enemy.GetFieldHandCount() * 200 * barrel_count + Enemy.GetFieldCount() * 300 * blast_count + (currentchain + 1) * 400);
} else
return false; expected_blood = (Enemy.GetMonsterCount() * 500 * just_count + Enemy.GetFieldHandCount() * 200 * barrel_count + Enemy.GetFieldCount() * 300 * blast_count + (currentchain + 1) * 400);
} }
private bool OjamaTrioset() else
{ {
if (Bot.HasInSpellZone(CardId.OjamaTrio)) return false; if (OjamaTrioused_do)
return true; expected_blood = ((Enemy.GetMonsterCount() + 3) * 500 * just_count + Enemy.GetFieldHandCount() * 200 * barrel_count + Enemy.GetFieldCount() * 300 * blast_count + (currentchain + 1 + currentchain + 2) * 400);
} else
private bool BrunSpellSet() expected_blood = (Enemy.GetMonsterCount() * 500 * just_count + Enemy.GetFieldHandCount() * 200 * barrel_count + Enemy.GetFieldCount() * 300 * blast_count + (currentchain + 1 + currentchain + 2) * 400);
{ }
if (Card.Id == CardId.OjamaTrio && Bot.HasInSpellZone(CardId.OjamaTrio))return false; if (!one_turn_kill && Enemy.LifePoints <= expected_blood && Duel.Player == 1)
return (Card.IsTrap() || Card.HasType(CardType.QuickPlay)) && Bot.GetSpellCountWithoutField() < 5; {
} Logger.DebugWriteLine(" %%%%%%%%%%%%%%%%%one_turn_kill_1");
private bool SandaionTheTimloard_summon() one_turn_kill_1 = true;
{ OjamaTrioused = true;
if (!battleprevent) }
return true; }
return false; }
}
private bool AbouluteKingBackJacksummon()
{ private bool must_chain()
return !no_sp; {
} if (AI.Utils.IsChainTarget(Card)) return true;
private bool AbouluteKingBackJackeff() foreach (ClientCard card in Enemy.GetSpells())
{ {
if (ActivateDescription == -1) if (card.Id == CardId.HarpiesFeatherDuster&&card.IsFaceup())
{ {
AI.SelectCard(AbouluteKingBackJack_List_1()); return true;
AI.SelectNextCard(AbouluteKingBackJack_List_2()); }
} }
return false;
return true; }
private bool OjamaTrioset()
} {
private bool PotOfDualityeff() if (Bot.HasInSpellZone(CardId.OjamaTrio)) return false;
{ return true;
no_sp = true; }
private bool BrunSpellSet()
AI.SelectCard(pot_list()); {
return true; if (Card.Id == CardId.OjamaTrio && Bot.HasInSpellZone(CardId.OjamaTrio))return false;
} return (Card.IsTrap() || Card.HasType(CardType.QuickPlay)) && Bot.GetSpellCountWithoutField() < 5;
private bool BlazingMirrorForceeff() }
{ private bool MichionTimelordsummon()
if (prevent_used) return false; {
IList<ClientCard> list = new List<ClientCard>(); if (Duel.Turn == 1)
foreach (ClientCard monster in Enemy.GetMonsters()) return false;
{ return true;
list.Add(monster); }
}
//if (GetTotalATK(list) / 2 >= Bot.LifePoints) return false; private bool SandaionTheTimelord_summon()
if (GetTotalATK(list) < 3000) return false; {
return Enemy.HasAttackingMonster() && DefaultUniqueTrap(); Logger.DebugWriteLine("&&&&&&&&&SandaionTheTimelord_summon");
} return true;
private bool ThreateningRoareff() }
{ private bool AbouluteKingBackJacksummon()
if (drawfirst) return true; {
if (DefaultOnBecomeTarget()) return DefaultUniqueTrap(); return !no_sp;
if (prevent_used || Duel.Phase != DuelPhase.BattleStart) return false; }
prevent_used = true; private bool AbouluteKingBackJackeff()
return DefaultUniqueTrap(); {
} if (ActivateDescription == -1)
private bool SandaionTheTimloardeff() {
{ AI.SelectCard(AbouluteKingBackJack_List_1());
AI.SelectNextCard(AbouluteKingBackJack_List_2());
prevent_used = true; }
return true;
} return true;
private bool Wabokueff()
{ }
if (drawfirst) private bool PotOfDualityeff()
{ {
Linkuribohused = false; no_sp = true;
return true;
} AI.SelectCard(pot_list());
if (DefaultOnBecomeTarget()) return true;
{ }
Linkuribohused = false;
return DefaultUniqueTrap(); private bool ThreateningRoareff()
} {
if (prevent_used||Duel.Player == 0||Duel.Phase!=DuelPhase.BattleStart) return false; if (one_turn_kill_1) return UniqueFaceupSpell();
prevent_used = true; if (drawfirst) return true;
Linkuribohused = false; if (DefaultOnBecomeTarget())
return DefaultUniqueTrap(); {
} prevent_used = true;
private bool BattleFadereff() return true;
{ }
if (prevent_used || Duel.Player == 0) return false; if (prevent_used || Duel.Phase != DuelPhase.BattleStart) return false;
AI.SelectPosition(CardPosition.FaceUpDefence); prevent_used = true;
prevent_used = true; return DefaultUniqueTrap();
return true; }
} private bool SandaionTheTimelordeff()
private bool MagicCylindereff() {
{ Logger.DebugWriteLine("***********SandaionTheTimelordeff");
if (prevent_used) return false; return true;
if (Bot.LifePoints <= Enemy.BattlingMonster.Attack) return DefaultUniqueTrap(); }
if(Enemy.BattlingMonster.Attack>1800) return DefaultUniqueTrap(); private bool Wabokueff()
return false; {
} if (one_turn_kill_1) return UniqueFaceupSpell();
public bool Ring_act() if (drawfirst)
{ {
if (Duel.LastChainPlayer == 0 && AI.Utils.GetLastChainCard() != null ) return false; Linkuribohused = false;
ClientCard target = AI.Utils.GetProblematicEnemyMonster(); return true;
if (target == null && AI.Utils.IsChainTarget(Card)) }
{ if (DefaultOnBecomeTarget())
target = AI.Utils.GetBestEnemyMonster(true, true); {
} Linkuribohused = false;
if (target != null) prevent_used = true;
{ return true;
if (Bot.LifePoints <= target.Attack) return false; }
AI.SelectCard(target); if (prevent_used||Duel.Player == 0||Duel.Phase!=DuelPhase.BattleStart) return false;
return true; prevent_used = true;
} Linkuribohused = false;
return false; return DefaultUniqueTrap();
} }
private bool RecklessGreedeff() private bool BattleFadereff()
{ {
int count=0; if (AI.Utils.ChainContainsCard(CardId.BlazingMirrorForce) || AI.Utils.ChainContainsCard(CardId.MagicCylinder))
foreach (ClientCard card in Bot.GetSpells()) return false;
{ if (prevent_used || Duel.Player == 0) return false;
if (card.Id == CardId.RecklessGreed) AI.SelectPosition(CardPosition.FaceUpDefence);
count++; prevent_used = true;
return true;
} }
bool Demiseused = AI.Utils.ChainContainsCard(CardId.CardOfDemise);
if (drawfirst) return DefaultUniqueTrap(); private bool BlazingMirrorForceeff()
if (DefaultOnBecomeTarget() && count > 1) return true; {
if (Demiseused) return false; if (prevent_used) return false;
if (count > 1) return true; IList<ClientCard> list = new List<ClientCard>();
if (Bot.LifePoints <= 2000) return true; foreach (ClientCard monster in Enemy.GetMonsters())
if (Bot.GetHandCount() <1 && Duel.Player==0 && Duel.Phase!=DuelPhase.Standby) return true; {
return false; if (monster.IsAttack())
} list.Add(monster);
private bool SectetBarreleff() }
{ if (GetTotalATK(list) / 2 >= Bot.LifePoints) return false;
if (drawfirst) return DefaultUniqueTrap(); Logger.DebugWriteLine("!!!!!!!!BlazingMirrorForceeff" + GetTotalATK(list) / 2);
if (one_turn_kill_1) return DefaultUniqueTrap(); if (GetTotalATK(list) / 2 >= Enemy.LifePoints) return DefaultUniqueTrap();
if (one_turn_kill) return DefaultUniqueTrap(); if (GetTotalATK(list) < 3000) return false;
if (DefaultOnBecomeTarget()) return true; prevent_used = true;
int count = Enemy.GetFieldHandCount(); return DefaultUniqueTrap();
if (Enemy.LifePoints < count * 200) return true;
if (count >= 8) return true; }
return false;
} private bool MagicCylindereff()
private bool SecretBlasteff() {
{ if (prevent_used) return false;
if (drawfirst) return DefaultUniqueTrap(); if (Bot.LifePoints <= Enemy.BattlingMonster.Attack) return DefaultUniqueTrap();
if (one_turn_kill_1) return DefaultUniqueTrap(); if (Enemy.LifePoints <= Enemy.BattlingMonster.Attack) return DefaultUniqueTrap();
if (one_turn_kill) return DefaultUniqueTrap(); if (Enemy.BattlingMonster.Attack>1800) return DefaultUniqueTrap();
if (DefaultOnBecomeTarget()) return true; return false;
int count = Enemy.GetFieldCount(); }
if (Enemy.LifePoints < count * 300) return true; public bool Ring_act()
if (count >= 5) return true; {
return false; if (Duel.LastChainPlayer == 0 && AI.Utils.GetLastChainCard() != null ) return false;
ClientCard target = AI.Utils.GetProblematicEnemyMonster();
} if (target == null && AI.Utils.IsChainTarget(Card))
{
private bool OjamaTrioeff() target = AI.Utils.GetBestEnemyMonster(true, true);
{ }
return OjamaTrioused||OjamaTrioused_draw; if (target != null)
} {
private bool JustDessertseff() if (Bot.LifePoints <= target.Attack) return false;
{ AI.SelectCard(target);
if (Duel.Player == 0) return false; return true;
if (drawfirst) return DefaultUniqueTrap(); }
if (one_turn_kill_1) return DefaultUniqueTrap(); return false;
if (one_turn_kill) return DefaultUniqueTrap(); }
if (DefaultOnBecomeTarget()) return true; private bool RecklessGreedeff()
int count = Enemy.GetMonsterCount(); {
if (Enemy.LifePoints <= count * 500) return true; if (one_turn_kill_1) return UniqueFaceupSpell();
if (Bot.HasInSpellZone(CardId.OjamaTrio) && count <= 2 && count >= 1) int count=0;
{ foreach (ClientCard card in Bot.GetSpells())
OjamaTrioused = true; {
return true; if (card.Id == CardId.RecklessGreed)
} count++;
if (count >= 4) return true;
return false; }
} bool Demiseused = AI.Utils.ChainContainsCard(CardId.CardOfDemise);
private bool ChainStrikeeff() if (drawfirst) return UniqueFaceupSpell();
{ if (DefaultOnBecomeTarget() && count > 1) return true;
if (Demiseused) return false;
if (drawfirst) return true; if (count > 1) return true;
if (DefaultOnBecomeTarget()) return true; if (Bot.LifePoints <= 3000) return true;
int chain = Duel.CurrentChain.Count; if (Bot.GetHandCount() <1 && Duel.Player==0 && Duel.Phase!=DuelPhase.Standby) return true;
if (strike_count >= 2 && chain >= 2) return true; return false;
if (Enemy.LifePoints <= (chain + 1) * 400) return true; }
if (Duel.CurrentChain.Count >= 3) return true; private bool SectetBarreleff()
return false; {
} if (DefaultOnBecomeTarget()) return true;
if (Duel.Player == 0) return false;
private bool BalanceOfJudgmenteff() if (drawfirst) return true;
{ if (one_turn_kill_1) return UniqueFaceupSpell();
if (DefaultOnBecomeTarget()) return true; if (one_turn_kill) return true;
int count = (Enemy.GetFieldCount() - Bot.GetFieldHandCount()); if (DefaultOnBecomeTarget()) return true;
if ( count>= 2)return true; int count = Enemy.GetFieldHandCount();
return false; int monster_count = Enemy.GetMonsterCount() - Enemy.GetMonstersExtraZoneCount();
} if (Enemy.LifePoints < count * 200) return true;
private bool CardOfDemiseeff() if (Bot.HasInSpellZone(CardId.OjamaTrio) && monster_count <= 2 && monster_count >= 1)
{
if (count + 3 >= 8)
{
OjamaTrioused = true;
return true;
}
}
if (count >= 8) return true;
return false;
}
private bool SecretBlasteff()
{
if (DefaultOnBecomeTarget()) return true;
if (Duel.Player == 0) return false;
if (drawfirst) return UniqueFaceupSpell();
if (one_turn_kill_1) return UniqueFaceupSpell();
if (one_turn_kill) return true;
int count = Enemy.GetFieldCount();
int monster_count = Enemy.GetMonsterCount() - Enemy.GetMonstersExtraZoneCount();
if (Enemy.LifePoints < count * 300) return true;
if(Bot.HasInSpellZone(CardId.OjamaTrio) && monster_count <= 2 && monster_count >= 1 )
{
if(count+3>=5)
{
OjamaTrioused = true;
return true;
}
}
if (count >= 5) return true;
return false;
}
private bool OjamaTrioeff()
{
return OjamaTrioused||OjamaTrioused_draw;
}
private bool JustDessertseff()
{
if (DefaultOnBecomeTarget()) return true;
if (Duel.Player == 0) return false;
if (drawfirst) return UniqueFaceupSpell();
if (one_turn_kill_1) return UniqueFaceupSpell();
if (one_turn_kill) return true;
int count = Enemy.GetMonsterCount()-Enemy.GetMonstersExtraZoneCount();
if (Enemy.LifePoints <= count * 500) return true;
if (Bot.HasInSpellZone(CardId.OjamaTrio) && count <= 2 && count >= 1)
{
OjamaTrioused = true;
return true;
}
if (count >= 3) return true;
return false;
}
private bool ChainStrikeeff()
{
if (one_turn_kill) return true;
if (one_turn_kill_1) return true;
if (drawfirst) return true;
if (DefaultOnBecomeTarget()) return true;
int chain = Duel.CurrentChain.Count;
if (strike_count >= 2 && chain >= 2) return true;
if (Enemy.LifePoints <= (chain + 1) * 400) return true;
if (Duel.CurrentChain.Count >= 3) return true;
return false;
}
private bool BalanceOfJudgmenteff()
{
if (DefaultOnBecomeTarget()) return true;
int count = (Enemy.GetFieldCount() - Bot.GetFieldHandCount());
if ( count>= 2)return true;
return false;
}
private bool CardOfDemiseeff()
{ {
foreach (ClientCard card in Bot.GetMonsters()) foreach (ClientCard card in Bot.GetMonsters())
{ {
if (card.Id == CardId.CardcarD && card.IsFaceup()) if (card.Id == CardId.CardcarD && card.IsFaceup())
return false; return false;
} }
if (Bot.GetHandCount() == 1 && Bot.GetSpellCountWithoutField() <= 3) if (Bot.GetHandCount() == 1 && Bot.GetSpellCountWithoutField() <= 3)
{ {
no_sp = true; no_sp = true;
return true; return true;
} }
return false; return false;
} }
private bool Mathematicianeff() private bool Mathematicianeff()
{ {
if (Card.Location == CardLocation.MonsterZone) if (Card.Location == CardLocation.MonsterZone)
{ {
AI.SelectCard(CardId.AbouluteKingBackJack); AI.SelectCard(CardId.AbouluteKingBackJack);
return true; return true;
} }
return true; return true;
} }
private bool DiceJarfacedown() private bool DiceJarfacedown()
{ {
foreach (ClientCard card in Bot.GetMonsters()) foreach (ClientCard card in Bot.GetMonsters())
{ {
if (card.Id == CardId.DiceJar && card.IsFacedown()) if (card.Id == CardId.DiceJar && card.IsFacedown())
return true; return true;
break; break;
} }
return false; return false;
} }
private bool Ceasefireeff() private bool Ceasefireeff()
{ {
if (Enemy.GetMonsterCount() >= 3) return true; if (Enemy.GetMonsterCount() >= 3) return true;
if (DiceJarfacedown()) return false; if (DiceJarfacedown()) return false;
if ((Bot.GetMonsterCount() + Enemy.GetMonsterCount()) >= 4) return true; if ((Bot.GetMonsterCount() + Enemy.GetMonsterCount()) >= 4) return true;
return false; return false;
} }
private bool Linkuriboheff() private bool Linkuriboheff()
{ {
IList<ClientCard> newlist = new List<ClientCard>();
IList<ClientCard> newlist = new List<ClientCard>(); foreach (ClientCard newmonster in Enemy.GetMonsters())
foreach (ClientCard newmonster in Enemy.GetMonsters()) {
{ if (newmonster.IsAttack())
newlist.Add(newmonster); newlist.Add(newmonster);
} }
if (!Linkuribohused) return false; if (!Linkuribohused) return false;
if(Enemy.BattlingMonster!=null) if(Enemy.BattlingMonster!=null)
{ {
if (Enemy.BattlingMonster.Attack > 1800 && Bot.HasInSpellZone(CardId.MagicCylinder)) return false; if (Enemy.BattlingMonster.Attack > 1800 && Bot.HasInSpellZone(CardId.MagicCylinder)) return false;
} }
if (GetTotalATK(newlist) >= 3000 && Bot.HasInSpellZone(CardId.BlazingMirrorForce)) return false; if (GetTotalATK(newlist) / 2 >= Bot.LifePoints && Bot.HasInSpellZone(CardId.BlazingMirrorForce))
if (AI.Utils.GetLastChainCard() == null) return true; return true;
if (AI.Utils.GetLastChainCard().Id == CardId.Linkuriboh)return false; if (GetTotalATK(newlist) / 2 >= Enemy.LifePoints && Bot.HasInSpellZone(CardId.BlazingMirrorForce))
return true; return false;
} if (AI.Utils.GetLastChainCard() == null) return true;
if (AI.Utils.GetLastChainCard().Id == CardId.Linkuriboh) return false;
public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender) return true;
{ }
if (attacker.Id == CardId.Linkuriboh && defender.IsFacedown()) return false; public bool MonsterRepos()
return base.OnPreBattleBetween(attacker,defender); {
} if (Card.IsFacedown() && Card.Id!=CardId.DiceJar)
/*private bool SwordsOfRevealingLight() return true;
{ return base.DefaultMonsterRepos();
int count = Bot.SpellZone.GetCardCount(CardId.SwordsOfRevealingLight); }
return count == 0; public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender)
}*/ {
if (attacker.Id == CardId.Linkuriboh && defender.IsFacedown()) return false;
/* if (attacker.Id == CardId.SandaionTheTimelord && !attacker.IsDisabled())
private bool SetInvincibleMonster() {
{ attacker.RealPower = 9999;
foreach (ClientCard card in Bot.GetMonsters()) return true;
{ }
if (card.Id == CardId.Marshmallon || card.Id == CardId.SpiritReaper) if(attacker.Id==CardId.MichionTimelord && !attacker.IsDisabled())
{ {
return false; attacker.RealPower = 9999;
} return true;
} }
return true; return base.OnPreBattleBetween(attacker,defender);
}*/ }
public override void OnChaining(int player, ClientCard card)
/* {
private bool ReposEverything() expected_blood = 0;
{ one_turn_kill = false;
if (Card.Id == CardId.ReflectBounder) one_turn_kill_1 = false;
return Card.IsDefense(); OjamaTrioused_draw = false;
if (Card.Id == CardId.FencingFireFerret) OjamaTrioused_do = false;
return DefaultMonsterRepos(); drawfirst = false;
if (Card.IsAttack()) HasAccuulatedFortune = 0;
return true; strike_count = 0;
return false; greed_count = 0;
}*/ blast_count = 0;
} barrel_count = 0;
just_count = 0;
Waboku_count = 0;
Roar_count = 0;
Ojama_count = 0;
IList<ClientCard> check = Bot.GetSpells();
foreach (ClientCard card1 in check)
{
if (card1.Id == CardId.AccuulatedFortune)
HasAccuulatedFortune++;
}
foreach (ClientCard card1 in check)
{
if (card1.Id == CardId.SecretBlast)
blast_count++;
}
foreach (ClientCard card1 in check)
{
if (card1.Id == CardId.SectetBarrel)
barrel_count++;
}
foreach (ClientCard card1 in check)
{
if (card1.Id == CardId.JustDesserts)
just_count++;
}
foreach (ClientCard card1 in check)
{
if (card1.Id == CardId.ChainStrike)
strike_count++;
}
foreach (ClientCard card1 in Bot.GetSpells())
{
if (card1.Id == CardId.RecklessGreed)
greed_count++;
}
foreach (ClientCard card1 in check)
{
if (card1.Id == CardId.Waboku)
Waboku_count++;
}
foreach (ClientCard card1 in check)
{
if (card1.Id == CardId.ThreateningRoar)
Roar_count++;
}
/*if (Bot.HasInSpellZone(CardId.OjamaTrio) && Enemy.GetMonsterCount() <= 2 && Enemy.GetMonsterCount() >= 1)
{
if (HasAccuulatedFortune > 0) OjamaTrioused_draw = true;
}*/
if (Bot.HasInSpellZone(CardId.OjamaTrio) && (Enemy.GetMonsterCount() - Enemy.GetMonstersExtraZoneCount()) <= 2 &&
(Enemy.GetMonsterCount() - Enemy.GetMonstersExtraZoneCount()) >= 1)
{
OjamaTrioused_do = true;
}
expected_blood = (Enemy.GetMonsterCount() * 500 * just_count + Enemy.GetFieldHandCount() * 200 * barrel_count + Enemy.GetFieldCount() * 300 * blast_count);
if (Enemy.LifePoints <= expected_blood && Duel.Player == 1)
{
Logger.DebugWriteLine(" %%%%%%%%%%%%%%%%%one_turn_kill");
one_turn_kill = true;
}
expected_blood = 0;
if (greed_count >= 2) greed_count = 1;
if (blast_count >= 2) blast_count = 1;
if (just_count >= 2) just_count = 1;
if (barrel_count >= 2) barrel_count = 1;
if (Waboku_count >= 2) Waboku_count = 1;
if (Roar_count >= 2) Roar_count = 1;
int currentchain = 0;
if (OjamaTrioused_do)
currentchain = Duel.CurrentChain.Count + blast_count + just_count + barrel_count + Waboku_count + Waboku_count + Roar_count + greed_count + Ojama_count;
else
currentchain = Duel.CurrentChain.Count + blast_count + just_count + barrel_count + Waboku_count + Waboku_count + greed_count + Roar_count ;
//if (currentchain >= 3 && Duel.Player == 1) drawfirst = true;
if(Bot.HasInSpellZone(CardId.ChainStrike))
{
if (strike_count == 1)
{
if (OjamaTrioused_do)
expected_blood = ((Enemy.GetMonsterCount() + 3) * 500 * just_count + Enemy.GetFieldHandCount() * 200 * barrel_count + Enemy.GetFieldCount() * 300 * blast_count + (currentchain + 1) * 400);
else
expected_blood = (Enemy.GetMonsterCount() * 500 * just_count + Enemy.GetFieldHandCount() * 200 * barrel_count + Enemy.GetFieldCount() * 300 * blast_count + (currentchain + 1) * 400);
}
else
{
if (OjamaTrioused_do)
expected_blood = ((Enemy.GetMonsterCount() + 3) * 500 * just_count + Enemy.GetFieldHandCount() * 200 * barrel_count + Enemy.GetFieldCount() * 300 * blast_count + (currentchain + 1 + currentchain + 2) * 400);
else
expected_blood = (Enemy.GetMonsterCount() * 500 * just_count + Enemy.GetFieldHandCount() * 200 * barrel_count + Enemy.GetFieldCount() * 300 * blast_count + (currentchain + 1 + currentchain + 2) * 400);
}
if (!one_turn_kill && Enemy.LifePoints <= expected_blood && Duel.Player == 1)
{
Logger.DebugWriteLine(" %%%%%%%%%%%%%%%%%one_turn_kill_1");
one_turn_kill_1 = true;
OjamaTrioused = true;
}
}
base.OnChaining(player, card);
}
}
} }
\ No newline at end of file
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