Compare commits
100 Commits
dev
..
82db2bdab1
| Author | SHA1 | Date | |
|---|---|---|---|
| 82db2bdab1 | |||
| 96ed5ac483 | |||
| a9d9d209b9 | |||
| 86307e997b | |||
| ae8f33e598 | |||
| dcfea1854c | |||
| 111d089b1f | |||
| 607d6d104e | |||
| 1e4c772a66 | |||
| ccc0dc2972 | |||
| 0f61b25d4f | |||
| e015f2af81 | |||
| 3e9e0edd70 | |||
| e094a210f4 | |||
| 850c5aa985 | |||
| 96b999dd39 | |||
| ee0f2384be | |||
| 114cae0d6c | |||
| 07633da4ee | |||
| a5b00ac0a1 | |||
| 891e47ffec | |||
| d26d6646c5 | |||
| d2468557b5 | |||
| e44e0db63e | |||
| 3b9becbbda | |||
| 2e9549e4e0 | |||
| c2a81febb9 | |||
| 0e6658c2d9 | |||
| 93e341d445 | |||
| b5d82ac8de | |||
| 155049830b | |||
| 94ac10e93b | |||
| b20f300260 | |||
| 8c719a8835 | |||
| 3adaeffe2d | |||
| ee2367643d | |||
| bf87f4af1c | |||
| f7d753e7e0 | |||
| 4eb1b61e7b | |||
| 298167d4c9 | |||
| 7a25d3b881 | |||
| 50fe4b7681 | |||
| a977e4dca1 | |||
| 238c67ce48 | |||
| 2d3477ffc5 | |||
| 62b6c3fd81 | |||
| 62f04dfded | |||
| 6fe8a70d9e | |||
| 1e5ed45c63 | |||
| 44162b5bf3 | |||
| 64152219a0 | |||
| 99c4f68893 | |||
| 5e428d1301 | |||
| e5e67a3418 | |||
| 1fc7103d66 | |||
| 17ec7a1a90 | |||
| 4a6e1e81e4 | |||
| fb400afdc2 | |||
| 3bd95c0b61 | |||
| a9e4644b06 | |||
| 442fc6c7d0 | |||
| c7344a502f | |||
| 4cd5e90e2b | |||
| 3179a17b36 | |||
| db07bfa453 | |||
| 1cc4c3eeb9 | |||
| 766e923713 | |||
| 34f6d9848b | |||
| 6fc1c9429e | |||
| 5cf4bc506f | |||
| 3e9b9d1f31 | |||
| 96a2d43aaf | |||
| 9bc2d08ddd | |||
| 73ff37cc38 | |||
| 2b86d0d86c | |||
| 7f33529e52 | |||
| 4ed23e1a0f | |||
| 385c6ba50a | |||
| 270bc40fa3 | |||
| 67bb44eb39 | |||
| 544f9c0877 | |||
| 36deb15f02 | |||
| a24e8b0223 | |||
| b6868db2c6 | |||
| 649fd581f8 | |||
| d1acde7bde | |||
| 74c5e7709a | |||
| a0b483a4f0 | |||
| f04ee9177f | |||
| 5d9c958732 | |||
| 4946c214be | |||
| ceb4c49e01 | |||
| 7f84889a02 | |||
| 7e1d15591e | |||
| 2f1794973a | |||
| eba221525f | |||
| c301d08094 | |||
| bba7153801 | |||
| b32ff5aa6f | |||
| ca5401cbe2 |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 3.6 MiB |
|
After Width: | Height: | Size: 3.3 MiB |
|
After Width: | Height: | Size: 3.4 MiB |
|
After Width: | Height: | Size: 3.4 MiB |
@@ -2,8 +2,8 @@ package eu.jonahbauer.wizard.client.cli.commands;
|
|||||||
|
|
||||||
import eu.jonahbauer.wizard.client.cli.Client;
|
import eu.jonahbauer.wizard.client.cli.Client;
|
||||||
import eu.jonahbauer.wizard.client.cli.state.Game;
|
import eu.jonahbauer.wizard.client.cli.state.Game;
|
||||||
|
import eu.jonahbauer.wizard.client.cli.util.Pair;
|
||||||
import eu.jonahbauer.wizard.common.model.Card;
|
import eu.jonahbauer.wizard.common.model.Card;
|
||||||
import eu.jonahbauer.wizard.common.util.Pair;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package eu.jonahbauer.wizard.client.cli.state;
|
|||||||
|
|
||||||
import eu.jonahbauer.wizard.client.cli.Client;
|
import eu.jonahbauer.wizard.client.cli.Client;
|
||||||
import eu.jonahbauer.wizard.client.cli.commands.GameCommand;
|
import eu.jonahbauer.wizard.client.cli.commands.GameCommand;
|
||||||
|
import eu.jonahbauer.wizard.client.cli.util.Pair;
|
||||||
import eu.jonahbauer.wizard.common.messages.client.InteractionMessage;
|
import eu.jonahbauer.wizard.common.messages.client.InteractionMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.data.PlayerData;
|
import eu.jonahbauer.wizard.common.messages.data.PlayerData;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.*;
|
import eu.jonahbauer.wizard.common.messages.observer.*;
|
||||||
@@ -11,7 +12,6 @@ import eu.jonahbauer.wizard.common.messages.server.GameMessage;
|
|||||||
import eu.jonahbauer.wizard.common.messages.server.NackMessage;
|
import eu.jonahbauer.wizard.common.messages.server.NackMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.server.ServerMessage;
|
import eu.jonahbauer.wizard.common.messages.server.ServerMessage;
|
||||||
import eu.jonahbauer.wizard.common.model.Card;
|
import eu.jonahbauer.wizard.common.model.Card;
|
||||||
import eu.jonahbauer.wizard.common.util.Pair;
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package eu.jonahbauer.wizard.client.cli.util;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public record Pair<F,S>(F first, S second) implements Map.Entry<F, S> {
|
||||||
|
public static <F,S> Pair<F,S> of(F first, S second) {
|
||||||
|
return new Pair<>(first, second);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public F getKey() {
|
||||||
|
return first();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public S getValue() {
|
||||||
|
return second();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public S setValue(S value) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package eu.jonahbauer.wizard.client.cli.util;
|
package eu.jonahbauer.wizard.client.cli.util;
|
||||||
|
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.client.cli.Client;
|
import eu.jonahbauer.wizard.client.cli.Client;
|
||||||
import eu.jonahbauer.wizard.client.cli.state.ClientState;
|
import eu.jonahbauer.wizard.client.cli.state.ClientState;
|
||||||
import picocli.CommandLine;
|
import picocli.CommandLine;
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import com.badlogic.gdx.graphics.Pixmap;
|
|||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.screens.MainMenuScreen;
|
import eu.jonahbauer.wizard.client.libgdx.screens.MainMenuScreen;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.util.SavedData;
|
import eu.jonahbauer.wizard.client.libgdx.util.SavedData;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.util.SoundManager;
|
|
||||||
import eu.jonahbauer.wizard.client.libgdx.util.WizardAssetManager;
|
import eu.jonahbauer.wizard.client.libgdx.util.WizardAssetManager;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
@@ -20,8 +19,6 @@ public class WizardGame extends Game {
|
|||||||
|
|
||||||
public SpriteBatch batch;
|
public SpriteBatch batch;
|
||||||
public WizardAssetManager assets;
|
public WizardAssetManager assets;
|
||||||
public SoundManager sounds;
|
|
||||||
|
|
||||||
public final SavedData storage = new SavedData();
|
public final SavedData storage = new SavedData();
|
||||||
|
|
||||||
private boolean fullscreenToggle;
|
private boolean fullscreenToggle;
|
||||||
@@ -38,8 +35,6 @@ public class WizardGame extends Game {
|
|||||||
assets.loadShared();
|
assets.loadShared();
|
||||||
assets.finishLoading();
|
assets.finishLoading();
|
||||||
|
|
||||||
sounds = new SoundManager(assets);
|
|
||||||
|
|
||||||
// background music
|
// background music
|
||||||
Music backgroundMusic = assets.get(WizardAssetManager.MUSIC_BACKGROUND, Music.class);
|
Music backgroundMusic = assets.get(WizardAssetManager.MUSIC_BACKGROUND, Music.class);
|
||||||
backgroundMusic.setLooping(true);
|
backgroundMusic.setLooping(true);
|
||||||
@@ -82,7 +77,6 @@ public class WizardGame extends Game {
|
|||||||
@Override
|
@Override
|
||||||
public void dispose () {
|
public void dispose () {
|
||||||
batch.dispose();
|
batch.dispose();
|
||||||
sounds.dispose();
|
|
||||||
assets.dispose();
|
assets.dispose();
|
||||||
client.shutdownNow();
|
client.shutdownNow();
|
||||||
var socket = client.getSocket();
|
var socket = client.getSocket();
|
||||||
|
|||||||
@@ -1,53 +0,0 @@
|
|||||||
package eu.jonahbauer.wizard.client.libgdx.actors;
|
|
||||||
|
|
||||||
import com.badlogic.gdx.graphics.g2d.Batch;
|
|
||||||
import com.badlogic.gdx.graphics.g2d.BitmapFont;
|
|
||||||
import com.badlogic.gdx.graphics.g2d.GlyphLayout;
|
|
||||||
import com.badlogic.gdx.scenes.scene2d.ui.List;
|
|
||||||
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
|
|
||||||
import com.badlogic.gdx.scenes.scene2d.utils.Drawable;
|
|
||||||
import com.badlogic.gdx.utils.Align;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
|
|
||||||
public abstract class IconList<T> extends List<T> {
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
private float iconWidth = -1;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
private float iconPadding = 8;
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public IconList(Skin skin) {
|
|
||||||
super(skin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public IconList(Skin skin, String styleName) {
|
|
||||||
super(skin, styleName);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public IconList(ListStyle style) {
|
|
||||||
super(style);
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract Drawable getIcon(T item);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public void setAlignment(int alignment) {}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GlyphLayout drawItem(Batch batch, BitmapFont font, int index, T item, float x, float y, float width) {
|
|
||||||
var text = toString(item);
|
|
||||||
var icon = getIcon(item);
|
|
||||||
var height = font.getCapHeight();
|
|
||||||
var iconWidth = this.iconWidth < 0 ? height : this.iconWidth;
|
|
||||||
|
|
||||||
icon.draw(batch, x, y - height, iconWidth, height);
|
|
||||||
return font.draw(batch, text, x + iconWidth + iconPadding, y, 0, text.length(), width - iconWidth - iconPadding, Align.left, false, "...");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
package eu.jonahbauer.wizard.client.libgdx.listeners;
|
|
||||||
|
|
||||||
import com.badlogic.gdx.scenes.scene2d.Actor;
|
|
||||||
import com.badlogic.gdx.scenes.scene2d.ui.Button;
|
|
||||||
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
|
|
||||||
import eu.jonahbauer.wizard.client.libgdx.util.SoundManager;
|
|
||||||
|
|
||||||
public class ButtonClickListener extends ChangeListener {
|
|
||||||
private final SoundManager sounds;
|
|
||||||
|
|
||||||
public ButtonClickListener(SoundManager sounds) {
|
|
||||||
this.sounds = sounds;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void changed(ChangeEvent event, Actor actor) {
|
|
||||||
if (actor instanceof Button) {
|
|
||||||
sounds.sfxClick();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -29,6 +29,7 @@ public class ConnectScreen extends MenuScreen {
|
|||||||
public void changed(ChangeEvent event, Actor actor) {
|
public void changed(ChangeEvent event, Actor actor) {
|
||||||
if (actor == buttonBack) {
|
if (actor == buttonBack) {
|
||||||
game.getClient().execute(Menu.class, Menu::showMenuScreen);
|
game.getClient().execute(Menu.class, Menu::showMenuScreen);
|
||||||
|
sfxClick();
|
||||||
} else if (actor == buttonConnect) {
|
} else if (actor == buttonConnect) {
|
||||||
try {
|
try {
|
||||||
var uriString = ConnectScreen.this.uriField.getText();
|
var uriString = ConnectScreen.this.uriField.getText();
|
||||||
@@ -38,6 +39,8 @@ public class ConnectScreen extends MenuScreen {
|
|||||||
} catch (URISyntaxException e) {
|
} catch (URISyntaxException e) {
|
||||||
uriField.setStyle(getTextFieldErrorStyle());
|
uriField.setStyle(getTextFieldErrorStyle());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sfxClick();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -31,8 +31,10 @@ public class CreateGameScreen extends MenuScreen {
|
|||||||
public void changed(ChangeEvent event, Actor actor) {
|
public void changed(ChangeEvent event, Actor actor) {
|
||||||
if (actor == buttonBack) {
|
if (actor == buttonBack) {
|
||||||
game.getClient().execute(Lobby.class, Lobby::showListScreen);
|
game.getClient().execute(Lobby.class, Lobby::showListScreen);
|
||||||
|
sfxClick();
|
||||||
} else if (actor == buttonContinue) {
|
} else if (actor == buttonContinue) {
|
||||||
create();
|
create();
|
||||||
|
sfxClick();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ public class ErrorScreen extends MenuScreen {
|
|||||||
public void changed(ChangeEvent event, Actor actor) {
|
public void changed(ChangeEvent event, Actor actor) {
|
||||||
if (actor == buttonBack) {
|
if (actor == buttonBack) {
|
||||||
game.getClient().execute(BaseState.class, BaseState::dismissErrorScreen);
|
game.getClient().execute(BaseState.class, BaseState::dismissErrorScreen);
|
||||||
|
sfxClick();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -22,7 +22,10 @@ import eu.jonahbauer.wizard.client.libgdx.actors.CardsGroup;
|
|||||||
import eu.jonahbauer.wizard.client.libgdx.actors.PadOfTruth;
|
import eu.jonahbauer.wizard.client.libgdx.actors.PadOfTruth;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.state.Game;
|
import eu.jonahbauer.wizard.client.libgdx.state.Game;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.state.Session;
|
import eu.jonahbauer.wizard.client.libgdx.state.Session;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.util.*;
|
import eu.jonahbauer.wizard.client.libgdx.util.AnimationTimings;
|
||||||
|
import eu.jonahbauer.wizard.client.libgdx.util.CardUtil;
|
||||||
|
import eu.jonahbauer.wizard.client.libgdx.util.Pair;
|
||||||
|
import eu.jonahbauer.wizard.client.libgdx.util.WizardAssetManager;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.UserInputMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.UserInputMessage;
|
||||||
import eu.jonahbauer.wizard.common.model.Card;
|
import eu.jonahbauer.wizard.common.model.Card;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@@ -418,13 +421,6 @@ public class GameScreen extends WizardScreen {
|
|||||||
execute(new StartRoundOverlay(this, round));
|
execute(new StartRoundOverlay(this, round));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void deal() {
|
|
||||||
execute(parallel(
|
|
||||||
run(() -> game.sounds.sfxShuffle()),
|
|
||||||
delay(SoundManager.CARD_SHUFFLE_DURATION)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void startTrick() {
|
public void startTrick() {
|
||||||
clearActivePlayer();
|
clearActivePlayer();
|
||||||
execute(() -> cardStack.clearChildren());
|
execute(() -> cardStack.clearChildren());
|
||||||
@@ -535,8 +531,6 @@ public class GameScreen extends WizardScreen {
|
|||||||
cardStack.add(seat, actor);
|
cardStack.add(seat, actor);
|
||||||
sequence.addAction(delay(actor));
|
sequence.addAction(delay(actor));
|
||||||
sequence.addAction(delay(AnimationTimings.STACK_HOLD));
|
sequence.addAction(delay(AnimationTimings.STACK_HOLD));
|
||||||
|
|
||||||
game.sounds.sfxPlayCard();
|
|
||||||
}));
|
}));
|
||||||
execute(sequence);
|
execute(sequence);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import eu.jonahbauer.wizard.common.model.Card;
|
|||||||
public class InstructionScreen extends MenuScreen {
|
public class InstructionScreen extends MenuScreen {
|
||||||
private static final int MAX_PAGE = 3;
|
private static final int MAX_PAGE = 3;
|
||||||
|
|
||||||
private TextButton buttonBack;
|
private TextButton buttonOK;
|
||||||
private VerticalGroup content;
|
private VerticalGroup content;
|
||||||
private ScrollPane scrollPane;
|
private ScrollPane scrollPane;
|
||||||
private TextButton nextPageButton;
|
private TextButton nextPageButton;
|
||||||
@@ -29,14 +29,17 @@ public class InstructionScreen extends MenuScreen {
|
|||||||
private final ChangeListener listener = new ChangeListener() {
|
private final ChangeListener listener = new ChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public void changed(ChangeEvent event, Actor actor) {
|
public void changed(ChangeEvent event, Actor actor) {
|
||||||
if (actor == buttonBack) {
|
if (actor == buttonOK) {
|
||||||
game.getClient().execute(Menu.class, Menu::showMenuScreen);
|
game.getClient().execute(Menu.class, Menu::showMenuScreen);
|
||||||
|
sfxClick();
|
||||||
} else if (actor == nextPageButton) {
|
} else if (actor == nextPageButton) {
|
||||||
currentPage = MathUtils.clamp(currentPage + 1, 0, MAX_PAGE);
|
currentPage = MathUtils.clamp(currentPage + 1, 0, MAX_PAGE);
|
||||||
showPage(currentPage);
|
showPage(currentPage);
|
||||||
|
sfxClick();
|
||||||
} else if (actor == previousPageButton) {
|
} else if (actor == previousPageButton) {
|
||||||
currentPage = MathUtils.clamp(currentPage - 1, 0, MAX_PAGE);
|
currentPage = MathUtils.clamp(currentPage - 1, 0, MAX_PAGE);
|
||||||
showPage(currentPage);
|
showPage(currentPage);
|
||||||
|
sfxClick();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -67,9 +70,9 @@ public class InstructionScreen extends MenuScreen {
|
|||||||
previousPageButton.addListener(listener);
|
previousPageButton.addListener(listener);
|
||||||
getButtonGroup().addActor(previousPageButton);
|
getButtonGroup().addActor(previousPageButton);
|
||||||
|
|
||||||
buttonBack = new TextButton(messages.get("menu.instruction.back"), skin);
|
buttonOK = new TextButton(messages.get("menu.instruction.back"), skin);
|
||||||
buttonBack.addListener(listener);
|
buttonOK.addListener(listener);
|
||||||
getButtonGroup().addActor(buttonBack);
|
getButtonGroup().addActor(buttonOK);
|
||||||
|
|
||||||
nextPageButton = new TextButton(messages.get("menu.instruction.nextPageButton"), skin);
|
nextPageButton = new TextButton(messages.get("menu.instruction.nextPageButton"), skin);
|
||||||
nextPageButton.addListener(listener);
|
nextPageButton.addListener(listener);
|
||||||
@@ -80,7 +83,7 @@ public class InstructionScreen extends MenuScreen {
|
|||||||
scrollPane.setSize(0.65f * WizardGame.WIDTH, 400 + 0.1f * WizardGame.HEIGHT + 80);
|
scrollPane.setSize(0.65f * WizardGame.WIDTH, 400 + 0.1f * WizardGame.HEIGHT + 80);
|
||||||
stage.addActor(scrollPane);
|
stage.addActor(scrollPane);
|
||||||
|
|
||||||
stage.addCaptureListener(new KeyboardFocusManager(scrollPane, previousPageButton, buttonBack, nextPageButton));
|
stage.addCaptureListener(new KeyboardFocusManager(scrollPane, previousPageButton, buttonOK, nextPageButton));
|
||||||
|
|
||||||
showFirstPage();
|
showFirstPage();
|
||||||
}
|
}
|
||||||
@@ -163,8 +166,9 @@ public class InstructionScreen extends MenuScreen {
|
|||||||
reset();
|
reset();
|
||||||
|
|
||||||
startSection("menu.instruction.variant.title");
|
startSection("menu.instruction.variant.title");
|
||||||
addParagraph("menu.instruction.variant.intro");
|
|
||||||
|
|
||||||
|
Label variantsIntro = new Label(messages.get("menu.instruction.variant.intro"), skin);
|
||||||
|
content.addActor(variantsIntro);
|
||||||
Table table = new Table(skin).padTop(10);
|
Table table = new Table(skin).padTop(10);
|
||||||
table.defaults().space(10.0f).left().top();
|
table.defaults().space(10.0f).left().top();
|
||||||
table.columnDefaults(1).grow();
|
table.columnDefaults(1).grow();
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package eu.jonahbauer.wizard.client.libgdx.screens;
|
package eu.jonahbauer.wizard.client.libgdx.screens;
|
||||||
|
|
||||||
|
import com.badlogic.gdx.Gdx;
|
||||||
import com.badlogic.gdx.scenes.scene2d.ui.Label;
|
import com.badlogic.gdx.scenes.scene2d.ui.Label;
|
||||||
import com.badlogic.gdx.scenes.scene2d.ui.VerticalGroup;
|
import com.badlogic.gdx.scenes.scene2d.ui.VerticalGroup;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.WizardGame;
|
import eu.jonahbauer.wizard.client.libgdx.WizardGame;
|
||||||
|
|||||||
@@ -3,10 +3,7 @@ package eu.jonahbauer.wizard.client.libgdx.screens;
|
|||||||
import com.badlogic.gdx.scenes.scene2d.Actor;
|
import com.badlogic.gdx.scenes.scene2d.Actor;
|
||||||
import com.badlogic.gdx.scenes.scene2d.ui.*;
|
import com.badlogic.gdx.scenes.scene2d.ui.*;
|
||||||
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
|
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
|
||||||
import com.badlogic.gdx.scenes.scene2d.utils.Drawable;
|
|
||||||
import eu.jonahbauer.wizard.client.libgdx.UiskinAtlas;
|
|
||||||
import eu.jonahbauer.wizard.client.libgdx.WizardGame;
|
import eu.jonahbauer.wizard.client.libgdx.WizardGame;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.actors.IconList;
|
|
||||||
import eu.jonahbauer.wizard.client.libgdx.listeners.KeyboardFocusManager;
|
import eu.jonahbauer.wizard.client.libgdx.listeners.KeyboardFocusManager;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.listeners.ResetErrorListener;
|
import eu.jonahbauer.wizard.client.libgdx.listeners.ResetErrorListener;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.state.Lobby;
|
import eu.jonahbauer.wizard.client.libgdx.state.Lobby;
|
||||||
@@ -20,6 +17,7 @@ public class LobbyScreen extends MenuScreen {
|
|||||||
|
|
||||||
private TextButton buttonBack;
|
private TextButton buttonBack;
|
||||||
private TextButton buttonJoin;
|
private TextButton buttonJoin;
|
||||||
|
private TextButton buttonRejoin;
|
||||||
private TextButton buttonCreate;
|
private TextButton buttonCreate;
|
||||||
|
|
||||||
private TextField playerName;
|
private TextField playerName;
|
||||||
@@ -28,7 +26,6 @@ public class LobbyScreen extends MenuScreen {
|
|||||||
private Label labelSessionConfiguration;
|
private Label labelSessionConfiguration;
|
||||||
|
|
||||||
private UUID selectedSession;
|
private UUID selectedSession;
|
||||||
private boolean rejoin = false;
|
|
||||||
private List<SessionData> sessions;
|
private List<SessionData> sessions;
|
||||||
private ScrollPane sessionListContainer;
|
private ScrollPane sessionListContainer;
|
||||||
|
|
||||||
@@ -37,14 +34,16 @@ public class LobbyScreen extends MenuScreen {
|
|||||||
public void changed(ChangeEvent event, Actor actor) {
|
public void changed(ChangeEvent event, Actor actor) {
|
||||||
if (actor == buttonBack) {
|
if (actor == buttonBack) {
|
||||||
game.getClient().execute(Lobby.class, Lobby::disconnect);
|
game.getClient().execute(Lobby.class, Lobby::disconnect);
|
||||||
|
sfxClick();
|
||||||
} else if (actor == buttonJoin) {
|
} else if (actor == buttonJoin) {
|
||||||
if (rejoin) {
|
|
||||||
game.getClient().execute(Lobby.class, Lobby::showRejoinScreen);
|
|
||||||
} else {
|
|
||||||
join();
|
join();
|
||||||
}
|
sfxClick();
|
||||||
} else if (actor == buttonCreate) {
|
} else if (actor == buttonCreate) {
|
||||||
game.getClient().execute(Lobby.class, Lobby::showCreateScreen);
|
game.getClient().execute(Lobby.class, Lobby::showCreateScreen);
|
||||||
|
sfxClick();
|
||||||
|
} else if (actor == buttonRejoin) {
|
||||||
|
game.getClient().execute(Lobby.class, Lobby::showRejoinScreen);
|
||||||
|
sfxClick();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -65,26 +64,21 @@ public class LobbyScreen extends MenuScreen {
|
|||||||
buttonCreate.addListener(listener);
|
buttonCreate.addListener(listener);
|
||||||
getButtonGroup().addActor(buttonCreate);
|
getButtonGroup().addActor(buttonCreate);
|
||||||
|
|
||||||
|
buttonRejoin = new TextButton(messages.get("menu.lobby.rejoin"), skin);
|
||||||
|
buttonRejoin.addListener(listener);
|
||||||
|
getButtonGroup().addActor(buttonRejoin);
|
||||||
|
|
||||||
buttonJoin = new TextButton(messages.get("menu.lobby.join"), skin);
|
buttonJoin = new TextButton(messages.get("menu.lobby.join"), skin);
|
||||||
buttonJoin.addListener(listener);
|
buttonJoin.addListener(listener);
|
||||||
getButtonGroup().addActor(buttonJoin);
|
getButtonGroup().addActor(buttonJoin);
|
||||||
|
|
||||||
getButtonGroup().setWidth(0.55f * WizardGame.WIDTH);
|
getButtonGroup().setWidth(0.55f * WizardGame.WIDTH);
|
||||||
|
|
||||||
sessions = new IconList<>(skin) {
|
sessions = new List<>(skin) {
|
||||||
// TODO better icons
|
|
||||||
private final Drawable running = skin.getDrawable(UiskinAtlas.NOT_READY);
|
|
||||||
private final Drawable notRunning = skin.getDrawable(UiskinAtlas.READY);
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString(SessionData session) {
|
public String toString(SessionData session) {
|
||||||
return session.getName();
|
return session.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Drawable getIcon(SessionData item) {
|
|
||||||
return item.isRunning() ? running : notRunning;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
sessions.addListener(new ChangeListener() {
|
sessions.addListener(new ChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
@@ -108,11 +102,12 @@ public class LobbyScreen extends MenuScreen {
|
|||||||
|
|
||||||
stage.addActor(content);
|
stage.addActor(content);
|
||||||
stage.addCaptureListener(new KeyboardFocusManager(
|
stage.addCaptureListener(new KeyboardFocusManager(
|
||||||
sessions, playerName, buttonBack, buttonCreate, buttonJoin
|
sessions, playerName, buttonBack, buttonCreate, buttonRejoin, buttonJoin
|
||||||
));
|
));
|
||||||
|
|
||||||
buttonBack.setName("button_back");
|
buttonBack.setName("button_back");
|
||||||
buttonJoin.setName("button_join");
|
buttonJoin.setName("button_join");
|
||||||
|
buttonJoin.setName("button_rejoin");
|
||||||
buttonCreate.setName("button_create");
|
buttonCreate.setName("button_create");
|
||||||
sessions.setName("session_list");
|
sessions.setName("session_list");
|
||||||
playerName.setName("player_name");
|
playerName.setName("player_name");
|
||||||
@@ -199,21 +194,14 @@ public class LobbyScreen extends MenuScreen {
|
|||||||
labelSessionPlayerCount.setText(Integer.toString(data.getPlayerCount()));
|
labelSessionPlayerCount.setText(Integer.toString(data.getPlayerCount()));
|
||||||
labelSessionConfiguration.setText(data.getConfiguration().toString());
|
labelSessionConfiguration.setText(data.getConfiguration().toString());
|
||||||
selectedSession = data.getUuid();
|
selectedSession = data.getUuid();
|
||||||
updateRejoin(data.isRunning());
|
|
||||||
} else {
|
} else {
|
||||||
labelSessionName.setText("");
|
labelSessionName.setText("");
|
||||||
labelSessionPlayerCount.setText("");
|
labelSessionPlayerCount.setText("");
|
||||||
labelSessionConfiguration.setText("");
|
labelSessionConfiguration.setText("");
|
||||||
selectedSession = null;
|
selectedSession = null;
|
||||||
updateRejoin(false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateRejoin(boolean rejoin) {
|
|
||||||
this.rejoin = rejoin;
|
|
||||||
buttonJoin.setText(messages.get("menu.lobby." + (rejoin ? "rejoin" : "join")));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void join() {
|
private void join() {
|
||||||
boolean error = false;
|
boolean error = false;
|
||||||
|
|
||||||
|
|||||||
@@ -23,10 +23,13 @@ public class MainMenuScreen extends MenuScreen {
|
|||||||
public void changed(ChangeEvent event, Actor actor) {
|
public void changed(ChangeEvent event, Actor actor) {
|
||||||
if (actor == buttonPlay) {
|
if (actor == buttonPlay) {
|
||||||
game.getClient().execute(Menu.class, Menu::showConnectScreen);
|
game.getClient().execute(Menu.class, Menu::showConnectScreen);
|
||||||
|
sfxClick();
|
||||||
} else if (actor == buttonQuit) {
|
} else if (actor == buttonQuit) {
|
||||||
|
sfxClick();
|
||||||
Gdx.app.exit();
|
Gdx.app.exit();
|
||||||
} else if (actor == buttonInstruction) {
|
} else if (actor == buttonInstruction) {
|
||||||
game.getClient().execute(Menu.class, Menu::showInstructionScreen);
|
game.getClient().execute(Menu.class, Menu::showInstructionScreen);
|
||||||
|
sfxClick();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -26,8 +26,10 @@ public class RejoinScreen extends MenuScreen {
|
|||||||
public void changed(ChangeEvent event, Actor actor) {
|
public void changed(ChangeEvent event, Actor actor) {
|
||||||
if (actor == buttonBack) {
|
if (actor == buttonBack) {
|
||||||
game.getClient().execute(Lobby.class, Lobby::showListScreen);
|
game.getClient().execute(Lobby.class, Lobby::showListScreen);
|
||||||
|
sfxClick();
|
||||||
} else if (actor == buttonContinue) {
|
} else if (actor == buttonContinue) {
|
||||||
rejoin();
|
rejoin();
|
||||||
|
sfxClick();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
package eu.jonahbauer.wizard.client.libgdx.screens;
|
package eu.jonahbauer.wizard.client.libgdx.screens;
|
||||||
|
|
||||||
|
import com.badlogic.gdx.graphics.g2d.Batch;
|
||||||
|
import com.badlogic.gdx.graphics.g2d.BitmapFont;
|
||||||
|
import com.badlogic.gdx.graphics.g2d.GlyphLayout;
|
||||||
|
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||||
import com.badlogic.gdx.scenes.scene2d.Actor;
|
import com.badlogic.gdx.scenes.scene2d.Actor;
|
||||||
import com.badlogic.gdx.scenes.scene2d.ui.*;
|
import com.badlogic.gdx.scenes.scene2d.ui.*;
|
||||||
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
|
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
|
||||||
import com.badlogic.gdx.scenes.scene2d.utils.Drawable;
|
import com.badlogic.gdx.utils.Align;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.UiskinAtlas;
|
import eu.jonahbauer.wizard.client.libgdx.UiskinAtlas;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.WizardGame;
|
import eu.jonahbauer.wizard.client.libgdx.WizardGame;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.actors.IconList;
|
|
||||||
import eu.jonahbauer.wizard.client.libgdx.listeners.KeyboardFocusManager;
|
import eu.jonahbauer.wizard.client.libgdx.listeners.KeyboardFocusManager;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.state.Session;
|
import eu.jonahbauer.wizard.client.libgdx.state.Session;
|
||||||
import eu.jonahbauer.wizard.common.messages.data.PlayerData;
|
import eu.jonahbauer.wizard.common.messages.data.PlayerData;
|
||||||
@@ -14,7 +17,7 @@ import eu.jonahbauer.wizard.common.model.Configuration;
|
|||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class SessionScreen extends MenuScreen {
|
public class WaitingScreen extends MenuScreen {
|
||||||
|
|
||||||
private TextButton buttonLeave;
|
private TextButton buttonLeave;
|
||||||
private TextButton buttonReady;
|
private TextButton buttonReady;
|
||||||
@@ -31,13 +34,15 @@ public class SessionScreen extends MenuScreen {
|
|||||||
public void changed(ChangeEvent event, Actor actor) {
|
public void changed(ChangeEvent event, Actor actor) {
|
||||||
if (actor == buttonLeave) {
|
if (actor == buttonLeave) {
|
||||||
game.getClient().execute(Session.class, Session::leave);
|
game.getClient().execute(Session.class, Session::leave);
|
||||||
|
sfxClick();
|
||||||
} else if (actor == buttonReady) {
|
} else if (actor == buttonReady) {
|
||||||
game.getClient().execute(Session.class, Session::toggleReady);
|
game.getClient().execute(Session.class, Session::toggleReady);
|
||||||
|
sfxClick();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public SessionScreen(WizardGame game) {
|
public WaitingScreen(WizardGame game) {
|
||||||
super(game);
|
super(game);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,19 +50,19 @@ public class SessionScreen extends MenuScreen {
|
|||||||
public void show() {
|
public void show() {
|
||||||
super.show();
|
super.show();
|
||||||
|
|
||||||
buttonLeave = new TextButton(messages.get("menu.session.leave"), skin);
|
buttonLeave = new TextButton(messages.get("menu.waiting.leave"), skin);
|
||||||
buttonLeave.addListener(listener);
|
buttonLeave.addListener(listener);
|
||||||
getButtonGroup().addActor(buttonLeave);
|
getButtonGroup().addActor(buttonLeave);
|
||||||
|
|
||||||
buttonReady = new TextButton(messages.get("menu.session.ready"), skin);
|
buttonReady = new TextButton(messages.get("menu.waiting.ready"), skin);
|
||||||
buttonReady.addListener(listener);
|
buttonReady.addListener(listener);
|
||||||
getButtonGroup().addActor(buttonReady);
|
getButtonGroup().addActor(buttonReady);
|
||||||
|
|
||||||
getButtonGroup().setWidth(0.55f * WizardGame.WIDTH);
|
getButtonGroup().setWidth(0.55f * WizardGame.WIDTH);
|
||||||
|
|
||||||
players = new IconList<>(skin) {
|
players = new List<>(skin) {
|
||||||
private final Drawable ready = skin.getDrawable(UiskinAtlas.READY);
|
private final TextureRegion ready = skin.getRegion(UiskinAtlas.READY);
|
||||||
private final Drawable notReady = skin.getDrawable(UiskinAtlas.NOT_READY);
|
private final TextureRegion notReady = skin.getRegion(UiskinAtlas.NOT_READY);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString(PlayerData player) {
|
public String toString(PlayerData player) {
|
||||||
@@ -65,8 +70,16 @@ public class SessionScreen extends MenuScreen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Drawable getIcon(PlayerData item) {
|
@SuppressWarnings("SuspiciousNameCombination")
|
||||||
return item.isReady() ? ready : notReady;
|
protected GlyphLayout drawItem(Batch batch, BitmapFont font, int index, PlayerData item, float x, float y, float width) {
|
||||||
|
String string = toString(item);
|
||||||
|
var height = font.getCapHeight();
|
||||||
|
if (item.isReady()) {
|
||||||
|
batch.draw(ready, x, y - height, height, height);
|
||||||
|
} else {
|
||||||
|
batch.draw(notReady, x, y - height, height, height);
|
||||||
|
}
|
||||||
|
return font.draw(batch, string, x + height + 8, y, 0, string.length(), width - height - 8, Align.left, false, "...");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -108,13 +121,13 @@ public class SessionScreen extends MenuScreen {
|
|||||||
infoTable.columnDefaults(0).growX().width(infoTableWidth);
|
infoTable.columnDefaults(0).growX().width(infoTableWidth);
|
||||||
infoTable.setSize(infoTableWidth, 400);
|
infoTable.setSize(infoTableWidth, 400);
|
||||||
|
|
||||||
infoTable.add(messages.get("menu.session.session_name.label")).row();
|
infoTable.add(messages.get("menu.waiting.session_name.label")).row();
|
||||||
infoTable.add(labelSessionName).row();
|
infoTable.add(labelSessionName).row();
|
||||||
infoTable.add(messages.get("menu.session.session_uuid.label")).row();
|
infoTable.add(messages.get("menu.waiting.session_uuid.label")).row();
|
||||||
infoTable.add(labelSessionUUID).row();
|
infoTable.add(labelSessionUUID).row();
|
||||||
infoTable.add(messages.get("menu.session.session_configuration.label")).row();
|
infoTable.add(messages.get("menu.waiting.session_configuration.label")).row();
|
||||||
infoTable.add(labelSessionConfiguration).row();
|
infoTable.add(labelSessionConfiguration).row();
|
||||||
infoTable.add(messages.get("menu.session.player_name.label")).row();
|
infoTable.add(messages.get("menu.waiting.player_name.label")).row();
|
||||||
infoTable.add(labelPlayerName).row();
|
infoTable.add(labelPlayerName).row();
|
||||||
|
|
||||||
return infoTable;
|
return infoTable;
|
||||||
@@ -125,7 +138,7 @@ public class SessionScreen extends MenuScreen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setReady(boolean ready) {
|
public void setReady(boolean ready) {
|
||||||
buttonReady.setText(messages.get(ready ? "menu.session.not_ready" : "menu.session.ready"));
|
buttonReady.setText(messages.get(ready ? "menu.waiting.not_ready" : "menu.waiting.ready"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addPlayer(PlayerData player) {
|
public void addPlayer(PlayerData player) {
|
||||||
@@ -2,6 +2,7 @@ package eu.jonahbauer.wizard.client.libgdx.screens;
|
|||||||
|
|
||||||
import com.badlogic.gdx.Gdx;
|
import com.badlogic.gdx.Gdx;
|
||||||
import com.badlogic.gdx.Screen;
|
import com.badlogic.gdx.Screen;
|
||||||
|
import com.badlogic.gdx.audio.Sound;
|
||||||
import com.badlogic.gdx.graphics.GL20;
|
import com.badlogic.gdx.graphics.GL20;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
import com.badlogic.gdx.graphics.g2d.BitmapFont;
|
import com.badlogic.gdx.graphics.g2d.BitmapFont;
|
||||||
@@ -15,7 +16,6 @@ import com.badlogic.gdx.utils.viewport.Viewport;
|
|||||||
import eu.jonahbauer.wizard.client.libgdx.UiskinAtlas;
|
import eu.jonahbauer.wizard.client.libgdx.UiskinAtlas;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.WizardGame;
|
import eu.jonahbauer.wizard.client.libgdx.WizardGame;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.listeners.AutoFocusListener;
|
import eu.jonahbauer.wizard.client.libgdx.listeners.AutoFocusListener;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.listeners.ButtonClickListener;
|
|
||||||
import eu.jonahbauer.wizard.client.libgdx.listeners.ButtonKeyListener;
|
import eu.jonahbauer.wizard.client.libgdx.listeners.ButtonKeyListener;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.util.WizardAssetManager;
|
import eu.jonahbauer.wizard.client.libgdx.util.WizardAssetManager;
|
||||||
import org.jetbrains.annotations.MustBeInvokedByOverriders;
|
import org.jetbrains.annotations.MustBeInvokedByOverriders;
|
||||||
@@ -31,6 +31,7 @@ public abstract class WizardScreen implements Screen {
|
|||||||
protected Viewport viewport;
|
protected Viewport viewport;
|
||||||
|
|
||||||
private Image background;
|
private Image background;
|
||||||
|
private Sound sfxClick;
|
||||||
|
|
||||||
protected float offsetX;
|
protected float offsetX;
|
||||||
protected float offsetY;
|
protected float offsetY;
|
||||||
@@ -55,10 +56,11 @@ public abstract class WizardScreen implements Screen {
|
|||||||
stage = new Stage(viewport);
|
stage = new Stage(viewport);
|
||||||
stage.addListener(new ButtonKeyListener());
|
stage.addListener(new ButtonKeyListener());
|
||||||
stage.addListener(new AutoFocusListener());
|
stage.addListener(new AutoFocusListener());
|
||||||
stage.addListener(new ButtonClickListener(game.sounds));
|
|
||||||
stage.setDebugAll(WizardGame.DEBUG);
|
stage.setDebugAll(WizardGame.DEBUG);
|
||||||
|
|
||||||
Gdx.input.setInputProcessor(stage);
|
Gdx.input.setInputProcessor(stage);
|
||||||
|
|
||||||
|
sfxClick = assets.get(WizardAssetManager.SFX_CLICK);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -108,4 +110,8 @@ public abstract class WizardScreen implements Screen {
|
|||||||
public void dispose() {
|
public void dispose() {
|
||||||
stage.dispose();
|
stage.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void sfxClick() {
|
||||||
|
sfxClick.play(0.6f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ public final class AwaitingJoinSession extends Awaiting {
|
|||||||
));
|
));
|
||||||
} else {
|
} else {
|
||||||
return Optional.of(new Session(
|
return Optional.of(new Session(
|
||||||
session, sessionName, configuration,
|
new SessionData(session, sessionName, -1, configuration),
|
||||||
players,
|
players,
|
||||||
player
|
player
|
||||||
));
|
));
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import eu.jonahbauer.wizard.client.libgdx.screens.GameScreen;
|
|||||||
import eu.jonahbauer.wizard.client.libgdx.util.Pair;
|
import eu.jonahbauer.wizard.client.libgdx.util.Pair;
|
||||||
import eu.jonahbauer.wizard.common.messages.client.InteractionMessage;
|
import eu.jonahbauer.wizard.common.messages.client.InteractionMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.data.PlayerData;
|
import eu.jonahbauer.wizard.common.messages.data.PlayerData;
|
||||||
|
import eu.jonahbauer.wizard.common.messages.data.SessionData;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.*;
|
import eu.jonahbauer.wizard.common.messages.observer.*;
|
||||||
import eu.jonahbauer.wizard.common.messages.player.*;
|
import eu.jonahbauer.wizard.common.messages.player.*;
|
||||||
import eu.jonahbauer.wizard.common.messages.server.AckMessage;
|
import eu.jonahbauer.wizard.common.messages.server.AckMessage;
|
||||||
@@ -117,7 +118,6 @@ public final class Game extends BaseState {
|
|||||||
case "starting_round" -> {
|
case "starting_round" -> {
|
||||||
return onStartRound(client);
|
return onStartRound(client);
|
||||||
}
|
}
|
||||||
case "dealing" -> onDealing();
|
|
||||||
case "starting_trick" -> onStartTrick();
|
case "starting_trick" -> onStartTrick();
|
||||||
case "juggling" -> onJuggle();
|
case "juggling" -> onJuggle();
|
||||||
case "finishing_round" -> onFinishingRound();
|
case "finishing_round" -> onFinishingRound();
|
||||||
@@ -190,10 +190,6 @@ public final class Game extends BaseState {
|
|||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onDealing() {
|
|
||||||
if (gameScreen != null) gameScreen.deal();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void onStartTrick() {
|
private void onStartTrick() {
|
||||||
log.info("Trick {} is starting...", trick + 1);
|
log.info("Trick {} is starting...", trick + 1);
|
||||||
trick ++;
|
trick ++;
|
||||||
@@ -437,7 +433,7 @@ public final class Game extends BaseState {
|
|||||||
|
|
||||||
private Optional<ClientState> returnToSession() {
|
private Optional<ClientState> returnToSession() {
|
||||||
return Optional.of(new Session(
|
return Optional.of(new Session(
|
||||||
session, sessionName, configuration,
|
new SessionData(session, sessionName, -1, configuration),
|
||||||
players.entrySet().stream()
|
players.entrySet().stream()
|
||||||
.map(entry -> new PlayerData(entry.getKey(), entry.getValue(), false))
|
.map(entry -> new PlayerData(entry.getKey(), entry.getValue(), false))
|
||||||
.toList(),
|
.toList(),
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
package eu.jonahbauer.wizard.client.libgdx.state;
|
package eu.jonahbauer.wizard.client.libgdx.state;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.client.libgdx.Client;
|
import eu.jonahbauer.wizard.client.libgdx.Client;
|
||||||
import eu.jonahbauer.wizard.client.libgdx.screens.SessionScreen;
|
import eu.jonahbauer.wizard.client.libgdx.screens.WaitingScreen;
|
||||||
import eu.jonahbauer.wizard.common.messages.client.LeaveSessionMessage;
|
import eu.jonahbauer.wizard.common.messages.client.LeaveSessionMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.client.ReadyMessage;
|
import eu.jonahbauer.wizard.common.messages.client.ReadyMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.data.PlayerData;
|
import eu.jonahbauer.wizard.common.messages.data.PlayerData;
|
||||||
|
import eu.jonahbauer.wizard.common.messages.data.SessionData;
|
||||||
import eu.jonahbauer.wizard.common.messages.server.*;
|
import eu.jonahbauer.wizard.common.messages.server.*;
|
||||||
import eu.jonahbauer.wizard.common.model.Configuration;
|
import eu.jonahbauer.wizard.common.model.Configuration;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@@ -15,7 +16,7 @@ import java.util.*;
|
|||||||
@Log4j2
|
@Log4j2
|
||||||
@Getter
|
@Getter
|
||||||
public final class Session extends BaseState {
|
public final class Session extends BaseState {
|
||||||
private SessionScreen sessionScreen;
|
private WaitingScreen sessionScreen;
|
||||||
|
|
||||||
private final UUID self;
|
private final UUID self;
|
||||||
|
|
||||||
@@ -27,14 +28,14 @@ public final class Session extends BaseState {
|
|||||||
|
|
||||||
private boolean sending;
|
private boolean sending;
|
||||||
|
|
||||||
public Session(UUID session, String name, Configuration configuration, Collection<PlayerData> players, UUID self) {
|
public Session(SessionData session, Collection<PlayerData> players, UUID self) {
|
||||||
this(session, name, configuration, players, self, false);
|
this(session, players, self, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Session(UUID session, String name, Configuration configuration, Collection<PlayerData> players, UUID self, boolean dontSwitchScreen) {
|
public Session(SessionData session, Collection<PlayerData> players, UUID self, boolean dontSwitchScreen) {
|
||||||
this.session = session;
|
this.session = session.getUuid();
|
||||||
this.sessionName = name;
|
this.sessionName = session.getName();
|
||||||
this.configuration = configuration;
|
this.configuration = session.getConfiguration();
|
||||||
players.forEach(p -> this.players.put(p.getUuid(), p));
|
players.forEach(p -> this.players.put(p.getUuid(), p));
|
||||||
this.dontSwitchScreen = dontSwitchScreen;
|
this.dontSwitchScreen = dontSwitchScreen;
|
||||||
|
|
||||||
@@ -121,7 +122,7 @@ public final class Session extends BaseState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Optional<ClientState> showInfoScreen(Client client) {
|
public Optional<ClientState> showInfoScreen(Client client) {
|
||||||
sessionScreen = new SessionScreen(client.getGame());
|
sessionScreen = new WaitingScreen(client.getGame());
|
||||||
client.getGame().setScreen(sessionScreen);
|
client.getGame().setScreen(sessionScreen);
|
||||||
sessionScreen.setPlayers(players.values().toArray(new PlayerData[0]));
|
sessionScreen.setPlayers(players.values().toArray(new PlayerData[0]));
|
||||||
sessionScreen.setReady(players.get(self).isReady());
|
sessionScreen.setReady(players.get(self).isReady());
|
||||||
|
|||||||
@@ -70,6 +70,6 @@ public class CardUtil {
|
|||||||
);
|
);
|
||||||
|
|
||||||
public Card.Suit getDefaultTrumpSuit(Card card) {
|
public Card.Suit getDefaultTrumpSuit(Card card) {
|
||||||
return card == null ? Card.Suit.NONE : DEFAULT_SUITES.get(card);
|
return DEFAULT_SUITES.get(card);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
package eu.jonahbauer.wizard.client.libgdx.util;
|
|
||||||
|
|
||||||
import com.badlogic.gdx.audio.Sound;
|
|
||||||
import lombok.Setter;
|
|
||||||
|
|
||||||
public class SoundManager {
|
|
||||||
public static final float CARD_SHUFFLE_DURATION = 4.2f;
|
|
||||||
|
|
||||||
private final WizardAssetManager assets;
|
|
||||||
|
|
||||||
@Setter
|
|
||||||
private float sfxVolume = 1;
|
|
||||||
|
|
||||||
private final Sound click;
|
|
||||||
private final Sound cardPlayed;
|
|
||||||
private final Sound cardShuffle;
|
|
||||||
|
|
||||||
public SoundManager(WizardAssetManager assets) {
|
|
||||||
this.assets = assets;
|
|
||||||
assets.load(WizardAssetManager.SFX_CLICK, Sound.class);
|
|
||||||
assets.load(WizardAssetManager.SFX_CARD_PLAYED, Sound.class);
|
|
||||||
assets.load(WizardAssetManager.SFX_CARD_SHUFFLE, Sound.class);
|
|
||||||
assets.finishLoading();
|
|
||||||
|
|
||||||
this.click = assets.get(WizardAssetManager.SFX_CLICK);
|
|
||||||
this.cardPlayed = assets.get(WizardAssetManager.SFX_CARD_PLAYED);
|
|
||||||
this.cardShuffle = assets.get(WizardAssetManager.SFX_CARD_SHUFFLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void sfxClick() {
|
|
||||||
this.click.play(sfxVolume);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void sfxShuffle() {
|
|
||||||
this.cardShuffle.play(sfxVolume);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void sfxPlayCard() {
|
|
||||||
this.cardPlayed.play(sfxVolume);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void dispose() {
|
|
||||||
assets.unload(WizardAssetManager.SFX_CLICK);
|
|
||||||
assets.unload(WizardAssetManager.SFX_CARD_PLAYED);
|
|
||||||
assets.unload(WizardAssetManager.SFX_CARD_SHUFFLE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4,6 +4,7 @@ import com.badlogic.gdx.assets.AssetManager;
|
|||||||
import com.badlogic.gdx.assets.loaders.I18NBundleLoader;
|
import com.badlogic.gdx.assets.loaders.I18NBundleLoader;
|
||||||
import com.badlogic.gdx.assets.loaders.SkinLoader;
|
import com.badlogic.gdx.assets.loaders.SkinLoader;
|
||||||
import com.badlogic.gdx.audio.Music;
|
import com.badlogic.gdx.audio.Music;
|
||||||
|
import com.badlogic.gdx.audio.Sound;
|
||||||
import com.badlogic.gdx.graphics.Pixmap;
|
import com.badlogic.gdx.graphics.Pixmap;
|
||||||
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
|
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
|
||||||
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
|
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
|
||||||
@@ -19,9 +20,7 @@ public class WizardAssetManager {
|
|||||||
public static final String ATLAS_SKIN = UiskinAtlas.$PATH;
|
public static final String ATLAS_SKIN = UiskinAtlas.$PATH;
|
||||||
public static final String ATLAS_GAME = GameAtlas.$PATH;
|
public static final String ATLAS_GAME = GameAtlas.$PATH;
|
||||||
|
|
||||||
public static final String SFX_CLICK = "sound/button_click.mp3";
|
public static final String SFX_CLICK = "button_click_s.mp3";
|
||||||
public static final String SFX_CARD_PLAYED = "sound/card_played.mp3";
|
|
||||||
public static final String SFX_CARD_SHUFFLE = "sound/card_shuffle.mp3";
|
|
||||||
public static final String MUSIC_BACKGROUND = "background.mp3";
|
public static final String MUSIC_BACKGROUND = "background.mp3";
|
||||||
|
|
||||||
public static final String CURSOR = "cursor.png";
|
public static final String CURSOR = "cursor.png";
|
||||||
@@ -36,6 +35,7 @@ public class WizardAssetManager {
|
|||||||
manager.load(SKIN, Skin.class, new SkinLoader.SkinParameter(ATLAS_SKIN));
|
manager.load(SKIN, Skin.class, new SkinLoader.SkinParameter(ATLAS_SKIN));
|
||||||
|
|
||||||
manager.load(MUSIC_BACKGROUND, Music.class);
|
manager.load(MUSIC_BACKGROUND, Music.class);
|
||||||
|
manager.load(SFX_CLICK, Sound.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadGame() {
|
public void loadGame() {
|
||||||
|
|||||||
@@ -150,14 +150,14 @@ menu.loading.joining_session=Joining session...
|
|||||||
menu.loading.joining_lobby=Joining lobby...
|
menu.loading.joining_lobby=Joining lobby...
|
||||||
menu.loading.back=Return To Main Menu
|
menu.loading.back=Return To Main Menu
|
||||||
|
|
||||||
menu.session.ready=Ready
|
menu.waiting.ready=Ready
|
||||||
menu.session.not_ready=Not Ready
|
menu.waiting.not_ready=Not Ready
|
||||||
menu.session.leave=Leave
|
menu.waiting.leave=Leave
|
||||||
|
|
||||||
menu.session.player_name.label=Own Name
|
menu.waiting.player_name.label=Own Name
|
||||||
menu.session.session_name.label=Session Name
|
menu.waiting.session_name.label=Session Name
|
||||||
menu.session.session_uuid.label=Session UUID
|
menu.waiting.session_uuid.label=Session UUID
|
||||||
menu.session.session_configuration.label=Configuration
|
menu.waiting.session_configuration.label=Configuration
|
||||||
|
|
||||||
menu.error.malformed_message=Error: Malformed Message
|
menu.error.malformed_message=Error: Malformed Message
|
||||||
menu.error.unexpected_message=Error: Unexpected Message
|
menu.error.unexpected_message=Error: Unexpected Message
|
||||||
|
|||||||
@@ -143,14 +143,14 @@ menu.loading.joining_session=Trete Sitzung bei...
|
|||||||
menu.loading.joining_lobby=Trete Warteraum bei...
|
menu.loading.joining_lobby=Trete Warteraum bei...
|
||||||
menu.loading.back=Zurück zum Hauptmenü
|
menu.loading.back=Zurück zum Hauptmenü
|
||||||
|
|
||||||
menu.session.ready=Bereit
|
menu.waiting.ready=Bereit
|
||||||
menu.session.not_ready=Nicht Bereit
|
menu.waiting.not_ready=Nicht Bereit
|
||||||
menu.session.leave=Verlassen
|
menu.waiting.leave=Verlassen
|
||||||
|
|
||||||
menu.session.player_name.label=Eigener Name
|
menu.waiting.player_name.label=Eigener Name
|
||||||
menu.session.session_name.label=Sitzungsname
|
menu.waiting.session_name.label=Sitzungsname
|
||||||
menu.session.session_uuid.label=Sitzungs-ID
|
menu.waiting.session_uuid.label=Sitzungs-ID
|
||||||
menu.session.session_configuration.label=Spielvariante
|
menu.waiting.session_configuration.label=Spielvariante
|
||||||
|
|
||||||
menu.error.malformed_message=Fehler: Missgebildete Nachricht
|
menu.error.malformed_message=Fehler: Missgebildete Nachricht
|
||||||
menu.error.unexpected_message=Fehler: Unerwartete Nachricht
|
menu.error.unexpected_message=Fehler: Unerwartete Nachricht
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package eu.jonahbauer.wizard.common.messages.client;
|
|||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import eu.jonahbauer.wizard.common.messages.ParseException;
|
import eu.jonahbauer.wizard.common.messages.ParseException;
|
||||||
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
|
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.util.SerializationUtil;
|
import eu.jonahbauer.wizard.common.util.SerializationUtil;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
|
|
||||||
|
|||||||
@@ -26,8 +26,4 @@ public class SessionData {
|
|||||||
* Configuration of the session
|
* Configuration of the session
|
||||||
*/
|
*/
|
||||||
private final @NonNull Configuration configuration;
|
private final @NonNull Configuration configuration;
|
||||||
/**
|
|
||||||
* Whether the session is running.
|
|
||||||
*/
|
|
||||||
private final boolean running;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package eu.jonahbauer.wizard.common.messages.observer;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import eu.jonahbauer.wizard.common.messages.ParseException;
|
import eu.jonahbauer.wizard.common.messages.ParseException;
|
||||||
import eu.jonahbauer.wizard.common.messages.util.SerializationUtil;
|
import eu.jonahbauer.wizard.common.util.SerializationUtil;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package eu.jonahbauer.wizard.common.messages.player;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import eu.jonahbauer.wizard.common.messages.ParseException;
|
import eu.jonahbauer.wizard.common.messages.ParseException;
|
||||||
import eu.jonahbauer.wizard.common.messages.util.SerializationUtil;
|
import eu.jonahbauer.wizard.common.util.SerializationUtil;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package eu.jonahbauer.wizard.common.messages.server;
|
||||||
|
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NonNull;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
public final class KickVotedMessage extends ServerMessage {
|
||||||
|
/**
|
||||||
|
* UUID of the voting player
|
||||||
|
*/
|
||||||
|
private final @NonNull UUID voter;
|
||||||
|
/**
|
||||||
|
* UUID of player who is supposed to be kicked
|
||||||
|
*/
|
||||||
|
private final @NonNull UUID player;
|
||||||
|
/**
|
||||||
|
* Time until the vote ends in {@link System#currentTimeMillis() UNIX time}
|
||||||
|
*/
|
||||||
|
private final long timeout;
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package eu.jonahbauer.wizard.common.messages.server;
|
||||||
|
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NonNull;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
public final class KickedMessage extends ServerMessage {
|
||||||
|
/**
|
||||||
|
* UUID of player who was kicked
|
||||||
|
*/
|
||||||
|
private final @NonNull UUID player;
|
||||||
|
}
|
||||||
@@ -3,12 +3,12 @@ package eu.jonahbauer.wizard.common.messages.server;
|
|||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import eu.jonahbauer.wizard.common.messages.ParseException;
|
import eu.jonahbauer.wizard.common.messages.ParseException;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.ObserverMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.ObserverMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.util.SerializationUtil;
|
import eu.jonahbauer.wizard.common.util.SerializationUtil;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
|
|
||||||
@EqualsAndHashCode
|
@EqualsAndHashCode
|
||||||
public abstract sealed class ServerMessage permits AckMessage, GameMessage, NackMessage, PlayerLeftMessage, PlayerModifiedMessage, SessionJoinedMessage, SessionListMessage, SessionModifiedMessage, SessionRemovedMessage, StartingGameMessage {
|
public abstract sealed class ServerMessage permits AckMessage, GameMessage, KickVotedMessage, KickedMessage, NackMessage, PlayerLeftMessage, PlayerModifiedMessage, SessionJoinedMessage, SessionListMessage, SessionModifiedMessage, SessionRemovedMessage, StartingGameMessage {
|
||||||
private static final ObjectMapper MAPPER = SerializationUtil.newObjectMapper(ServerMessage.class, ObserverMessage.class);
|
private static final ObjectMapper MAPPER = SerializationUtil.newObjectMapper(ServerMessage.class, ObserverMessage.class);
|
||||||
|
|
||||||
public static ServerMessage parse(String json) throws ParseException {
|
public static ServerMessage parse(String json) throws ParseException {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package eu.jonahbauer.wizard.common.messages.util;
|
package eu.jonahbauer.wizard.common.util;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonCreator;
|
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||||
@@ -10,10 +10,10 @@ import com.fasterxml.jackson.databind.jsontype.NamedType;
|
|||||||
import com.fasterxml.jackson.databind.module.SimpleModule;
|
import com.fasterxml.jackson.databind.module.SimpleModule;
|
||||||
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
|
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
|
||||||
import eu.jonahbauer.wizard.common.messages.ParseException;
|
import eu.jonahbauer.wizard.common.messages.ParseException;
|
||||||
import eu.jonahbauer.wizard.common.util.StringUtil;
|
|
||||||
import lombok.experimental.UtilityClass;
|
import lombok.experimental.UtilityClass;
|
||||||
|
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
@UtilityClass
|
@UtilityClass
|
||||||
public class SerializationUtil {
|
public class SerializationUtil {
|
||||||
@@ -61,7 +61,7 @@ public class SerializationUtil {
|
|||||||
if (Modifier.isFinal(modifiers) || subclass.isSealed() && !Modifier.isAbstract(modifiers)) {
|
if (Modifier.isFinal(modifiers) || subclass.isSealed() && !Modifier.isAbstract(modifiers)) {
|
||||||
var name = subclass.getSimpleName();
|
var name = subclass.getSimpleName();
|
||||||
if (name.endsWith(suffix)) name = name.substring(0, name.length() - suffix.length());
|
if (name.endsWith(suffix)) name = name.substring(0, name.length() - suffix.length());
|
||||||
name = StringUtil.toSnakeCase(name);
|
name = name.replaceAll("([a-z])([A-Z]+)", "$1_$2").toLowerCase(Locale.ROOT);
|
||||||
|
|
||||||
objectMapper.registerSubtypes(new NamedType(subclass, name));
|
objectMapper.registerSubtypes(new NamedType(subclass, name));
|
||||||
}
|
}
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
module eu.jonahbauer.wizard.common {
|
|
||||||
exports eu.jonahbauer.wizard.common.machine;
|
|
||||||
exports eu.jonahbauer.wizard.common.messages;
|
|
||||||
exports eu.jonahbauer.wizard.common.messages.client;
|
|
||||||
exports eu.jonahbauer.wizard.common.messages.data;
|
|
||||||
exports eu.jonahbauer.wizard.common.messages.observer;
|
|
||||||
exports eu.jonahbauer.wizard.common.messages.player;
|
|
||||||
exports eu.jonahbauer.wizard.common.messages.server;
|
|
||||||
exports eu.jonahbauer.wizard.common.model;
|
|
||||||
exports eu.jonahbauer.wizard.common.util;
|
|
||||||
|
|
||||||
opens eu.jonahbauer.wizard.common.messages.client to com.fasterxml.jackson.databind;
|
|
||||||
opens eu.jonahbauer.wizard.common.messages.data to com.fasterxml.jackson.databind;
|
|
||||||
opens eu.jonahbauer.wizard.common.messages.observer to com.fasterxml.jackson.databind;
|
|
||||||
opens eu.jonahbauer.wizard.common.messages.player to com.fasterxml.jackson.databind;
|
|
||||||
opens eu.jonahbauer.wizard.common.messages.server to com.fasterxml.jackson.databind;
|
|
||||||
|
|
||||||
requires com.fasterxml.jackson.databind;
|
|
||||||
requires com.fasterxml.jackson.module.paramnames;
|
|
||||||
|
|
||||||
requires static lombok;
|
|
||||||
requires static org.jetbrains.annotations;
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
package eu.jonahbauer.wizard.core;
|
||||||
|
|
||||||
|
import eu.jonahbauer.wizard.common.messages.player.PickTrumpMessage;
|
||||||
|
import eu.jonahbauer.wizard.common.messages.player.PlayCardMessage;
|
||||||
|
import eu.jonahbauer.wizard.common.messages.player.PredictMessage;
|
||||||
|
import eu.jonahbauer.wizard.common.model.Card;
|
||||||
|
import eu.jonahbauer.wizard.core.machine.Game;
|
||||||
|
import eu.jonahbauer.wizard.core.messages.Observer;
|
||||||
|
import eu.jonahbauer.wizard.core.model.GameConfiguration;
|
||||||
|
import eu.jonahbauer.wizard.core.model.Configurations;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Scanner;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class CLI {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
GameConfiguration config = Configurations.DEFAULT;
|
||||||
|
Observer observer = (player, msg) -> System.out.println(msg);
|
||||||
|
Game game = new Game(config, observer);
|
||||||
|
var players = List.of(
|
||||||
|
UUID.randomUUID(),
|
||||||
|
UUID.randomUUID(),
|
||||||
|
UUID.randomUUID(),
|
||||||
|
UUID.randomUUID()
|
||||||
|
);
|
||||||
|
|
||||||
|
game.start(players);
|
||||||
|
|
||||||
|
Scanner scanner = new Scanner(System.in);
|
||||||
|
Pattern pattern = Pattern.compile("(\\d) ([a-z]+) (.*)");
|
||||||
|
while (scanner.hasNextLine()) {
|
||||||
|
try {
|
||||||
|
Matcher matcher = pattern.matcher(scanner.nextLine());
|
||||||
|
if (!matcher.find()) {
|
||||||
|
System.err.println("Format is \"(\\d) ([a-z]+) (.*)\"");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String player = matcher.group(1);
|
||||||
|
String command = matcher.group(2);
|
||||||
|
String param = matcher.group(3);
|
||||||
|
|
||||||
|
int id = Integer.parseInt(player);
|
||||||
|
|
||||||
|
if (id > players.size()) {
|
||||||
|
System.err.println("ID must be between 0 and " + (players.size() - 1));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (command) {
|
||||||
|
case "predict" -> {
|
||||||
|
int prediction = Integer.parseInt(param);
|
||||||
|
game.onMessage(players.get(id), new PredictMessage(prediction));
|
||||||
|
}
|
||||||
|
case "play" -> {
|
||||||
|
Card card = Card.valueOf(param);
|
||||||
|
game.onMessage(players.get(id), new PlayCardMessage(card));
|
||||||
|
}
|
||||||
|
case "trump" -> {
|
||||||
|
Card.Suit suit = Card.Suit.valueOf(param);
|
||||||
|
game.onMessage(players.get(id), new PickTrumpMessage(suit));
|
||||||
|
}
|
||||||
|
default -> System.err.println("Unknown command: " + command);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.err.println(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,22 +1,18 @@
|
|||||||
package eu.jonahbauer.wizard.core;
|
package eu.jonahbauer.wizard.core.machine;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.machine.TimeoutContext;
|
import eu.jonahbauer.wizard.common.machine.TimeoutContext;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.ObserverMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.ObserverMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.StateMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.StateMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
|
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
|
||||||
import eu.jonahbauer.wizard.common.model.Configuration;
|
import eu.jonahbauer.wizard.core.machine.states.TransientState;
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
import eu.jonahbauer.wizard.core.machine.states.game.Created;
|
||||||
import eu.jonahbauer.wizard.core.states.TransientState;
|
import eu.jonahbauer.wizard.core.machine.states.game.Error;
|
||||||
import eu.jonahbauer.wizard.core.states.game.Created;
|
import eu.jonahbauer.wizard.core.messages.Observer;
|
||||||
import eu.jonahbauer.wizard.core.states.game.Error;
|
|
||||||
import eu.jonahbauer.wizard.core.model.Configurations;
|
|
||||||
import eu.jonahbauer.wizard.core.model.GameConfiguration;
|
import eu.jonahbauer.wizard.core.model.GameConfiguration;
|
||||||
import eu.jonahbauer.wizard.common.util.StringUtil;
|
import eu.jonahbauer.wizard.core.util.Util;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.jetbrains.annotations.Blocking;
|
import org.jetbrains.annotations.Blocking;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.annotations.TestOnly;
|
|
||||||
import org.jetbrains.annotations.VisibleForTesting;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
@@ -34,25 +30,20 @@ public final class Game extends TimeoutContext<GameState, Game> {
|
|||||||
|
|
||||||
private final CompletableFuture<Void> future = new CompletableFuture<>();
|
private final CompletableFuture<Void> future = new CompletableFuture<>();
|
||||||
|
|
||||||
private Game(Random random, Configuration config, long timeout, long syncTimeout, Observer observer) {
|
public Game(GameConfiguration config, Observer observer) {
|
||||||
super(new Created());
|
super(new Created());
|
||||||
this.random = random;
|
this.random = new Random();
|
||||||
this.config = Configurations.get(config).withTimeout(timeout).withSyncTimeout(syncTimeout);
|
this.config = config;
|
||||||
this.observer = observer;
|
this.observer = observer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Game(Configuration config, long timeout, long syncTimeout, Observer observer) {
|
public Game(long seed, GameConfiguration config, Observer observer) {
|
||||||
this(new Random(), config, timeout, syncTimeout, observer);
|
super(new Created());
|
||||||
|
this.random = new Random(seed);
|
||||||
|
this.config = config;
|
||||||
|
this.observer = observer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestOnly
|
|
||||||
public Game(long seed, Configuration config, long timeout, long syncTimeout, Observer observer) {
|
|
||||||
this(new Random(seed), config, timeout, syncTimeout, observer);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestOnly
|
|
||||||
@VisibleForTesting
|
|
||||||
@SuppressWarnings("ClassEscapesDefinedScope")
|
|
||||||
public void resume(GameState state) {
|
public void resume(GameState state) {
|
||||||
transition(new Created(), state);
|
transition(new Created(), state);
|
||||||
}
|
}
|
||||||
@@ -65,17 +56,10 @@ public final class Game extends TimeoutContext<GameState, Game> {
|
|||||||
execute(s -> s.onMessage(this, player, message));
|
execute(s -> s.onMessage(this, player, message));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onMessage(UUID player, PlayerMessage message, Runnable preHandleMessage) {
|
|
||||||
execute(s -> {
|
|
||||||
preHandleMessage.run();
|
|
||||||
return s.onMessage(this, player, message);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onTransition(GameState from, GameState to) {
|
protected void onTransition(GameState from, GameState to) {
|
||||||
if (!(to instanceof TransientState)) {
|
if (!(to instanceof TransientState)) {
|
||||||
notify(new StateMessage(to != null ? StringUtil.toSnakeCase(to.getClass().getSimpleName()) : "null"));
|
notify(new StateMessage(to != null ? Util.toSnakeCase(to.getClass().getSimpleName()) : "null"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
package eu.jonahbauer.wizard.core.states;
|
package eu.jonahbauer.wizard.core.machine;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.machine.TimeoutState;
|
import eu.jonahbauer.wizard.common.machine.TimeoutState;
|
||||||
import eu.jonahbauer.wizard.common.messages.player.ContinueMessage;
|
import eu.jonahbauer.wizard.common.messages.player.ContinueMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
|
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
|
||||||
import eu.jonahbauer.wizard.core.Game;
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
|
import eu.jonahbauer.wizard.core.machine.states.SyncState;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.jetbrains.annotations.Unmodifiable;
|
import org.jetbrains.annotations.Unmodifiable;
|
||||||
|
|
||||||
@@ -12,8 +13,8 @@ import java.util.Optional;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
import static eu.jonahbauer.wizard.core.states.GameData.CURRENT_PLAYER;
|
import static eu.jonahbauer.wizard.core.machine.states.GameData.CURRENT_PLAYER;
|
||||||
import static eu.jonahbauer.wizard.core.states.GameData.PLAYERS;
|
import static eu.jonahbauer.wizard.core.machine.states.GameData.PLAYERS;
|
||||||
|
|
||||||
@Unmodifiable
|
@Unmodifiable
|
||||||
public abstract class GameState implements TimeoutState<GameState, Game> {
|
public abstract class GameState implements TimeoutState<GameState, Game> {
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package eu.jonahbauer.wizard.core.states;
|
package eu.jonahbauer.wizard.core.machine.states;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.model.Card;
|
import eu.jonahbauer.wizard.common.model.Card;
|
||||||
import eu.jonahbauer.wizard.common.util.Pair;
|
import eu.jonahbauer.wizard.core.util.Pair;
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package eu.jonahbauer.wizard.core.states;
|
package eu.jonahbauer.wizard.core.machine.states;
|
||||||
|
|
||||||
public class InvalidDataException extends RuntimeException {
|
public class InvalidDataException extends RuntimeException {
|
||||||
public InvalidDataException(String message) {
|
public InvalidDataException(String message) {
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
package eu.jonahbauer.wizard.core.states;
|
package eu.jonahbauer.wizard.core.machine.states;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.TimeoutMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.TimeoutMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.UserInputMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.UserInputMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.player.ContinueMessage;
|
import eu.jonahbauer.wizard.common.messages.player.ContinueMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
|
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
|
||||||
import eu.jonahbauer.wizard.core.Game;
|
import eu.jonahbauer.wizard.core.machine.Game;
|
||||||
|
import eu.jonahbauer.wizard.core.machine.GameState;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@@ -13,7 +14,7 @@ import java.util.UUID;
|
|||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
import static eu.jonahbauer.wizard.common.messages.observer.UserInputMessage.Action.SYNC;
|
import static eu.jonahbauer.wizard.common.messages.observer.UserInputMessage.Action.SYNC;
|
||||||
import static eu.jonahbauer.wizard.core.states.GameData.PLAYERS;
|
import static eu.jonahbauer.wizard.core.machine.states.GameData.PLAYERS;
|
||||||
|
|
||||||
public final class SyncState extends GameState implements TransientState {
|
public final class SyncState extends GameState implements TransientState {
|
||||||
private final transient Set<UUID> ready = new HashSet<>();
|
private final transient Set<UUID> ready = new HashSet<>();
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
package eu.jonahbauer.wizard.core.machine.states;
|
||||||
|
|
||||||
|
public interface TransientState {
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package eu.jonahbauer.wizard.core.states.game;
|
package eu.jonahbauer.wizard.core.machine.states.game;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.core.Game;
|
import eu.jonahbauer.wizard.core.machine.Game;
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
import eu.jonahbauer.wizard.core.machine.GameState;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package eu.jonahbauer.wizard.core.states.game;
|
package eu.jonahbauer.wizard.core.machine.states.game;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
import eu.jonahbauer.wizard.core.machine.GameState;
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package eu.jonahbauer.wizard.core.states.game;
|
package eu.jonahbauer.wizard.core.machine.states.game;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.core.Game;
|
import eu.jonahbauer.wizard.core.machine.Game;
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
import eu.jonahbauer.wizard.core.machine.GameState;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
package eu.jonahbauer.wizard.core.states.game;
|
package eu.jonahbauer.wizard.core.machine.states.game;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
import eu.jonahbauer.wizard.core.Game;
|
import eu.jonahbauer.wizard.core.machine.Game;
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
import eu.jonahbauer.wizard.core.machine.GameState;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.ScoreMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.ScoreMessage;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
import static eu.jonahbauer.wizard.core.states.GameData.*;
|
import static eu.jonahbauer.wizard.core.machine.states.GameData.*;
|
||||||
|
|
||||||
public final class Finishing extends GameState {
|
public final class Finishing extends GameState {
|
||||||
|
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package eu.jonahbauer.wizard.core.machine.states.game;
|
||||||
|
|
||||||
|
import eu.jonahbauer.wizard.core.machine.Game;
|
||||||
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
|
import eu.jonahbauer.wizard.core.machine.GameState;
|
||||||
|
import eu.jonahbauer.wizard.core.machine.states.round.StartingRound;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import static eu.jonahbauer.wizard.core.machine.states.GameData.PLAYERS;
|
||||||
|
|
||||||
|
public final class Starting extends GameState {
|
||||||
|
|
||||||
|
public Starting(GameData data) {
|
||||||
|
super(data.require(PLAYERS));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<GameState> onEnter(Game game) {
|
||||||
|
return transition(new StartingRound(getData()));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,14 +1,14 @@
|
|||||||
package eu.jonahbauer.wizard.core.states.round;
|
package eu.jonahbauer.wizard.core.machine.states.round;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.PredictionMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.PredictionMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.TimeoutMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.TimeoutMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.UserInputMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.UserInputMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
|
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.player.PredictMessage;
|
import eu.jonahbauer.wizard.common.messages.player.PredictMessage;
|
||||||
import eu.jonahbauer.wizard.core.Game;
|
import eu.jonahbauer.wizard.core.machine.Game;
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
import eu.jonahbauer.wizard.core.machine.GameState;
|
||||||
import eu.jonahbauer.wizard.core.states.InvalidDataException;
|
import eu.jonahbauer.wizard.core.machine.states.InvalidDataException;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -16,7 +16,7 @@ import java.util.Optional;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import static eu.jonahbauer.wizard.common.messages.observer.UserInputMessage.Action.CHANGE_PREDICTION;
|
import static eu.jonahbauer.wizard.common.messages.observer.UserInputMessage.Action.CHANGE_PREDICTION;
|
||||||
import static eu.jonahbauer.wizard.core.states.GameData.*;
|
import static eu.jonahbauer.wizard.core.machine.states.GameData.*;
|
||||||
|
|
||||||
public final class ChangingPrediction extends RoundState {
|
public final class ChangingPrediction extends RoundState {
|
||||||
private transient final int oldPrediction;
|
private transient final int oldPrediction;
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
package eu.jonahbauer.wizard.core.states.round;
|
package eu.jonahbauer.wizard.core.machine.states.round;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.HandMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.HandMessage;
|
||||||
import eu.jonahbauer.wizard.common.model.Card;
|
import eu.jonahbauer.wizard.common.model.Card;
|
||||||
import eu.jonahbauer.wizard.core.Game;
|
import eu.jonahbauer.wizard.core.machine.Game;
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
import eu.jonahbauer.wizard.core.machine.GameState;
|
||||||
import eu.jonahbauer.wizard.core.model.deck.Deck;
|
import eu.jonahbauer.wizard.core.model.deck.Deck;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import static eu.jonahbauer.wizard.core.states.GameData.*;
|
import static eu.jonahbauer.wizard.core.machine.states.GameData.*;
|
||||||
|
|
||||||
public final class Dealing extends RoundState {
|
public final class Dealing extends RoundState {
|
||||||
|
|
||||||
@@ -1,50 +1,69 @@
|
|||||||
package eu.jonahbauer.wizard.core.states.round;
|
package eu.jonahbauer.wizard.core.machine.states.round;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.HandMessage;
|
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.TimeoutMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.TimeoutMessage;
|
||||||
|
import eu.jonahbauer.wizard.common.model.Card;
|
||||||
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
|
import eu.jonahbauer.wizard.core.machine.Game;
|
||||||
|
import eu.jonahbauer.wizard.common.messages.observer.HandMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.TrumpMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.TrumpMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.UserInputMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.UserInputMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.player.PickTrumpMessage;
|
import eu.jonahbauer.wizard.common.messages.player.PickTrumpMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
|
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
|
||||||
import eu.jonahbauer.wizard.common.model.Card;
|
import eu.jonahbauer.wizard.core.machine.GameState;
|
||||||
import eu.jonahbauer.wizard.core.Game;
|
import eu.jonahbauer.wizard.core.model.card.GameCards;
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
|
||||||
import eu.jonahbauer.wizard.core.states.TransientState;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
import static eu.jonahbauer.wizard.core.machine.states.GameData.*;
|
||||||
import static eu.jonahbauer.wizard.common.messages.observer.UserInputMessage.Action.PICK_TRUMP;
|
import static eu.jonahbauer.wizard.common.messages.observer.UserInputMessage.Action.PICK_TRUMP;
|
||||||
import static eu.jonahbauer.wizard.core.states.GameData.*;
|
|
||||||
import static eu.jonahbauer.wizard.core.states.GameData.TRUMP_CARD;
|
|
||||||
|
|
||||||
public final class DeterminingTrumpUserInput extends RoundState implements TransientState {
|
public final class DeterminingTrump extends RoundState {
|
||||||
private final transient UUID player;
|
private transient UUID player;
|
||||||
private final transient boolean werewolf;
|
private transient boolean werewolf;
|
||||||
|
|
||||||
public DeterminingTrumpUserInput(GameData data) {
|
public DeterminingTrump(GameData data) {
|
||||||
super(data.require(TRUMP_CARD).requireEach(PLAYERS, HANDS).require(CURRENT_PLAYER));
|
super(data.require(TRUMP_CARD).requireEach(PLAYERS, HANDS));
|
||||||
|
|
||||||
this.player = get(CURRENT_PLAYER);
|
|
||||||
this.werewolf = get(HANDS).get(this.player).contains(Card.WEREWOLF);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<GameState> onEnter(Game game) {
|
public Optional<GameState> onEnter(Game game) {
|
||||||
|
Card trumpCard = get(TRUMP_CARD);
|
||||||
|
|
||||||
|
// handle werewolf
|
||||||
|
for (Map.Entry<UUID, List<Card>> entry : get(HANDS).entrySet()) {
|
||||||
|
var player = entry.getKey();
|
||||||
|
var hand = entry.getValue();
|
||||||
|
if (hand.contains(Card.WEREWOLF)) {
|
||||||
|
this.player = player;
|
||||||
|
this.werewolf = true;
|
||||||
|
game.notify(new TrumpMessage(trumpCard, null));
|
||||||
|
game.notify(new TrumpMessage(Card.WEREWOLF, null));
|
||||||
game.notify(new UserInputMessage(this.player, PICK_TRUMP, getTimeout(game, true)));
|
game.notify(new UserInputMessage(this.player, PICK_TRUMP, getTimeout(game, true)));
|
||||||
return timeout(game);
|
return timeout(game);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// default trump handling
|
||||||
|
Card.Suit trumpSuit = trumpCard != null ? GameCards.get(trumpCard).getTrumpSuit() : Card.Suit.NONE;
|
||||||
|
if (trumpSuit == null) {
|
||||||
|
this.player = getDealer();
|
||||||
|
game.notify(new TrumpMessage(trumpCard, null));
|
||||||
|
game.notify(new UserInputMessage(this.player, PICK_TRUMP, getTimeout(game, true)));
|
||||||
|
return timeout(game);
|
||||||
|
} else {
|
||||||
|
return transition(game, trumpSuit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<GameState> onTimeout(Game game) {
|
public Optional<GameState> onTimeout(Game game) {
|
||||||
game.notify(new TimeoutMessage());
|
game.notify(new TimeoutMessage());
|
||||||
|
|
||||||
Card.Suit[] suits;
|
Card.Suit[] suits;
|
||||||
if (werewolf) {
|
if (werewolf) {
|
||||||
suits = new Card.Suit[] {Card.Suit.BLUE, Card.Suit.GREEN, Card.Suit.RED, Card.Suit.YELLOW, Card.Suit.NONE};
|
suits = new Card.Suit[]{Card.Suit.BLUE, Card.Suit.GREEN, Card.Suit.RED, Card.Suit.YELLOW, Card.Suit.NONE};
|
||||||
} else {
|
} else {
|
||||||
suits = new Card.Suit[] {Card.Suit.BLUE, Card.Suit.GREEN, Card.Suit.RED, Card.Suit.YELLOW};
|
suits = new Card.Suit[]{Card.Suit.BLUE, Card.Suit.GREEN, Card.Suit.RED, Card.Suit.YELLOW};
|
||||||
}
|
}
|
||||||
return transition(game, suits[game.getRandom().nextInt(suits.length)]);
|
return transition(game, suits[game.getRandom().nextInt(suits.length)]);
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
package eu.jonahbauer.wizard.core.states.round;
|
package eu.jonahbauer.wizard.core.machine.states.round;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
import eu.jonahbauer.wizard.core.Game;
|
import eu.jonahbauer.wizard.core.machine.Game;
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
import eu.jonahbauer.wizard.core.machine.GameState;
|
||||||
import eu.jonahbauer.wizard.core.states.game.Finishing;
|
import eu.jonahbauer.wizard.core.machine.states.game.Finishing;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.ScoreMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.ScoreMessage;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -11,7 +11,7 @@ import java.util.Map;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import static eu.jonahbauer.wizard.core.states.GameData.*;
|
import static eu.jonahbauer.wizard.core.machine.states.GameData.*;
|
||||||
|
|
||||||
public final class FinishingRound extends RoundState {
|
public final class FinishingRound extends RoundState {
|
||||||
|
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
package eu.jonahbauer.wizard.core.states.round;
|
package eu.jonahbauer.wizard.core.machine.states.round;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.TimeoutMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.TimeoutMessage;
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
import eu.jonahbauer.wizard.core.Game;
|
import eu.jonahbauer.wizard.core.machine.Game;
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
import eu.jonahbauer.wizard.core.machine.GameState;
|
||||||
import eu.jonahbauer.wizard.core.states.trick.StartingTrick;
|
import eu.jonahbauer.wizard.core.machine.states.trick.StartingTrick;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.PredictionMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.PredictionMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.UserInputMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.UserInputMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
|
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
|
||||||
@@ -16,7 +16,7 @@ import java.util.Map;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import static eu.jonahbauer.wizard.core.states.GameData.*;
|
import static eu.jonahbauer.wizard.core.machine.states.GameData.*;
|
||||||
import static eu.jonahbauer.wizard.common.messages.observer.UserInputMessage.Action.MAKE_PREDICTION;
|
import static eu.jonahbauer.wizard.common.messages.observer.UserInputMessage.Action.MAKE_PREDICTION;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package eu.jonahbauer.wizard.core.states.round;
|
package eu.jonahbauer.wizard.core.machine.states.round;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
import eu.jonahbauer.wizard.core.machine.GameState;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import static eu.jonahbauer.wizard.core.states.GameData.*;
|
import static eu.jonahbauer.wizard.core.machine.states.GameData.*;
|
||||||
|
|
||||||
public abstract class RoundState extends GameState {
|
public abstract class RoundState extends GameState {
|
||||||
public static GameData requirements(GameData data) {
|
public static GameData requirements(GameData data) {
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package eu.jonahbauer.wizard.core.states.round;
|
package eu.jonahbauer.wizard.core.machine.states.round;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.core.Game;
|
import eu.jonahbauer.wizard.core.machine.Game;
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
import eu.jonahbauer.wizard.core.machine.GameState;
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@@ -1,19 +1,19 @@
|
|||||||
package eu.jonahbauer.wizard.core.states.trick;
|
package eu.jonahbauer.wizard.core.machine.states.trick;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.model.Card;
|
import eu.jonahbauer.wizard.common.model.Card;
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
import eu.jonahbauer.wizard.core.Game;
|
import eu.jonahbauer.wizard.core.machine.Game;
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
import eu.jonahbauer.wizard.core.machine.GameState;
|
||||||
import eu.jonahbauer.wizard.core.states.InvalidDataException;
|
import eu.jonahbauer.wizard.core.machine.states.InvalidDataException;
|
||||||
import eu.jonahbauer.wizard.core.states.round.ChangingPrediction;
|
import eu.jonahbauer.wizard.core.machine.states.round.ChangingPrediction;
|
||||||
import eu.jonahbauer.wizard.core.states.round.FinishingRound;
|
import eu.jonahbauer.wizard.core.machine.states.round.FinishingRound;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.TrickMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.TrickMessage;
|
||||||
import eu.jonahbauer.wizard.core.model.card.*;
|
import eu.jonahbauer.wizard.core.model.card.*;
|
||||||
import eu.jonahbauer.wizard.common.util.Pair;
|
import eu.jonahbauer.wizard.core.util.Pair;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import static eu.jonahbauer.wizard.core.states.GameData.*;
|
import static eu.jonahbauer.wizard.core.machine.states.GameData.*;
|
||||||
|
|
||||||
public final class FinishingTrick extends TrickState {
|
public final class FinishingTrick extends TrickState {
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package eu.jonahbauer.wizard.core.states.trick;
|
package eu.jonahbauer.wizard.core.machine.states.trick;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.HandMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.HandMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.TimeoutMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.TimeoutMessage;
|
||||||
@@ -6,15 +6,15 @@ import eu.jonahbauer.wizard.common.messages.observer.UserInputMessage;
|
|||||||
import eu.jonahbauer.wizard.common.messages.player.JuggleMessage;
|
import eu.jonahbauer.wizard.common.messages.player.JuggleMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
|
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
|
||||||
import eu.jonahbauer.wizard.common.model.Card;
|
import eu.jonahbauer.wizard.common.model.Card;
|
||||||
import eu.jonahbauer.wizard.core.Game;
|
import eu.jonahbauer.wizard.core.machine.Game;
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
import eu.jonahbauer.wizard.core.machine.GameState;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
import static eu.jonahbauer.wizard.common.messages.observer.UserInputMessage.Action.*;
|
import static eu.jonahbauer.wizard.common.messages.observer.UserInputMessage.Action.*;
|
||||||
import static eu.jonahbauer.wizard.core.states.GameData.*;
|
import static eu.jonahbauer.wizard.core.machine.states.GameData.*;
|
||||||
|
|
||||||
public final class Juggling extends TrickState {
|
public final class Juggling extends TrickState {
|
||||||
private final transient Map<UUID, Card> juggledCards = new ConcurrentHashMap<>();
|
private final transient Map<UUID, Card> juggledCards = new ConcurrentHashMap<>();
|
||||||
@@ -1,22 +1,22 @@
|
|||||||
package eu.jonahbauer.wizard.core.states.trick;
|
package eu.jonahbauer.wizard.core.machine.states.trick;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.TimeoutMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.TimeoutMessage;
|
||||||
import eu.jonahbauer.wizard.common.model.Card;
|
import eu.jonahbauer.wizard.common.model.Card;
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
import eu.jonahbauer.wizard.core.Game;
|
import eu.jonahbauer.wizard.core.machine.Game;
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
import eu.jonahbauer.wizard.core.machine.GameState;
|
||||||
import eu.jonahbauer.wizard.core.states.InvalidDataException;
|
import eu.jonahbauer.wizard.core.machine.states.InvalidDataException;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.CardMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.CardMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.UserInputMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.UserInputMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.player.PlayCardMessage;
|
import eu.jonahbauer.wizard.common.messages.player.PlayCardMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
|
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
|
||||||
import eu.jonahbauer.wizard.core.model.card.GameCards;
|
import eu.jonahbauer.wizard.core.model.card.GameCards;
|
||||||
import eu.jonahbauer.wizard.common.util.Pair;
|
import eu.jonahbauer.wizard.core.util.Pair;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import static eu.jonahbauer.wizard.core.states.GameData.*;
|
import static eu.jonahbauer.wizard.core.machine.states.GameData.*;
|
||||||
import static eu.jonahbauer.wizard.common.messages.observer.UserInputMessage.Action.PLAY_CARD;
|
import static eu.jonahbauer.wizard.common.messages.observer.UserInputMessage.Action.PLAY_CARD;
|
||||||
|
|
||||||
public final class PlayingCard extends TrickState {
|
public final class PlayingCard extends TrickState {
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package eu.jonahbauer.wizard.core.states.trick;
|
package eu.jonahbauer.wizard.core.machine.states.trick;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.core.Game;
|
import eu.jonahbauer.wizard.core.machine.Game;
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
import eu.jonahbauer.wizard.core.machine.GameState;
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
package eu.jonahbauer.wizard.core.states.trick;
|
package eu.jonahbauer.wizard.core.machine.states.trick;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
import eu.jonahbauer.wizard.core.states.round.RoundState;
|
import eu.jonahbauer.wizard.core.machine.states.round.RoundState;
|
||||||
|
|
||||||
import static eu.jonahbauer.wizard.core.states.GameData.*;
|
import static eu.jonahbauer.wizard.core.machine.states.GameData.*;
|
||||||
|
|
||||||
public abstract class TrickState extends RoundState {
|
public abstract class TrickState extends RoundState {
|
||||||
public static GameData requirements(GameData data) {
|
public static GameData requirements(GameData data) {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package eu.jonahbauer.wizard.core;
|
package eu.jonahbauer.wizard.core.messages;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.ObserverMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.ObserverMessage;
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package eu.jonahbauer.wizard.core.model.card;
|
package eu.jonahbauer.wizard.core.model.card;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.model.Card;
|
import eu.jonahbauer.wizard.common.model.Card;
|
||||||
import eu.jonahbauer.wizard.common.util.Pair;
|
import eu.jonahbauer.wizard.core.util.Pair;
|
||||||
import lombok.experimental.UtilityClass;
|
import lombok.experimental.UtilityClass;
|
||||||
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package eu.jonahbauer.wizard.core.model.card;
|
package eu.jonahbauer.wizard.core.model.card;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.model.Card;
|
import eu.jonahbauer.wizard.common.model.Card;
|
||||||
import eu.jonahbauer.wizard.common.util.Pair;
|
import eu.jonahbauer.wizard.core.util.Pair;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package eu.jonahbauer.wizard.core.model.card;
|
package eu.jonahbauer.wizard.core.model.card;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.model.Card;
|
import eu.jonahbauer.wizard.common.model.Card;
|
||||||
import eu.jonahbauer.wizard.common.util.Pair;
|
import eu.jonahbauer.wizard.core.util.Pair;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package eu.jonahbauer.wizard.core.model.card;
|
package eu.jonahbauer.wizard.core.model.card;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.model.Card;
|
import eu.jonahbauer.wizard.common.model.Card;
|
||||||
import eu.jonahbauer.wizard.common.util.Pair;
|
import eu.jonahbauer.wizard.core.util.Pair;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package eu.jonahbauer.wizard.core.model.card;
|
package eu.jonahbauer.wizard.core.model.card;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.model.Card;
|
import eu.jonahbauer.wizard.common.model.Card;
|
||||||
import eu.jonahbauer.wizard.common.util.Pair;
|
import eu.jonahbauer.wizard.core.util.Pair;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package eu.jonahbauer.wizard.core.model.card;
|
package eu.jonahbauer.wizard.core.model.card;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.model.Card;
|
import eu.jonahbauer.wizard.common.model.Card;
|
||||||
import eu.jonahbauer.wizard.common.util.Pair;
|
import eu.jonahbauer.wizard.core.util.Pair;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.jetbrains.annotations.Contract;
|
import org.jetbrains.annotations.Contract;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package eu.jonahbauer.wizard.core.model.card;
|
package eu.jonahbauer.wizard.core.model.card;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.model.Card;
|
import eu.jonahbauer.wizard.common.model.Card;
|
||||||
import eu.jonahbauer.wizard.common.util.Pair;
|
import eu.jonahbauer.wizard.core.util.Pair;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
package eu.jonahbauer.wizard.core.states;
|
|
||||||
|
|
||||||
public interface TransientState {
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
package eu.jonahbauer.wizard.core.states.game;
|
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.core.Game;
|
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
|
||||||
import eu.jonahbauer.wizard.core.states.round.StartingRound;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
import static eu.jonahbauer.wizard.core.states.GameData.PLAYERS;
|
|
||||||
|
|
||||||
public final class Starting extends GameState {
|
|
||||||
|
|
||||||
public Starting(GameData data) {
|
|
||||||
super(data.require(PLAYERS));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Optional<GameState> onEnter(Game game) {
|
|
||||||
return transition(new StartingRound(getData()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
package eu.jonahbauer.wizard.core.states.round;
|
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.model.Card;
|
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
|
||||||
import eu.jonahbauer.wizard.core.Game;
|
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.TrumpMessage;
|
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
|
||||||
import eu.jonahbauer.wizard.core.model.card.GameCards;
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
import static eu.jonahbauer.wizard.core.states.GameData.*;
|
|
||||||
|
|
||||||
public final class DeterminingTrump extends RoundState {
|
|
||||||
|
|
||||||
public DeterminingTrump(GameData data) {
|
|
||||||
super(data.require(TRUMP_CARD).requireEach(PLAYERS, HANDS));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Optional<GameState> onEnter(Game game) {
|
|
||||||
Card trumpCard = get(TRUMP_CARD);
|
|
||||||
|
|
||||||
// handle werewolf
|
|
||||||
for (Map.Entry<UUID, List<Card>> entry : get(HANDS).entrySet()) {
|
|
||||||
var player = entry.getKey();
|
|
||||||
var hand = entry.getValue();
|
|
||||||
if (hand.contains(Card.WEREWOLF)) {
|
|
||||||
game.notify(new TrumpMessage(trumpCard, null));
|
|
||||||
game.notify(new TrumpMessage(Card.WEREWOLF, null));
|
|
||||||
|
|
||||||
var data = getData().with(CURRENT_PLAYER, player);
|
|
||||||
return sync(data, DeterminingTrumpUserInput::new);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// default trump handling
|
|
||||||
Card.Suit trumpSuit = trumpCard != null ? GameCards.get(trumpCard).getTrumpSuit() : Card.Suit.NONE;
|
|
||||||
if (trumpSuit == null) {
|
|
||||||
var player = getDealer();
|
|
||||||
game.notify(new TrumpMessage(trumpCard, null));
|
|
||||||
|
|
||||||
var data = getData().with(CURRENT_PLAYER, player);
|
|
||||||
return sync(data, DeterminingTrumpUserInput::new);
|
|
||||||
} else {
|
|
||||||
var data = getData().with(
|
|
||||||
TRUMP_SUIT, trumpSuit,
|
|
||||||
CURRENT_PLAYER, getNextPlayer(getDealer())
|
|
||||||
);
|
|
||||||
|
|
||||||
game.notify(new TrumpMessage(get(TRUMP_CARD), trumpSuit));
|
|
||||||
|
|
||||||
return sync(data, Predicting::new);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package eu.jonahbauer.wizard.common.util;
|
package eu.jonahbauer.wizard.core.util;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package eu.jonahbauer.wizard.common.util;
|
package eu.jonahbauer.wizard.core.util;
|
||||||
|
|
||||||
import lombok.experimental.UtilityClass;
|
import lombok.experimental.UtilityClass;
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
@UtilityClass
|
@UtilityClass
|
||||||
public class StringUtil {
|
public class Util {
|
||||||
public static String toSnakeCase(String str) {
|
public static String toSnakeCase(String str) {
|
||||||
return str.replaceAll("([a-z])([A-Z]+)", "$1_$2").toLowerCase(Locale.ROOT);
|
return str.replaceAll("([a-z])([A-Z]+)", "$1_$2").toLowerCase(Locale.ROOT);
|
||||||
}
|
}
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
module eu.jonahbauer.wizard.core {
|
|
||||||
exports eu.jonahbauer.wizard.core;
|
|
||||||
|
|
||||||
requires eu.jonahbauer.wizard.common;
|
|
||||||
|
|
||||||
requires static lombok;
|
|
||||||
requires static org.jetbrains.annotations;
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
package eu.jonahbauer.wizard.core;
|
package eu.jonahbauer.wizard.core.machine;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.model.Configuration;
|
import eu.jonahbauer.wizard.core.model.Configurations;
|
||||||
import eu.jonahbauer.wizard.core.Game;
|
|
||||||
import org.junit.jupiter.api.RepeatedTest;
|
import org.junit.jupiter.api.RepeatedTest;
|
||||||
import org.junit.jupiter.api.RepetitionInfo;
|
import org.junit.jupiter.api.RepetitionInfo;
|
||||||
|
|
||||||
@@ -14,7 +13,7 @@ public class GameTest {
|
|||||||
public void runDefault(RepetitionInfo repetitionInfo) throws InterruptedException, ExecutionException {
|
public void runDefault(RepetitionInfo repetitionInfo) throws InterruptedException, ExecutionException {
|
||||||
Game game = new Game(
|
Game game = new Game(
|
||||||
repetitionInfo.getCurrentRepetition(),
|
repetitionInfo.getCurrentRepetition(),
|
||||||
Configuration.DEFAULT, 0, 0,
|
Configurations.DEFAULT.withTimeout(0).withSyncTimeout(0),
|
||||||
(player, msg) -> System.out.println(msg)
|
(player, msg) -> System.out.println(msg)
|
||||||
);
|
);
|
||||||
var players = List.of(
|
var players = List.of(
|
||||||
@@ -32,7 +31,7 @@ public class GameTest {
|
|||||||
public void runAnniversary2016(RepetitionInfo repetitionInfo) throws InterruptedException, ExecutionException {
|
public void runAnniversary2016(RepetitionInfo repetitionInfo) throws InterruptedException, ExecutionException {
|
||||||
Game game = new Game(
|
Game game = new Game(
|
||||||
repetitionInfo.getCurrentRepetition(),
|
repetitionInfo.getCurrentRepetition(),
|
||||||
Configuration.ANNIVERSARY_2016, 0, 0,
|
Configurations.ANNIVERSARY_2016.withTimeout(0).withSyncTimeout(0),
|
||||||
(player, msg) -> System.out.println(msg)
|
(player, msg) -> System.out.println(msg)
|
||||||
);
|
);
|
||||||
var players = List.of(
|
var players = List.of(
|
||||||
@@ -50,7 +49,7 @@ public class GameTest {
|
|||||||
public void runAnniversary2021(RepetitionInfo repetitionInfo) throws InterruptedException, ExecutionException {
|
public void runAnniversary2021(RepetitionInfo repetitionInfo) throws InterruptedException, ExecutionException {
|
||||||
Game game = new Game(
|
Game game = new Game(
|
||||||
repetitionInfo.getCurrentRepetition(),
|
repetitionInfo.getCurrentRepetition(),
|
||||||
Configuration.ANNIVERSARY_2021, 0, 0,
|
Configurations.ANNIVERSARY_2021.withTimeout(0).withSyncTimeout(0),
|
||||||
(player, msg) -> System.out.println(msg)
|
(player, msg) -> System.out.println(msg)
|
||||||
);
|
);
|
||||||
var players = List.of(
|
var players = List.of(
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
package eu.jonahbauer.wizard.core;
|
package eu.jonahbauer.wizard.core.machine;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.core.states.game.Finished;
|
import eu.jonahbauer.wizard.core.machine.states.game.Finished;
|
||||||
import lombok.experimental.UtilityClass;
|
import lombok.experimental.UtilityClass;
|
||||||
import org.mockito.Mockito;
|
import org.mockito.Mockito;
|
||||||
import org.mockito.stubbing.Answer;
|
import org.mockito.stubbing.Answer;
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package eu.jonahbauer.wizard.core;
|
package eu.jonahbauer.wizard.core.machine;
|
||||||
|
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.ObserverMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.ObserverMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.observer.UserInputMessage;
|
import eu.jonahbauer.wizard.common.messages.observer.UserInputMessage;
|
||||||
import eu.jonahbauer.wizard.common.messages.player.*;
|
import eu.jonahbauer.wizard.common.messages.player.*;
|
||||||
import eu.jonahbauer.wizard.common.model.Card;
|
import eu.jonahbauer.wizard.common.model.Card;
|
||||||
import eu.jonahbauer.wizard.core.states.GameData;
|
import eu.jonahbauer.wizard.core.machine.states.GameData;
|
||||||
import eu.jonahbauer.wizard.core.states.GameState;
|
import eu.jonahbauer.wizard.core.messages.Observer;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||