56 lines
1.9 KiB
C#
56 lines
1.9 KiB
C#
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;
|
|
}
|
|
}
|
|
} |