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); }
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); }); } }