public override void ProcessEntity(AbstractEntity entity)
        {
            JonesTheCatComponent cat = (JonesTheCatComponent)entity.GetComponent(nameof(JonesTheCatComponent));

            if (cat == null)   // Are we a cat?
            {
                return;
            }
            CarryableComponent cc = (CarryableComponent)entity.GetComponent(nameof(CarryableComponent));

            if (cc.carrier != null)   // Don't move if we're bring carried
            {
                return;
            }
            MobDataComponent us = (MobDataComponent)entity.GetComponent(nameof(MobDataComponent));

            if (us.actionPoints <= 0)   // Only do stuff if we've got any APs
            {
                return;
            }

            MovementDataComponent mdc = (MovementDataComponent)entity.GetComponent(nameof(MovementDataComponent));

            if (mdc.route == null || mdc.route.Count == 0)
            {
                MovementSystem    ms  = (MovementSystem)this.ecs.GetSystem(nameof(MovementSystem));
                PositionComponent pos = (PositionComponent)entity.GetComponent(nameof(PositionComponent));
                Point             p   = ms.GetRandomAccessibleSquare();
                mdc.route = ms.GetAStarRoute(pos.x, pos.y, p.X, p.Y);
            }
        }
        public override void ProcessEntity(AbstractEntity entity)
        {
            AlienComponent alienData = (AlienComponent)entity.GetComponent(nameof(AlienComponent));

            if (alienData == null)   // Are we an alien?
            {
                return;
            }
            MobDataComponent us = (MobDataComponent)entity.GetComponent(nameof(MobDataComponent));

            if (us.actionPoints <= 0)   // Only do stuff if we've got any APs
            {
                return;
            }

            PositionComponent     pos    = (PositionComponent)entity.GetComponent(nameof(PositionComponent));
            AbstractEntity        target = this.GetTarget(pos.x, pos.y, us.side);
            MovementDataComponent mdc    = (MovementDataComponent)entity.GetComponent(nameof(MovementDataComponent));

            if (target != null)
            {
                Console.WriteLine($"Alien can see {target.name}");
                alienData.moveWhenNoEnemy = true;
                PositionComponent targetPos = (PositionComponent)target.GetComponent(nameof(PositionComponent));
                if (this.CheckForImpregnation(alienData, pos, target, targetPos))
                {
                    us.actionPoints -= 50;
                }
                else
                {
                    mdc.route = Misc.GetLine(pos.x, pos.y, targetPos.x, targetPos.y, true);
                }
            }
            else
            {
                if (alienData.moveWhenNoEnemy)
                {
                    alienData.moveWhenNoEnemy = false;

                    alienData.impregnateNextEnemy = Misc.random.Next(1, 2) == 1;

                    // Move to a random point on the map
                    MovementSystem ms = (MovementSystem)this.ecs.GetSystem(nameof(MovementSystem));
                    Point          p  = ms.GetRandomAccessibleSquare();
                    mdc.route = ms.GetAStarRoute(pos.x, pos.y, p.X, p.Y);
                }
                if (mdc.route == null || mdc.route.Count == 0)
                {
                    us.actionPoints -= 100; // Waiting....
                }
            }
        }