Anleitungsscreen(#18)

main
Johannes Hochwart 3 years ago
parent 254c4a99c4
commit 8cc7e03282

@ -0,0 +1,223 @@
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.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.ui.*;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import eu.jonahbauer.wizard.client.libgdx.GameAtlas;
import eu.jonahbauer.wizard.client.libgdx.WizardGame;
import eu.jonahbauer.wizard.client.libgdx.actors.CardActor;
import eu.jonahbauer.wizard.client.libgdx.state.Menu;
import eu.jonahbauer.wizard.common.model.Card;
public class InstructionScreen extends MenuScreen {
private TextButton buttonOK;
private VerticalGroup content;
private ScrollPane scrollPane;
private Label title;
private TextButton nextPageButton;
private TextButton previousPageButton;
private HorizontalGroup horizontalButtonGroup;
private int pagecounter = 0;
private TextureAtlas atlas;
private CardActor card;
private final ChangeListener listener = new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
if (actor == buttonOK) {
game.getClient().execute(Menu.class, Menu::showMenuScreen);
sfxClick();
} else if (actor == nextPageButton) {
switch(pagecounter) {
case 0: pagecounter++; showSecondPage(); break;
case 1: pagecounter++; showThirdPage(); break;
default: throw new IllegalStateException();
}
} else if (actor == previousPageButton) {
switch(pagecounter) {
case 1: pagecounter--; showFirstPage(); break;
case 2: pagecounter--; showSecondPage(); break;
default: throw new IllegalStateException();
}
}
}
};
public InstructionScreen(WizardGame game) {
super(game);
}
@Override
public void show() {
super.show();
prepareScreen();
previousPageButton = new TextButton(messages.get("menu.instruction.previousPageButton"), skin);
nextPageButton = new TextButton(messages.get("menu.instruction.nextPageButton"), skin);
horizontalButtonGroup = new HorizontalGroup();
buttonOK = new TextButton(messages.get("menu.main.ok"), skin);
scrollPane = new ScrollPane(content, skin);
scrollPane.setFadeScrollBars(true);
scrollPane.setOverscroll(false,false);
scrollPane.setPosition(corners[0].getWidth() + 5, 0);
scrollPane.setSize(WizardGame.WIDTH - (2 * corners[0].getWidth() + 5), WizardGame.HEIGHT);
scrollPane.setColor(new Color(0, 0, 0, 0.75f));
showFirstPage();
Gdx.input.setInputProcessor(stage);
stage.addActor(scrollPane);
buttonOK.addListener(listener);
nextPageButton.addListener(listener);
previousPageButton.addListener(listener);
}
private void prepareScreen() {
atlas = new TextureAtlas(Gdx.files.internal(GameAtlas.$PATH));
content = new VerticalGroup();
}
private void clearContent() {
while(content.getChildren().size > 0) {
content.removeActorAt(0, false);
}
horizontalButtonGroup.clear();
}
private void addButtons() {
if(pagecounter != 0) {
horizontalButtonGroup.addActor(previousPageButton);
}
if(pagecounter != 2) {
horizontalButtonGroup.addActor(nextPageButton);
}
horizontalButtonGroup.space(10);
content.addActor(horizontalButtonGroup);
content.addActor(buttonOK);
}
private void showFirstPage() {
clearContent();
title = new Label(messages.get("menu.instruction.main"), skin, "enchanted");
content.addActor(title);
Label maintext1 = new Label(messages.get("menu.instruction.main.text1"), skin);
maintext1.setFontScale(2.0f);
content.addActor(maintext1);
Label maintext2 = new Label(messages.get("menu.instruction.main.text2"), skin);
content.addActor(maintext2);
Label general = new Label(messages.get("menu.instruction.general"), skin, "enchanted");
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) {
VerticalGroup cardColor = new VerticalGroup();
cardColor.space(10);
card = new CardActor(Card.Suit.values()[suit.ordinal()], atlas);
cardColor.addActor(card);
Label colorLabel = new Label(suit.toString(), skin);
cardColor.addActor(colorLabel);
colors.addActor(cardColor);
}
}
content.addActor(colors);
Label standardGame4 = new Label(messages.get("menu.instruction.standardgame4"), skin);
content.addActor(standardGame4);
HorizontalGroup wizardJester = new HorizontalGroup();
wizardJester.padTop(5);
wizardJester.space(10);
VerticalGroup wizardVerticalGroup = new VerticalGroup();
wizardVerticalGroup.space(10);
card = new CardActor(Card.values()[Card.BLUE_WIZARD.ordinal()], atlas);
wizardVerticalGroup.addActor(card);
Label wizardLabel = new Label(messages.get("menu.instruction.wizard"), skin);
wizardVerticalGroup.addActor(wizardLabel);
wizardJester.addActor(wizardVerticalGroup);
VerticalGroup jesterVerticalGroup = new VerticalGroup();
jesterVerticalGroup.space(10);
card = new CardActor(Card.values()[Card.BLUE_JESTER.ordinal()], atlas);
jesterVerticalGroup.addActor(card);
Label jesterLabel = new Label(messages.get("menu.instruction.jester"), skin);
jesterVerticalGroup.addActor(jesterLabel);
wizardJester.addActor(jesterVerticalGroup);
content.addActor(wizardJester);
Label standardGame5 = new Label(messages.get("menu.instruction.standardgame5"), skin);
content.addActor(standardGame5);
Label standardGame6 = new Label(messages.get("menu.instruction.standardgame6"), skin);
standardGame6.setFontScale(2.0f);
content.addActor(standardGame6);
Label standardGame7 = new Label(messages.get("menu.instruction.standardgame7"), skin);
content.addActor(standardGame7);
Label standardGame8 = new Label(messages.get("menu.instruction.standardgame8"), skin);
standardGame8.setFontScale(2.0f);
content.addActor(standardGame8);
Label standardGame9 = new Label(messages.get("menu.instruction.standardgame9"), skin);
content.addActor(standardGame9);
Label scoring = new Label(messages.get("menu.instruction.scoring"), skin, "enchanted");
content.addActor(scoring);
Label standardGame10 = new Label(messages.get("menu.instruction.standardgame10"), skin);
content.addActor(standardGame10);
addButtons();
}
private void showSecondPage() {
clearContent();
title.setText(messages.get("menu.instruction.variant.title"));
content.addActor(title);
Label variantsIntro = new Label(messages.get("menu.instruction.variant.intro"), skin);
content.addActor(variantsIntro);
Table table = new Table(skin);
table.defaults().space(15.0f).left().pad(25.0f);
table.add(messages.get("menu.instruction.variant.default"));
table.add(messages.get("menu.instruction.variant.default.description")).left();
table.row();
table.add(messages.get("menu.instruction.variant.defaultpm1"));
table.add(messages.get("menu.instruction.variant.defaultpm1.description"));
table.row();
table.add(messages.get("menu.instruction.variant.anniversary2016"));
table.add(messages.get("menu.instruction.variant.anniversary2016.description"));
table.row();
table.add(messages.get("menu.instruction.variant.anniversary2016pm1"));
table.add(messages.get("menu.instruction.variant.anniversary2016pm1.description"));
table.row();
table.add(messages.get("menu.instruction.variant.anniversary2021"));
table.add(messages.get("menu.instruction.variant.anniversary2021.description"));
table.row();
table.add(messages.get("menu.instruction.variant.anniversary2021pm1"));
table.add(messages.get("menu.instruction.variant.anniversary2021pm1.description"));
table.row();
content.addActor(table);
addButtons();
scrollPane.setScrollY(0);
}
private void showThirdPage() {
clearContent();
title.setText(messages.get("menu.instruction.special_card.title"));
content.addActor(title);
addButtons();
}
}

