internal override bool MouseMoved(IGameViewport viewport, MessageMouseArgs args)
    {
        ClearResults();

        SetResultLocationFromMouse(args);
        if (Picker.flagsTarget.HasFlag(UiPickerFlagsTarget.Radius))
        {
            TrimRangeOfPicker(Result.location);

            using var rayPkt = CreateRaycast(Result.location);
            rayPkt.Raycast();

            foreach (var resultItem in rayPkt)
            {
                if (resultItem.obj != null)
                {
                    if (Result.objList == null)
                    {
                        Result.objList = new List <GameObject>();
                    }

                    Result.objList.Add(resultItem.obj);
                }
            }

            if (Result.objList != null)
            {
                Result.flags |= PickerResultFlags.PRF_HAS_MULTI_OBJ;
            }
        }

        Picker.DoExclusions();
        return(true);
    }
    internal override bool MouseMoved(IGameViewport viewport, MessageMouseArgs args)
    {
        ClearResults();
        PickerStatusFlags |= PickerStatusFlags.Invalid;

        var raycastFlags = PickerState.GetFlagsFromExclusions();

        GameSystems.Raycast.PickObjectOnScreen(viewport, args.X, args.Y, out var target, raycastFlags);

        PickerState.Target = target;
        if (target != Picker.caster)
        {
            return(false);
        }

        PickerStatusFlags &= ~PickerStatusFlags.Invalid;

        if (!Picker.flagsTarget.HasFlag(UiPickerFlagsTarget.Radius))
        {
            Picker.SetSingleTgt(target);
        }
        else
        {
            Picker.SetAreaTargets(target.GetLocationFull());
        }

        return(false);
    }
    internal override bool MouseMoved(IGameViewport viewport, MessageMouseArgs args)
    {
        var sourceLocation = Picker.caster.GetLocationFull();
        var radius         = Picker.caster.GetRadius();
        var targetLocation = GameViews.Primary.ScreenToTile(args.X, args.Y);

        PickerStatusFlags &= ~(PickerStatusFlags.Invalid | PickerStatusFlags.OutOfRange);

        if (Picker.flagsTarget.HasFlag(UiPickerFlagsTarget.Range))
        {
            var distance = sourceLocation.DistanceTo(targetLocation) - radius;
            if (distance > Picker.range)
            {
                PickerStatusFlags |= PickerStatusFlags.OutOfRange;
            }
        }

        if (Picker.modeTarget.HasFlag(UiPickerType.LocIsClear))
        {
            if (!IsTargetLocationClear(targetLocation))
            {
                PickerStatusFlags |= PickerStatusFlags.Invalid;
            }
        }

        return(true);
    }
    internal override bool LeftMouseButtonReleased(IGameViewport viewport, MessageMouseArgs args)
    {
        ClearResults();

        var targetLocation = GameViews.Primary.ScreenToTile(args.X, args.Y);

        var distance = Picker.caster.GetLocationFull().DistanceTo(targetLocation);

        // TODO: This seems like a bug, since range seems to be in feet, but the distance is in inches
        // TODO: Second bug: Radius of caster is ignored (see MouseMove)
        if (distance >= Picker.range)
        {
            return(true);
        }


        if (Picker.modeTarget.HasFlag(UiPickerType.LocIsClear))
        {
            if (!IsTargetLocationClear(targetLocation))
            {
                return(true);
            }
        }

        SetResultLocation(targetLocation);
        return(FinalizePicker());
    }
    internal override bool LeftMouseButtonReleased(IGameViewport viewport, MessageMouseArgs args)
    {
        MouseMoved(viewport, args);

        if (WallState == WallState.StartPoint)
        {
            WallState     = WallState.EndPoint;
            Result.flags |= PickerResultFlags.PRF_HAS_LOCATION;
        }

        else if (WallState == WallState.EndPoint)
        {
            var mouseLoc     = GameViews.Primary.ScreenToTile(args.X, args.Y);
            var mouseLocTrim =
                GameSystems.Location.TrimToLength(Result.location, mouseLoc, Picker.trimmedRangeInches);
            _wallEndPoint = mouseLocTrim;

            return(FinalizePicker());
        }

        else if (WallState == WallState.CenterPoint)
        {
            WallState = WallState.Radius;
        }

        else if (WallState == WallState.Radius)
        {
            return(FinalizePicker());
        }

        return(true);
    }
    internal override bool MouseMoved(IGameViewport viewport, MessageMouseArgs args)
    {
        var location = GameViews.Primary.ScreenToTile(args.X, args.Y);

        Picker.SetConeTargets(location);
        return(false);
    }
