// Path: src/main/java/com/lunar/asset/AssetManager.java
// public class AssetManager {
// 
// 	private final List<Tile> TILES = new ArrayList<>();
// 
// 	/**
// 	 * Add a tile.
// 	 */
// 	public void addTile(Tile tile) {
// 		TILES.add(tile);
// 	}
// 
// 	/**
// 	 * Remove the tile.
// 	 */
// 	public void removeTile(Tile tile) {
// 		TILES.remove(tile);
// 	}
// 
// 	/**
// 	 * @param ID the tile ID.
// 	 * @return the Tile with the ID.
// 	 */
// 	public Tile getByID(int ID) {
// 		return TILES.stream().filter(tile -> tile.getID() == ID).findAny().orElse(null);
// 	}
// 
// 	/**
// 	 * @return list of all TILES.
// 	 */
//     public List<Tile> getTiles() {
//         return TILES;
// 	}
// }
// 
// Path: src/main/java/com/lunar/sound/SoundManager.java
// public class SoundManager {
// 
//     private final List<Sound> GAME_SOUNDS = new ArrayList<>();
// 
//     /**
//      * Adds a sound.
//      *
//      * @param sound The sound Object.
//      */
//     public void addSound(Sound sound) {
//         GAME_SOUNDS.add(sound);
//     }
// 
//     /**
//      * Adds a sound.
//      *
//      * @param name The name of the audio.
//      * @param file The audio file.
//      */
//     public void addSound(String name, File file) {
//         GAME_SOUNDS.add(new Sound(name, file));
//     }
// 
//     /**
//      * Gets a sound via ID.
//      *
//      * @param name The name of the Sound.
//      */
//     public Sound getSound(String name) {
//         return GAME_SOUNDS.stream().filter(sound -> sound.getName().equals(name)).findAny().orElse(null);
//     }
// 
//     /**
//      * Check if the sound exists.
//      *
//      * @return if the sound exists.
//      */
//     public boolean doesSoundExist(String name) {
//         return getSound(name) != null;
//     }
// 
//     /**
//      * Removes a sound from the list.
//      *
//      * @param name The ID of the Sound.
//      */
//     public void removeSound(String name) {
//         Sound s = getSound(name);
//         if (GAME_SOUNDS.contains(s)) {
//             GAME_SOUNDS.remove(s);
//         }
//     }
// 
//     /**
//      * Remove the sound.
//      */
//     public void removeSound(Sound sound) {
//         if (GAME_SOUNDS.contains(sound)) {
//             GAME_SOUNDS.remove(sound);
//         }
//     }
// 
//     /**
//      * Plays a sound with a clip.
//      *
//      * @param sound The Sound object.
//      */
//     public void playSound(Sound sound) {
//         sound.play();
//     }
// 
//     /**
//      * Plays a sound with a clip.
//      */
//     public void playSound(String name) {
//         getSound(name).play();
//     }
// 
//     /**
//      * Plays a sound with a clip. This does not support stopping.
//      *
//      * @param file The audio file.
//      */
//     public void playSound(File file) {
//         Sound sound = new Sound("TEMP_" + file.getName(), file);
//         sound.play();
//     }
// 
//     /**
//      * Stop playing the sound.
//      */
//     public void stopPlayingSound(Sound sound) {
//         sound.stop();
//     }
// 
//     /**
//      * Stop playing the sound.
//      */
//     public void stopPlayingSound(String name) {
//         getSound(name).stop();
//     }
// 
// }
// 
// Path: src/main/java/com/lunar/state/GameState.java
// public abstract class GameState {
// 
//     protected int priority = 0;
// 
//     /**
//      * Initializes the GameState.
//      */
//     public GameState(int priority) {
//         this.priority = priority;
//     }
// 
//     public abstract void onDraw(Graphics graphics);
// 
//     public abstract void onTick();
// 
//     public void onStart() {
//     }
// 
//     /**
//      * @return the priority.
//      */
//     public int getPriority() {
//         return priority;
//     }
// 
// }


import com.lunar.asset.AssetManager;
import com.lunar.sound.SoundManager;
import com.lunar.state.GameState;
package com.lunar;


public class Lunar {
    private Game game;
    private SoundManager soundManager;
    private AssetManager assetManager;

    /**
     * Initialize the game.
     *
     * @param title    The title of the game's window.
     * @param width    The width of the game's window.
     * @param height   The height of the game's window.
     * @param tickRate indicates how fast the game is drawn/updated.
     *                 A good tickrate is 64 or above.
     */
    public void initializeGame(String title, int width, int height, int tickRate) {
        game = new Game(title, width, height, tickRate);

        soundManager = new SoundManager();
        assetManager = new AssetManager();
    }

