private List <Tuple <int, int> > GetPositionsToCheck(Vector2Int generatorPos, GeneratorRadius generatorRadius)
    {
        var positions = new List <Tuple <int, int> >();

        switch (generatorRadius)
        {
        case GeneratorRadius.All:
            for (int x = 0; x < _contexts.game.board.Size.x; x++)
            {
                for (int y = 0; y < _contexts.game.board.Size.y; y++)
                {
                    positions.Add(new Tuple <int, int>(x, y));
                }
            }

            break;

        case GeneratorRadius.Radius1:
            for (int x = generatorPos.x - 1; x <= generatorPos.x + 1; x++)
            {
                for (int y = generatorPos.y - 1; y <= generatorPos.y + 1; y++)
                {
                    if (!InBounds(x, y))
                    {
                        continue;
                    }
                    positions.Add(new Tuple <int, int>(x, y));
                }
            }

            break;
        }

        return(positions);
    }
    private void GenerateItem(GameEntity generator, int amount, ItemTypeInBoard type, bool bottomCellConsiderate,
                              GeneratorRadius generatorRadius)
    {
        var generationAmount = generator.goalEffectType.Type == GoalEffectType.Decrease
            ? CalculateGenerationAmountForItem(type, amount)
            : amount;

        var positionsToCheck = GetPositionsToCheck(generator.gridPosition.value, generatorRadius);

        var itemIds = SelectSuitableItems(positionsToCheck, bottomCellConsiderate).Shuffle().Take(generationAmount)
                      .ToList();

        var reservations = new List <Tuple <int, int> >();

        foreach (var id in itemIds)
        {
            var reservationId = IdHelper.GetNewReservationId();
            var item          = _contexts.game.GetEntityWithId(id);
            item.AddItemReservation(reservationId, id, type);
            reservations.Add(new Tuple <int, int>(reservationId, id));
            WaitHelper.Increase(WaitType.CriticalAnimation);
        }

        generator.AddReservedItems(reservations);

        if (generator.goalEffectType.Type == GoalEffectType.Decrease)
        {
            _contexts.game.goalForGenerators.Goals[type.GoalType] -= generationAmount;

            if (CalculateItemLeftToGenerate(type) == 0)
            {
                CloseGenerators(generator);
            }
        }
    }
    private void GenerateCellItem(GameEntity generator, int defaultAmount, CellItemTypeInBoard type,
                                  GeneratorRadius generatorRadius)
    {
        var generationAmount = generator.goalEffectType.Type == GoalEffectType.Decrease
            ? CalculateGenerationAmountForCellItem(type, defaultAmount)
            : defaultAmount;

        var positionsToCheck = GetPositionsToCheck(generator.gridPosition.value, generatorRadius);

        var cellItemIds = SelectSuitableCellItems(positionsToCheck).Shuffle().Take(generationAmount).ToList();

        var reservations = new List <int>();

        foreach (var id in cellItemIds)
        {
            var reservationId = IdHelper.GetNewReservationId();
            var cell          = _contexts.game.GetEntityWithCellId(id);
            cell.AddCellItemReservation(reservationId, type);
            reservations.Add(reservationId);
            WaitHelper.Increase(WaitType.CriticalAnimation);
        }

        generator.AddReservedCells(reservations);

        if (generator.goalEffectType.Type == GoalEffectType.Decrease)
        {
            _contexts.game.goalForGenerators.Goals[type.GoalType] -= generationAmount;

            if (CalculateCellItemLeftToGenerate(type) == 0)
            {
                CloseGenerators(generator);
            }
        }
        else
        {
            GoalHelper.AddToGoal(type.GoalType, reservations.Count);
        }
    }