示例#7
0
    public override bool HandleMouseMessage(MessageMouseArgs msg)
    {
        // Forward scroll wheel messages to the scrollbar.
        if ((msg.flags & MouseEventFlag.ScrollWheelChange) != 0)
        {
            _scrollbar.HandleMouseMessage(msg);
            return(true);
        }

        return(base.HandleMouseMessage(msg));
    }
示例#8
0
    internal override bool MouseMoved(IGameViewport viewport, MessageMouseArgs args)
    {
        if (HandleClickInUnexploredArea(args.X, args.Y))
        {
            return(false);
        }

        var raycastFlags = PickerState.GetFlagsFromExclusions();

        if (!GameSystems.Raycast.PickObjectOnScreen(viewport, args.X, args.Y, out var target, raycastFlags))
        {
            PickerStatusFlags &= ~(PickerStatusFlags.Invalid | PickerStatusFlags.OutOfRange);
            PickerState.Target = null;
            return(true);
        }

        PickerState.Target = target;

        if (Picker.flagsTarget.HasFlag(UiPickerFlagsTarget.Exclude1st))
        {
            if (!Picker.TargetValid(target))
            {
                PickerStatusFlags |= PickerStatusFlags.Invalid;
            }
        }

        if (!Picker.CheckTargetVsIncFlags(target))
        {
            PickerStatusFlags |= PickerStatusFlags.Invalid;
        }

        if (!Picker.flagsTarget.HasFlag(UiPickerFlagsTarget.LosNotRequired) && Picker.LosBlocked(target))
        {
            PickerStatusFlags |= PickerStatusFlags.Invalid;
        }

        if (Picker.flagsTarget.HasFlag(UiPickerFlagsTarget.Range))
        {
            // TODO: This distance check seems bugged too (feet vs. inch, no radius considered)
            var dist = Picker.caster.GetLocationFull().DistanceTo(target.GetLocationFull());

            if (dist > Picker.range)
            {
                PickerStatusFlags |= PickerStatusFlags.OutOfRange;
            }
        }

        return(true);
    }
    internal override bool MouseMoved(IGameViewport viewport, MessageMouseArgs args)
    {
        PickerStatusFlags &= ~PickerStatusFlags.Invalid;

        if (HandleClickInUnexploredArea(args.X, args.Y))
        {
            return(false);
        }

        // The picker may allow picking an object directly (which will be the basis of the area effect)
        if (Picker.modeTarget.HasFlag(UiPickerType.AreaOrObj))
        {
            var flags = PickerState.GetFlagsFromExclusions();
            if (GameSystems.Raycast.PickObjectOnScreen(viewport, args.X, args.Y, out var target, flags))
            {
                if ((Picker.flagsTarget.HasFlag(UiPickerFlagsTarget.LosNotRequired) || !Picker.LosBlocked(target)) &&
                    Picker.CheckTargetVsIncFlags(target) &&
                    Picker.TargetValid(target))
                {
                    ClearResults();
                    Picker.SetAreaTargets(target.GetLocationFull());
                    Result.flags |= PickerResultFlags.PRF_HAS_SELECTED_OBJECT;

                    // Sort the primary focus of selection to the beginning of the list,
                    // But don't insert it if it isn't in the list already
                    if (Result.objList.Remove(target))
                    {
                        Result.objList.Insert(0, target);
                    }

                    return(false);
                }
            }
        }

        var targetLoc = GameViews.Primary.ScreenToTile(args.X, args.Y);

        // Even when the picked object above is not valid, targeting the location underneath is a valid alternative
        if (!Picker.flagsTarget.HasFlag(UiPickerFlagsTarget.LosNotRequired) &&
            !HasLineOfSight(Picker.caster, targetLoc))
        {
            ClearResults();
            PickerStatusFlags |= PickerStatusFlags.Invalid;
            return(false);
        }

        Picker.SetAreaTargets(targetLoc);
        return(false);
    }
    public override bool HandleMouseMessage(MessageMouseArgs msg)
    {
        if (base.HandleMouseMessage(msg))
        {
            return(true);
        }

        if (msg.flags.HasFlag(MouseEventFlag.ScrollWheelChange))
        {
            var curPos = mScrollBar.GetValue();
            var newPos = curPos - msg.wheelDelta / 10;
            mScrollBar.SetValue(newPos);
        }

        return(true);
    }
        public override bool HandleMouseMessage(MessageMouseArgs msg)
        {
            if (Globals.UiManager.GetMouseCaptureWidget() == this)
            {
                if (msg.flags.HasFlag(MouseEventFlag.PosChange))
                {
                    int curY = mDragY + msg.Y - mDragGrabPoint;

                    int scrollRange = mScrollBar.GetScrollRange();
                    var vPercent    = (curY - mScrollBar.mUpButton.Height) / (float)scrollRange;
                    if (vPercent < 0)
                    {
                        vPercent = 0;
                    }
                    else if (vPercent > 1)
                    {
                        vPercent = 1;
                    }

                    var newVal = mScrollBar.mMin + (mScrollBar._max - mScrollBar.mMin) * vPercent;

                    mScrollBar.SetValue((int)newVal);
                }

                if (msg.flags.HasFlag(MouseEventFlag.LeftReleased))
                {
                    Globals.UiManager.UnsetMouseCaptureWidget(this);
                }
            }
            else
            {
                if (msg.flags.HasFlag(MouseEventFlag.LeftClick))
                {
                    Globals.UiManager.SetMouseCaptureWidget(this);
                    mDragGrabPoint = msg.Y;
                    mDragY         = Y;
                }
                else if ((msg.flags & MouseEventFlag.ScrollWheelChange) != 0)
                {
                    // Forward scroll wheel message to parent
                    mScrollBar.HandleMouseMessage(msg);
                }
            }

            return(true);
        }
        public override bool HandleMouseMessage(MessageMouseArgs msg)
        {
            if (Globals.UiManager.GetMouseCaptureWidget() == this)
            {
                if (msg.flags.HasFlag(MouseEventFlag.PosChange))
                {
                    int curX = _dragX + msg.X - _dragGrabPoint;

                    var hPercent = (curX - TrackStart) / (float)_slider.GetTrackWidth();
                    if (hPercent < 0)
                    {
                        hPercent = 0;
                    }
                    else if (hPercent > 1)
                    {
                        hPercent = 1;
                    }

                    var newVal = _slider.mMin + (_slider.mMax - _slider.mMin) * hPercent;

                    _slider.SetValue((int)Math.Round(newVal));
                }

                if (msg.flags.HasFlag(MouseEventFlag.LeftReleased))
                {
                    Globals.UiManager.UnsetMouseCaptureWidget(this);
                }
            }
            else
            {
                if (msg.flags.HasFlag(MouseEventFlag.LeftHeld))
                {
                    Globals.UiManager.SetMouseCaptureWidget(this);
                    _dragGrabPoint = msg.X;
                    _dragX         = X;
                }
                else if ((msg.flags & MouseEventFlag.ScrollWheelChange) != 0)
                {
                    // Forward scroll wheel message to parent
                    _slider.HandleMouseMessage(msg);
                }
            }

            return(true);
        }
