diff --git a/Projekte/.run/MdgaApp.run.xml b/Projekte/.run/MdgaApp.run.xml index a33a2cd3..051df2ea 100644 --- a/Projekte/.run/MdgaApp.run.xml +++ b/Projekte/.run/MdgaApp.run.xml @@ -1,18 +1,17 @@ - - diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/AcousticHandler.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/AcousticHandler.java new file mode 100644 index 00000000..0e436b03 --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/AcousticHandler.java @@ -0,0 +1,290 @@ +package pp.mdga.client.Acoustic; + +import com.jme3.system.NanoTimer; +import pp.mdga.client.MdgaApp; +import pp.mdga.client.MdgaState; + +import java.util.*; + +public class AcousticHandler { + private MdgaApp app; + + private MdgaState state = MdgaState.NONE; + + private boolean playGame = false; + private ArrayList gameTracks = new ArrayList<>(); + private NanoTimer trackTimer = new NanoTimer(); + + private boolean fading = false; + private NanoTimer fadeTimer = new NanoTimer(); + private final float FADE_DURATION = 3.0f; + private final float CROSSFADE_DURATION = 1.5f; + + private float mainVolume = 1.0f; + private float musicVolume = 1.0f; + private float soundVolume = 1.0f; + + private GameMusic scheduled = null; + private GameMusic playing = null; + private ArrayList sounds = new ArrayList<>(); + + public AcousticHandler(MdgaApp app) { + this.app = app; + } + + /** + * This method updates the acousticHandler and should be called every frame + */ + public void update() { + updateVolumeAndTrack(); + + if(playGame) { + updateGameTracks(); + } + + Iterator iterator = sounds.iterator(); + while (iterator.hasNext()) { + GameSound s = iterator.next(); + + s.update(getSoundVolumeTotal()); + + if (!s.isPlaying()) { + iterator.remove(); + } + } + } + + /** + * This method instantly plays a sound + * + * @param sound the sound to be played + */ + public void playSound(MdgaSound sound) { + ArrayList assets = new ArrayList(); + switch (sound) { + case LOST: + assets.add(new SoundAssetDelayVolume(SoundAsset.LOST, 1.0f, 0.0f)); + break; + case VICTORY: + assets.add(new SoundAssetDelayVolume(SoundAsset.VICTORY, 1.0f, 2.0f)); + break; + default: + + break; + } + + for (SoundAssetDelayVolume sawd : assets) { + GameSound gameSound = new GameSound(app, sawd.asset(), getSoundVolumeTotal(), sawd.subVolume(), sawd.delay()); + sounds.add(gameSound); + } + } + + /** + * This method fades the played music to fit the state. + * + * @param state the state of which the corresponding music should be played to be played + */ + public void playState(MdgaState state) { + if(this.state == state) { + return; + } + + MusicAsset asset = null; + + switch (state) { + case MAIN: + playGame = false; + asset = MusicAsset.MAIN_MENU; + break; + case LOBBY: + playGame = false; + asset = MusicAsset.LOBBY; + break; + case GAME: + addGameTracks(); + playGame = true; + assert(gameTracks.size() > 0) : "no more game music available"; + asset = gameTracks.remove(0); + break; + case CEREMONY: + playGame = false; + asset = MusicAsset.CEREMONY; + break; + } + + assert(null != asset) : "music sceduling went wrong"; + + scheduled = new GameMusic(app, asset, getMusicVolumeTotal(), asset.getSubVolume(), asset.getLoop()); + } + + /** + * Performs linear interpolation between two float values. + * + * @param start The starting value. + * @param end The ending value. + * @param t The interpolation factor, typically between 0 and 1. + * @return The interpolated value between start and end. + */ + private float lerp(float start, float end, float t) { + return start + t * (end - start); + } + + /** + * Updates the current volume and handles track crossfading logic. + * This method is responsible for fading out the currently playing track, + * fading in the scheduled track, and handling crossfade between the two tracks. + */ + private void updateVolumeAndTrack() { + if (playing == null && scheduled != null && !fading) { + playing = scheduled; + scheduled = null; + playing.play(); + return; + } + + if (scheduled != null && !fading) { + fading = true; + fadeTimer.reset(); + } + + if (fading) { + float time = fadeTimer.getTimeInSeconds(); + + if (time <= FADE_DURATION) { + float t = Math.min(time / FADE_DURATION, 1.0f); + float oldVolume = lerp(1.0f, 0.0f, t); + if (playing != null) { + playing.update(getMusicVolumeTotal()* oldVolume); + } + } + + if (time > FADE_DURATION && time <= FADE_DURATION + CROSSFADE_DURATION) { + float t = Math.min((time - FADE_DURATION) / CROSSFADE_DURATION, 1.0f); + float newVolume = lerp(0.0f, 1.0f, t); + + if (!scheduled.isPlaying()) { + scheduled.play(); + } + scheduled.update(getMusicVolumeTotal() * newVolume); + } + + if (time > FADE_DURATION + CROSSFADE_DURATION) { + if (playing != null) { + playing.pause(); + } + playing = scheduled; + scheduled = null; + + fading = false; + } + } else if (playing != null) { + playing.update(getMusicVolumeTotal()); + } + } + + /** + * Adds a list of game tracks to the gameTracks collection and shuffles them. + * This method adds predefined game tracks to the track list and shuffles the order. + */ + private void addGameTracks() { + Random random = new Random(); + + for (int i = 1; i <= 6; i++) { + gameTracks.add(MusicAsset.valueOf("GAME_" + i)); + } + Collections.shuffle(gameTracks, random); + } + + /** + * Updates the current game tracks. If the currently playing track is nearing its end, + * a new track will be scheduled to play. If the list of game tracks is empty, it will be refreshed. + */ + private void updateGameTracks() { + if(playing.nearEnd(10)) { + if (gameTracks.isEmpty()) { + addGameTracks(); + } + } + + if (playing != null && playing.nearEnd(3) && trackTimer.getTimeInSeconds() > 20) { + trackTimer.reset(); + + MusicAsset nextTrack = gameTracks.remove(0); + + scheduled = new GameMusic(app, nextTrack, getMusicVolumeTotal(), nextTrack.getSubVolume(), nextTrack.getLoop()); + } + } + + /** + * Retrieves the main volume level. + * + * @return The current main volume level. + */ + public float getMainVolume() { + return mainVolume; + } + + /** + * Retrieves the music volume level. + * + * @return The current music volume level. + */ + public float getMusicVolume() { + return musicVolume; + } + + /** + * Retrieves the sound volume level. + * + * @return The current sound volume level. + */ + public float getSoundVolume() { + return soundVolume; + } + + /** + * Sets the main volume level. + * + * @param mainVolume The desired main volume level. + */ + public void setMainVolume(float mainVolume) { + this.mainVolume = mainVolume; + } + + /** + * Sets the music volume level. + * + * @param musicVolume The desired music volume level. + */ + public void setMusicVolume(float musicVolume) { + this.musicVolume = musicVolume; + } + + /** + * Sets the sound volume level. + * + * @param soundVolume The desired sound volume level. + */ + public void setSoundVolume(float soundVolume) { + this.soundVolume = soundVolume; + } + + /** + * Calculates the total music volume by multiplying the music volume by the main volume. + * + * @return The total music volume. + */ + float getMusicVolumeTotal() { + + return getMusicVolume() * getMainVolume(); + } + + /** + * Calculates the total sound volume by multiplying the sound volume by the main volume. + * + * @return The total sound volume. + */ + float getSoundVolumeTotal() { + return getSoundVolume() * getMainVolume(); + } +} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/GameMusic.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/GameMusic.java new file mode 100644 index 00000000..7345de66 --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/GameMusic.java @@ -0,0 +1,110 @@ +package pp.mdga.client.Acoustic; + +import com.jme3.audio.AudioData; +import com.jme3.audio.AudioNode; +import com.jme3.audio.AudioSource; +import pp.mdga.client.MdgaApp; + +/** + * Represents a game music track, including its playback controls and volume settings. + * This class manages the playback of a music track, allowing for playing, pausing, + * volume adjustment, and tracking the current status of the music. + */ +class GameMusic { + private float volume; + private final float subVolume; + private final AudioNode music; + + /** + * Constructs a new GameMusic object. + * + * @param app The instance of the application, used to access the asset manager. + * @param asset The music asset to be played. + * @param volume The total volume of the music, adjusted by the main volume. + * @param subVolume A relative volume that modifies the base music volume, typically a percentage. + * @param loop A flag indicating whether the music should loop once it finishes. + */ + GameMusic(MdgaApp app, MusicAsset asset, float volume, float subVolume, boolean loop) { + this.volume = volume; + this.subVolume = subVolume; + + music = new AudioNode(app.getAssetManager(), asset.getPath(), AudioData.DataType.Stream); + music.setPositional(false); + music.setDirectional(false); + music.setVolume(volume * subVolume); + + music.setLooping(loop); + } + + /** + * Plays the current music track. + * If the music is already initialized, it starts playback. + * If the music is not available, no action is performed. + */ + void play() { + if(null == music) { + return; + } + + music.play(); + } + + /** + * Pauses the current music track. + * If the music is not available or is not playing, no action is performed. + */ + void pause() { + if(null == music) { + return; + } + + music.stop(); + } + + /** + * Checks if the current music track is playing. + * + * @return true if the music is playing, false otherwise. + */ + boolean isPlaying() { + + return music.getStatus() == AudioSource.Status.Playing; + } + + /** + * Checks if the current music track is near the end. + * + * @param thresholdSeconds The threshold in seconds. If the remaining time is less than or equal to this value, + * the track is considered near the end. + * @return true if the track is near its end (within the threshold), false otherwise. + */ + boolean nearEnd(float thresholdSeconds) { + if (music == null || !isPlaying()) { + return false; + } + + float currentTime = music.getPlaybackTime(); // Current playback time in seconds + float duration = music.getAudioData().getDuration(); // Total duration in seconds + + if (duration <= 0) { + return false; + } + + float remainingTime = duration - currentTime; + + return remainingTime <= thresholdSeconds; + } + + /** + * Updates the volume of the music. + * If the volume has changed, it will adjust the music's volume accordingly. + * + * @param newVolume The new total volume for the music. + */ + void update(float newVolume) { + if(volume != newVolume) { + volume = newVolume; + music.setVolume(volume * subVolume); + } + } +} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/GameSound.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/GameSound.java new file mode 100644 index 00000000..9f01a365 --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/GameSound.java @@ -0,0 +1,83 @@ +package pp.mdga.client.Acoustic; + +import com.jme3.audio.AudioData; +import com.jme3.audio.AudioNode; +import com.jme3.audio.AudioSource; +import com.jme3.system.NanoTimer; +import pp.mdga.client.MdgaApp; + +/** + * Represents a game sound effect, with control over playback, volume, and timing. + * This class manages the playback of a sound effect, including starting playback after a delay, + * adjusting volume, and tracking whether the sound has finished playing. + */ +class GameSound { + private float volume; + final private float subVolume; + + private final AudioNode sound; + + private boolean playing = false; + private boolean finished = false; + + private float delay = 0.0f; + private NanoTimer timer = null; + + /** + * Constructs a new GameSound object. + * + * @param app The instance of the application, used to access the asset manager. + * @param asset The sound asset to be played. + * @param volume The total volume of the sound, adjusted by the main volume. + * @param subVolume A relative volume that modifies the base sound volume, typically a percentage. + * @param delay The delay before the sound starts playing, in seconds. + */ + GameSound(MdgaApp app, SoundAsset asset, float volume, float subVolume, float delay) { + this.volume = volume; + this.subVolume = subVolume; + this.delay = delay; + + sound = new AudioNode(app.getAssetManager(), asset.getPath(), AudioData.DataType.Buffer); + sound.setPositional(false); + sound.setDirectional(false); + sound.setLooping(false); + sound.setVolume(volume * subVolume); + + timer = new NanoTimer(); + } + + /** + * Checks if the sound is currently playing. + * + * @return true if the sound is playing, false otherwise. + */ + boolean isPlaying() { + return !finished; + } + + /** + * Updates the sound playback, adjusting the volume if necessary, and starting + * the sound after the specified delay. + * + * @param newVolume The new total volume for the sound. + */ + void update(float newVolume) { + if(!playing && timer.getTimeInSeconds() > delay) { + sound.play(); + playing = true; + } + + if(!playing) { + return; + } + + if(volume != newVolume) { + volume = newVolume; + sound.setVolume(volume * subVolume); + } + + if(sound != null && sound.getStatus() == AudioSource.Status.Playing) { + finished = true; + } + } +} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/MdgaSound.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/MdgaSound.java new file mode 100644 index 00000000..651208b6 --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/MdgaSound.java @@ -0,0 +1,23 @@ +package pp.mdga.client.Acoustic; + +/** + * Enum representing the various sound effects used in the game. + * Each sound corresponds to an event or action in the game and may consist of one or more + * audio files, potentially with time delays between them. + * + * These sounds are used to play specific audio cues, such as when a dice is rolled, + * a turn starts or ends, a piece is moved or lost, and various other events in the game. + */ +public enum MdgaSound { + DICE_ROLL, + TURN_START, + TURN_END, + PIECE_END, + PIECE_MOVE, + PIECE_LOST, + SELECT, + DESELECT, + HURRY, + VICTORY, + LOST; +} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/MusicAsset.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/MusicAsset.java new file mode 100644 index 00000000..70018f66 --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/MusicAsset.java @@ -0,0 +1,76 @@ +package pp.mdga.client.Acoustic; + +/** + * Enum representing various music assets used in the game. + * Each constant corresponds to a specific music track, along with its properties such as file path, + * looping behavior, and relative volume (subVolume). + * These music assets are used to control the music that plays in different parts of the game, such as menus and in-game music. + */ +enum MusicAsset { + MAIN_MENU("Spaceship.wav", 1.0f), + LOBBY("DeadPlanet.wav", 1.0f), + CEREMONY("80s,Disco,Life.wav", 1.0f), + GAME_1("NeonRoadTrip.wav", false, 1.0f), + GAME_2("NoPressureTrance.wav", false, 1.0f), + GAME_3("TheSynthRave.wav", false, 1.0f), + GAME_4("LaserParty.wav", false, 1.0f), + GAME_5("RetroNoir.wav", false, 1.0f), + GAME_6("SpaceInvaders.wav", false, 1.0f); + + private final String path; + private final boolean loop; + private final float subVolume; + + /** + * Constructs a new MusicAsset object with the specified name and sub-volume. + * The track will not loop by default. + * + * @param name The name of the music file. + * @param subVolume A relative volume that modifies the base volume of the track (typically a percentage). + */ + MusicAsset(String name, float subVolume) { + this.path = "music/" + name; + this.loop = false; + this.subVolume = subVolume; + } + + /** + * Constructs a new MusicAsset object with the specified name, loop flag, and sub-volume. + * + * @param name The name of the music file. + * @param loop If true, the track will loop; otherwise, it will play once. + * @param subVolume A relative volume that modifies the base volume of the track (typically a percentage). + */ + MusicAsset(String name, boolean loop, float subVolume) { + this.path = "music/" + name; + this.loop = loop; + this.subVolume = subVolume; + } + + /** + * Gets the file path of the music track. + * + * @return The path to the music file (relative to the music folder). + */ + public String getPath() { + return path; + } + + /** + * Gets whether the music track should loop. + * + * @return true if the track should loop, false otherwise. + */ + public boolean getLoop() { + return loop; + } + + /** + * Gets the relative volume (subVolume) for the music track. + * + * @return The relative volume for the track, typically a value between 0.0 and 1.0. + */ + public float getSubVolume() { + return subVolume; + } +} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/SoundAsset.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/SoundAsset.java new file mode 100644 index 00000000..32749c3c --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/SoundAsset.java @@ -0,0 +1,41 @@ +package pp.mdga.client.Acoustic; + +/** + * Enum representing various sound assets used in the game. + * Each constant corresponds to a specific sound effect used throughout the game. + * These sounds are associated with various events and actions, such as dice rolls, + * turn changes, piece movements, and game outcomes. + */ +enum SoundAsset { + DICE_ROLL(""), + TURN_START(""), + TURN_END(""), + PIECE_END(""), + PIECE_MOVE(""), + PIECE_LOST(""), + SELECT(""), + DESELECT(""), + HURRY(""), + VICTORY("LevelUp2.wav"), + LOST("GameOver.wav"); + + private final String path; + + /** + * Constructs a new SoundAsset object with the specified name. + * + * @param name The name of the sound file. + */ + SoundAsset(String name) { + this.path = "sound/" + name; + } + + /** + * Gets the file path of the sound effect. + * + * @return The path to the sound file (relative to the sound folder). + */ + public String getPath() { + return path; + } +} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/SoundAssetDelayVolume.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/SoundAssetDelayVolume.java new file mode 100644 index 00000000..ad7ded23 --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Acoustic/SoundAssetDelayVolume.java @@ -0,0 +1,7 @@ +package pp.mdga.client.Acoustic; + +/** + * A record that encapsulates a sound asset along with its playback settings: + * the relative volume (subVolume) and a delay before it starts playing. + */ +record SoundAssetDelayVolume(SoundAsset asset, float subVolume, float delay) { } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/ActionSynchronizer.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/ActionSynchronizer.java deleted file mode 100644 index 977969b2..00000000 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/ActionSynchronizer.java +++ /dev/null @@ -1,5 +0,0 @@ -package pp.mdga.client; - -public class ActionSynchronizer { - -} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Animation/Animation.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Animation/Animation.java index 4d87c22e..0ca7adcb 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Animation/Animation.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Animation/Animation.java @@ -1,7 +1,7 @@ package pp.mdga.client.Animation; -public interface Animation { - void play(); - void stop(); - boolean isOver(); +abstract class Animation { + abstract void play(); + abstract void stop(); + abstract boolean isOver(); } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Animation/AnimationHandler.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Animation/AnimationHandler.java index 7047fff5..07307307 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Animation/AnimationHandler.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Animation/AnimationHandler.java @@ -11,7 +11,7 @@ public AnimationHandler(MdgaApp app) { this.app = app; } - public void playAnimation(AnimationType type) { + public void playAnimation(MdgaAnimation type) { } @@ -23,7 +23,7 @@ public void update() { if(animation.isOver()) { animation = null; - //trigger next state + //trigger next state in model } } } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Animation/EmptyAnimation.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Animation/EmptyAnimation.java index ea914547..bd83c19f 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Animation/EmptyAnimation.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Animation/EmptyAnimation.java @@ -1,6 +1,6 @@ package pp.mdga.client.Animation; -public class EmptyAnimation implements Animation { +class EmptyAnimation extends Animation { @Override void play() { //nothing diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Animation/AnimationType.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Animation/MdgaAnimation.java similarity index 56% rename from Projekte/mdga/client/src/main/java/pp/mdga/client/Animation/AnimationType.java rename to Projekte/mdga/client/src/main/java/pp/mdga/client/Animation/MdgaAnimation.java index 5d2d0233..4d1e0fff 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Animation/AnimationType.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Animation/MdgaAnimation.java @@ -1,4 +1,4 @@ package pp.mdga.client.Animation; -public enum AnimationType { +public enum MdgaAnimation { } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/AssetOnMap.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/AssetOnMap.java new file mode 100644 index 00000000..d086af14 --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/AssetOnMap.java @@ -0,0 +1,3 @@ +package pp.mdga.client.Board; + +record AssetOnMap(BoardAsset boardAsset, int x, int y){} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Asset.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/BoardAsset.java similarity index 81% rename from Projekte/mdga/client/src/main/java/pp/mdga/client/Asset.java rename to Projekte/mdga/client/src/main/java/pp/mdga/client/Board/BoardAsset.java index 25ac35f3..002fd928 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Asset.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/BoardAsset.java @@ -1,6 +1,6 @@ -package pp.mdga.client; +package pp.mdga.client.Board; -public enum Asset { +enum BoardAsset { bigTent, cardStack, cir, @@ -8,13 +8,13 @@ public enum Asset { jet, lw, marine, - node_home_blue("./node_home/node_home.j3o", "./node_home/node_home_blue.png"), - node_home_black("./node_home/node_home.j3o", "./node_home/node_home_black.png"), - node_home_green("./node_home/node_home.j3o", "./node_home/node_home_green.png"), - node_home_yellow("./node_home/node_home.j3o", "./node_home/node_home_yellow.png"), + node_home_blue("./node_home/node_home.j3o", "./node_home/node_home_blue_diff.png"), + node_home_black("./node_home/node_home.j3o", "./node_home/node_home_black_diff.png"), + node_home_green("./node_home/node_home.j3o", "./node_home/node_home_green_diff.png"), + node_home_yellow("./node_home/node_home.j3o", "./node_home/node_home_yellow_diff.png"), node_normal, - node_start("./node_normal/node_normal.j3o", "./node_normal/node_normal_start.png"), - node_bonus("./node_normal/node_normal.j3o", "./node_normal/node_normal_bonus.png"), + node_start("./node_normal/node_normal.j3o", "./node_normal/node_start_diff.png"), + node_bonus("./node_normal/node_normal.j3o", "./node_normal/node_bonus_diff.png"), radar, shieldCard, ship, @@ -22,26 +22,26 @@ public enum Asset { swapCard, tank, turboCard, - world(1.1f); + world(1.2f); private final String modelPath; private final String diffPath; private final float size; - Asset(){ + BoardAsset(){ String folderFileName = "./" + name() + "/" + name(); this.modelPath = folderFileName + ".j3o"; this.diffPath = folderFileName + "_diff.png"; this.size = 1f; } - Asset(String modelPath, String diffPath){ + BoardAsset(String modelPath, String diffPath){ this.modelPath = modelPath; this.diffPath = diffPath; this.size = 1f; } - Asset(float size){ + BoardAsset(float size){ String folderFileName = "./" + name() + "/" + name(); this.modelPath = folderFileName + ".j3o"; this.diffPath = folderFileName + "_diff.png"; diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/BoardView.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/BoardView.java index e161993b..f33a9cbc 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/BoardView.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/BoardView.java @@ -1,30 +1,95 @@ package pp.mdga.client.Board; +import com.jme3.light.AmbientLight; +import com.jme3.light.DirectionalLight; +import com.jme3.material.Material; +import com.jme3.math.ColorRGBA; import com.jme3.math.Vector3f; +import com.jme3.renderer.queue.RenderQueue; +import com.jme3.scene.Spatial; +import com.jme3.shadow.DirectionalLightShadowRenderer; +import pp.mdga.client.MdgaApp; import java.util.ArrayList; +import java.util.List; public class BoardView { - private static final float GRID_SIZE = 10.0f; + private static final float GRID_SIZE = 1.72f; private static final float GRID_ELEVATION = 0.0f; - private static final int GRID_EXTEND = 11; + private static final String MAP_NAME = "circle_map.mdga"; - private PileControl drawPile = new PileControl(); - private PileControl discardPile = new PileControl(); + private final MdgaApp app; + + private PileControl drawPile = null; + private PileControl discardPile = null; private ArrayList infield = new ArrayList(40); private ArrayList pieces; - BoardView(int playerCount) { - assert(2 <= playerCount && playerCount <= 4); + public BoardView(MdgaApp app) { + assert(app != null) : "app is null"; - pieces = new ArrayList(4 * playerCount); + this.app = app; + + pieces = new ArrayList(4 * 4); + + initMap(); + initCamera(); + } + + private void initCamera() { + app.getFlyByCamera().setEnabled(true); + int zoom = 20; + app.getCamera().setLocation(new Vector3f(zoom,0,zoom)); + app.getCamera().lookAt(new Vector3f(0,0,0), new Vector3f(0,0,1)); + + DirectionalLight sun = new DirectionalLight(); + sun.setColor(ColorRGBA.White); + sun.setDirection(new Vector3f(-1,0,-1)); + app.getRootNode().addLight(sun); + + AmbientLight ambient = new AmbientLight(); + ambient.setColor(new ColorRGBA(0.3f,0.3f,0.3f,1)); + app.getRootNode().addLight(ambient); + + final int SHADOWMAP_SIZE= 1024 * 8; + DirectionalLightShadowRenderer dlsr = new DirectionalLightShadowRenderer(app.getAssetManager(), SHADOWMAP_SIZE, 4); + dlsr.setLight(sun); + app.getViewPort().addProcessor(dlsr); + } + + private void initMap() { + List assetsOnMap = MapLoader.loadMap(MAP_NAME); + + for (AssetOnMap aom : assetsOnMap){ + int x = aom.x(); + int y = aom.y(); + Vector3f pos = gridToWorld(x,y); + + if(aom.boardAsset().name().contains("node")) { + infield.add(new NodeControl(app, pos, aom.boardAsset())); + } else { + Spatial model = createModel(aom.boardAsset()); + model.setLocalTranslation(pos); + } + } + } + + private Spatial createModel(BoardAsset boardAsset){ + String modelName = boardAsset.getModelPath(); + String texName = boardAsset.getDiffPath(); + Spatial model = app.getAssetManager().loadModel(modelName); + model.scale(boardAsset.getSize()); + model.rotate((float) Math.toRadians(0), 0, (float) Math.toRadians(90)); + model.setShadowMode(RenderQueue.ShadowMode.CastAndReceive); + Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Light/Lighting.j3md"); + mat.setTexture("DiffuseMap", app.getAssetManager().loadTexture(texName)); + model.setMaterial(mat); + app.getRootNode().attachChild(model); + return model; } private static Vector3f gridToWorld(int x, int y) { - assert(0 <= x && x < GRID_EXTEND); - assert(0 <= y && y < GRID_EXTEND); - - return new Vector3f(GRID_SIZE * x, GRID_ELEVATION, GRID_SIZE * y); + return new Vector3f(GRID_SIZE * x, GRID_SIZE * y, GRID_ELEVATION); } } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/MapLoader.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/MapLoader.java new file mode 100644 index 00000000..8793b37d --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/MapLoader.java @@ -0,0 +1,66 @@ +package pp.mdga.client.Board; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +class MapLoader { + static public List loadMap(String mapName) { + List assetsOnMap = new ArrayList<>(); + + try (InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream(mapName); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { + + while (true) { + String entry = reader.readLine(); + if(entry == null) break; + + entry = entry.trim(); + + if(entry.isEmpty()) continue; + if(entry.charAt(0) == '#') continue; + + String[] parts = entry.trim().split(" "); + assert(parts.length == 2) : "parts.lenghth != 2"; + + String assetName = parts[0]; + String[] coordinates = parts[1].split(","); + + assert(coordinates.length == 2) : "coordinates.lenghth != 2"; + + int x = Integer.parseInt(coordinates[0]); + int y = Integer.parseInt(coordinates[1]); + + BoardAsset boardAsset = getLoadedAsset(assetName); + assetsOnMap.add(new AssetOnMap(boardAsset, x, y)); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return assetsOnMap; + } + + static private BoardAsset getLoadedAsset(String assetName) { + return switch(assetName){ + case "node" -> BoardAsset.node_normal; + case "node_start" -> BoardAsset.node_start; + case "node_bonus" -> BoardAsset.node_bonus; + case "node_home_blue" -> BoardAsset.node_home_blue; + case "node_home_yellow" -> BoardAsset.node_home_yellow; + case "node_home_black" -> BoardAsset.node_home_black; + case "node_home_green" -> BoardAsset.node_home_green; + case "world" -> BoardAsset.world; + case "tent_big" -> BoardAsset.bigTent; + case "tent_small" -> BoardAsset.smallTent; + case "stack" -> BoardAsset.cardStack; + case "jet" -> BoardAsset.jet; + case "radar" -> BoardAsset.radar; + case "ship" -> BoardAsset.ship; + case "tank" -> BoardAsset.tank; + default -> throw new IllegalStateException("Unexpected asset in .mdga file: " + assetName); + }; + } +} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/NodeControl.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/NodeControl.java index 6e8ecfa1..5f7f6609 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/NodeControl.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/NodeControl.java @@ -1,5 +1,30 @@ package pp.mdga.client.Board; -public class NodeControl { +import com.jme3.material.Material; +import com.jme3.math.Vector3f; +import com.jme3.renderer.queue.RenderQueue; +import com.jme3.scene.Spatial; +import pp.mdga.client.MdgaApp; +class NodeControl { + private final MdgaApp app; + + private Spatial model; + + NodeControl(MdgaApp app, Vector3f pos, BoardAsset boardAsset) { + this.app = app; + + String modelName = boardAsset.getModelPath(); + String texName = boardAsset.getDiffPath(); + Spatial model = app.getAssetManager().loadModel(modelName); + model.scale(boardAsset.getSize()); + model.rotate((float) Math.toRadians(0), 0, (float) Math.toRadians(90)); + model.setShadowMode(RenderQueue.ShadowMode.CastAndReceive); + Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Light/Lighting.j3md"); + mat.setTexture("DiffuseMap", app.getAssetManager().loadTexture(texName)); + model.setMaterial(mat); + app.getRootNode().attachChild(model); + + model.setLocalTranslation(pos); + } } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/PieceControl.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/PieceControl.java index 4ef15526..97057ef3 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/PieceControl.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/PieceControl.java @@ -1,5 +1,5 @@ package pp.mdga.client.Board; -public class PieceControl { +class PieceControl { } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/PileControl.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/PileControl.java index 4cdc7db1..67a4d994 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/PileControl.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Board/PileControl.java @@ -1,5 +1,5 @@ package pp.mdga.client.Board; -public class PileControl { +class PileControl { } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/DialogView.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/DialogView.java index 462da741..f7c578e5 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/DialogView.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/DialogView.java @@ -1,5 +1,26 @@ package pp.mdga.client.Dialog; -public class DialogView { +import pp.dialog.DialogManager; +import pp.mdga.client.MdgaApp; +public class DialogView { + private MdgaApp app; + + private DialogManager dialogManager = new DialogManager(app); + + private StartDialog dialog; + + public DialogView(MdgaApp app) { + this.app = app; + } + + DialogManager getDialogManager() { + return dialogManager; + } + + public void mainMenu() { + //dialogManager = new DialogManager(app); + //di + //MainMenuDialog mainMenuDialog = new MainMenuDialog(app); + } } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/InterruptDialog.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/InterruptDialog.java new file mode 100644 index 00000000..917a9401 --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/InterruptDialog.java @@ -0,0 +1,4 @@ +package pp.mdga.client.Dialog; + +public class InterruptDialog { +} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/StartDialog.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/StartDialog.java index 76a8c0fc..19b0a6cb 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/StartDialog.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/StartDialog.java @@ -1,5 +1,35 @@ package pp.mdga.client.Dialog; -public class StartDialog { +import com.simsilica.lemur.Checkbox; +import com.simsilica.lemur.Container; +import com.simsilica.lemur.Label; +import com.simsilica.lemur.component.SpringGridLayout; +import pp.dialog.DialogBuilder; +import pp.dialog.SimpleDialog; +import pp.mdga.client.MdgaApp; +public class StartDialog extends SimpleDialog { + StartDialog(MdgaApp app) { + super(app.getDialogView().getDialogManager()); + + Checkbox serverHost = new Checkbox("sdgfsdg"); + serverHost.setChecked(false); + //serverHost.addClickCommands(s -> toggleServerHost()); + + final Container input = new Container(new SpringGridLayout()); + input.addChild(new Label("sdgsgsdg")); + //input.addChild(host, 1); + input.addChild(new Label("sdfdsgsdgsdg")); + //input.addChild(port, 1); + input.addChild(serverHost); + + DialogBuilder.simple(app.getDialogView().getDialogManager()) + .setTitle("server.dialog") + .setOkButton("button.connect") + .setNoButton("button.cancel") + .setOkClose(false) + .setNoClose(false) + .build(this); + + } } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java index 120a1a25..b4b9e2bf 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java @@ -1,29 +1,31 @@ package pp.mdga.client; import com.jme3.app.SimpleApplication; -import com.jme3.renderer.RenderManager; +import com.jme3.system.NanoTimer; +import pp.mdga.client.Acoustic.AcousticHandler; +import pp.mdga.client.Acoustic.MdgaSound; import pp.mdga.client.Animation.AnimationHandler; -import com.jme3.light.AmbientLight; -import com.jme3.light.DirectionalLight; -import com.jme3.material.Material; -import com.jme3.math.ColorRGBA; -import com.jme3.math.Vector3f; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.queue.RenderQueue; -import com.jme3.scene.Spatial; -import com.jme3.shadow.DirectionalLightShadowRenderer; import com.jme3.system.AppSettings; +import pp.mdga.client.Board.BoardView; +import pp.mdga.client.Dialog.DialogView; public class MdgaApp extends SimpleApplication { private AnimationHandler animationHandler; + private AcousticHandler acousticHandler; + private BoardView boardView; + private DialogView dialogView; + + NanoTimer test = new NanoTimer(); + private MdgaState testState = MdgaState.MAIN; public static void main(String[] args) { - MdgaApp app = new MdgaApp(); AppSettings settings = new AppSettings(true); settings.setSamples(128); settings.setCenterWindow(true); - settings.setWidth(1300); - settings.setHeight(1000); + settings.setWidth(1280); + settings.setHeight(720); + + MdgaApp app = new MdgaApp(); app.setSettings(settings); app.setShowSettings(false); app.start(); @@ -32,62 +34,52 @@ public static void main(String[] args) { @Override public void simpleInitApp() { animationHandler = new AnimationHandler(this); + acousticHandler = new AcousticHandler(this); + boardView = new BoardView(this); + dialogView = new DialogView(this); - flyCam.setEnabled(true); - int zoom = 20; - cam.setLocation(new Vector3f(zoom,0,zoom)); - cam.lookAt(new Vector3f(0,0,0), new Vector3f(0,0,1)); + //dialogView.mainMenu(); + //acousticHandler.playState(MdgaState.GAME); - DirectionalLight sun = new DirectionalLight(); - sun.setColor(ColorRGBA.White); - sun.setDirection(new Vector3f(-1,0,-1)); - rootNode.addLight(sun); - AmbientLight ambient = new AmbientLight(); - ambient.setColor(new ColorRGBA(0.3f,0.3f,0.3f,1)); - rootNode.addLight(ambient); - - final int SHADOWMAP_SIZE=1024*8; - DirectionalLightShadowRenderer dlsr = new DirectionalLightShadowRenderer(assetManager, SHADOWMAP_SIZE, 4); - dlsr.setLight(sun); - viewPort.addProcessor(dlsr); - - createModel(Asset.lw).setLocalTranslation(new Vector3f(0,-10,0)); - createModel(Asset.cir).setLocalTranslation(new Vector3f(0,-8,0)); - createModel(Asset.marine).setLocalTranslation(new Vector3f(0,-6,0)); - createModel(Asset.heer).setLocalTranslation(new Vector3f(0,-4,0)); - createModel(Asset.node_normal).setLocalTranslation(new Vector3f(0,-2.5f,0)); - createModel(Asset.node_home_blue).setLocalTranslation(new Vector3f(0,-1,0)); - createModel(Asset.smallTent).setLocalTranslation(new Vector3f(0,1,0)); - createModel(Asset.tank).setLocalTranslation(new Vector3f(0,5,0)); - createModel(Asset.jet).setLocalTranslation(new Vector3f(0,12,0)); - createModel(Asset.ship).setLocalTranslation(new Vector3f(0,17,0)); - createModel(Asset.radar).setLocalTranslation(new Vector3f(0,20,0)); - - createModel(Asset.world); - - System.out.println(Asset.node_normal.getModelPath()); - System.out.println(Asset.node_normal.getDiffPath()); - } - - - private Spatial createModel(Asset asset){ - String modelName = asset.getModelPath(); - String texName = asset.getDiffPath(); - Spatial model = assetManager.loadModel(modelName); - model.scale(asset.getSize()); - model.rotate((float) Math.toRadians(0), 0, (float) Math.toRadians(90)); - model.setShadowMode(RenderQueue.ShadowMode.CastAndReceive); - Material mat = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); - mat.setTexture("DiffuseMap", assetManager.loadTexture(texName)); - model.setMaterial(mat); - rootNode.attachChild(model); - return model; + acousticHandler.playSound(MdgaSound.LOST); + acousticHandler.playSound(MdgaSound.VICTORY); } @Override public void simpleUpdate(float tpf) { - //this method will be called every game tick and can be used to make updates + acousticHandler.update(); + + //test.reset(); + if(test.getTimeInSeconds() > 10){ + if(testState == MdgaState.MAIN) { + testState = MdgaState.LOBBY; + acousticHandler.playState(MdgaState.MAIN); + } else if (testState == MdgaState.LOBBY) { + testState = MdgaState.CEREMONY; + acousticHandler.playState(MdgaState.LOBBY); + } + else { + testState = MdgaState.MAIN; + acousticHandler.playState(MdgaState.CEREMONY); + } + + test.reset(); + } } + public AnimationHandler getAnimationHandler() { + return animationHandler; + } + + public AcousticHandler getAcousticHandler() { + return acousticHandler; + } + + public BoardView getBoardView() { + return boardView; + } + + public DialogView getDialogView() { + return dialogView; } } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaState.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaState.java new file mode 100644 index 00000000..be3d32de --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaState.java @@ -0,0 +1,48 @@ +package pp.mdga.client; + +import pp.mdga.notification.Notification; +import pp.mdga.notification.PieceInGameNotification; +import pp.mdga.notification.PlayerInGameNotification; + +public enum MdgaState { + NONE { + @Override + void handleNotification(MdgaApp app, Notification notification) { + throw new RuntimeException("unexpected notification"); + } + }, + MAIN { + @Override + void handleNotification(MdgaApp app, Notification notification) { + throw new RuntimeException("unexpected notification"); + } + }, + LOBBY { + @Override + void handleNotification(MdgaApp app, Notification notification) { + throw new RuntimeException("unexpected notification"); + } + }, + GAME { + @Override + void handleNotification(MdgaApp app, Notification notification) { + if(notification instanceof PlayerInGameNotification) { + //TODO + } + else if(notification instanceof PieceInGameNotification){ + //TODO + } + else { + throw new RuntimeException("unexpected notification"); + } + } + }, + CEREMONY { + @Override + void handleNotification(MdgaApp app, Notification notification) { + throw new RuntimeException("unexpected notification"); + } + }; + + abstract void handleNotification(MdgaApp app, Notification notification); +} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/NotificationSynchronizer.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/NotificationSynchronizer.java new file mode 100644 index 00000000..2a95a2a7 --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/NotificationSynchronizer.java @@ -0,0 +1,23 @@ +package pp.mdga.client; + +import pp.mdga.notification.Notification; + +import java.util.ArrayList; + +public class NotificationSynchronizer { + private final MdgaApp app; + private MdgaState state = MdgaState.MAIN; + + NotificationSynchronizer(MdgaApp app) { + this.app = app; + } + + void update() { + ArrayList notifications = new ArrayList<>(); + //TODO fetch model notifications + + for (Notification n : notifications) { + state.handleNotification(app, n); + } + } +} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/State/CeremonyState.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/State/CeremonyState.java deleted file mode 100644 index 47b40346..00000000 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/State/CeremonyState.java +++ /dev/null @@ -1,5 +0,0 @@ -package pp.mdga.client.State; - -public class CeremonyState { - -} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/State/GameState.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/State/GameState.java deleted file mode 100644 index deddeb1d..00000000 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/State/GameState.java +++ /dev/null @@ -1,5 +0,0 @@ -package pp.mdga.client.State; - -public class GameState { - -} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/State/LobbyState.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/State/LobbyState.java deleted file mode 100644 index 58777b55..00000000 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/State/LobbyState.java +++ /dev/null @@ -1,5 +0,0 @@ -package pp.mdga.client.State; - -public class LobbyState { - -} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/State/MdgaState.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/State/MdgaState.java deleted file mode 100644 index 8476a7af..00000000 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/State/MdgaState.java +++ /dev/null @@ -1,5 +0,0 @@ -package pp.mdga.client.State; - -public class MdgaState { - -} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/State/MusicState.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/State/MusicState.java deleted file mode 100644 index b1e5484d..00000000 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/State/MusicState.java +++ /dev/null @@ -1,5 +0,0 @@ -package pp.mdga.client.State; - -public class MusicState { - -} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/State/SoundState.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/State/SoundState.java deleted file mode 100644 index f3184745..00000000 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/State/SoundState.java +++ /dev/null @@ -1,5 +0,0 @@ -package pp.mdga.client.State; - -public class SoundState { - -} diff --git a/Projekte/mdga/client/src/main/resources/circle_map.mdga b/Projekte/mdga/client/src/main/resources/circle_map.mdga new file mode 100644 index 00000000..71c74643 --- /dev/null +++ b/Projekte/mdga/client/src/main/resources/circle_map.mdga @@ -0,0 +1,66 @@ +world 0,0 + +# jet 0,0 + +#Nodes für Map +node_start 8,0 +node 8,1 +node 8,2 +node 7,3 +node_bonus 6,4 +node 5,5 +node 4,6 +node 3,7 +node 2,8 +node 1,8 +node_start 0,8 +node -1,8 +node -2,8 +node -3,7 +node_bonus -4,6 +node -5,5 +node -6,4 +node -7,3 +node -8,2 +node -8,1 +node_start -8,0 +node -8,-1 +node -8,-2 +node -7,-3 +node_bonus -6,-4 +node -5,-5 +node -4,-6 +node -3,-7 +node -2,-8 +node -1,-8 +node_start 0,-8 +node 1,-8 +node 2,-8 +node 3,-7 +node_bonus 4,-6 +node 5,-5 +node 6,-4 +node 7,-3 +node 8,-2 +node 8,-1 + +#Node Home +node_home_blue 7,0 +node_home_blue 6,0 +node_home_blue 5,0 +node_home_blue 4,0 + +node_home_black 0,4 +node_home_black 0,5 +node_home_black 0,6 +node_home_black 0,7 + +node_home_yellow 0,-4 +node_home_yellow 0,-5 +node_home_yellow 0,-6 +node_home_yellow 0,-7 + +node_home_green -4,0 +node_home_green -5,0 +node_home_green -6,0 +node_home_green -7,0 diff --git a/Projekte/mdga/client/src/main/resources/map.mdga b/Projekte/mdga/client/src/main/resources/map.mdga new file mode 100644 index 00000000..344daf81 --- /dev/null +++ b/Projekte/mdga/client/src/main/resources/map.mdga @@ -0,0 +1,64 @@ +world 0,0 + +#Nodes für Map +node_start -1,-5 +node -1,-4 +node -1,-3 +node -1,-2 +node_bonus -1,-1 +node -2,-1 +node -3,-1 +node -4,-1 +node -5,-1 +node -5,0 +node_start -5,1 +node -4,1 +node -3,1 +node -2,1 +node_bonus -1,1 +node -1,2 +node -1,3 +node -1,4 +node -1,5 +node 0,5 +node_start 1,5 +node 1,4 +node 1,3 +node 1,2 +node_bonus 1,1 +node 2,1 +node 3,1 +node 4,1 +node 5,1 +node 5,0 +node_start 5,-1 +node 4,-1 +node 3,-1 +node 2,-1 +node_bonus 1,-1 +node 1,-2 +node 1,-3 +node 1,-4 +node 1,-5 +node 0,-5 + +#Node Home +node_home_blue 0,-1 +node_home_blue 0,-2 +node_home_blue 0,-3 +node_home_blue 0,-4 + +node_home_black 0,1 +node_home_black 0,2 +node_home_black 0,3 +node_home_black 0,4 + +node_home_yellow 1,0 +node_home_yellow 2,0 +node_home_yellow 3,0 +node_home_yellow 4,0 + +node_home_green -1,0 +node_home_green -2,0 +node_home_green -3,0 +node_home_green -4,0 diff --git a/Projekte/mdga/client/src/main/resources/music/80s,Disco,Life.wav b/Projekte/mdga/client/src/main/resources/music/80s,Disco,Life.wav new file mode 100644 index 00000000..9f394d8b Binary files /dev/null and b/Projekte/mdga/client/src/main/resources/music/80s,Disco,Life.wav differ diff --git a/Projekte/mdga/client/src/main/resources/music/CREDIT.txt b/Projekte/mdga/client/src/main/resources/music/CREDIT.txt new file mode 100644 index 00000000..487d2c13 --- /dev/null +++ b/Projekte/mdga/client/src/main/resources/music/CREDIT.txt @@ -0,0 +1,22 @@ +# Credit + +## Free SynthWave Music Pack + +See "Free SynthWave Music Pack License.pdf" for LICENCE information. + + - 80s,Dico,Live.wav + - LaserParty.wav + - NeonRoadTrip.wav + - NoPressureTrance.wav + - RetroNoir.wav + - SpaceInvaders.wav + - TheSynthRave.SynthWave + +## Short Loopable Background Music + + https://joshuuu.itch.io/short-loopable-background-music + + Free for personal or commercial use as long as you don't redistribute as your own. Donations also welcome! Please add jhaeka to your credits. :) + + - DeadPlanet.wav + - Spaceship.wav diff --git a/Projekte/mdga/client/src/main/resources/music/DeadPlanet.wav b/Projekte/mdga/client/src/main/resources/music/DeadPlanet.wav new file mode 100644 index 00000000..98d78964 Binary files /dev/null and b/Projekte/mdga/client/src/main/resources/music/DeadPlanet.wav differ diff --git a/Projekte/mdga/client/src/main/resources/music/Free SynthWave Music Pack License.pdf b/Projekte/mdga/client/src/main/resources/music/Free SynthWave Music Pack License.pdf new file mode 100644 index 00000000..de1833e4 Binary files /dev/null and b/Projekte/mdga/client/src/main/resources/music/Free SynthWave Music Pack License.pdf differ diff --git a/Projekte/mdga/client/src/main/resources/music/LaserParty.wav b/Projekte/mdga/client/src/main/resources/music/LaserParty.wav new file mode 100644 index 00000000..7b1545f4 Binary files /dev/null and b/Projekte/mdga/client/src/main/resources/music/LaserParty.wav differ diff --git a/Projekte/mdga/client/src/main/resources/music/NeonRoadTrip.wav b/Projekte/mdga/client/src/main/resources/music/NeonRoadTrip.wav new file mode 100644 index 00000000..6f686d35 Binary files /dev/null and b/Projekte/mdga/client/src/main/resources/music/NeonRoadTrip.wav differ diff --git a/Projekte/mdga/client/src/main/resources/music/NoPressureTrance.wav b/Projekte/mdga/client/src/main/resources/music/NoPressureTrance.wav new file mode 100644 index 00000000..9a67bc39 Binary files /dev/null and b/Projekte/mdga/client/src/main/resources/music/NoPressureTrance.wav differ diff --git a/Projekte/mdga/client/src/main/resources/music/RetroNoir.wav b/Projekte/mdga/client/src/main/resources/music/RetroNoir.wav new file mode 100644 index 00000000..c7415be5 Binary files /dev/null and b/Projekte/mdga/client/src/main/resources/music/RetroNoir.wav differ diff --git a/Projekte/mdga/client/src/main/resources/music/SpaceInvaders.wav b/Projekte/mdga/client/src/main/resources/music/SpaceInvaders.wav new file mode 100644 index 00000000..ee24985c Binary files /dev/null and b/Projekte/mdga/client/src/main/resources/music/SpaceInvaders.wav differ diff --git a/Projekte/mdga/client/src/main/resources/music/Spaceship.wav b/Projekte/mdga/client/src/main/resources/music/Spaceship.wav new file mode 100644 index 00000000..d9be3316 Binary files /dev/null and b/Projekte/mdga/client/src/main/resources/music/Spaceship.wav differ diff --git a/Projekte/mdga/client/src/main/resources/music/SynthWave Music Pack Square.png b/Projekte/mdga/client/src/main/resources/music/SynthWave Music Pack Square.png new file mode 100644 index 00000000..e6e07e8a Binary files /dev/null and b/Projekte/mdga/client/src/main/resources/music/SynthWave Music Pack Square.png differ diff --git a/Projekte/mdga/client/src/main/resources/music/TheSynthRave.wav b/Projekte/mdga/client/src/main/resources/music/TheSynthRave.wav new file mode 100644 index 00000000..512c6160 Binary files /dev/null and b/Projekte/mdga/client/src/main/resources/music/TheSynthRave.wav differ diff --git a/Projekte/mdga/client/src/main/resources/node_home/node_home_blue.png b/Projekte/mdga/client/src/main/resources/node_home/node_home_blue_diff.png similarity index 100% rename from Projekte/mdga/client/src/main/resources/node_home/node_home_blue.png rename to Projekte/mdga/client/src/main/resources/node_home/node_home_blue_diff.png diff --git a/Projekte/mdga/client/src/main/resources/sound/GameOver.wav b/Projekte/mdga/client/src/main/resources/sound/GameOver.wav new file mode 100644 index 00000000..08b99121 Binary files /dev/null and b/Projekte/mdga/client/src/main/resources/sound/GameOver.wav differ diff --git a/Projekte/mdga/client/src/main/resources/sound/LevelUp2.wav b/Projekte/mdga/client/src/main/resources/sound/LevelUp2.wav new file mode 100644 index 00000000..53483a34 Binary files /dev/null and b/Projekte/mdga/client/src/main/resources/sound/LevelUp2.wav differ diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/effect/Effect.java b/Projekte/mdga/model/src/main/java/pp.mdga/effect/Effect.java deleted file mode 100644 index 7a4168b1..00000000 --- a/Projekte/mdga/model/src/main/java/pp.mdga/effect/Effect.java +++ /dev/null @@ -1,4 +0,0 @@ -package pp.mdga.effect; - -public interface Effect { -} diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/game/Board.java b/Projekte/mdga/model/src/main/java/pp.mdga/game/Board.java index dfd95a77..8b48d6e4 100644 --- a/Projekte/mdga/model/src/main/java/pp.mdga/game/Board.java +++ b/Projekte/mdga/model/src/main/java/pp.mdga/game/Board.java @@ -6,7 +6,7 @@ * This class will be used to hold all Board relevant data. */ public class Board { - private Map playerData; + private Map playerData; private Node[] infield; /** @@ -16,7 +16,12 @@ public Board() { infield = new Node[40]; for (int i = 0; i < 40; i++) { if (i % 10 == 0) { - infield[i] = new StartNode(); + infield[i] = new StartNode( + i == 0 ? Color.ARMY : + i == 10 ? Color.AIRFORCE : + i == 20 ? Color.CYBER : + Color.NAVY + ); } else if (i == 4 || i == 14 || i == 24 || i == 34) { infield[i] = new BonusNode(); } else { @@ -30,7 +35,7 @@ public Board() { * * @return the playerData */ - public Map getPlayerData() { + public Map getPlayerData() { return playerData; } diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/game/Card.java b/Projekte/mdga/model/src/main/java/pp.mdga/game/Card.java deleted file mode 100644 index a3296a3a..00000000 --- a/Projekte/mdga/model/src/main/java/pp.mdga/game/Card.java +++ /dev/null @@ -1,34 +0,0 @@ -package pp.mdga.game; -/** - * This class is used to create a card - */ -public class Card { - private BonusCard type; - - /** - * This constructor is used to create a new card - * - * @param type the type of the card - */ - public Card(BonusCard type) { - this.type = type; - } - - /** - * This method is used to get the type of the card - * - * @return the type of the card - */ - public BonusCard getType() { - return type; - } - - /** - * This method is used to set the type of the card - * - * @param type the new type of the card - */ - public void setType(BonusCard type) { - this.type = type; - } -} diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/game/Game.java b/Projekte/mdga/model/src/main/java/pp.mdga/game/Game.java index 2cc4661e..92a5dd30 100644 --- a/Projekte/mdga/model/src/main/java/pp.mdga/game/Game.java +++ b/Projekte/mdga/model/src/main/java/pp.mdga/game/Game.java @@ -5,15 +5,17 @@ import java.util.Map; /** - * This class will be used to handle the data stored in the model + * The Game class represents the game state of the Ludo game. + * It contains all the information needed to play the game. + * The game state is updated by the game logic. */ public class Game { private int diceModifier = 1; private int diceEyes; private Map players; private Statistic gameStatistics; - private ArrayList drawPile; - private ArrayList discardPile = new ArrayList<>(); + private ArrayList drawPile; + private ArrayList discardPile = new ArrayList<>(); private Board board; private Color activeColor; private LinkedList order; @@ -22,16 +24,238 @@ public class Game { private static final int AMOUNT_OF_TURBO_CARDS = 16; private static final int AMOUNT_OF_SHIELD_AND_SWAP_CARDS = 12; + /** + * This constructor creates a new Game object. + */ public Game(){ gameStatistics = new Statistic(); drawPile = new ArrayList<>(); for (int i = 0; i < AMOUNT_OF_TURBO_CARDS; i++) { - drawPile.add(new Card(BonusCard.TURBO)); + drawPile.add(BonusCard.TURBO); } for (int i = 0; i < AMOUNT_OF_SHIELD_AND_SWAP_CARDS; i++) { - drawPile.add(new Card(BonusCard.SHIELD)); - drawPile.add(new Card(BonusCard.SWAP)); + drawPile.add(BonusCard.SWAP); + drawPile.add(BonusCard.SHIELD); } board = new Board(); } + + /** + * This method returns the dice modifier. + * + * @return the dice modifier + */ + public int getDiceModifier() { + return diceModifier; + } + + /** + * This method sets the dice modifier. + * + * @param diceModifier the new dice modifier + */ + public void setDiceModifier(int diceModifier) { + this.diceModifier = diceModifier; + } + + /** + * This method returns the dice eyes. + * + * @return the dice eyes + */ + public int getDiceEyes() { + return diceEyes; + } + + /** + * This method sets the dice eyes. + * + * @param diceEyes the new dice eyes + */ + public void setDiceEyes(int diceEyes) { + this.diceEyes = diceEyes; + } + + /** + * This method returns the players. + * + * @return the players + */ + public Map getPlayers() { + return players; + } + + /** + * This method sets the players. + * + * @param players the new players + */ + public void setPlayers(Map players) { + this.players = players; + } + + /** + * This method returns the game statistics. + * + * @return the game statistics + */ + public Statistic getGameStatistics() { + return gameStatistics; + } + + /** + * This method sets the game statistics. + * + * @param gameStatistics the new game statistics + */ + public void setGameStatistics(Statistic gameStatistics) { + this.gameStatistics = gameStatistics; + } + + /** + * This method returns the draw pile. + * + * @return the draw pile + */ + public ArrayList getDrawPile() { + return drawPile; + } + + /** + * This method sets the draw pile. + * + * @param drawPile the new draw pile + */ + public void setDrawPile(ArrayList drawPile) { + this.drawPile = drawPile; + } + + /** + * This method returns the discard pile. + * + * @return the discard pile + */ + public ArrayList getDiscardPile() { + return discardPile; + } + + /** + * This method sets the discard pile. + * + * @param discardPile the new discard pile + */ + public void setDiscardPile(ArrayList discardPile) { + this.discardPile = discardPile; + } + + /** + * This method returns the board. + * + * @return the board + */ + public Board getBoard() { + return board; + } + + /** + * This method sets the board. + * + * @param board the new board + */ + public void setBoard(Board board) { + this.board = board; + } + + /** + * This method returns the active color. + * + * @return the active color + */ + public Color getActiveColor() { + return activeColor; + } + + /** + * This method sets the active color. + * + * @param activeColor the new active color + */ + public void setActiveColor(Color activeColor) { + this.activeColor = activeColor; + } + + /** + * This method returns the order of the players. + * + * @return the order of the players + */ + public LinkedList getOrder() { + return order; + } + + /** + * This method sets the order of the players. + * + * @param order the new order of the players + */ + public void setOrder(LinkedList order) { + this.order = order; + } + + /** + * This method returns the player connection ID. + * + * @return the player connection ID + */ + public Map getPlayerConnectionID() { + return playerConnectionID; + } + + /** + * This method sets the player connection ID. + * + * @param playerConnectionID the new player connection ID + */ + public void setPlayerConnectionID(Map playerConnectionID) { + this.playerConnectionID = playerConnectionID; + } + + /** + * This method sets the player connection ID. + * + * @param color the color of the player + * @param connectionID the new connection ID + */ + public void setPlayerConnectionID(Color color, int connectionID) { + playerConnectionID.put(color, connectionID); + } + + /** + * This method returns the player connection ID. + * + * @param color the color of the player + * @return the player connection ID + */ + public int getPlayerConnectionID(Color color) { + return playerConnectionID.get(color); + } + + /** + * This method adds a player to the game. + * + * @param color the color of the player + * @param player the player to be added + */ + public void addPlayer(Color color, Player player) { + players.put(color, player); + } + + /** + * This method removes a player from the game. + * + * @param color the color of the player + */ + public void removePlayer(Color color) { + players.remove(color); + } } diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/game/Piece.java b/Projekte/mdga/model/src/main/java/pp.mdga/game/Piece.java index 47d3041c..e68f3d26 100644 --- a/Projekte/mdga/model/src/main/java/pp.mdga/game/Piece.java +++ b/Projekte/mdga/model/src/main/java/pp.mdga/game/Piece.java @@ -1,36 +1,75 @@ package pp.mdga.game; +/** + * This class will be used to hold all Piece relevant data. + */ public class Piece { private ShieldState shield; private PieceState state; private Color color; + /** + * This constructor is used to create a new Piece + * + * @param color the color of the piece + * @param state the state of the piece + */ public Piece(Color color, PieceState state) { this.color = color; this.state = state; shield = ShieldState.NONE; } + /** + * This method is used to get the color of the piece + * + * @return the color of the piece + */ public void setShield(ShieldState shield) { this.shield = shield; } + /** + * This method is used to get the color of the piece + * + * @return the color of the piece + */ public ShieldState getShield() { return shield; } + /** + * This method is used to get the color of the piece + * + * @param state the state of the piece + */ public void setState(PieceState state) { this.state = state; } + /** + * This method is used to get the color of the piece + * + * @return the color of the piece + */ public PieceState getState() { return state; } + /** + * This method is used to get the color of the piece + * + * @return the color of the piece + */ public boolean isShielded() { return shield == ShieldState.ACTIVE; } + /** + * This method is used to get the color of the piece + * + * @return the color of the piece + */ public boolean isSuppressed() { return shield == ShieldState.SUPPRESSED; } diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/game/Player.java b/Projekte/mdga/model/src/main/java/pp.mdga/game/Player.java index cc7d4b05..2a97d27c 100644 --- a/Projekte/mdga/model/src/main/java/pp.mdga/game/Player.java +++ b/Projekte/mdga/model/src/main/java/pp.mdga/game/Player.java @@ -9,7 +9,7 @@ public class Player { private String name; private Statistic playerStatistic; - private ArrayList handCards; + private ArrayList handCards; private final int id; /** @@ -53,17 +53,17 @@ public Statistic getPlayerStatistic() { * * @return the handCards of the player */ - public ArrayList getHandCards() { + public ArrayList getHandCards() { return handCards; } /** * This method adds a new handCard to the player * - * @param cards the card to be added to the players hand + * @param card the card to be added to the players hand */ - public void addHandCards(Card cards){ - handCards.add(cards); + public void addHandCards(BonusCard card){ + handCards.add(card); } /** @@ -72,8 +72,8 @@ public void addHandCards(Card cards){ * @param card the cards type to be removed * @return the removed card or null if there is none of that card type */ - public Card removeHandCard(Card card) { - Card cardToRemove = handCards.stream().filter(card1 -> card1.getType().equals(card.getType())).findFirst().orElse(null); + public BonusCard removeHandCard(BonusCard card) { + BonusCard cardToRemove = handCards.stream().filter(c -> c.equals(card)).findFirst().orElse(null); if (cardToRemove != null) { handCards.remove(cardToRemove); } diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/game/StartNode.java b/Projekte/mdga/model/src/main/java/pp.mdga/game/StartNode.java index 35130151..85e70cb3 100644 --- a/Projekte/mdga/model/src/main/java/pp.mdga/game/StartNode.java +++ b/Projekte/mdga/model/src/main/java/pp.mdga/game/StartNode.java @@ -2,7 +2,11 @@ public class StartNode extends Node { - public StartNode() {} + public StartNode(Color color) { + this.color = color; + } + + private Color color; /** * This method is used to set a new Occupant @@ -16,4 +20,22 @@ public void setOccupant(Piece occupant) { } this.occupant = occupant; } + + /** + * This method is used to get the color of the node + * + * @return the color of the node + */ + public Color getColor() { + return color; + } + + /** + * This method is used to set the color of the node + * + * @param color the new color of the node + */ + public void setColor(Color color) { + this.color = color; + } } diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/message/client/ClientMessage.java b/Projekte/mdga/model/src/main/java/pp.mdga/message/client/ClientMessage.java index 2b9f4111..11dae3e0 100644 --- a/Projekte/mdga/model/src/main/java/pp.mdga/message/client/ClientMessage.java +++ b/Projekte/mdga/model/src/main/java/pp.mdga/message/client/ClientMessage.java @@ -3,8 +3,10 @@ import com.jme3.network.AbstractMessage; public abstract class ClientMessage extends AbstractMessage { + protected ClientMessage() { super(true); } + public abstract void accept(ClientInterpreter interpreter, int from); } diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/notification/ActivePlayerNotification.java b/Projekte/mdga/model/src/main/java/pp.mdga/notification/ActivePlayerNotification.java new file mode 100644 index 00000000..8a2e0339 --- /dev/null +++ b/Projekte/mdga/model/src/main/java/pp.mdga/notification/ActivePlayerNotification.java @@ -0,0 +1,9 @@ +package pp.mdga.notification; + +import pp.mdga.game.Color; + +public class ActivePlayerNotification extends Notification { + ActivePlayerNotification(Color color) { + + } +} diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/notification/DrawCardNotification.java b/Projekte/mdga/model/src/main/java/pp.mdga/notification/DrawCardNotification.java new file mode 100644 index 00000000..a8c73551 --- /dev/null +++ b/Projekte/mdga/model/src/main/java/pp.mdga/notification/DrawCardNotification.java @@ -0,0 +1,10 @@ +package pp.mdga.notification; + +import pp.mdga.game.BonusCard; +import pp.mdga.game.Color; + +public class DrawCardNotification extends Notification { + DrawCardNotification(Color color, BonusCard card) { + + } +} diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/notification/InterruptNotification.java b/Projekte/mdga/model/src/main/java/pp.mdga/notification/InterruptNotification.java new file mode 100644 index 00000000..f9459c55 --- /dev/null +++ b/Projekte/mdga/model/src/main/java/pp.mdga/notification/InterruptNotification.java @@ -0,0 +1,9 @@ +package pp.mdga.notification; + +import pp.mdga.game.Color; + +public class InterruptNotification extends Notification { + InterruptNotification(Color color) { + + } +} diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/notification/MovePieceNotification.java b/Projekte/mdga/model/src/main/java/pp.mdga/notification/MovePieceNotification.java new file mode 100644 index 00000000..b35918cc --- /dev/null +++ b/Projekte/mdga/model/src/main/java/pp.mdga/notification/MovePieceNotification.java @@ -0,0 +1,9 @@ +package pp.mdga.notification; + +import pp.mdga.game.Color; + +public class MovePieceNotification extends Notification { + MovePieceNotification(Color color, int nodeIndex) { + + } +} diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/notification/Notification.java b/Projekte/mdga/model/src/main/java/pp.mdga/notification/Notification.java new file mode 100644 index 00000000..3f8be5da --- /dev/null +++ b/Projekte/mdga/model/src/main/java/pp.mdga/notification/Notification.java @@ -0,0 +1,4 @@ +package pp.mdga.notification; + +public abstract class Notification { +} diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/notification/PieceInGameNotification.java b/Projekte/mdga/model/src/main/java/pp.mdga/notification/PieceInGameNotification.java new file mode 100644 index 00000000..5e0585fd --- /dev/null +++ b/Projekte/mdga/model/src/main/java/pp.mdga/notification/PieceInGameNotification.java @@ -0,0 +1,11 @@ +package pp.mdga.notification; + +import pp.mdga.game.Color; + +import java.util.UUID; + +public class PieceInGameNotification extends Notification{ + PieceInGameNotification(Color color, UUID id) { + + } +} diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/notification/PlayCardNotification.java b/Projekte/mdga/model/src/main/java/pp.mdga/notification/PlayCardNotification.java new file mode 100644 index 00000000..f2e73063 --- /dev/null +++ b/Projekte/mdga/model/src/main/java/pp.mdga/notification/PlayCardNotification.java @@ -0,0 +1,10 @@ +package pp.mdga.notification; + +import pp.mdga.game.BonusCard; +import pp.mdga.game.Color; + +public class PlayCardNotification extends Notification { + PlayCardNotification(Color color, BonusCard card) { + + } +} diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/notification/PlayerInGameNotification.java b/Projekte/mdga/model/src/main/java/pp.mdga/notification/PlayerInGameNotification.java new file mode 100644 index 00000000..c1c77cc9 --- /dev/null +++ b/Projekte/mdga/model/src/main/java/pp.mdga/notification/PlayerInGameNotification.java @@ -0,0 +1,9 @@ +package pp.mdga.notification; + +import pp.mdga.game.Color; + +public class PlayerInGameNotification extends Notification { + PlayerInGameNotification(Color color, String name) { + + } +} diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/notification/ResumeNotification.java b/Projekte/mdga/model/src/main/java/pp.mdga/notification/ResumeNotification.java new file mode 100644 index 00000000..6a28137d --- /dev/null +++ b/Projekte/mdga/model/src/main/java/pp.mdga/notification/ResumeNotification.java @@ -0,0 +1,9 @@ +package pp.mdga.notification; + +import pp.mdga.game.Color; + +public class ResumeNotification extends Notification { + ResumeNotification(Color color) { + + } +} diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/notification/RollDiceNotification.java b/Projekte/mdga/model/src/main/java/pp.mdga/notification/RollDiceNotification.java new file mode 100644 index 00000000..48ca8192 --- /dev/null +++ b/Projekte/mdga/model/src/main/java/pp.mdga/notification/RollDiceNotification.java @@ -0,0 +1,9 @@ +package pp.mdga.notification; + +import pp.mdga.game.Color; + +public class RollDiceNotification extends Notification{ + RollDiceNotification(Color color, int eyes, int moveNumber) { + + } +} diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/notification/SwapPieceNotification.java b/Projekte/mdga/model/src/main/java/pp.mdga/notification/SwapPieceNotification.java new file mode 100644 index 00000000..b287e403 --- /dev/null +++ b/Projekte/mdga/model/src/main/java/pp.mdga/notification/SwapPieceNotification.java @@ -0,0 +1,9 @@ +package pp.mdga.notification; + +import java.util.UUID; + +public class SwapPieceNotification extends Notification { + SwapPieceNotification(UUID a, UUID b) { + assert(!a.equals(b)); + } +} diff --git a/Projekte/settings.gradle b/Projekte/settings.gradle index 532a4d06..104d7419 100644 --- a/Projekte/settings.gradle +++ b/Projekte/settings.gradle @@ -34,6 +34,3 @@ } include 'mdga:client' findProject(':mdga:client')?.name = 'client' -include 'mdga:client' -findProject(':mdga:client')?.name = 'client' -