public void ChildUpdatedItsState(Waterling pChild, WaterlingState pState) { if (Underlings.All(u => u.State == WaterlingState.WalkedIntoAWall)) { State = WaterlingState.FillAndClimb; } }
public void Update() { if (map[CalculateMapPosition(Position)] == entitiesByEnum[EntityEnum.Sand].Id) { MarkAs(EntityEnum.WetSand, Position); } if (map[CalculateMapPosition(Position)] == entitiesByEnum[EntityEnum.Water].Id) { Done = true; State = WaterlingState.Ghosted; } HandleState(); var underlingsCopy = Underlings.ToList(); foreach (var underling in underlingsCopy) { underling.Update(); } if (Underlings.Any(u => u.IsInfinite)) { IsInfinite = true; } if (State == WaterlingState.Idle && (Underlings.Count == 0 || Underlings.All(u => u.Done))) { Done = true; } }
public void SpawnUnderling(Point pAt, WaterlingState pJob) { var underling = new Waterling() { Position = pAt, State = pJob, Parent = this }; Underlings.Add(underling); waterlings.Add(underling); }
void HandleState() { if (State == WaterlingState.Falling) { var floor = Position.Down(); if (IsVoid(floor)) { State = WaterlingState.EnteredInfinity; Parent.ChildUpdatedItsState(this, WaterlingState.EnteredInfinity); IsInfinite = true; Done = true; return; } if (IsObstacle(floor)) { State = WaterlingState.Idle; bool spawnedUnderlings = false; var left = Position.Left(); if (!IsObstacle(left) && !IsVoid(left)) { SpawnUnderling(left, WaterlingState.RoamingLeft); spawnedUnderlings = true; } var right = Position.Right(); if (!IsObstacle(right) && !IsVoid(right)) { SpawnUnderling(right, WaterlingState.RoamingRight); spawnedUnderlings = true; } if (!spawnedUnderlings) { State = WaterlingState.FillAndClimb; } } else { Position = Position.Down(); } } else if (State == WaterlingState.RoamingLeft) { // do we have something to stand on? var floor = Position.Down(); if (IsVoid(floor)) { State = WaterlingState.EnteredInfinity; Parent.ChildUpdatedItsState(this, WaterlingState.EnteredInfinity); IsInfinite = true; Done = true; return; } else if (!IsObstacle(floor)) { // no floor! we gonna fall! State = WaterlingState.Falling; Parent.ChildUpdatedItsState(this, WaterlingState.Falling); return; } var left = Position.Left(); if (IsVoid(left)) { State = WaterlingState.EnteredInfinity; Parent.ChildUpdatedItsState(this, WaterlingState.EnteredInfinity); IsInfinite = true; Done = true; return; } if (IsObstacle(left)) { // report back to papa/mama that we hit an obstacle State = WaterlingState.WalkedIntoAWall; Parent.ChildUpdatedItsState(this, WaterlingState.WalkedIntoAWall); Done = true; return; } else { Position = Position.Left(); } } else if (State == WaterlingState.RoamingRight) { // do we have something to stand on? var floor = Position.Down(); if (IsVoid(floor)) { State = WaterlingState.EnteredInfinity; Parent.ChildUpdatedItsState(this, WaterlingState.EnteredInfinity); IsInfinite = true; Done = true; return; } else if (!IsObstacle(floor)) { // no floor! we gonna fall! State = WaterlingState.Falling; Parent.ChildUpdatedItsState(this, WaterlingState.Falling); return; } var right = Position.Right(); if (IsVoid(right)) { State = WaterlingState.EnteredInfinity; Parent.ChildUpdatedItsState(this, WaterlingState.EnteredInfinity); IsInfinite = true; Done = true; return; } if (IsObstacle(right)) { // report back to papa/mama that we hit an obstacle State = WaterlingState.WalkedIntoAWall; Parent.ChildUpdatedItsState(this, WaterlingState.WalkedIntoAWall); Done = true; return; } else { Position = Position.Right(); } } else if (State == WaterlingState.FillAndClimb) { int minX = int.MaxValue, maxX = int.MinValue; foreach (var underling in Underlings) { if (underling.Position.X < minX) { minX = underling.Position.X; } if (underling.Position.X > maxX) { maxX = underling.Position.X; } } if (Position.X < minX) { minX = Position.X; } if (Position.X > maxX) { maxX = Position.X; } for (int x = minX; x <= maxX; x++) { MarkAs(EntityEnum.Water, new Point(x, Position.Y)); } foreach (var underling in Underlings) { underling.Done = true; waterlings.Remove(underling); } SleepingUnderlings.AddRange(Underlings); Underlings.Clear(); Position = Position.Up(); State = WaterlingState.Falling; } }