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); }
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); }
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>(); }
public PropTransfer(IPropStore propStore, IEnumerable <IProp> added, IEnumerable <IProp> removed) { PropStore = propStore; Added = added.ToArray(); Removed = removed.ToArray(); }
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); }
protected ChestBase(IPropStore content) { Content = content ?? throw new ArgumentNullException(nameof(content)); Content.Added += Content_Added; Content.Removed += Content_Removed; IsActive = true; }
/// <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); }
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; }
protected ChestBase(IMapNode node, IPropStore content) : this(node, content, default(int)) { }
public PropTransferMachine(IPropStore inventory, IPropStore container) { Inventory = new PropTransferStore(inventory); Container = new PropTransferStore(container); Floor = new FloorPropContainer(); }
public void TransferProp(IProp prop, IPropStore sourceStore, IPropStore distStore) { sourceStore.Remove(prop); distStore.Add(prop); }
private void AddPropToInventory(IPropStore inventory, IProp prop) { inventory.Add(prop); }
protected ChestBase(IMapNode node, IPropStore content) : this(node, content, 0) { }