Commit 8880a1d5 authored by mercury233's avatar mercury233

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

parents a11997ff 3f572de6
......@@ -6,6 +6,8 @@
71564252
71564252
71564252
14558127
14558127
36584821
36584821
36584821
......@@ -20,9 +22,6 @@
35261759
59750328
59750328
70368879
70368879
70368879
98645731
98645731
98645731
......@@ -30,22 +29,22 @@
73915051
10045474
10045474
10045474
10813327
15693423
23924608
47475363
47475363
30241314
30241314
58921041
58921041
61740673
61936647
69452756
40605147
40605147
77538567
77538567
84749824
84749824
#extra
86221741
31833038
......@@ -65,13 +64,11 @@
!side
10000080
86937530
14558127
62015408
9742784
67441435
72529749
43898403
70368879
19508728
10045474
15693423
24207889
69452756
......
......@@ -461,7 +461,8 @@ namespace WindBot.Game.AI.Decks
return card;
card = Enemy.MonsterZone.GetDangerousMonster(canBeTarget);
if (card != null)
if (card != null
&& (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2)))
return card;
card = Enemy.MonsterZone.GetInvincibleMonster(canBeTarget);
......@@ -1136,7 +1137,7 @@ namespace WindBot.Game.AI.Decks
if (!AI.Utils.IsTurn1OrMain2())
{
ClientCard self_best = AI.Utils.GetBestBotMonster();
ClientCard enemy_best = AI.Utils.GetProblematicEnemyCard(self_best.Attack + 1, true);
ClientCard enemy_best = AI.Utils.GetProblematicEnemyCard(self_best.Attack, true);
ClientCard enemy_target = GetProblematicEnemyCard_Alter(true,false);
if ((enemy_best != null || enemy_target != null)
......@@ -1548,7 +1549,7 @@ namespace WindBot.Game.AI.Decks
ClientCard enemy_card = GetBestEnemyCard_random();
if (enemy_card != null)
{
Logger.DebugWriteLine("Silquitousdecide:" + bounce_self?.Name);
Logger.DebugWriteLine("Silquitous decide:" + bounce_self?.Name);
AI.SelectCard(bounce_self);
AI.SelectNextCard(enemy_card);
return true;
......@@ -1908,6 +1909,11 @@ namespace WindBot.Game.AI.Decks
}
else
{
ClientCard self_best = AI.Utils.GetBestBotMonster();
int best_atk = self_best == null ? 0 : self_best.Attack;
ClientCard enemy_best = AI.Utils.GetProblematicEnemyCard(best_atk, true);
ClientCard enemy_target = GetProblematicEnemyCard_Alter(true, false);
if (!Multifaker_ssfromhand && Multifaker_candeckss() && can_ss_Multifaker)
{
Spoofing_select(new[]
......@@ -1928,6 +1934,45 @@ namespace WindBot.Game.AI.Decks
CardId.Silquitous
});
}
else if (!summoned && !Bot.HasInGraveyard(CardId.Meluseek) && Bot.GetRemainingCount(CardId.Meluseek,3) > 0 && !Bot.HasInHand(CardId.Meluseek)
&& (enemy_best != null || enemy_target != null) )
{
if (Bot.HasInHand(CardId.Silquitous))
{
foreach (ClientCard card in Bot.Hand)
{
if (card.Id == CardId.Silquitous)
{
AI.SelectCard(card);
AI.SelectNextCard(new[]{
CardId.Meluseek,
CardId.Marionetter
});
return true;
}
}
}
else
{
Spoofing_select(new[]
{
CardId.Silquitous,
CardId.Manifestation,
CardId.Kunquery,
CardId.Multifaker,
CardId.Protocol,
CardId.Meluseek,
CardId.Marionetter,
});
AI.SelectNextCard(new[]{
CardId.Meluseek,
CardId.Marionetter,
CardId.Multifaker,
CardId.Kunquery
});
return true;
}
}
else if (!summoned && !Bot.HasInHand(CardId.Marionetter) && Bot.GetRemainingCount(CardId.Marionetter,3) > 0)
{
if (Bot.HasInHand(CardId.Silquitous))
......@@ -1944,7 +1989,8 @@ namespace WindBot.Game.AI.Decks
return true;
}
}
} else
}
else
{
Spoofing_select(new[]
{
......@@ -1966,6 +2012,7 @@ namespace WindBot.Game.AI.Decks
}
}
}
// target protect
bool go = false;
foreach(ClientCard card in Bot.GetSpells())
{
......@@ -2052,6 +2099,7 @@ namespace WindBot.Game.AI.Decks
{
if (EvenlyMatched_ready()) return false;
bool can_summon = false;
if (Enemy.GetMonsterCount() == 0 && Enemy.LifePoints <= 800) return true;
foreach (ClientCard card in Bot.Hand)
{
if (isAltergeist(card.Id) && card.IsTrap())
......@@ -2089,6 +2137,7 @@ namespace WindBot.Game.AI.Decks
public bool Multifaker_summon()
{
if (EvenlyMatched_ready()) return false;
if (Enemy.GetMonsterCount() == 0 && Enemy.LifePoints <= 1200) return true;
if (Bot.HasInMonstersZone(CardId.Silquitous) || Bot.HasInHandOrInSpellZone(CardId.Spoofing))
{
summoned = true;
......@@ -2211,10 +2260,22 @@ namespace WindBot.Game.AI.Decks
if (AI.Utils.ChainContainsCard(CardId.Multifaker)) return false;
if (Duel.Player == 1)
{
AI.SelectCard(new[] { CardId.Meluseek });
ss_other_monster = true;
return true;
} else
if (Card.Location == CardLocation.Grave)
{
AI.SelectCard(new[] { CardId.Meluseek });
ss_other_monster = true;
return true;
} else
{
if (Card.IsDisabled() && !Enemy.HasInSpellZone(82732705, true)) return false;
ClientCard enemy_card = Enemy.BattlingMonster;
if (enemy_card == null) return false;
ClientCard self_card = Bot.BattlingMonster;
if (self_card == null) return (enemy_card.Id != CardId.Hayate);
return (enemy_card.Attack > self_card.GetDefensePower());
}
}
else
{
if (!summoned && !Bot.HasInHand(CardId.Marionetter) && !Meluseek_searched && (Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2))
{
......@@ -2509,7 +2570,7 @@ namespace WindBot.Game.AI.Decks
Logger.DebugWriteLine("Tuner: enemy: " + enemy_power.ToString() + ", bot: " + self_power.ToString());
if (enemy_power < self_power || enemy_power == 0) return false;
int real_count = (Bot.HasInExtra(CardId.Needlefiber)) ? Bot.GetMonsterCount() + 2 : Bot.GetMonsterCount() + 1;
if ((real_count < 3 && enemy_power >= 2400)
if ((real_count <= 3 && enemy_power >= 2400)
|| !(Bot.HasInExtra(CardId.TripleBurstDragon) || Bot.HasInExtra(CardId.Borrelsword)) ) return false;
}
if (Multifaker_ssfromdeck) return false;
......@@ -2707,6 +2768,15 @@ namespace WindBot.Game.AI.Decks
return null;
}
public override CardPosition OnSelectPosition(int cardId, IList<CardPosition> positions)
{
if (AI.Utils.IsTurn1OrMain2())
{
return CardPosition.FaceUpDefence;
}
return 0;
}
public override int OnSelectPlace(int cardId, int player, int location, int available)
{
if (player == 0)
......
......@@ -128,28 +128,29 @@ namespace WindBot.Game.AI.Decks
{
if(Duel.LastChainPlayer==1)
{
if(AI.Utils.GetLastChainCard().Id==CardId.MaxxC)
ClientCard lastCard = AI.Utils.GetLastChainCard();
if (lastCard.Id==CardId.MaxxC)
{
AI.SelectCard(CardId.MaxxC);
if(AI.Utils.ChainContainsCard(CardId.TheMelodyOfAwakeningDragon))
AI.SelectNextCard(new[] { CardId.BlueEyesChaosMaxDragon, CardId.BlueEyesChaosMaxDragon, CardId.BlueEyesAlternativeWhiteDragon });
return UniqueFaceupSpell();
}
if (AI.Utils.GetLastChainCard().Id == CardId.LockBird)
if (lastCard.Id == CardId.LockBird)
{
AI.SelectCard(CardId.LockBird);
if (AI.Utils.ChainContainsCard(CardId.TheMelodyOfAwakeningDragon))
AI.SelectNextCard(new[] { CardId.BlueEyesChaosMaxDragon, CardId.BlueEyesChaosMaxDragon, CardId.BlueEyesAlternativeWhiteDragon });
return UniqueFaceupSpell();
}
if (AI.Utils.GetLastChainCard().Id == CardId.Ghost)
if (lastCard.Id == CardId.Ghost)
{
AI.SelectCard(CardId.Ghost);
if (AI.Utils.ChainContainsCard(CardId.TheMelodyOfAwakeningDragon))
AI.SelectNextCard(new[] { CardId.BlueEyesChaosMaxDragon, CardId.BlueEyesChaosMaxDragon, CardId.BlueEyesAlternativeWhiteDragon });
return UniqueFaceupSpell();
}
if (AI.Utils.GetLastChainCard().Id == CardId.AshBlossom)
if (lastCard.Id == CardId.AshBlossom)
{
AI.SelectCard(CardId.AshBlossom);
if (AI.Utils.ChainContainsCard(CardId.TheMelodyOfAwakeningDragon))
......
......@@ -1098,6 +1098,7 @@ namespace WindBot.Game.AI.Decks
if (targets.Count == 0)
return false;
AI.SelectCard(0);
AI.SelectNextCard(targets);
return true;
}
......
......@@ -38,6 +38,7 @@ namespace WindBot.Game.AI
public const int Number39Utopia = 84013237;
public const int UltimayaTzolkin = 1686814;
public const int MoonMirrorShield = 19508728;
public const int VampireFräulein = 6039967;
public const int InjectionFairyLily = 79575620;
......@@ -55,6 +56,14 @@ namespace WindBot.Game.AI
public const int MacroCosmos = 30241314;
public const int UpstartGoblin = 70368879;
public const int EaterOfMillions = 63845230;
public const int InvokedPurgatrio = 12307878;
public const int ChaosAncientGearGiant = 51788412;
public const int UltimateAncientGearGolem = 12652643;
public const int ImperialOrder = 61740673;
public const int NaturiaBeast = 33198837;
public const int AntiSpellFragrance = 58921041;
}
protected DefaultExecutor(GameAI ai, Duel duel)
......@@ -116,6 +125,14 @@ namespace WindBot.Game.AI
return false;
}
foreach (ClientCard equip in defender.EquipCards)
{
if (equip.Id == _CardId.MoonMirrorShield && !equip.IsDisabled())
{
return false;
}
}
if (defender.Id == _CardId.CrystalWingSynchroDragon && defender.IsAttack() && !defender.IsDisabled() && attacker.Level >= 5)
return false;
......@@ -133,6 +150,14 @@ namespace WindBot.Game.AI
{
if (attacker.Id == _CardId.NumberS39UtopiaTheLightning && !attacker.IsDisabled() && attacker.HasXyzMaterial(2, _CardId.Number39Utopia))
attacker.RealPower = 5000;
foreach (ClientCard equip in attacker.EquipCards)
{
if (equip.Id == _CardId.MoonMirrorShield && !equip.IsDisabled())
{
attacker.RealPower = defender.RealPower + 100;
}
}
}
if (Enemy.HasInMonstersZone(_CardId.DupeFrog, true) && defender.Id != _CardId.DupeFrog)
......@@ -325,6 +350,31 @@ namespace WindBot.Game.AI
return true;
}
/// <summary>
/// Default Scapegoat effect
/// </summary>
protected bool DefaultScapegoat()
{
if (DefaultSpellWillBeNegated()) return false;
if (Duel.Player == 0) return false;
if (Duel.Phase == DuelPhase.End) return true;
if (DefaultOnBecomeTarget()) return true;
if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2)
{
if (Enemy.HasInMonstersZone(_CardId.UltimateConductorTytanno, true)) return false;
if (Enemy.HasInMonstersZone(_CardId.InvokedPurgatrio, true)) return false;
if (Enemy.HasInMonstersZone(_CardId.ChaosAncientGearGiant, true)) return false;
if (Enemy.HasInMonstersZone(_CardId.UltimateAncientGearGolem, true)) return false;
int total_atk = 0;
List<ClientCard> enemy_monster = Enemy.GetMonsters();
foreach (ClientCard m in enemy_monster)
{
if (m.IsAttack()) total_atk += m.Attack;
}
if (total_atk >= Bot.LifePoints) return true;
}
return false;
}
/// <summary>
/// Always active in opponent's turn.
/// </summary>
......@@ -624,6 +674,42 @@ namespace WindBot.Game.AI
return false;
}
/// <summary>
/// If spell will be negated
/// </summary>
protected bool DefaultSpellWillBeNegated()
{
ClientCard card = null;
foreach (ClientCard check in Bot.GetSpells())
{
if (check.Id == _CardId.ImperialOrder && !check.IsDisabled())
card = check;
}
if (card != null && card.IsFaceup())
return true;
if (Enemy.HasInSpellZone(_CardId.ImperialOrder, true) || Enemy.HasInMonstersZone(_CardId.NaturiaBeast, true))
return true;
return false;
}
/// <summary>
/// If spell must set first to activate
/// </summary>
protected bool DefaultSpellMustSetFirst()
{
ClientCard card = null;
foreach (ClientCard check in Bot.GetSpells())
{
if (check.Id == _CardId.AntiSpellFragrance && !check.IsDisabled())
card = check;
}
if (card != null && card.IsFaceup())
return true;
if (Enemy.HasInSpellZone(_CardId.AntiSpellFragrance, true))
return true;
return false;
}
/// <summary>
/// if spell/trap is the target or enermy activate HarpiesFeatherDuster
/// </summary>
......
......@@ -77,6 +77,7 @@
LairOfDarkness = 59160188,
SuperboltThunderDragon = 15291624,
ThunderDragonLord = 41685633,
CyberDragonInfinity = 10443957
CyberDragonInfinity = 10443957,
ImperialCustom = 9995766
}
}
......@@ -12,6 +12,7 @@ namespace WindBot.Game
public string Name { get; private set; }
public int Position { get; set; }
public int Sequence { get; set; }
public CardLocation Location { get; set; }
public int Alias { get; private set; }
public int Level { get; private set; }
......@@ -35,6 +36,10 @@ namespace WindBot.Game
public int SelectSeq { get; set; }
public int OpParam1 { get; set; }
public int OpParam2 { get; set; }
public List<ClientCard> EquipCards { get; set; }
public ClientCard EquipTarget;
public bool CanDirectAttack { get; set; }
public bool ShouldDirectAttack { get; set; }
public bool Attacked { get; set; }
......@@ -44,16 +49,18 @@ namespace WindBot.Game
public int[] ActionIndex { get; set; }
public IDictionary<int, int> ActionActivateIndex { get; private set; }
public ClientCard(int id, CardLocation loc)
: this(id, loc, 0)
public ClientCard(int id, CardLocation loc, int sequence)
: this(id, loc, -1 , 0)
{
}
public ClientCard(int id, CardLocation loc, int position)
public ClientCard(int id, CardLocation loc, int sequence, int position)
{
SetId(id);
Sequence = sequence;
Position = position;
Overlays = new List<int>();
EquipCards = new List<ClientCard>();
ActionIndex = new int[16];
ActionActivateIndex = new Dictionary<int, int>();
Location = loc;
......@@ -189,7 +196,7 @@ namespace WindBot.Game
public bool IsExtraCard()
{
return (HasType(CardType.Fusion) || HasType(CardType.Synchro) || HasType(CardType.Xyz));
return HasType(CardType.Fusion) || HasType(CardType.Synchro) || HasType(CardType.Xyz) || HasType(CardType.Link);
}
public bool IsFaceup()
......
......@@ -31,9 +31,9 @@ namespace WindBot.Game
ExtraDeck = new List<ClientCard>();
for (int i = 0; i < deck; ++i)
Deck.Add(new ClientCard(0, CardLocation.Deck));
Deck.Add(new ClientCard(0, CardLocation.Deck, -1));
for (int i = 0; i < extra; ++i)
ExtraDeck.Add(new ClientCard(0, CardLocation.Extra));
ExtraDeck.Add(new ClientCard(0, CardLocation.Extra, -1));
}
public int GetMonstersExtraZoneCount()
......
......@@ -38,12 +38,12 @@ namespace WindBot.Game
LastSummonedCards = new List<ClientCard>();
}
public ClientCard GetCard(int player, CardLocation loc, int index)
public ClientCard GetCard(int player, CardLocation loc, int seq)
{
return GetCard(player, (int)loc, index, 0);
return GetCard(player, (int)loc, seq, 0);
}
public ClientCard GetCard(int player, int loc, int index, int subindex)
public ClientCard GetCard(int player, int loc, int seq, int subSeq)
{
if (player < 0 || player > 1)
return null;
......@@ -79,51 +79,52 @@ namespace WindBot.Game
if (cards == null)
return null;
if (index >= cards.Count)
if (seq >= cards.Count)
return null;
if (isXyz)
{
ClientCard card = cards[index];
if (card == null || subindex >= card.Overlays.Count)
ClientCard card = cards[seq];
if (card == null || subSeq >= card.Overlays.Count)
return null;
return null; // TODO card.Overlays[subindex]
return null; // TODO card.Overlays[subSeq]
}
return cards[index];
return cards[seq];
}
public void AddCard(CardLocation loc, int cardId, int player, int zone, int pos)
public void AddCard(CardLocation loc, int cardId, int player, int seq, int pos)
{
switch (loc)
{
case CardLocation.Hand:
Fields[player].Hand.Add(new ClientCard(cardId, loc, pos));
Fields[player].Hand.Add(new ClientCard(cardId, loc, -1, pos));
break;
case CardLocation.Grave:
Fields[player].Graveyard.Add(new ClientCard(cardId, loc, pos));
Fields[player].Graveyard.Add(new ClientCard(cardId, loc,-1, pos));
break;
case CardLocation.Removed:
Fields[player].Banished.Add(new ClientCard(cardId, loc, pos));
Fields[player].Banished.Add(new ClientCard(cardId, loc, -1, pos));
break;
case CardLocation.MonsterZone:
Fields[player].MonsterZone[zone] = new ClientCard(cardId, loc, pos);
Fields[player].MonsterZone[seq] = new ClientCard(cardId, loc, seq, pos);
break;
case CardLocation.SpellZone:
Fields[player].SpellZone[zone] = new ClientCard(cardId, loc, pos);
Fields[player].SpellZone[seq] = new ClientCard(cardId, loc, seq, pos);
break;
case CardLocation.Deck:
Fields[player].Deck.Add(new ClientCard(cardId, loc, pos));
Fields[player].Deck.Add(new ClientCard(cardId, loc, -1, pos));
break;
case CardLocation.Extra:
Fields[player].ExtraDeck.Add(new ClientCard(cardId, loc, pos));
Fields[player].ExtraDeck.Add(new ClientCard(cardId, loc, -1, pos));
break;
}
}
public void AddCard(CardLocation loc, ClientCard card, int player, int zone, int pos, int id)
public void AddCard(CardLocation loc, ClientCard card, int player, int seq, int pos, int id)
{
card.Location = loc;
card.Sequence = seq;
card.Position = pos;
card.SetId(id);
switch (loc)
......@@ -138,10 +139,10 @@ namespace WindBot.Game
Fields[player].Banished.Add(card);
break;
case CardLocation.MonsterZone:
Fields[player].MonsterZone[zone] = card;
Fields[player].MonsterZone[seq] = card;
break;
case CardLocation.SpellZone:
Fields[player].SpellZone[zone] = card;
Fields[player].SpellZone[seq] = card;
break;
case CardLocation.Deck:
Fields[player].Deck.Add(card);
......@@ -152,7 +153,7 @@ namespace WindBot.Game
}
}
public void RemoveCard(CardLocation loc, ClientCard card, int player, int zone)
public void RemoveCard(CardLocation loc, ClientCard card, int player, int seq)
{
switch (loc)
{
......@@ -166,10 +167,10 @@ namespace WindBot.Game
Fields[player].Banished.Remove(card);
break;
case CardLocation.MonsterZone:
Fields[player].MonsterZone[zone] = null;
Fields[player].MonsterZone[seq] = null;
break;
case CardLocation.SpellZone:
Fields[player].SpellZone[zone] = null;
Fields[player].SpellZone[seq] = null;
break;
case CardLocation.Deck:
Fields[player].Deck.Remove(card);
......
......@@ -92,11 +92,12 @@ namespace WindBot.Game
public void OnNewPhase()
{
m_selector.Clear();
m_position.Clear();
m_selector_pointer = -1;
m_materialSelector = null;
m_option = -1;
m_yesno = -1;
m_position = CardPosition.FaceUpAttack;
m_place = 0;
if (Duel.Player == 0 && Duel.Phase == DuelPhase.Draw)
{
......@@ -508,8 +509,7 @@ namespace WindBot.Game
/// <returns>Selected position.</returns>
public CardPosition OnSelectPosition(int cardId, IList<CardPosition> positions)
{
CardPosition selector_selected = m_position;
m_position = CardPosition.FaceUpAttack;
CardPosition selector_selected = GetSelectedPosition();
CardPosition executor_selected = Executor.OnSelectPosition(cardId, positions);
......@@ -747,7 +747,6 @@ namespace WindBot.Game
private CardSelector m_materialSelector;
private CardPosition m_position = CardPosition.FaceUpAttack;
private int m_place;
private int m_option;
private int m_number;
......@@ -755,6 +754,7 @@ namespace WindBot.Game
private int m_yesno;
private IList<CardAttribute> m_attributes = new List<CardAttribute>();
private IList<CardSelector> m_selector = new List<CardSelector>();
private IList<CardPosition> m_position = new List<CardPosition>();
private int m_selector_pointer = -1;
private IList<CardRace> m_races = new List<CardRace>();
......@@ -929,9 +929,20 @@ namespace WindBot.Game
return selected;
}
public CardPosition GetSelectedPosition()
{
CardPosition selected = CardPosition.FaceUpAttack;
if (m_position.Count > 0)
{
selected = m_position[0];
m_position.RemoveAt(0);
}
return selected;
}
public void SelectPosition(CardPosition pos)
{
m_position = pos;
m_position.Add(pos);
}
public void SelectPlace(int zones)
......
......@@ -101,6 +101,7 @@ namespace WindBot.Game
_messages.Add(GameMessage.Recover, OnRecover);
_messages.Add(GameMessage.LpUpdate, OnLpUpdate);
_messages.Add(GameMessage.Move, OnMove);
_messages.Add(GameMessage.Swap, OnSwap);
_messages.Add(GameMessage.Attack, OnAttack);
_messages.Add(GameMessage.PosChange, OnPosChange);
_messages.Add(GameMessage.Chaining, OnChaining);
......@@ -130,7 +131,8 @@ namespace WindBot.Game
_messages.Add(GameMessage.AnnounceRace, OnAnnounceRace);
_messages.Add(GameMessage.AnnounceCardFilter, OnAnnounceCard);
_messages.Add(GameMessage.RockPaperScissors, OnRockPaperScissors);
_messages.Add(GameMessage.Equip, OnEquip);
_messages.Add(GameMessage.Unequip, OnUnEquip);
_messages.Add(GameMessage.Summoning, OnSummoning);
_messages.Add(GameMessage.Summoned, OnSummoned);
_messages.Add(GameMessage.SpSummoning, OnSpSummoning);
......@@ -365,7 +367,7 @@ namespace WindBot.Game
for (int i = 0; i < count; ++i)
{
_duel.Fields[player].Deck.RemoveAt(_duel.Fields[player].Deck.Count - 1);
_duel.Fields[player].Hand.Add(new ClientCard(0, CardLocation.Hand));
_duel.Fields[player].Hand.Add(new ClientCard(0, CardLocation.Hand, -1));
}
_ai.OnDraw(player);
}
......@@ -436,19 +438,19 @@ namespace WindBot.Game
_duel.Fields[player].Deck.Clear();
for (int i = 0; i < mcount; ++i)
{
_duel.Fields[player].Deck.Add(new ClientCard(0, CardLocation.Deck));
_duel.Fields[player].Deck.Add(new ClientCard(0, CardLocation.Deck, -1));
}
_duel.Fields[player].ExtraDeck.Clear();
for (int i = 0; i < ecount; ++i)
{
int code = packet.ReadInt32() & 0x7fffffff;
_duel.Fields[player].ExtraDeck.Add(new ClientCard(code, CardLocation.Extra));
_duel.Fields[player].ExtraDeck.Add(new ClientCard(code, CardLocation.Extra, -1));
}
_duel.Fields[player].Hand.Clear();
for (int i = 0; i < hcount; ++i)
{
int code = packet.ReadInt32();
_duel.Fields[player].Hand.Add(new ClientCard(code, CardLocation.Hand));
_duel.Fields[player].Hand.Add(new ClientCard(code, CardLocation.Hand,-1));
}
}
......@@ -575,6 +577,27 @@ namespace WindBot.Game
}
}
private void OnSwap(BinaryReader packet)
{
int cardId1 = packet.ReadInt32();
int controler1 = GetLocalPlayer(packet.ReadByte());
int location1 = packet.ReadByte();
int sequence1 = packet.ReadByte();
packet.ReadByte();
int cardId2 = packet.ReadInt32();
int controler2 = GetLocalPlayer(packet.ReadByte());
int location2 = packet.ReadByte();
int sequence2 = packet.ReadByte();
packet.ReadByte();
ClientCard card1 = _duel.GetCard(controler1, (CardLocation)location1, sequence1);
ClientCard card2 = _duel.GetCard(controler2, (CardLocation)location2, sequence2);
if (card1 == null || card2 == null) return;
_duel.RemoveCard((CardLocation)location1, card1, controler1, sequence1);
_duel.RemoveCard((CardLocation)location2, card2, controler2, sequence2);
_duel.AddCard((CardLocation)location2, card1, controler2, sequence2, card1.Position, cardId1);
_duel.AddCard((CardLocation)location1, card2, controler1, sequence1, card2.Position, cardId2);
}
private void OnAttack(BinaryReader packet)
{
int ca = GetLocalPlayer(packet.ReadByte());
......@@ -662,7 +685,7 @@ namespace WindBot.Game
int seq = packet.ReadByte();
ClientCard card;
if (((int)loc & (int)CardLocation.Overlay) != 0)
card = new ClientCard(id, CardLocation.Overlay);
card = new ClientCard(id, CardLocation.Overlay, -1);
else
card = _duel.GetCard(controler, loc, seq);
if (card == null) continue;
......@@ -850,7 +873,7 @@ namespace WindBot.Game
packet.ReadByte(); // pos
ClientCard card;
if (((int)loc & (int)CardLocation.Overlay) != 0)
card = new ClientCard(id, CardLocation.Overlay);
card = new ClientCard(id, CardLocation.Overlay, -1);
else
card = _duel.GetCard(player, loc, seq);
if (card == null) continue;
......@@ -909,7 +932,7 @@ namespace WindBot.Game
packet.ReadByte(); // pos
ClientCard card;
if (((int)loc & (int)CardLocation.Overlay) != 0)
card = new ClientCard(id, CardLocation.Overlay);
card = new ClientCard(id, CardLocation.Overlay, -1);
else
card = _duel.GetCard(player, loc, seq);
if (card == null) continue;
......@@ -1412,6 +1435,43 @@ namespace WindBot.Game
Connection.Send(CtosMessage.Response, result);
}
private void OnEquip(BinaryReader packet)
{
int equipCardControler = GetLocalPlayer(packet.ReadByte());
int equipCardLocation = packet.ReadByte();
int equipCardSequence = packet.ReadSByte();
packet.ReadByte();
int targetCardControler = GetLocalPlayer(packet.ReadByte());
int targetCardLocation = packet.ReadByte();
int targetCardSequence = packet.ReadSByte();
packet.ReadByte();
ClientCard equipCard = _duel.GetCard(equipCardControler, (CardLocation)equipCardLocation, equipCardSequence);
ClientCard targetCard = _duel.GetCard(targetCardControler, (CardLocation)targetCardLocation, targetCardSequence);
if (equipCard == null || targetCard == null) return;
if (equipCard.EquipTarget != null)
{
equipCard.EquipTarget.EquipCards.Remove(equipCard);
}
equipCard.EquipTarget = targetCard;
targetCard.EquipCards.Add(equipCard);
}
private void OnUnEquip(BinaryReader packet)
{
int equipCardControler = GetLocalPlayer(packet.ReadByte());
int equipCardLocation = packet.ReadByte();
int equipCardSequence = packet.ReadSByte();
packet.ReadByte();
ClientCard equipCard = _duel.GetCard(equipCardControler, (CardLocation)equipCardLocation, equipCardSequence);
if (equipCard == null) return;
if (equipCard.EquipTarget != null)
{
equipCard.EquipTarget.EquipCards.Remove(equipCard);
equipCard.EquipTarget = null;
}
}
private void OnSummoning(BinaryReader packet)
{
_duel.LastSummonedCards.Clear();
......
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