示例#13
0
    private bool OnMouseMove(MessageMouseArgs arg)
    {
        if (_rotationMode == 1)
        {
            _rotationMode  = 2;
            _rotationPivot = arg.X;
            return(true);
        }
        else if (_rotationMode == 2)
        {
            int deltaX = arg.X - _rotationPivot;
            _rotation     -= deltaX * Angles.ToRadians(1.8f);
            _rotationPivot = arg.X;
            return(true);
        }

        return(false);
    }
    } // gets width of usable track area

    public override bool HandleMouseMessage(MessageMouseArgs msg)
    {
        if ((msg.flags & MouseEventFlag.ScrollWheelChange) != 0)
        {
            if (msg.wheelDelta > 0)
            {
                SetValue(GetValue() - Quantum);
            }
            else if (msg.wheelDelta < 0)
            {
                SetValue(GetValue() + Quantum);
            }

            return(true);
        }

        return(base.HandleMouseMessage(msg));
    }
    internal override bool MouseMoved(IGameViewport viewport, MessageMouseArgs args)
    {
        ClearResults();

        if (WallState == WallState.StartPoint || WallState == WallState.CenterPoint)
        {
            // get startpoint location from mouse
            SetResultLocationFromMouse(args);
            return(true);
        }

        var mouseLoc = GameViews.Primary.ScreenToTile(args.X, args.Y);

        Trace.Assert(Result.HasLocation);

        var maxRange = (float)(Picker.range * locXY.INCH_PER_FEET);
        var dist     = Result.location.DistanceTo(mouseLoc);

        if (maxRange > dist)
        {
            maxRange = dist;
        }

        if (WallState == WallState.EndPoint)
        {
            // get radius and range up to mouse (trimmed by walls and such)
            var radiusInch = Picker.radiusTarget * locXY.INCH_PER_FEET / 2.0f;
            Picker.GetTrimmedRange(Result.location, mouseLoc, radiusInch, maxRange, locXY.INCH_PER_FEET * 5.0f);
            // TODO: the 2.35 might be unneeded
            Picker.degreesTarget =
                2.3561945f -
                Result.location.RotationTo(mouseLoc); // putting this in radians, unlike the usual usage
            Picker.GetTargetsInPath(Result.location, mouseLoc, radiusInch);
            Picker.DoExclusions();
            return(true);
        }
        else if (WallState == WallState.Radius)
        {
            // todo
        }

        return(false);
    }
