Tighten editor validation coverage
This commit is contained in:
@@ -144,8 +144,8 @@ public static class LevelEditor
|
||||
EEditorTool.Junction => SetFloorProp(level, position, new() { Type = EPropType.Junction }),
|
||||
EEditorTool.Door => ToggleOrSetDoor(level, position),
|
||||
EEditorTool.AllSeeingEyeTerminal => SetFloorProp(level, position, new() { Type = EPropType.AllSeeingEyeTerminal }),
|
||||
EEditorTool.SprinklerControl => SetFloorProp(level, position, new() { Type = EPropType.SprinklerControl, SwitchState = EPropSwitchState.Enabled }),
|
||||
EEditorTool.SprinklerValve => SetWallProp(level, position, new() { Type = EPropType.SprinklerValve, Carrier = ECarrierType.Water, OutletPosition = position.Neighbors().FirstOrDefault(level.IsFloor) }),
|
||||
EEditorTool.SprinklerControl => SetSprinklerControl(level, position),
|
||||
EEditorTool.SprinklerValve => SetSprinklerValve(level, position),
|
||||
EEditorTool.RemedySupply => SetFloorProp(level, position, new() { Type = EPropType.RemedySupply, RemedyType = command.RemedyType }),
|
||||
EEditorTool.ReactorControl => SetReactorControl(level, position),
|
||||
EEditorTool.Leak => SetLeak(level, position, command.Carrier),
|
||||
@@ -217,6 +217,32 @@ public static class LevelEditor
|
||||
return level.InBounds(position) && level.GetTerrain(position) == ECellTerrain.Wall ? level.SetProp(position, prop) : level;
|
||||
}
|
||||
|
||||
private static LevelState SetSprinklerControl(LevelState level, GridPosition position)
|
||||
{
|
||||
var linkedValve = LevelTraversal.AllPositions(level).FirstOrDefault(candidate => level.GetProp(candidate).Type == EPropType.SprinklerValve);
|
||||
return SetFloorProp(level, position, new() {
|
||||
Type = EPropType.SprinklerControl,
|
||||
SwitchState = EPropSwitchState.Enabled,
|
||||
LinkedPosition = level.InBounds(linkedValve) && level.GetProp(linkedValve).Type == EPropType.SprinklerValve ? linkedValve : null
|
||||
});
|
||||
}
|
||||
|
||||
private static LevelState SetSprinklerValve(LevelState level, GridPosition position)
|
||||
{
|
||||
var next = SetWallProp(level, position, new() {
|
||||
Type = EPropType.SprinklerValve,
|
||||
Carrier = ECarrierType.Water,
|
||||
OutletPosition = position.Neighbors().FirstOrDefault(level.IsFloor)
|
||||
});
|
||||
if (next == level)
|
||||
return level;
|
||||
|
||||
var unlinkedControl = LevelTraversal.AllPositions(next).FirstOrDefault(candidate => next.GetProp(candidate) is { Type: EPropType.SprinklerControl, LinkedPosition: null });
|
||||
return next.InBounds(unlinkedControl) && next.GetProp(unlinkedControl).Type == EPropType.SprinklerControl
|
||||
? next.SetProp(unlinkedControl, next.GetProp(unlinkedControl) with { LinkedPosition = position })
|
||||
: next;
|
||||
}
|
||||
|
||||
private static LevelState ToggleOrSetDoor(LevelState level, GridPosition position)
|
||||
{
|
||||
if (!level.IsFloor(position))
|
||||
|
||||
@@ -35,8 +35,9 @@ public sealed class LevelValidator
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!level.GetUnderground(position, prop.Carrier).IsPresent)
|
||||
errors.Add(new("Isolation valve must sit on its matching underground carrier.", position));
|
||||
var presentCarriers = Enum.GetValues<ECarrierType>().Count(carrier => level.GetUnderground(position, carrier).IsPresent);
|
||||
if (presentCarriers != 1 || !level.GetUnderground(position, prop.Carrier).IsPresent)
|
||||
errors.Add(new("Isolation valve must sit on exactly one matching underground carrier.", position));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,6 +96,9 @@ public sealed class LevelValidator
|
||||
var westEastWalls = IsWall(level, new(position.X - 1, position.Y)) && IsWall(level, new(position.X + 1, position.Y));
|
||||
if (northSouthWalls == westEastWalls)
|
||||
errors.Add(new("Door must be surrounded by one opposing pair of wall cells.", position));
|
||||
|
||||
if (!level.GetUnderground(position, ECarrierType.Electricity).IsPresent)
|
||||
errors.Add(new("Door must have a local electricity connection.", position));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user