using Unity.Mathematics; namespace DanieleMarotta.RiversongCodeShowcase { [Service(typeof(IEditToolValidatorService))] public class EditToolValidatorSystem : GameSystem, IEditToolValidatorService { [InjectService] private GameConfig _config; [InjectService] private World _world; public EditToolValidatorSystem(IServiceLocator serviceLocator) : base(serviceLocator) { } public EditToolValidationResult DoCommonValidation(TileRect rect, BlockReason blockReason) { foreach (var tile in TileRange.From(rect)) if (!DoCommonTileValidation(tile, blockReason)) return EditToolValidationResult.BlockedTile; return EditToolValidationResult.Success; } private bool DoCommonTileValidation(int2 tile, BlockReason blockReason) { return _world.Contains(tile) && !_world.BlockMap.IsBlocked(tile, blockReason); } public EditToolValidationResult ValidateBuildingPlacementRules(TileRect rect, BuildingDefinition buildingDefinition) { if (buildingDefinition.NearWater) { var waterMap = _world.WaterMap; foreach (var tile in TileRange.From(rect)) if (!waterMap.IsNearWater(tile)) return EditToolValidationResult.CanOnlyBePlacedNearWater; } if (buildingDefinition.RequiresFertileTile) { foreach (var tile in TileRange.From(rect)) { var fertility = _world.Fertility.GetValue(tile); if (fertility.MaxFertility > 0) return EditToolValidationResult.Success; } return EditToolValidationResult.CanOnlyBePlacedOnFertileGround; } return EditToolValidationResult.Success; } } }