diff --git a/src/main/java/com/boredxgames/tictactoeclient/presentation/Difficulty_selectionController.java b/src/main/java/com/boredxgames/tictactoeclient/presentation/Difficulty_selectionController.java index 5346a6e..02bb9e7 100644 --- a/src/main/java/com/boredxgames/tictactoeclient/presentation/Difficulty_selectionController.java +++ b/src/main/java/com/boredxgames/tictactoeclient/presentation/Difficulty_selectionController.java @@ -18,8 +18,14 @@ import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.control.Label; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; +import javafx.scene.layout.Region; +import javafx.scene.layout.StackPane; +import javafx.scene.layout.VBox; +import javafx.scene.shape.SVGPath; /** * FXML Controller class @@ -38,12 +44,91 @@ public class Difficulty_selectionController implements Initializable { private Button hardBtn; @FXML private Label backLabel; + @FXML + private HBox pveBadgeHBox; + @FXML + private Label pveDotLabel; + @FXML + private Label pveTextLabel; + @FXML + private Label mainTitleLabel; + @FXML + private Label subtitleLabel; + @FXML + private FlowPane cardsFlowPane; + @FXML + private VBox easyCardVBox; + @FXML + private StackPane easyIconArea; + @FXML + private StackPane easyIconCircle; + @FXML + private SVGPath easySVG; + @FXML + private VBox easyCardContentVBox; + @FXML + private HBox easyCardHeaderHBox; + @FXML + private Label easyCardTitleLabel; + @FXML + private Region easyCardSpacer; + @FXML + private Label easyCardDifficultyLabel; + @FXML + private Label easyCardDescLabel; + @FXML + private StackPane mediumCardStackPane; + @FXML + private VBox mediumCardVBox; + @FXML + private StackPane mediumIconArea; + @FXML + private StackPane mediumIconCircle; + @FXML + private SVGPath mediumSVG; + @FXML + private VBox mediumCardContentVBox; + @FXML + private HBox mediumCardHeaderHBox; + @FXML + private Label mediumCardTitleLabel; + @FXML + private Region mediumCardSpacer; + @FXML + private Label mediumCardDifficultyLabel; + @FXML + private Label mediumCardDescLabel; + @FXML + private Label recommendedLabel; + @FXML + private VBox hardCardVBox; + @FXML + private StackPane hardIconArea; + @FXML + private StackPane hardIconCircle; + @FXML + private SVGPath hardSVG; + @FXML + private VBox hardCardContentVBox; + @FXML + private HBox hardCardHeaderHBox; + @FXML + private Label hardCardTitleLabel; + @FXML + private Region hardCardSpacer; + @FXML + private Label hardCardDifficultyLabel; + @FXML + private Label hardCardDescLabel; /** * Initializes the controller class. */ + private ResourceBundle rb; @Override public void initialize(URL url, ResourceBundle rb) { + this.rb = rb; + updateTexts(); backgroundPane.getChildren().clear(); Platform.runLater(() -> { @@ -61,6 +146,35 @@ public void initialize(URL url, ResourceBundle rb) { backLabel.setOnMouseClicked(e -> goBack()); } + private void updateTexts() { + // PVE Badge + pveTextLabel.setText(rb.getString("difficulty.mode.pve")); + + mainTitleLabel.setText(rb.getString("difficulty.title")); + subtitleLabel.setText(rb.getString("difficulty.subtitle")); + + // EASY CARD + easyCardTitleLabel.setText(rb.getString("difficulty.easy.title")); + easyCardDifficultyLabel.setText(rb.getString("difficulty.easy.level")); + easyCardDescLabel.setText(rb.getString("difficulty.easy.desc")); + easyBtn.setText(rb.getString("difficulty.easy.button")); + + // MEDIUM CARD + mediumCardTitleLabel.setText(rb.getString("difficulty.medium.title")); + mediumCardDifficultyLabel.setText(rb.getString("difficulty.medium.level")); + mediumCardDescLabel.setText(rb.getString("difficulty.medium.desc")); + mediumBtn.setText(rb.getString("difficulty.medium.button")); + recommendedLabel.setText(rb.getString("difficulty.medium.recommended")); + + // HARD CARD + hardCardTitleLabel.setText(rb.getString("difficulty.hard.title")); + hardCardDifficultyLabel.setText(rb.getString("difficulty.hard.level")); + hardCardDescLabel.setText(rb.getString("difficulty.hard.desc")); + hardBtn.setText(rb.getString("difficulty.hard.button")); + + // Back label + backLabel.setText(rb.getString("difficulty.back")); + } private void startGameWithDifficulty(String difficulty) { System.out.println("Starting game with difficulty: " + difficulty); @@ -87,4 +201,6 @@ private void goBack() { System.out.println("Back to previous screen"); NavigationManager.navigate(Screens.GAME, NavigationAction.REPLACE); } -} + + +} \ No newline at end of file diff --git a/src/main/java/com/boredxgames/tictactoeclient/presentation/OfflineModeSelectionController.java b/src/main/java/com/boredxgames/tictactoeclient/presentation/OfflineModeSelectionController.java index 99f8601..667d30f 100644 --- a/src/main/java/com/boredxgames/tictactoeclient/presentation/OfflineModeSelectionController.java +++ b/src/main/java/com/boredxgames/tictactoeclient/presentation/OfflineModeSelectionController.java @@ -10,13 +10,47 @@ import java.net.URL; import java.util.ResourceBundle; +import javafx.scene.control.Button; +import javafx.scene.control.Label; public class OfflineModeSelectionController implements Initializable { + + + @FXML + private Label logoText; + @FXML + private Button settingsButton; + @FXML + private Label titleLabel; + @FXML + private Label subtitleLabel; + @FXML + private Label pvpCardTitle; + @FXML + private Label pvpCardDesc; + @FXML + private Label pvpCardBadge; + @FXML + private Label pvpActionText; + @FXML + private Label pveCardTitle; + @FXML + private Label pveCardDesc; @FXML + private Label pveCardBadge; + @FXML + private Label pveActionText; + @FXML + private Button backButton; + @FXML + private Label backButtonText; + + private ResourceBundle resources; @Override public void initialize(URL url, ResourceBundle resourceBundle) { - + this.resources = resourceBundle; + updateTexts(); } @FXML private void handleSettings(ActionEvent event) { @@ -36,5 +70,32 @@ private void handlePlayerVsPlayer(MouseEvent event) { private void handlePlayerVsCPU(MouseEvent event) { NavigationManager.navigate(Screens.DifficultySelection, NavigationAction.PUSH); } + + + private void updateTexts() { + if (resources == null) return; + + // Header / Logo + logoText.setText(resources.getString("logo.text")); + + // Main labels + titleLabel.setText(resources.getString("offline.title")); + subtitleLabel.setText(resources.getString("offline.subtitle")); + + // PVP Card + pvpCardTitle.setText(resources.getString("offline.pvp.title")); + pvpCardDesc.setText(resources.getString("offline.pvp.description")); + pvpCardBadge.setText(resources.getString("offline.pvp.badge")); + pvpActionText.setText(resources.getString("offline.pvp.start")); + + // PVE Card + pveCardTitle.setText(resources.getString("offline.pve.title")); + pveCardDesc.setText(resources.getString("offline.pve.description")); + pveCardBadge.setText(resources.getString("offline.pve.badge")); + pveActionText.setText(resources.getString("offline.pve.start")); + + // Back button + backButtonText.setText(resources.getString("offline.back")); + } } \ No newline at end of file diff --git a/src/main/java/com/boredxgames/tictactoeclient/presentation/Pvp_setupController.java b/src/main/java/com/boredxgames/tictactoeclient/presentation/Pvp_setupController.java index 0f73caf..5b5c726 100644 --- a/src/main/java/com/boredxgames/tictactoeclient/presentation/Pvp_setupController.java +++ b/src/main/java/com/boredxgames/tictactoeclient/presentation/Pvp_setupController.java @@ -16,11 +16,15 @@ import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; +import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.control.ToggleButton; import javafx.scene.control.ToggleGroup; +import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; +import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; +import javafx.scene.shape.SVGPath; /** * FXML Controller class @@ -43,9 +47,54 @@ public class Pvp_setupController implements Initializable { private Button startGameBtn; @FXML private Button backBtn; + @FXML + private HBox topBar; + @FXML + private Label logoLabel; + @FXML + private HBox navLinks; + @FXML + private VBox titleContainer; + @FXML + private SVGPath pvpIcon; + @FXML + private Label titleLabel; + @FXML + private Label subtitleLabel; + @FXML + private VBox setupCard; + @FXML + private Label player1Label; + @FXML + private Label player1Badge; + @FXML + private HBox player1Container; + @FXML + private StackPane vsSeparator; + @FXML + private Label vsLabel; + @FXML + private Label player2Label; + @FXML + private Label player2Badge; + @FXML + private HBox player2Container; + @FXML + private Label starterLabel; + @FXML + private HBox starterToggleContainer; + @FXML + private ToggleButton player1StarterBtn; + @FXML + private ToggleButton player2StarterBtn; + + private ResourceBundle langBundle; @Override public void initialize(URL url, ResourceBundle rb) { + this.langBundle = rb; + updateTexts(); + backgroundPane.getChildren().clear(); Platform.runLater(() -> { @@ -84,4 +133,31 @@ private void onStartGameClicked(ActionEvent event) { NavigationManager.navigate(Screens.GAME, NavigationAction.REPLACE, params); } + + private void updateTexts() { + if (langBundle == null) { + return; + } + + logoLabel.setText(langBundle.getString("pvp.logo")); + titleLabel.setText(langBundle.getString("pvp.title")); + subtitleLabel.setText(langBundle.getString("pvp.subtitle")); + + player1Label.setText(langBundle.getString("pvp.player1.label")); + player1Badge.setText(langBundle.getString("pvp.player1.badge")); + player1Field.setPromptText(langBundle.getString("pvp.player1.prompt")); + + player2Label.setText(langBundle.getString("pvp.player2.label")); + player2Badge.setText(langBundle.getString("pvp.player2.badge")); + player2Field.setPromptText(langBundle.getString("pvp.player2.prompt")); + + vsLabel.setText(langBundle.getString("pvp.vs")); + + starterLabel.setText(langBundle.getString("pvp.starter.label")); + player1StarterBtn.setText(langBundle.getString("pvp.starter.player1")); + player2StarterBtn.setText(langBundle.getString("pvp.starter.player2")); + + startGameBtn.setText(langBundle.getString("pvp.start")); + backBtn.setText(langBundle.getString("pvp.back")); + } } diff --git a/src/main/java/com/boredxgames/tictactoeclient/presentation/Server_connectionController.java b/src/main/java/com/boredxgames/tictactoeclient/presentation/Server_connectionController.java index 51c118b..7c7504c 100644 --- a/src/main/java/com/boredxgames/tictactoeclient/presentation/Server_connectionController.java +++ b/src/main/java/com/boredxgames/tictactoeclient/presentation/Server_connectionController.java @@ -16,35 +16,85 @@ import javafx.scene.control.Button; import javafx.scene.control.ComboBox; import javafx.scene.control.Label; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; +import javafx.scene.layout.Region; +import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; +import javafx.scene.shape.SVGPath; public class Server_connectionController implements Initializable { - @FXML private ComboBox ipComboBox; - @FXML private Button connectButton; - @FXML private Label statusLabel; - @FXML private Pane backgroundPane; - @FXML private VBox contentContainer; + @FXML + private ComboBox ipComboBox; + @FXML + private Button connectButton; + @FXML + private Label statusLabel; + @FXML + private Pane backgroundPane; + @FXML + private VBox contentContainer; private Thread connectionThread; - + private final Map serverPresets = new HashMap<>(); + @FXML + private AnchorPane rootPane; + @FXML + private HBox topBar; + @FXML + private Label logoLabel; + @FXML + private Region topBarSpacer; + @FXML + private StackPane mainStackPane; + @FXML + private Label backLabel; + @FXML + private VBox cardContainer; + @FXML + private VBox headerVBox; + @FXML + private StackPane iconStackPane; + @FXML + private SVGPath iconSVG; + @FXML + private Label cardTitleLabel; + @FXML + private Label cardSubtitleLabel; + @FXML + private VBox inputContainerVBox; + @FXML + private Label ipLabel; + @FXML + private HBox ipHBox; + @FXML + private HBox statusHBox; + @FXML + private SVGPath statusSVG; + @FXML + private Label footerLabel; + + private ResourceBundle rb; @Override public void initialize(URL location, ResourceBundle resources) { + this.rb = resources; + updateTexts(); backgroundPane.getChildren().clear(); - Platform.runLater(() -> { + Platform.runLater(() -> { BackgroundAnimation.animateCardEntry(contentContainer); BackgroundAnimation.startWarpAnimation( - backgroundPane, - backgroundPane.getWidth(), - backgroundPane.getHeight() + backgroundPane, + backgroundPane.getWidth(), + backgroundPane.getHeight() ); }); - + serverPresets.put("Local Server", "127.0.0.1"); serverPresets.put("Network Server", "10.145.0.124"); @@ -52,17 +102,17 @@ public void initialize(URL location, ResourceBundle resources) { ipComboBox.getSelectionModel().select("Local Server"); ipComboBox.setEditable(true); - } - @FXML private void connect() { String input = ipComboBox.getValue(); - if (input == null || input.trim().isEmpty()) return; + if (input == null || input.trim().isEmpty()) { + return; + } String ip = serverPresets.getOrDefault(input, input); - + statusLabel.setText("Status: Connecting to " + ip + "..."); statusLabel.setStyle("-fx-text-fill: white;"); connectButton.setDisable(true); @@ -73,11 +123,11 @@ private void connect() { Platform.runLater(() -> { statusLabel.setText("Status: Connected to " + ip + "!"); - + if (!ipComboBox.getItems().contains(input)) { - ipComboBox.getItems().add(input); + ipComboBox.getItems().add(input); } - + stopConnectionThread(); NavigationManager.navigate(Screens.AUTHENTICATION, NavigationAction.REPLACE); }); @@ -104,4 +154,15 @@ private void stopConnectionThread() { connectionThread.interrupt(); } } -} \ No newline at end of file + + private void updateTexts() { + logoLabel.setText(rb.getString("server.title")); + cardTitleLabel.setText(rb.getString("server.title")); + cardSubtitleLabel.setText(rb.getString("server.subtitle")); + backLabel.setText(rb.getString("server.back")); + ipLabel.setText(rb.getString("server.ip.label")); + connectButton.setText(rb.getString("server.connect.button")); + statusLabel.setText(rb.getString("server.status.waiting")); + footerLabel.setText(rb.getString("server.footer")); + } +} diff --git a/src/main/resources/assets/localization/message_ar.properties b/src/main/resources/assets/localization/message_ar.properties index e3df093..faade42 100644 --- a/src/main/resources/assets/localization/message_ar.properties +++ b/src/main/resources/assets/localization/message_ar.properties @@ -40,4 +40,81 @@ settings.back=\u0631\u062c\u0648\u0639 language.english=\u0627\u0644\u0627\u0646\u062c\u0644\u064a\u0632\u064a\u0629 -language.arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 \ No newline at end of file +language.arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 + +# Difficulty Selection Screen +difficulty.mode.pve=\u0646\u0645\u0637 \u0628\u0644\u0627 \u0627\u062a\u0635\u0627\u0644 +difficulty.title=\u0627\u062e\u062a\u0631 \u062e\u0635\u0645\u0643 +difficulty.subtitle=\u0627\u062e\u062a\u0631 \u0645\u0633\u062a\u0648\u0649 \u0635\u0639\u0648\u0628\u0629 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0635\u0646\u0627\u0639\u064a \u0644\u0644\u0628\u062f\u0621 \u0641\u064a \u0627\u0644\u0645\u0628\u0627\u0631\u0627\u0629. + +difficulty.easy.title=\u0645\u0628\u062a\u062f\u0626 +difficulty.easy.level=\u0633\u0647\u0644 +difficulty.easy.desc=\u0644\u0644\u062a\u0648 \u0628\u062f\u0623\u062a\u061f \u0627\u0644\u0645\u0628\u062a\u062f\u0626 \u064a\u0631\u062a\u0643\u0628 \u0623\u062e\u0637\u0627\u0621 \u0639\u0634\u0648\u0627\u0626\u064a\u0629 \u0648\u0645\u062b\u0627\u0644\u064a \u0644\u062a\u062c\u0631\u0628\u0629 \u0633\u0631\u064a\u0639\u0629. +difficulty.easy.button=\u0627\u062e\u062a\u0631 \u0627\u0644\u0645\u0628\u062a\u062f\u0626 \u2192 + +difficulty.medium.title=\u0627\u0633\u062a\u0631\u0627\u062a\u064a\u062c\u064a +difficulty.medium.level=\u0645\u062a\u0648\u0633\u0637 +difficulty.medium.desc=\u062a\u062d\u062f\u064d \u0645\u062a\u0648\u0627\u0632\u0646. \u0627\u0644\u0627\u0633\u062a\u0631\u0627\u062a\u064a\u062c\u064a \u064a\u0639\u0631\u0641 \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0627\u062a \u0648\u064a\u0639\u0627\u0642\u0628 \u0627\u0644\u0623\u062e\u0637\u0627\u0621 \u0627\u0644\u0648\u0627\u0636\u062d\u0629. +difficulty.medium.button=\u0627\u062e\u062a\u0631 \u0627\u0644\u0627\u0633\u062a\u0631\u0627\u062a\u064a\u062c\u064a \u2192 +difficulty.medium.recommended=\u0645\u0648\u0635\u0649 \u0628\u0647 + +difficulty.hard.title=\u062e\u0628\u064a\u0631 +difficulty.hard.level=\u0635\u0639\u0628 +difficulty.hard.desc=\u0644\u0627 \u062a\u062a\u0648\u0642\u0639 \u0623\u064a \u0631\u062d\u0645\u0629. \u0647\u0630\u0627 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0635\u0646\u0627\u0639\u064a \u064a\u062d\u0633\u0628 \u0643\u0644 \u0627\u0644\u0627\u062d\u062a\u0645\u0627\u0644\u0627\u062a \u0648\u064a\u0644\u0639\u0628 \u0644\u0639\u0628\u0629 \u0645\u062b\u0627\u0644\u064a\u0629. +difficulty.hard.button=\u0627\u062e\u062a\u0631 \u0627\u0644\u062e\u0628\u064a\u0631 \u2192 + +difficulty.back=\u2190 \u0627\u0644\u0639\u0648\u062f\u0629 \u0625\u0644\u0649 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629 + + +# ar.properties +logo.text=\u062a\u064a\u0643 \u062a\u0627\u0643 \u062a\u0648 +offline.title=\u0627\u062e\u062a\u0631 \u0627\u0644\u0648\u0636\u0639 +offline.subtitle=\u0627\u062e\u062a\u0631 \u062e\u0635\u0645\u0643 \u0644\u0628\u062f\u0621 \u0627\u0644\u0644\u0639\u0628\u0629 + +offline.pvp.title=\u0644\u0627\u0639\u0628 \u0636\u062f \u0644\u0627\u0639\u0628 +offline.pvp.description=\u0645\u0628\u0627\u0631\u0627\u0629 \u0645\u062d\u0644\u064a\u0629 \u0639\u0644\u0649 \u0646\u0641\u0633 \u0627\u0644\u062c\u0647\u0627\u0632 +offline.pvp.badge=\u063a\u064a\u0631 \u0645\u062a\u0635\u0644 +offline.pvp.start=\u0627\u0628\u062f\u0623 \u0627\u0644\u0644\u0639\u0628\u0629 + +offline.pve.title=\u0644\u0627\u0639\u0628 \u0636\u062f \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631 +offline.pve.description=\u062a\u062d\u062f\u0649 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u0649 +offline.pve.badge=\u0644\u0627\u0639\u0628 \u0648\u0627\u062d\u062f +offline.pve.start=\u0627\u0628\u062f\u0623 \u0627\u0644\u0644\u0639\u0628\u0629 + +offline.back=\u0627\u0644\u0639\u0648\u062f\u0629 \u0644\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629 + + +# \u0634\u0627\u0634\u0629 \u0625\u0639\u062f\u0627\u062f\u0627\u062a PVP +pvp.logo=\u062a\u064a\u0643 \u062a\u0627\u0643 \u062a\u0648 +pvp.title=\u0644\u0627\u0639\u0628 \u0636\u062f \u0644\u0627\u0639\u0628 \u063a\u064a\u0631 \u0645\u062a\u0635\u0644 +pvp.subtitle=\u0642\u0645 \u0628\u0636\u0628\u0637 \u0623\u0633\u0645\u0627\u0621 \u0627\u0644\u0644\u0627\u0639\u0628\u064a\u0646 \u0644\u0644\u0645\u0628\u0627\u0631\u0627\u0629 \u0627\u0644\u0645\u062d\u0644\u064a\u0629. + +pvp.player1.label=\u0627\u0633\u0645 \u0627\u0644\u0644\u0627\u0639\u0628 1 +pvp.player1.badge=\u0627\u0644\u0639\u0628 \u0643\u0640 X +pvp.player1.prompt=\u0623\u062f\u062e\u0644 \u0627\u0644\u0627\u0633\u0645... + +pvp.player2.label=\u0627\u0633\u0645 \u0627\u0644\u0644\u0627\u0639\u0628 2 +pvp.player2.badge=\u0627\u0644\u0639\u0628 \u0643\u0640 O +pvp.player2.prompt=\u0623\u062f\u062e\u0644 \u0627\u0644\u0627\u0633\u0645... + +pvp.vs=\u0636\u062f + +pvp.starter.label=\u0645\u0646 \u064a\u0628\u062f\u0623 \u0623\u0648\u0644\u0627\u064b\u061f +pvp.starter.player1=\u0627\u0644\u0644\u0627\u0639\u0628 1 (X) +pvp.starter.player2=\u0627\u0644\u0644\u0627\u0639\u0628 2 (O) + +pvp.start=\u0627\u0628\u062f\u0623 \u0627\u0644\u0644\u0639\u0628\u0629 +pvp.back=\u0627\u0644\u0639\u0648\u062f\u0629 \u0644\u0644\u0642\u0627\u0626\u0645\u0629 + + +# Server Connection Screen +server.title=\u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0627\u0644\u062e\u0627\u062f\u0645 +server.subtitle=\u0645\u0631\u062d\u0628\u0627\u064b \u0628\u0643 \u0641\u064a BoredXGames +server.back=\u2190 \u0627\u0644\u0639\u0648\u062f\u0629 \u0644\u0627\u062e\u062a\u064a\u0627\u0631 \u0648\u0636\u0639 \u0627\u0644\u0644\u0639\u0628 +server.ip.label=\u0627\u062e\u062a\u0631 \u0627\u0644\u062e\u0627\u062f\u0645 +server.connect.button=\u0627\u062a\u0635\u0644 \u2794 +server.status.waiting=\u0627\u0644\u062d\u0627\u0644\u0629: \u0641\u064a \u0627\u0646\u062a\u0638\u0627\u0631 \u0627\u0644\u0625\u062f\u062e\u0627\u0644... +server.status.connecting=\u0627\u0644\u062d\u0627\u0644\u0629: \u062c\u0627\u0631\u064a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0640 {0}... +server.status.connected=\u0627\u0644\u062d\u0627\u0644\u0629: \u062a\u0645 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0640 {0}! +server.status.failed=\u0627\u0644\u062d\u0627\u0644\u0629: \u0641\u0634\u0644 \u0627\u0644\u0627\u062a\u0635\u0627\u0644: {0} +server.footer=Tic Tac Toe\u00a9 BoredXGames 2026 diff --git a/src/main/resources/assets/localization/message_en.properties b/src/main/resources/assets/localization/message_en.properties index a4a128d..cc48e66 100644 --- a/src/main/resources/assets/localization/message_en.properties +++ b/src/main/resources/assets/localization/message_en.properties @@ -40,3 +40,81 @@ settings.back=Back language.english=English language.arabic=Arabic + +# Difficulty Selection Screen +difficulty.mode.pve=PVE OFFLINE MODE +difficulty.title=Choose Your Opponent +difficulty.subtitle=Select an AI difficulty level to start the match. + +difficulty.easy.title=Rookie +difficulty.easy.level=EASY +difficulty.easy.desc=Just getting started? The Rookie makes random mistakes and is perfect for a quick warm-up game. +difficulty.easy.button=Select Rookie \u2192 + +difficulty.medium.title=Strategist +difficulty.medium.level=MEDIUM +difficulty.medium.desc=A balanced challenge. The Strategist knows the basics and will punish obvious blunders. +difficulty.medium.button=Select Strategist \u2192 +difficulty.medium.recommended=RECOMMENDED + +difficulty.hard.title=Grandmaster +difficulty.hard.level=HARD +difficulty.hard.desc=Expect no mercy. This AI calculates every possibility and plays a perfect game. +difficulty.hard.button=Select Grandmaster \u2192 + +difficulty.back=\u2190 Back to Main Menu + + + +# en.properties +logo.text=TIC-TAC-TOE +offline.title=Select Mode +offline.subtitle=Choose your opponent to begin the game + +offline.pvp.title=Player vs Player +offline.pvp.description=Local match on the same device +offline.pvp.badge=OFFLINE +offline.pvp.start=Start Game + +offline.pve.title=Player vs CPU +offline.pve.description=Challenge the artificial intelligence +offline.pve.badge=SINGLE PLAYER +offline.pve.start=Start Game + +offline.back=Back to Main Menu + + +# PVP Setup Screen +pvp.logo=Tic-Tac-Toe +pvp.title=Offline PVP +pvp.subtitle=Configure players for a local match. + +pvp.player1.label=Player 1 Name +pvp.player1.badge=PLAY AS X +pvp.player1.prompt=Enter name... + +pvp.player2.label=Player 2 Name +pvp.player2.badge=PLAY AS O +pvp.player2.prompt=Enter name... + +pvp.vs=VS + +pvp.starter.label=Who goes first? +pvp.starter.player1=Player 1 (X) +pvp.starter.player2=Player 2 (O) + +pvp.start=Start Game +pvp.back=Back to Menu + + +# Server Connection Screen +server.title=Connect to Server +server.subtitle=Welcome to BoredXGames +server.back=\u2190 Back to Mode Selection +server.ip.label=Select Server +server.connect.button=Connect \u2794 +server.status.waiting=Status: Waiting for input... +server.status.connecting=Status: Connecting to {0}... +server.status.connected=Status: Connected to {0}! +server.status.failed=Status: Connection failed: {0} +server.footer=Tic Tac Toe\u00a9 BoredXGames 2026 diff --git a/src/main/resources/fxml/difficulty_selection.fxml b/src/main/resources/fxml/difficulty_selection.fxml index 8e657ec..bb5d8d4 100644 --- a/src/main/resources/fxml/difficulty_selection.fxml +++ b/src/main/resources/fxml/difficulty_selection.fxml @@ -17,98 +17,94 @@ - + - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - -