improved instructions screen (#18)

main
Jonah Bauer 3 years ago
parent 08fdbeb79b
commit e00b93d13c

@ -1,30 +1,30 @@
package eu.jonahbauer.wizard.client.libgdx.screens; 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.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.math.MathUtils;
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 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.WizardGame;
import eu.jonahbauer.wizard.client.libgdx.actors.CardActor; 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.state.Menu;
import eu.jonahbauer.wizard.client.libgdx.util.WizardAssetManager;
import eu.jonahbauer.wizard.common.model.Card; 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 TextButton buttonOK; private TextButton buttonOK;
private VerticalGroup content; private VerticalGroup content;
private ScrollPane scrollPane; private ScrollPane scrollPane;
private Label title;
private TextButton nextPageButton; private TextButton nextPageButton;
private TextButton previousPageButton; private TextButton previousPageButton;
private HorizontalGroup horizontalButtonGroup;
private int pagecounter = 0; private int currentPage = 0;
private TextureAtlas atlas; private TextureAtlas atlas;
private CardActor card;
private final ChangeListener listener = new ChangeListener() { private final ChangeListener listener = new ChangeListener() {
@Override @Override
@ -33,17 +33,13 @@ public class InstructionScreen extends MenuScreen {
game.getClient().execute(Menu.class, Menu::showMenuScreen); game.getClient().execute(Menu.class, Menu::showMenuScreen);
sfxClick(); sfxClick();
} else if (actor == nextPageButton) { } else if (actor == nextPageButton) {
switch(pagecounter) { currentPage = MathUtils.clamp(currentPage + 1, 0, MAX_PAGE);
case 0: pagecounter++; showSecondPage(); break; showPage(currentPage);
case 1: pagecounter++; showThirdPage(); break; sfxClick();
default: throw new IllegalStateException();
}
} else if (actor == previousPageButton) { } else if (actor == previousPageButton) {
switch(pagecounter) { currentPage = MathUtils.clamp(currentPage - 1, 0, MAX_PAGE);
case 1: pagecounter--; showFirstPage(); break; showPage(currentPage);
case 2: pagecounter--; showSecondPage(); break; sfxClick();
default: throw new IllegalStateException();
}
} }
} }
}; };
@ -52,199 +48,239 @@ public class InstructionScreen extends MenuScreen {
super(game); super(game);
} }
@Override
protected void load() {
super.load();
assets.loadGame();
assets.finishLoading();
atlas = assets.get(WizardAssetManager.ATLAS_GAME);
}
@Override @Override
public void show() { public void show() {
super.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); previousPageButton = new TextButton(messages.get("menu.instruction.previousPageButton"), skin);
nextPageButton = new TextButton(messages.get("menu.instruction.nextPageButton"), skin); previousPageButton.addListener(listener);
horizontalButtonGroup = new HorizontalGroup(); 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); nextPageButton = new TextButton(messages.get("menu.instruction.nextPageButton"), skin);
scrollPane.setFadeScrollBars(true); nextPageButton.addListener(listener);
scrollPane.setOverscroll(false,false); getButtonGroup().addActor(nextPageButton);
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));
showFirstPage(); scrollPane = new ScrollPane(content, skin);
Gdx.input.setInputProcessor(stage); 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); stage.addActor(scrollPane);
buttonOK.addListener(listener); stage.addCaptureListener(new KeyboardFocusManager(scrollPane, previousPageButton, buttonOK, nextPageButton));
nextPageButton.addListener(listener);
previousPageButton.addListener(listener);
}
private void prepareScreen() { showFirstPage();
atlas = new TextureAtlas(Gdx.files.internal(GameAtlas.$PATH));
content = new VerticalGroup();
} }
private void clearContent() { private void showPage(int page) {
while(content.getChildren().size > 0) { switch (page) {
content.removeActorAt(0, false); case 0 -> showFirstPage();
case 1 -> showSecondPage();
case 2 -> showThirdPage();
case 3 -> showFourthPage();
default -> throw new AssertionError();
} }
horizontalButtonGroup.clear();
} }
private void addButtons() { private void showFirstPage() {
if(pagecounter != 0) { currentPage = 0;
horizontalButtonGroup.addActor(previousPageButton); reset();
}
if(pagecounter != 2) { startSection("menu.instruction.main.title");
horizontalButtonGroup.addActor(nextPageButton); startSubsection("menu.instruction.main.welcome.title");
} addParagraph("menu.instruction.main.welcome.par0");
horizontalButtonGroup.space(10); startSubsection("menu.instruction.main.general.title");
content.addActor(horizontalButtonGroup); addParagraph("menu.instruction.main.general.par0");
content.addActor(buttonOK);
} }
private void showFirstPage() { private void showSecondPage() {
clearContent(); currentPage = 1;
reset();
title = new Label(messages.get("menu.instruction.main"), skin, "enchanted");
content.addActor(title); startSection("menu.instruction.standard.title");
Label maintext1 = new Label(messages.get("menu.instruction.main.text1"), skin); addParagraph("menu.instruction.standard.par0");
maintext1.setFontScale(2.0f);
content.addActor(maintext1); var colors = new HorizontalGroup().space(10).pad(10).center();
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()) { for (Card.Suit suit : Card.Suit.values()) {
if (suit != Card.Suit.NONE) { if (suit != Card.Suit.NONE) {
VerticalGroup cardColor = new VerticalGroup(); VerticalGroup suitGroup = new VerticalGroup().space(10);
cardColor.space(10); suitGroup.addActor(new CardActor(suit, atlas));
card = new CardActor(Card.Suit.values()[suit.ordinal()], atlas); suitGroup.addActor(new Label(switch (suit) {
cardColor.addActor(card); case RED -> messages.get("menu.instruction.suit.red");
Label colorLabel = new Label(suit.toString(), skin); case GREEN -> messages.get("menu.instruction.suit.green");
cardColor.addActor(colorLabel); case BLUE -> messages.get("menu.instruction.suit.blue");
colors.addActor(cardColor); case YELLOW -> messages.get("menu.instruction.suit.yellow");
default -> suit.toString();
}, skin));
colors.addActor(suitGroup);
} }
} }
content.addActor(colors); content.addActor(colors);
Label standardGame4 = new Label(messages.get("menu.instruction.standardgame4"), skin);
content.addActor(standardGame4); addParagraph("menu.instruction.standard.par1");
HorizontalGroup wizardJester = new HorizontalGroup(); var specialCards = new HorizontalGroup().space(10).pad(10).center();
wizardJester.padTop(5);
wizardJester.space(10); var wizard = new VerticalGroup();
wizard.addActor(new CardActor(Card.BLUE_WIZARD, atlas));
VerticalGroup wizardVerticalGroup = new VerticalGroup(); wizard.addActor(new Label(messages.get("menu.instruction.wizard"), skin));
wizardVerticalGroup.space(10); specialCards.addActor(wizard);
card = new CardActor(Card.values()[Card.BLUE_WIZARD.ordinal()], atlas);
wizardVerticalGroup.addActor(card); var jester = new VerticalGroup();
Label wizardLabel = new Label(messages.get("menu.instruction.wizard"), skin); jester.addActor(new CardActor(Card.BLUE_JESTER, atlas));
wizardVerticalGroup.addActor(wizardLabel); jester.addActor(new Label(messages.get("menu.instruction.jester"), skin));
wizardJester.addActor(wizardVerticalGroup); specialCards.addActor(jester);
VerticalGroup jesterVerticalGroup = new VerticalGroup(); content.addActor(specialCards);
jesterVerticalGroup.space(10);
card = new CardActor(Card.values()[Card.BLUE_JESTER.ordinal()], atlas); addParagraph("menu.instruction.standard.par2");
jesterVerticalGroup.addActor(card);
Label jesterLabel = new Label(messages.get("menu.instruction.jester"), skin); startSubsection("menu.instruction.standard.trick.title");
jesterVerticalGroup.addActor(jesterLabel); addParagraph("menu.instruction.standard.trick.par0");
wizardJester.addActor(jesterVerticalGroup);
content.addActor(wizardJester); startSubsection("menu.instruction.standard.special_cases.title");
Label standardGame5 = new Label(messages.get("menu.instruction.standardgame5"), skin); addParagraph("menu.instruction.standard.special_cases.par0");
content.addActor(standardGame5);
Label standardGame6 = new Label(messages.get("menu.instruction.standardgame6"), skin); startSubsection("menu.instruction.standard.scoring.title");
standardGame6.setFontScale(2.0f); addParagraph("menu.instruction.standard.scoring.par0");
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();
} }
private void showSecondPage() { private void showThirdPage() {
clearContent(); currentPage = 2;
title.setText(messages.get("menu.instruction.variant.title")); reset();
content.addActor(title);
startSection("menu.instruction.variant.title");
Label variantsIntro = new Label(messages.get("menu.instruction.variant.intro"), skin); Label variantsIntro = new Label(messages.get("menu.instruction.variant.intro"), skin);
content.addActor(variantsIntro); content.addActor(variantsIntro);
Table table = new Table(skin); Table table = new Table(skin).padTop(10);
table.defaults().space(15.0f).left().pad(25.0f); 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"));
table.add(messages.get("menu.instruction.variant.default.description")); table.add(messages.get("menu.instruction.variant.default.description")).getActor().setWrap(true);
table.row(); table.row();
table.add(messages.get("menu.instruction.variant.defaultpm1")); 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.row();
table.add(messages.get("menu.instruction.variant.anniversary2016")); 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.row();
table.add(messages.get("menu.instruction.variant.anniversary2016pm1")); 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.row();
table.add(messages.get("menu.instruction.variant.anniversary2021")); 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.row();
table.add(messages.get("menu.instruction.variant.anniversary2021pm1")); 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(); table.row();
content.addActor(table); content.addActor(table);
addButtons();
scrollPane.setScrollY(0);
} }
private void showThirdPage() { private void showFourthPage() {
clearContent(); currentPage = 3;
title.setText(messages.get("menu.instruction.special_card.title")); reset();
content.addActor(title);
Label specialCardsIntro = new Label(messages.get("menu.instruction.special_card.intro"), skin); startSection("menu.instruction.special_card.title");
content.addActor(specialCardsIntro); addParagraph("menu.instruction.special_card.intro");
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(new CardActor((Card.DRAGON), atlas)); 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.row();
table.add(new CardActor((Card.FAIRY), atlas)); 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.row();
table.add(new CardActor((Card.BOMB), atlas)); 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.row();
table.add(new CardActor((Card.WEREWOLF), atlas)); 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.row();
table.add(new CardActor((Card.JUGGLER), atlas)); 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.row();
table.add(new CardActor((Card.CLOUD), atlas)); 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.row();
table.add(new CardActor((Card.CHANGELING), atlas)); 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(); table.row();
content.addActor(table); 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();
} }
} }

