From ccc8ba3b79f23ee76284c388f1efa6ad3efa4548 Mon Sep 17 00:00:00 2001 From: lieght <49651652+BAFGdeJong@users.noreply.github.com> Date: Thu, 2 Oct 2025 21:47:18 +0200 Subject: [PATCH] Renamed assetmanager to resourcemanager --- app/pom.xml | 35 +++- app/src/main/java/org/toop/Main.java | 6 +- app/src/main/java/org/toop/app/App.java | 12 +- .../java/org/toop/app/menu/CreditsMenu.java | 5 +- .../java/org/toop/app/menu/OptionsMenu.java | 5 +- .../org/toop/app/menu/game/TicTacToeMenu.java | 14 +- .../localization/localization.properties | 4 +- .../{AssetLoader.java => ResourceLoader.java} | 27 +-- ...AssetManager.java => ResourceManager.java} | 64 ++++--- .../asset/{Asset.java => ResourceMeta.java} | 4 +- .../framework/asset/resources/CssAsset.java | 2 + .../framework/asset/resources/FontAsset.java | 3 + .../framework/asset/resources/ImageAsset.java | 3 + .../asset/resources/LocalizationAsset.java | 4 + .../framework/asset/resources/MusicAsset.java | 2 + .../asset/resources/SoundEffectAsset.java | 4 +- .../framework/asset/resources/TextAsset.java | 3 + .../{resources => types}/BundledResource.java | 6 +- .../{resources => types}/FileExtension.java | 7 +- .../LoadableResource.java | 6 +- .../{resources => types}/PreloadResource.java | 8 +- .../toop/framework/audio/SoundManager.java | 30 ++-- .../test/java/org/toop/game/PlayerTest.java | 96 +++++----- .../toop/game/tictactoe/TicTacToeAITest.java | 166 +++++++++--------- pom.xml | 76 ++------ 25 files changed, 300 insertions(+), 292 deletions(-) rename framework/src/main/java/org/toop/framework/asset/{AssetLoader.java => ResourceLoader.java} (89%) rename framework/src/main/java/org/toop/framework/asset/{AssetManager.java => ResourceManager.java} (57%) rename framework/src/main/java/org/toop/framework/asset/{Asset.java => ResourceMeta.java} (83%) rename framework/src/main/java/org/toop/framework/asset/{resources => types}/BundledResource.java (93%) rename framework/src/main/java/org/toop/framework/asset/{resources => types}/FileExtension.java (85%) rename framework/src/main/java/org/toop/framework/asset/{resources => types}/LoadableResource.java (92%) rename framework/src/main/java/org/toop/framework/asset/{resources => types}/PreloadResource.java (87%) diff --git a/app/pom.xml b/app/pom.xml index 17ed5af..3f06d12 100644 --- a/app/pom.xml +++ b/app/pom.xml @@ -44,14 +44,33 @@ 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 + + + + + com.diffplug.spotless diff --git a/app/src/main/java/org/toop/Main.java b/app/src/main/java/org/toop/Main.java index 1c3e936..a94799b 100644 --- a/app/src/main/java/org/toop/Main.java +++ b/app/src/main/java/org/toop/Main.java @@ -1,8 +1,8 @@ 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; @@ -14,7 +14,7 @@ public final class Main { } 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 6c6c284..bf797b6 100644 --- a/app/src/main/java/org/toop/app/App.java +++ b/app/src/main/java/org/toop/app/App.java @@ -13,8 +13,10 @@ 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.ResourceManager; import org.toop.framework.asset.resources.CssAsset; +import org.toop.framework.audio.events.AudioEvents; +import org.toop.framework.eventbus.EventFlow; public final class App extends Application { private static Stage stage; @@ -44,7 +46,8 @@ public final class App extends Application { box.setMaxHeight(200); pane = new StackPane(background, box); - pane.getStylesheets().add(((CssAsset)AssetManager.get("quit.css")).getUrl()); + pane.getStylesheets().add(ResourceManager.get(CssAsset.class, "quit.css").getUrl()); + } } @@ -57,7 +60,7 @@ public final class App extends Application { final StackPane root = new StackPane(new MainMenu().getPane()); final Scene scene = new Scene(root); - scene.getStylesheets().add(((CssAsset)AssetManager.get("app.css")).getUrl()); + scene.getStylesheets().add(((CssAsset) ResourceManager.get("app.css")).getUrl()); stage.setTitle("pism"); stage.setMinWidth(1080); @@ -82,6 +85,9 @@ public final class App extends Application { 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; } 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/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/game/TicTacToeMenu.java b/app/src/main/java/org/toop/app/menu/game/TicTacToeMenu.java index 5b2421b..6295b7f 100644 --- a/app/src/main/java/org/toop/app/menu/game/TicTacToeMenu.java +++ b/app/src/main/java/org/toop/app/menu/game/TicTacToeMenu.java @@ -6,16 +6,14 @@ import org.toop.game.Player; import org.toop.game.tictactoe.TicTacToe; import org.toop.game.tictactoe.TicTacToeAI; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingQueue; +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 ExecutorService executor = Executors.newFixedThreadPool(1); private final BlockingQueue moveQueue = new LinkedBlockingQueue<>(); public TicTacToeMenu(TicTacToe game) { @@ -43,7 +41,7 @@ public final class TicTacToeMenu extends GameMenu { } }); - this.executor.submit(this::gameThread); + new Thread(this::gameThread).start(); } private void play(Game.Move move) { @@ -130,8 +128,6 @@ public final class TicTacToeMenu extends GameMenu { } catch (RuntimeException e) { return; } - } - - executor.close(); + } } } \ No newline at end of file diff --git a/app/src/main/resources/assets/localization/localization.properties b/app/src/main/resources/assets/localization/localization.properties index fcbc8ac..9718bf0 100644 --- a/app/src/main/resources/assets/localization/localization.properties +++ b/app/src/main/resources/assets/localization/localization.properties @@ -2,8 +2,8 @@ windowTitle=ISY Games Selector # Main Menu buttons -mainMenuSelectTicTacToe=Tic Tac Toe\u5426 -mainMenuSelectReversi=Reversi\u5426 +mainMenuSelectTicTacToe=Tic Tac Toe +mainMenuSelectReversi=Reversi mainMenuSelectSudoku=Sudoku mainMenuSelectBattleship=Battleship mainMenuSelectOther=Other 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}.