@ -14,6 +14,7 @@ public class MainMenuScreen extends MenuScreen {
private TextButton buttonPlay;
private TextButton buttonQuit;
private TextButton buttonInstruction;
private final ChangeListener listener = new ChangeListener() {
@Override
@ -24,6 +25,9 @@ public class MainMenuScreen extends MenuScreen {
} else if (actor == buttonQuit) {
sfxClick();
Gdx.app.exit();
} else if (actor == buttonInstruction) {
game.getClient().execute(Menu.class, Menu::showInstructionScreen);
sfxClick();
}
}
};
@ -54,18 +58,22 @@ public class MainMenuScreen extends MenuScreen {
}
buttonPlay = new TextButton(messages.get("menu.main.play"), skin);
buttonPlay.setPosition((WizardGame.WIDTH - buttonPlay.getWidth()) / 2f, 192 + 504 - 120f - 125f);
buttonPlay.setPosition((WizardGame.WIDTH - buttonPlay.getWidth()) / 2f, 170 + 504 - 125f);
buttonPlay.addListener(listener);
buttonInstruction = new TextButton(messages.get("menu.instruction.main"), skin);
buttonInstruction.setPosition((WizardGame.WIDTH - buttonInstruction.getWidth()) / 2f, 170 + 494 - 189.5f - 125f + buttonInstruction.getHeight() / 2f);
buttonInstruction.addListener(listener);
buttonQuit = new TextButton(messages.get("menu.main.quit"), skin);
buttonQuit.setPosition((WizardGame.WIDTH - buttonQuit.getWidth()) / 2f, 192 + 120f);
buttonQuit.setPosition((WizardGame.WIDTH - buttonQuit.getWidth()) / 2f, 170 + 120f);
buttonQuit.addListener(listener);
stage.addActor(buttonPlay);
stage.addActor(buttonInstruction);
stage.addActor(buttonQuit);
stage.addCaptureListener(new KeyboardFocusManager(buttonPlay, buttonQuit));
buttonPlay.setName("button_player");
buttonInstruction.setName("button_instruction");
buttonQuit.setName("button_quit");
}
}