示例#16
0
    internal override bool LeftMouseButtonReleased(IGameViewport viewport, MessageMouseArgs args)
    {
        if (HandleClickInUnexploredArea(args.X, args.Y))
        {
            return(false);
        }

        ClearResults();

        var raycastFlags = PickerState.GetFlagsFromExclusions();

        if (!GameSystems.Raycast.PickObjectOnScreen(viewport, args.X, args.Y, out var objFound, raycastFlags))
        {
            return(false);
        }

        if (!PickerState.Picker.flagsTarget.HasFlag(UiPickerFlagsTarget.LosNotRequired) &&
            PickerState.Picker.LosBlocked(objFound))
        {
            return(false);
        }

        if (PickerState.Picker.flagsTarget.HasFlag(UiPickerFlagsTarget.Exclude1st) &&
            !PickerState.Picker.TargetValid(objFound))
        {
            return(false);
        }

        if (!PickerState.Picker.CheckTargetVsIncFlags(objFound))
        {
            return(false);
        }

        Result.flags  = PickerResultFlags.PRF_HAS_SINGLE_OBJ;
        Result.handle = objFound;
        SetResultLocation(objFound);

        return(FinalizePicker());
    }
    internal override bool RightMouseButtonReleased(IGameViewport viewport, MessageMouseArgs args)
    {
        ClearResults();

        if (WallState == WallState.StartPoint || WallState == WallState.CenterPoint)
        {
            Result.flags = PickerResultFlags.PRF_CANCELLED;
            Picker.callback?.Invoke(ref Result, PickerState.CallbackArgs);
            return(true);
        }

        if (WallState == WallState.EndPoint)
        {
            WallState     = WallState.StartPoint;
            _wallEndPoint = LocAndOffsets.Zero;
        }
        else if (WallState == WallState.Radius)
        {
            WallState = WallState.CenterPoint;
        }

        return(true);
    }
    internal override bool LeftMouseButtonReleased(IGameViewport viewport, MessageMouseArgs args)
    {
        ClearResults();

        var raycastFlags = PickerState.GetFlagsFromExclusions();

        if (!GameSystems.Raycast.PickObjectOnScreen(viewport, args.X, args.Y, out var target, raycastFlags) ||
            target != Picker.caster)
        {
            return(true);
        }

        if (!Picker.flagsTarget.HasFlag(UiPickerFlagsTarget.Radius))
        {
            Picker.SetSingleTgt(target);
        }
        else
        {
            Picker.SetAreaTargets(target.GetLocationFull());
        }

        return(FinalizePicker());
    }
