void BindStanceButton(ButtonWidget button, UnitStance stance)
        {
            WidgetUtils.BindButtonIcon(button);

            button.IsDisabled    = () => { UpdateStateIfNecessary(); return(!actorStances.Any()); };
            button.IsHighlighted = () => actorStances.Any(
                at => !at.Trait.IsTraitDisabled && at.Trait.PredictedStance == stance);
            button.OnClick = () => SetSelectionStance(stance);
        }
Exemplo n.º 2
0
        public CommandBarLogic(Widget widget, World world, Dictionary <string, MiniYaml> logicArgs)
        {
            this.world = world;

            var highlightOnButtonPress = false;

            if (logicArgs.ContainsKey("HighlightOnButtonPress"))
            {
                highlightOnButtonPress = FieldLoader.GetValue <bool>("HighlightOnButtonPress", logicArgs["HighlightOnButtonPress"].Value);
            }

            var attackMoveButton = widget.GetOrNull <ButtonWidget>("ATTACK_MOVE");

            if (attackMoveButton != null)
            {
                WidgetUtils.BindButtonIcon(attackMoveButton);

                attackMoveButton.IsDisabled    = () => { UpdateStateIfNecessary(); return(attackMoveDisabled); };
                attackMoveButton.IsHighlighted = () => world.OrderGenerator is AttackMoveOrderGenerator;

                Action <bool> toggle = allowCancel =>
                {
                    if (attackMoveButton.IsHighlighted())
                    {
                        if (allowCancel)
                        {
                            world.CancelInputMode();
                        }
                    }
                    else
                    {
                        world.OrderGenerator = new AttackMoveOrderGenerator(selectedActors, Game.Settings.Game.MouseButtonPreference.Action);
                    }
                };

                attackMoveButton.OnClick    = () => toggle(true);
                attackMoveButton.OnKeyPress = _ => toggle(false);
            }

            var forceMoveButton = widget.GetOrNull <ButtonWidget>("FORCE_MOVE");

            if (forceMoveButton != null)
            {
                WidgetUtils.BindButtonIcon(forceMoveButton);

                forceMoveButton.IsDisabled    = () => { UpdateStateIfNecessary(); return(forceMoveDisabled); };
                forceMoveButton.IsHighlighted = () => !forceMoveButton.IsDisabled() && IsForceModifiersActive(Modifiers.Alt);
                forceMoveButton.OnClick       = () =>
                {
                    if (forceMoveButton.IsHighlighted())
                    {
                        world.CancelInputMode();
                    }
                    else
                    {
                        world.OrderGenerator = new ForceModifiersOrderGenerator(Modifiers.Alt, true);
                    }
                };
            }

            var forceAttackButton = widget.GetOrNull <ButtonWidget>("FORCE_ATTACK");

            if (forceAttackButton != null)
            {
                WidgetUtils.BindButtonIcon(forceAttackButton);

                forceAttackButton.IsDisabled    = () => { UpdateStateIfNecessary(); return(forceAttackDisabled); };
                forceAttackButton.IsHighlighted = () => !forceAttackButton.IsDisabled() && IsForceModifiersActive(Modifiers.Ctrl) &&
                                                  !(world.OrderGenerator is AttackMoveOrderGenerator);

                forceAttackButton.OnClick = () =>
                {
                    if (forceAttackButton.IsHighlighted())
                    {
                        world.CancelInputMode();
                    }
                    else
                    {
                        world.OrderGenerator = new ForceModifiersOrderGenerator(Modifiers.Ctrl, true);
                    }
                };
            }

            var guardButton = widget.GetOrNull <ButtonWidget>("GUARD");

            if (guardButton != null)
            {
                WidgetUtils.BindButtonIcon(guardButton);

                guardButton.IsDisabled    = () => { UpdateStateIfNecessary(); return(guardDisabled); };
                guardButton.IsHighlighted = () => world.OrderGenerator is GuardOrderGenerator;

                Action <bool> toggle = allowCancel =>
                {
                    if (guardButton.IsHighlighted())
                    {
                        if (allowCancel)
                        {
                            world.CancelInputMode();
                        }
                    }
                    else
                    {
                        world.OrderGenerator = new GuardOrderGenerator(selectedActors,
                                                                       "Guard", "guard", Game.Settings.Game.MouseButtonPreference.Action);
                    }
                };

                guardButton.OnClick    = () => toggle(true);
                guardButton.OnKeyPress = _ => toggle(false);
            }

            var scatterButton = widget.GetOrNull <ButtonWidget>("SCATTER");

            if (scatterButton != null)
            {
                WidgetUtils.BindButtonIcon(scatterButton);

                scatterButton.IsDisabled    = () => { UpdateStateIfNecessary(); return(scatterDisabled); };
                scatterButton.IsHighlighted = () => scatterHighlighted > 0;
                scatterButton.OnClick       = () =>
                {
                    if (highlightOnButtonPress)
                    {
                        scatterHighlighted = 2;
                    }

                    PerformKeyboardOrderOnSelection(a => new Order("Scatter", a, false));
                };

                scatterButton.OnKeyPress = ki => { scatterHighlighted = 2; scatterButton.OnClick(); };
            }

            var deployButton = widget.GetOrNull <ButtonWidget>("DEPLOY");

            if (deployButton != null)
            {
                WidgetUtils.BindButtonIcon(deployButton);

                deployButton.IsDisabled = () =>
                {
                    UpdateStateIfNecessary();

                    var queued = Game.GetModifierKeys().HasModifier(Modifiers.Shift);
                    return(!selectedDeploys.Any(pair => pair.Trait.CanIssueDeployOrder(pair.Actor, queued)));
                };

                deployButton.IsHighlighted = () => deployHighlighted > 0;
                deployButton.OnClick       = () =>
                {
                    if (highlightOnButtonPress)
                    {
                        deployHighlighted = 2;
                    }

                    var queued = Game.GetModifierKeys().HasModifier(Modifiers.Shift);
                    PerformDeployOrderOnSelection(queued);
                };

                deployButton.OnKeyPress = ki => { deployHighlighted = 2; deployButton.OnClick(); };
            }

            var stopButton = widget.GetOrNull <ButtonWidget>("STOP");

            if (stopButton != null)
            {
                WidgetUtils.BindButtonIcon(stopButton);

                stopButton.IsDisabled    = () => { UpdateStateIfNecessary(); return(stopDisabled); };
                stopButton.IsHighlighted = () => stopHighlighted > 0;
                stopButton.OnClick       = () =>
                {
                    if (highlightOnButtonPress)
                    {
                        stopHighlighted = 2;
                    }

                    PerformKeyboardOrderOnSelection(a => new Order("Stop", a, false));
                };

                stopButton.OnKeyPress = ki => { stopHighlighted = 2; stopButton.OnClick(); };
            }

            var queueOrdersButton = widget.GetOrNull <ButtonWidget>("QUEUE_ORDERS");

            if (queueOrdersButton != null)
            {
                WidgetUtils.BindButtonIcon(queueOrdersButton);

                queueOrdersButton.IsDisabled    = () => { UpdateStateIfNecessary(); return(waypointModeDisabled); };
                queueOrdersButton.IsHighlighted = () => !queueOrdersButton.IsDisabled() && IsForceModifiersActive(Modifiers.Shift);
                queueOrdersButton.OnClick       = () =>
                {
                    if (queueOrdersButton.IsHighlighted())
                    {
                        world.CancelInputMode();
                    }
                    else
                    {
                        world.OrderGenerator = new ForceModifiersOrderGenerator(Modifiers.Shift, false);
                    }
                };
            }

            var keyOverrides = widget.GetOrNull <LogicKeyListenerWidget>("MODIFIER_OVERRIDES");

            if (keyOverrides != null)
            {
                var noShiftButtons = new[] { guardButton, deployButton, attackMoveButton };
                var keyUpButtons   = new[] { guardButton, attackMoveButton };
                keyOverrides.AddHandler(e =>
                {
                    // HACK: allow command buttons to be triggered if the shift (queue order modifier) key is held
                    if (e.Modifiers.HasModifier(Modifiers.Shift))
                    {
                        var eNoShift        = e;
                        eNoShift.Modifiers &= ~Modifiers.Shift;

                        foreach (var b in noShiftButtons)
                        {
                            // Button is not used by this mod
                            if (b == null)
                            {
                                continue;
                            }

                            // Button is not valid for this event
                            if (b.IsDisabled() || !b.Key.IsActivatedBy(eNoShift))
                            {
                                continue;
                            }

                            // Event is not valid for this button
                            if (!(b.DisableKeyRepeat ^ e.IsRepeat) || (e.Event == KeyInputEvent.Up && !keyUpButtons.Contains(b)))
                            {
                                continue;
                            }

                            b.OnKeyPress(e);
                            return(true);
                        }
                    }

                    // HACK: Attack move can be triggered if the ctrl (assault move modifier)
                    // or shift (queue order modifier) keys are pressed, on both key down and key up
                    var eNoMods        = e;
                    eNoMods.Modifiers &= ~(Modifiers.Ctrl | Modifiers.Shift);

                    if (attackMoveButton != null && !attackMoveDisabled && attackMoveButton.Key.IsActivatedBy(eNoMods))
                    {
                        attackMoveButton.OnKeyPress(e);
                        return(true);
                    }

                    return(false);
                });
            }
        }