+ * through {@link ResourceManager}.

* *

Features:

*
    @@ -38,24 +41,24 @@ import java.util.function.Function; * *

    Usage example:

    *
    {@code
    - * AssetLoader loader = new AssetLoader("assets");
    + * ResourceLoader loader = new ResourceLoader("assets");
      * double progress = loader.getProgress();
      * List> loadedAssets = loader.getAssets();
      * }
    */ -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. *

    * @@ -25,47 +25,47 @@ import java.util.concurrent.ConcurrentHashMap; *

    Example usage:

    *
    {@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 asset : assets.values()) { + public static ArrayList> getAllOfType(Class type) { + ArrayList> list = new ArrayList<>(); + for (ResourceMeta 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 getById(String id) { - for (Asset asset : assets.values()) { + public static ResourceMeta getById(String id) { + for (ResourceMeta 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 getByName(String name) { + public static ResourceMeta 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 asset) { + public static void addAsset(ResourceMeta 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.

    * diff --git a/framework/src/main/java/org/toop/framework/audio/SoundManager.java b/framework/src/main/java/org/toop/framework/audio/SoundManager.java index 6a508cc..ed71388 100644 --- a/framework/src/main/java/org/toop/framework/audio/SoundManager.java +++ b/framework/src/main/java/org/toop/framework/audio/SoundManager.java @@ -1,15 +1,15 @@ package org.toop.framework.audio; -import javafx.application.Platform; -import javafx.scene.media.MediaPlayer; import org.toop.framework.SnowflakeGenerator; -import org.toop.framework.asset.Asset; -import org.toop.framework.asset.AssetManager; +import org.toop.framework.asset.ResourceManager; +import org.toop.framework.asset.ResourceMeta; import org.toop.framework.asset.resources.MusicAsset; import org.toop.framework.asset.resources.SoundEffectAsset; import org.toop.framework.audio.events.AudioEvents; import org.toop.framework.eventbus.EventFlow; +import javafx.scene.media.MediaPlayer; + import java.io.*; import java.util.*; import javax.sound.sampled.*; @@ -25,7 +25,7 @@ public class SoundManager { public SoundManager() { // Get all Audio Resources and add them to a list. - for (Asset asset : AssetManager.getAllOfType(SoundEffectAsset.class)) { + for (ResourceMeta asset : ResourceManager.getAllOfType(SoundEffectAsset.class)) { try { this.addAudioResource(asset); } catch (IOException | LineUnavailableException | UnsupportedAudioFileException e) { @@ -58,7 +58,7 @@ public class SoundManager { this.stopSound(event.clipId()); } - private void addAudioResource(Asset audioAsset) + private void addAudioResource(ResourceMeta audioAsset) throws IOException, UnsupportedAudioFileException, LineUnavailableException { this.audioResources.put(audioAsset.getName(), audioAsset.getResource()); @@ -74,15 +74,15 @@ public class SoundManager { private void handleMusicStart(AudioEvents.StartBackgroundMusic e) { backgroundMusicQueue.clear(); - Platform.runLater(() -> { - backgroundMusicQueue.addAll( - AssetManager.getAllOfType(MusicAsset.class).stream() - .map(Asset::getResource) - .toList() - ); - backgroundMusicPlayer(); - }); - + List shuffledArray = new ArrayList<>(ResourceManager.getAllOfType(MusicAsset.class) + .stream() + .map(ResourceMeta::getResource) + .toList()); + Collections.shuffle(shuffledArray); + backgroundMusicQueue.addAll( + shuffledArray + ); + backgroundMusicPlayer(); } private void addBackgroundMusic(MusicAsset musicAsset) { diff --git a/game/src/test/java/org/toop/game/PlayerTest.java b/game/src/test/java/org/toop/game/PlayerTest.java index 3a3f14b..298c84b 100644 --- a/game/src/test/java/org/toop/game/PlayerTest.java +++ b/game/src/test/java/org/toop/game/PlayerTest.java @@ -1,48 +1,48 @@ -package org.toop.game; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class PlayerTest { - private Player playerA; - private Player playerB; - private Player playerC; - - @BeforeEach - void setup() { - playerA = new Player("test A", 'x', 'Z', 'i'); - playerB = new Player("test B", 'O', (char)12, (char)-34, 's'); - playerC = new Player("test C", (char)9, '9', (char)-9, '0', 'X', 'O'); - } - - @Test - void testNameGetter_returnsTrueForValidName() { - assertEquals("test A", playerA.name()); - assertEquals("test B", playerB.name()); - assertEquals("test C", playerC.name()); - } - - @Test - void testValuesGetter_returnsTrueForValidValues() { - final char[] valuesA = playerA.values(); - assertEquals('x', valuesA[0]); - assertEquals('Z', valuesA[1]); - assertEquals('i', valuesA[2]); - - final char[] valuesB = playerB.values(); - assertEquals('O', valuesB[0]); - assertEquals(12, valuesB[1]); - assertEquals((char)-34, valuesB[2]); - assertEquals('s', valuesB[3]); - - final char[] valuesC = playerC.values(); - assertEquals((char)9, valuesC[0]); - assertEquals('9', valuesC[1]); - assertEquals((char)-9, valuesC[2]); - assertEquals('0', valuesC[3]); - assertEquals('X', valuesC[4]); - assertEquals('O', valuesC[5]); - } -} \ No newline at end of file +//package org.toop.game; +// +//import org.junit.jupiter.api.BeforeEach; +//import org.junit.jupiter.api.Test; +// +//import static org.junit.jupiter.api.Assertions.assertEquals; +// +//class PlayerTest { +// private Player playerA; +// private Player playerB; +// private Player playerC; +// +// @BeforeEach +// void setup() { +// playerA = new Player("test A", 'x', 'Z', 'i'); +// playerB = new Player("test B", 'O', (char)12, (char)-34, 's'); +// playerC = new Player("test C", (char)9, '9', (char)-9, '0', 'X', 'O'); +// } +// +// @Test +// void testNameGetter_returnsTrueForValidName() { +// assertEquals("test A", playerA.name()); +// assertEquals("test B", playerB.name()); +// assertEquals("test C", playerC.name()); +// } +// +// @Test +// void testValuesGetter_returnsTrueForValidValues() { +// final char[] valuesA = playerA.values(); +// assertEquals('x', valuesA[0]); +// assertEquals('Z', valuesA[1]); +// assertEquals('i', valuesA[2]); +// +// final char[] valuesB = playerB.values(); +// assertEquals('O', valuesB[0]); +// assertEquals(12, valuesB[1]); +// assertEquals((char)-34, valuesB[2]); +// assertEquals('s', valuesB[3]); +// +// final char[] valuesC = playerC.values(); +// assertEquals((char)9, valuesC[0]); +// assertEquals('9', valuesC[1]); +// assertEquals((char)-9, valuesC[2]); +// assertEquals('0', valuesC[3]); +// assertEquals('X', valuesC[4]); +// assertEquals('O', valuesC[5]); +// } +//} \ No newline at end of file diff --git a/game/src/test/java/org/toop/game/tictactoe/TicTacToeAITest.java b/game/src/test/java/org/toop/game/tictactoe/TicTacToeAITest.java index a320631..fe15900 100644 --- a/game/src/test/java/org/toop/game/tictactoe/TicTacToeAITest.java +++ b/game/src/test/java/org/toop/game/tictactoe/TicTacToeAITest.java @@ -1,83 +1,83 @@ -package org.toop.game.tictactoe; - -import org.toop.game.Game; - -import java.util.Set; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -class TicTacToeAITest { - private TicTacToe game; - private TicTacToeAI ai; - - @BeforeEach - void setup() { - game = new TicTacToe("AI", "AI"); - ai = new TicTacToeAI(); - } - - @Test - void testBestMove_returnWinningMoveWithDepth1() { - // X X - - // O O - - // - - - - game.play(new Game.Move(0, 'X')); - game.play(new Game.Move(3, 'O')); - game.play(new Game.Move(1, 'X')); - game.play(new Game.Move(4, 'O')); - - final Game.Move move = ai.findBestMove(game, 1); - - assertNotNull(move); - assertEquals('X', move.value()); - assertEquals(2, move.position()); - } - - @Test - void testBestMove_blockOpponentWinDepth1() { - // - - - - // O - - - // X X - - game.play(new Game.Move(6, 'X')); - game.play(new Game.Move(3, 'O')); - game.play(new Game.Move(7, 'X')); - - final Game.Move move = ai.findBestMove(game, 1); - - assertNotNull(move); - assertEquals('O', move.value()); - assertEquals(8, move.position()); - } - - @Test - void testBestMove_preferCornerOnEmpty() { - final Game.Move move = ai.findBestMove(game, 0); - - assertNotNull(move); - assertEquals('X', move.value()); - assertTrue(Set.of(0, 2, 6, 8).contains(move.position())); - } - - @Test - void testBestMove_findBestMoveDraw() { - // O X - - // - O X - // X O X - game.play(new Game.Move(1, 'X')); - game.play(new Game.Move(0, 'O')); - game.play(new Game.Move(5, 'X')); - game.play(new Game.Move(4, 'O')); - game.play(new Game.Move(6, 'X')); - game.play(new Game.Move(7, 'O')); - game.play(new Game.Move(8, 'X')); - - final Game.Move move = ai.findBestMove(game, game.getLegalMoves().length); - - assertNotNull(move); - assertEquals('O', move.value()); - assertEquals(2, move.position()); - } -} \ No newline at end of file +//package org.toop.game.tictactoe; +// +//import org.toop.game.Game; +// +//import java.util.Set; +// +//import org.junit.jupiter.api.BeforeEach; +//import org.junit.jupiter.api.Test; +// +//import static org.junit.jupiter.api.Assertions.*; +// +//class TicTacToeAITest { +// private TicTacToe game; +// private TicTacToeAI ai; +// +// @BeforeEach +// void setup() { +// game = new TicTacToe("AI", "AI"); +// ai = new TicTacToeAI(); +// } +// +// @Test +// void testBestMove_returnWinningMoveWithDepth1() { +// // X X - +// // O O - +// // - - - +// game.play(new Game.Move(0, 'X')); +// game.play(new Game.Move(3, 'O')); +// game.play(new Game.Move(1, 'X')); +// game.play(new Game.Move(4, 'O')); +// +// final Game.Move move = ai.findBestMove(game, 1); +// +// assertNotNull(move); +// assertEquals('X', move.value()); +// assertEquals(2, move.position()); +// } +// +// @Test +// void testBestMove_blockOpponentWinDepth1() { +// // - - - +// // O - - +// // X X - +// game.play(new Game.Move(6, 'X')); +// game.play(new Game.Move(3, 'O')); +// game.play(new Game.Move(7, 'X')); +// +// final Game.Move move = ai.findBestMove(game, 1); +// +// assertNotNull(move); +// assertEquals('O', move.value()); +// assertEquals(8, move.position()); +// } +// +// @Test +// void testBestMove_preferCornerOnEmpty() { +// final Game.Move move = ai.findBestMove(game, 0); +// +// assertNotNull(move); +// assertEquals('X', move.value()); +// assertTrue(Set.of(0, 2, 6, 8).contains(move.position())); +// } +// +// @Test +// void testBestMove_findBestMoveDraw() { +// // O X - +// // - O X +// // X O X +// game.play(new Game.Move(1, 'X')); +// game.play(new Game.Move(0, 'O')); +// game.play(new Game.Move(5, 'X')); +// game.play(new Game.Move(4, 'O')); +// game.play(new Game.Move(6, 'X')); +// game.play(new Game.Move(7, 'O')); +// game.play(new Game.Move(8, 'X')); +// +// final Game.Move move = ai.findBestMove(game, game.getLegalMoves().length); +// +// assertNotNull(move); +// assertEquals('O', move.value()); +// assertEquals(2, move.position()); +// } +//} \ No newline at end of file diff --git a/pom.xml b/pom.xml index bece215..f74eba6 100644 --- a/pom.xml +++ b/pom.xml @@ -107,71 +107,19 @@ + + org.apache.maven.plugins + maven-compiler-plugin + 3.14.1 + + ${project.build.directory}/custom + 25 + 25 + 25 + UTF-8 + + - - - - maven-surefire-plugin - 3.5.4 - - stress - - - - maven-failsafe-plugin - 3.5.4 - - - org.apache.maven.plugins - maven-compiler-plugin - 3.14.1 - - 25 - 25 - 25 - UTF-8 - - - - - - - - - - - - - - - - - - - - - - org.apache.maven.plugins - maven-shade-plugin - 3.6.1 - - - package - - shade - - - - - app.src.java.org.toop.Main - - - - - - - -