示例#19
0
    public void TestMouseWheelZoom()
    {
        TakeScreenshot("before_zoom");

        IGameViewport gv = UiSystems.GameView;

        gv.Zoom.Should().Be(1.0f);
        var initialCenter = gv.CenteredOn.ToInches2D(); // Remember where it's centered now

        // One "pip" of scroll-wheel -> 10% zoom
        var msg = new MessageMouseArgs(0, 0, 1, MouseEventFlag.ScrollWheelChange);

        UiSystems.GameView.HandleMouseMessage(msg);
        TakeScreenshot("after_zoom1");
        gv.Zoom.Should().BeApproximately(1.1f, 0.001f);

        UiSystems.GameView.HandleMouseMessage(msg);
        TakeScreenshot("after_zoom2");
        gv.Zoom.Should().BeApproximately(1.2f, 0.001f);

        // Check that the camera stays centered on the original center
        var centerAfterZoom           = gv.CenteredOn.ToInches2D();
        var distanceFromInitialCenter = Vector2.Subtract(initialCenter, centerAfterZoom).Length();

        distanceFromInitialCenter.Should().BeLessOrEqualTo(3);

        // Initiate and immediately release MMB scrolling because previously the state would get de-synched
        // and cause the view to jerk around
        UiSystems.GameView.HandleMouseMessage(new MessageMouseArgs(0, 0, 0, MouseEventFlag.MiddleClick));
        UiSystems.GameView.HandleMouseMessage(new MessageMouseArgs(1, 0, 0, MouseEventFlag.PosChange));
        UiSystems.GameView.HandleMouseMessage(new MessageMouseArgs(-1, 0, 0, MouseEventFlag.PosChange));
        UiSystems.GameView.HandleMouseMessage(new MessageMouseArgs(0, 0, 0, MouseEventFlag.MiddleReleased));
        var centerAfterMove = gv.CenteredOn.ToInches2D();

        Vector2.Subtract(centerAfterZoom, centerAfterMove).Length().Should().BeLessOrEqualTo(3);
    }
示例#20
0
    public override bool HandleMouseMessage(MessageMouseArgs msg)
    {
        var area = GetContentArea();

        // Iterate in reverse order since this list is ordered in ascending z-order
        for (var i = mChildren.Count - 1; i >= 0; i--)
        {
            var child = mChildren[i];

            int x = msg.X - area.X;
            int y = msg.Y - area.Y + GetScrollOffsetY();

            if (child.Visible & x >= child.X && y >= child.Y && x < child.X + child.Width &&
                y < child.Y + child.Height)
            {
                if (child.HandleMouseMessage(msg))
                {
                    return(true);
                }
            }
        }

        return(base.HandleMouseMessage(msg));
    }
 internal override bool LeftMouseButtonClicked(IGameViewport viewport, MessageMouseArgs args)
 {
     return(true);
 }
示例#22
0
    private bool HandleMouseMessage(MessageMouseArgs msg)
    {
        if (msg.flags.HasFlag(MouseEventFlag.LeftReleased))
        {
            if (UiSystems.CharSheet.State == CharInventoryState.CastingSpell)
            {
                UiSystems.CharSheet.CallItemPickCallback(CurrentItem);
                return(true);
            }

            var droppedOn = Globals.UiManager.GetWidgetAt(msg.X, msg.Y);
            var item      = UiSystems.CharSheet.Inventory.DraggedObject;
            if (item == null || droppedOn == _slotWidget)
            {
                return(true);
            }

            if (droppedOn is PaperdollSlotWidget targetSlotWidget)
            {
                Insert(ActingCritter, CurrentItem, targetSlotWidget);
            }
            else if (droppedOn == UiSystems.CharSheet.Inventory.UseItemWidget)
            {
                UseItem(ActingCritter, CurrentItem);
            }
            else if (droppedOn == UiSystems.CharSheet.Inventory.DropItemWidget)
            {
                DropItem(ActingCritter, CurrentItem);
            }
            else if (UiSystems.CharSheet.State == CharInventoryState.Looting &&
                     UiSystems.CharSheet.Looting.TryGetInventoryIdxForWidget(droppedOn, out var lootingInvIdx))
            {
                InsertIntoLootContainer(ActingCritter, CurrentItem, lootingInvIdx);
            }
            else if (UiSystems.CharSheet.State == CharInventoryState.Bartering &&
                     UiSystems.CharSheet.Looting.TryGetInventoryIdxForWidget(droppedOn, out var barterInvIdx))
            {
                InsertIntoBarterContainer(ActingCritter, CurrentItem, barterInvIdx);
            }
            else if (UiSystems.Party.TryGetPartyMemberByWidget(droppedOn, out var partyMember))
            {
                InsertIntoPartyPortrait(ActingCritter, CurrentItem, partyMember);
            }
            else if (UiSystems.CharSheet.Inventory.TryGetInventoryIdxForWidget(droppedOn, out var invIdx))
            {
                InsertIntoInventorySlot(ActingCritter, CurrentItem, invIdx);
            }

            UiSystems.CharSheet.Inventory.DraggedObject = null;
            Tig.Mouse.ClearDraggedIcon();
        }
        else if (msg.flags.HasFlag(MouseEventFlag.RightReleased))
        {
            var critter = ActingCritter;
            var item    = CurrentItem;
            if (item != null)
            {
                // If the item is in another container, then we'll simply try to take it
                if (GameSystems.Item.GetParent(item) != critter)
                {
                }
                // If the item is currently equipped, unequip it,
                else if (GameSystems.Item.IsEquipped(item))
                {
                    UnequipItem(item, critter);
                }
                // otherwise equip it
                else
                {
                    EquipItem(item, critter);
                }
            }

            return(true);
        }

        return(true);
    }
 internal override bool LeftMouseButtonReleased(IGameViewport viewport, MessageMouseArgs args)
 {
     MouseMoved(viewport, args);
     return(FinalizePicker());
 }
 public Message(MessageMouseArgs mouseArgs) : this(MessageType.MOUSE)
 {
     MouseArgs = mouseArgs;
 }