@ -4,7 +4,9 @@ import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton; 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.ChangeListener;
import com.badlogic.gdx.scenes.scene2d.utils.Layout;
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.KeyboardFocusManager; import eu.jonahbauer.wizard.client.libgdx.listeners.KeyboardFocusManager;
@ -57,20 +59,39 @@ public class MainMenuScreen extends MenuScreen {
stage.addActor(symbol); 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 = new TextButton(messages.get("menu.main.play"), skin);
buttonPlay.setPosition((WizardGame.WIDTH - buttonPlay.getWidth()) / 2f, 170 + 504 - 125f);
buttonPlay.addListener(listener); buttonPlay.addListener(listener);
buttonInstruction = new TextButton(messages.get("menu.instruction.main"), skin); buttonGroup.addActor(buttonPlay);
buttonInstruction.setPosition((WizardGame.WIDTH - buttonInstruction.getWidth()) / 2f, 170 + 494 - 189.5f - 125f + buttonInstruction.getHeight() / 2f);
buttonInstruction = new TextButton(messages.get("menu.main.instructions"), skin);
buttonInstruction.addListener(listener); buttonInstruction.addListener(listener);
buttonGroup.addActor(buttonInstruction);
buttonQuit = new TextButton(messages.get("menu.main.quit"), skin); buttonQuit = new TextButton(messages.get("menu.main.quit"), skin);
buttonQuit.setPosition((WizardGame.WIDTH - buttonQuit.getWidth()) / 2f, 170 + 120f);
buttonQuit.addListener(listener); buttonQuit.addListener(listener);
buttonGroup.addActor(buttonQuit);
stage.addActor(buttonPlay); stage.addCaptureListener(new KeyboardFocusManager(buttonPlay, buttonInstruction, buttonQuit));
stage.addActor(buttonInstruction);
stage.addActor(buttonQuit);
stage.addCaptureListener(new KeyboardFocusManager(buttonPlay, buttonQuit));
buttonPlay.setName("button_player"); buttonPlay.setName("button_player");
buttonInstruction.setName("button_instruction"); buttonInstruction.setName("button_instruction");

@ -9,7 +9,7 @@ import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
public abstract class MenuScreen extends WizardScreen { public abstract class MenuScreen extends WizardScreen {
protected Image[] corners; private Image[] corners;
@Getter(value = AccessLevel.PROTECTED, lazy = true) @Getter(value = AccessLevel.PROTECTED, lazy = true)
private final HorizontalGroup buttonGroup = createButtonGroup(); private final HorizontalGroup buttonGroup = createButtonGroup();
@ -20,6 +20,9 @@ public abstract class MenuScreen extends WizardScreen {
@Getter(value = AccessLevel.PROTECTED, lazy = true) @Getter(value = AccessLevel.PROTECTED, lazy = true)
private final SelectBox.SelectBoxStyle selectBoxErrorStyle = skin.get("error", SelectBox.SelectBoxStyle.class); private final SelectBox.SelectBoxStyle selectBoxErrorStyle = skin.get("error", SelectBox.SelectBoxStyle.class);
@Getter(AccessLevel.PROTECTED)
private Image title;
public MenuScreen(WizardGame game) { public MenuScreen(WizardGame game) {
super(game); super(game);
} }
@ -37,7 +40,7 @@ public abstract class MenuScreen extends WizardScreen {
stage.addActor(corner); stage.addActor(corner);
} }
var title = new Image(skin.getRegion(UiskinAtlas.TITLE)); title = new Image(skin.getRegion(UiskinAtlas.TITLE));
title.setSize(810, 192); title.setSize(810, 192);
title.setPosition(555, WizardGame.HEIGHT - 192 - 96); title.setPosition(555, WizardGame.HEIGHT - 192 - 96);
stage.addActor(title); stage.addActor(title);
@ -62,10 +65,11 @@ public abstract class MenuScreen extends WizardScreen {
@Override @Override
protected void sizeChanged() { 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.setSize(WizardGame.WIDTH * 0.45f, 125);
group.setY(WizardGame.HEIGHT * 0.15f);
group.center(); group.center();
stage.addActor(group); stage.addActor(group);
return group; return group;

@ -56,7 +56,7 @@ 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.setDebugAll(WizardGame.DEBUG); stage.setDebugAll(WizardGame.DEBUG);
Gdx.input.setInputProcessor(stage); Gdx.input.setInputProcessor(stage);

@ -1,118 +1,118 @@
# suppress inspection "UnusedProperty" for whole file # suppress inspection "UnusedProperty" for whole file
menu.main.play=Play menu.main.play=Play
menu.main.instructions=Instructions
menu.main.quit=Close menu.main.quit=Close
menu.main.ok=OK
menu.instruction.nextPageButton=Next Page menu.instruction.nextPageButton=>>
menu.instruction.previousPageButton=Previous Page menu.instruction.previousPageButton=<<
menu.instruction.back=Back
menu.instruction.wizard=Wizard menu.instruction.wizard=Wizard
menu.instruction.jester=Jester menu.instruction.jester=Jester
menu.instruction.suit.blue=Blue
menu.instruction.main=Instruction of the game menu.instruction.suit.green=Green
menu.instruction.main.text1=Welcome menu.instruction.suit.yellow=Yellow
menu.instruction.main.text2=On this page you will find the rules of the basic game and the scoring system.\n\ menu.instruction.suit.red=Red
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.main.title=Instructions
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.main.welcome.title=Welcome
menu.instruction.introduction2=For correct predictions each player gets points and in the end the player with the highest score wins.\n menu.instruction.main.welcome.par0=On the next page you will find the rules of the basic game and the scoring system. \
menu.instruction.standardgameheading=Basic Game 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.standardgame1=In the basic game there are 60 different cards. menu.instruction.main.general.title=In General
menu.instruction.standardgame2=52 of these cards are distributed among the following four suits. menu.instruction.main.general.par0=Wizard is a trick game with the goal of predicting the exact number of self-winning \
menu.instruction.standardgame3=The highest card is 13, the lowest card is 1. tricks in each round. For correct predictions each player gets points and in the end the player with the highest score\
menu.instruction.standardgame4=The 8 remaining cards are divided equally between Wizards and Jesters and have no suit.\n\ \ 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. 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\ menu.instruction.standard.par2=For each round count: the number of rounds equals the number of cards per player equals \
the cards are dealt virtually as the dealer one of the players.\n\ and the number of tricks the cards are dealt virtually as the dealer one of the players. After the cards are dealt, \
After the cards are dealt, a trump suit is determined. It corresponds to the suit of the card\n\ a trump suit is determined. It corresponds to the suit of the card which is displayed in the bottom left corner of \
which is displayed in the bottom left corner of the game screen.\n\ the game screen. A trump is any card of the trump suit and higher than all cards of the other suits.\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. \
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. \
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. \
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.
Tip for newcomers: A good hand for many tricks has wizards, trump cards and high suit cards.\n menu.instruction.standard.trick.title=The process of a trick
menu.instruction.standardgame6=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 \
menu.instruction.standardgame7=The first card of a trick is played at the first trick by the dealer's virtual left neighbor.\n\ left neighbor. All further tricks are opened by the player who won the last trick. After that, all players play one \
All further tricks are opened by the player who won the last trick.\n\ 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 \
After that, all players play one card in clockwise order.\n\ card he must play it and must not play a card of any other suit. Exceptions to this are wizards and jesters. These \
To the suit of the first card must be added. This means that if a player has a suit of this card\n\ cards may always be played! The trick is won by the player with the highest card. The following descending rank for \
he must play it and must not play a card of any other suit.\n\ the highest card applies:\n\
Exceptions to this are wizards and jesters. These cards may always be played!\n\ \ + The first wizard in a trick\n\
The trick is won by the player with the highest card.\nThe following descending rank for the highest card applies:\n\ \ + The highest trump card\n\
+The first wizard in a trick\n\ \ + The highest suit card of the played suit.
+The highest trump card\n\ menu.instruction.standard.special_cases.title=Special cases
+The highest suit card of the played suit. menu.instruction.standard.special_cases.par0=If a player starts a trick with a wizard, the other players may play any \
menu.instruction.standardgame8=Special cases cards, including any other Wizards or Jesters. The trick goes to the first Wizard in any case.\n\n\
menu.instruction.standardgame9=If a player starts a trick with a wizard, the other players may play any\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 \
cards, including any other Wizards or Jesters.\nThe trick goes to the first Wizard in any case.\n\n\ 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. \
If a player opens a trick with a Jester, any cards may be played\n\ In the rare case that only jesters are in the trick, the first jester wins.
until an another player plays a wizard or a number card. If it is a number card,\n\ menu.instruction.standard.scoring.title=Scoring
all further cards must be added to its suit.\n\ menu.instruction.standard.scoring.par0=If the prediction is correct, 10 points are awarded for each trick made plus \
If it is a wizard, any cards may be played.\n\ 20 points as a basic amount.\nIf the prediction is wrong, -10 points are awarded for each deviating trick and the \
In the rare case that only jesters are in the trick, the first jester wins.\n player does not receive any basic amount.\n\
menu.instruction.scoring=Scoring The score is then offset against a player's previous score.
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.variant.title=Variants of the game 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.intro=When creating a new game, the following 6 variants can be selected.
menu.instruction.variant.default=1) Default menu.instruction.variant.default=1) Default
menu.instruction.variant.default.description=The basic game with the basic rules. menu.instruction.variant.default.description=The basic game with the basic rules.
menu.instruction.variant.defaultpm1=2) Default PM1 menu.instruction.variant.defaultpm1=2) Default PM1
menu.instruction.variant.defaultpm1.description=The basic game with the additional condition that the prediction\n\ menu.instruction.variant.defaultpm1.description=The basic game with the additional condition that the sum of all \
must not correspond to the number of rounds.\n\ predictions must not add up to the number of tricks. \
This means: the tip of at least one player is wrong This means: the prediction of at least one player is wrong
menu.instruction.variant.anniversary2016=3) Anniversary 2016 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=4) Anniversary 2016 PM1
menu.instruction.variant.anniversary2016pm1.description=The basic game with the special cards of the anniversary edition 2016, with the\n\ menu.instruction.variant.anniversary2016pm1.description=The basic game with the special cards of the anniversary \
additional condition that the prediction must not correspond to the number of rounds. 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=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=6) Anniversary 2021 PM1
menu.instruction.variant.anniversary2021pm1.description=The basic game with the special cards of the 2021 anniversary edition, with the\n\ menu.instruction.variant.anniversary2021pm1.description=The basic game with the special cards of the 2021 anniversary \
additional condition that the prediction must not correspond to the number of rounds. 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.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\ 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. The changeling is only part of the anniversary edition of 2021.
menu.instruction.special_card.dragon=The dragon is always playable.\n\ menu.instruction.special_card.dragon=The dragon is always playable. \
The dragon is the highest card, even higher than every wizard,\n\ The dragon is the highest card, even higher than every wizard, \
and wins every trick except the same trick contains the fairy.\n\ 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.\n\ 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. 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\ menu.instruction.special_card.fairy=The fairy is always playable. \
The fairy is the lowest card of the game even lower than every jester\n\ 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.\n\ 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.\n\ 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. 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\ 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.\n\ 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.\n\ 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.\n\ 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. 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\ 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.\n\ for the trump-defining card. Then the player chooses a trump suit or chooses that there will be no trump this round. \
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. If the dealer reveals the werewolf when determining the trump suit, \
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. he determines a trump suit.
menu.instruction.special_card.juggler=The juggler is always playable.\n\ 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 a 8.\n\ 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.\n\ The acting player determines the juggler's suit. After the trick every player gives one of his cards to his left \
After the trick every player gives one of his cards to his left neighbor.\n\ neighbor. If the juggler is the determining trump card the dealer chooses the trump suit. The juggler as the first \
If the juggler is the determining trump card the dealer chooses the trump suit.\n\ card of a trick determines the suit of a trick.
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. \
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. The acting player determines the \
She has the value 9 \u00bd, therefore he is higher than a 9 and lower than a 10.\n\ suit of the cloud. If any of a player's tricks contains the cloud, he must increment or decrease his prediction by 1 \
The acting player determines the suit of the cloud.\n\ but the trick contains the cloud and the bomb. \
If any of a player's tricks contains the cloud, he must increment or decrease his prediction by 1\n\ If the cloud is the determining trump card the dealer chooses the trump suit. The cloud as the first card of a \
but the trick contains the cloud and the bomb.\n\ trick determines the suit of a trick.
If the cloud is the determining trump card the dealer chooses the trump suit.\n\ menu.instruction.special_card.changeling=The changeling is always playable. He is either a wizard or a jester. \
The cloud as the first card of a trick determines the suit of a trick. When played the player chooses which of these two the changeling represents. \
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. If the changeling is the determining trump card the dealer chooses the trump suit.
menu.connect.connect=Connect menu.connect.connect=Connect
@ -219,16 +219,16 @@ game.overlay.pick_trump.prompt=Please choose the trump suit
game.overlay.round.title=Round {0} game.overlay.round.title=Round {0}
game.overlay.trump.yellow=The trump suit is [#ffff00]yellow[#ffffff] game.overlay.trump.yellow=The trump suit is [#ffff00]yellow[]
game.overlay.trump.green=The trump suit is [#00ff00]green[#ffffff] game.overlay.trump.green=The trump suit is [#00ff00]green[]
game.overlay.trump.blue=The trump suit is [#0000ff]blue[#ffffff] game.overlay.trump.blue=The trump suit is [#0000ff]blue[]
game.overlay.trump.red=The trump suit is [#ff0000]red[#ffffff] game.overlay.trump.red=The trump suit is [#ff0000]red[]
game.overlay.trump.none=There is no trump suit game.overlay.trump.none=There is no trump suit
game.overlay.trump.unknown=The trump suit is yet to be determined 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.yellow.player={0} choose the trump suit [#ffff00]yellow[]
game.overlay.trump.green.player={0} choose the trump suit [#00ff00]green[#ffffff] game.overlay.trump.green.player={0} choose the trump suit [#00ff00]green[]
game.overlay.trump.blue.player={0} choose the trump suit [#0000ff]blue[#ffffff] game.overlay.trump.blue.player={0} choose the trump suit [#0000ff]blue[]
game.overlay.trump.red.player={0} choose the trump suit [#ff0000]red[#ffffff] 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.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} game.overlay.trump.unknown.player=The trump suit is yet to be determined by {0}

@ -1,126 +1,112 @@
# suppress inspection "UnusedProperty" for whole file # suppress inspection "UnusedProperty" for whole file
menu.main.play=Spiel beitreten menu.main.play=Spiel beitreten
menu.main.instructions=Spielanleitung
menu.main.quit=Verlassen menu.main.quit=Verlassen
menu.main.ok=OK
menu.instruction.nextPageButton=Nächste Seite menu.instruction.back=Zurück
menu.instruction.previousPageButton=Vorherige Seite
menu.instruction.wizard=Zauberer menu.instruction.wizard=Zauberer
menu.instruction.jester=Narr menu.instruction.jester=Narr
menu.instruction.suit.blue=Blau
menu.instruction.main=Spielanleitung menu.instruction.suit.green=Grün
menu.instruction.main.text1=Willkommen menu.instruction.suit.yellow=Gelb
menu.instruction.main.text2=Auf dieser Seite findest du die Regeln des Grundspiels und zur Punktewertung.\n\ menu.instruction.suit.red=Rot
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.main.title=Spielanleitung
menu.instruction.introduction1=Wizard ist ein Stichspiel mit dem Ziel in jeder Runde die genau Anzahl der selbstgewonnen\ menu.instruction.main.welcome.title=Willkommen
Stiche vorherzusagen. 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.introduction2=Für richtige Vorhersagen erhält jeder Spieler Punkte und am Ende gewinnt der Spieler mit\ menu.instruction.main.general.title=Grundlegendes
der höchsten Punktzahl.\n 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.standardgameheading=Grundspiel menu.instruction.standard.title=Grundspiel
menu.instruction.standardgame1=Im Grundspiel gibt es 60 Karten 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.standardgame2=52 dieser Karten verteilen sich auf die folgenden vier Farben. menu.instruction.standard.par1=Die 8 verbleibenden Karten verteilen sich hälftig auf Zauberer und Narren und haben keine Farbe. \
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\
Die vier Zauberer haben einen höheren Wert als alle anderen Karten und die vier Narren einen niedrigeren. 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\ 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\ Nach dem Verteilen der Karten wird eine Trumpffarbe bestimmt. Sie entspricht der Farbe der Karte, \
Die im Spielbildschirm links unten angezeigt wird.\n\ die im Spielbildschirm links unten angezeigt wird. \
Ein Trumpf ist jede Karte der Trumpffarbe und höher als alle Karten der anderen Farben.\n\ 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.\n\ 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\ 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\ 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.\n Tipp für Neulinge: Ein gutes Blatt für viele Stiche hat Zauberer, Trumpfkarten und hohe Farbkarten.
menu.instruction.standardgame6=Der Ablauf eine Stichs menu.instruction.standard.trick.title=Der Ablauf eines Stichs
menu.instruction.standardgame7=Die erste Karte eines Stichs spielt beim ersten Stich der virtuelle linke Nachbar des Gebers.\n\ 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.\n\ Alle weiteren Stiche eröffnet der Spieler, der den letzten Stich gewonnen hat. \
Danach spielen alle Mitspieler im Uhrzeigersinn eine Karte\n\ Danach spielen alle Mitspieler im Uhrzeigersinn eine Karte. \
Zur Farbe der ersten Karte muss zugegeben werden. Das bedeutet: Hat ein Spieler eine Farbe dieser Karte\n\ 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.\n\ 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\ 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\ 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\ \ + Der erste Zauberer in einem Stich\n\
+Die höchste Trumpfkarte\n\ \ + Die höchste Trumpfkarte\n\
+Die höchste Farbkarte der angespielten Farbe \ + Die höchste Farbkarte der angespielten Farbe
menu.instruction.standardgame8=Besonderheiten menu.instruction.standard.special_cases.title=Besonderheiten
menu.instruction.standardgame9=Eröffnet ein Spieler einen Stich mit einem Zauberer, dürfen die Mitspieler beliebige\n\ 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.\nDer Stich geht in jedem Fall an den ersten Zauberer.\n\n\ 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,\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,\n\ bis ein Lehrling einen Zauberer oder eine Zahlenkarte spielt. Handelt es sich um eine Zahlenkarte, \
muss zu ihrer Farbe zugegeben werden.\n\ muss zu ihrer Farbe zugegeben werden.\n\
Handelt es sich um einen Zauberer, dürfen beliebige Karten gespielt werden.\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.\n Im seltenen Fall, dass nur Narren im Stich liegen, gewinnt der erste Narr.
menu.instruction.scoring=Punktewertung menu.instruction.standard.scoring.title=Punktewertung
menu.instruction.standardgame10=Bei einer richtigen Vorhersage gibt es pro gemachten Stich 10 Punkte\n\ 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\ 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.title=Spielvarianten
menu.instruction.variant.intro=Bei der Erstellung eines neuen Spiels können folgende 6 Varianten ausgewählt werden. 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=1) Default
menu.instruction.variant.default.description=Das Grundspiel mit den Grundregeln. menu.instruction.variant.default.description=Das Grundspiel mit den Grundregeln.
menu.instruction.variant.defaultpm1=2) Default PM1 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. Das bedeutet: Der Tipp mindestens eines Spielers ist falsch.
menu.instruction.variant.anniversary2016=3) Anniversary 2016 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.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=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. Zusatzbedingung, dass die Vorhersage nicht der Rundenanzahl entsprechen darf.
menu.instruction.variant.anniversary2021=5) Anniversary 2021 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.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=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. Zusatzbedingung, dass die Vorhersage nicht der Rundenanzahl entsprechen darf.
menu.instruction.special_card.title=Sonderkarten 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\ 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.\n Der Gestaltwandler ist nur in der Jubiläumsedition 2021 enthalten.
menu.instruction.special_card.dragon=Den Drachen kann ein Spieler immer spielen.\n\ 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\n\ Der Drache ist die Karte mit dem höchsten Wert im Spiel. Er ist höher als jeder Zauberer und gewinnt jeden Stich \
und gewinnt jeden Stich mit der Ausnahme der Fee im selben Stich (siehe Fee).\n\ mit der Ausnahme der Fee im selben Stich (siehe Fee). Deckt der Geber zur Bestimmung der Trumpffarbe den Drachen \
Deckt der Geber zur Bestimmung der Trumpffarbe den Drachen auf, bestimmt er eine Trumpffarbe.\n\ auf, bestimmt er eine Trumpffarbe. Eröffnest ein Spieler einen Stich mit einem Drachen, gelten dieselben Regeln \
Eröffnest ein Spieler einen Stich mit einem Drachen, gelten dieselben Regeln\n\
wie beim Spielen eines Zauberers. wie beim Spielen eines Zauberers.
menu.instruction.special_card.fairy=Die Fee kann ein Spieler immer spielen.\n\ menu.instruction.special_card.fairy=Die Fee kann ein Spieler immer spielen. \
Die Fee ist die Karte mit dem niedrigsten Wert im Spiel.\n\ Die Fee ist die Karte mit dem niedrigsten Wert im Spiel. Sie ist sogar niedriger als jeder Narr und verliert jeden \
Sie ist sogar niedriger als jeder Narr und verliert jeden Stich, außer Fee und Drache liegen im selben Stich.\n\ Stich, außer Fee und Drache liegen im selben Stich. Dann gewinnt die Fee den Stich! Deckt der Geber zur Bestimmung \
Dann gewinnt die Fee den Stich!\n\ der Trumpffarbe die Fee auf, gibt es in dieser Runde keine Trumpffarbe. Eröffnest ein Spieler den Stich mit einer \
Deckt der Geber zur Bestimmung der Trumpffarbe die Fee auf, gibt es in dieser Runde keine Trumpffarbe.\n\ Fee, gelten dieselben Regeln wie beim Spielen eines Narren.
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. \
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. Der Spieler, der den Stich \
Den Stich mit der Bombe gewinnt kein Spieler. Er zählt auch zu keiner Stichvorhersage.\n\ mit der Bombe gewonnen hätte, eröffnet den nächsten Stich. Deckt der Geber bei der Bestimmung der Trumpffarbe die \
Der Spieler, der den Stich mit der Bombe gewonnen hätte, eröffnet den nächsten Stich.\n\ Bombe auf, gibt es in dieser Runde keine Trumpffarbe. Eröffnet ein Spieler einen Stich mit einer Bombe, gelten \
Deckt der Geber bei der Bestimmung der Trumpffarbe die Bombe auf,\n\ dieselben Regeln wie beim Spielen eines Narren.
gibt es in dieser Runde keine Trumpffarbe.\n\ menu.instruction.special_card.werewolf=Hat ein Spieler den Werwolf auf der Hand, tauscht er ihn zu Beginn der \
Eröffnet ein Spieler einen Stich mit einer Bombe, gelten dieselben Regeln wie beim Spielen eines Narren. Stichrunde gegen die trumpfbestimmende Karte aus. Anschließend wählt der Spieler eine Trumpffarbe oder wählt, dass \
menu.instruction.special_card.werewolf=Hat ein Spieler den Werwolf auf der Hand, tauscht er ihn zu Beginn der Stichrunde\n\ es in dieser Runde keinen Trumpf gibt. Danach macht der erste Spieler seine Vorhersage. Deckt der Geber bei der \
gegen die trumpfbestimmende Karte aus.\n\ Bestimmung der Trumpffarbe den Werwolf auf, bestimmt er eine Trumpffarbe.
Anschließend wählt der Spieler eine Trumpffarbe oder wählt, dass es in dieser Runde keinen Trumpf gibt.\n\ menu.instruction.special_card.juggler=Den Jongleur kann ein Spieler immer spielen. Er hat den Wert 7 \u00bd, ist also \
Danach macht der erste Spieler seine Vorhersage.\n\ höher als eine 7 und niedriger als eine 8. Spielt ein Spieler den Jongleur in einem Stich, bestimmt er welche Farbe \
Deckt der Geber bei der Bestimmung der Trumpffarbe den Werwolf auf,\n\ die Karte annehmen soll. Nach dem Stich gibt jeder Spieler gleichzeitig eine seiner Handkarten verdeckt an seinen \
bestimmt er eine Trumpffarbe. linken Nachbarn. Deckt der Geber bei der Bestimmung der Trumpffarbe den Jongleur auf, bestimmt er eine Trumpffarbe. \
menu.instruction.special_card.juggler=Den Jongleur kann ein Spieler immer spielen.\n\ Eröffnet ein Spieler den Stich mit einem Jongleur, so muss zur angesagten Farbe zugegeben werden.
Er hat den Wert 7 \u00bd, ist also höher als eine 7 und niedriger als eine 8.\n\ menu.instruction.special_card.cloud=Die Wolke kann ein Spieler immer spielen. Sie hat den Wert 9 \u00be, ist also \
Spielt ein Spieler den Jongleur in einem Stich, bestimmt er welche Farbe die Karte annehmen soll.\n\ höher als eine 9 und niedriger als eine 10. Spielt ein Spieler die Wolke in einem Stich, bestimmt er welche Farbe \
Nach dem Stich gibt jeder Spieler gleichzeitig eine seiner Handkarten verdeckt\n\ die Karte annehmen soll. Liegt die Wolke am Ende einer Runde in den Stichen eines Lehrlings, muss dieser seine \
an seinen linken Nachbarn.\n\ Stichvorhersage um +1 oder um -1 verändern. Liegen Wolke und Bombe in einem Stich, ändert sich die Stichvorhersage \
Deckt der Geber bei der Bestimmung der Trumpffarbe den Jongleur auf,\n\ nicht. Deckt der Geber bei der Bestimmung der Trumpffarbe die Wolke auf, bestimmt er eine Trumpffarbe. Eröffnest du \
bestimmt er eine Trumpffarbe.\n\ den Stich mit einer Wolke, muss die angesagte Farbe bedient werden.
Eröffnet ein Spieler den Stich mit einem Jongleur, so muss zur angesagten Farben zugegeben werden. menu.instruction.special_card.changeling=Den Gestaltwandler kann ein Spieler immer spielen. Er ist entweder ein Narr \
menu.instruction.special_card.cloud=Die Wolke kann ein Spieler immer spielen.\n\ oder ein Zauberer. Beim Ausspielen des Gestaltwandlers wählt ein Spieler aus, ob er ein Narr oder ein Zauberer sein \
Sie hat den Wert 9 \u00be, ist also höher als eine 9 und niedriger als eine 10.\n\ soll. Deckt der virtuelle Geber zur Bestimmung der Trumpffarbe den Gestaltwandler auf, bestimmt er eine Trumpffarbe.
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.connect.connect=Verbinden menu.connect.connect=Verbinden
menu.connect.back=Zurück 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_not_found=Fehler: Spieler nicht gefunden
menu.error.player_name_taken=Fehler: Spielername bereits vergeben menu.error.player_name_taken=Fehler: Spielername bereits vergeben
menu.error.player_name_not_allowed=Fehler: Spielername nicht erlaubt menu.error.player_name_not_allowed=Fehler: Spielername nicht erlaubt
menu.error.session_name_taken=Fehler: Sessionname bereits vergeben menu.error.session_name_taken=Fehler: Sitzungsname bereits vergeben
menu.error.session_name_not_allowed=Fehler: Sessionname nicht erlaubt menu.error.session_name_not_allowed=Fehler: Sitzungsname nicht erlaubt
menu.error.illegal_state=Fehler: Illegaler Zustand menu.error.illegal_state=Fehler: Illegaler Zustand
menu.error.game_already_started=Fehler: Spiel hat bereits begonnen menu.error.game_already_started=Fehler: Spiel hat bereits begonnen
menu.error.game_not_yet_started=Fehler: Spiel hat noch nicht 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.round.title=Runde {0}
game.overlay.trump.yellow=Die Trumpffarbe ist [#ffff00]gelb[#ffffff] game.overlay.trump.yellow=Die Trumpffarbe ist [#ffff00]gelb[]
game.overlay.trump.green=Die Trumpffarbe ist [#00ff00]grün[#ffffff] game.overlay.trump.green=Die Trumpffarbe ist [#00ff00]grün[]
game.overlay.trump.blue=Die Trumpffarbe ist [#0000ff]blau[#ffffff] game.overlay.trump.blue=Die Trumpffarbe ist [#0000ff]blau[]
game.overlay.trump.red=Die Trumpffarbe ist [#ff0000]rot[#ffffff] game.overlay.trump.red=Die Trumpffarbe ist [#ff0000]rot[]
game.overlay.trump.none=Es gibt keine Trumpffarbe game.overlay.trump.none=Es gibt keine Trumpffarbe
game.overlay.trump.unknown=Die Trumpffarbe muss noch bestimmt werden 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.yellow.player={0} hat die Trumpffarbe [#ffff00]gelb[] gewählt
game.overlay.trump.green.player={0} hat die Trumpffarbe [#00ff00]grün[#ffffff] 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[#ffffff] 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[#ffffff] 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.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 game.overlay.trump.unknown.player={0} muss die Trumpffarbe muss noch bestimmen

@ -17,26 +17,6 @@ public enum Card {
WEREWOLF; WEREWOLF;
public enum Suit { public enum Suit {
NONE, NONE, YELLOW, RED, GREEN, BLUE
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";
}
}
} }
} }
Loading…
Cancel
Save