Esempio n. 1
0
        private static bool TacticalActIsAvailableByConstrains(ITacticalAct tacticalAct,
                                                               IPropStore propStore)
        {
            if (tacticalAct.Constrains is null)
            {
                // Если нет никаких ограничений, то действие доступно в любом случае.
                return(true);
            }

            if (tacticalAct.Constrains.PropResourceType is null)
            {
                // Если нет ограничений по ресурсам, то действие доступно.
                return(true);
            }

            // Проверяем наличие ресурсов в нужном количестве.
            // Проверка осуществляется в хранилище, указанном параметром.

            if (propStore is null)
            {
                // Персонажи бе инвентаря не могут применять действия,
                // для которых нужны ресурсы.
                return(false);
            }

            var propResourceType  = tacticalAct.Constrains.PropResourceType;
            var propResourceCount = tacticalAct.Constrains.PropResourceCount.Value;

            if (CheckPropResource(propStore, propResourceType, propResourceCount))
            {
                return(true);
            }

            return(false);
        }
Esempio n. 2
0
        private static bool CheckPropResource(IPropStore inventory,
                                              string usedPropResourceType,
                                              int usedPropResourceCount)
        {
            var props         = inventory.CalcActualItems();
            var propResources = new List <Resource>();

            foreach (var prop in props)
            {
                if (prop is Resource propResource)
                {
                    AddResourceOfUsageToList(usedPropResourceType, usedPropResourceCount, propResources, propResource);
                }

                // Остальные типы предметов пока не могут выступать, как источник ресурса.
                // Далее нужно будет сделать, чтобы:
                // 1. У персонажа был предмет экипировки, который позволяет выполнять
                // определённые действия другим предметов. Условно, симбиоз двух предметов (или сет предметов).
                // 2. У персонажа был экипирован предмет, который позволяет выполнять
                // определённые действия другим предметов.
                // 3. Расход прочности другого предмета.
                // 4. Применение обойм. Механика расхода предметов, когда ресурсы изымаются не из инвентаря,
                // а их специального контейнера внутри предмета. При необходимости, предмет нужно перезаряжать за
                // отдельное время.
            }

            var preferredPropResource = propResources.FirstOrDefault();

            return(preferredPropResource != null && preferredPropResource.Count >= usedPropResourceCount);
        }
Esempio n. 3
0
        private static bool CheckPropResource(IPropStore inventory,
                                              string usedPropResourceType,
                                              int usedPropResourceCount)
        {
            var props         = inventory.CalcActualItems();
            var propResources = new List <Resource>();

            foreach (var prop in props)
            {
                var propResource = prop as Resource;
                if (propResource == null)
                {
                    continue;
                }

                if (propResource.Scheme.Bullet?.Caliber == usedPropResourceType)
                {
                    propResources.Add(propResource);
                }
            }

            var preferredPropResource = propResources.FirstOrDefault();

            return(preferredPropResource != null && preferredPropResource.Count >= usedPropResourceCount);
        }
        /// <summary>
        /// Конструктор для хранилища-трансфера.
        /// </summary>
        /// <param name="propStore"> Реальное хранилище предметов. </param>
        public PropTransferStore(IPropStore propStore)
        {
            PropStore = propStore;

            PropAdded   = new List <IProp>();
            PropRemoved = new List <IProp>();
        }
Esempio n. 5
0
 public PropTransfer(IPropStore propStore,
                     IEnumerable <IProp> added,
                     IEnumerable <IProp> removed)
 {
     PropStore = propStore;
     Added     = added.ToArray();
     Removed   = removed.ToArray();
 }
Esempio n. 6
0
        protected ChestBase(IMapNode node, IPropStore content, int id)
        {
            Id      = id;
            Node    = node ?? throw new ArgumentNullException(nameof(node));
            Content = content ?? throw new ArgumentNullException(nameof(content));

            Content.Added   += Content_Added;
            Content.Removed += Content_Removed;
        }
        protected static void AddPropToInventory(IPropStore inventory, IProp prop)
        {
            if (inventory is null)
            {
                throw new ArgumentNullException(nameof(inventory));
            }

            inventory.Add(prop);
        }
Esempio n. 8
0
        protected ChestBase(IPropStore content)
        {
            Content = content ?? throw new ArgumentNullException(nameof(content));

            Content.Added   += Content_Added;
            Content.Removed += Content_Removed;

            IsActive = true;
        }
Esempio n. 9
0
        /// <summary>
        /// Выбирает лучшее действие из указанных.
        /// </summary>
        /// <param name="acts"> Все возможные действия. </param>
        /// <param name="propStore"> Хранилище, в котором искать ресурсы. </param>
        /// <returns> Лучшее дейсвие среди указанных. </returns>
        public static ITacticalAct SelectBestAct(IEnumerable <ITacticalAct> acts, IPropStore propStore)
        {
            if (acts is null)
            {
                throw new ArgumentNullException(nameof(acts));
            }

            var availableActs = acts
                                .Where(x => x.CurrentCooldown == null || x.CurrentCooldown == 0)
                                .Where(x => TacticalActIsAvailableByConstrains(x, propStore))
                                .OrderByDescending(x => x.Efficient.Dice * x.Efficient.Count);

            return(availableActs.First());
        }
        private bool CheckPropResource(IPropStore inventory,
                                       string usedPropResourceType,
                                       int usedPropResourceCount)
        {
            var propResources = from prop in inventory.CalcActualItems()
                                let propResource = prop as Resource
                                                   where propResource != null
                                                   where propResource.Scheme.Bullet?.Caliber == usedPropResourceType
                                                   select propResource;

            var preferredPropResource = propResources.FirstOrDefault();

            return(preferredPropResource != null && preferredPropResource.Count >= usedPropResourceCount);
        }
Esempio n. 11
0
 public ContainerModalTransferContextualMenu(
     Point position,
     IPropStore inventoryStore,
     IPropStore containerStore,
     IUiContentStorage uiContentStorage,
     IServiceProvider serviceProvider,
     PropTransferMachineStore sourceStore,
     PropTransferMachineStore targetStore,
     string menuTitle) : base(position, uiContentStorage)
 {
     _inventoryStore  = inventoryStore;
     _containerStore  = containerStore;
     _serviceProvider = serviceProvider;
     _sourceStore     = sourceStore;
     _targetStore     = targetStore;
     _menuTitle       = menuTitle;
 }
Esempio n. 12
0
 protected ChestBase(IMapNode node, IPropStore content) : this(node, content, default(int))
 {
 }
Esempio n. 13
0
 public PropTransferMachine(IPropStore inventory, IPropStore container)
 {
     Inventory = new PropTransferStore(inventory);
     Container = new PropTransferStore(container);
     Floor     = new FloorPropContainer();
 }
Esempio n. 14
0
 public void TransferProp(IProp prop, IPropStore sourceStore, IPropStore distStore)
 {
     sourceStore.Remove(prop);
     distStore.Add(prop);
 }
Esempio n. 15
0
 private void AddPropToInventory(IPropStore inventory, IProp prop)
 {
     inventory.Add(prop);
 }
Esempio n. 16
0
 protected ChestBase(IMapNode node, IPropStore content) : this(node, content, 0)
 {
 }