    /**
     * Initialize the game.
     *
     * @param title    The title of the game's window.
     * @param width    The width of the game's window.
     * @param height   The height of the game's window.
     * @param state    A default {@link GameState} object to use.
     * @param tickRate indicates how fast the game is drawn/updated.
     *                 A good tickrate is 64 or above.
     */
// Path: src/main/java/com/lunar/asset/AssetManager.java
// public class AssetManager {
// 
// 	private final List<Tile> TILES = new ArrayList<>();
// 
// 	/**
// 	 * Add a tile.
// 	 */
// 	public void addTile(Tile tile) {
// 		TILES.add(tile);
// 	}
// 
// 	/**
// 	 * Remove the tile.
// 	 */
// 	public void removeTile(Tile tile) {
// 		TILES.remove(tile);
// 	}
// 
// 	/**
// 	 * @param ID the tile ID.
// 	 * @return the Tile with the ID.
// 	 */
// 	public Tile getByID(int ID) {
// 		return TILES.stream().filter(tile -> tile.getID() == ID).findAny().orElse(null);
// 	}
// 
// 	/**
// 	 * @return list of all TILES.
// 	 */
//     public List<Tile> getTiles() {
//         return TILES;
// 	}
// }
// 
// Path: src/main/java/com/lunar/sound/SoundManager.java
// public class SoundManager {
// 
//     private final List<Sound> GAME_SOUNDS = new ArrayList<>();
// 
//     /**
//      * Adds a sound.
//      *
//      * @param sound The sound Object.
//      */
//     public void addSound(Sound sound) {
//         GAME_SOUNDS.add(sound);
//     }
// 
//     /**
//      * Adds a sound.
//      *
//      * @param name The name of the audio.
//      * @param file The audio file.
//      */
//     public void addSound(String name, File file) {
//         GAME_SOUNDS.add(new Sound(name, file));
//     }
// 
//     /**
//      * Gets a sound via ID.
//      *
//      * @param name The name of the Sound.
//      */
//     public Sound getSound(String name) {
//         return GAME_SOUNDS.stream().filter(sound -> sound.getName().equals(name)).findAny().orElse(null);
//     }
// 
//     /**
//      * Check if the sound exists.
//      *
//      * @return if the sound exists.
//      */
//     public boolean doesSoundExist(String name) {
//         return getSound(name) != null;
//     }
// 
//     /**
//      * Removes a sound from the list.
//      *
//      * @param name The ID of the Sound.
//      */
//     public void removeSound(String name) {
//         Sound s = getSound(name);
//         if (GAME_SOUNDS.contains(s)) {
//             GAME_SOUNDS.remove(s);
//         }
//     }
// 
//     /**
//      * Remove the sound.
//      */
//     public void removeSound(Sound sound) {
//         if (GAME_SOUNDS.contains(sound)) {
//             GAME_SOUNDS.remove(sound);
//         }
//     }
// 
//     /**
//      * Plays a sound with a clip.
//      *
//      * @param sound The Sound object.
//      */
//     public void playSound(Sound sound) {
//         sound.play();
//     }
// 
//     /**
//      * Plays a sound with a clip.
//      */
//     public void playSound(String name) {
//         getSound(name).play();
//     }
// 
//     /**
//      * Plays a sound with a clip. This does not support stopping.
//      *
//      * @param file The audio file.
//      */
//     public void playSound(File file) {
//         Sound sound = new Sound("TEMP_" + file.getName(), file);
//         sound.play();
//     }
// 
//     /**
//      * Stop playing the sound.
//      */
//     public void stopPlayingSound(Sound sound) {
//         sound.stop();
//     }
// 
//     /**
//      * Stop playing the sound.
//      */
//     public void stopPlayingSound(String name) {
//         getSound(name).stop();
//     }
// 
// }
// 
// Path: src/main/java/com/lunar/state/GameState.java
// public abstract class GameState {
// 
//     protected int priority = 0;
// 
//     /**
//      * Initializes the GameState.
//      */
//     public GameState(int priority) {
//         this.priority = priority;
//     }
// 
//     public abstract void onDraw(Graphics graphics);
// 
//     public abstract void onTick();
// 
//     public void onStart() {
//     }
// 
//     /**
//      * @return the priority.
//      */
//     public int getPriority() {
//         return priority;
//     }
// 
// }


// Path: src/main/java/com/lunar/Lunar.java
import com.lunar.asset.AssetManager;
import com.lunar.sound.SoundManager;
import com.lunar.state.GameState;

package com.lunar;


public class Lunar {
    private Game game;
    private SoundManager soundManager;
    private AssetManager assetManager;

    /**
     * Initialize the game.
     *
     * @param title    The title of the game's window.
     * @param width    The width of the game's window.
     * @param height   The height of the game's window.
     * @param tickRate indicates how fast the game is drawn/updated.
     *                 A good tickrate is 64 or above.
     */
    public void initializeGame(String title, int width, int height, int tickRate) {
        game = new Game(title, width, height, tickRate);

        soundManager = new SoundManager();
        assetManager = new AssetManager();
    }

    /**
     * Initialize the game.
     *
     * @param title    The title of the game's window.
     * @param width    The width of the game's window.
     * @param height   The height of the game's window.
     * @param state    A default {@link GameState} object to use.
     * @param tickRate indicates how fast the game is drawn/updated.
     *                 A good tickrate is 64 or above.
     */
    public void initializeGame(String title, int width, int height, GameState state, int tickRate) {