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);
            }
        }
        private void SingleGameLoop()
        {
            this.doRepaint = true;
            this.ecs.process(); // To move the player's units

            // Check at least one player's entity has > 100 APs
            foreach (var unit in this.playersUnits)
            {
                MobDataComponent mdc = (MobDataComponent)unit.GetComponent(nameof(MobDataComponent));
                if (mdc.actionPoints > 0)
                {
                    MovementDataComponent moveData = (MovementDataComponent)unit.GetComponent(nameof(MovementDataComponent));
                    if (moveData.route == null || moveData.route.Count == 0)
                    {
                        return; // They still have spare APs and no dest, so don't do anything and wait for the player
                    }
                }
            }

            // Loop around all entities until none have any
            bool keepLooping = true;

            while (keepLooping)
            {
                keepLooping = false;
                foreach (var e in this.ecs.entities)
                {
                    if (this.playersUnits.Contains(e) == false)   // Don't check player's units
                    {
                        MobDataComponent mdc = (MobDataComponent)e.GetComponent(nameof(MobDataComponent));
                        if (mdc != null)
                        {
                            if (mdc.actionPoints > 0)  // They still have spare APs
                            {
                                Console.WriteLine($"{e.name} still has APs");
                                this.ecs.process();
                                this.doRepaint = true;
                                Thread.Sleep(1000);//  sleep for a sec so the player can see what's going on
                                keepLooping = true;
                            }
                        }
                    }
                }
            }

            // Give everyone some APs
            foreach (var e in this.ecs.entities)
            {
                MobDataComponent mdc = (MobDataComponent)e.GetComponent(nameof(MobDataComponent));
                if (mdc != null)
                {
                    mdc.actionPoints += mdc.apsPerTurn;
                    if (e.name == "Alien")
                    {
                        Console.WriteLine($"Alien now has {mdc.actionPoints} APs left");
                    }
                }
            }
        }
        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....
                }
            }
        }
        public void PickupItem(AbstractEntity unit, AbstractEntity item, List <AbstractEntity> mapSquare)
        {
            MobDataComponent mdc = (MobDataComponent)unit.GetComponent(nameof(MobDataComponent));

            if (mdc == null || mdc.actionPoints > 0)
            {
                mdc.actionPoints -= 40;
                CanCarryComponent  ccc = (CanCarryComponent)unit.GetComponent(nameof(CanCarryComponent));
                CarryableComponent cc  = (CarryableComponent)item.GetComponent(nameof(CarryableComponent));
                // todo - check weight etc...
                ccc.AddItem(item);
                cc.carrier = unit;
                mapSquare.Remove(item);
            }
        }
        public void EntityShootingAtEntity(AbstractEntity shooter, Point shooterPos, AbstractEntity target, Point targetPos)
        {
            CanCarryComponent ccc = (CanCarryComponent)shooter.GetComponent(nameof(CanCarryComponent));

            if (ccc != null && ccc.CurrentItem != null)
            {
                ItemCanShootComponent icsc = (ItemCanShootComponent)ccc.CurrentItem.GetComponent(nameof(ItemCanShootComponent));
                if (icsc != null)
                {
                    MobDataComponent us = (MobDataComponent)shooter.GetComponent(nameof(MobDataComponent));
                    if (us.actionPoints > 0)
                    {
                        this.EntityShotByEntity(shooter, shooterPos.X, shooterPos.Y, target, targetPos.X, targetPos.Y);
                        us.actionPoints -= 50;
                    }
                }
            }
        }
 private AbstractEntity GetTarget(int ourX, int ourY, int ourSide)
 {
     foreach (var e in this.entities)
     {
         MobDataComponent att = (MobDataComponent)e.GetComponent(nameof(MobDataComponent));
         if (att != null && att.side != ourSide)
         {
             PositionComponent pos = (PositionComponent)e.GetComponent(nameof(PositionComponent));
             if (pos != null)
             {
                 if (this.cmvs.CanSee(ourX, ourY, pos.x, pos.y))
                 {
                     return(e);
                 }
             }
         }
     }
     return(null);
 }
        public void ThrowItem(AbstractEntity thrower, int destX, int destY)
        {
            MobDataComponent mdc = (MobDataComponent)thrower.GetComponent(nameof(MobDataComponent));

            if (mdc == null || mdc.actionPoints > 0)
            {
                mdc.actionPoints -= 50;
                CanCarryComponent ccc = (CanCarryComponent)thrower.GetComponent(nameof(CanCarryComponent));
                if (ccc.CurrentItem != null)
                {
                    PositionComponent pos = (PositionComponent)ccc.CurrentItem.GetComponent(nameof(PositionComponent));
                    this.mapData.map[pos.x, pos.y].Add(ccc.CurrentItem);

                    this.gameLog.Add($"{ccc.CurrentItem.name} thrown.");

                    ccc.RemoveItem(ccc.CurrentItem);
                }
            }
        }
        private bool Move(AbstractEntity entity, MovementDataComponent md, PositionComponent p, Point dest)
        {
            if (this.IsAccessible(dest.X, dest.Y))
            {
                MobDataComponent mdc = (MobDataComponent)entity.GetComponent(nameof(MobDataComponent));
                if (mdc == null || mdc.actionPoints > 0)
                {
                    /*if (entity.name == "Alien") {
                     *  Console.WriteLine($"Moving alien.... {mdc.actionPoints} APs left");
                     * }*/

                    int cost = 50;
                    if (p.x != dest.X && p.y != dest.Y)   // Diagonal
                    {
                        cost = 70;
                    }
                    mdc.actionPoints -= cost;
                    this.map_data.map[p.x, p.y].Remove(entity);

                    p.x = dest.X;
                    p.y = dest.Y;

                    this.map_data.map[p.x, p.y].Add(entity);

                    /*if (entity.name == "Alien") {
                     *  Console.WriteLine($"Moved alien. {mdc.actionPoints} APs left");
                     * }*/

                    CheckMapVisibilitySystem cmvs = (CheckMapVisibilitySystem)this.ecs.GetSystem(nameof(CheckMapVisibilitySystem));
                    cmvs.ReCheckVisibility = true;
                    return(true);
                }
            }
            else
            {
                CloseCombatSystem ccs = (CloseCombatSystem)this.ecs.GetSystem(nameof(CloseCombatSystem));
                if (ccs.Combat(entity, this.map_data.map[dest.X, dest.Y]) == false)
                {
                    // Movement failed
                }
            }
            return(false);
        }
        public override void ProcessEntity(AbstractEntity entity)
        {
            ShootOnSightComponent sosc = (ShootOnSightComponent)entity.GetComponent(nameof(ShootOnSightComponent));

            if (sosc == null)
            {
                return;
            }

            PositionComponent shooterPos = (PositionComponent)entity.GetComponent(nameof(PositionComponent));
            MobDataComponent  us         = (MobDataComponent)entity.GetComponent(nameof(MobDataComponent));
            AbstractEntity    target     = this.GetTarget(shooterPos.x, shooterPos.y, us.side);

            if (target != null)
            {
                PositionComponent targetPos = (PositionComponent)target.GetComponent(nameof(PositionComponent));
                ShootingSystem    ss        = (ShootingSystem)this.ecs.GetSystem(nameof(ShootingSystem));
                ss.EntityShootingAtEntity(entity, new Point(shooterPos.x, shooterPos.y), target, new Point(targetPos.x, targetPos.y));
            }
        }
        public AbstractEntity GetTargetAt(List <AbstractEntity> entities, int ourX, int ourY, int ourSide)
        {
            CheckMapVisibilitySystem cmvs = (CheckMapVisibilitySystem)this.ecs.GetSystem(nameof(CheckMapVisibilitySystem));

            foreach (var e in entities)
            {
                MobDataComponent att = (MobDataComponent)e.GetComponent(nameof(MobDataComponent));
                if (att != null && att.side != ourSide)
                {
                    PositionComponent pos = (PositionComponent)e.GetComponent(nameof(PositionComponent));
                    if (pos != null)
                    {
                        if (cmvs.CanSee(ourX, ourY, pos.x, pos.y))
                        {
                            return(e);
                        }
                    }
                }
            }
            return(null);
        }
        public void DropItem(AbstractEntity unit, AbstractEntity item, List <AbstractEntity> mapSquare)
        {
            MobDataComponent mdc = (MobDataComponent)unit.GetComponent(nameof(MobDataComponent));

            if (mdc == null || mdc.actionPoints > 0)
            {
                mdc.actionPoints -= 20;
                CanCarryComponent  ccc     = (CanCarryComponent)unit.GetComponent(nameof(CanCarryComponent));
                PositionComponent  unitpos = (PositionComponent)item.GetComponent(nameof(PositionComponent));
                PositionComponent  itempos = (PositionComponent)item.GetComponent(nameof(PositionComponent));
                CarryableComponent cc      = (CarryableComponent)item.GetComponent(nameof(CarryableComponent));
                if (ccc.GetItems().Contains(item))
                {
                    ccc.RemoveItem(item);
                    cc.carrier = null;
                    mapSquare.Add(item);
                    itempos.x = unitpos.x;
                    itempos.y = unitpos.y;
                }
            }
        }
 private AbstractEntity GetTarget(int ourX, int ourY, int ourSide)
 {
     foreach (var e in this.entities)
     {
         ImpregnatedComponent ic = (ImpregnatedComponent)e.GetComponent(nameof(ImpregnatedComponent));
         if (ic == null)   // Don't go after anyone who's impregnated
         {
             MobDataComponent att = (MobDataComponent)e.GetComponent(nameof(MobDataComponent));
             if (att != null && att.side != ourSide && att.side >= 0)
             {
                 PositionComponent pos = (PositionComponent)e.GetComponent(nameof(PositionComponent));
                 if (pos != null)
                 {
                     if (this.cmvs.CanSee(ourX, ourY, pos.x, pos.y))
                     {
                         return(e);
                     }
                 }
             }
         }
     }
     return(null);
 }
        public void Process(List <AbstractEffect> effects)
        {
            // Draw map
            MapData map_data = this.viewData.GetMapData();

            if (map_data.map != null)
            {
                this.view.mapConsole.Clear();
                for (int y = 0; y < map_data.getHeight(); y++)
                {
                    for (int x = 0; x < map_data.getWidth(); x++)
                    {
                        var           entities = map_data.map[x, y];
                        var           mapEnt   = entities.Single(ent => ent.GetComponents().ContainsKey(nameof(MapsquareData)));
                        MapsquareData msdc     = (MapsquareData)mapEnt.GetComponent(nameof(MapsquareData));
                        if (msdc.visible || Settings.DEBUG_DRAW_ALL)
                        {
                            // Only draw stuff if mapsquare visible
                            AbstractEntity   sq = map_data.GetComponentToDraw(x, y);
                            GraphicComponent gc = (GraphicComponent)sq.GetComponent(nameof(GraphicComponent));
                            RLCell           tc = gc.getVisibleChar();
                            this.view.mapConsole.Set(x, y, tc);
                            if (sq == this.viewData.GetCurrentUnit())
                            {
                                this.view.mapConsole.SetBackColor(x, y, RLColor.Yellow);
                            }
                        }
                        else if (msdc.seen)
                        {
                            AbstractEntity   sq = map_data.GetComponentToDraw(x, y);
                            GraphicComponent gc = (GraphicComponent)sq.GetComponent(nameof(GraphicComponent));
                            this.view.mapConsole.Set(x, y, gc.getSeenChar());
                        }
                        else
                        {
                            this.view.mapConsole.Set(x, y, this.invisible);
                        }
                    }
                }
            }

            // Draw effects
            foreach (var effect in effects)
            {
                effect.draw(this.view.mapConsole);
            }

            // Draw line
            var line2 = this.viewData.GetLine();

            if (line2 != null)
            {
                foreach (var point in line2)
                {
                    this.view.mapConsole.SetBackColor(point.X, point.Y, RLColor.Gray);
                }
            }

            // Draw hover text
            this.view.mapConsole.Print(1, DefaultRLView._mapHeight - 1, this.viewData.GetHoverText(), RLColor.White);

            // Draw crew
            this.view.crewListConsole.Clear();
            int yPos = 0;

            this.view.crewListConsole.Print(0, yPos, "CREW LIST", RLColor.White);
            yPos++;
            int idx = 1;

            foreach (AbstractEntity e in this.viewData.GetUnits())
            {
                RLColor          c   = RLColor.White;
                MobDataComponent mdc = (MobDataComponent)e.GetComponent(nameof(MobDataComponent));
                if (e == this.viewData.GetCurrentUnit())
                {
                    c = RLColor.Yellow; // Highlight selected unit
                }
                else if (mdc.actionPoints <= 0)
                {
                    c = RLColor.Gray;
                }
                MovementDataComponent move = (MovementDataComponent)e.GetComponent(nameof(MovementDataComponent));
                string routeIndicator      = move.route == null || move.route.Count == 0 ? "" : "(R)";
                this.view.crewListConsole.Print(0, yPos, $"{idx}: {e.name} {routeIndicator} ({mdc.actionPoints} APs)", c);
                yPos++;
                idx++;
            }

            // Draw unit stats or menu selection
            this.view.statConsole.Clear();
            yPos = 0;
            Dictionary <int, AbstractEntity> items = this.viewData.GetItemSelectionList();

            if (items != null && items.Count > 0)
            {
                foreach (var idx2 in items.Keys)
                {
                    this.view.statConsole.Print(0, yPos, $"{idx2} : {items[idx2].name}", RLColor.White);
                    yPos++;
                }
            }
            else
            {
                AbstractEntity currentUnit = this.viewData.GetCurrentUnit();
                if (currentUnit != null)
                {
                    foreach (var s in this.viewData.GetStatsFor(currentUnit))
                    {
                        this.view.statConsole.Print(0, yPos, s, RLColor.White);
                        yPos++;
                    }
                }
            }

            // Draw log
            this.view.logConsole.Clear();
            var log = this.viewData.GetLog();
            int pos = 1;

            foreach (var line in log)
            {
                this.view.logConsole.Print(1, pos++, line, RLColor.White);
            }
        }
        public void HandleKeyInput(RLKeyPress keyPress)
        {
            this.doRepaint = true;

            if (this.effectsSystem.HasEffects())
            {
                return;
            }

            switch (keyPress.Key)
            {
            case RLKey.Number1:
            case RLKey.Number2:
            case RLKey.Number3:
            case RLKey.Number4:
            case RLKey.Number5:
            case RLKey.Number6:
            case RLKey.Number7:
            case RLKey.Number8:
            case RLKey.Number9:
                int idx = keyPress.Key - RLKey.Number0;
                if (this.currentInputMode == InputMode.SelectItemFromFloor)
                {
                    if (this.currentInputSubMode == InputSubMode.PickingUpItem)
                    {
                        PositionComponent pos = (PositionComponent)this.currentUnit.GetComponent(nameof(PositionComponent));
                        this.pickupItemSystem.PickupItem(this.currentUnit, this.menuItemList[idx], this.mapData.map[pos.x, pos.y]);
                        this.gameLog.Add("item picked up");
                        this.currentInputMode = InputMode.Normal;
                        this.menuItemList.Clear();
                    }
                }
                else if (this.currentInputMode == InputMode.SelectItemFromInv)
                {
                    if (this.currentInputSubMode == InputSubMode.DroppingItem)
                    {
                        PositionComponent pos = (PositionComponent)this.currentUnit.GetComponent(nameof(PositionComponent));
                        this.pickupItemSystem.DropItem(this.currentUnit, this.menuItemList[idx], this.mapData.map[pos.x, pos.y]);
                        this.gameLog.Add("item dropped up");
                        this.currentInputMode = InputMode.Normal;
                        this.menuItemList.Clear();
                    }
                }
                else if (this.currentInputMode == InputMode.ActivatingCurrentItem)
                {
                    TimerCanBeSetComponent tcbsc = (TimerCanBeSetComponent)this.currentUnit.GetComponent(nameof(TimerCanBeSetComponent));
                    if (tcbsc != null)
                    {
                        if (tcbsc.activated == false)
                        {
                            tcbsc.activated = true;
                            tcbsc.timeLeft  = idx;
                            this.gameLog.Add("Timer set for " + idx);
                        }
                        else
                        {
                            this.gameLog.Add("Timer already set!");
                        }
                    }
                }
                else
                {
                    this.SelectUnit(idx);
                }
                break;

            case RLKey.Up: {
                MovementDataComponent m = (MovementDataComponent)this.currentUnit.GetComponent(nameof(MovementDataComponent));
                m.route = null;
                m.offY  = -1;
                break;
            }

            case RLKey.Down: {
                MovementDataComponent m = (MovementDataComponent)this.currentUnit.GetComponent(nameof(MovementDataComponent));
                m.route = null;
                m.offY  = 1;
                break;
            }

            case RLKey.Left: {
                MovementDataComponent m = (MovementDataComponent)this.currentUnit.GetComponent(nameof(MovementDataComponent));
                m.route = null;
                m.offX  = -1;
                break;
            }

            case RLKey.Right: {
                MovementDataComponent m = (MovementDataComponent)this.currentUnit.GetComponent(nameof(MovementDataComponent));
                m.route = null;
                m.offX  = 1;
                break;
            }

            case RLKey.Space: {
                MobDataComponent mdc = (MobDataComponent)this.currentUnit.GetComponent(nameof(MobDataComponent));
                if (mdc.actionPoints > 0)
                {
                    mdc.actionPoints -= 100;
                }
                break;
            }

            case RLKey.A:     // Activate
                this.currentInputMode = InputMode.ActivatingCurrentItem;
                this.gameLog.Add("Enter number from 1-9");
                break;

            case RLKey.D: {     // Drop
                this.currentInputMode    = InputMode.SelectItemFromInv;
                this.currentInputSubMode = InputSubMode.DroppingItem;
                this.ListItemsInInv();
                this.gameLog.Add("Please select an item to drop");
                break;
            }

            case RLKey.P: {     // Pickup
                this.currentInputMode    = InputMode.SelectItemFromFloor;
                this.currentInputSubMode = InputSubMode.PickingUpItem;
                this.ListItemsOnFloor();
                this.gameLog.Add("Please select an item to pick-up");
                break;
            }

            case RLKey.S:     // Stop moving
                var md = (MovementDataComponent)this.currentUnit.GetComponent(nameof(MovementDataComponent));
                md.route = null;
                this.gameLog.Add("Movement stopped");
                break;

            case RLKey.T: {     // Throw
                this.currentInputMode    = InputMode.SelectMapPoint;
                this.currentInputSubMode = InputSubMode.ThrowingItem;
                this.gameLog.Add("Select where to throw");
                break;
            }

            case RLKey.U: {     // Use (e.g. shoot)
                this.UseCurrentItem();
                break;
            }

            case RLKey.W: {     // Walk
                this.currentInputMode    = InputMode.SelectMapPoint;
                this.currentInputSubMode = InputSubMode.SelectingDestination;
                this.gameLog.Add("Select where to walk to");
                break;
            }

            case RLKey.X: {     // Test
                BulletEffect  be = new BulletEffect(0, 0, 20, 20);
                EffectsSystem es = (EffectsSystem)this.ecs.GetSystem(nameof(EffectsSystem));
                es.effects.Add(be);
                break;
            }
            }

            //if (action_performed) {
            this.SingleGameLoop();
            //}
            this.checkVisibilitySystem.process(this.playersUnits);
        }
        public void HandleMouseEvent(RLMouse mouse)
        {
            this.doRepaint = true;

            if (this.effectsSystem.HasEffects())
            {
                return;
            }

            if (mouse.LeftPressed)
            {
                bool action_performed = false;
                if (this.currentInputMode == InputMode.SelectMapPoint)
                {
                    if (this.currentInputSubMode == InputSubMode.SelectingDestination)
                    {
                        var pos = (PositionComponent)this.currentUnit.GetComponent(nameof(PositionComponent));
                        var md  = (MovementDataComponent)this.currentUnit.GetComponent(nameof(MovementDataComponent));
                        md.route = Misc.GetLine(pos.x, pos.y, mouse.X, mouse.Y, true);
                        this.gameLog.Add("Destination selected");
                        this.currentInputMode = InputMode.Normal;
                    }
                    else if (this.currentInputSubMode == InputSubMode.ThrowingItem)
                    {
                        var throwingSystem = (ThrowingSystem)this.ecs.GetSystem(nameof(ThrowingSystem));
                        throwingSystem.ThrowItem(this.currentUnit, mouse.X, mouse.Y);
                        this.currentInputMode = InputMode.Normal;
                        action_performed      = true;
                    }
                    else if (this.currentInputSubMode == InputSubMode.SelectShotTarget)
                    {
                        ShootingSystem   ss     = (ShootingSystem)this.ecs.GetSystem(nameof(ShootingSystem));
                        MobDataComponent att    = (MobDataComponent)this.currentUnit.GetComponent(nameof(MobDataComponent));
                        AbstractEntity   target = ss.GetTargetAt(this.mapData.map[mouse.X, mouse.Y], mouse.X, mouse.Y, att.side);
                        var pos = (PositionComponent)this.currentUnit.GetComponent(nameof(PositionComponent));
                        ss.EntityShootingAtEntity(this.currentUnit, new Point(pos.x, pos.y), target, new Point(mouse.X, mouse.Y));
                    }
                }
                else if (this.currentInputMode == InputMode.Normal)
                {
                    // Have they clicked on an adjacent square
                    var pos = (PositionComponent)this.currentUnit.GetComponent(nameof(PositionComponent));
                    if (GeometryFunctions.Distance(mouse.X, mouse.Y, pos.x, pos.y) < 2)
                    {
                        this.MouseClicked(mouse.X, mouse.Y);
                    }
                }

                if (action_performed)
                {
                    this.SingleGameLoop();
                }
            }
            else
            {
                this.hoverText = this.GetSquareDesc(mouse.X, mouse.Y);

                if (this.currentInputMode == InputMode.SelectMapPoint)
                {
                    var pos = (PositionComponent)this.currentUnit.GetComponent(nameof(PositionComponent));
                    this.line = Misc.GetLine(pos.x, pos.y, mouse.X, mouse.Y, true);
                }
                else
                {
                    this.line = null;
                }
            }
        }