コード例 #1
0
 public void ChildUpdatedItsState(Waterling pChild, WaterlingState pState)
 {
     if (Underlings.All(u => u.State == WaterlingState.WalkedIntoAWall))
     {
         State = WaterlingState.FillAndClimb;
     }
 }
コード例 #2
0
            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;
                }
            }
コード例 #3
0
            public void SpawnUnderling(Point pAt, WaterlingState pJob)
            {
                var underling = new Waterling()
                {
                    Position = pAt,
                    State    = pJob,
                    Parent   = this
                };

                Underlings.Add(underling);
                waterlings.Add(underling);
            }
コード例 #4
0
            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;
                }
            }