Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions forge-gui/src/main/java/forge/gamemodes/match/AbstractGuiGame.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import forge.game.event.GameEventSpellRemovedFromStack;
import forge.game.player.PlayerView;
import forge.gamemodes.net.DeltaPacket;
import forge.gamemodes.net.client.NetGameController;
import forge.gui.FThreads;
import forge.gui.GuiBase;
import forge.gui.control.FControlGameEventHandler;
Expand Down Expand Up @@ -613,6 +614,13 @@ public final void setShouldAutoYield(final String key, final boolean autoYield)
} else {
autoYields.remove(yieldPerAbility ? abilityKey : key);
}
// Sync to server in network games (NetGameController is the only
// controller that needs to send — this avoids re-entrancy when the
// server-side PlayerControllerHuman applies the received notification)
final IGameController gc = getGameController();
if (gc instanceof NetGameController) {
gc.notifyAutoYieldChanged(key, autoYield);
}
}

private boolean disableAutoYields;
Expand Down Expand Up @@ -643,14 +651,24 @@ public final boolean shouldAlwaysDeclineTrigger(final int trigger) {
@Override
public final void setShouldAlwaysAcceptTrigger(final int trigger) {
triggersAlwaysAccept.put(trigger, Boolean.TRUE);
notifyTriggerChoice(trigger, TriggerChoice.ALWAYS_YES);
}
@Override
public final void setShouldAlwaysDeclineTrigger(final int trigger) {
triggersAlwaysAccept.put(trigger, Boolean.FALSE);
notifyTriggerChoice(trigger, TriggerChoice.ALWAYS_NO);
}
@Override
public final void setShouldAlwaysAskTrigger(final int trigger) {
triggersAlwaysAccept.remove(trigger);
notifyTriggerChoice(trigger, TriggerChoice.ASK);
}

private void notifyTriggerChoice(final int trigger, final TriggerChoice choice) {
final IGameController gc = getGameController();
if (gc instanceof NetGameController) {
gc.notifyTriggerChoiceChanged(trigger, choice);
}
}

// End of Triggers preliminary choice
Expand Down
11 changes: 11 additions & 0 deletions forge-gui/src/main/java/forge/gamemodes/match/TriggerChoice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package forge.gamemodes.match;

/**
* Per-trigger user choice for optional triggered abilities.
* Carried over the wire by {@code IGameController.notifyTriggerChoiceChanged}.
*/
public enum TriggerChoice {
ASK,
ALWAYS_YES,
ALWAYS_NO
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import forge.game.player.PlayerView;
import forge.game.spellability.SpellAbilityView;
import forge.gamemodes.match.NextGameDecision;
import forge.gamemodes.match.TriggerChoice;
import forge.gui.GuiBase;
import forge.gui.interfaces.IGuiGame;
import forge.interfaces.IGameController;
Expand Down Expand Up @@ -95,7 +96,8 @@ public enum ProtocolMethod implements IHasForgeLog {
alphaStrike (Mode.CLIENT, Void.TYPE),
reorderHand (Mode.CLIENT, Void.TYPE, CardView.class, Integer.TYPE),
requestResync (Mode.CLIENT, Void.TYPE),
;
notifyAutoYieldChanged (Mode.CLIENT, Void.TYPE, String.class, Boolean.TYPE),
notifyTriggerChoiceChanged(Mode.CLIENT, Void.TYPE, Integer.TYPE, TriggerChoice.class);

private enum Mode {
SERVER(IGuiGame.class),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import forge.game.player.actions.PlayerAction;
import forge.game.spellability.SpellAbilityView;
import forge.gamemodes.match.NextGameDecision;
import forge.gamemodes.match.TriggerChoice;
import forge.gamemodes.net.GameProtocolSender;
import forge.gamemodes.net.ProtocolMethod;
import forge.interfaces.IDevModeCheats;
Expand Down Expand Up @@ -126,6 +127,16 @@ public void requestResync() {
send(ProtocolMethod.requestResync);
}

@Override
public void notifyAutoYieldChanged(String key, boolean autoYield) {
send(ProtocolMethod.notifyAutoYieldChanged, key, autoYield);
}

@Override
public void notifyTriggerChoiceChanged(int triggerId, TriggerChoice choice) {
send(ProtocolMethod.notifyTriggerChoiceChanged, triggerId, choice);
}

private IMacroSystem macros;
@Override
public IMacroSystem macros() {
Expand Down
6 changes: 6 additions & 0 deletions forge-gui/src/main/java/forge/interfaces/IGameController.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import forge.game.player.PlayerView;
import forge.game.spellability.SpellAbilityView;
import forge.gamemodes.match.NextGameDecision;
import forge.gamemodes.match.TriggerChoice;
import forge.util.ITriggerEvent;

public interface IGameController {
Expand Down Expand Up @@ -52,4 +53,9 @@ public interface IGameController {
*/
void requestResync();

/** Notify server that auto-yield was toggled for an ability key. */
default void notifyAutoYieldChanged(String key, boolean autoYield) { }
Comment thread
tool4ever marked this conversation as resolved.
Outdated

/** Notify server that a trigger accept/decline preference changed. */
default void notifyTriggerChoiceChanged(int triggerId, TriggerChoice choice) { }
}
20 changes: 20 additions & 0 deletions forge-gui/src/main/java/forge/player/PlayerControllerHuman.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.gamemodes.match.NextGameDecision;
import forge.gamemodes.match.TriggerChoice;
import forge.gamemodes.match.input.*;
import forge.util.IHasForgeLog;
import forge.gui.FThreads;
Expand Down Expand Up @@ -3489,4 +3490,23 @@ public void requestResync() {
// No-op for local games - resync is only used for network play
}

@Override
public void notifyAutoYieldChanged(String key, boolean autoYield) {
getGui().setShouldAutoYield(key, autoYield);
}

@Override
public void notifyTriggerChoiceChanged(int triggerId, TriggerChoice choice) {
switch (choice) {
case ALWAYS_YES:
getGui().setShouldAlwaysAcceptTrigger(triggerId);
break;
case ALWAYS_NO:
getGui().setShouldAlwaysDeclineTrigger(triggerId);
break;
case ASK:
getGui().setShouldAlwaysAskTrigger(triggerId);
break;
}
}
}
Loading