예제 #1
0
 public bool HasMana(
     int amount,
     ManaUsage usage = ManaUsage.Any,
     ConvokeAndDelveOptions convokeAndDelveOptions = null)
 {
     return(HasMana(amount.Colorless(), usage, convokeAndDelveOptions));
 }
예제 #2
0
        public AddManaToPool(DynParam <IManaAmount> amount, ManaUsage usage = ManaUsage.Any)
        {
            _amount = amount;
            _usage  = usage;

            RegisterDynamicParameters(amount);
        }
예제 #3
0
 public ManaUnit(ManaColor color, int rank, IManaSource source = null, ManaUsage usageRestriction = ManaUsage.Any)
 {
     Color             = color;
     Rank              = rank;
     Source            = source;
     _usageRestriction = usageRestriction;
 }
예제 #4
0
        public void Consume(IManaAmount amount, ManaUsage usage)
        {
            var allocated = TryToAllocateAmount(amount, usage);

            Asrt.True(allocated != null, "Not enough mana available.");

            var sources = GetSourcesToActivate(allocated);

            foreach (var source in sources)
            {
                lock (_manaPoolCountLock)
                {
                    foreach (var unit in source.GetUnits())
                    {
                        _manaPool.Add(unit);
                    }
                }

                source.PayActivationCost();
            }

            lock (_manaPoolCountLock)
            {
                foreach (var unit in allocated)
                {
                    _manaPool.Remove(unit);
                }
            }

            foreach (var unit in allocated.Where(x => !x.HasSource))
            {
                RemovePermanently(unit);
            }
        }
예제 #5
0
        private HashSet <ManaUnit> TryToAllocateAmount(IManaAmount amount, ManaUsage usage)
        {
            var restricted = new HashSet <ManaUnit>();
            var allocated  = new HashSet <ManaUnit>();

            foreach (var manaOfSingleColor in amount)
            {
                var color = manaOfSingleColor.Color.IsColorless
          ? 5
          : manaOfSingleColor.Color.Indices[0];

                var ordered = _groups[color]
                              .OrderBy(GetManaUnitAllocationOrder)
                              .ToList();

                for (var i = 0; i < manaOfSingleColor.Count; i++)
                {
                    var allocatedUnit = ordered
                                        .FirstOrDefault(unit => IsAvailable(unit, restricted, usage));

                    if (allocatedUnit == null)
                    {
                        return(null);
                    }

                    restricted.Add(allocatedUnit);
                    allocated.Add(allocatedUnit);

                    RestrictUsingDifferentSourcesFromSameCard(allocatedUnit, restricted);
                }
            }

            return(allocated);
        }
예제 #6
0
 public ManaUnit(ManaColor color, int rank, IManaSource source = null, ManaUsage usageRestriction = ManaUsage.Any)
 {
     Color = color;
       Rank = rank;
       Source = source;
       _usageRestriction = usageRestriction;
 }
예제 #7
0
        public AddManaToPool(IManaAmount amount, ManaUsage usage = ManaUsage.Any)
        {
            _usage  = usage;
            _amount = new DynParam <IManaAmount>(amount);


            RegisterDynamicParameters(_amount);
        }
예제 #8
0
        public IManaAmount GetActualCost(IManaAmount amount, ManaUsage usage, Card card)
        {
            var actualCost = amount;

            foreach (var costModifier in _costModifiers)
            {
                actualCost = costModifier.GetActualCost(actualCost, usage, card);
            }

            return actualCost;
        }
예제 #9
0
        public IManaAmount GetActualCost(IManaAmount amount, ManaUsage usage, Card card)
        {
            var actualCost = amount;

            foreach (var costModifier in _costModifiers)
            {
                actualCost = costModifier.GetActualCost(actualCost, usage, card);
            }

            return(actualCost);
        }
예제 #10
0
   public PayMana(
 IManaAmount amount,
 ManaUsage manaUsage,
 bool hasX = false,
 bool supportsRepetitions = false)
   {
       _amount = amount;
         _manaUsage = manaUsage;
         _hasX = hasX;
         _supportsRepetitions = supportsRepetitions;
   }
예제 #11
0
파일: PayMana.cs 프로젝트: longde123/grove
 public PayMana(
     IManaAmount amount,
     ManaUsage manaUsage,
     bool hasX = false,
     bool supportsRepetitions = false)
 {
     _amount              = amount;
     _manaUsage           = manaUsage;
     _hasX                = hasX;
     _supportsRepetitions = supportsRepetitions;
 }
예제 #12
0
        public override IManaAmount GetActualCost(IManaAmount amount, ManaUsage manaUsage, Card card)
        {
            if (manaUsage != ManaUsage.Spells)
            return amount;

              if (_filter(card, this))
              {
            return _less ? amount.Remove(_amount) : amount.Add(_amount);
              }

              return amount;
        }
