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); } }