@ -9,7 +9,7 @@ import lombok.AccessLevel;
import lombok.Getter;
public abstract class MenuScreen extends WizardScreen {
private Image[] corners;
protected Image[] corners;
@Getter(value = AccessLevel.PROTECTED, lazy = true)
private final HorizontalGroup buttonGroup = createButtonGroup();

@ -56,7 +56,7 @@ public abstract class WizardScreen implements Screen {
stage = new Stage(viewport);
stage.addListener(new ButtonKeyListener());
stage.addListener(new AutoFocusListener());
stage.setDebugAll(WizardGame.DEBUG);
//stage.setDebugAll(WizardGame.DEBUG);
Gdx.input.setInputProcessor(stage);

@ -3,6 +3,7 @@ package eu.jonahbauer.wizard.client.libgdx.state;
import eu.jonahbauer.wizard.client.libgdx.Client;
import eu.jonahbauer.wizard.client.libgdx.ClientSocket;
import eu.jonahbauer.wizard.client.libgdx.screens.ConnectScreen;
import eu.jonahbauer.wizard.client.libgdx.screens.InstructionScreen;
import eu.jonahbauer.wizard.client.libgdx.screens.MainMenuScreen;
import eu.jonahbauer.wizard.common.messages.server.ServerMessage;
import lombok.SneakyThrows;
@ -58,6 +59,12 @@ public final class Menu extends BaseState {
return Optional.empty();
}
public Optional<ClientState> showInstructionScreen(Client client) {
var game = client.getGame();
game.setScreen(new InstructionScreen(game));
return Optional.empty();
}
public Optional<ClientState> connect(Client client, URI uri) {
ClientSocket socket = new ClientSocket(uri);
client.setSocket(socket);

@ -1,6 +1,80 @@
# suppress inspection "UnusedProperty" for whole file
menu.main.play=Play
menu.main.quit=Close
menu.main.ok=OK
menu.instruction.nextPageButton=Next Page
menu.instruction.previousPageButton=Previous Page
menu.instruction.wizard=Wizard
menu.instruction.jester=Jester
menu.instruction.main=Instruction of the game
menu.instruction.main.text1=Welcome
menu.instruction.main.text2=On this page you will find the rules of the basic game and the scoring system.\n\
On the second page is an overview of the possible game variants \nand on the third an overview of the special cards.
menu.instruction.general=In General
menu.instruction.introduction1=Wizard is a trick game with the goal of predicting the exact number of self-winning tricks in each round.
menu.instruction.introduction2=For correct predictions each player gets points and in the end the player with the highest score wins.
menu.instruction.standardgameheading=Standard Game
menu.instruction.standardgame1=In the basis game there are 60 different cards.
menu.instruction.standardgame2=52 of these cards are distributed among the following four suits.
menu.instruction.standardgame3=The highest card is 13, the lowest card is 1.
menu.instruction.standardgame4=The 8 remaining cards are divided equally between Wizards and Jesters and have no suit.\n\
The four wizards have a higher value than all other cards and the four jesters have a lower value.
menu.instruction.standardgame5=For each round count: the number of rounds equals the number of cards per player equals and the number of tricks\n\
the cards are dealt virtually as the dealer one of the players.\n\
After the cards are dealt, a trump suit is determined. It corresponds to the suit of the card\n\
which is displayed in the bottom left corner of the game screen.\n\
A trump is any card of the trump suit and higher than all cards of the other suits.\n\
Important. If the card determining the trump is a jester, there is no trump in this round.\n\
If the trump card is a Wizard, the dealer chooses a trump suit.\n\
Once the trump suit is determined, each player states how many tricks they want to make in the round.\n\
Tip for newcomers: A good hand for many tricks has wizards, trump cards and high suit cards.\n
menu.instruction.standardgame6=The process of a trick
menu.instruction.standardgame7=The first card of a trick is played at the first trick by the dealer's virtual left neighbor.\n\
All further tricks are opened by the player who won the last trick.\n\
After that, all players play one card in clockwise order.\n\
To the suit of the first card must be added. This means that if a player has a suit of this card\n\
he must play it and must not play a card of any other suit.\n\
Exceptions to this are wizards and jesters. These cards may always be played!\n\
The trick is won by the player with the highest card.\nThe following descending rank for the highest card applies:\n\
+The first wizard in a trick\n\
+The highest trump card\n\
+The highest suit card of the played suit.
menu.instruction.standardgame8=Special cases
menu.instruction.standardgame9=If a player starts a trick with a wizard, the other players may play any\n\
cards, including any other Wizards or Jesters.\nThe trick goes to the first Wizard in any case.\n\n\
If a player opens a trick with a Jester, any cards may be played\n\
until an another player plays a wizard or a number card. If it is a number card,\n\
all further cards must be added to its suit.\n\
If it is a wizard, any cards may be played.\n\
In the rare case that only jesters are in the trick, the first jester wins.
menu.instruction.scoring=Scoring
menu.instruction.standardgame10=If the prediction is correct, 10 points are awarded for each trick made plus\n\
20 points as a basic amount.\nIf the prediction is wrong, -10 points are awarded for each deviating trick and the player\n\
does not receive any basic amount.\n\
The score is then offset against a player's previous score.
menu.instruction.special_card.title=Special cards
menu.instruction.variant.title=Variants of the game
menu.instruction.variant.intro=When creating a new game, the following 6 variants can be selected.
menu.instruction.variant.default=1) Default
menu.instruction.variant.default.description=The basic game with the basic rules.
menu.instruction.variant.defaultpm1=2) Default PM1
menu.instruction.variant.defaultpm1.description=The basic game with the additional condition that the prediction\n\
must not correspond to the number of rounds.\n\
This means: the tip of at least one player is wrong
menu.instruction.variant.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.anniversary2016pm1=4) Anniversary 2016 PM1
menu.instruction.variant.anniversary2016pm1.description=The basic game with the special cards of the anniversary edition 2016, with the\n\
additional condition that the prediction must not correspond to the number of rounds.
menu.instruction.variant.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.anniversary2021pm1=6) Anniversary 2021 PM1
menu.instruction.variant.anniversary2021pm1.description=The basic game with the special cards of the 2021 anniversary edition, with the\n\
additional condition that the prediction must not correspond to the number of rounds.
menu.connect.connect=Connect
menu.connect.back=Back

