riversong code showcase
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user