diff --git a/.idea/dictionaries/project.xml b/.idea/dictionaries/project.xml
index e638523..e6d7540 100644
--- a/.idea/dictionaries/project.xml
+++ b/.idea/dictionaries/project.xml
@@ -5,6 +5,7 @@
clid
dcompile
errorprone
+ español
flushnl
gaaf
gamelist
diff --git a/app/src/main/java/org/toop/app/GameInformation.java b/app/src/main/java/org/toop/app/GameInformation.java
index 5a17c8f..d8f8390 100644
--- a/app/src/main/java/org/toop/app/GameInformation.java
+++ b/app/src/main/java/org/toop/app/GameInformation.java
@@ -22,6 +22,17 @@ public class GameInformation {
public int getMaxDepth() {
return maxDepth;
}
+
+ public String getTypeToString() {
+ String name = this.name();
+ return switch (name) {
+ case "TICTACTOE" -> "TicTacToe";
+ case "REVERSI" -> "Reversi";
+ case "CONNECT4" -> "Connect4";
+ case "BATTLESHIP" -> "Battleship";
+ default -> name;
+ };
+ }
}
public static class Player {
diff --git a/app/src/main/java/org/toop/app/game/BaseGameThread.java b/app/src/main/java/org/toop/app/game/BaseGameThread.java
index f9178da..984672d 100644
--- a/app/src/main/java/org/toop/app/game/BaseGameThread.java
+++ b/app/src/main/java/org/toop/app/game/BaseGameThread.java
@@ -47,16 +47,17 @@ public abstract class BaseGameThread {
this.game = gameSupplier.get();
this.ai = aiSupplier.get();
- if (onForfeit == null || onExit == null) {
- primary = new GameView(null, () -> {
- isRunning.set(false);
- WidgetContainer.getCurrentView().transitionPrevious();
- }, null);
+ String type = information.type.getTypeToString();
+ if (onForfeit == null || onExit == null) {
+ primary = new GameView(null, () -> {
+ isRunning.set(false);
+ WidgetContainer.getCurrentView().transitionPrevious();
+ }, null, type);
} else {
primary = new GameView(onForfeit, () -> {
isRunning.set(false);
onExit.run();
- }, onMessage);
+ }, onMessage, type);
}
this.canvas = canvasFactory.apply(this::onCellClicked);
diff --git a/app/src/main/java/org/toop/app/game/Connect4Game.java b/app/src/main/java/org/toop/app/game/Connect4Game.java
index 8774fd7..186199f 100644
--- a/app/src/main/java/org/toop/app/game/Connect4Game.java
+++ b/app/src/main/java/org/toop/app/game/Connect4Game.java
@@ -5,9 +5,8 @@ import javafx.scene.paint.Color;
import org.toop.app.App;
import org.toop.app.GameInformation;
import org.toop.app.canvas.Connect4Canvas;
-import org.toop.app.view.ViewStack;
-import org.toop.app.view.views.GameView;
-import org.toop.app.view.views.LocalMultiplayerView;
+import org.toop.app.widget.view.GameView;
+import org.toop.app.widget.WidgetContainer;
import org.toop.framework.eventbus.EventFlow;
import org.toop.framework.networking.events.NetworkEvents;
import org.toop.game.Connect4.Connect4;
@@ -31,7 +30,7 @@ public class Connect4Game {
private final int columnSize = 7;
private final int rowSize = 6;
- private final GameView view;
+ private final GameView primary;
private final Connect4Canvas canvas;
private final AtomicBoolean isRunning;
@@ -49,15 +48,15 @@ public class Connect4Game {
isRunning = new AtomicBoolean(true);
if (onForfeit == null || onExit == null) {
- view = new GameView(null, () -> {
+ primary = new GameView(null, () -> {
isRunning.set(false);
- ViewStack.push(new LocalMultiplayerView(information));
- }, null);
+ WidgetContainer.getCurrentView().transitionPrevious();
+ }, null, "Connect4");
} else {
- view = new GameView(onForfeit, () -> {
+ primary = new GameView(onForfeit, () -> {
isRunning.set(false);
onExit.run();
- }, onMessage);
+ }, onMessage, "Connect4");
}
canvas = new Connect4Canvas(Color.GRAY,
@@ -82,8 +81,8 @@ public class Connect4Game {
}
});
- view.add(Pos.CENTER, canvas.getCanvas());
- ViewStack.push(view);
+ primary.add(Pos.CENTER, canvas.getCanvas());
+ WidgetContainer.getCurrentView().transitionNext(primary);
if (onForfeit == null || onExit == null) {
new Thread(this::localGameThread).start();
@@ -91,8 +90,7 @@ public class Connect4Game {
} else {
new EventFlow()
.listen(NetworkEvents.GameMoveResponse.class, this::onMoveResponse)
- .listen(NetworkEvents.YourTurnResponse.class, this::onYourTurnResponse)
- .listen(NetworkEvents.ReceivedMessage.class, this::onReceivedMessage);
+ .listen(NetworkEvents.YourTurnResponse.class, this::onYourTurnResponse);
setGameLabels(myTurn == 0);
}
@@ -108,7 +106,7 @@ public class Connect4Game {
final String currentValue = currentTurn == 0? "RED" : "BLUE";
final int nextTurn = (currentTurn + 1) % information.type.getPlayerCount();
- view.nextPlayer(information.players[currentTurn].isHuman,
+ primary.nextPlayer(information.players[currentTurn].isHuman,
information.players[currentTurn].name,
currentValue,
information.players[nextTurn].name);
@@ -158,9 +156,9 @@ public class Connect4Game {
*/
if (state != Game.State.NORMAL) {
if (state == Game.State.WIN) {
- view.gameOver(true, information.players[currentTurn].name);
+ primary.gameOver(true, information.players[currentTurn].name);
} else if (state == Game.State.DRAW) {
- view.gameOver(false, "");
+ primary.gameOver(false, "");
}
isRunning.set(false);
@@ -187,14 +185,14 @@ public class Connect4Game {
if (state != Game.State.NORMAL) {
if (state == Game.State.WIN) {
if (response.player().equalsIgnoreCase(information.players[0].name)) {
- view.gameOver(true, information.players[0].name);
+ primary.gameOver(true, information.players[0].name);
gameOver();
} else {
- view.gameOver(false, information.players[1].name);
+ primary.gameOver(false, information.players[1].name);
gameOver();
}
} else if (state == Game.State.DRAW) {
- view.gameOver(false, "");
+ primary.gameOver(false, "");
gameOver();
}
}
@@ -242,14 +240,6 @@ public class Connect4Game {
.postEvent();
}
- private void onReceivedMessage(NetworkEvents.ReceivedMessage msg) {
- if (!isRunning.get()) {
- return;
- }
-
- view.updateChat(msg.message());
- }
-
private void updateCanvas() {
canvas.clearAll();
@@ -266,7 +256,7 @@ public class Connect4Game {
final int currentTurn = game.getCurrentTurn();
final String currentValue = currentTurn == 0? "RED" : "BLUE";
- view.nextPlayer(isMe,
+ primary.nextPlayer(isMe,
information.players[isMe? 0 : 1].name,
currentValue,
information.players[isMe? 1 : 0].name);
diff --git a/app/src/main/java/org/toop/app/game/ReversiGame.java b/app/src/main/java/org/toop/app/game/ReversiGame.java
index 430cf63..8148edb 100644
--- a/app/src/main/java/org/toop/app/game/ReversiGame.java
+++ b/app/src/main/java/org/toop/app/game/ReversiGame.java
@@ -53,12 +53,12 @@ public final class ReversiGame {
primary = new GameView(null, () -> {
isRunning.set(false);
WidgetContainer.getCurrentView().transitionPrevious();
- }, null);
+ }, null, "Reversi");
} else {
primary = new GameView(onForfeit, () -> {
isRunning.set(false);
onExit.run();
- }, onMessage);
+ }, onMessage, "Reversi");
}
canvas = new ReversiCanvas(Color.BLACK,
diff --git a/app/src/main/java/org/toop/app/game/TicTacToeGame.java b/app/src/main/java/org/toop/app/game/TicTacToeGame.java
index 2c4fb1e..e4b6da8 100644
--- a/app/src/main/java/org/toop/app/game/TicTacToeGame.java
+++ b/app/src/main/java/org/toop/app/game/TicTacToeGame.java
@@ -50,12 +50,12 @@ public final class TicTacToeGame {
primary = new GameView(null, () -> {
isRunning.set(false);
WidgetContainer.getCurrentView().transitionPrevious();
- }, null);
+ }, null, "TicTacToe");
} else {
primary = new GameView(onForfeit, () -> {
isRunning.set(false);
onExit.run();
- }, onMessage);
+ }, onMessage, "TicTacToe");
}
canvas = new TicTacToeCanvas(Color.GRAY,
diff --git a/app/src/main/java/org/toop/app/widget/tutorial/Connect4TutorialWidget.java b/app/src/main/java/org/toop/app/widget/tutorial/Connect4TutorialWidget.java
new file mode 100644
index 0000000..1fdd4e3
--- /dev/null
+++ b/app/src/main/java/org/toop/app/widget/tutorial/Connect4TutorialWidget.java
@@ -0,0 +1,39 @@
+package org.toop.app.widget.tutorial;
+
+import javafx.geometry.Pos;
+import org.toop.app.widget.complex.ViewWidget;
+
+import java.io.File;
+
+public class Connect4TutorialWidget extends ViewWidget {
+ private TState state;
+ private String[] keys = {"connect4.1", "connect4.2"};
+ private File[] images = {new File("app/src/main/resources/assets/images/connect41.png"), new File("app/src/main/resources/assets/images/connect42.png")};
+ private BaseTutorialWidget tutorialWidget;
+
+ public Connect4TutorialWidget() {
+ this.state = new TState(keys.length);
+ tutorialWidget = new BaseTutorialWidget(
+ state,
+ keys[state.getCurrent()],
+ images[state.getCurrent()],
+ () -> {
+ if (state.hasPrevious()) {
+ state.previous();
+ update();
+ }
+ },
+ () -> {
+ if (state.hasNext()) {
+ state.next();
+ update();
+ }
+ }
+ );
+ add(Pos.CENTER, tutorialWidget);
+ }
+
+ private void update() {
+ tutorialWidget.update(keys[state.getCurrent()], images[state.getCurrent()]);
+ }
+}
diff --git a/app/src/main/java/org/toop/app/widget/tutorial/ReversiTutorialWidget.java b/app/src/main/java/org/toop/app/widget/tutorial/ReversiTutorialWidget.java
new file mode 100644
index 0000000..1ec990a
--- /dev/null
+++ b/app/src/main/java/org/toop/app/widget/tutorial/ReversiTutorialWidget.java
@@ -0,0 +1,39 @@
+package org.toop.app.widget.tutorial;
+
+import javafx.geometry.Pos;
+import org.toop.app.widget.complex.ViewWidget;
+
+import java.io.File;
+
+public class ReversiTutorialWidget extends ViewWidget {
+ private TState state;
+ private String[] keys = {"reversi1", "reversi2", "reversi3", "reversi4"};
+ private File[] images = {new File("app/src/main/resources/assets/images/reversi1.png"), new File("app/src/main/resources/assets/images/reversi2.png"), new File("app/src/main/resources/assets/images/cat.jpg"), new File("app/src/main/resources/assets/images/cat.jpg")};
+ private BaseTutorialWidget tutorialWidget;
+
+ public ReversiTutorialWidget() {
+ this.state = new TState(keys.length);
+ tutorialWidget = new BaseTutorialWidget(
+ state,
+ keys[state.getCurrent()],
+ images[state.getCurrent()],
+ () -> {
+ if (state.hasPrevious()) {
+ state.previous();
+ update();
+ }
+ },
+ () -> {
+ if (state.hasNext()) {
+ state.next();
+ update();
+ }
+ }
+ );
+ add(Pos.CENTER, tutorialWidget);
+ }
+
+ private void update() {
+ tutorialWidget.update(keys[state.getCurrent()], images[state.getCurrent()]);
+ }
+}
diff --git a/app/src/main/java/org/toop/app/widget/tutorial/TicTacToeTutorialWidget.java b/app/src/main/java/org/toop/app/widget/tutorial/TicTacToeTutorialWidget.java
index 60c1293..85355a4 100644
--- a/app/src/main/java/org/toop/app/widget/tutorial/TicTacToeTutorialWidget.java
+++ b/app/src/main/java/org/toop/app/widget/tutorial/TicTacToeTutorialWidget.java
@@ -15,7 +15,6 @@ public class TicTacToeTutorialWidget extends ViewWidget {
private BaseTutorialWidget tutorialWidget;
public TicTacToeTutorialWidget() {
- System.out.println("Hi, I got here!");
this.state = new TState(keys.length);
tutorialWidget = new BaseTutorialWidget(
state,
@@ -34,7 +33,6 @@ public class TicTacToeTutorialWidget extends ViewWidget {
}
}
);
- System.out.println("Hi, I got to the end!");
add(Pos.CENTER, tutorialWidget);
}
diff --git a/app/src/main/java/org/toop/app/widget/view/GameView.java b/app/src/main/java/org/toop/app/widget/view/GameView.java
index df1b411..334aa51 100644
--- a/app/src/main/java/org/toop/app/widget/view/GameView.java
+++ b/app/src/main/java/org/toop/app/widget/view/GameView.java
@@ -11,6 +11,10 @@ import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.text.Text;
+import org.toop.app.widget.tutorial.BaseTutorialWidget;
+import org.toop.app.widget.tutorial.Connect4TutorialWidget;
+import org.toop.app.widget.tutorial.ReversiTutorialWidget;
+import org.toop.app.widget.tutorial.TicTacToeTutorialWidget;
public final class GameView extends ViewWidget {
private final Text currentPlayerHeader;
@@ -18,10 +22,10 @@ public final class GameView extends ViewWidget {
private final Text nextPlayerHeader;
private final Button forfeitButton;
private final Button exitButton;
-
+ private final Button tutorialButton;
private final TextField chatInput;
- public GameView(Runnable onForfeit, Runnable onExit, Consumer onMessage) {
+ public GameView(Runnable onForfeit, Runnable onExit, Consumer onMessage, String gameType) {
currentPlayerHeader = Primitive.header("");
currentMoveHeader = Primitive.header("");
nextPlayerHeader = Primitive.header("");
@@ -47,6 +51,27 @@ public final class GameView extends ViewWidget {
chatInput = null;
}
+ switch(gameType) {
+ case "TicTacToe":
+ this.tutorialButton = Primitive.button("tutorialstring", () -> {
+ transitionNext(new TicTacToeTutorialWidget());
+ });
+ break;
+ case "Reversi":
+ this.tutorialButton = Primitive.button("tutorialstring", () -> {
+ transitionNext(new ReversiTutorialWidget());
+ });
+ break;
+ case "Connect4":
+ this.tutorialButton = Primitive.button("tutorialstring", () -> {
+ transitionNext(new Connect4TutorialWidget());
+ });
+ break;
+ default:
+ this.tutorialButton = null;
+ break;
+ }
+
setupLayout();
}
@@ -73,6 +98,10 @@ public final class GameView extends ViewWidget {
if (chatInput != null) {
add(Pos.BOTTOM_RIGHT, Primitive.vbox(chatInput));
}
+
+ if (tutorialButton != null) {
+ add(Pos.TOP_LEFT, tutorialButton);
+ }
}
public void nextPlayer(boolean isMe, String currentPlayer, String currentMove, String nextPlayer) {
diff --git a/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java b/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java
index de5c9fd..5cab8b7 100644
--- a/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java
+++ b/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java
@@ -11,6 +11,8 @@ import org.toop.app.widget.complex.PlayerInfoWidget;
import org.toop.app.widget.complex.ViewWidget;
import org.toop.app.widget.popup.ErrorPopup;
import org.toop.app.widget.tutorial.BaseTutorialWidget;
+import org.toop.app.widget.tutorial.Connect4TutorialWidget;
+import org.toop.app.widget.tutorial.ReversiTutorialWidget;
import org.toop.app.widget.tutorial.TicTacToeTutorialWidget;
import org.toop.local.AppContext;
@@ -37,8 +39,6 @@ public class LocalMultiplayerView extends ViewWidget {
switch (information.type) {
case TICTACTOE:
- System.out.println(AppSettings.getSettings().getTutorialFlag());
- System.out.println(AppSettings.getSettings().getFirstTTT());
if (AppSettings.getSettings().getTutorialFlag() && AppSettings.getSettings().getFirstTTT()) {
BaseTutorialWidget a = new BaseTutorialWidget(
"tutorial",
@@ -49,11 +49,10 @@ public class LocalMultiplayerView extends ViewWidget {
});
},
() -> {
- Platform.runLater(() -> {
ViewWidget c = new TicTacToeTutorialWidget();
transitionNext(c);
WidgetContainer.setCurrentView(c);
- });
+ AppSettings.getSettings().setFirstTTT(false);
},
() -> {
AppSettings.getSettings().setTutorialFlag(false);
@@ -67,11 +66,65 @@ public class LocalMultiplayerView extends ViewWidget {
}
new TicTacToeGameThread(information);
break;
- case REVERSI: new ReversiGame(information);
- case CONNECT4: new Connect4Game(information);
+ case REVERSI:
+ if (AppSettings.getSettings().getTutorialFlag() && AppSettings.getSettings().getFirstReversi()) {
+ BaseTutorialWidget a = new BaseTutorialWidget(
+ "tutorial",
+ () -> { Platform.runLater(() -> {
+ AppSettings.getSettings().setFirstReversi(false);
+ new ReversiGame(information);
+ });
+ },
+ () -> {
+ Platform.runLater(() -> {
+ ViewWidget c = new ReversiTutorialWidget();
+ transitionNext(c);
+ WidgetContainer.setCurrentView(c);
+ AppSettings.getSettings().setFirstReversi(false);
+ });
+ },
+ () -> {
+ Platform.runLater(() -> {
+ AppSettings.getSettings().setTutorialFlag(false);
+ new ReversiGame(information);
+ });
+ });
+ transitionNext(a);
+ break;
+ }
+ new ReversiGame(information);
+ break;
+ case CONNECT4:
+ if (AppSettings.getSettings().getTutorialFlag() && AppSettings.getSettings().getFirstConnect4()) {
+ BaseTutorialWidget a = new BaseTutorialWidget(
+ "tutorial",
+ () -> { Platform.runLater(() -> {
+ AppSettings.getSettings().setFirstConnect4(false);
+ new Connect4Game(information);
+ });
+ },
+ () -> {
+ Platform.runLater(() -> {
+ ViewWidget c = new Connect4TutorialWidget();
+ transitionNext(c);
+ WidgetContainer.setCurrentView(c);
+ AppSettings.getSettings().setFirstConnect4(false);
+ });
+ },
+ () -> {
+ Platform.runLater(() -> {
+ AppSettings.getSettings().setTutorialFlag(false);
+ new Connect4Game(information);
+ });
+ });
+ transitionNext(a);
+ break;
+ }
+ new Connect4Game(information);
+ break;
+ }
// case BATTLESHIP -> new BattleshipGame(information);
- }
- });
+ });
var playerSection = setupPlayerSections();
diff --git a/app/src/main/java/org/toop/local/AppSettings.java b/app/src/main/java/org/toop/local/AppSettings.java
index 7a49fdf..375b0a3 100644
--- a/app/src/main/java/org/toop/local/AppSettings.java
+++ b/app/src/main/java/org/toop/local/AppSettings.java
@@ -21,7 +21,7 @@ public class AppSettings {
settingsAsset.load();
}
- doDefaultSettings();
+ checkSettings();
Settings settingsData = settingsAsset.getContent();
diff --git a/app/src/main/resources/assets/images/connect41.png b/app/src/main/resources/assets/images/connect41.png
new file mode 100644
index 0000000..282ac20
Binary files /dev/null and b/app/src/main/resources/assets/images/connect41.png differ
diff --git a/app/src/main/resources/assets/images/connect42.png b/app/src/main/resources/assets/images/connect42.png
new file mode 100644
index 0000000..6a01f03
Binary files /dev/null and b/app/src/main/resources/assets/images/connect42.png differ
diff --git a/app/src/main/resources/assets/images/reversi1.png b/app/src/main/resources/assets/images/reversi1.png
new file mode 100644
index 0000000..a99da40
Binary files /dev/null and b/app/src/main/resources/assets/images/reversi1.png differ
diff --git a/app/src/main/resources/assets/images/reversi2.png b/app/src/main/resources/assets/images/reversi2.png
new file mode 100644
index 0000000..9a823bb
Binary files /dev/null and b/app/src/main/resources/assets/images/reversi2.png differ
diff --git a/app/src/main/resources/assets/localization/localization_ar.properties b/app/src/main/resources/assets/localization/localization_ar.properties
index bd29908..39a02fb 100644
--- a/app/src/main/resources/assets/localization/localization_ar.properties
+++ b/app/src/main/resources/assets/localization/localization_ar.properties
@@ -5,6 +5,7 @@ are-you-sure=\u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f?
back=\u0627\u0644\u0631\u062c\u0648\u0639
cancel=\u0625\u0644\u063a\u0627\u0621
challenge=\u062a\u062d\u062f\u064a
+connect4=Connect 4
computer-difficulty=\u0635\u0639\u0648\u0628 \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631
computer-think-time=\u0648\u0642\u062a \u062a\u0641\u0643\u064a\u0631 \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631
computer=\u0643\u0645\u0628\u064a\u0648\u062a\u0631
@@ -75,6 +76,13 @@ you-were-challenged-by=\u062a\u062d\u062f\u064a\u062a \u0645\u0646
you-win=\u0623\u0646\u062a \u062a\u0641\u0648\u0632
>=>
<=<
+connect4.1=\u0645\u0631\u062d\u0628\u0627 \u0628\u0643 \u0641\u064a \u0644\u0639\u0628\u0629 Connect 4! \u064a\u0645\u0643\u0646\u0643 \u062a\u0633\u0645\u064a\u0629 \u0627\u0644\u0644\u0639\u0628 \u0645\u0646 \u0637\u0631\u0641 \u0645\u0646 \u0627\u0644\u0639\u0645\u0648\u062f\u0627\u062a. \u0633\u064a\u062a\u0645 \u0648\u0636\u0639 \u0627\u0644\u0644\u062d\u0629 \u0627\u0644\u0623\u0642\u0644 \u0641\u064a \u062a\u0644\u0643 \u0627\u0644\u0639\u0645\u0648\u062f\u0629 \u0627\u0644\u0645\u0644\u0623\u0629 \u0627\u0644\u062a\u064a \u0644\u064a\u0633\u062a\u0645\u0644\u0623 \u0627\u0644\u0645\u0644\u0623\u0629.
+connect4.2=\u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u0641\u0648\u0632 \u0628\u0647\u0632\u0645 \u0623\u0631\u062c\u0639 \u0645\u0646 \u0627\u0644\u0642\u0637\u0639 \u0627\u0644\u0641\u064a \u0627\u0644\u0623\u0641\u0642 \u0623\u0648 \u0627\u0644\u0645\u064a\u0646 \u0623\u0648 \u0623\u0641\u0642 \u0639\u0644\u0649 \u0627\u0644\u0645\u0644\u0623\u0629!
+reversi1=\u0645\u0631\u062d\u0628\u0627 \u0628\u0643 \u0641\u064a \u0644\u0639\u0628\u0629 Reversi! \u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u0644\u0639\u0628 \u0628\u0627\u0644\u0646\u0642\u0631 \u0639\u0644\u0649 \u0623\u064a \u0646\u0642\u0637\u0629 \u0645\u0634\u0631\u0641\u0629.
+reversi2=\u0639\u0646\u062f\u0645\u0627 \u062a\u0646\u0642\u0631 \u0639\u0644\u0649 \u0646\u0642\u0637\u0629 \u0633\u064a\u062a\u063a\u064a\u0631 \u062c\u0645\u064a\u0639 \u0627\u0644\u0644\u0648\u0639\u0627\u0628 \u0628\u064a\u0646 \u0645\u0643\u0627\u0646 \u062a\u0636\u0639 \u0627\u0644\u0646\u0642\u0637\u0629 \u0648\u0646\u0642\u0637\u0629 \u0627\u0644\u0644\u0648\u0639 \u0627\u0644\u062a\u0627\u0644\u064a \u0627\u0644\u0645\u0648\u062c\u0648\u062f.
+reversi3=\u0645\u0631\u062a\u0643 \u0642\u062f \u064a\u062a\u063a\u0627\u0637 \u0625\u0630\u0627 \u0644\u0645 \u064a\u0643\u0646 \u0647\u0646\u0627\u0643 \u062d\u0631\u0643 \u0642\u0627\u0646\u0648\u0646\u064a.
+reversi4=\u0627\u0644\u0644\u0627\u0639\u0628 \u0627\u0644\u0630\u064a \u064a\u0641\u0648\u0632 \u0641\u064a \u0646\u0647\u0627\u064a\u0629 \u0627\u0644\u0644\u0639\u0628 \u0647\u0648 \u0627\u0644\u0630\u064a \u064a\u0643\u0648\u0646 \u0644\u062f\u064a\u0647 \u0627\u0644\u0623\u0643\u062b\u0631 \u0645\u0646 \u0627\u0644\u0644\u0648\u0639\u0627\u0628 \u0639\u0644\u0649 \u0627\u0644\u0644\u0648\u062d\u0629.
+tutorialstring=\u0627\u0644\u062f\u0631\u0633 \u0627\u0644\u062a\u0648\u0636\u064a\u062d\u064a
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
chinese=\u4e2d\u6587 (\u0627\u0644\u0635\u064a\u0646\u064a\u0629)
diff --git a/app/src/main/resources/assets/localization/localization_de.properties b/app/src/main/resources/assets/localization/localization_de.properties
index 16e24cd..186cd76 100644
--- a/app/src/main/resources/assets/localization/localization_de.properties
+++ b/app/src/main/resources/assets/localization/localization_de.properties
@@ -9,6 +9,8 @@ computer-difficulty=Computer Schwierigkeit
computer-think-time=Computer Denkzeit
computer=Computer
connect=Verbinden
+connect4=Connect 4
+
credits=Credits
dark=Dunkel
deny=Ablehnen
@@ -76,6 +78,13 @@ you-were-challenged-by=Sie wurden herausgefordert von ...
you-win=Sie gewinnen
>=>
<=<
+connect4.1=Willkommen beim Spiel Connect 4! Du kannst einen Zug machen, indem du auf eine der Spalten klickst. Der Zug wird in der niedrigsten noch freien Reihe dieser Spalte platziert.
+connect4.2=Du kannst gewinnen, indem du 4 Spielsteine deiner Farbe horizontal, diagonal oder vertikal verbindest! Siehe das obige Beispiel.
+reversi1=Willkommen beim Spiel Reversi! Du kannst einen Zug machen, indem du auf einen der leicht transparenten Punkte klickst.
+reversi2=Wenn du auf einen Punkt klickst, werden alle Spielsteine dazwischen umgedreht, bis zum nächsten Punkt. Siehe das Beispiel oben, wo Gelb die zu drehenden Steine ist.
+reversi3=Dein Zug kann übersprungen werden, wenn es keinen legalen Zug gibt. Dein Gegner spielt dann weiter, bis du einen legalen Zug machen kannst.
+reversi4=Der Spieler, der am Ende die meisten Steine auf dem Brett hat, gewinnt.
+tutorialstring=Tutorial
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (Arabisch)
chinese=\u4e2d\u6587 (Chinesisch)
diff --git a/app/src/main/resources/assets/localization/localization_en.properties b/app/src/main/resources/assets/localization/localization_en.properties
index d19f27e..d0e20b0 100644
--- a/app/src/main/resources/assets/localization/localization_en.properties
+++ b/app/src/main/resources/assets/localization/localization_en.properties
@@ -42,7 +42,7 @@ moral-support=Moral Support
music-volume=Music Volume
name=Name
no=No
-never=No, I never wanna see any tutorials
+never=No, I never want to see any tutorials
ok=Ok
online=Online
opengl=OpenGL
@@ -76,6 +76,15 @@ you-were-challenged-by=You were challenged by
you-win=You win
>=>
<=<
+// tutorial
+connect4.1=Welcome to the game of Connect 4! You can make a move by clicking one of the columns. The move will be placed in the lowest row of that column that is not filled yet.
+connect4.2=You can win by getting 4 pieces of your row horizontally, diagonally or vertically! For an example, see above.
+reversi1=Welcome to the game of Reversi! You can make a move by clicking on one of the slightly transparent dots.
+reversi2=Clicking on a dot will flip all the moves between where you place the dot and the next dot it finds. See the example above, where yellow is the moves to be flipped.
+reversi3=Your turn may be skipped if there is no legal move. This will let your opponent play again until you get an opportunity at a legal move.
+reversi4=The player who wins at the end of the game is the one who has the most pieces on the board.
+tutorialstring=Tutorial
+
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (Arabic)
chinese=\u4e2d\u6587 (Chinese)
diff --git a/app/src/main/resources/assets/localization/localization_es.properties b/app/src/main/resources/assets/localization/localization_es.properties
index 0407d27..4db0b7d 100644
--- a/app/src/main/resources/assets/localization/localization_es.properties
+++ b/app/src/main/resources/assets/localization/localization_es.properties
@@ -9,6 +9,8 @@ computer-difficulty=Dificultad del ordenador
computer-think-time=Tiempo de pensamiento del ordenador
computer=Ordenador
connect=Conectar
+connect4=Connect 4
+
credits=Cr\u00e9ditos
dark=Oscuro
deny=Denegar
@@ -75,6 +77,14 @@ you-were-challenged-by=Fuiste desafiado por
you-win=Ganaste
>=>
<=<
+connect4.1=\u00a1Bienvenido al juego de Connect 4! Puedes hacer un movimiento haciendo clic en una de las columnas. El movimiento se colocará en la fila más baja de esa columna que no esté llena.
+connect4.2=\u00a1Puedes ganar consiguiendo 4 fichas de tu color horizontal, diagonal o verticalmente! Mira el ejemplo de arriba.
+reversi1=\u00a1Bienvenido al juego de Reversi! Puedes hacer un movimiento haciendo clic en uno de los puntos ligeramente transparentes.
+reversi2=Al hacer clic en un punto, se voltearán todas las fichas entre donde colocas el punto y el siguiente punto que encuentre. Mira el ejemplo de arriba, donde amarillo son las fichas a voltear.
+reversi3=Tu turno puede ser saltado si no hay un movimiento legal. Esto permitirá que tu oponente juegue nuevamente hasta que tengas una oportunidad legal.
+reversi4=El jugador que gane al final del juego es quien tenga más fichas en el tablero.
+tutorialstring=Tutorial
+
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (Ar\u00e1bigo)
chinese=\u4e2d\u6587 (Chino)
diff --git a/app/src/main/resources/assets/localization/localization_fr.properties b/app/src/main/resources/assets/localization/localization_fr.properties
index 91a7f21..eda968e 100644
--- a/app/src/main/resources/assets/localization/localization_fr.properties
+++ b/app/src/main/resources/assets/localization/localization_fr.properties
@@ -9,6 +9,8 @@ computer-difficulty=Difficult\u00e9 de l'ordinateur
computer-think-time=Temps de r\u00e9flexion de l'ordinateur
computer=Ordinateur
connect=Connexion
+connect4=Connect 4
+
credits=Cr\u00e9dits
dark=Sombre
deny=Refuser
@@ -75,6 +77,13 @@ you-were-challenged-by=Vous avez \u00e9t\u00e9 d\u00e9fi\u00e9 par
you-win=Vous avez gagn\u00e9
>=>
<=<
+connect4.1=Bienvenue dans le jeu Connect 4 ! Vous pouvez effectuer un mouvement en cliquant sur l'une des colonnes. Le mouvement sera placé dans la ligne la plus basse de cette colonne qui n'est pas encore remplie.
+connect4.2=Vous pouvez gagner en alignant 4 pions de votre couleur horizontalement, diagonalement ou verticalement ! Voir l'exemple ci-dessus.
+reversi1=Bienvenue dans le jeu Reversi ! Vous pouvez jouer en cliquant sur l'un des points légčrement transparents.
+reversi2=Cliquer sur un point retournera tous les pions entre le point placé et le prochain point trouvé. Voir l'exemple ci-dessus, oů le jaune indique les pions ŕ retourner.
+reversi3=Votre tour peut ętre sauté s'il n'y a pas de coup légal. Cela permettra ŕ votre adversaire de jouer jusqu'ŕ ce que vous ayez un coup légal.
+reversi4=Le joueur qui a le plus de pions ŕ la fin du jeu gagne.
+tutorialstring=Tutoriel
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (Arabe)
chinese=\u4e2d\u6587 (Chinois)
diff --git a/app/src/main/resources/assets/localization/localization_hi.properties b/app/src/main/resources/assets/localization/localization_hi.properties
index 559c5ae..15990f9 100644
--- a/app/src/main/resources/assets/localization/localization_hi.properties
+++ b/app/src/main/resources/assets/localization/localization_hi.properties
@@ -9,6 +9,8 @@ computer-difficulty=\u0915\u0902\u092a\u094d\u092f\u0942\u091f\u0930 \u0915\u094
computer-think-time=\u0915\u0902\u092a\u094d\u092f\u0942\u091f\u0930 \u091a\u093f\u0902\u0924\u0928 \u0938\u092e\u092f
computer=\u0915\u0902\u092a\u094d\u092f\u0942\u091f\u0930
connect=\u091c\u094b\u095c\u0947\u0902
+connect4=Connect 4
+
credits=\u0915\u094d\u0930\u0947\u0921\u093f\u091f\u094d\u0938
dark=\u0917\u0939\u0930\u093e
deny=\u0907\u0902\u0915\u093e\u0930
@@ -75,6 +77,13 @@ you-were-challenged-by=\u0906\u092a\u0915\u094b \u091a\u0941\u0928\u094c\u0924\u
you-win=\u0906\u092a \u091c\u0940\u0924 \u0917\u090f
>=>
<=<
+connect4.1=\u0915\u0928\u094d\u0928\u0947 \u0915\u0940 \u091c\u0948 \u0915\u0947 \u091c\u094c\u0915 \u0915\u0928\u0947\u0915\u094d\u091f 4 \u092e\u0947\u0902! \u0906\u092a \u0915\u0940 \u091a\u0948\u0928 \u092a\u0932\u0938 \u092a\u0928\u094d\u0928 \u0928\u093e\u092e\u094d\u092c\u0921\u093e\u0928\u0947 \u0915\u0940 \u092f\u094b\u0917\u0924\u0940 \u092e\u0947\u0902 \u0915\u0940 \u0928\u093f\u091a\u094d\u091a\u0942\u0928 \u0915\u0940 \u0924\u0939 \u091a\u093f\u0928 \u092a\u0924\u093f \u0928\u0939\u0940\u0902 \u0926\u0947 \u092c\u0924\u0940.
+connect4.2=\u092a\u093e\u0902\u091a \u092e\u0946\u092c\u0921 \u0915\u0940 \u092a\u0930\u092a\u0930\u092f\u094d\u0928 \u092d\u093e\u0935\u0940 \u0938\u0947 4 \u092a\u093f\u0938 \u0924\u093e\u0924\u093e \u0915\u0940 \u0930\u094f\u0936\u0942 \u0938\u0940\u0926\u094d\u0927 \u092e\u0947\u0902 \u092a\u0940\u0928\u094d\u0928\u094b\u0902 \u0915\u0940 \u092e\u093e\u0928\u094d\u0926\u0930 \u0939\u0940.
+reversi1=\u0915\u0928\u094d\u0928\u0947 \u0915\u0940 \u091c\u0948 \u0910 \u0930\u0947\u0935\u0930\u094d\u0938\u0940 \u092e\u0947\u0902 \u0926\u0948\u091a \u092c\u0922\u093e\u0928 \u0915\u0940 \u092a\u0924\u094d\u0928 \u092a\u0930 \u092a\u094d\u0932\u0947 \u0916\u0942\u0928\u0947 \u0915\u0940 \u092a\u094d\u0930\u092f\u0948\u0915\u0944 \u0915\u0930\u0948\u0902.
+reversi2=\u0915\u093f\u0938 \u092a\u0930 \u092a\u093f\u0938 \u092a\u0948\u0918 \u0915\u0940 \u091a\u0928 \u092e\u0947\u0902 \u0938\u092e\u093e\u0930\u094e \u092a\u093f\u0938 \u092a\u0940\u0918 \u092e\u0947\u0902 \u092a\u0930\u093f\u0923\u0924 \u0915\u093e \u092a\u0930\u093f\u0928\u0942\u0924\u0940 \u0915\u0940 \u092a\u094d\u0930\u0924\u093f \u092a\u0941\u0928\u0940 \u092a\u0930\u093f\u0928\u094d\u0924 \u0915\u0940 \u092a\u0940\u0938 \u092a\u0930\u094d\u092f\u0928\u0947 \u091c\u093e\u0902\u0918\u0942.
+reversi3=\u092f\u0939 \u092a\u0930\u094d\u092f \u0938\u0947 \u0938\u0947\u091a \u0915\u0940 \u091c\u093e\u0902\u091c \u0928\u0939\u0940\u0902 \u0939\u0948 \u0914\u0938\u0924\u0947 \u0915\u0948 \u092a\u0948\u0928 \u092a\u0930\u094d\u092f \u0939\u0948 \u0914\u092a\u0915\u0940 \u0915\u0940 \u092a\u0932\u0947 \u092d\u0942\u0924 \u0915\u0940 \u0906\u0927\u093e \u092a\u0948\u0928 \u091c\u093e\u0902\u091c \u0915\u0930 \u0938\u0915\u0924\u0947 \u0939\u0948\u0902.
+reversi4=\u0916\u0941\u092f \u0915\u093f \u0915\u0940 \u0928\u093f\u092e\u0940 \u092e\u0947\u0902 \u091a\u093e\u0932 \u0938\u092c\u0938\u0947 \u091a\u0942\u0928\u094d\u0928\u0947 \u0939\u0948, \u0935\u0949 \u0915\u0947 \u092e\u093e\u0924\u094d\u0930 \u091c\u0940\u0924\u0947 \u0939\u0948.
+tutorialstring=\u0924\u0942\u091f\u0949\u0930\u093f\u092f\u0932
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (\u0905\u0930\u092c\u0940)
chinese=\u4e2d\u6587 (\u091a\u0940\u0928\u0940)
diff --git a/app/src/main/resources/assets/localization/localization_it.properties b/app/src/main/resources/assets/localization/localization_it.properties
index a50ffe8..ee85d99 100644
--- a/app/src/main/resources/assets/localization/localization_it.properties
+++ b/app/src/main/resources/assets/localization/localization_it.properties
@@ -9,6 +9,7 @@ computer-difficulty=Difficolt\u00e0 del computer
computer-think-time=Tempo di riflessione del computer
computer=Computer
connect=Connetti
+connect4=Connect 4
credits=Crediti
dark=Scuro
deny=Nega
@@ -75,6 +76,13 @@ you-were-challenged-by=Sei stato sfidato da
you-win=Hai vinto
>=>
<=<
+connect4.1=Benvenuto nel gioco Connect 4! Puoi fare una mossa cliccando su una delle colonne. La mossa sarŕ posizionata nella riga piů bassa di quella colonna che non č ancora piena.
+connect4.2=Puoi vincere ottenendo 4 pedine del tuo colore in orizzontale, diagonale o verticale! Guarda l'esempio sopra.
+reversi1=Benvenuto nel gioco Reversi! Puoi fare una mossa cliccando su uno dei punti leggermente trasparenti.
+reversi2=Cliccando su un punto, tutti i pezzi tra dove metti il punto e il prossimo punto trovato verranno girati. Guarda l'esempio sopra, dove il giallo indica i pezzi da girare.
+reversi3=Il tuo turno puň essere saltato se non ci sono mosse legali. Questo permetterŕ al tuo avversario di giocare fino a quando non avrai un'opportunitŕ legale.
+reversi4=Il giocatore che alla fine del gioco ha piů pezzi sulla scacchiera vince.
+tutorialstring=Tutorial
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (Arabo)
chinese=\u4e2d\u6587 (Cinese)
diff --git a/app/src/main/resources/assets/localization/localization_ja.properties b/app/src/main/resources/assets/localization/localization_ja.properties
index 560875c..acb03c9 100644
--- a/app/src/main/resources/assets/localization/localization_ja.properties
+++ b/app/src/main/resources/assets/localization/localization_ja.properties
@@ -9,6 +9,7 @@ computer-difficulty=\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u306e\u96e3\u6613\u5ea6
computer-think-time=\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u306e\u601d\u8003\u6642\u9593
computer=\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf
connect=\u63a5\u7d9a
+connect4=Connect 4
credits=\u30af\u30ec\u30b8\u30c3\u30c8
dark=\u30c0\u30fc\u30af
deny=\u62d2\u5426
@@ -75,6 +76,13 @@ you-were-challenged-by=\u3042\u306a\u305f\u306f ... \u304b\u3089\u6311\u6226\u30
you-win=\u52dd\u5229\u3067\u3059
>=>
<=<
+connect4.1=\u30b3\u30cd\u30af\u30c84\u306e\u30b2\u30fc\u30e0\u3078\u3088\u3046\u3053\u305d! \u30ab\u30e9\u30e0\u306e\u4e0a\u306e\u30ab\u30e9\u30e0\u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u52d5\u304b\u3057\u3092\u884c\u3048\u307e\u3059\u3002\u52d5\u304b\u3057\u306f\u3001\u3060\u307e\u308a\u306f\u307e\u3067\u5869\u3067\u306a\u3044\u884c\u306b\u8a2d\u7f6e\u3055\u308c\u307e\u3059\u3002
+connect4.2=\u6a2a\u7dda\u3001\u65b9\u5411\u306e\u307f\u3082\u306a\u3057\u3067\u30014\u3064\u306e\u8ca0\u3051\u3092\u7d50\u5408\u3055\u305b\u308b\u3068\u52dd\u3061\u307e\u3059! \u4e0a\u306e\u4f8b\u3092\u898b\u3066\u304f\u3060\u3055\u3044\u3002
+reversi1=\u30ea\u30d0\u30fc\u30b7\u30fb\u30b2\u30fc\u30e0\u3078\u3088\u3046\u3053\u305d! \u30ab\u30e9\u30e0\u306e\u30b9\u30dd\u30c3\u30c8\u30c9\u30c3\u30c8\u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u52d5\u304b\u3057\u306e\u30d7\u30ec\u30a4\u304c\u3067\u304d\u307e\u3059\u3002
+reversi2=\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u3001\u3064\u306a\u304c\u308a\u3092\u542b\u3081\u305f\u8ca0\u3051\u304c\u307e\u3067\u306e\u8ca0\u3051\u304c\u5909\u308f\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002
+reversi3=\u6b21\u306e\u52d5\u304b\u3057\u304c\u306a\u3044\u5834\u5408\u3001\u8a8d\u5b9a\u3055\u308c\u305f\u52d5\u304b\u3057\u306e\u6642\u9593\u306f\u62d2\u7d76\u3055\u308c\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002
+reversi4=\u672c\u6b21\u306b\u30dc\u30fc\u30c9\u4e0a\u3067\u6700\u591a\u306e\u8ca0\u3051\u3092\u6301\u3064\u30d7\u30ec\u30a4\u30e4\u30fc\u304c\u52dd\u3061\u307e\u3059\u3002
+tutorialstring=\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (\u30a2\u30e9\u30d3\u30a2\u8a9e)
chinese=\u4e2d\u6587 (\u4e2d\u6587)
diff --git a/app/src/main/resources/assets/localization/localization_ko.properties b/app/src/main/resources/assets/localization/localization_ko.properties
index 4768c9d..d84d236 100644
--- a/app/src/main/resources/assets/localization/localization_ko.properties
+++ b/app/src/main/resources/assets/localization/localization_ko.properties
@@ -9,6 +9,7 @@ computer-difficulty=\uCEF4\uD4E8\uD130 \uC5B4\uB9AC\uAE30
computer-think-time=\uCEF4\uD4E8\uD130 \uC0DD\uAC01 \uC2DC\uAC04
computer=\uCEF4\uD4E8\uD130
connect=\uC5F0\uACB0
+connect4=Connect 4
credits=\uD06C\uB808\uB527
dark=\uC5B4\uB460
deny=\uAC70\uBD80
@@ -75,6 +76,13 @@ you-were-challenged-by=... \uB85C\uBD80\uD130 \uCC38\uC5EC \uC694\uCCAD\uC744 \u
you-win=\uC774\uACBC\uC2B5\uB2C8\uB2E4
>=>
<=<
+connect4.1=Connect 4 \uacbd\uc6b0\uc5d0 \uc81c\uc2dc\ud569\ub2c8\ub2e4! \ud648\ub825\uc744 \ub2e4\ub978 \uc0c1\uc704\ub85c \ud074\ub9ad\ud558\uc2dc\uba70 \ub2e4\uc74c \uc815\uc758 \ud648\ub825\uc744 \ub610\ub294 \uc704\ub85c \uc0ac\uc6a9\ud558\uc2dc\uba70 \ud648\ub825\uc744 \uc124\uc815\ud569\ub2c8\ub2e4.
+connect4.2=\uc0ac\uc6a9\uc790\uc758 \ud648\uc744 \uc54c\ub824 \ud574\uc8fc\uba70 \ud574\ub2f9 \ud648\uc758 4\uae38\uc744 \ud574\uc8fc\uba70 \ud655\uc9c0, \ub354\ub7ec \ubc29\uacfc \ub610\ub294 \uc0ac\uc6a9\uc790 \ud648\uc758 \uc5f4\ub9b0 \ucd5c\ub300 \ubc29\ud574\uc5d0 \uc5c6\uc74c\uc774\ub2e4!
+reversi1=Reversi \uacbd\uc6b0\uc5d0 \uc81c\uc2dc\ud569\ub2c8\ub2e4! \ub2e4\ub978 \ud615\uc2dd\uc758 \ud648\uc744 \ud074\ub9ad\ud558\uc2dc\uba70 \ub2e4\uc74c \uc815\uc758 \ud648\uc744 \uc124\uc815\ud569\ub2c8\ub2e4.
+reversi2=\ud074\ub9ad \ud558\uba70, \ub2e4\ub978 \ud648 \uc704\ub85c \ucd5c\uc2e0 \ubc1b\ub294 \ud648\uc5d0 \ub300\ud574 \ub2e4\uc774\ubc84\ub77c\uc758 \ud648\uc744 \ubcc0\uacbd\ud569\ub2c8\ub2e4.
+reversi3=\uc0ac\uc6a9\uc790\uc758 \ud648\uc744 \ud074 \uc218 \uc5c6\uc2b5\uc2b5\ub2c8\ub2e4. \uc0ac\uc6a9\uc790 \ub2f5\uc5d0 \ub300\ud574 \uc811\ub2c8\ub2e4.
+reversi4=\uacbd\uc6b0 \uc5d0\uc11c \ucd5c\ub300 \ud648\uc744 \uac00\uc838\ub294 \uc0ac\uc6a9\uc790\uc774 \uc52c\uc544\uc624\uba70 \uc0ac\uc6a9\uc790\uc758 \ud648\uc744 \uc54c\ub824\ud569\ub2c8\ub2e4.
+tutorialstring=\ud14c\ud2b8\ub9ad
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (\u0639\u0631\u0628\u064a\u0629)
chinese=\u4e2d\u6587 (\u4e2d\u6587)
diff --git a/app/src/main/resources/assets/localization/localization_nl.properties b/app/src/main/resources/assets/localization/localization_nl.properties
index 2648e93..d95fbb5 100644
--- a/app/src/main/resources/assets/localization/localization_nl.properties
+++ b/app/src/main/resources/assets/localization/localization_nl.properties
@@ -76,6 +76,13 @@ you-were-challenged-by=Je bent uitgedaagd door
you-win=Je wint
>=>
<=<
+connect4.1=Welkom bij het spel Connect 4! Je kunt een zet doen door op een van de kolommen te klikken. De zet wordt geplaatst in de laagste nog lege rij van die kolom.
+connect4.2=Je kunt winnen door 4 van je stukken horizontaal, diagonaal of verticaal op een rij te krijgen! Zie het voorbeeld hierboven.
+reversi1=Welkom bij het spel Reversi! Je kunt een zet doen door op een van de licht transparante stippen te klikken.
+reversi2=Door op een stip te klikken draai je alle stukken om tussen de plaats waar je de stip zet en de volgende stip die wordt gevonden. Zie het voorbeeld hierboven, waar geel de stukken zijn die omgedraaid worden.
+reversi3=Je beurt kan worden overgeslagen als er geen legale zet is. Hierdoor kan je tegenstander doorgaan tot jij een legale zet kunt doen.
+reversi4=De speler die aan het einde van het spel de meeste stukken op het bord heeft, wint.
+tutorialstring=Tutorial
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (Arabisch)
chinese=\u4e2d\u6587 (Chinees)
diff --git a/app/src/main/resources/assets/localization/localization_ru.properties b/app/src/main/resources/assets/localization/localization_ru.properties
index f5d457b..ac33ac0 100644
--- a/app/src/main/resources/assets/localization/localization_ru.properties
+++ b/app/src/main/resources/assets/localization/localization_ru.properties
@@ -5,6 +5,7 @@ are-you-sure=\u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b?
back=\u041d\u0430\u0437\u0430\u0434
cancel=\u041e\u0442\u043c\u0435\u043d\u0430
challenge=\u0412\u044b\u0437\u043e\u0432
+connect4=Connect 4
computer-difficulty=\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430
computer-think-time=\u0412\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430
computer=\u041a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440
@@ -75,6 +76,13 @@ you-were-challenged-by=\u0412\u0430\u0441 \u0432\u044b\u0437\u0432\u0430\u043b \
you-win=\u0412\u044b \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442\u0435
>=>
<=<
+connect4.1=\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u0438\u0433\u0440\u0443 Connect 4! \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0445\u043e\u0434, \u043a\u043b\u0438\u043a\u043d\u0443\u044f \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432. \u0425\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d \u0432 \u043d\u0438\u0436\u0430\u0439 \u043d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0432 \u044d\u0442\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435.
+connect4.2=\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0438\u0433\u0440\u0430\u0442\u044c, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0432 4 \u0444\u0438\u0448\u043a\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e, \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0438\u043b\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e!
+reversi1=\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u0438\u0433\u0440\u0443 Reversi! \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0445\u043e\u0434, \u043a\u043b\u0438\u043a\u043d\u0443\u044f \u043f043 \u043f043 \u043d043 \u043e043 \u043d043 \u043e043 \u043a043 \u0430043 \u043a043 \u0430043.
+reversi2=\u041d043 \u043d043 \u0430043 \u043a043 \u0430043 \u043a043 \u043e043 \u043c043 \u0435043 \u0436043 \u0435043 \u0434043 \u0435043 \u043d043 \u0430043.
+reversi3=\u0412043 \u0430043 \u0436043 \u0434043 \u0430043 \u043d043 \u0438043 \u043d043 \u0435043 \u0435043 \u0432043 \u0430043.
+reversi4=\u0418043 \u0433043 \u0440043 \u043e043 \u043a043 \u043e043 \u0442043 \u043e043 \u0442043 \u043e043 \u0435043 \u0435043 \u0430043 \u0435043 \u043d043 \u0438043 \u0435043 \u0435043 \u043c043 \u0430043.
+tutorialstring=\u0423\u0447\u0435\u0431\u043d\u0438\u043a
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (\u0410\u0440\u0430\u0431\u0441\u043a\u0438\u0439)
chinese=\u4e2d\u6587 (\u041a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439)
diff --git a/app/src/main/resources/assets/localization/localization_zh.properties b/app/src/main/resources/assets/localization/localization_zh.properties
index a14aa4b..8f20733 100644
--- a/app/src/main/resources/assets/localization/localization_zh.properties
+++ b/app/src/main/resources/assets/localization/localization_zh.properties
@@ -9,6 +9,7 @@ computer-difficulty=\u8ba1\u7b97\u673a\u96be\u5ea6
computer-think-time=\u8ba1\u7b97\u673a\u601d\u8003\u65f6\u95f4
computer=\u8ba1\u7b97\u673a
connect=\u8fde\u63a5
+connect4=Connect 4
credits=\u81f4\u8c22
dark=\u6697\u8272
deny=\u62d2\u7edd
@@ -75,6 +76,13 @@ you-were-challenged-by=\u60a8\u88ab\u6311\u6218\u81ea
you-win=\u60a8\u83b7\u80dc\u4e86
>=>
<=<
+connect4.1=\u6b22\u8fce\u6765\u5230 Connect 4 \u6e38\u620f! \u4f60\u53ef\u4ee5\u70b9\u51fb\u4e00\u5217\u6761\u76ee\u64cd\u4f5c. \u64cd\u4f5c\u5c06\u88c5\u7f6e\u5728\u672a\u88c5\u5165\u7684\u6700\u4f4e\u884c.
+connect4.2=\u5982\u679c\u5f97\u52304\u4e2a\u5bf9\u5e94\u7684\u4ee3\u7406\u7ec4\u6210\u6c34\u5e73\u3001\u5347\u5e26\u6216\u5782\u76f4\u5373\u53ef\u80dc. \u770b\u4e0a\u65b9\u793a\u4f8b.
+reversi1=\u6b22\u8fce\u6765\u5230 Reversi \u6e38\u620f! \u4f60\u53ef\u4ee5\u70b9\u51fb\u4e00\u4e2a\u9ed8\u8272\u5149\u900f\u7a7a\u70b9\u64cd\u4f5c.
+reversi2=\u70b9\u51fb\u4e00\u4e2a\u70b9\u65f6\u5c06\u5c06\u6240\u6709\u4e2d\u95f4\u7684\u4ee3\u7406\u7ffb\u8f6c\u3002 \u770b\u4e0a\u65b9\u793a\u4f8b\uff0c\u9ec4\u8272\u662f\u5bf9\u4ee3\u7406\u9700\u64ad\u7684\u4ee3\u7406.
+reversi3=\u5982\u679c\u6ca1\u6709\u5408\u6cd5\u64cd\u4f5c\u4f60\u7684\u8fdb\u6b65\u53ef\u80fd\u88ab\u5ffd\u7565. \u8fd9\u4f1a\u8ba9\u5bf9\u624b\u518d\u6b21\u64cd\u4f5c\u5230\u4f60\u6709\u5408\u6cd5\u64cd\u4f5c\u65f6.
+reversi4=\u672c\u6e38\u620f\u7ed3\u675f\u65f6\u8d62\u5f97\u6ee1\u8fc7\u76d8\u9762\u7684\u4ee3\u7406\u6570\u6700\u591a\u7684\u4eba\u5c31\u80dc.
+tutorialstring=\u6559\u7a0b
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (\u963f\u62c9\u4f2f\u8bed)
chinese=\u4e2d\u6587