public void ChildUpdatedItsState(Waterling pChild, WaterlingState pState)
 {
     if (Underlings.All(u => u.State == WaterlingState.WalkedIntoAWall))
     {
         State = WaterlingState.FillAndClimb;
     }
 }
            public void SpawnUnderling(Point pAt, WaterlingState pJob)
            {
                var underling = new Waterling()
                {
                    Position = pAt,
                    State    = pJob,
                    Parent   = this
                };

                Underlings.Add(underling);
                waterlings.Add(underling);
            }
        public static void Run()
        {
            var lines = File.ReadAllLines("input.txt");

            display         = new Point(1, 1);
            camera          = new Rectangle(400, 1880, 120, 40);
            round           = 0;
            instructions    = new List <Instruction>();
            inputParseRegex = new Regex(@"[x|y]=(?<slice>\d+), [x|y]=(?<range_start>\d+)\.\.(?<range_end>\d+)");

            LoadResources();
            Parse(lines);
            LoadInstructions();

            bool play          = false;
            bool render        = false;
            bool fastforward   = true;
            int? fastforwardTo = null;

            rootWaterling = new Waterling()
            {
                Position = new Point(500, 6)
            };

            waterlings = new List <Waterling>()
            {
                rootWaterling
            };

            // LoadMap();
            // Console.ReadKey(true);

            while (running)
            {
                round++;

                if (fastforwardTo.HasValue && round < fastforwardTo.Value)
                {
                }
                else
                {
                    if (render)
                    {
                        RenderView();
                        Console.SetCursorPosition(display.X + 2, display.Y + camera.Height - 2);
                        Console.Write("Round: " + round);
                        Console.Write(", IsInfinite: " + rootWaterling.IsInfinite);
                    }
                    if (play)
                    {
                        Thread.Sleep(200);
                    }
                    else if (!fastforward)
                    {
                        bool letGo = false;
                        while (!letGo)
                        {
                            var key = Console.ReadKey(true);
                            if (key.Key == ConsoleKey.Escape)
                            {
                                return;
                            }
                            if (key.Key == ConsoleKey.RightArrow)
                            {
                                camera.X += camera.Width;
                            }
                            if (key.Key == ConsoleKey.LeftArrow)
                            {
                                camera.X -= camera.Width;
                            }
                            if (key.Key == ConsoleKey.UpArrow)
                            {
                                camera.Y -= camera.Height;
                            }
                            if (key.Key == ConsoleKey.DownArrow)
                            {
                                camera.Y += camera.Height;
                            }
                            if (key.Key == ConsoleKey.Enter)
                            {
                                letGo = true;
                            }
                            if (render)
                            {
                                RenderView();
                            }
                        }
                    }
                }

                RunWaterlings();

                if (waterlings.All(w => w.Done))
                {
                    running = false;
                    RenderView();
                    var sumWater   = 0;
                    var sumWetSand = 0;
                    for (int i = 0; i < map.Length; i++)
                    {
                        sumWater   += map[i] == entitiesByEnum[EntityEnum.Water].Id ? 1 : 0;
                        sumWetSand += map[i] == entitiesByEnum[EntityEnum.WetSand].Id ? 1 : 0;
                    }
                    Console.ReadKey(true);
                    Console.Clear();
                    Console.WriteLine("Part01: " + (sumWater + sumWetSand));
                    Console.WriteLine("Part02: " + sumWater);
                }
            }

            Console.SetCursorPosition(0, 20);
        }