From e00b93d13c66adc79b2e3324e262184e67ef5d26 Mon Sep 17 00:00:00 2001 From: Jonah Bauer Date: Fri, 14 Jan 2022 13:58:06 +0100 Subject: [PATCH] improved instructions screen (#18) --- .../libgdx/screens/InstructionScreen.java | 346 ++++++++++-------- .../client/libgdx/screens/MainMenuScreen.java | 37 +- .../client/libgdx/screens/MenuScreen.java | 10 +- .../client/libgdx/screens/WizardScreen.java | 2 +- .../main/resources/i18n/messages.properties | 212 +++++------ .../resources/i18n/messages_de.properties | 194 +++++----- .../jonahbauer/wizard/common/model/Card.java | 22 +- 7 files changed, 425 insertions(+), 398 deletions(-) diff --git a/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/InstructionScreen.java b/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/InstructionScreen.java index d2cf1a7..b0ddab5 100644 --- a/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/InstructionScreen.java +++ b/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/InstructionScreen.java @@ -1,30 +1,30 @@ package eu.jonahbauer.wizard.client.libgdx.screens; -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.ui.*; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; -import eu.jonahbauer.wizard.client.libgdx.GameAtlas; +import com.badlogic.gdx.utils.Align; import eu.jonahbauer.wizard.client.libgdx.WizardGame; import eu.jonahbauer.wizard.client.libgdx.actors.CardActor; +import eu.jonahbauer.wizard.client.libgdx.listeners.KeyboardFocusManager; import eu.jonahbauer.wizard.client.libgdx.state.Menu; +import eu.jonahbauer.wizard.client.libgdx.util.WizardAssetManager; import eu.jonahbauer.wizard.common.model.Card; public class InstructionScreen extends MenuScreen { + private static final int MAX_PAGE = 3; private TextButton buttonOK; private VerticalGroup content; private ScrollPane scrollPane; - private Label title; private TextButton nextPageButton; private TextButton previousPageButton; - private HorizontalGroup horizontalButtonGroup; - private int pagecounter = 0; + + private int currentPage = 0; private TextureAtlas atlas; - private CardActor card; private final ChangeListener listener = new ChangeListener() { @Override @@ -33,17 +33,13 @@ public class InstructionScreen extends MenuScreen { game.getClient().execute(Menu.class, Menu::showMenuScreen); sfxClick(); } else if (actor == nextPageButton) { - switch(pagecounter) { - case 0: pagecounter++; showSecondPage(); break; - case 1: pagecounter++; showThirdPage(); break; - default: throw new IllegalStateException(); - } + currentPage = MathUtils.clamp(currentPage + 1, 0, MAX_PAGE); + showPage(currentPage); + sfxClick(); } else if (actor == previousPageButton) { - switch(pagecounter) { - case 1: pagecounter--; showFirstPage(); break; - case 2: pagecounter--; showSecondPage(); break; - default: throw new IllegalStateException(); - } + currentPage = MathUtils.clamp(currentPage - 1, 0, MAX_PAGE); + showPage(currentPage); + sfxClick(); } } }; @@ -52,199 +48,239 @@ public class InstructionScreen extends MenuScreen { super(game); } + @Override + protected void load() { + super.load(); + assets.loadGame(); + assets.finishLoading(); + + atlas = assets.get(WizardAssetManager.ATLAS_GAME); + } + @Override public void show() { super.show(); - prepareScreen(); + + content = new VerticalGroup().left().grow().pad(20); + + getTitle().moveBy(0, 80); + getButtonGroup().moveBy(0, - 80); previousPageButton = new TextButton(messages.get("menu.instruction.previousPageButton"), skin); - nextPageButton = new TextButton(messages.get("menu.instruction.nextPageButton"), skin); - horizontalButtonGroup = new HorizontalGroup(); + previousPageButton.addListener(listener); + getButtonGroup().addActor(previousPageButton); - buttonOK = new TextButton(messages.get("menu.main.ok"), skin); + buttonOK = new TextButton(messages.get("menu.instruction.back"), skin); + buttonOK.addListener(listener); + getButtonGroup().addActor(buttonOK); - scrollPane = new ScrollPane(content, skin); - scrollPane.setFadeScrollBars(true); - scrollPane.setOverscroll(false,false); - scrollPane.setPosition(corners[0].getWidth() + 5, 0); - scrollPane.setSize(WizardGame.WIDTH - (2 * corners[0].getWidth() + 5), WizardGame.HEIGHT); - scrollPane.setColor(new Color(0, 0, 0, 0.75f)); + nextPageButton = new TextButton(messages.get("menu.instruction.nextPageButton"), skin); + nextPageButton.addListener(listener); + getButtonGroup().addActor(nextPageButton); - showFirstPage(); - Gdx.input.setInputProcessor(stage); + scrollPane = new ScrollPane(content, skin); + scrollPane.setPosition(0.175f * WizardGame.WIDTH, 0.2f * WizardGame.HEIGHT); + scrollPane.setSize(0.65f * WizardGame.WIDTH, 400 + 0.1f * WizardGame.HEIGHT + 80); stage.addActor(scrollPane); - buttonOK.addListener(listener); - nextPageButton.addListener(listener); - previousPageButton.addListener(listener); - } + stage.addCaptureListener(new KeyboardFocusManager(scrollPane, previousPageButton, buttonOK, nextPageButton)); - private void prepareScreen() { - atlas = new TextureAtlas(Gdx.files.internal(GameAtlas.$PATH)); - content = new VerticalGroup(); + showFirstPage(); } - private void clearContent() { - while(content.getChildren().size > 0) { - content.removeActorAt(0, false); + private void showPage(int page) { + switch (page) { + case 0 -> showFirstPage(); + case 1 -> showSecondPage(); + case 2 -> showThirdPage(); + case 3 -> showFourthPage(); + default -> throw new AssertionError(); } - horizontalButtonGroup.clear(); } - private void addButtons() { - if(pagecounter != 0) { - horizontalButtonGroup.addActor(previousPageButton); - } - if(pagecounter != 2) { - horizontalButtonGroup.addActor(nextPageButton); - } - horizontalButtonGroup.space(10); - content.addActor(horizontalButtonGroup); - content.addActor(buttonOK); + private void showFirstPage() { + currentPage = 0; + reset(); + + startSection("menu.instruction.main.title"); + startSubsection("menu.instruction.main.welcome.title"); + addParagraph("menu.instruction.main.welcome.par0"); + startSubsection("menu.instruction.main.general.title"); + addParagraph("menu.instruction.main.general.par0"); } - private void showFirstPage() { - clearContent(); - - title = new Label(messages.get("menu.instruction.main"), skin, "enchanted"); - content.addActor(title); - Label maintext1 = new Label(messages.get("menu.instruction.main.text1"), skin); - maintext1.setFontScale(2.0f); - content.addActor(maintext1); - Label maintext2 = new Label(messages.get("menu.instruction.main.text2"), skin); - content.addActor(maintext2); - Label general = new Label(messages.get("menu.instruction.general"), skin, "enchanted"); - general.getText(); - content.addActor(general); - Label introduction1 = new Label(messages.get("menu.instruction.introduction1"), skin); - content.addActor(introduction1); - Label introduction2 = new Label(messages.get("menu.instruction.introduction2"), skin); - content.addActor(introduction2); - Label headingStandardGame = new Label(messages.get("menu.instruction.standardgameheading"), skin, "enchanted"); - content.addActor(headingStandardGame); - Label standardGame1 = new Label(messages.get("menu.instruction.standardgame1"), skin); - content.addActor(standardGame1); - Label standardGame2 = new Label(messages.get("menu.instruction.standardgame2"), skin); - content.addActor(standardGame2); - Label standardGame3 = new Label(messages.get("menu.instruction.standardgame3"), skin); - content.addActor(standardGame3); - HorizontalGroup colors = new HorizontalGroup(); - colors.space(10); - for(Card.Suit suit : Card.Suit.values()) { + private void showSecondPage() { + currentPage = 1; + reset(); + + startSection("menu.instruction.standard.title"); + addParagraph("menu.instruction.standard.par0"); + + var colors = new HorizontalGroup().space(10).pad(10).center(); + for (Card.Suit suit : Card.Suit.values()) { if (suit != Card.Suit.NONE) { - VerticalGroup cardColor = new VerticalGroup(); - cardColor.space(10); - card = new CardActor(Card.Suit.values()[suit.ordinal()], atlas); - cardColor.addActor(card); - Label colorLabel = new Label(suit.toString(), skin); - cardColor.addActor(colorLabel); - colors.addActor(cardColor); + VerticalGroup suitGroup = new VerticalGroup().space(10); + suitGroup.addActor(new CardActor(suit, atlas)); + suitGroup.addActor(new Label(switch (suit) { + case RED -> messages.get("menu.instruction.suit.red"); + case GREEN -> messages.get("menu.instruction.suit.green"); + case BLUE -> messages.get("menu.instruction.suit.blue"); + case YELLOW -> messages.get("menu.instruction.suit.yellow"); + default -> suit.toString(); + }, skin)); + colors.addActor(suitGroup); } } content.addActor(colors); - Label standardGame4 = new Label(messages.get("menu.instruction.standardgame4"), skin); - content.addActor(standardGame4); - - HorizontalGroup wizardJester = new HorizontalGroup(); - wizardJester.padTop(5); - wizardJester.space(10); - - VerticalGroup wizardVerticalGroup = new VerticalGroup(); - wizardVerticalGroup.space(10); - card = new CardActor(Card.values()[Card.BLUE_WIZARD.ordinal()], atlas); - wizardVerticalGroup.addActor(card); - Label wizardLabel = new Label(messages.get("menu.instruction.wizard"), skin); - wizardVerticalGroup.addActor(wizardLabel); - wizardJester.addActor(wizardVerticalGroup); - - VerticalGroup jesterVerticalGroup = new VerticalGroup(); - jesterVerticalGroup.space(10); - card = new CardActor(Card.values()[Card.BLUE_JESTER.ordinal()], atlas); - jesterVerticalGroup.addActor(card); - Label jesterLabel = new Label(messages.get("menu.instruction.jester"), skin); - jesterVerticalGroup.addActor(jesterLabel); - wizardJester.addActor(jesterVerticalGroup); - content.addActor(wizardJester); - Label standardGame5 = new Label(messages.get("menu.instruction.standardgame5"), skin); - content.addActor(standardGame5); - Label standardGame6 = new Label(messages.get("menu.instruction.standardgame6"), skin); - standardGame6.setFontScale(2.0f); - content.addActor(standardGame6); - Label standardGame7 = new Label(messages.get("menu.instruction.standardgame7"), skin); - content.addActor(standardGame7); - Label standardGame8 = new Label(messages.get("menu.instruction.standardgame8"), skin); - standardGame8.setFontScale(2.0f); - content.addActor(standardGame8); - Label standardGame9 = new Label(messages.get("menu.instruction.standardgame9"), skin); - content.addActor(standardGame9); - Label scoring = new Label(messages.get("menu.instruction.scoring"), skin, "enchanted"); - content.addActor(scoring); - Label standardGame10 = new Label(messages.get("menu.instruction.standardgame10"), skin); - content.addActor(standardGame10); - addButtons(); + + addParagraph("menu.instruction.standard.par1"); + + var specialCards = new HorizontalGroup().space(10).pad(10).center(); + + var wizard = new VerticalGroup(); + wizard.addActor(new CardActor(Card.BLUE_WIZARD, atlas)); + wizard.addActor(new Label(messages.get("menu.instruction.wizard"), skin)); + specialCards.addActor(wizard); + + var jester = new VerticalGroup(); + jester.addActor(new CardActor(Card.BLUE_JESTER, atlas)); + jester.addActor(new Label(messages.get("menu.instruction.jester"), skin)); + specialCards.addActor(jester); + + content.addActor(specialCards); + + addParagraph("menu.instruction.standard.par2"); + + startSubsection("menu.instruction.standard.trick.title"); + addParagraph("menu.instruction.standard.trick.par0"); + + startSubsection("menu.instruction.standard.special_cases.title"); + addParagraph("menu.instruction.standard.special_cases.par0"); + + startSubsection("menu.instruction.standard.scoring.title"); + addParagraph("menu.instruction.standard.scoring.par0"); } - private void showSecondPage() { - clearContent(); - title.setText(messages.get("menu.instruction.variant.title")); - content.addActor(title); + private void showThirdPage() { + currentPage = 2; + reset(); + + startSection("menu.instruction.variant.title"); + Label variantsIntro = new Label(messages.get("menu.instruction.variant.intro"), skin); content.addActor(variantsIntro); - Table table = new Table(skin); - table.defaults().space(15.0f).left().pad(25.0f); + Table table = new Table(skin).padTop(10); + table.defaults().space(10.0f).left().top(); + table.columnDefaults(1).grow(); table.add(messages.get("menu.instruction.variant.default")); - table.add(messages.get("menu.instruction.variant.default.description")); + table.add(messages.get("menu.instruction.variant.default.description")).getActor().setWrap(true); table.row(); table.add(messages.get("menu.instruction.variant.defaultpm1")); - table.add(messages.get("menu.instruction.variant.defaultpm1.description")); + table.add(messages.get("menu.instruction.variant.defaultpm1.description")).getActor().setWrap(true); table.row(); table.add(messages.get("menu.instruction.variant.anniversary2016")); - table.add(messages.get("menu.instruction.variant.anniversary2016.description")); + table.add(messages.get("menu.instruction.variant.anniversary2016.description")).getActor().setWrap(true); table.row(); table.add(messages.get("menu.instruction.variant.anniversary2016pm1")); - table.add(messages.get("menu.instruction.variant.anniversary2016pm1.description")); + table.add(messages.get("menu.instruction.variant.anniversary2016pm1.description")).getActor().setWrap(true); table.row(); table.add(messages.get("menu.instruction.variant.anniversary2021")); - table.add(messages.get("menu.instruction.variant.anniversary2021.description")); + table.add(messages.get("menu.instruction.variant.anniversary2021.description")).getActor().setWrap(true); table.row(); table.add(messages.get("menu.instruction.variant.anniversary2021pm1")); - table.add(messages.get("menu.instruction.variant.anniversary2021pm1.description")); + table.add(messages.get("menu.instruction.variant.anniversary2021pm1.description")).getActor().setWrap(true); table.row(); content.addActor(table); - addButtons(); - scrollPane.setScrollY(0); } - private void showThirdPage() { - clearContent(); - title.setText(messages.get("menu.instruction.special_card.title")); - content.addActor(title); - Label specialCardsIntro = new Label(messages.get("menu.instruction.special_card.intro"), skin); - content.addActor(specialCardsIntro); - Table table = new Table(skin); - table.defaults().space(15.0f).left().pad(25.0f); + private void showFourthPage() { + currentPage = 3; + reset(); + + startSection("menu.instruction.special_card.title"); + addParagraph("menu.instruction.special_card.intro"); + + Table table = new Table(skin).padTop(10); + table.defaults().space(10.0f).left().top(); + table.columnDefaults(1).grow(); table.add(new CardActor((Card.DRAGON), atlas)); - table.add(messages.get("menu.instruction.special_card.dragon")); + table.add(messages.get("menu.instruction.special_card.dragon")).getActor().setWrap(true); table.row(); table.add(new CardActor((Card.FAIRY), atlas)); - table.add(messages.get("menu.instruction.special_card.fairy")); + table.add(messages.get("menu.instruction.special_card.fairy")).getActor().setWrap(true); table.row(); table.add(new CardActor((Card.BOMB), atlas)); - table.add(messages.get("menu.instruction.special_card.bomb")); + table.add(messages.get("menu.instruction.special_card.bomb")).getActor().setWrap(true); table.row(); table.add(new CardActor((Card.WEREWOLF), atlas)); - table.add(messages.get("menu.instruction.special_card.werewolf")); + table.add(messages.get("menu.instruction.special_card.werewolf")).getActor().setWrap(true); table.row(); table.add(new CardActor((Card.JUGGLER), atlas)); - table.add(messages.get("menu.instruction.special_card.juggler")); + table.add(messages.get("menu.instruction.special_card.juggler")).getActor().setWrap(true); table.row(); table.add(new CardActor((Card.CLOUD), atlas)); - table.add(messages.get("menu.instruction.special_card.cloud")); + table.add(messages.get("menu.instruction.special_card.cloud")).getActor().setWrap(true); table.row(); table.add(new CardActor((Card.CHANGELING), atlas)); - table.add(messages.get("menu.instruction.special_card.changeling")); + table.add(messages.get("menu.instruction.special_card.changeling")).getActor().setWrap(true); table.row(); content.addActor(table); - addButtons(); + } + + private void reset() { + updateButtons(); + content.clearChildren(); + scrollPane.setScrollY(0); + scrollPane.updateVisualScroll(); + } + + private void updateButtons() { + previousPageButton.setDisabled(currentPage == 0); + nextPageButton.setDisabled(currentPage == MAX_PAGE); + } + + private void startSection(String title) { + if (content.hasChildren()) { + var spacerPre = new Actor(); + spacerPre.setHeight(20); + spacerPre.setName("spacer"); + content.addActor(spacerPre); + } + + var label = new Label(messages.get(title).trim(), skin, "enchanted"); + label.setAlignment(Align.center); + content.addActor(label); + + var spacerPost = new Actor(); + spacerPost.setHeight(10); + spacerPost.setName("spacer"); + content.addActor(spacerPost); + } + + private void startSubsection(String title) { + if (content.hasChildren() && !"spacer".equals(content.getChild(content.getChildren().size - 1).getName())) { + var spacerPre = new Actor(); + spacerPre.setHeight(10); + spacerPre.setName("spacer"); + content.addActor(spacerPre); + } + + var label = new Label(messages.get(title), skin); + label.setFontScale(2.0f); + label.setAlignment(Align.center); + content.addActor(label); + } + + private void addParagraph(String paragraph) { + var label = new Label(messages.get(paragraph), skin); + label.setAlignment(Align.left); + label.setWrap(true); + content.addActor(label); + } + + @Override + public void dispose() { + super.dispose(); + assets.unloadGame(); } } diff --git a/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/MainMenuScreen.java b/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/MainMenuScreen.java index 79b9566..673a718 100644 --- a/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/MainMenuScreen.java +++ b/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/MainMenuScreen.java @@ -4,7 +4,9 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.ui.TextButton; +import com.badlogic.gdx.scenes.scene2d.ui.VerticalGroup; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; +import com.badlogic.gdx.scenes.scene2d.utils.Layout; import eu.jonahbauer.wizard.client.libgdx.UiskinAtlas; import eu.jonahbauer.wizard.client.libgdx.WizardGame; import eu.jonahbauer.wizard.client.libgdx.listeners.KeyboardFocusManager; @@ -57,20 +59,39 @@ public class MainMenuScreen extends MenuScreen { stage.addActor(symbol); } + var buttonGroup = new VerticalGroup() { + @Override + public void layout() { + float contentHeight = 0; + for (Actor child : getChildren()) { + if (child instanceof Layout layout) { + contentHeight += layout.getPrefHeight(); + } else { + contentHeight += child.getHeight(); + } + } + + space(Math.max(0, (getHeight() - contentHeight) / (getChildren().size - 1))); + super.layout(); + } + }.center().fill(); + buttonGroup.setPosition(WizardGame.WIDTH * 0.25f, 192 + 60f); + buttonGroup.setSize(WizardGame.WIDTH * 0.5f, 504 - 120f); + stage.addActor(buttonGroup); + buttonPlay = new TextButton(messages.get("menu.main.play"), skin); - buttonPlay.setPosition((WizardGame.WIDTH - buttonPlay.getWidth()) / 2f, 170 + 504 - 125f); buttonPlay.addListener(listener); - buttonInstruction = new TextButton(messages.get("menu.instruction.main"), skin); - buttonInstruction.setPosition((WizardGame.WIDTH - buttonInstruction.getWidth()) / 2f, 170 + 494 - 189.5f - 125f + buttonInstruction.getHeight() / 2f); + buttonGroup.addActor(buttonPlay); + + buttonInstruction = new TextButton(messages.get("menu.main.instructions"), skin); buttonInstruction.addListener(listener); + buttonGroup.addActor(buttonInstruction); + buttonQuit = new TextButton(messages.get("menu.main.quit"), skin); - buttonQuit.setPosition((WizardGame.WIDTH - buttonQuit.getWidth()) / 2f, 170 + 120f); buttonQuit.addListener(listener); + buttonGroup.addActor(buttonQuit); - stage.addActor(buttonPlay); - stage.addActor(buttonInstruction); - stage.addActor(buttonQuit); - stage.addCaptureListener(new KeyboardFocusManager(buttonPlay, buttonQuit)); + stage.addCaptureListener(new KeyboardFocusManager(buttonPlay, buttonInstruction, buttonQuit)); buttonPlay.setName("button_player"); buttonInstruction.setName("button_instruction"); diff --git a/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/MenuScreen.java b/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/MenuScreen.java index 9b12b0d..a57f240 100644 --- a/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/MenuScreen.java +++ b/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/MenuScreen.java @@ -9,7 +9,7 @@ import lombok.AccessLevel; import lombok.Getter; public abstract class MenuScreen extends WizardScreen { - protected Image[] corners; + private Image[] corners; @Getter(value = AccessLevel.PROTECTED, lazy = true) private final HorizontalGroup buttonGroup = createButtonGroup(); @@ -20,6 +20,9 @@ public abstract class MenuScreen extends WizardScreen { @Getter(value = AccessLevel.PROTECTED, lazy = true) private final SelectBox.SelectBoxStyle selectBoxErrorStyle = skin.get("error", SelectBox.SelectBoxStyle.class); + @Getter(AccessLevel.PROTECTED) + private Image title; + public MenuScreen(WizardGame game) { super(game); } @@ -37,7 +40,7 @@ public abstract class MenuScreen extends WizardScreen { stage.addActor(corner); } - var title = new Image(skin.getRegion(UiskinAtlas.TITLE)); + title = new Image(skin.getRegion(UiskinAtlas.TITLE)); title.setSize(810, 192); title.setPosition(555, WizardGame.HEIGHT - 192 - 96); stage.addActor(title); @@ -62,10 +65,11 @@ public abstract class MenuScreen extends WizardScreen { @Override protected void sizeChanged() { - setPosition((WizardGame.WIDTH - getWidth()) / 2f, WizardGame.HEIGHT * 0.15f); + setPosition((WizardGame.WIDTH - getWidth()) / 2f, getY()); } }; group.setSize(WizardGame.WIDTH * 0.45f, 125); + group.setY(WizardGame.HEIGHT * 0.15f); group.center(); stage.addActor(group); return group; diff --git a/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/WizardScreen.java b/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/WizardScreen.java index 390f0ae..fec5c26 100644 --- a/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/WizardScreen.java +++ b/wizard-client/wizard-client-libgdx/core/src/main/java/eu/jonahbauer/wizard/client/libgdx/screens/WizardScreen.java @@ -56,7 +56,7 @@ public abstract class WizardScreen implements Screen { stage = new Stage(viewport); stage.addListener(new ButtonKeyListener()); stage.addListener(new AutoFocusListener()); - //stage.setDebugAll(WizardGame.DEBUG); + stage.setDebugAll(WizardGame.DEBUG); Gdx.input.setInputProcessor(stage); diff --git a/wizard-client/wizard-client-libgdx/core/src/main/resources/i18n/messages.properties b/wizard-client/wizard-client-libgdx/core/src/main/resources/i18n/messages.properties index b63a85a..ff3167d 100644 --- a/wizard-client/wizard-client-libgdx/core/src/main/resources/i18n/messages.properties +++ b/wizard-client/wizard-client-libgdx/core/src/main/resources/i18n/messages.properties @@ -1,119 +1,119 @@ # suppress inspection "UnusedProperty" for whole file menu.main.play=Play +menu.main.instructions=Instructions menu.main.quit=Close -menu.main.ok=OK -menu.instruction.nextPageButton=Next Page -menu.instruction.previousPageButton=Previous Page +menu.instruction.nextPageButton=>> +menu.instruction.previousPageButton=<< +menu.instruction.back=Back + menu.instruction.wizard=Wizard menu.instruction.jester=Jester - -menu.instruction.main=Instruction of the game -menu.instruction.main.text1=Welcome -menu.instruction.main.text2=On this page you will find the rules of the basic game and the scoring system.\n\ -On the second page is an overview of the possible game variants \nand on the third an overview of the special cards.\n -menu.instruction.general=In General -menu.instruction.introduction1=Wizard is a trick game with the goal of predicting the exact number of self-winning tricks in each round. -menu.instruction.introduction2=For correct predictions each player gets points and in the end the player with the highest score wins.\n -menu.instruction.standardgameheading=Basic Game -menu.instruction.standardgame1=In the basic game there are 60 different cards. -menu.instruction.standardgame2=52 of these cards are distributed among the following four suits. -menu.instruction.standardgame3=The highest card is 13, the lowest card is 1. -menu.instruction.standardgame4=The 8 remaining cards are divided equally between Wizards and Jesters and have no suit.\n\ -The four wizards have a higher value than all other cards and the four jesters have a lower value. -menu.instruction.standardgame5=For each round count: the number of rounds equals the number of cards per player equals and the number of tricks\n\ -the cards are dealt virtually as the dealer one of the players.\n\ -After the cards are dealt, a trump suit is determined. It corresponds to the suit of the card\n\ -which is displayed in the bottom left corner of the game screen.\n\ -A trump is any card of the trump suit and higher than all cards of the other suits.\n\ -Important. If the card determining the trump is a jester, there is no trump in this round.\n\ -If the trump card is a Wizard, the dealer chooses a trump suit.\n\ -Once the trump suit is determined, each player states how many tricks they want to make in the round.\n\ -Tip for newcomers: A good hand for many tricks has wizards, trump cards and high suit cards.\n -menu.instruction.standardgame6=The process of a trick -menu.instruction.standardgame7=The first card of a trick is played at the first trick by the dealer's virtual left neighbor.\n\ -All further tricks are opened by the player who won the last trick.\n\ -After that, all players play one card in clockwise order.\n\ -To the suit of the first card must be added. This means that if a player has a suit of this card\n\ -he must play it and must not play a card of any other suit.\n\ -Exceptions to this are wizards and jesters. These cards may always be played!\n\ -The trick is won by the player with the highest card.\nThe following descending rank for the highest card applies:\n\ - +The first wizard in a trick\n\ - +The highest trump card\n\ - +The highest suit card of the played suit. -menu.instruction.standardgame8=Special cases -menu.instruction.standardgame9=If a player starts a trick with a wizard, the other players may play any\n\ -cards, including any other Wizards or Jesters.\nThe trick goes to the first Wizard in any case.\n\n\ -If a player opens a trick with a Jester, any cards may be played\n\ -until an another player plays a wizard or a number card. If it is a number card,\n\ -all further cards must be added to its suit.\n\ -If it is a wizard, any cards may be played.\n\ -In the rare case that only jesters are in the trick, the first jester wins.\n -menu.instruction.scoring=Scoring -menu.instruction.standardgame10=If the prediction is correct, 10 points are awarded for each trick made plus\n\ -20 points as a basic amount.\nIf the prediction is wrong, -10 points are awarded for each deviating trick and the player\n\ -does not receive any basic amount.\n\ -The score is then offset against a player's previous score.\n +menu.instruction.suit.blue=Blue +menu.instruction.suit.green=Green +menu.instruction.suit.yellow=Yellow +menu.instruction.suit.red=Red + +menu.instruction.main.title=Instructions +menu.instruction.main.welcome.title=Welcome +menu.instruction.main.welcome.par0=On the next page you will find the rules of the basic game and the scoring system. \ + On the third page there is an overview of the possible game variants and on the fourth an overview of the special cards. +menu.instruction.main.general.title=In General +menu.instruction.main.general.par0=Wizard is a trick game with the goal of predicting the exact number of self-winning \ + tricks in each round. For correct predictions each player gets points and in the end the player with the highest score\ + \ wins. +menu.instruction.standard.title=Basic Game +menu.instruction.standard.par0=In the basic game there are 60 different cards. 52 of these cards are distributed among \ + the following four suits. The highest card is 13, the lowest card is 1. +menu.instruction.standard.par1=The 8 remaining cards are divided equally between Wizards and Jesters and have no suit. \ + The four wizards have a higher value than all other cards and the four jesters have a lower value. +menu.instruction.standard.par2=For each round count: the number of rounds equals the number of cards per player equals \ + and the number of tricks the cards are dealt virtually as the dealer one of the players. After the cards are dealt, \ + a trump suit is determined. It corresponds to the suit of the card which is displayed in the bottom left corner of \ + the game screen. A trump is any card of the trump suit and higher than all cards of the other suits.\n\ + Important. If the card determining the trump is a jester, there is no trump in this round. \ + If the trump card is a Wizard, the dealer chooses a trump suit. \ + Once the trump suit is determined, each player states how many tricks they want to make in the round. \ + Tip for newcomers: A good hand for many tricks has wizards, trump cards and high suit cards. +menu.instruction.standard.trick.title=The process of a trick +menu.instruction.standard.trick.par0=The first card of a trick is played at the first trick by the dealer's virtual \ + left neighbor. All further tricks are opened by the player who won the last trick. After that, all players play one \ + card in clockwise order. To the suit of the first card must be added. This means that if a player has a suit of this \ + card he must play it and must not play a card of any other suit. Exceptions to this are wizards and jesters. These \ + cards may always be played! The trick is won by the player with the highest card. The following descending rank for \ + the highest card applies:\n\ + \ + The first wizard in a trick\n\ + \ + The highest trump card\n\ + \ + The highest suit card of the played suit. +menu.instruction.standard.special_cases.title=Special cases +menu.instruction.standard.special_cases.par0=If a player starts a trick with a wizard, the other players may play any \ + cards, including any other Wizards or Jesters. The trick goes to the first Wizard in any case.\n\n\ + If a player opens a trick with a Jester, any cards may be played until an another player plays a wizard or a number \ + card. If it is a number card, all further cards must be added to its suit. If it is a wizard, any cards may be played. \ + In the rare case that only jesters are in the trick, the first jester wins. +menu.instruction.standard.scoring.title=Scoring +menu.instruction.standard.scoring.par0=If the prediction is correct, 10 points are awarded for each trick made plus \ + 20 points as a basic amount.\nIf the prediction is wrong, -10 points are awarded for each deviating trick and the \ + player does not receive any basic amount.\n\ + The score is then offset against a player's previous score. menu.instruction.variant.title=Variants of the game menu.instruction.variant.intro=When creating a new game, the following 6 variants can be selected. menu.instruction.variant.default=1) Default menu.instruction.variant.default.description=The basic game with the basic rules. menu.instruction.variant.defaultpm1=2) Default PM1 -menu.instruction.variant.defaultpm1.description=The basic game with the additional condition that the prediction\n\ -must not correspond to the number of rounds.\n\ -This means: the tip of at least one player is wrong +menu.instruction.variant.defaultpm1.description=The basic game with the additional condition that the sum of all \ + predictions must not add up to the number of tricks. \ + This means: the prediction of at least one player is wrong menu.instruction.variant.anniversary2016=3) Anniversary 2016 -menu.instruction.variant.anniversary2016.description=The basic game with the basic rules and the special cards of the anniversary edition 2016. +menu.instruction.variant.anniversary2016.description=The basic game with the basic rules and the special cards of the \ + anniversary edition 2016. menu.instruction.variant.anniversary2016pm1=4) Anniversary 2016 PM1 -menu.instruction.variant.anniversary2016pm1.description=The basic game with the special cards of the anniversary edition 2016, with the\n\ -additional condition that the prediction must not correspond to the number of rounds. +menu.instruction.variant.anniversary2016pm1.description=The basic game with the special cards of the anniversary \ + edition 2016, with the additional condition that the prediction must not correspond to the number of rounds. menu.instruction.variant.anniversary2021=5) Anniversary 2021 -menu.instruction.variant.anniversary2021.description=The basic game with the basic rules and the special cards of the anniversary edition 2021. +menu.instruction.variant.anniversary2021.description=The basic game with the basic rules and the special cards of the \ + anniversary edition 2021. menu.instruction.variant.anniversary2021pm1=6) Anniversary 2021 PM1 -menu.instruction.variant.anniversary2021pm1.description=The basic game with the special cards of the 2021 anniversary edition, with the\n\ -additional condition that the prediction must not correspond to the number of rounds. +menu.instruction.variant.anniversary2021pm1.description=The basic game with the special cards of the 2021 anniversary \ + edition, with the additional condition that the prediction must not correspond to the number of rounds. menu.instruction.special_card.title=Special cards -menu.instruction.special_card.intro=The first six of the following special cards are part of both anniversary editions of 2016 and 2021.\n\ -The changeling is only part of the anniversary edition of 2021. -menu.instruction.special_card.dragon=The dragon is always playable.\n\ -The dragon is the highest card, even higher than every wizard,\n\ -and wins every trick except the same trick contains the fairy.\n\ -If the dragon is the determining trump card the dealer chooses the trump suit.\n\ -The dragon as the first card of a trick has the same effect as a wizard. -menu.instruction.special_card.fairy=The fairy is always playable.\n\ -The fairy is the lowest card of the game even lower than every jester\n\ -and looses every trick but a trick contains fairy and dragon. Then the fairy wins this trick.\n\ -If the fairy is the determining trump card there is no trump in the current round.\n\ -The fairy as the first card of a trick has the same effect as a jester. -menu.instruction.special_card.bomb=The bomb is always playable.\n\ -No player wins the trick containing the bomb and the trick does not count for any prediction.\n\ -The player, who would have won the trick, starts the next trick.\n\ -If the bomb is the determining trump card there is no trump in the current round.\n\ -The bomb as the first card of a trick causes the same rules as a jester. -menu.instruction.special_card.werewolf=If a player has the werewolf in his hand, he exchanges it at the beginning of the trick round\n\ -for the trump-defining card.\n\ -Then the player chooses a trump suit or chooses that there will be no trump this round.\n\ -After that, the first player makes his prediction.\n\ -If the dealer reveals the werewolf when determining the trump suit,\n\ -he determines a trump suit. -menu.instruction.special_card.juggler=The juggler is always playable.\n\ -He has the value 7 \u00bd, therefore he is higher than a 7 and lower than a 8.\n\ -The acting player determines the juggler's suit.\n\ -After the trick every player gives one of his cards to his left neighbor.\n\ -If the juggler is the determining trump card the dealer chooses the trump suit.\n\ -The juggler as the first card of a trick determines the suit of a trick. -menu.instruction.special_card.cloud=The cloud is always playable.\n\ -She has the value 9 \u00bd, therefore he is higher than a 9 and lower than a 10.\n\ -The acting player determines the suit of the cloud.\n\ -If any of a player's tricks contains the cloud, he must increment or decrease his prediction by 1\n\ -but the trick contains the cloud and the bomb.\n\ -If the cloud is the determining trump card the dealer chooses the trump suit.\n\ -The cloud as the first card of a trick determines the suit of a trick. -menu.instruction.special_card.changeling=The changeling is always playable. He is either a wizard or a jester.\n\ -When played the player chooses which of these two the changeling represents.\n\ -If the changeling is the determining trump card the dealer chooses the trump suit. +menu.instruction.special_card.intro=The first six of the following special cards are part of both anniversary editions of 2016 and 2021. \ + The changeling is only part of the anniversary edition of 2021. +menu.instruction.special_card.dragon=The dragon is always playable. \ + The dragon is the highest card, even higher than every wizard, \ + and wins every trick except the same trick contains the fairy. \ + If the dragon is the determining trump card the dealer chooses the trump suit. \ + The dragon as the first card of a trick has the same effect as a wizard. +menu.instruction.special_card.fairy=The fairy is always playable. \ + The fairy is the lowest card of the game even lower than every jester \ + and looses every trick but a trick contains fairy and dragon. Then the fairy wins this trick. \ + If the fairy is the determining trump card there is no trump in the current round. \ + The fairy as the first card of a trick has the same effect as a jester. +menu.instruction.special_card.bomb=The bomb is always playable. \ + No player wins the trick containing the bomb and the trick does not count for any prediction. \ + The player, who would have won the trick, starts the next trick. \ + If the bomb is the determining trump card there is no trump in the current round. \ + The bomb as the first card of a trick causes the same rules as a jester. +menu.instruction.special_card.werewolf=If a player has the werewolf in his hand, he exchanges it at the beginning of the trick round \ + for the trump-defining card. Then the player chooses a trump suit or chooses that there will be no trump this round. \ + After that, the first player makes his prediction. If the dealer reveals the werewolf when determining the trump suit, \ + he determines a trump suit. +menu.instruction.special_card.juggler=The juggler is always playable. \ + He has the value 7 \u00bd, therefore he is higher than a 7 and lower than an 8. \ + The acting player determines the juggler's suit. After the trick every player gives one of his cards to his left \ + neighbor. If the juggler is the determining trump card the dealer chooses the trump suit. The juggler as the first \ + card of a trick determines the suit of a trick. +menu.instruction.special_card.cloud=The cloud is always playable. \ + She has the value 9 \u00bd, therefore he is higher than a 9 and lower than a 10. The acting player determines the \ + suit of the cloud. If any of a player's tricks contains the cloud, he must increment or decrease his prediction by 1 \ + but the trick contains the cloud and the bomb. \ + If the cloud is the determining trump card the dealer chooses the trump suit. The cloud as the first card of a \ + trick determines the suit of a trick. +menu.instruction.special_card.changeling=The changeling is always playable. He is either a wizard or a jester. \ + When played the player chooses which of these two the changeling represents. \ + If the changeling is the determining trump card the dealer chooses the trump suit. menu.connect.connect=Connect menu.connect.back=Back @@ -219,16 +219,16 @@ game.overlay.pick_trump.prompt=Please choose the trump suit game.overlay.round.title=Round {0} -game.overlay.trump.yellow=The trump suit is [#ffff00]yellow[#ffffff] -game.overlay.trump.green=The trump suit is [#00ff00]green[#ffffff] -game.overlay.trump.blue=The trump suit is [#0000ff]blue[#ffffff] -game.overlay.trump.red=The trump suit is [#ff0000]red[#ffffff] +game.overlay.trump.yellow=The trump suit is [#ffff00]yellow[] +game.overlay.trump.green=The trump suit is [#00ff00]green[] +game.overlay.trump.blue=The trump suit is [#0000ff]blue[] +game.overlay.trump.red=The trump suit is [#ff0000]red[] game.overlay.trump.none=There is no trump suit game.overlay.trump.unknown=The trump suit is yet to be determined -game.overlay.trump.yellow.player={0} choose the trump suit [#ffff00]yellow[#ffffff] -game.overlay.trump.green.player={0} choose the trump suit [#00ff00]green[#ffffff] -game.overlay.trump.blue.player={0} choose the trump suit [#0000ff]blue[#ffffff] -game.overlay.trump.red.player={0} choose the trump suit [#ff0000]red[#ffffff] +game.overlay.trump.yellow.player={0} choose the trump suit [#ffff00]yellow[] +game.overlay.trump.green.player={0} choose the trump suit [#00ff00]green[] +game.overlay.trump.blue.player={0} choose the trump suit [#0000ff]blue[] +game.overlay.trump.red.player={0} choose the trump suit [#ff0000]red[] game.overlay.trump.none.player={0} has decided there will be no trump suit this round game.overlay.trump.unknown.player=The trump suit is yet to be determined by {0} diff --git a/wizard-client/wizard-client-libgdx/core/src/main/resources/i18n/messages_de.properties b/wizard-client/wizard-client-libgdx/core/src/main/resources/i18n/messages_de.properties index 9fcfc22..2651073 100644 --- a/wizard-client/wizard-client-libgdx/core/src/main/resources/i18n/messages_de.properties +++ b/wizard-client/wizard-client-libgdx/core/src/main/resources/i18n/messages_de.properties @@ -1,126 +1,112 @@ # suppress inspection "UnusedProperty" for whole file menu.main.play=Spiel beitreten +menu.main.instructions=Spielanleitung menu.main.quit=Verlassen -menu.main.ok=OK -menu.instruction.nextPageButton=Nächste Seite -menu.instruction.previousPageButton=Vorherige Seite +menu.instruction.back=Zurück menu.instruction.wizard=Zauberer menu.instruction.jester=Narr - -menu.instruction.main=Spielanleitung -menu.instruction.main.text1=Willkommen -menu.instruction.main.text2=Auf dieser Seite findest du die Regeln des Grundspiels und zur Punktewertung.\n\ -Auf der zweiten Seite befindet sich eine Übersicht über die möglichen Spielvarianten \nund auf der dritten eine Übersicht der Sonderkarten.\n -menu.instruction.general=Grundlegendes -menu.instruction.introduction1=Wizard ist ein Stichspiel mit dem Ziel in jeder Runde die genau Anzahl der selbstgewonnen\ -Stiche vorherzusagen. -menu.instruction.introduction2=Für richtige Vorhersagen erhält jeder Spieler Punkte und am Ende gewinnt der Spieler mit\ -der höchsten Punktzahl.\n -menu.instruction.standardgameheading=Grundspiel -menu.instruction.standardgame1=Im Grundspiel gibt es 60 Karten -menu.instruction.standardgame2=52 dieser Karten verteilen sich auf die folgenden vier Farben. -menu.instruction.standardgame3=Die jeweils höchste Karte ist die 13, die jeweils niedrigste Karte ist die 1. -menu.instruction.standardgame4=Die 8 verbleibenden Karten verteilen sich hälftig auf Zauberer und Narren und haben keine Farbe.\n\ +menu.instruction.suit.blue=Blau +menu.instruction.suit.green=Grün +menu.instruction.suit.yellow=Gelb +menu.instruction.suit.red=Rot + +menu.instruction.main.title=Spielanleitung +menu.instruction.main.welcome.title=Willkommen +menu.instruction.main.welcome.par0=Auf der nächsten Seite findest du die Regeln des Grundspiels und zur Punktewertung. Auf der dritten Seite befindet sich eine Übersicht über die möglichen Spielvarianten und auf der vierten eine Übersicht der Sonderkarten. +menu.instruction.main.general.title=Grundlegendes +menu.instruction.main.general.par0=Wizard ist ein Stichspiel mit dem Ziel in jeder Runde die genau Anzahl der selbst gewonnen Stiche vorherzusagen. Für richtige Vorhersagen erhält jeder Spieler Punkte und am Ende gewinnt der Spieler mit der höchsten Punktzahl. +menu.instruction.standard.title=Grundspiel +menu.instruction.standard.par0=Im Grundspiel gibt es 60 Karten. 52 dieser Karten verteilen sich auf die folgenden vier Farben. Die jeweils höchste Karte ist die 13, die jeweils niedrigste Karte ist die 1. +menu.instruction.standard.par1=Die 8 verbleibenden Karten verteilen sich hälftig auf Zauberer und Narren und haben keine Farbe. \ Die vier Zauberer haben einen höheren Wert als alle anderen Karten und die vier Narren einen niedrigeren. -menu.instruction.standardgame5=Für jede Runde gilt: Rundenzahl gleich Anzahl der Karten pro Spieler gleich Anzahl der Stiche\n\ +menu.instruction.standard.par2=Für jede Runde gilt: Rundenzahl gleich Anzahl der Karten pro Spieler gleich Anzahl der Stiche \ die Karten verteilt virtuell als Geber einer der Spieler.\n\n\ -Nach dem Verteilen der Karten wird eine Trumpffarbe bestimmt. Sie entspricht der Farbe der Karte\n\ -Die im Spielbildschirm links unten angezeigt wird.\n\ -Ein Trumpf ist jede Karte der Trumpffarbe und höher als alle Karten der anderen Farben.\n\ -Wichtig! Ist die trumpfbestimmende Karte ein Narr gibt es in dieser Runde keinen Trumpf.\n\ +Nach dem Verteilen der Karten wird eine Trumpffarbe bestimmt. Sie entspricht der Farbe der Karte, \ +die im Spielbildschirm links unten angezeigt wird. \ +Ein Trumpf ist jede Karte der Trumpffarbe und höher als alle Karten der anderen Farben. \ +Wichtig! Ist die trumpfbestimmende Karte ein Narr gibt es in dieser Runde keinen Trumpf. \ Wichtig! Ist die trumpfbestimmende Karte ein Zauberer wählt der Kartengeber eine Trumpffarbe.\n\n\ -Ist die Trumpfarbe bestimmt, sagt jeder Spieler an, wie viele Stiche er in der Runde machen will.\n\ -Tipp für Neulinge: Ein gutes Blatt für viele Stiche hat Zauberer, Trumpfkarten und hohe Farbkarten.\n -menu.instruction.standardgame6=Der Ablauf eine Stichs -menu.instruction.standardgame7=Die erste Karte eines Stichs spielt beim ersten Stich der virtuelle linke Nachbar des Gebers.\n\ -Alle weiteren Stiche eröffnet der Spieler, der den letzten Stich gewonnen hat.\n\ -Danach spielen alle Mitspieler im Uhrzeigersinn eine Karte\n\ -Zur Farbe der ersten Karte muss zugegeben werden. Das bedeutet: Hat ein Spieler eine Farbe dieser Karte\n\ -muss er diese spielen und darf keine Karte einer anderen Farbe spielen.\n\ +Ist die Trumpfarbe bestimmt, sagt jeder Spieler an, wie viele Stiche er in der Runde machen will. \ +Tipp für Neulinge: Ein gutes Blatt für viele Stiche hat Zauberer, Trumpfkarten und hohe Farbkarten. +menu.instruction.standard.trick.title=Der Ablauf eines Stichs +menu.instruction.standard.trick.par0=Die erste Karte eines Stichs spielt beim ersten Stich der virtuelle linke Nachbar des Gebers. \ +Alle weiteren Stiche eröffnet der Spieler, der den letzten Stich gewonnen hat. \ +Danach spielen alle Mitspieler im Uhrzeigersinn eine Karte. \ +Zur Farbe der ersten Karte muss zugegeben werden. Das bedeutet: hat ein Spieler eine Karte dieser Farbe, so \ +muss er diese spielen und darf keine Karte einer anderen Farbe spielen. \ Ausnahme hiervon sind Zauberer und Narren. Diese Karten dürfen immer gespielt werden!\n\n\ -Den Stich gewinnt der Spieler mit der höchsten Karte.\nFolgende absteigende Wertigkeit für die höchste Karte gilt:\n\ - +Der erste Zauberer in einem Stich\n\ - +Die höchste Trumpfkarte\n\ - +Die höchste Farbkarte der angespielten Farbe -menu.instruction.standardgame8=Besonderheiten -menu.instruction.standardgame9=Eröffnet ein Spieler einen Stich mit einem Zauberer, dürfen die Mitspieler beliebige\n\ -Karten spielen, einschließlich weiterer Zauberer oder Narren.\nDer Stich geht in jedem Fall an den ersten Zauberer.\n\n\ -Eröffnet ein Spieler einen Stich mit einem Narren, dürfen beliebige Karten gespielt werden,\n\ -bis ein Lehrling einen Zauberer oder eine Zahlenkarte spielt. Handelt es sich um eine Zahlenkarte,\n\ +Den Stich gewinnt der Spieler mit der höchsten Karte. Folgende absteigende Wertigkeit für die höchste Karte gilt:\n\ +\ + Der erste Zauberer in einem Stich\n\ +\ + Die höchste Trumpfkarte\n\ +\ + Die höchste Farbkarte der angespielten Farbe +menu.instruction.standard.special_cases.title=Besonderheiten +menu.instruction.standard.special_cases.par0=Eröffnet ein Spieler einen Stich mit einem Zauberer, dürfen die Mitspieler beliebige \ +Karten spielen, einschließlich weiterer Zauberer oder Narren. Der Stich geht in jedem Fall an den ersten Zauberer.\n\n\ +Eröffnet ein Spieler einen Stich mit einem Narren, dürfen beliebige Karten gespielt werden, \ +bis ein Lehrling einen Zauberer oder eine Zahlenkarte spielt. Handelt es sich um eine Zahlenkarte, \ muss zu ihrer Farbe zugegeben werden.\n\ -Handelt es sich um einen Zauberer, dürfen beliebige Karten gespielt werden.\n\ -Im seltenen Fall, dass nur Narren im Stich liegen, gewinnt der erste Narr.\n -menu.instruction.scoring=Punktewertung -menu.instruction.standardgame10=Bei einer richtigen Vorhersage gibt es pro gemachten Stich 10 Punkte\n\ +Handelt es sich um einen Zauberer, dürfen beliebige Karten gespielt werden. \ +Im seltenen Fall, dass nur Narren im Stich liegen, gewinnt der erste Narr. +menu.instruction.standard.scoring.title=Punktewertung +menu.instruction.standard.scoring.par0=Bei einer richtigen Vorhersage gibt es pro gemachten Stich 10 Punkte \ sowie 20 Punkte als Grundbetrag.\nBei einer falschen Vorhersage gibt es pro abweichendem Stich -10 Punkte und keinen Grundbetrag.\n\ -Die Punktzahl wird anschließend mit dem bisherigen Punktestand eines Spielers verrechnet.\n +Die Punktzahl wird anschließend mit dem bisherigen Punktestand eines Spielers verrechnet. menu.instruction.variant.title=Spielvarianten menu.instruction.variant.intro=Bei der Erstellung eines neuen Spiels können folgende 6 Varianten ausgewählt werden. menu.instruction.variant.default=1) Default menu.instruction.variant.default.description=Das Grundspiel mit den Grundregeln. menu.instruction.variant.defaultpm1=2) Default PM1 -menu.instruction.variant.defaultpm1.description=Das Grundspiel mit der Zusatzbedingung, dass die Vorhersage\nnicht der Rundenanzahl entsprechen darf.\n\ +menu.instruction.variant.defaultpm1.description=Das Grundspiel mit der Zusatzbedingung, dass die Vorhersage nicht der Rundenanzahl entsprechen darf. \ Das bedeutet: Der Tipp mindestens eines Spielers ist falsch. menu.instruction.variant.anniversary2016=3) Anniversary 2016 menu.instruction.variant.anniversary2016.description=Das Grundspiel mit den Grundregeln und den Sonderkarten der Jubiläumsedition 2016. menu.instruction.variant.anniversary2016pm1=4) Anniversary 2016 PM1 -menu.instruction.variant.anniversary2016pm1.description=Das Grundspiel mit den Sonderkarten der Jubiläumsedition 2016, mit der\n\ +menu.instruction.variant.anniversary2016pm1.description=Das Grundspiel mit den Sonderkarten der Jubiläumsedition 2016, mit der \ Zusatzbedingung, dass die Vorhersage nicht der Rundenanzahl entsprechen darf. menu.instruction.variant.anniversary2021=5) Anniversary 2021 menu.instruction.variant.anniversary2021.description=Das Grundspiel mit den Grundregeln und den Sonderkarten der Jubiläumsedition 2021. menu.instruction.variant.anniversary2021pm1=6) Anniversary 2021 PM1 -menu.instruction.variant.anniversary2021pm1.description=Das Grundspiel mit den Sonderkarten der Jubiläumsedition 2021, mit der\n\ +menu.instruction.variant.anniversary2021pm1.description=Das Grundspiel mit den Sonderkarten der Jubiläumsedition 2021, mit der \ Zusatzbedingung, dass die Vorhersage nicht der Rundenanzahl entsprechen darf. menu.instruction.special_card.title=Sonderkarten -menu.instruction.special_card.intro=Die ersten sechs der folgenden Sonderkarten sind in den beiden Jubliäumseditionen 2016 und 2021 enthalten.\n\ -Der Gestaltwandler ist nur in der Jubiläumsedition 2021 enthalten.\n -menu.instruction.special_card.dragon=Den Drachen kann ein Spieler immer spielen.\n\ -Der Drache ist die Karte mit dem höchsten Wert im Spiel. Er ist höher als jeder Zauberer\n\ -und gewinnt jeden Stich mit der Ausnahme der Fee im selben Stich (siehe Fee).\n\ -Deckt der Geber zur Bestimmung der Trumpffarbe den Drachen auf, bestimmt er eine Trumpffarbe.\n\ -Eröffnest ein Spieler einen Stich mit einem Drachen, gelten dieselben Regeln\n\ -wie beim Spielen eines Zauberers. -menu.instruction.special_card.fairy=Die Fee kann ein Spieler immer spielen.\n\ -Die Fee ist die Karte mit dem niedrigsten Wert im Spiel.\n\ -Sie ist sogar niedriger als jeder Narr und verliert jeden Stich, außer Fee und Drache liegen im selben Stich.\n\ -Dann gewinnt die Fee den Stich!\n\ -Deckt der Geber zur Bestimmung der Trumpffarbe die Fee auf, gibt es in dieser Runde keine Trumpffarbe.\n\ -Eröffnest ein Spieler den Stich mit einer Fee, gelten dieselben Regeln wie beim Spielen eines Narren. -menu.instruction.special_card.bomb=Die Bombe kann ein Spieler immer spielen.\n\ -Den Stich mit der Bombe gewinnt kein Spieler. Er zählt auch zu keiner Stichvorhersage.\n\ -Der Spieler, der den Stich mit der Bombe gewonnen hätte, eröffnet den nächsten Stich.\n\ -Deckt der Geber bei der Bestimmung der Trumpffarbe die Bombe auf,\n\ -gibt es in dieser Runde keine Trumpffarbe.\n\ -Eröffnet ein Spieler einen Stich mit einer Bombe, gelten dieselben Regeln wie beim Spielen eines Narren. -menu.instruction.special_card.werewolf=Hat ein Spieler den Werwolf auf der Hand, tauscht er ihn zu Beginn der Stichrunde\n\ -gegen die trumpfbestimmende Karte aus.\n\ -Anschließend wählt der Spieler eine Trumpffarbe oder wählt, dass es in dieser Runde keinen Trumpf gibt.\n\ -Danach macht der erste Spieler seine Vorhersage.\n\ -Deckt der Geber bei der Bestimmung der Trumpffarbe den Werwolf auf,\n\ -bestimmt er eine Trumpffarbe. -menu.instruction.special_card.juggler=Den Jongleur kann ein Spieler immer spielen.\n\ -Er hat den Wert 7 \u00bd, ist also höher als eine 7 und niedriger als eine 8.\n\ -Spielt ein Spieler den Jongleur in einem Stich, bestimmt er welche Farbe die Karte annehmen soll.\n\ -Nach dem Stich gibt jeder Spieler gleichzeitig eine seiner Handkarten verdeckt\n\ -an seinen linken Nachbarn.\n\ -Deckt der Geber bei der Bestimmung der Trumpffarbe den Jongleur auf,\n\ -bestimmt er eine Trumpffarbe.\n\ -Eröffnet ein Spieler den Stich mit einem Jongleur, so muss zur angesagten Farben zugegeben werden. -menu.instruction.special_card.cloud=Die Wolke kann ein Spieler immer spielen.\n\ -Sie hat den Wert 9 \u00be, ist also höher als eine 9 und niedriger als eine 10.\n\ -Spielt ein Spieler die Wolke in einem Stich, bestimmt er\n\ -welche Farbe die Karte annehmen soll.\n\ -Liegt die Wolke am Ende einer Runde in den Stichen eines Lehrlings,\n\ -muss dieser seine Stichvorhersage um +1 oder um -1 verändern.\n\ -Liegen Wolke und Bombe in einem Stich, ändert sich die Stichvorhersage nicht.\n\ -Deckt der Geber bei der Bestimmung der Trumpffarbe die Wolke auf, bestimmt er eine Trumpffarbe.\n\ -Eröffnest du den Stich mit einer Wolke, muss die angesagte Farbe bedient werden. -menu.instruction.special_card.changeling=Den Gestaltwandler kann ein Spieler immer spielen. Er ist entweder ein Narr\n\ -oder ein Zauberer. Beim Ausspielen des Gestaltwandlers wählt ein Spieler aus, ob er ein Narr oder ein Zauberer sein soll.\n\ -Deckt der virtuelle Geber zur Bestimmung der Trumpffarbe den Gestaltenwandler auf, bestimmt er eine Trumpffarbe. +menu.instruction.special_card.intro=Die ersten sechs der folgenden Sonderkarten sind in den beiden Jubiläumseditionen 2016 und 2021 enthalten. \ + Der Gestaltwandler ist nur in der Jubiläumsedition 2021 enthalten. +menu.instruction.special_card.dragon=Den Drachen kann ein Spieler immer spielen. \ + Der Drache ist die Karte mit dem höchsten Wert im Spiel. Er ist höher als jeder Zauberer und gewinnt jeden Stich \ + mit der Ausnahme der Fee im selben Stich (siehe Fee). Deckt der Geber zur Bestimmung der Trumpffarbe den Drachen \ + auf, bestimmt er eine Trumpffarbe. Eröffnest ein Spieler einen Stich mit einem Drachen, gelten dieselben Regeln \ + wie beim Spielen eines Zauberers. +menu.instruction.special_card.fairy=Die Fee kann ein Spieler immer spielen. \ + Die Fee ist die Karte mit dem niedrigsten Wert im Spiel. Sie ist sogar niedriger als jeder Narr und verliert jeden \ + Stich, außer Fee und Drache liegen im selben Stich. Dann gewinnt die Fee den Stich! Deckt der Geber zur Bestimmung \ + der Trumpffarbe die Fee auf, gibt es in dieser Runde keine Trumpffarbe. Eröffnest ein Spieler den Stich mit einer \ + Fee, gelten dieselben Regeln wie beim Spielen eines Narren. +menu.instruction.special_card.bomb=Die Bombe kann ein Spieler immer spielen. \ + Den Stich mit der Bombe gewinnt kein Spieler. Er zählt auch zu keiner Stichvorhersage. Der Spieler, der den Stich \ + mit der Bombe gewonnen hätte, eröffnet den nächsten Stich. Deckt der Geber bei der Bestimmung der Trumpffarbe die \ + Bombe auf, gibt es in dieser Runde keine Trumpffarbe. Eröffnet ein Spieler einen Stich mit einer Bombe, gelten \ + dieselben Regeln wie beim Spielen eines Narren. +menu.instruction.special_card.werewolf=Hat ein Spieler den Werwolf auf der Hand, tauscht er ihn zu Beginn der \ + Stichrunde gegen die trumpfbestimmende Karte aus. Anschließend wählt der Spieler eine Trumpffarbe oder wählt, dass \ + es in dieser Runde keinen Trumpf gibt. Danach macht der erste Spieler seine Vorhersage. Deckt der Geber bei der \ + Bestimmung der Trumpffarbe den Werwolf auf, bestimmt er eine Trumpffarbe. +menu.instruction.special_card.juggler=Den Jongleur kann ein Spieler immer spielen. Er hat den Wert 7 \u00bd, ist also \ + höher als eine 7 und niedriger als eine 8. Spielt ein Spieler den Jongleur in einem Stich, bestimmt er welche Farbe \ + die Karte annehmen soll. Nach dem Stich gibt jeder Spieler gleichzeitig eine seiner Handkarten verdeckt an seinen \ + linken Nachbarn. Deckt der Geber bei der Bestimmung der Trumpffarbe den Jongleur auf, bestimmt er eine Trumpffarbe. \ + Eröffnet ein Spieler den Stich mit einem Jongleur, so muss zur angesagten Farbe zugegeben werden. +menu.instruction.special_card.cloud=Die Wolke kann ein Spieler immer spielen. Sie hat den Wert 9 \u00be, ist also \ + höher als eine 9 und niedriger als eine 10. Spielt ein Spieler die Wolke in einem Stich, bestimmt er welche Farbe \ + die Karte annehmen soll. Liegt die Wolke am Ende einer Runde in den Stichen eines Lehrlings, muss dieser seine \ + Stichvorhersage um +1 oder um -1 verändern. Liegen Wolke und Bombe in einem Stich, ändert sich die Stichvorhersage \ + nicht. Deckt der Geber bei der Bestimmung der Trumpffarbe die Wolke auf, bestimmt er eine Trumpffarbe. Eröffnest du \ + den Stich mit einer Wolke, muss die angesagte Farbe bedient werden. +menu.instruction.special_card.changeling=Den Gestaltwandler kann ein Spieler immer spielen. Er ist entweder ein Narr \ + oder ein Zauberer. Beim Ausspielen des Gestaltwandlers wählt ein Spieler aus, ob er ein Narr oder ein Zauberer sein \ + soll. Deckt der virtuelle Geber zur Bestimmung der Trumpffarbe den Gestaltwandler auf, bestimmt er eine Trumpffarbe. menu.connect.connect=Verbinden menu.connect.back=Zurück @@ -174,8 +160,8 @@ menu.error.session_not_found=Fehler: Session nicht gefunden menu.error.player_not_found=Fehler: Spieler nicht gefunden menu.error.player_name_taken=Fehler: Spielername bereits vergeben menu.error.player_name_not_allowed=Fehler: Spielername nicht erlaubt -menu.error.session_name_taken=Fehler: Sessionname bereits vergeben -menu.error.session_name_not_allowed=Fehler: Sessionname nicht erlaubt +menu.error.session_name_taken=Fehler: Sitzungsname bereits vergeben +menu.error.session_name_not_allowed=Fehler: Sitzungsname nicht erlaubt menu.error.illegal_state=Fehler: Illegaler Zustand menu.error.game_already_started=Fehler: Spiel hat bereits begonnen menu.error.game_not_yet_started=Fehler: Spiel hat noch nicht begonnen @@ -223,16 +209,16 @@ game.overlay.pick_trump.prompt=Wähle die Trumpffarbe game.overlay.round.title=Runde {0} -game.overlay.trump.yellow=Die Trumpffarbe ist [#ffff00]gelb[#ffffff] -game.overlay.trump.green=Die Trumpffarbe ist [#00ff00]grün[#ffffff] -game.overlay.trump.blue=Die Trumpffarbe ist [#0000ff]blau[#ffffff] -game.overlay.trump.red=Die Trumpffarbe ist [#ff0000]rot[#ffffff] +game.overlay.trump.yellow=Die Trumpffarbe ist [#ffff00]gelb[] +game.overlay.trump.green=Die Trumpffarbe ist [#00ff00]grün[] +game.overlay.trump.blue=Die Trumpffarbe ist [#0000ff]blau[] +game.overlay.trump.red=Die Trumpffarbe ist [#ff0000]rot[] game.overlay.trump.none=Es gibt keine Trumpffarbe game.overlay.trump.unknown=Die Trumpffarbe muss noch bestimmt werden -game.overlay.trump.yellow.player={0} hat die Trumpffarbe [#ffff00]gelb[#ffffff] gewählt -game.overlay.trump.green.player={0} hat die Trumpffarbe [#00ff00]grün[#ffffff] gewählt -game.overlay.trump.blue.player={0} hat die Trumpffarbe [#0000ff]blau[#ffffff] gewählt -game.overlay.trump.red.player={0} hat die Trumpffarbe [#ff0000]rot[#ffffff] gewählt +game.overlay.trump.yellow.player={0} hat die Trumpffarbe [#ffff00]gelb[] gewählt +game.overlay.trump.green.player={0} hat die Trumpffarbe [#00ff00]grün[] gewählt +game.overlay.trump.blue.player={0} hat die Trumpffarbe [#0000ff]blau[] gewählt +game.overlay.trump.red.player={0} hat die Trumpffarbe [#ff0000]rot[] gewählt game.overlay.trump.none.player={0} hat entschieden, dass es diese Runde keinen Trump geben wird game.overlay.trump.unknown.player={0} muss die Trumpffarbe muss noch bestimmen diff --git a/wizard-common/src/main/java/eu/jonahbauer/wizard/common/model/Card.java b/wizard-common/src/main/java/eu/jonahbauer/wizard/common/model/Card.java index 7e893bb..8210ae5 100644 --- a/wizard-common/src/main/java/eu/jonahbauer/wizard/common/model/Card.java +++ b/wizard-common/src/main/java/eu/jonahbauer/wizard/common/model/Card.java @@ -17,26 +17,6 @@ public enum Card { WEREWOLF; public enum Suit { - NONE, - YELLOW { - public String toString() { - return "Gelb"; - } - }, - RED { - public String toString() { - return "Rot"; - } - }, - GREEN { - public String toString() { - return "Grün"; - } - }, - BLUE { - public String toString() { - return "Blau"; - } - } + NONE, YELLOW, RED, GREEN, BLUE } } \ No newline at end of file