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); for (Card.Suit suit : Card.Suit.values()) {
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()) {
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,119 +1,119 @@
# 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.
The four wizards have a higher value than all other cards and the four jesters have a lower value. menu.instruction.standard.title=Basic Game
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.par0=In the basic game there are 60 different cards. 52 of these cards are distributed among \
the cards are dealt virtually as the dealer one of the players.\n\ the following four suits. The highest card is 13, the lowest card is 1.
After the cards are dealt, a trump suit is determined. It corresponds to the suit of the card\n\ menu.instruction.standard.par1=The 8 remaining cards are divided equally between Wizards and Jesters and have no suit. \
which is displayed in the bottom left corner of the game screen.\n\ The four wizards have a higher value than all other cards and the four jesters have a lower value.
A trump is any card of the trump suit and higher than all cards of the other suits.\n\ menu.instruction.standard.par2=For each round count: the number of rounds equals the number of cards per player equals \
Important. If the card determining the trump is a jester, there is no trump in this round.\n\ and the number of tricks the cards are dealt virtually as the dealer one of the players. After the cards are dealt, \
If the trump card is a Wizard, the dealer chooses a trump suit.\n\ a trump suit is determined. It corresponds to the suit of the card which is displayed in the bottom left corner of \
Once the trump suit is determined, each player states how many tricks they want to make in the round.\n\ the game screen. A trump is any card of the trump suit and higher than all cards of the other suits.\n\
Tip for newcomers: A good hand for many tricks has wizards, trump cards and high suit cards.\n Important. If the card determining the trump is a jester, there is no trump in this round. \
menu.instruction.standardgame6=The process of a trick If the trump card is a Wizard, the dealer chooses a trump suit. \
menu.instruction.standardgame7=The first card of a trick is played at the first trick by the dealer's virtual left neighbor.\n\ Once the trump suit is determined, each player states how many tricks they want to make in the round. \
All further tricks are opened by the player who won the last trick.\n\ Tip for newcomers: A good hand for many tricks has wizards, trump cards and high suit cards.
After that, all players play one card in clockwise order.\n\ menu.instruction.standard.trick.title=The process of a trick
To the suit of the first card must be added. This means that if a player has a suit of this card\n\ menu.instruction.standard.trick.par0=The first card of a trick is played at the first trick by the dealer's virtual \
he must play it and must not play a card of any other suit.\n\ left neighbor. All further tricks are opened by the player who won the last trick. After that, all players play one \
Exceptions to this are wizards and jesters. These cards may always be played!\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 \
The trick is won by the player with the highest card.\nThe following descending rank for the highest card applies:\n\ card he must play it and must not play a card of any other suit. Exceptions to this are wizards and jesters. These \
+The first wizard in a trick\n\ cards may always be played! The trick is won by the player with the highest card. The following descending rank for \
+The highest trump card\n\ the highest card applies:\n\
+The highest suit card of the played suit. \ + The first wizard in a trick\n\
menu.instruction.standardgame8=Special cases \ + The highest trump card\n\
menu.instruction.standardgame9=If a player starts a trick with a wizard, the other players may play any\n\ \ + The highest suit card of the played suit.
cards, including any other Wizards or Jesters.\nThe trick goes to the first Wizard in any case.\n\n\ menu.instruction.standard.special_cases.title=Special cases
If a player opens a trick with a Jester, any cards may be played\n\ menu.instruction.standard.special_cases.par0=If a player starts a trick with a wizard, the other players may play any \
until an another player plays a wizard or a number card. If it is a number card,\n\ cards, including any other Wizards or Jesters. The trick goes to the first Wizard in any case.\n\n\
all further cards must be added to its suit.\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 \
If it is a wizard, any cards may be played.\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. \
In the rare case that only jesters are in the trick, the first jester wins.\n In the rare case that only jesters are in the trick, the first jester wins.
menu.instruction.scoring=Scoring menu.instruction.standard.scoring.title=Scoring
menu.instruction.standardgame10=If the prediction is correct, 10 points are awarded for each trick made plus\n\ 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\n\ 20 points as a basic amount.\nIf the prediction is wrong, -10 points are awarded for each deviating trick and the \
does not receive any basic amount.\n\ player does not receive any basic amount.\n\
The score is then offset against a player's previous score.\n The score is then offset against a player's previous score.
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\ he determines a trump suit.
If the dealer reveals the werewolf when determining the trump suit,\n\ menu.instruction.special_card.juggler=The juggler is always playable. \
he determines a trump suit. He has the value 7 \u00bd, therefore he is higher than a 7 and lower than an 8. \
menu.instruction.special_card.juggler=The juggler is always playable.\n\ The acting player determines the juggler's suit. After the trick every player gives one of his cards to his left \
He has the value 7 \u00bd, therefore he is higher than a 7 and lower than a 8.\n\ neighbor. If the juggler is the determining trump card the dealer chooses the trump suit. The juggler as the first \
The acting player determines the juggler's suit.\n\ card of a trick determines the suit of a trick.
After the trick every player gives one of his cards to his left neighbor.\n\ menu.instruction.special_card.cloud=The cloud is always playable. \
If the juggler is the determining trump card the dealer chooses the trump suit.\n\ She has the value 9 \u00bd, therefore he is higher than a 9 and lower than a 10. The acting player determines the \
The juggler as the first card of a trick determines the suit of a trick. suit of the cloud. If any of a player's tricks contains the cloud, he must increment or decrease his prediction by 1 \
menu.instruction.special_card.cloud=The cloud is always playable.\n\ but the trick contains the cloud and the bomb. \
She has the value 9 \u00bd, therefore he is higher than a 9 and lower than a 10.\n\ If the cloud is the determining trump card the dealer chooses the trump suit. The cloud as the first card of a \
The acting player determines the suit of the cloud.\n\ trick determines the suit of a trick.
If any of a player's tricks contains the cloud, he must increment or decrease his prediction by 1\n\ menu.instruction.special_card.changeling=The changeling is always playable. He is either a wizard or a jester. \
but the trick contains the cloud and the bomb.\n\ When played the player chooses which of these two the changeling represents. \
If the cloud is the determining trump card the dealer chooses the trump suit.\n\ If the changeling 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.\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.connect.connect=Connect menu.connect.connect=Connect
menu.connect.back=Back 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.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. \
menu.instruction.special_card.fairy=Die Fee kann ein Spieler immer spielen.\n\ Die Fee ist die Karte mit dem niedrigsten Wert im Spiel. Sie ist sogar niedriger als jeder Narr und verliert jeden \
Die Fee ist die Karte mit dem niedrigsten Wert im Spiel.\n\ Stich, außer Fee und Drache liegen im selben Stich. Dann gewinnt die Fee den Stich! Deckt der Geber zur Bestimmung \
Sie ist sogar niedriger als jeder Narr und verliert jeden Stich, außer Fee und Drache liegen im selben Stich.\n\ der Trumpffarbe die Fee auf, gibt es in dieser Runde keine Trumpffarbe. Eröffnest ein Spieler den Stich mit einer \
Dann gewinnt die Fee den Stich!\n\ Fee, gelten dieselben Regeln wie beim Spielen eines Narren.
Deckt der Geber zur Bestimmung der Trumpffarbe die Fee auf, gibt es in dieser Runde keine Trumpffarbe.\n\ menu.instruction.special_card.bomb=Die Bombe kann ein Spieler immer spielen. \
Eröffnest ein Spieler den Stich mit einer Fee, gelten dieselben Regeln wie beim Spielen eines Narren. Den Stich mit der Bombe gewinnt kein Spieler. Er zählt auch zu keiner Stichvorhersage. Der Spieler, der den Stich \
menu.instruction.special_card.bomb=Die Bombe kann ein Spieler immer spielen.\n\ mit der Bombe gewonnen hätte, eröffnet den nächsten Stich. Deckt der Geber bei der Bestimmung der Trumpffarbe die \
Den Stich mit der Bombe gewinnt kein Spieler. Er zählt auch zu keiner Stichvorhersage.\n\ Bombe auf, gibt es in dieser Runde keine Trumpffarbe. Eröffnet ein Spieler einen Stich mit einer Bombe, gelten \
Der Spieler, der den Stich mit der Bombe gewonnen hätte, eröffnet den nächsten Stich.\n\ dieselben Regeln wie beim Spielen eines Narren.
Deckt der Geber bei der Bestimmung der Trumpffarbe die Bombe auf,\n\ menu.instruction.special_card.werewolf=Hat ein Spieler den Werwolf auf der Hand, tauscht er ihn zu Beginn der \
gibt es in dieser Runde keine Trumpffarbe.\n\ Stichrunde gegen die trumpfbestimmende Karte aus. Anschließend wählt der Spieler eine Trumpffarbe oder wählt, dass \
Eröffnet ein Spieler einen Stich mit einer Bombe, gelten dieselben Regeln wie beim Spielen eines Narren. es in dieser Runde keinen Trumpf gibt. Danach macht der erste Spieler seine Vorhersage. Deckt der Geber bei der \
menu.instruction.special_card.werewolf=Hat ein Spieler den Werwolf auf der Hand, tauscht er ihn zu Beginn der Stichrunde\n\ Bestimmung der Trumpffarbe den Werwolf auf, bestimmt er eine Trumpffarbe.
gegen die trumpfbestimmende Karte aus.\n\ menu.instruction.special_card.juggler=Den Jongleur kann ein Spieler immer spielen. Er hat den Wert 7 \u00bd, ist also \
Anschließend wählt der Spieler eine Trumpffarbe oder wählt, dass es in dieser Runde keinen Trumpf gibt.\n\ höher als eine 7 und niedriger als eine 8. Spielt ein Spieler den Jongleur in einem Stich, bestimmt er welche Farbe \
Danach macht der erste Spieler seine Vorhersage.\n\ die Karte annehmen soll. Nach dem Stich gibt jeder Spieler gleichzeitig eine seiner Handkarten verdeckt an seinen \
Deckt der Geber bei der Bestimmung der Trumpffarbe den Werwolf auf,\n\ linken Nachbarn. Deckt der Geber bei der Bestimmung der Trumpffarbe den Jongleur auf, bestimmt er eine Trumpffarbe. \
bestimmt er eine Trumpffarbe. Eröffnet ein Spieler den Stich mit einem Jongleur, so muss zur angesagten Farbe zugegeben werden.
menu.instruction.special_card.juggler=Den Jongleur kann ein Spieler immer spielen.\n\ menu.instruction.special_card.cloud=Die Wolke kann ein Spieler immer spielen. Sie hat den Wert 9 \u00be, ist also \
Er hat den Wert 7 \u00bd, ist also höher als eine 7 und niedriger als eine 8.\n\ höher als eine 9 und niedriger als eine 10. Spielt ein Spieler die Wolke in einem Stich, bestimmt er welche Farbe \
Spielt ein Spieler den Jongleur in einem Stich, bestimmt er welche Farbe die Karte annehmen soll.\n\ die Karte annehmen soll. Liegt die Wolke am Ende einer Runde in den Stichen eines Lehrlings, muss dieser seine \
Nach dem Stich gibt jeder Spieler gleichzeitig eine seiner Handkarten verdeckt\n\ Stichvorhersage um +1 oder um -1 verändern. Liegen Wolke und Bombe in einem Stich, ändert sich die Stichvorhersage \
an seinen linken Nachbarn.\n\ nicht. Deckt der Geber bei der Bestimmung der Trumpffarbe die Wolke auf, bestimmt er eine Trumpffarbe. Eröffnest du \
Deckt der Geber bei der Bestimmung der Trumpffarbe den Jongleur auf,\n\ den Stich mit einer Wolke, muss die angesagte Farbe bedient werden.
bestimmt er eine Trumpffarbe.\n\ menu.instruction.special_card.changeling=Den Gestaltwandler kann ein Spieler immer spielen. Er ist entweder ein Narr \
Eröffnet ein Spieler den Stich mit einem Jongleur, so muss zur angesagten Farben zugegeben werden. oder ein Zauberer. Beim Ausspielen des Gestaltwandlers wählt ein Spieler aus, ob er ein Narr oder ein Zauberer sein \
menu.instruction.special_card.cloud=Die Wolke kann ein Spieler immer spielen.\n\ soll. Deckt der virtuelle Geber zur Bestimmung der Trumpffarbe den Gestaltwandler auf, bestimmt er eine Trumpffarbe.
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.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