public void CanClone()
        {
            // Arrange
            var expectedAvailableMana = new AvailableMana("{AC}{AT}{C}{W}{U}{B}{R}{G}");

            // Act
            var actualAvailableMana = expectedAvailableMana.Clone();

            // Assert
            Assert.AreEqual(expectedAvailableMana.ToString(), actualAvailableMana.ToString());
        }
        private Spell FindSpellToCastGivenAvailableMana(AvailableMana availableMana)
        {
            Spell candidateSpell = FindNonVariantManaSpell(availableMana);

            // if we didn't find any castable spell try to find X mana spell
            if (candidateSpell == null)
            {
                candidateSpell = FindVariantManaSpell(availableMana);
            }

            return(candidateSpell);
        }
 private Spell FindVariantManaSpell(AvailableMana availableMana)
 {
     // select the lowest CMC X mana spell (considering minimum value for variant mana spell - i.e. do not take Hydroid Krasis to cast it for x=1)
     return(_playerGameState.HandZone.Cards
            .Where(card => card is Spell)
            .Select(card => card as Spell)
            .Where(spell => spell.IsCastable(availableMana))
            .Where(spell => spell.Cost.UsesVariantAmount)                                                         // only X mana spells
            .Where(spell => spell.Cost.MinimumValueForVariantMana + spell.Cmc <= availableMana.TotalAmountOfMana) // take only spells that are worth casting (ex. Hydroid Krasis for x=1 is not worth casting)
            .OrderBy(spell => spell.Cmc)                                                                          // take the spell with lowest CMC (i.e. preferr to cast Hydroid Krasis before Mass Manipulation)
            .FirstOrDefault());
 }
Esempio n. 4
0
        public void CreatureIsNotCastable(string spellCardName, int totalAmountOfMana, params ManaSymbol[] manaSymbols)
        {
            // arrange
            var cardFactory     = new CardFactory();
            var playerGameState = new PlayerGameState(cardFactory);
            var card            = cardFactory.InstantiateSpell(spellCardName, playerGameState);
            var availableMana   = new AvailableMana();

            availableMana.TotalAmountOfMana = totalAmountOfMana;
            availableMana.EveryManaSymbolCombination.Add(manaSymbols);

            // act & assert
            card.IsCastable(availableMana).Should().BeFalse();
        }
Esempio n. 5
0
        //public override void PlayCard()
        //{
        //    CardZone = CardZone.Stack;
        //}

        public bool IsCastable(AvailableMana availableMana)
        {
            if (Cmc <= availableMana.AvailableTotalAmountOfMana)
            {
                // check if mana symbols required to cast this spell plus mana symbols already spent are in eligible mana symbols combination (i.e. you can cast this spell after previously cast spells)
                var spentManaPlusCostOfThisSpell = Cost.ColorManaSymbols.Concat(availableMana.SpentManaSymbols);

                if (availableMana.AvailableManaSymbolsCombinations.Any(manaCombination => manaCombination.ContainsAll(spentManaPlusCostOfThisSpell)))
                {
                    return(true);
                }
            }

            return(false);
        }
        private Spell FindNonVariantManaSpell(AvailableMana availableMana)
        {
            // select the higest CMC playable spell (omit all X mana spells)
            var spells = _playerGameState.HandZone.Cards
                         .Where(card => card is Spell)
                         .Select(card => card as Spell)
                         .Where(spell => spell.IsCastable(availableMana))
                         .Where(spell => !spell.Cost.UsesVariantAmount) // omit X mana spells
                         .OrderByDescending(spell => spell.Cmc);        // take highest CMC spell


            var spell2 = spells.FirstOrDefault();

            return(spell2);
        }
