diff --git a/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/actors/CardsGroup.java b/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/actors/CardsGroup.java index 71682e3..657d50e 100644 --- a/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/actors/CardsGroup.java +++ b/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/actors/CardsGroup.java @@ -1,5 +1,6 @@ package eu.jonahbauer.wizard.client.libgdx.actors; +import com.badlogic.gdx.Input; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; @@ -60,6 +61,7 @@ public class CardsGroup extends WidgetGroup { @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { if (pointer != 0) return false; + if (button != Input.Buttons.LEFT) return false; if (event.getTarget() instanceof CardActor card) { dragTarget = card; dragStartX = x; @@ -93,6 +95,7 @@ public class CardsGroup extends WidgetGroup { @Override public void touchUp(InputEvent event, float x, float y, int pointer, int button) { if (pointer != 0) return; + if (button != Input.Buttons.LEFT) return; if (!dragging && dragTarget != null) { if (onClickListener != null) { onClickListener.accept(dragTarget); diff --git a/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/CreateGameScreen.java b/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/CreateGameScreen.java index f6021ef..8223a02 100644 --- a/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/CreateGameScreen.java +++ b/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/CreateGameScreen.java @@ -14,6 +14,7 @@ import lombok.extern.log4j.Log4j2; @Log4j2 public class CreateGameScreen extends MenuScreen { + private static final int MAX_SESSION_NAME_LENGTH = 20; private TextButton buttonBack; private TextButton buttonContinue; @@ -60,7 +61,7 @@ public class CreateGameScreen extends MenuScreen { sessionName = new TextField("", skin); sessionName.setPosition(WizardGame.WIDTH * 0.3f, WizardGame.HEIGHT * 0.5f); sessionName.setSize(0.4f * WizardGame.WIDTH, 64); - sessionName.setMaxLength(20); + sessionName.setMaxLength(MAX_SESSION_NAME_LENGTH); sessionName.addListener(errorListener); sessionName.setProgrammaticChangeEvents(true); @@ -75,7 +76,11 @@ public class CreateGameScreen extends MenuScreen { public void changed(ChangeEvent event, Actor actor) { var player = playerName.getText(); var session = sessionName.getText(); - if (session.isEmpty() || session.equals(format.formatted(oldPlayerName))) { + var previousSuggestion = format.formatted(oldPlayerName); + + boolean shouldApplySuggestion = session.isEmpty() + || previousSuggestion.startsWith(session) && (session.length() == MAX_SESSION_NAME_LENGTH || session.length() == previousSuggestion.length()); + if (shouldApplySuggestion) { if (player.isEmpty()) { sessionName.setText(""); } else { diff --git a/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/GameScreen.java b/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/GameScreen.java index f373375..bf08240 100644 --- a/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/GameScreen.java +++ b/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/GameScreen.java @@ -318,6 +318,7 @@ public class GameScreen extends WizardScreen { } if (currentAction == null && pendingSync.getAndSet(false)) { + doSetPersistentMessage(null); game.getClient().execute(Game.class, Game::sync); } @@ -732,11 +733,15 @@ public class GameScreen extends WizardScreen { execute(new TrumpOverlay(this, players.get(player), trumpCard, trumpSuit)); } - public void showColoredCardOverlay(@NotNull Card card, long timeout) { + public PlayColoredCardOverlay showColoredCardOverlay(@NotNull Card card, long timeout) { if (card == Card.JUGGLER) { - execute(new PlayColoredCardOverlay(this, timeout, card, Card.JUGGLER_RED, Card.JUGGLER_GREEN, Card.JUGGLER_BLUE, Card.JUGGLER_YELLOW)); + var overlay = new PlayColoredCardOverlay(this, timeout, card, Card.JUGGLER_RED, Card.JUGGLER_GREEN, Card.JUGGLER_BLUE, Card.JUGGLER_YELLOW); + execute(overlay); + return overlay; } else if (card == Card.CLOUD) { - execute(new PlayColoredCardOverlay(this, timeout, card, Card.CLOUD_RED, Card.CLOUD_GREEN, Card.CLOUD_BLUE, Card.CLOUD_YELLOW)); + var overlay = new PlayColoredCardOverlay(this, timeout, card, Card.CLOUD_RED, Card.CLOUD_GREEN, Card.CLOUD_BLUE, Card.CLOUD_YELLOW); + execute(overlay); + return overlay; } else { throw new IllegalArgumentException(); } @@ -808,21 +813,23 @@ public class GameScreen extends WizardScreen { public void setPersistentMessage(String key, Object...args) { var text = key == null ? null : args != null ? messages.format(key, args) : messages.get(key); - execute(() -> { - if (persistentMessage != null) { - persistentMessage.addAction(sequence( - delay(AnimationTimings.MESSAGE_HOLD), - alpha(0, AnimationTimings.MESSAGE_FADE), - removeActor() - )); - persistentMessage = null; - } + execute(() -> doSetPersistentMessage(text)); + } - if (text != null) { - persistentMessage = new Label(text, skin); - messageStack.addActor(persistentMessage); - } - }); + private void doSetPersistentMessage(String message) { + if (persistentMessage != null) { + persistentMessage.addAction(sequence( + delay(AnimationTimings.MESSAGE_HOLD), + alpha(0, AnimationTimings.MESSAGE_FADE), + removeActor() + )); + persistentMessage = null; + } + + if (message != null) { + persistentMessage = new Label(message, skin); + messageStack.addActor(persistentMessage); + } } // @@ -838,6 +845,11 @@ public class GameScreen extends WizardScreen { public void sync() { pendingSync.set(true); + execute(() -> { + if (pendingSync.get()) { + doSetPersistentMessage(messages.get("game.message.sync")); + } + }); } public void closeInteractionOverlay() { diff --git a/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/state/Game.java b/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/state/Game.java index a489762..3fa748c 100644 --- a/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/state/Game.java +++ b/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/state/Game.java @@ -331,13 +331,16 @@ public final class Game extends BaseState { if (isActive()) { if (currentInteraction.action() == PLAY_CARD) { if (card == Card.CLOUD || card == Card.JUGGLER) { - gameScreen.showColoredCardOverlay(card, currentInteraction.timeout()); + var oldOverlay = currentInteraction.overlay(); + if (oldOverlay != null) oldOverlay.close(); + + currentInteraction.overlay(gameScreen.showColoredCardOverlay(card, currentInteraction.timeout())); } else { send(client, new PlayCardMessage(card)); } return Optional.empty(); } else if (currentInteraction.action() == JUGGLE_CARD) { - if (send(client, new JuggleMessage(juggleCard))) { + if (send(client, new JuggleMessage(card))) { juggleCard = card; } return Optional.empty(); diff --git a/wizard-client/wizard-client-libgdx/core/src/main/resources/i18n/messages.properties b/wizard-client/wizard-client-libgdx/core/src/main/resources/i18n/messages.properties index 8b6b356..b102371 100644 --- a/wizard-client/wizard-client-libgdx/core/src/main/resources/i18n/messages.properties +++ b/wizard-client/wizard-client-libgdx/core/src/main/resources/i18n/messages.properties @@ -162,6 +162,7 @@ game.message.change_prediction.all=Everybody must change their prediction game.message.change_prediction.self=It is your turn to change your prediction game.message.timeout=Timed out +game.message.sync=Waiting for other players... game.message.nack.not_allowed=You cannot do that right now game.message.nack.too_fast=Please slow down diff --git a/wizard-client/wizard-client-libgdx/core/src/main/resources/i18n/messages_de.properties b/wizard-client/wizard-client-libgdx/core/src/main/resources/i18n/messages_de.properties index ba4a2b9..cdacfa4 100644 --- a/wizard-client/wizard-client-libgdx/core/src/main/resources/i18n/messages_de.properties +++ b/wizard-client/wizard-client-libgdx/core/src/main/resources/i18n/messages_de.properties @@ -159,6 +159,7 @@ game.message.change_prediction.all=Jeder muss seine Vorhersage ändern game.message.change_prediction.self=Du musst deine Vorhersage ändern game.message.timeout=Zeit abgelaufen +game.message.sync=Warte auf andere Spieler... game.message.nack.not_allowed=Du kannst das jetzt nicht tun game.message.nack.too_fast=Nicht so schnell diff --git a/wizard-client/wizard-client-libgdx/desktop/src/main/java/eu/jonahbauer/wizard/client/libgdx/desktop/DesktopLauncher.java b/wizard-client/wizard-client-libgdx/desktop/src/main/java/eu/jonahbauer/wizard/client/libgdx/desktop/DesktopLauncher.java index a30be8f..19b278d 100644 --- a/wizard-client/wizard-client-libgdx/desktop/src/main/java/eu/jonahbauer/wizard/client/libgdx/desktop/DesktopLauncher.java +++ b/wizard-client/wizard-client-libgdx/desktop/src/main/java/eu/jonahbauer/wizard/client/libgdx/desktop/DesktopLauncher.java @@ -8,7 +8,6 @@ public class DesktopLauncher { public static void main (String[] arg) { Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration(); config.setTitle("Wizard Jubilaeumsedition 2021"); - config.setForegroundFPS(60); config.setWindowSizeLimits(853, 480, -1, -1); config.setBackBufferConfig(8, 8, 8, 8, 16, 0, 32); new Lwjgl3Application(new WizardGame(), config); diff --git a/wizard-server/src/main/java/eu/jonahbauer/wizard/server/debug/DebugSession.java b/wizard-server/src/main/java/eu/jonahbauer/wizard/server/debug/DebugSession.java index e2b25e1..1bf8c4c 100644 --- a/wizard-server/src/main/java/eu/jonahbauer/wizard/server/debug/DebugSession.java +++ b/wizard-server/src/main/java/eu/jonahbauer/wizard/server/debug/DebugSession.java @@ -61,9 +61,12 @@ public class DebugSession extends Session { protected void startGame() {} public void close() { - for (var player : getPlayers().values()) { + for (var sessionPlayer : getPlayers().values()) { try { - player.getPlayer().disconnect(); + var player = sessionPlayer.getPlayer(); + if (player != null) { + player.disconnect(); + } } catch (IOException ignored) {} } }