예제 #13
0
        public bool Has(
            ManaAmount amount,
            ManaUsage usage,
            ConvokeAndDelveOptions convokeAndDelveOptions)
        {
            var allocated = TryToAllocateAmount(
                amount,
                usage,
                convokeAndDelveOptions);

            return(allocated != null && allocated.Lifeloss < _controller.Life);
        }
예제 #14
0
        public override IManaAmount GetActualCost(IManaAmount amount, ManaUsage manaUsage, Card card)
        {
            if (manaUsage != ManaUsage.Spells)
            {
                return(amount);
            }

            if (_filter(card, this))
            {
                return(_less ? amount.Remove(_amount) : amount.Add(_amount));
            }

            return(amount);
        }
예제 #15
0
        public void AddManaToPool(IManaAmount amount, ManaUsage usage)
        {
            lock (_manaPoolCountLock)
            {
                foreach (var mana in amount)
                {
                    for (var i = 0; i < mana.Count; i++)
                    {
                        var unit = new ManaUnit(mana.Color, 0, usageRestriction: usage);
                        Add(unit);

                        _manaPool.Add(unit);
                    }
                }
            }
        }
예제 #16
0
        public void AddManaToPool(ManaAmount amount, ManaUsage usage)
        {
            lock (_manaPoolCountLock)
            {
                foreach (var mana in amount)
                {
                    for (var i = 0; i < mana.Count; i++)
                    {
                        var unit = new ManaUnit(mana.Color, 0, usageRestriction: usage);
                        Add(unit);

                        _manaPool.Add(unit);
                    }
                }
            }
        }
예제 #17
0
        public int GetAvailableConvertedMana(ManaUsage usage)
        {
            var restricted = new HashSet <ManaUnit>();
            var allocated  = new List <ManaUnit>();

            foreach (var manaUnit in _units)
            {
                if (IsAvailable(manaUnit, restricted, usage))
                {
                    restricted.Add(manaUnit);
                    allocated.Add(manaUnit);

                    RestrictUsingDifferentSourcesFromSameCard(manaUnit, restricted);
                }
            }

            return(allocated.Count);
        }
예제 #18
0
        private bool IsAvailable(ManaUnit unit, HashSet <ManaUnit> restricted, ManaUsage usage)
        {
            if (restricted.Contains(unit))
            {
                return(false);
            }

            if (unit.CanActivateSource() == false && _manaPool.Contains(unit) == false)
            {
                return(false);
            }

            if (unit.CanBeUsed(usage) == false)
            {
                return(false);
            }

            return(true);
        }
예제 #19
0
        public void Consume(
            ManaAmount amount,
            ManaUsage usage,
            ConvokeAndDelveOptions convokeAndDelveOptions)
        {
            var allocated = TryToAllocateAmount(amount, usage, convokeAndDelveOptions);

            Asrt.True(allocated != null, "Not enough mana available.");

            var sources = GetSourcesToActivate(allocated.Units);

            foreach (var source in sources)
            {
                lock (_manaPoolCountLock)
                {
                    foreach (var unit in source.GetUnits())
                    {
                        _manaPool.Add(unit);
                    }
                }

                source.PayActivationCost();
            }

            lock (_manaPoolCountLock)
            {
                foreach (var unit in allocated.Units)
                {
                    _manaPool.Remove(unit);
                }
            }

            foreach (var unit in allocated.Units.Where(x => !x.HasSource))
            {
                RemovePermanently(unit);
            }

            _controller.Life -= allocated.Lifeloss;
        }
예제 #20
0
        public List <ManaColor> GetAvailableMana(ManaUsage usage, ConvokeAndDelveOptions convokeAndDelve)
        {
            var restricted = new HashSet <ManaUnit>();
            var allocated  = new List <ManaUnit>();

            var units = _units
                        .Concat(GetAdditionalManaSources(convokeAndDelve))
                        .ToList();

            foreach (var manaUnit in units)
            {
                if (IsAvailable(manaUnit, restricted, usage))
                {
                    restricted.Add(manaUnit);
                    allocated.Add(manaUnit);

                    RestrictUsingDifferentSourcesFromSameCard(manaUnit, restricted, units);
                }
            }

            return(allocated.Select(x => x.Color).ToList());
        }
예제 #21
0
파일: Player.cs 프로젝트: longde123/grove
 public int GetAvailableConvertedMana(ManaUsage usage = ManaUsage.Any)
 {
     return(ManaCache.GetAvailableConvertedMana(usage));
 }