Esempio n. 7
0
        public void Cast(AvailableMana availableMana)
        {
            if (!IsCastable(availableMana))
            {
                throw new InvalidOperationException("Attept to cast non castable spell");
            }

            if (Cost.UsesVariantAmount)
            {
            }
            else
            {
                // substract CMC from total amount of mana to indicate how much available mana left
                availableMana.TotalManaSpent += Cmc;

                foreach (var colormanaSymbol in Cost.ColorManaSymbols)
                {
                    availableMana.SpentManaSymbols.Add(colormanaSymbol);
                }

                //// from each mana symbols combination substract clored symbols from spell cost
                //// i.e. if we have Overgrown Tomb + Watery Grave + Breeding Pool
                //// we are able to generate following mana symbol combinations:
                //// B + U + U
                //// B + U + G //
                //// B + B + U
                //// B + B + G
                //// G + U + U //
                //// G + U + G //
                //// G + B + U //
                //// G + B + G
                //// if we cast UG spell, then following combinations
                //foreach (var availableManaSymbolsCombination in availableMana.AvailableManaSymbols)
                //{
                //    foreach (var colorManaSymbolFromCost in Cost.ColorManaSymbols)
                //    {
                //        if (availableManaSymbolsCombination.Contains(colorManaSymbolFromCost))
                //        {
                //            availableManaSymbolsCombination.Remove(colorManaSymbolFromCost);
                //        }
                //    }

                //}
            }

            OnCast();
        }
Esempio n. 8
0
        public AvailableMana GetAvailableMana()
        {
            var availableMana = new AvailableMana();

            foreach (var availableManaAbility in GetAvailableAbilities <ManaActivatedAbility>())
            {
                availableMana.Add(availableManaAbility?.GetEffect <AddToManaPoolEffect>()?.AvailableMana);
            }

            //foreach (var cardInHand in Hand.Cards)
            //{
            //    availableMana.Add(cardInHand?.GetAvailableAbility<ManaActivatedAbility>());
            //}
            //foreach (var cardOnTheBattlefield in Battlefield.Cards)
            //{
            //    availableMana.Add(cardOnTheBattlefield?.GetAvailableAbility<ManaActivatedAbility>()?.GetEffect<AddToManaPoolEffect>()?.AvailableMana);
            //}

            return(availableMana);
        }
 public AddToManaPoolEffect(string rawMana)
 {
     AvailableMana = new AvailableMana(rawMana);
 }
        public void CanGetAvailableMana()
        {
            // Arrange
            var deck = DeckBuilder.Build("CanGetAvailableMana")
                       .With(CardJson.BaneOfBalaGed)
                       .With(CardJson.ThoughtKnotSeer)
                       .With(CardJson.ElvishSpiritGuide)
                       .With(CardJson.MagusOfTheLibrary)
                       .With(CardJson.Forest)
                       .With(CardJson.SpawningBed)
                       .With(CardJson.GhostQuarter);
            var player = new Player(deck, new NoPlayerAI());

            player.ShuffleLibrary();
            player.Draw(7);
            var expectedAvailableMana = new AvailableMana();

            // Act
            var actualAvailableMana = player.GetAvailableMana();

            // Assert
            Assert.AreEqual("AT:0-AC:0-C:0-W:0-U:0-B:0-R:0-G:1", actualAvailableMana.ToString());

            // Arrange
            var forest = player.Hand.Get("Forest");

            player.Play(forest);

            // Act
            actualAvailableMana = player.GetAvailableMana();

            // Assert
            Assert.AreEqual("AT:0-AC:0-C:0-W:0-U:0-B:0-R:0-G:2", actualAvailableMana.ToString());

            // Arrange
            var magus = player.Hand.Cards.First(c => c.Name == "Magus of the Library");

            player.Play(magus); // Use Forest & Elvish Spirit Guide

            // Act
            actualAvailableMana = player.GetAvailableMana();

            // Assert
            Assert.AreEqual("AT:0-AC:0-C:0-W:0-U:0-B:0-R:0-G:0", actualAvailableMana.ToString());

            // Arrange
            player.PassTheTurn();
            player.StartTheTurn();

            // Act
            actualAvailableMana = player.GetAvailableMana();

            // Assert
            Assert.AreEqual("AT:0-AC:0-C:1-W:0-U:0-B:0-R:0-G:1", actualAvailableMana.ToString());

            // Arrange
            var ghostQuarter = player.Hand.Cards.First(c => c.Name == "Ghost Quarter");

            player.Play(ghostQuarter);

            // Act
            actualAvailableMana = player.GetAvailableMana();

            // Assert
            Assert.AreEqual("AT:0-AC:0-C:2-W:0-U:0-B:0-R:0-G:1", actualAvailableMana.ToString());
        }