Commit 8adbd20b authored by mercury233's avatar mercury233

fix and update

parent 9b7de117
......@@ -84,5 +84,24 @@ namespace WindBot.Game.AI
}
return !nomonster;
}
public ClientCard GetOneEnnemyBetterThanValue(int value, bool onlyatk)
{
for (int i = 0; i < 5; ++i)
{
ClientCard card = Duel.Fields[1].MonsterZone[i];
if (card == null) continue;
if (onlyatk && card.IsDefense()) continue;
int ennemyValue = card.GetDefensePower();
if (ennemyValue >= value)
return card;
}
return null;
}
public int GetStringId(int id, int option)
{
return id * 16 + option;
}
}
}
\ No newline at end of file
......@@ -145,6 +145,16 @@ namespace WindBot.Game.AI
return null;
}
public static ClientCard GetDangerousMonster(this IEnumerable<ClientCard> cards)
{
foreach (ClientCard card in cards)
{
if (card != null && card.IsMonsterDangerous())
return card;
}
return null;
}
public static ClientCard GetNegateAttackSpell(this IEnumerable<ClientCard> cards)
{
foreach (ClientCard card in cards)
......
......@@ -117,9 +117,9 @@ namespace DevBot.Game.AI.Decks
private bool ZwLionArms()
{
if (ActivateDescription == (int)CardId.ZwLionArms * 16 + 0)
if (ActivateDescription == AI.Utils.GetStringId((int)CardId.ZwLionArms, 0))
return true;
if (ActivateDescription == (int)CardId.ZwLionArms * 16 + 1)
if (ActivateDescription == AI.Utils.GetStringId((int)CardId.ZwLionArms, 1))
return !Card.IsDisabled();
return false;
}
......
......@@ -6,6 +6,8 @@
Yubel = 78371393,
YubelIncarnate = 4779091,
YubelNightmare = 31764700,
MetaionTheTimelord = 74530899
MetaionTheTimelord = 74530899,
Number39Utopia = 84013237,
NumberS39UtopiatheLightning = 56832966
}
}
......@@ -11,6 +11,7 @@
MaskedHeroDivineWind = 22093873,
DarknessNeosphere = 60417395,
MetaionTheTimelord = 74530899,
CastleGate = 36931229
CastleGate = 36931229,
Number39Utopia = 84013237
}
}
......@@ -86,11 +86,21 @@ namespace WindBot.Game.AI
CurrentChain.Clear();
}
public virtual void OnNewTurn()
{
// Some AI need do something on new turn
}
public virtual IList<ClientCard> OnSelectCard(IList<ClientCard> cards, int min, int max, bool cancelable)
{
return null;
}
public virtual IList<ClientCard> OnSelectSum(IList<ClientCard> cards, int sum, int min, int max)
{
return null;
}
public virtual bool OnSelectYesNo(int desc)
{
return true;
......
......@@ -88,10 +88,30 @@ namespace WindBot.Game
return HasInCards(Hand, cardId);
}
public bool HasInHand(List<int> cardId)
{
return HasInCards(Hand, cardId);
}
public bool HasInGraveyard(int cardId)
{
return HasInCards(Graveyard, cardId);
}
public bool HasInGraveyard(List<int> cardId)
{
return HasInCards(Graveyard, cardId);
}
public bool HasInBanished(int cardId)
{
return HasInCards(Banished, cardId);
}
public bool HasInBanished(List<int> cardId)
{
return HasInCards(Banished, cardId);
}
public bool HasAttackingMonster()
{
......@@ -120,6 +140,11 @@ namespace WindBot.Game
return HasInCards(MonsterZone, cardId);
}
public bool HasInMonstersZone(List<int> cardId)
{
return HasInCards(MonsterZone, cardId);
}
public bool HasInSpellZone(int cardId)
{
return HasInCards(SpellZone, cardId);
......@@ -151,6 +176,28 @@ namespace WindBot.Game
return count;
}
public int GetCountCardInZone(IEnumerable<ClientCard> cards, int cardId)
{
int count = 0;
foreach (ClientCard card in cards)
{
if (card != null && card.Id == cardId)
count++;
}
return count;
}
public int GetCountCardInZone(IEnumerable<ClientCard> cards, List<int> cardId)
{
int count = 0;
foreach (ClientCard card in cards)
{
if (card != null && cardId.Contains(card.Id))
count++;
}
return count;
}
private static List<ClientCard> GetCards(IEnumerable<ClientCard> cards, CardType type)
{
List<ClientCard> nCards = new List<ClientCard>();
......@@ -182,5 +229,15 @@ namespace WindBot.Game
}
return false;
}
private static bool HasInCards(IEnumerable<ClientCard> cards, List<int> cardId)
{
foreach (ClientCard card in cards)
{
if (card != null && cardId.Contains(card.Id))
return true;
}
return false;
}
}
}
\ No newline at end of file
......@@ -15,6 +15,7 @@ namespace WindBot.Game
public DuelPhase Phase { get; set; }
public MainPhase MainPhase { get; set; }
public BattlePhase BattlePhase { get; set; }
public IList<ClientCard> ChainTargets { get; set; }
public Duel()
{
......@@ -22,6 +23,7 @@ namespace WindBot.Game
Fields = new ClientField[2];
Fields[0] = new ClientField();
Fields[1] = new ClientField();
ChainTargets = new List<ClientCard>();
}
public ClientCard GetCard(int player, CardLocation loc, int index)
......
......@@ -64,7 +64,10 @@ namespace WindBot.Game
m_option = -1;
m_position = CardPosition.FaceUpAttack;
if (Duel.Player == 0 && Duel.Phase == DuelPhase.Draw)
{
_dialogs.SendNewTurn();
Executor.OnNewTurn();
}
}
/// <summary>
......@@ -341,13 +344,57 @@ namespace WindBot.Game
/// <returns></returns>
public IList<ClientCard> OnSelectSum(IList<ClientCard> cards, int sum, int min, int max)
{
// Always return one card. The first available.
IList<ClientCard> selected = new List<ClientCard>();
selected = Executor.OnSelectSum(cards, sum, min, max);
if (selected != null)
{
return selected;
}
selected = new List<ClientCard>();
int trysum = 0;
foreach (ClientCard card in cards)
{
// try level add
if (trysum + card.Level > sum)
{
continue;
}
selected.Add(card);
trysum += card.Level;
//Logger.WriteLine(card.Id + "");
//Logger.WriteLine(trysum + " selected " + sum);
if (trysum == sum)
{
return selected;
}
}
IList<ClientCard> selected2 = new List<ClientCard>();
foreach (ClientCard card in selected)
{
// clone
selected2.Add(card);
}
foreach (ClientCard card in selected)
{
// try level sub
selected2.Remove(card);
trysum -= card.Level;
//Logger.WriteLine(card.Id + "");
//Logger.WriteLine(trysum + " selected2 " + sum);
if (trysum == sum)
{
return selected2;
}
}
foreach (ClientCard card in cards)
{
// try level equal
if (card.Level == sum)
{
return new[] { card };
}
}
// However return everything, that may work.
// try all
return cards;
}
......
......@@ -93,7 +93,7 @@ namespace WindBot.Game
_messages.Add(GameMessage.SortChain, OnChainSorting);
_messages.Add(GameMessage.UpdateCard, OnUpdateCard);
_messages.Add(GameMessage.UpdateData, OnUpdateData);
_messages.Add(GameMessage.BecomeTarget, OnBecomeTarget);
_messages.Add(GameMessage.SelectBattleCmd, OnSelectBattleCmd);
_messages.Add(GameMessage.SelectCard, OnSelectCard);
_messages.Add(GameMessage.SelectChain, OnSelectChain);
......@@ -398,11 +398,13 @@ namespace WindBot.Game
ClientCard card = _duel.GetCard(pcc, pcl, pcs, subs);
int cc = GetLocalPlayer(packet.ReadByte());
_ai.OnChaining(card, cc);
_duel.ChainTargets.Clear();
}
private void OnChainEnd(BinaryReader packet)
{
_ai.OnChainEnd();
//_duel.ChainTargets.Clear();
}
private void OnChainSorting(BinaryReader packet)
......@@ -468,6 +470,21 @@ namespace WindBot.Game
}
}
private void OnBecomeTarget(BinaryReader packet)
{
int count = packet.ReadByte();
for (int i = 0; i < count; ++i)
{
int player = GetLocalPlayer(packet.ReadByte());
int loc = packet.ReadByte();
int seq = packet.ReadByte();
/*int sseq = */packet.ReadByte();
ClientCard card = _duel.GetCard(player, (CardLocation)loc, seq);
if (card == null) continue;
_duel.ChainTargets.Add(card);
}
}
private void OnSelectBattleCmd(BinaryReader packet)
{
packet.ReadByte(); // player
......@@ -667,7 +684,7 @@ namespace WindBot.Game
Connection.Send(CtosMessage.Response, 0);
return;
}
if (card.Id == 0) card.SetId(cardId);
int reply = _ai.OnSelectEffectYn(card) ? (1) : (0);
......@@ -874,6 +891,11 @@ namespace WindBot.Game
}
}
for (int k = 0; k < mandatoryCards.Count; ++k)
{
sumval -= mandatoryCards[k].Level;
}
IList<ClientCard> selected = _ai.OnSelectSum(cards, sumval, min, max);
byte[] result = new byte[mandatoryCards.Count + selected.Count + 1];
......
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