예제 #22
0
 public int GetAvailableConvertedMana(ManaUsage usage = ManaUsage.Any)
 {
     return ManaCache.GetAvailableConvertedMana(usage);
 }
예제 #23
0
 public void AddManaToManaPool(IManaAmount manaAmount, ManaUsage usageRestriction = ManaUsage.Any)
 {
     ManaCache.AddManaToPool(manaAmount, usageRestriction);
 }
예제 #24
0
        private bool IsAvailable(ManaUnit unit, HashSet<ManaUnit> restricted, ManaUsage usage)
        {
            if (restricted.Contains(unit))
                return false;

            if (unit.CanActivateSource() == false && _manaPool.Contains(unit) == false)
                return false;

            if (unit.CanBeUsed(usage) == false)
                return false;

            return true;
        }
예제 #25
0
        public int GetAvailableConvertedMana(ManaUsage usage)
        {
            var restricted = new HashSet<ManaUnit>();
            var allocated = new List<ManaUnit>();

            foreach (var manaUnit in _units)
            {
                if (IsAvailable(manaUnit, restricted, usage))
                {
                    restricted.Add(manaUnit);
                    allocated.Add(manaUnit);

                    RestrictUsingDifferentSourcesFromSameCard(manaUnit, restricted);
                }
            }

            return allocated.Count;
        }
예제 #26
0
 public abstract IManaAmount GetActualCost(IManaAmount amount, ManaUsage manaUsage, Card card);
예제 #27
0
파일: Player.cs 프로젝트: longde123/grove
 public bool HasMana(int amount, ManaUsage usage = ManaUsage.Any)
 {
     return(ManaCache.Has(amount.Colorless(), usage));
 }
예제 #28
0
 public List <ManaColor> GetAvailableMana(
     ConvokeAndDelveOptions convokeAndDelveOptions = null,
     ManaUsage usage = ManaUsage.Any)
 {
     return(ManaCache.GetAvailableMana(usage, convokeAndDelveOptions));
 }
예제 #29
0
 public abstract IManaAmount GetActualCost(IManaAmount amount, ManaUsage manaUsage, Card card);
예제 #30
0
파일: Game.cs 프로젝트: longde123/grove
 public IManaAmount GetActualCost(IManaAmount amount, ManaUsage usage, Card card)
 {
     return(_costModifiers.GetActualCost(amount, usage, card));
 }
예제 #31
0
 public bool CanBeUsed(ManaUsage usage)
 {
     return _usageRestriction == ManaUsage.Any ||
     _usageRestriction == usage;
 }
예제 #32
0
 public bool CanBeUsed(ManaUsage usage)
 {
     return(_usageRestriction == ManaUsage.Any ||
            _usageRestriction == usage);
 }
예제 #33
0
 public bool HasMana(ManaAmount amount, ManaUsage usage            = ManaUsage.Any,
                     ConvokeAndDelveOptions convokeAndDelveOptions = null)
 {
     return(ManaCache.Has(amount, usage, convokeAndDelveOptions));
 }
예제 #34
0
파일: Player.cs 프로젝트: longde123/grove
 public void AddManaToManaPool(IManaAmount manaAmount, ManaUsage usageRestriction = ManaUsage.Any)
 {
     ManaCache.AddManaToPool(manaAmount, usageRestriction);
 }
예제 #35
0
파일: Player.cs 프로젝트: longde123/grove
 public void Consume(IManaAmount amount, ManaUsage usage)
 {
     ManaCache.Consume(amount, usage);
 }
예제 #36
0
 public int GetAvailableManaCount(
     ConvokeAndDelveOptions convokeAndDelveOptions = null,
     ManaUsage usage = ManaUsage.Any)
 {
     return(GetAvailableMana(convokeAndDelveOptions, usage).Count);
 }
예제 #37
0
파일: Player.cs 프로젝트: longde123/grove
 public bool HasMana(IManaAmount amount, ManaUsage usage = ManaUsage.Any)
 {
     return(ManaCache.Has(amount, usage));
 }
예제 #38
0
 public bool HasMana(IManaAmount amount, ManaUsage usage = ManaUsage.Any)
 {
     return ManaCache.Has(amount, usage);
 }
예제 #39
0
        public void Consume(IManaAmount amount, ManaUsage usage)
        {
            var allocated = TryToAllocateAmount(amount, usage);
            //Asrt.True(allocated != null, "Not enough mana available.");

            var sources = GetSourcesToActivate(allocated);

            foreach (var source in sources)
            {
                lock (_manaPoolCountLock)
                {
                    foreach (var unit in source.GetUnits())
                    {
                        _manaPool.Add(unit);
                    }
                }

                source.PayActivationCost();
            }

            lock (_manaPoolCountLock)
            {
                foreach (var unit in allocated)
                {
                    _manaPool.Remove(unit);
                }
            }

            foreach (var unit in allocated.Where(x => !x.HasSource))
            {
                RemovePermanently(unit);
            }
        }
