diff --git a/.gitignore b/.gitignore
index b561d9a..592a652 100644
--- a/.gitignore
+++ b/.gitignore
@@ -47,6 +47,7 @@ shelf/
*.iml
*.ipr
*.iws
+misc.xml
##############################
## Eclipse
@@ -101,4 +102,9 @@ build
newgamesver-release-V1.jar
server.properties
gameserver.log.*
-gameserver.log
\ No newline at end of file
+gameserver.log
+
+##############################
+## JPackage
+##############################
+jpackage-input
\ No newline at end of file
diff --git a/app/pom.xml b/app/pom.xml
index 17ed5af..f8a54cf 100644
--- a/app/pom.xml
+++ b/app/pom.xml
@@ -9,7 +9,7 @@
org.toop.Main2525
-
+ 25UTF-8
@@ -44,14 +44,34 @@
org.apache.maven.plugins
- maven-compiler-plugin
- 3.14.1
-
- 25
- 25
- 25
- UTF-8
-
+ maven-shade-plugin
+ 3.6.1
+
+
+ package
+
+ shade
+
+
+
+
+ *:*
+
+ META-INF/*.SF
+ META-INF/*.DSA
+ META-INF/*.RSA
+
+
+
+
+
+ org.toop.Main
+
+
+ pism
+
+
+ com.diffplug.spotless
diff --git a/app/src/main/java/org/toop/Main.java b/app/src/main/java/org/toop/Main.java
index 0f92ca8..a94799b 100644
--- a/app/src/main/java/org/toop/Main.java
+++ b/app/src/main/java/org/toop/Main.java
@@ -1,20 +1,20 @@
package org.toop;
import org.toop.app.App;
-import org.toop.framework.asset.AssetLoader;
-import org.toop.framework.asset.AssetManager;
+import org.toop.framework.asset.ResourceLoader;
+import org.toop.framework.asset.ResourceManager;
import org.toop.framework.audio.SoundManager;
import org.toop.framework.networking.NetworkingClientManager;
import org.toop.framework.networking.NetworkingInitializationException;
-public class Main {
- static void main(String[] args) {
+public final class Main {
+ public static void main(String[] args) {
initSystems();
App.run(args);
}
private static void initSystems() throws NetworkingInitializationException {
- AssetManager.loadAssets(new AssetLoader("app/src/main/resources/assets"));
+ ResourceManager.loadAssets(new ResourceLoader("app/src/main/resources/assets"));
new Thread(NetworkingClientManager::new).start();
new Thread(SoundManager::new).start();
}
diff --git a/app/src/main/java/org/toop/app/App.java b/app/src/main/java/org/toop/app/App.java
index 0602577..bf797b6 100644
--- a/app/src/main/java/org/toop/app/App.java
+++ b/app/src/main/java/org/toop/app/App.java
@@ -2,27 +2,54 @@ package org.toop.app;
import org.toop.app.menu.MainMenu;
import org.toop.app.menu.Menu;
-import org.toop.app.menu.QuitMenu;
import javafx.application.Application;
-import javafx.scene.layout.StackPane;
+import javafx.geometry.Pos;
import javafx.scene.Scene;
+import javafx.scene.control.Button;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.Region;
+import javafx.scene.layout.StackPane;
+import javafx.scene.layout.VBox;
+import javafx.scene.text.Text;
import javafx.stage.Stage;
-import org.toop.framework.asset.AssetManager;
-import org.toop.framework.asset.resources.LocalizationAsset;
+import org.toop.framework.asset.ResourceManager;
+import org.toop.framework.asset.resources.CssAsset;
import org.toop.framework.audio.events.AudioEvents;
import org.toop.framework.eventbus.EventFlow;
-import org.toop.local.AppContext;
-import java.util.Locale;
-
-public class App extends Application {
+public final class App extends Application {
private static Stage stage;
- private static Scene scene;
private static StackPane root;
- private Locale currentLocale = AppContext.getLocale();
- private LocalizationAsset loc = AssetManager.get("localization.properties");
+ private static int width;
+ private static int height;
+
+ private static boolean isQuitting;
+
+ private static class QuitMenu extends Menu {
+ public QuitMenu() {
+ final Region background = createBackground("quit_background");
+
+ final Text sure = createText("Are you sure?");
+
+ final Button yes = createButton("Yes", () -> { stage.close(); });
+ final Button no = createButton("No", () -> { pop(); isQuitting = false; });
+
+ final HBox buttons = new HBox(50, yes, no);
+ buttons.setAlignment(Pos.CENTER);
+
+ final VBox box = new VBox(35, sure, buttons);
+ box.getStyleClass().add("quit_box");
+ box.setAlignment(Pos.CENTER);
+ box.setMaxWidth(350);
+ box.setMaxHeight(200);
+
+ pane = new StackPane(background, box);
+ pane.getStylesheets().add(ResourceManager.get(CssAsset.class, "quit.css").getUrl());
+
+ }
+ }
public static void run(String[] args) {
launch(args);
@@ -31,15 +58,20 @@ public class App extends Application {
@Override
public void start(Stage stage) throws Exception {
final StackPane root = new StackPane(new MainMenu().getPane());
- final Scene scene = new Scene(root);
- stage.setTitle(loc.getString("windowTitle", currentLocale));
+ final Scene scene = new Scene(root);
+ scene.getStylesheets().add(((CssAsset) ResourceManager.get("app.css")).getUrl());
+
+ stage.setTitle("pism");
stage.setMinWidth(1080);
stage.setMinHeight(720);
stage.setOnCloseRequest(event -> {
event.consume();
- push(new QuitMenu());
+
+ if (!isQuitting) {
+ quitPopup();
+ }
});
stage.setScene(scene);
@@ -48,28 +80,35 @@ public class App extends Application {
stage.show();
App.stage = stage;
- App.scene = scene;
App.root = root;
- new EventFlow().addPostEvent(new AudioEvents.StartBackgroundMusic()).postEvent();
- new EventFlow().addPostEvent(new AudioEvents.ChangeVolume(0.3)).postEvent();
+ App.width = (int)stage.getWidth();
+ App.height = (int)stage.getHeight();
+
+ new EventFlow().addPostEvent(new AudioEvents.StartBackgroundMusic()).asyncPostEvent();
+ new EventFlow().addPostEvent(new AudioEvents.ChangeVolume(0.1)).asyncPostEvent();
+
+ App.isQuitting = false;
+ }
+
+ public static void quitPopup() {
+ isQuitting = true;
+ push(new QuitMenu());
}
public static void activate(Menu menu) {
- scene.setRoot(menu.getPane());
+ pop();
+ push(menu);
}
public static void push(Menu menu) {
- root.getChildren().add(menu.getPane());
+ root.getChildren().addLast(menu.getPane());
}
public static void pop() {
root.getChildren().removeLast();
}
- public static void quit() {
- stage.close();
- }
-
- public static StackPane getRoot() { return root; }
+ public static int getWidth() { return width; }
+ public static int getHeight() { return height; }
}
\ No newline at end of file
diff --git a/app/src/main/java/org/toop/app/GameType.java b/app/src/main/java/org/toop/app/GameType.java
new file mode 100644
index 0000000..54dd2ad
--- /dev/null
+++ b/app/src/main/java/org/toop/app/GameType.java
@@ -0,0 +1,21 @@
+package org.toop.app;
+
+public enum GameType {
+ TICTACTOE, REVERSI;
+
+ public static String toName(GameType type) {
+ return switch (type) {
+ case TICTACTOE -> "Tic Tac Toe";
+ case REVERSI -> "Reversi";
+ };
+ }
+
+ public static GameType toType(String name) {
+ return switch (name) {
+ case "Tic Tac Toe" -> TICTACTOE;
+ case "Reversi" -> REVERSI;
+
+ default -> TICTACTOE;
+ };
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/toop/app/menu/CreditsMenu.java b/app/src/main/java/org/toop/app/menu/CreditsMenu.java
index e2f0b5f..95910ce 100644
--- a/app/src/main/java/org/toop/app/menu/CreditsMenu.java
+++ b/app/src/main/java/org/toop/app/menu/CreditsMenu.java
@@ -1,15 +1,14 @@
package org.toop.app.menu;
-import org.toop.framework.asset.AssetManager;
+import org.toop.framework.asset.ResourceManager;
import org.toop.framework.asset.resources.LocalizationAsset;
import org.toop.local.AppContext;
import java.util.Locale;
-import java.util.ResourceBundle;
public final class CreditsMenu extends Menu {
private Locale currentLocale = AppContext.getLocale();
- private LocalizationAsset loc = AssetManager.get("localization.properties");
+ private LocalizationAsset loc = ResourceManager.get("localization.properties");
public CreditsMenu() {
}
}
\ No newline at end of file
diff --git a/app/src/main/java/org/toop/app/menu/GameSelectMenu.java b/app/src/main/java/org/toop/app/menu/GameSelectMenu.java
new file mode 100644
index 0000000..a205808
--- /dev/null
+++ b/app/src/main/java/org/toop/app/menu/GameSelectMenu.java
@@ -0,0 +1,33 @@
+package org.toop.app.menu;
+
+import javafx.scene.control.ComboBox;
+import javafx.scene.control.TextField;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.Region;
+import javafx.scene.layout.StackPane;
+import javafx.scene.layout.VBox;
+import org.toop.app.GameType;
+
+public class GameSelectMenu extends Menu {
+ public GameSelectMenu(GameType type) {
+ final Region background = createBackground();
+
+ final ComboBox selectedGame = new ComboBox<>();
+ selectedGame.getItems().add(GameType.toName(GameType.TICTACTOE));
+ selectedGame.getItems().add(GameType.toName(GameType.REVERSI));
+ selectedGame.setValue(GameType.toName(type));
+
+ final ComboBox selectedMode = new ComboBox<>();
+ selectedMode.getItems().add("Local");
+ selectedMode.getItems().add("Online");
+ selectedMode.setValue("Local");
+
+ final HBox selectedContainer = new HBox(10, selectedGame, selectedMode);
+
+ final TextField serverIpField = new TextField();
+ serverIpField.setPromptText("Enter here your server ip address");
+
+ VBox box = new VBox(selectedContainer, serverIpField);
+ pane = new StackPane(background, box);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/toop/app/menu/MainMenu.java b/app/src/main/java/org/toop/app/menu/MainMenu.java
index 68f58a6..c369806 100644
--- a/app/src/main/java/org/toop/app/menu/MainMenu.java
+++ b/app/src/main/java/org/toop/app/menu/MainMenu.java
@@ -1,52 +1,37 @@
package org.toop.app.menu;
+import org.toop.app.App;
+import org.toop.app.GameType;
+
import javafx.geometry.Pos;
import javafx.scene.control.Button;
-import javafx.scene.image.ImageView;
import javafx.scene.layout.*;
-import javafx.scene.text.Font;
-import org.toop.framework.asset.resources.FontAsset;
-import org.toop.framework.asset.resources.LocalizationAsset;
-
-import java.util.Locale;
-import org.toop.framework.asset.AssetManager;
-import org.toop.framework.asset.resources.CssAsset;
-import org.toop.framework.asset.resources.ImageAsset;
-import org.toop.local.AppContext;
+import org.toop.app.menu.game.TicTacToeMenu;
+import org.toop.game.tictactoe.TicTacToe;
public final class MainMenu extends Menu {
- private final Locale currentLocale = AppContext.getLocale();
- private final LocalizationAsset loc = AssetManager.get("localization.properties");
+ public MainMenu() {
+ final Region background = createBackground();
- public MainMenu() {
+ final Button tictactoe = createButton("Tic Tac Toe", () -> { App.activate(new TicTacToeMenu(new TicTacToe("player 1", true, "player 2", true))); });
+ final Button reversi = createButton("Reversi", () -> { App.activate(new GameSelectMenu(GameType.REVERSI)); });
- final Button tictactoe = createButton(loc.getString("mainMenuSelectTicTacToe", currentLocale), () -> {});
- final Button reversi = createButton(loc.getString("mainMenuSelectReversi", currentLocale), () -> {});
- final Button sudoku = createButton(loc.getString("mainMenuSelectSudoku", currentLocale), () -> {});
- final Button battleship = createButton(loc.getString("mainMenuSelectBattleship", currentLocale), () -> {});
- final Button other = createButton(loc.getString("mainMenuSelectOther", currentLocale), () -> {});
+ final VBox gamesBox = new VBox(10, tictactoe, reversi);
+ gamesBox.setAlignment(Pos.TOP_LEFT);
+ gamesBox.setPickOnBounds(false);
+ gamesBox.setTranslateY(50);
+ gamesBox.setTranslateX(25);
- final VBox gamesBox = new VBox(tictactoe, reversi, sudoku, battleship, other);
- gamesBox.setAlignment(Pos.TOP_CENTER);
+ final Button credits = createButton("Credits", () -> { App.push(new CreditsMenu()); });
+ final Button options = createButton("Options", () -> { App.push(new OptionsMenu()); });
+ final Button quit = createButton("Quit", () -> { App.quitPopup(); });
- final Button credits = createButton(loc.getString("mainMenuSelectCredits", currentLocale), () -> {});
- final Button options = createButton(loc.getString("mainMenuSelectOptions", currentLocale), () -> {});
- final Button quit = createButton(loc.getString("mainMenuSelectQuit", currentLocale), () -> {});
+ final VBox controlBox = new VBox(10, credits, options, quit);
+ controlBox.setAlignment(Pos.BOTTOM_LEFT);
+ controlBox.setPickOnBounds(false);
+ controlBox.setTranslateY(-50);
+ controlBox.setTranslateX(25);
- final VBox creditsBox = new VBox(credits, options, quit);
- creditsBox.setAlignment(Pos.BOTTOM_CENTER);
-
- VBox grid = new VBox(20, gamesBox, creditsBox);
- grid.setAlignment(Pos.CENTER);
-
- ImageAsset backgroundImage = (ImageAsset) AssetManager.getByName("background.jpg").getResource();
- ImageView background = new ImageView(backgroundImage.getImage());
- background.setPreserveRatio(false);
- background.fitWidthProperty().bind(grid.widthProperty());
- background.fitHeightProperty().bind(grid.heightProperty());
-
- pane = new StackPane(background, grid);
- CssAsset css = AssetManager.get("main.css");
- pane.getStylesheets().add(css.getUrl());
+ pane = new StackPane(background, gamesBox, controlBox);
}
}
\ No newline at end of file
diff --git a/app/src/main/java/org/toop/app/menu/Menu.java b/app/src/main/java/org/toop/app/menu/Menu.java
index 8a75209..82c12ee 100644
--- a/app/src/main/java/org/toop/app/menu/Menu.java
+++ b/app/src/main/java/org/toop/app/menu/Menu.java
@@ -1,36 +1,47 @@
package org.toop.app.menu;
-import org.toop.app.App;
-
-import javafx.animation.FadeTransition;
+import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
-import javafx.util.Duration;
-import org.toop.framework.asset.Asset;
-import org.toop.framework.asset.AssetManager;
-import org.toop.framework.asset.resources.LocalizationAsset;
-import org.toop.local.AppContext;
-
-import java.util.ArrayList;
-import java.util.Locale;
+import javafx.scene.layout.Region;
+import javafx.scene.text.Text;
public abstract class Menu {
protected Pane pane;
public Pane getPane() { return pane; }
- private Locale currentLocale = AppContext.getLocale();
- private LocalizationAsset loc = AssetManager.get("localization.properties");
- public void fadeBackgroundImage(String imagePath, float from, float to, float milliseconds) {
- final FadeTransition fade = new FadeTransition(Duration.millis(milliseconds), App.getRoot());
- fade.setFromValue(from);
- fade.setToValue(to);
- fade.play();
+ public Region createBackground(String css) {
+ final Region background = new Region();
+ background.setPrefSize(Double.MAX_VALUE, Double.MAX_VALUE);
+ background.getStyleClass().add(css);
+
+ return background;
}
- public Button createButton(String text, Runnable runnable) {
- final Button button = new Button(text);
+ public Region createBackground() {
+ return createBackground("background");
+ }
+
+ public Text createText(String css, String x) {
+ final Text text = new Text(x);
+ text.getStyleClass().add(css);
+
+ return text;
+ }
+
+ public Text createText(String x) {
+ return createText("text", x);
+ }
+
+ public Button createButton(String css, String x, Runnable runnable) {
+ final Button button = new Button(x);
button.setOnAction(_ -> runnable.run());
- button.getStyleClass().add("button");
+ button.getStyleClass().add(css);
+
return button;
}
+
+ public Button createButton(String x, Runnable runnable) {
+ return createButton("button", x, runnable);
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/org/toop/app/menu/OptionsMenu.java b/app/src/main/java/org/toop/app/menu/OptionsMenu.java
index ea21dcb..272c08a 100644
--- a/app/src/main/java/org/toop/app/menu/OptionsMenu.java
+++ b/app/src/main/java/org/toop/app/menu/OptionsMenu.java
@@ -1,15 +1,14 @@
package org.toop.app.menu;
-import org.toop.framework.asset.AssetManager;
+import org.toop.framework.asset.ResourceManager;
import org.toop.framework.asset.resources.LocalizationAsset;
import org.toop.local.AppContext;
import java.util.Locale;
-import java.util.ResourceBundle;
public final class OptionsMenu extends Menu {
private Locale currentLocale = AppContext.getLocale();
- private LocalizationAsset loc = AssetManager.get("localization.properties");
+ private LocalizationAsset loc = ResourceManager.get("localization.properties");
public OptionsMenu() {
}
}
\ No newline at end of file
diff --git a/app/src/main/java/org/toop/app/menu/QuitMenu.java b/app/src/main/java/org/toop/app/menu/QuitMenu.java
deleted file mode 100644
index 3916dfc..0000000
--- a/app/src/main/java/org/toop/app/menu/QuitMenu.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.toop.app.menu;
-
-import javafx.geometry.Pos;
-import javafx.scene.control.Button;
-import javafx.scene.layout.HBox;
-import javafx.scene.layout.Region;
-import javafx.scene.layout.StackPane;
-import javafx.scene.layout.VBox;
-import javafx.scene.text.Text;
-import org.toop.app.App;
-import org.toop.framework.asset.AssetManager;
-import org.toop.framework.asset.resources.CssAsset;
-import org.toop.framework.asset.resources.LocalizationAsset;
-import org.toop.local.AppContext;
-
-import java.util.Locale;
-import java.util.ResourceBundle;
-
-public final class QuitMenu extends Menu {
- private Locale currentLocale = AppContext.getLocale();
- private LocalizationAsset loc = AssetManager.get("localization.properties");
- public QuitMenu() {
- final Region background = new Region();
- background.getStyleClass().add("quit-background");
- background.setPrefSize(Double.MAX_VALUE, Double.MAX_VALUE);
-
- final Text sure = new Text(loc.getString("quitMenuTextSure", currentLocale));
- sure.getStyleClass().add("quit-text");
-
- final Button yes = new Button(loc.getString("quitMenuButtonYes", currentLocale));
- yes.getStyleClass().add("quit-button");
- yes.setOnAction(_ -> {
- App.quit();
- });
-
- final Button no = new Button(loc.getString("quitMenuButtonNo", currentLocale));
- no.getStyleClass().add("quit-button");
- no.setOnAction(_ -> {
- App.pop();
- });
-
- final HBox buttons = new HBox(10, yes, no);
- buttons.setAlignment(Pos.CENTER);
-
- VBox box = new VBox(43, sure, buttons);
- box.setAlignment(Pos.CENTER);
- box.getStyleClass().add("quit-box");
- box.setMaxWidth(350);
- box.setMaxHeight(200);
-
- StackPane modalContainer = new StackPane(background, box);
- StackPane.setAlignment(box, Pos.CENTER);
-
- pane = modalContainer;
- CssAsset css = AssetManager.get("quit.css");
- pane.getStylesheets().add(css.getUrl());
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/org/toop/app/menu/game/GameMenu.java b/app/src/main/java/org/toop/app/menu/game/GameMenu.java
new file mode 100644
index 0000000..4efa4ff
--- /dev/null
+++ b/app/src/main/java/org/toop/app/menu/game/GameMenu.java
@@ -0,0 +1,99 @@
+package org.toop.app.menu.game;
+
+import javafx.geometry.Pos;
+import javafx.scene.canvas.Canvas;
+import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.control.Button;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.Region;
+import javafx.scene.layout.StackPane;
+import javafx.scene.layout.VBox;
+import javafx.scene.text.Text;
+import org.toop.app.App;
+import org.toop.app.menu.MainMenu;
+import org.toop.app.menu.Menu;
+
+public abstract class GameMenu extends Menu {
+ protected final class Cell {
+ public float x;
+ public float y;
+
+ public float width;
+ public float height;
+
+ public Cell(float x, float y, float width, float height) {
+ this.x = x;
+ this.y = y;
+
+ this.width = width;
+ this.height = height;
+ }
+
+ public boolean check(float x, float y) {
+ return x >= this.x && y >= this.y && x <= this.x + width && y <= this.y + height;
+ }
+ }
+
+ protected final int size;
+
+ protected final Canvas canvas;
+ protected final GraphicsContext graphics;
+
+ protected final int rows;
+ protected final int columns;
+
+ protected final int gapSize;
+
+ protected final Cell[] cells;
+
+ protected GameMenu(int rows, int columns, int gapSize) {
+ final int size = Math.min(App.getWidth(), App.getHeight()) / 5 * 4;
+
+ final Canvas canvas = new Canvas(size, size);
+
+ final GraphicsContext graphics = canvas.getGraphicsContext2D();
+
+ this.size = size;
+
+ this.canvas = canvas;
+ this.graphics = graphics;
+
+ this.rows = rows;
+ this.columns = columns;
+
+ this.gapSize = gapSize;
+
+ cells = new Cell[rows * columns];
+
+ final float cellWidth = ((float)size - (rows - 1) * gapSize) / rows;
+ final float cellHeight = ((float)size - (columns - 1) * gapSize) / rows;
+
+ for (int y = 0; y < columns; y++) {
+ final float startY = y * cellHeight + y * gapSize;
+
+ for (int x = 0; x < rows; x++) {
+ final float startX = x * cellWidth + x * gapSize;
+ cells[y * rows + x] = new Cell(startX, startY, cellWidth, cellHeight);
+ }
+ }
+
+ final Region background = createBackground();
+
+ final Text player1 = createText("player_1", "Player 1");
+ final Text player2 = createText("player_2", "Player 2");
+
+ final HBox playersContainer = new HBox(100, player1, player2);
+ playersContainer.setAlignment(Pos.TOP_CENTER);
+ playersContainer.setPickOnBounds(false);
+ playersContainer.setTranslateY(50);
+
+ final Button hint = createButton("Hint", () -> {});
+ final Button back = createButton("Back", () -> { App.activate(new MainMenu()); });
+
+ final VBox controlContainer = new VBox(hint, back);
+ StackPane.setAlignment(controlContainer, Pos.BOTTOM_LEFT);
+ controlContainer.setPickOnBounds(false);
+
+ pane = new StackPane(background, canvas, playersContainer, controlContainer);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/toop/app/menu/game/TicTacToeMenu.java b/app/src/main/java/org/toop/app/menu/game/TicTacToeMenu.java
new file mode 100644
index 0000000..6295b7f
--- /dev/null
+++ b/app/src/main/java/org/toop/app/menu/game/TicTacToeMenu.java
@@ -0,0 +1,133 @@
+package org.toop.app.menu.game;
+
+import javafx.scene.paint.Color;
+import org.toop.game.Game;
+import org.toop.game.Player;
+import org.toop.game.tictactoe.TicTacToe;
+import org.toop.game.tictactoe.TicTacToeAI;
+
+import javax.management.RuntimeErrorException;
+import java.util.concurrent.*;
+
+public final class TicTacToeMenu extends GameMenu {
+ private final TicTacToe game;
+ private final TicTacToeAI ai;
+
+// private final ExecutorService executor = Executors.newFixedThreadPool(1);
+ private final BlockingQueue moveQueue = new LinkedBlockingQueue<>();
+
+ public TicTacToeMenu(TicTacToe game) {
+ super(3, 3, 10);
+
+ graphics.setFill(Color.CYAN);
+
+ for (int x = 1; x < rows; x++) {
+ graphics.fillRect(cells[x].x - gapSize, 0, gapSize, size);
+ }
+
+ for (int y = 1; y < columns; y++) {
+ graphics.fillRect(0, cells[y * rows].y - gapSize, size, gapSize);
+ }
+
+ this.game = game;
+ ai = new TicTacToeAI();
+
+ canvas.setOnMouseClicked(event -> {
+ for (int i = 0; i < cells.length; i++) {
+ if (cells[i].check((float) event.getX(), (float) event.getY())) {
+ final Game.Move move = new Game.Move(i, game.getCurrentPlayer().values()[0]);
+ play(move);
+ }
+ }
+ });
+
+ new Thread(this::gameThread).start();
+ }
+
+ private void play(Game.Move move) {
+ final Game.Move[] legalMoves = game.getLegalMoves();
+
+ boolean isLegal = false;
+
+ for (final Game.Move legalMove : legalMoves) {
+ if (legalMove.position() == move.position() && legalMove.value() == move.value()) {
+ isLegal = true;
+ break;
+ }
+ }
+
+ if (!isLegal) {
+ return;
+ }
+
+ try { moveQueue.put(move); }
+ catch (InterruptedException _) {}
+ }
+
+ private void placeX(int cell) {
+ graphics.setStroke(Color.ORANGERED);
+ graphics.setLineWidth(gapSize);
+
+ final float x = cells[cell].x + gapSize;
+ final float y = cells[cell].y + gapSize;
+
+ final float width = cells[cell].width - gapSize * 2;
+ final float height = cells[cell].height - gapSize * 2;
+
+ graphics.strokeLine(x, y, x + width, y + height);
+ graphics.strokeLine(x + width, y, x, y + height);
+ }
+
+ private void placeO(int cell) {
+ graphics.setStroke(Color.DEEPSKYBLUE);
+ graphics.setLineWidth(gapSize);
+
+ final float x = cells[cell].x + gapSize;
+ final float y = cells[cell].y + gapSize;
+
+ final float width = cells[cell].width - gapSize * 2;
+ final float height = cells[cell].height - gapSize * 2;
+
+ graphics.strokeOval(x, y, width, height);
+ }
+
+ private void gameThread() {
+ boolean running = true;
+
+ while(running) {
+ final Player currentPlayer = game.getCurrentPlayer();
+
+ try {
+ Game.Move move;
+
+ if (!currentPlayer.isAI()) {
+ try { move = moveQueue.take(); }
+ catch (InterruptedException _) { return; }
+ } else {
+ move = ai.findBestMove(game, 9);
+ }
+
+ assert move != null;
+ final Game.State state = game.play(move);
+
+ if (move.value() == 'X') {
+ placeX(move.position());
+ } else {
+ placeO(move.position());
+ }
+
+ switch (state) {
+ case NORMAL: break;
+
+ case DRAW:
+ case LOSE:
+ case WIN:
+ running = false;
+ break;
+ }
+ } catch (RuntimeException e) {
+ return;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/resources/assets/image/background.jpg b/app/src/main/resources/assets/image/background.jpg
deleted file mode 100644
index 0e5a01f..0000000
Binary files a/app/src/main/resources/assets/image/background.jpg and /dev/null differ
diff --git a/app/src/main/resources/assets/image/battleship.png b/app/src/main/resources/assets/image/battleship.png
deleted file mode 100644
index 813893f..0000000
Binary files a/app/src/main/resources/assets/image/battleship.png and /dev/null differ
diff --git a/app/src/main/resources/assets/image/icon.png b/app/src/main/resources/assets/image/icon.png
deleted file mode 100644
index d627e6a..0000000
Binary files a/app/src/main/resources/assets/image/icon.png and /dev/null differ
diff --git a/app/src/main/resources/assets/image/lowpoly.png b/app/src/main/resources/assets/image/lowpoly.png
new file mode 100644
index 0000000..6565080
Binary files /dev/null and b/app/src/main/resources/assets/image/lowpoly.png differ
diff --git a/app/src/main/resources/assets/image/other.png b/app/src/main/resources/assets/image/other.png
deleted file mode 100644
index 6bd4167..0000000
Binary files a/app/src/main/resources/assets/image/other.png and /dev/null differ
diff --git a/app/src/main/resources/assets/image/reversi.png b/app/src/main/resources/assets/image/reversi.png
deleted file mode 100644
index bd9252f..0000000
Binary files a/app/src/main/resources/assets/image/reversi.png and /dev/null differ
diff --git a/app/src/main/resources/assets/image/sudoku.png b/app/src/main/resources/assets/image/sudoku.png
deleted file mode 100644
index ec88234..0000000
Binary files a/app/src/main/resources/assets/image/sudoku.png and /dev/null differ
diff --git a/app/src/main/resources/assets/image/tictactoe.png b/app/src/main/resources/assets/image/tictactoe.png
deleted file mode 100644
index 2a81e05..0000000
Binary files a/app/src/main/resources/assets/image/tictactoe.png and /dev/null differ
diff --git a/app/src/main/resources/assets/style/app.css b/app/src/main/resources/assets/style/app.css
new file mode 100644
index 0000000..de9330f
--- /dev/null
+++ b/app/src/main/resources/assets/style/app.css
@@ -0,0 +1,37 @@
+.background {
+ -fx-background-color: linear-gradient(to bottom right, #21a7b2, #8f32b9);
+}
+
+.text {
+ -fx-fill: white;
+
+ -fx-font-family: "Segoe UI", sans-serif;
+ -fx-font-weight: bold;
+ -fx-font-size: 24px;
+}
+
+.button, .text-field, .combo-box, .combo-box-popup .list-cell {
+ -fx-padding: 10 20;
+
+ -fx-background-color: transparent;
+ -fx-border-color: transparent;
+}
+
+.combo-box-popup .list-view {
+ -fx-background-color: #1d1d1d;
+}
+
+.text-field {
+ -fx-text-fill: white;
+}
+
+.button:hover, .text-field:hover, .combo-box:hover, .combo-box-popup .list-cell:hover {
+ -fx-cursor: hand;
+
+ -fx-effect: dropshadow(gaussian, #00ffff7f, 10, 0.5, 0, 0);
+ -fx-border-color: white;
+}
+
+.text-field:focused, .combo-box:focused {
+ -fx-border-color: white;
+}
\ No newline at end of file
diff --git a/app/src/main/resources/assets/style/main.css b/app/src/main/resources/assets/style/main.css
deleted file mode 100644
index b6abd24..0000000
--- a/app/src/main/resources/assets/style/main.css
+++ /dev/null
@@ -1,32 +0,0 @@
-.main-button {
- -fx-background-color: transparent;
- -fx-background-size: cover;
- -fx-background-position: center;
- -fx-pref-width: 250px;
- -fx-pref-height: 180px;
- -fx-border-radius: 15;
- -fx-background-radius: 15;
- -fx-effect: dropshadow(gaussian, rgba(0,0,0,0.3), 15, 0.4, 0, 4);
- -fx-cursor: hand;
- -fx-padding: 0;
-}
-
-.card-label {
- -fx-background-color: rgba(0, 0, 0, 0.5);
- -fx-font-size: 20px;
- -fx-font-weight: bold;
- -fx-text-fill: white;
- -fx-padding: 10px;
- -fx-alignment: top-center;
- -fx-background-radius: 15 15 0 0;
- -fx-opacity: 0;
- -fx-transition: all 0.3s ease;
-}
-
-.main-button:hover {
- -fx-effect: dropshadow(gaussian, #00ffff, 15, 0.5, 0, 0);
-}
-
-.main-button:hover .card-label {
- -fx-opacity: 1;
-}
\ No newline at end of file
diff --git a/app/src/main/resources/assets/style/quit.css b/app/src/main/resources/assets/style/quit.css
index 212734d..b99b206 100644
--- a/app/src/main/resources/assets/style/quit.css
+++ b/app/src/main/resources/assets/style/quit.css
@@ -1,33 +1,8 @@
-.quit-background {
+.quit_background {
-fx-background-color: rgba(0, 0, 0, 0.6);
}
-.quit-box {
- -fx-background-color: rgba(30, 30, 30, 0.95);
+.quit_box {
+ -fx-background-color: rgba(30, 30, 30, 0.5);
-fx-background-radius: 15;
- -fx-padding: 30;
- -fx-effect: dropshadow(gaussian, black, 20, 0.6, 0, 4);
-}
-
-.quit-text {
- -fx-fill: white;
- -fx-font-size: 28px;
- -fx-font-weight: 600;
- -fx-font-family: "Groovy Maniac Demo", sans-serif;
-}
-
-.quit-button {
- -fx-font-size: 16px;
- -fx-text-fill: white;
- -fx-background-color: transparent;
- -fx-border-color: white;
- -fx-border-radius: 5;
- -fx-padding: 8 20;
- -fx-cursor: hand;
-}
-
-.quit-button:hover {
- -fx-text-fill: #00ffff;
- -fx-border-color: #00ffff;
- -fx-effect: dropshadow(gaussian, #00ffff, 8, 0.5, 0, 0);
}
\ No newline at end of file
diff --git a/app/src/main/resources/assets/style/style.css b/app/src/main/resources/assets/style/style.css
deleted file mode 100644
index c09d516..0000000
--- a/app/src/main/resources/assets/style/style.css
+++ /dev/null
@@ -1,20 +0,0 @@
-.root {
- -fx-background-color: #2d2d2d;
-
- -fx-font-size: 28px;
- -fx-font-weight: 600;
- -fx-font-family: "Segoe UI", sans-serif;
-}
-
-.button {
- -fx-background-color: transparent;
- -fx-text-fill: white;
- -fx-border-color: transparent;
- -fx-padding: 10 20;
- -fx-cursor: hand;
- -fx-effect: null;
-}
-
-.button:hover {
- -fx-effect: dropshadow(gaussian, #00ffff, 10, 0.3, 0, 0);
-}
\ No newline at end of file
diff --git a/framework/src/main/java/org/toop/framework/asset/AssetLoader.java b/framework/src/main/java/org/toop/framework/asset/ResourceLoader.java
similarity index 89%
rename from framework/src/main/java/org/toop/framework/asset/AssetLoader.java
rename to framework/src/main/java/org/toop/framework/asset/ResourceLoader.java
index 93ac189..f8af740 100644
--- a/framework/src/main/java/org/toop/framework/asset/AssetLoader.java
+++ b/framework/src/main/java/org/toop/framework/asset/ResourceLoader.java
@@ -4,6 +4,9 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.toop.framework.asset.events.AssetLoaderEvents;
import org.toop.framework.asset.resources.*;
+import org.toop.framework.asset.types.BundledResource;
+import org.toop.framework.asset.types.FileExtension;
+import org.toop.framework.asset.types.PreloadResource;
import org.toop.framework.eventbus.EventFlow;
import org.reflections.Reflections;
@@ -17,7 +20,7 @@ import java.util.function.Function;
/**
* Responsible for loading assets from a file system directory into memory.
*
- * The {@code AssetLoader} scans a root folder recursively, identifies files,
+ * The {@code ResourceLoader} scans a root folder recursively, identifies files,
* and maps them to registered resource types based on file extensions and
* {@link FileExtension} annotations.
* It supports multiple resource types including {@link PreloadResource} (automatically loaded)
@@ -25,7 +28,7 @@ import java.util.function.Function;
*
*
*
Assets are stored in a static, thread-safe list and can be retrieved
- * through {@link AssetManager}.
*/
-public class AssetLoader {
- private static final Logger logger = LogManager.getLogger(AssetLoader.class);
- private static final List> assets = new CopyOnWriteArrayList<>();
+public class ResourceLoader {
+ private static final Logger logger = LogManager.getLogger(ResourceLoader.class);
+ private static final List> assets = new CopyOnWriteArrayList<>();
private final Map> registry = new ConcurrentHashMap<>();
private final AtomicInteger loadedCount = new AtomicInteger(0);
private int totalCount = 0;
/**
- * Constructs an AssetLoader and loads assets from the given root folder.
+ * Constructs an ResourceLoader and loads assets from the given root folder.
* @param rootFolder the folder containing asset files
*/
- public AssetLoader(File rootFolder) {
+ public ResourceLoader(File rootFolder) {
autoRegisterResources();
List foundFiles = new ArrayList<>();
fileSearcher(rootFolder, foundFiles);
@@ -80,10 +83,10 @@ public class AssetLoader {
}
/**
- * Constructs an AssetLoader from a folder path.
+ * Constructs an ResourceLoader from a folder path.
* @param rootFolder the folder path containing assets
*/
- public AssetLoader(String rootFolder) {
+ public ResourceLoader(String rootFolder) {
this(new File(rootFolder));
}
@@ -115,7 +118,7 @@ public class AssetLoader {
* Returns a snapshot list of all assets loaded by this loader.
* @return list of loaded assets
*/
- public List> getAssets() {
+ public List> getAssets() {
return new ArrayList<>(assets);
}
@@ -179,7 +182,7 @@ public class AssetLoader {
boolean alreadyAdded = assets.stream()
.anyMatch(a -> a.getResource() == finalResource);
if (!alreadyAdded) {
- assets.add(new Asset<>(file.getName(), resource));
+ assets.add(new ResourceMeta<>(file.getName(), resource));
}
logger.info("Loaded {} from {}", resource.getClass().getSimpleName(), file.getAbsolutePath());
diff --git a/framework/src/main/java/org/toop/framework/asset/AssetManager.java b/framework/src/main/java/org/toop/framework/asset/ResourceManager.java
similarity index 57%
rename from framework/src/main/java/org/toop/framework/asset/AssetManager.java
rename to framework/src/main/java/org/toop/framework/asset/ResourceManager.java
index 1630ae0..982caeb 100644
--- a/framework/src/main/java/org/toop/framework/asset/AssetManager.java
+++ b/framework/src/main/java/org/toop/framework/asset/ResourceManager.java
@@ -8,9 +8,9 @@ import java.util.concurrent.ConcurrentHashMap;
/**
* Centralized manager for all loaded assets in the application.
*
- * {@code AssetManager} maintains a thread-safe registry of {@link Asset} objects
+ * {@code ResourceManager} maintains a thread-safe registry of {@link Asset} objects
* and provides utility methods to retrieve assets by name, ID, or type.
- * It works together with {@link AssetLoader} to register assets automatically
+ * It works together with {@link ResourceLoader} to register assets automatically
* when they are loaded from the file system.
*
{@code
* // Load assets from a loader
- * AssetLoader loader = new AssetLoader(new File("RootFolder"));
- * AssetManager.loadAssets(loader);
+ * ResourceLoader loader = new ResourceLoader(new File("RootFolder"));
+ * ResourceManager.loadAssets(loader);
*
* // Retrieve a single resource
- * ImageAsset background = AssetManager.get("background.jpg");
+ * ImageAsset background = ResourceManager.get("background.jpg");
*
* // Retrieve all fonts
- * List> fonts = AssetManager.getAllOfType(FontAsset.class);
+ * List> fonts = ResourceManager.getAllOfType(FontAsset.class);
*
* // Retrieve by asset name or optional lookup
- * Optional> maybeAsset = AssetManager.findByName("menu.css");
+ * Optional> maybeAsset = ResourceManager.findByName("menu.css");
* }
*
*
Notes:
*
*
All retrieval methods are static and thread-safe.
*
The {@link #get(String)} method may require casting if the asset type is not known at compile time.
- *
Assets should be loaded via {@link AssetLoader} before retrieval.
+ *
Assets should be loaded via {@link ResourceLoader} before retrieval.
*
*/
-public class AssetManager {
- private static final AssetManager INSTANCE = new AssetManager();
- private static final Map> assets = new ConcurrentHashMap<>();
+public class ResourceManager {
+ private static final ResourceManager INSTANCE = new ResourceManager();
+ private static final Map> assets = new ConcurrentHashMap<>();
- private AssetManager() {}
+ private ResourceManager() {}
/**
- * Returns the singleton instance of {@code AssetManager}.
+ * Returns the singleton instance of {@code ResourceManager}.
*
* @return the shared instance
*/
- public static AssetManager getInstance() {
+ public static ResourceManager getInstance() {
return INSTANCE;
}
/**
- * Loads all assets from a given {@link AssetLoader} into the manager.
+ * Loads all assets from a given {@link ResourceLoader} into the manager.
*
* @param loader the loader that has already loaded assets
*/
- public synchronized static void loadAssets(AssetLoader loader) {
+ public synchronized static void loadAssets(ResourceLoader loader) {
for (var asset : loader.getAssets()) {
assets.put(asset.getName(), asset);
}
@@ -80,11 +80,23 @@ public class AssetManager {
*/
@SuppressWarnings("unchecked")
public static T get(String name) {
- Asset asset = (Asset) assets.get(name);
+ ResourceMeta asset = (ResourceMeta) assets.get(name);
if (asset == null) return null;
return asset.getResource();
}
+ /**
+ * Retrieve the resource of a given name, cast to the expected type.
+ *
+ * @param name the asset name
+ * @param the expected resource type
+ * @return the resource, or null if not found
+ */
+ @SuppressWarnings("unchecked")
+ public static T get(Class type, String name) {
+ return type.cast(assets.get(name).getResource());
+ }
+
/**
* Retrieve all assets of a specific resource type.
*
@@ -92,12 +104,12 @@ public class AssetManager {
* @param the resource type
* @return a list of assets matching the type
*/
- public static ArrayList> getAllOfType(Class type) {
- ArrayList> list = new ArrayList<>();
- for (Asset extends BaseResource> asset : assets.values()) {
+ public static ArrayList> getAllOfType(Class type) {
+ ArrayList> list = new ArrayList<>();
+ for (ResourceMeta extends BaseResource> asset : assets.values()) {
if (type.isInstance(asset.getResource())) {
@SuppressWarnings("unchecked")
- Asset typed = (Asset) asset;
+ ResourceMeta typed = (ResourceMeta) asset;
list.add(typed);
}
}
@@ -110,8 +122,8 @@ public class AssetManager {
* @param id the asset ID
* @return the asset, or null if not found
*/
- public static Asset extends BaseResource> getById(String id) {
- for (Asset extends BaseResource> asset : assets.values()) {
+ public static ResourceMeta extends BaseResource> getById(String id) {
+ for (ResourceMeta extends BaseResource> asset : assets.values()) {
if (asset.getId().toString().equals(id)) {
return asset;
}
@@ -125,7 +137,7 @@ public class AssetManager {
* @param name the asset name
* @return the asset, or null if not found
*/
- public static Asset extends BaseResource> getByName(String name) {
+ public static ResourceMeta extends BaseResource> getByName(String name) {
return assets.get(name);
}
@@ -135,7 +147,7 @@ public class AssetManager {
* @param name the asset name
* @return an Optional containing the asset if found
*/
- public static Optional> findByName(String name) {
+ public static Optional> findByName(String name) {
return Optional.ofNullable(assets.get(name));
}
@@ -144,7 +156,7 @@ public class AssetManager {
*
* @param asset the asset to add
*/
- public static void addAsset(Asset extends BaseResource> asset) {
+ public static void addAsset(ResourceMeta extends BaseResource> asset) {
assets.put(asset.getName(), asset);
}
}
diff --git a/framework/src/main/java/org/toop/framework/asset/Asset.java b/framework/src/main/java/org/toop/framework/asset/ResourceMeta.java
similarity index 83%
rename from framework/src/main/java/org/toop/framework/asset/Asset.java
rename to framework/src/main/java/org/toop/framework/asset/ResourceMeta.java
index 9f1f488..972b635 100644
--- a/framework/src/main/java/org/toop/framework/asset/Asset.java
+++ b/framework/src/main/java/org/toop/framework/asset/ResourceMeta.java
@@ -3,12 +3,12 @@ package org.toop.framework.asset;
import org.toop.framework.SnowflakeGenerator;
import org.toop.framework.asset.resources.BaseResource;
-public class Asset {
+public class ResourceMeta {
private final Long id;
private final String name;
private final T resource;
- public Asset(String name, T resource) {
+ public ResourceMeta(String name, T resource) {
this.id = new SnowflakeGenerator().nextId();
this.name = name;
this.resource = resource;
diff --git a/framework/src/main/java/org/toop/framework/asset/resources/CssAsset.java b/framework/src/main/java/org/toop/framework/asset/resources/CssAsset.java
index 367fe80..6f8cd19 100644
--- a/framework/src/main/java/org/toop/framework/asset/resources/CssAsset.java
+++ b/framework/src/main/java/org/toop/framework/asset/resources/CssAsset.java
@@ -1,5 +1,7 @@
package org.toop.framework.asset.resources;
+import org.toop.framework.asset.types.FileExtension;
+
import java.io.File;
@FileExtension({"css"})
diff --git a/framework/src/main/java/org/toop/framework/asset/resources/FontAsset.java b/framework/src/main/java/org/toop/framework/asset/resources/FontAsset.java
index 4835f0f..1054d03 100644
--- a/framework/src/main/java/org/toop/framework/asset/resources/FontAsset.java
+++ b/framework/src/main/java/org/toop/framework/asset/resources/FontAsset.java
@@ -1,6 +1,9 @@
package org.toop.framework.asset.resources;
import javafx.scene.text.Font;
+import org.toop.framework.asset.types.FileExtension;
+import org.toop.framework.asset.types.PreloadResource;
+
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
diff --git a/framework/src/main/java/org/toop/framework/asset/resources/ImageAsset.java b/framework/src/main/java/org/toop/framework/asset/resources/ImageAsset.java
index 3cc0a3b..ed2c87e 100644
--- a/framework/src/main/java/org/toop/framework/asset/resources/ImageAsset.java
+++ b/framework/src/main/java/org/toop/framework/asset/resources/ImageAsset.java
@@ -1,6 +1,9 @@
package org.toop.framework.asset.resources;
import javafx.scene.image.Image;
+import org.toop.framework.asset.types.FileExtension;
+import org.toop.framework.asset.types.LoadableResource;
+
import java.io.File;
import java.io.FileInputStream;
diff --git a/framework/src/main/java/org/toop/framework/asset/resources/LocalizationAsset.java b/framework/src/main/java/org/toop/framework/asset/resources/LocalizationAsset.java
index 39862c4..c2efcc1 100644
--- a/framework/src/main/java/org/toop/framework/asset/resources/LocalizationAsset.java
+++ b/framework/src/main/java/org/toop/framework/asset/resources/LocalizationAsset.java
@@ -1,5 +1,9 @@
package org.toop.framework.asset.resources;
+import org.toop.framework.asset.types.BundledResource;
+import org.toop.framework.asset.types.FileExtension;
+import org.toop.framework.asset.types.LoadableResource;
+
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;
diff --git a/framework/src/main/java/org/toop/framework/asset/resources/MusicAsset.java b/framework/src/main/java/org/toop/framework/asset/resources/MusicAsset.java
index 87c27f6..fc6eec7 100644
--- a/framework/src/main/java/org/toop/framework/asset/resources/MusicAsset.java
+++ b/framework/src/main/java/org/toop/framework/asset/resources/MusicAsset.java
@@ -1,6 +1,8 @@
package org.toop.framework.asset.resources;
import javafx.scene.media.Media;
+import org.toop.framework.asset.types.FileExtension;
+import org.toop.framework.asset.types.LoadableResource;
import java.io.*;
diff --git a/framework/src/main/java/org/toop/framework/asset/resources/SoundEffectAsset.java b/framework/src/main/java/org/toop/framework/asset/resources/SoundEffectAsset.java
index c9c81a8..1d0cedd 100644
--- a/framework/src/main/java/org/toop/framework/asset/resources/SoundEffectAsset.java
+++ b/framework/src/main/java/org/toop/framework/asset/resources/SoundEffectAsset.java
@@ -1,10 +1,10 @@
package org.toop.framework.asset.resources;
-import javafx.scene.media.Media;
+import org.toop.framework.asset.types.FileExtension;
+import org.toop.framework.asset.types.LoadableResource;
import javax.sound.sampled.*;
import java.io.*;
-import java.net.URI;
@FileExtension({"wav"})
public class SoundEffectAsset extends BaseResource implements LoadableResource {
diff --git a/framework/src/main/java/org/toop/framework/asset/resources/TextAsset.java b/framework/src/main/java/org/toop/framework/asset/resources/TextAsset.java
index 8fc51bc..e6acc3c 100644
--- a/framework/src/main/java/org/toop/framework/asset/resources/TextAsset.java
+++ b/framework/src/main/java/org/toop/framework/asset/resources/TextAsset.java
@@ -1,5 +1,8 @@
package org.toop.framework.asset.resources;
+import org.toop.framework.asset.types.FileExtension;
+import org.toop.framework.asset.types.LoadableResource;
+
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
diff --git a/framework/src/main/java/org/toop/framework/asset/resources/BundledResource.java b/framework/src/main/java/org/toop/framework/asset/types/BundledResource.java
similarity index 93%
rename from framework/src/main/java/org/toop/framework/asset/resources/BundledResource.java
rename to framework/src/main/java/org/toop/framework/asset/types/BundledResource.java
index b6559b8..1b7f97e 100644
--- a/framework/src/main/java/org/toop/framework/asset/resources/BundledResource.java
+++ b/framework/src/main/java/org/toop/framework/asset/types/BundledResource.java
@@ -1,4 +1,6 @@
-package org.toop.framework.asset.resources;
+package org.toop.framework.asset.types;
+
+import org.toop.framework.asset.ResourceLoader;
import java.io.File;
@@ -6,7 +8,7 @@ import java.io.File;
* Represents a resource that can be composed of multiple files, or "bundled" together
* under a common base name.
*
- *
Implementing classes allow an {@link org.toop.framework.asset.AssetLoader}
+ *
Implementing classes allow an {@link ResourceLoader}
* to automatically merge multiple related files into a single resource instance.
*
*
Typical use cases include:
diff --git a/framework/src/main/java/org/toop/framework/asset/resources/FileExtension.java b/framework/src/main/java/org/toop/framework/asset/types/FileExtension.java
similarity index 85%
rename from framework/src/main/java/org/toop/framework/asset/resources/FileExtension.java
rename to framework/src/main/java/org/toop/framework/asset/types/FileExtension.java
index 1beb405..b3c42d5 100644
--- a/framework/src/main/java/org/toop/framework/asset/resources/FileExtension.java
+++ b/framework/src/main/java/org/toop/framework/asset/types/FileExtension.java
@@ -1,4 +1,7 @@
-package org.toop.framework.asset.resources;
+package org.toop.framework.asset.types;
+
+import org.toop.framework.asset.ResourceLoader;
+import org.toop.framework.asset.resources.BaseResource;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -9,7 +12,7 @@ import java.lang.annotation.ElementType;
* Annotation to declare which file extensions a {@link BaseResource} subclass
* can handle.
*
- *
This annotation is processed by the {@link org.toop.framework.asset.AssetLoader}
+ *
This annotation is processed by the {@link ResourceLoader}
* to automatically register resource types for specific file extensions.
* Each extension listed will be mapped to the annotated resource class,
* allowing the loader to instantiate the correct type when scanning files.
diff --git a/framework/src/main/java/org/toop/framework/asset/resources/LoadableResource.java b/framework/src/main/java/org/toop/framework/asset/types/LoadableResource.java
similarity index 92%
rename from framework/src/main/java/org/toop/framework/asset/resources/LoadableResource.java
rename to framework/src/main/java/org/toop/framework/asset/types/LoadableResource.java
index 69374f7..d25ba9e 100644
--- a/framework/src/main/java/org/toop/framework/asset/resources/LoadableResource.java
+++ b/framework/src/main/java/org/toop/framework/asset/types/LoadableResource.java
@@ -1,4 +1,6 @@
-package org.toop.framework.asset.resources;
+package org.toop.framework.asset.types;
+
+import org.toop.framework.asset.ResourceLoader;
/**
* Represents a resource that can be explicitly loaded and unloaded.
@@ -40,7 +42,7 @@ package org.toop.framework.asset.resources;
* }
*
*
This interface is commonly used with {@link PreloadResource} to allow automatic
- * loading by an {@link org.toop.framework.asset.AssetLoader} if desired.
+ * loading by an {@link ResourceLoader} if desired.
*/
public interface LoadableResource {
/**
diff --git a/framework/src/main/java/org/toop/framework/asset/resources/PreloadResource.java b/framework/src/main/java/org/toop/framework/asset/types/PreloadResource.java
similarity index 87%
rename from framework/src/main/java/org/toop/framework/asset/resources/PreloadResource.java
rename to framework/src/main/java/org/toop/framework/asset/types/PreloadResource.java
index 6458751..07d213d 100644
--- a/framework/src/main/java/org/toop/framework/asset/resources/PreloadResource.java
+++ b/framework/src/main/java/org/toop/framework/asset/types/PreloadResource.java
@@ -1,13 +1,15 @@
-package org.toop.framework.asset.resources;
+package org.toop.framework.asset.types;
+
+import org.toop.framework.asset.ResourceLoader;
/**
- * Marker interface for resources that should be **automatically loaded** by the {@link org.toop.framework.asset.AssetLoader}.
+ * Marker interface for resources that should be **automatically loaded** by the {@link ResourceLoader}.
*
*
Extends {@link LoadableResource}, so any implementing class must provide the standard
* {@link LoadableResource#load()} and {@link LoadableResource#unload()} methods, as well as the
* {@link LoadableResource#isLoaded()} check.
*
- *
When a resource implements {@code PreloadResource}, the {@code AssetLoader} will invoke
+ *
When a resource implements {@code PreloadResource}, the {@code ResourceLoader} will invoke
* {@link LoadableResource#load()} automatically after the resource is discovered and instantiated,
* without requiring manual loading by the user.