示例#25
0
    private bool AbilityScoreMouseHandler(MessageMouseArgs msg, AbilityScoreValueWidget widget)
    {
        if (Globals.UiManager.GetMouseCaptureWidget() == widget)
        {
            if ((msg.flags & MouseEventFlag.LeftReleased) != 0)
            {
                Tig.Mouse.SetCursorDrawCallback(null);
                Globals.UiManager.UnsetMouseCaptureWidget(widget);
                widget.IsDragging = false;

                var widgetUnderCursor = Globals.UiManager.GetWidgetAt(msg.X, msg.Y);
                if (widgetUnderCursor is AbilityScoreValueWidget otherAbilityScoreValue)
                {
                    // Swap the two values
                    var tmp = otherAbilityScoreValue.Value;
                    otherAbilityScoreValue.Value = widget.Value;
                    widget.Value = tmp;

                    OnAbilityScoresChanged();
                }
            }

            return(true);
        }

        if (widget.Value == -1)
        {
            // Do not allow interaction with unassigned ability scores
            return(true);
        }

        // Allow quickly swapping values between the two columns, but only when we actually have rolled values
        // (not in point buy mode)
        if (!_pkt.isPointbuy && (msg.flags & MouseEventFlag.RightClick) != 0)
        {
            var destinationPool = widget.IsAssigned ? charGenRolledStats : _pkt.abilityStats;
            for (var i = 0; i < destinationPool.Length; i++)
            {
                if (destinationPool[i] == -1)
                {
                    destinationPool[i] = widget.Value;
                    widget.Value       = -1;
                    OnAbilityScoresChanged();
                    return(true);
                }
            }
        }
        else if ((msg.flags & MouseEventFlag.LeftHeld) != 0)
        {
            if (!Globals.UiManager.SetMouseCaptureWidget(widget))
            {
                // Something else has the mouse capture right now (how are we getting this message then...?)
                return(true);
            }

            // Figure out where in the widget we got clicked so we can draw the dragged text with the proper offset
            var globalContentArea = widget.GetContentArea(true);
            var localX            = msg.X - globalContentArea.X;
            var localY            = msg.Y - globalContentArea.Y;
            _draggedAbilityScoreLabel.Text = widget.Value.ToString();
            widget.IsDragging = true;

            // This will draw the ability score being dragged under the mouse cursor
            Tig.Mouse.SetCursorDrawCallback((x, y, arg) =>
            {
                var point = new Point(x, y);
                point.Offset(-localX, -localY);
                var contentArea = new Rectangle(point, widget.GetSize());

                _draggedAbilityScoreLabel.SetBounds(contentArea);
                _draggedAbilityScoreLabel.Render();
            });
        }

        return(true);
    }