@ -1,6 +1,80 @@
# suppress inspection "UnusedProperty" for whole file
menu.main.play=Spiel beitreten
menu.main.quit=Verlassen
menu.main.ok=OK
menu.instruction.nextPageButton=Nächste Seite
menu.instruction.previousPageButton=Vorherige Seite
menu.instruction.wizard=Zauberer
menu.instruction.jester=Narr
menu.instruction.main=Spielanleitung
menu.instruction.main.text1=Willkommen
menu.instruction.main.text2=Auf dieser Seite findest du die Regeln des Grundspiels und zur Punktewertung.\n\
Auf der zweiten Seite befindet sich eine Übersicht über die möglichen Spielvarianten \nundauf der dritten eine Übersicht der Sonderkarten.
menu.instruction.general=Grundlegendes
menu.instruction.introduction1=Wizard ist ein Stichspiel mit dem Ziel in jeder Runde die genau Anzahl der selbstgewonnen\
Stiche vorherzusagen.
menu.instruction.introduction2=Für richtige Vorhersagen erhält jeder Spieler Punkte und am Ende gewinnt der Spieler mit\
der höchsten Punktzahl.
menu.instruction.standardgameheading=Grundspiel
menu.instruction.standardgame1=Im Grundspiel gibt es 60 Karten
menu.instruction.standardgame2=52 dieser Karten verteilen sich auf die folgenden vier Farben.
enu.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.
menu.instruction.standardgame5=Für jede Runde gilt: Rundenzahl gleich Anzahl der Karten pro Spieler gleich Anzahl der Stiche\n\
die Karten verteilt virtuell als Geber einer der Spieler.\n\n\
Nach dem Verteilen der Karten wird eine Trumpffarbe bestimmt. Sie entspricht der Farber der Karte\n\
Die im Spielbildschrim links unten angezeigt wird.\n\
Ein Trumpf ist jede Karte der Trumpffarbe und höher als alle Karten der anderen Farben.\n\
Wichtig! Ist die trumpfbestimmende Karte ein Narr gibt es in dieser Runde keinen Trumpf.\n\
Wichig!Ist die trumpbestimmende Karte ein Zauberer wählt der Kartengeber eine Trumpffarbe.\n\n\
Ist die Trumpfarbe bestimmt, sagt jeder Spieler an, wie viele Stiche er in der Runde machen will.\n\
Tipp für Neulinge: Ein gutes Blatt für viele Stiche hat Zauberer, Trumpfkarten und hohe Farbkarten.\n
menu.instruction.standardgame6=Der Ablauf eine Stichs
menu.instruction.standardgame7=Die erste Karte eines Stichs spielt beim ersten Stich der virtuelle linke Nachbar des Gebers.\n\
Alle weiteren Stiche eröffnet der Spieler, der den letzten Stich gewonnen hat.\n\
Danach spielen alle Mitspieler im Uhzeigersinn eine Karte\n\
Zur Farbe der ersten Karte muss zugegeben werden. Das bedeutet: Hat ein Spieler eine Farbe dieser Karte\n\
muss er diese spielen und darf keine Karte einer anderen Farbe spielen.\n\
Ausnahme hiervon sind Zauberer und Narren. Diese Karten dürfen immer gespielt werden!\n\n\
Den Stich gewinnt der Spieler mit der höchsten Karte.\nFolgende absteigende Wertigkeit für die höchste Karte gilt:\n\
+Der erste Zauberer in einem Stich\n\
+Die höchste Trumpfkarte\n\
+Die höchste Farbkarte der angespielten Farbe
menu.instruction.standardgame8=Besonderheiten
menu.instruction.standardgame9=Eröffnet ein Spieler einen Stich mit einem Zauberer, dürfen die Mitspieler beliebige\n\
Karten spielen, einschließlich weiterer Zauberer oder Narren.\nDer Stich geht in jedem Fall an den ersten Zauberer.\n\n\
Eröffnet ein Spieler einen Stich mit einem Narren, dürfen beliebige Karten gespielt werden,\n\
bis ein Lehrling einen Zauberer oder eine Zahlenkarte spielt. Handelt es sich um eine Zahlenkarte,\n\
muss zu ihrer Farbe zugegeben werden.\n\
Handelt es sich um einen Zauberer, dürfen beliebige Karten gespielt werden.\n\
Im seltenen Fall, dass nur Narren im Stich liegen, gewinnt der erste Narr.
menu.instruction.scoring=Punktewertung
menu.instruction.standardgame10=Bei einer richtigen Vorhersage gibt es pro gemachten Stich 10 Punkte\n\
sowie 20 Punkte als Grundbetrag.\nBei einer falschen Vorhersage gibt es pro abweichendem Stich -10 Punke und keinen Grundbetrag.\n\
Die Punktzahl wird anschließend mit dem bisherigen Punktestand eines Spielers verrechnet.
menu.instruction.variant.title=Spielvarianten
menu.instruction.variant.intro=Bei der Erstellung eines neuen Spiels können folgende 6 Varianten ausgewählt werden.
menu.instruction.variant.default=1) Default
menu.instruction.variant.default.description=Das Grundspiel mit den Grundregeln.
menu.instruction.variant.defaultpm1=2) Default PM1
menu.instruction.variant.defaultpm1.description=Das Grundspiel mit der Zusatzbedingung, dass die Vorhersage\nnicht der Rundenanzahl entsprechen darf.\n\
Das bedeutet: Der Tipp mindestens eines Spielers ist falsch.
menu.instruction.variant.anniversary2016=3) Anniversary 2016
menu.instruction.variant.anniversary2016.description=Das Grundspiel mit den Grundregeln und den Sonderkarten der Jubiläumsedition 2016.
menu.instruction.variant.anniversary2016pm1=4) Anniversary 2016 PM1
menu.instruction.variant.anniversary2016pm1.description=Das Grundspiel mit den Sonderkarten der Jubiläumsedition 2016, mit der\n\
Zusatzbedingung, dass die Vorhersage nicht der Rundenanzahl entsprechen darf.
menu.instruction.variant.anniversary2021=5) Anniversary 2021
menu.instruction.variant.anniversary2021.description=Das Grundspiel mit den Grundregeln und den Sonderkarten der Jubiläumsedition 2021.
menu.instruction.variant.anniversary2021pm1=6) Anniversary 2021 PM1
menu.instruction.variant.anniversary2021pm1.description=Das Grundspiel mit den Sonderkarten der Jubiläumsedition 2021, mit der\n\
Zusatzbedingung, dass die Vorhersage nicht der Rundenanzahl entsprechen darf.
menu.instruction.special_card.title=Sonderkarten
menu.connect.connect=Verbinden
menu.connect.back=Zurück

@ -17,6 +17,26 @@ public enum Card {
WEREWOLF;
public enum Suit {
NONE, YELLOW, RED, GREEN, BLUE
NONE,
YELLOW {
public String toString() {
return "Gelb";
}
},
RED {
public String toString() {
return "Rot";
}
},
GREEN {
public String toString() {
return "Grün";
}
},
BLUE {
public String toString() {
return "Blau";
}
}
}
}
Loading…
Cancel
Save