private void PlayCard(PlayerCard playerCard, Player sender, Player opponent, GwintSlot slot, long?targetCardId) { Card card = playerCard.Card; if (card.Types.HasFlag(GwintType.Creature)) { PlayCreatureCard(playerCard, sender, opponent, slot, targetCardId); } else if (card.Types.HasFlag(GwintType.Weather)) { PlayWeatherCard(playerCard, sender, opponent, slot); } else if (card.Types.HasFlag(GwintType.Spell)) { PlaySpellCard(playerCard, sender, opponent, slot, targetCardId); } else if (card.Types.HasFlag(GwintType.RowModifier)) { PlayRowModifierCard(playerCard, sender, opponent, slot); } else if (card.Types.HasFlag(GwintType.GlobalEffect)) { PlayGlobalEffectCard(playerCard, sender, opponent); } else { throw new CommandException(); } sender.HandCards.Remove(playerCard); }
private void ClearSlot(Player player, GwintSlot slot) { var cardSlots = player.CardSlots.Where(s => s.Slot == slot).ToList(); foreach (var cardSlot in cardSlots) { player.CardSlots.Remove(cardSlot); player.GraveyardCards.Add(cardSlot.ToPlayerCard()); } }
private static void ClearSlotEffect(Player player, GwintSlot slot, GwintEffect effect) { var existingWeatherCard = player.CardSlots .FirstOrDefault(s => s.Slot == slot && s.Card.Effect == effect); if (existingWeatherCard != null) { player.CardSlots.Remove(existingWeatherCard); player.GraveyardCards.Add(existingWeatherCard.ToPlayerCard()); } }
private void SummonCloneCardsInSet(List <long> summonCardIds, Player sender, Player opponent, ICollection <PlayerCard> cards) { var summonHandCards = cards.Where(h => summonCardIds.Contains(h.Card.Id)).ToList(); foreach (var summonHandCard in summonHandCards) { cards.Remove(summonHandCard); GwintSlot slot = GetDefaultCreatureSlot(summonHandCard.Card); SpawnCreature(summonHandCard, sender, opponent, slot); } }
private void PlayUnsummonDummy(Player player, PlayerCard playerCard, GwintSlot slot, long?targetCardId) { Card card = playerCard.Card; if (!targetCardId.HasValue) { throw new CommandException(); } PlayerCardSlot cardSlot = GetUnsummonTargetSlot(player, slot, targetCardId.Value); player.HandCards.Add(cardSlot.ToPlayerCard()); cardSlot.Card = card; }
private static PlayerCardSlot GetUnsummonTargetSlot(Player player, GwintSlot slot, long targetCardId) { switch (slot) { case GwintSlot.Melee: case GwintSlot.Ranged: case GwintSlot.Siege: var cardSlot = player.CardSlots.FirstOrDefault(s => s.Slot == slot && s.Card.Id == targetCardId); if (cardSlot == null) { throw new CommandException(); } return(cardSlot); default: throw new CommandException(); } }
private void NurseCard(Player sender, Player opponent, long?targetCardId) { if (!targetCardId.HasValue) { throw new CommandException(); } var nursedCard = sender.GraveyardCards.FirstOrDefault(c => c.Card.Id == targetCardId.Value && c.Card.Types.HasFlag(GwintType.Creature)); if (nursedCard == null) { throw new CommandException(); } GwintSlot slot = GetDefaultCreatureSlot(nursedCard.Card); // TODO: Check if nursed nurses can nurse. If they can then use a list of target card ids instead of a single targetCardId. PlayCreatureCard(nursedCard, sender, opponent, slot, null); }
private void ScorchRowCards(Player player, GwintSlot slot, int scorchThreshold) { var rowPower = player.CardSlots .Where(s => s.Slot == slot) .Sum(s => s.EffectivePower); if (rowPower >= scorchThreshold) { var scorchTargets = player.CardSlots .Where(s => s.Slot == slot && !s.Card.Types.HasFlag(GwintType.Hero)) .GroupBy(s => s.EffectivePower) .OrderByDescending(g => g.Key) .FirstOrDefault(); if (scorchTargets != null) { foreach (var scorchTarget in scorchTargets) { player.CardSlots.Remove(scorchTarget); player.GraveyardCards.Add(scorchTarget.ToPlayerCard()); } } } }
private bool ValidateSlot(PlayerCard playerCard, GwintSlot slot) { Card card = playerCard.Card; var types = card.Types; if (types.HasFlag(GwintType.GlobalEffect)) { return(true); } switch (slot) { case GwintSlot.None: return(false); case GwintSlot.Melee: return(types.HasFlag(GwintType.Creature | GwintType.Melee) || types.HasFlag(GwintType.Spell)); case GwintSlot.Ranged: return(types.HasFlag(GwintType.Creature | GwintType.Ranged) || types.HasFlag(GwintType.Spell)); case GwintSlot.Siege: return(types.HasFlag(GwintType.Creature | GwintType.Siege) || types.HasFlag(GwintType.Spell)); case GwintSlot.MeleeModifier: case GwintSlot.RangedModifier: case GwintSlot.SiegeModifier: return(types.HasFlag(GwintType.RowModifier)); case GwintSlot.Weather: return(types.HasFlag(GwintType.Weather)); default: throw new CommandException(); } }
private bool ValidateRowModifierCard(Card card, GwintSlot slot) { return(card.Types.HasFlag(GwintType.Melee) && slot == GwintSlot.MeleeModifier || card.Types.HasFlag(GwintType.Ranged) && slot == GwintSlot.RangedModifier || card.Types.HasFlag(GwintType.Siege) && slot == GwintSlot.SiegeModifier); }
private void PlayRowModifierCard(PlayerCard playerCard, Player sender, Player opponent, GwintSlot slot) { Card card = playerCard.Card; switch (card.Effect) { case GwintEffect.Horn: if (!ValidateRowModifierCard(card, slot)) { throw new CommandException(); } ClearSlotEffect(sender, slot, card.Effect); var rowModifierSlot = new PlayerCardSlot { Card = card, Slot = slot }; sender.CardSlots.Add(rowModifierSlot); break; default: throw new CommandException(); } }
private void PlaySpellCard(PlayerCard playerCard, Player sender, Player opponent, GwintSlot slot, long?targetCardId) { Card card = playerCard.Card; switch (card.Effect) { case GwintEffect.UnsummonDummy: PlayUnsummonDummy(sender, playerCard, slot, targetCardId); break; default: throw new CommandException(); } }
private void PlayWeatherCard(PlayerCard playerCard, Player sender, Player opponent, GwintSlot slot) { Card card = playerCard.Card; if (slot != GwintSlot.Weather) { throw new CommandException(); } if (card.Effect.HasFlag(GwintEffect.ClearSky)) { ClearSlot(sender, GwintSlot.Weather); ClearSlot(opponent, GwintSlot.Weather); sender.GraveyardCards.Add(playerCard); } else { SpawnWeatherCard(playerCard, sender, opponent); } }
private void SpawnCreature(PlayerCard playerCard, Player sender, Player opponent, GwintSlot slot) { Card card = playerCard.Card; Player creaturePlayer = card.Types.HasFlag(GwintType.Spy) ? opponent : sender; switch (slot) { case GwintSlot.Melee: case GwintSlot.Ranged: case GwintSlot.Siege: var playerCardSlot = new PlayerCardSlot { Card = card, Slot = slot }; creaturePlayer.CardSlots.Add(playerCardSlot); break; default: throw new CommandException(); } }
private void PlayCreatureCard(PlayerCard playerCard, Player sender, Player opponent, GwintSlot slot, long?targetCardId) { Card card = playerCard.Card; SpawnCreature(playerCard, sender, opponent, slot); switch (card.Effect) { case GwintEffect.MeleeScorch: ScorchRowCards(opponent, GwintSlot.Melee, Constants.ScorchThresholdMelee); break; case GwintEffect.SiegScorch: ScorchRowCards(opponent, GwintSlot.Siege, Constants.ScorchThresholdSiege); break; case GwintEffect.Nurse: NurseCard(sender, opponent, targetCardId); break; case GwintEffect.Draw2: DrawCards(sender, 2); break; case GwintEffect.SummonClones: SummonCardClones(playerCard, sender, opponent); break; } }