예제 #40
0
 public void Consume(IManaAmount amount, ManaUsage usage)
 {
     ManaCache.Consume(amount, usage);
 }
예제 #41
0
 public bool Has(IManaAmount amount, ManaUsage usage)
 {
     return TryToAllocateAmount(amount, usage) != null;
 }
예제 #42
0
        private AllocatedAmount TryToAllocateAmount(
            ManaAmount amount,
            ManaUsage usage,
            ConvokeAndDelveOptions convokeAndDelveOptions)
        {
            var restricted = new HashSet <ManaUnit>();
            var allocated  = new AllocatedAmount();

            var additional        = GetAdditionalManaSources(convokeAndDelveOptions);
            var additionalGrouped = GroupAdditionalSources(additional);
            var units             = _units.Concat(additional).ToList();

            var checkAmount = amount
                              .Select(x => new
            {
                Color       = GetColorIndex(x),
                Count       = x.Count,
                IsPhyrexian = x.Color.IsPhyrexian
            })
                              // first check for mana which has only few mana sources
                              .OrderBy(x => _groups[x.Color].Count)
                              .ToArray();

            var allocatedPhyrexian = new List <ManaUnit>();

            foreach (var manaOfSingleColor in checkAmount)
            {
                var ordered = _groups[manaOfSingleColor.Color]
                              .Concat(additionalGrouped[manaOfSingleColor.Color])
                              .OrderBy(GetManaUnitAllocationOrder)
                              .ToList();

                for (var i = 0; i < manaOfSingleColor.Count; i++)
                {
                    var allocatedUnit = ordered.FirstOrDefault(unit => IsAvailable(unit, restricted, usage));

                    // allocation failed
                    if (allocatedUnit == null)
                    {
                        if (manaOfSingleColor.IsPhyrexian)
                        {
                            allocated.Lifeloss += 2;
                            continue;
                        }

                        // if pyrexian is holding the slot, release it and pay life
                        if (allocatedPhyrexian.Count > 0)
                        {
                            var restrictedWithoutPhyrexian = restricted.Where(x => !allocatedPhyrexian.Contains(x)).ToHashSet();
                            allocatedUnit = ordered.FirstOrDefault(unit => IsAvailable(unit, restrictedWithoutPhyrexian, usage));

                            if (allocatedUnit != null)
                            {
                                allocated.Lifeloss += 2;
                                allocatedPhyrexian.Remove(allocatedUnit);
                                continue;
                            }
                        }

                        return(null);
                    }

                    if (manaOfSingleColor.IsPhyrexian)
                    {
                        allocatedPhyrexian.Add(allocatedUnit);
                    }

                    restricted.Add(allocatedUnit);
                    allocated.Units.Add(allocatedUnit);

                    RestrictUsingDifferentSourcesFromSameCard(allocatedUnit, restricted, units);
                }
            }

            return(allocated);
        }
예제 #43
0
        private HashSet<ManaUnit> TryToAllocateAmount(IManaAmount amount, ManaUsage usage)
        {
            var restricted = new HashSet<ManaUnit>();
            var allocated = new HashSet<ManaUnit>();

            foreach (var manaOfSingleColor in amount)
            {
                var color = manaOfSingleColor.Color.IsColorless
                  ? 5
                  : manaOfSingleColor.Color.Indices[0];

                var ordered = _groups[color]
                  .OrderBy(GetManaUnitAllocationOrder)
                  .ToList();

                for (var i = 0; i < manaOfSingleColor.Count; i++)
                {
                    var allocatedUnit = ordered
                      .FirstOrDefault(unit => IsAvailable(unit, restricted, usage));

                    if (allocatedUnit == null)
                        return null;

                    restricted.Add(allocatedUnit);
                    allocated.Add(allocatedUnit);

                    RestrictUsingDifferentSourcesFromSameCard(allocatedUnit, restricted);
                }
            }

            return allocated;
        }
예제 #44
0
 public void Consume(ManaAmount amount, ManaUsage usage, ConvokeAndDelveOptions convokeAndDelveOptions = null)
 {
     ManaCache.Consume(amount, usage, convokeAndDelveOptions);
 }
예제 #45
0
 public bool Has(IManaAmount amount, ManaUsage usage)
 {
     return(TryToAllocateAmount(amount, usage) != null);
 }
예제 #46
0
 public bool HasMana(int amount, ManaUsage usage = ManaUsage.Any)
 {
     return ManaCache.Has(amount.Colorless(), usage);
 }