92 Commits

Author SHA1 Message Date
Johannes Schmelz
a686671c15 Merge branch 'reworkedGui' into 'main'
refactor Worlds and client States

See merge request progproj/gruppen-ht24/Gruppe-02!18
2024-12-08 01:18:35 +00:00
Johannes Schmelz
e102d22f14 refactor Worlds and client States 2024-12-08 01:18:35 +00:00
Johannes Schmelz
2e256f4ff5 Merge branch 'gui' into 'main'
Gui v1.0

See merge request progproj/gruppen-ht24/Gruppe-02!16
2024-11-25 05:33:36 +00:00
Johannes Schmelz
d10111d2ab Gui v1.0 2024-11-25 05:33:36 +00:00
Johannes Schmelz
f67ce6be44 Merge branch 'Testhandbuch' into 'main'
newest version of tests

See merge request progproj/gruppen-ht24/Gruppe-02!15
2024-11-25 04:34:06 +00:00
Johannes Schmelz
1be29b8b7a newest version of tests 2024-11-25 04:34:06 +00:00
Johannes Schmelz
b85bbdd0ad updates gitignore for vscode 2024-11-19 21:29:48 +01:00
Johannes Schmelz
7246133363 refactor models 2024-11-18 17:10:36 +01:00
Johannes Schmelz
e38a7e8cdd Merge branch 'gui' into 'main'
Gui

See merge request progproj/gruppen-ht24/Gruppe-02!10
2024-11-18 15:46:18 +00:00
Johannes Schmelz
dbd9dd0001 refactor models 2024-11-18 16:43:54 +01:00
Dennis_Malkmus
ccb1743a01 Einfügen Übergangsmodell (6 gefärbte Spielsteine) 2024-11-18 14:57:02 +01:00
Dennis_Malkmus
4ac897693c Merge remote-tracking branch 'origin/gui' into gui 2024-11-18 14:56:48 +01:00
Dennis_Malkmus
dfb962e9fe Einfügen Übergangsmodell (6 gefärbte Spielsteine) 2024-11-18 14:53:51 +01:00
Luca Puderbach
f97cbd778d Hintergrund + Felder ID hinzugefügt 2024-11-18 09:09:05 +01:00
Luca Puderbach
e889a61d43 Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-18 08:14:10 +01:00
Luca Puderbach
a33d422547 Protoyp Würfel eingefügt 2024-11-18 08:14:05 +01:00
Yvonne Schmidt
c4b4001b96 Merge remote-tracking branch 'origin/gui' into gui 2024-11-18 08:07:11 +01:00
Luca Puderbach
20949b641e Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-18 08:05:35 +01:00
Luca Puderbach
56e2174b6d Figur ist jetzt flawless übers Spielfeld am flyen 2024-11-18 08:02:53 +01:00
Yvonne Schmidt
acfeebca14 Startmenü fertig 2024-11-18 07:52:47 +01:00
Yvonne Schmidt
cc47acbd3f Merge remote-tracking branch 'origin/gui' into gui 2024-11-18 07:27:21 +01:00
Yvonne Schmidt
869e16406d eigenes GUI Styling eingeführt 2024-11-18 07:26:31 +01:00
Luca Puderbach
1c99da4fc5 Hinzugefügt Kamera und 1. Spielfigut 2024-11-18 07:25:15 +01:00
Yvonne Schmidt
b74ca4e702 eigenes GUI Styling eingeführt 2024-11-18 07:04:44 +01:00
Luca Puderbach
5fde7451c8 Verbesserung TestWorld 2024-11-18 06:54:38 +01:00
Luca Puderbach
6fd9209336 Angleichen MonopolyApp 2024-11-18 05:58:18 +01:00
Luca Puderbach
0213dc3560 Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-18 05:55:15 +01:00
Luca Puderbach
e73c434c1b Angleichen Monopolyapp 2024-11-18 05:55:10 +01:00
Johannes Schmelz
b135f3fa50 idk 2024-11-18 05:51:31 +01:00
Johannes Schmelz
0e580a3180 Figure Syncronizer now added 2024-11-18 05:38:04 +01:00
Yvonne Schmidt
8e3cb43244 eigenes GUI Styling eingeführt 2024-11-18 05:32:33 +01:00
Johannes Schmelz
6dcfb92dba resolve merge conflict 2024-11-18 05:07:41 +01:00
Johannes Schmelz
a7ea5773da resolve merge conflict 2024-11-18 05:05:37 +01:00
Johannes Schmelz
5b66131d30 Merge branch 'logic' into 'gui'
Refactor

See merge request progproj/gruppen-ht24/Gruppe-02!9
2024-11-18 04:01:41 +00:00
Johannes Schmelz
cac06dda7d Refactor 2024-11-18 04:01:41 +00:00
Johannes Schmelz
12c1c97a99 Merge branch 'logic' into 'gui'
# Conflicts:
#   Projekte/monopoly/model/src/main/java/pp/monopoly/game/client/ClientGameLogic.java
#   Projekte/monopoly/model/src/main/java/pp/monopoly/notification/Sound.java
2024-11-18 03:50:41 +00:00
Luca Puderbach
af4b4243ea Resolve merge conflicts 2024-11-18 04:42:30 +01:00
Johannes Schmelz
5189c74058 Merge branch 'gui' into 'main'
Gui

See merge request progproj/gruppen-ht24/Gruppe-02!7
2024-11-18 03:14:39 +00:00
Johannes Schmelz
fffd32e13c Merge branch 'main' into 'gui'
# Conflicts:
#   Projekte/jme-common/src/main/resources/Interface/Lemur/pp-styles.groovy
#   Projekte/monopoly/client/src/main/java/pp/monopoly/client/GameSound.java
#   Projekte/monopoly/client/src/main/java/pp/monopoly/client/MonopolyApp.java
#   Projekte/monopoly/client/src/main/java/pp/monopoly/client/StartMenu.java
#   Projekte/monopoly/model/src/main/java/pp/monopoly/game/client/ClientGameLogic.java
#   Projekte/monopoly/model/src/main/java/pp/monopoly/game/server/ServerGameLogic.java
#   Projekte/monopoly/model/src/main/resources/monopoly.properties
2024-11-18 03:14:07 +00:00
Johannes Schmelz
b37a5095f0 client recieve message logic 2024-11-18 03:20:39 +01:00
Johannes Schmelz
951b4c198c Server bug fix. Add player did not correspond with the params 2024-11-18 00:24:15 +01:00
Yvonne Schmidt
8698eed273 Tooolbar implementiert 2024-11-17 22:33:58 +01:00
Yvonne Schmidt
1af8614b35 Tooolbar in Testworld implementiert 2024-11-17 22:33:12 +01:00
Johannes Schmelz
11faeeaf45 Merge branch 'Testhandbuch' into 'main'
Erste Tests

See merge request progproj/gruppen-ht24/Gruppe-02!5
2024-11-17 18:28:55 +00:00
Johannes Schmelz
9d0fcc3370 Erste Tests 2024-11-17 18:28:55 +00:00
Johannes Schmelz
2f6d6037de Merge branch 'logic' into 'main'
Serverseitige Logik

See merge request progproj/gruppen-ht24/Gruppe-02!6
2024-11-17 18:25:32 +00:00
Johannes Schmelz
1d69bcc814 refactor and bug fixes 2024-11-17 17:43:05 +01:00
Johannes Schmelz
62c363068b fixed bug with client server messages 2024-11-16 18:57:52 +01:00
Johannes Schmelz
d2e0b8187b implemented PlayerStates 2024-11-16 18:42:05 +01:00
Johannes Schmelz
628b98af9b recive logic for messages 2024-11-16 18:03:19 +01:00
Johannes Schmelz
627e3dbd7f added fine to FineField 2024-11-16 17:53:07 +01:00
Yvonne Schmidt
61b88f6bf8 Merge remote-tracking branch 'origin/gui' into gui 2024-11-15 18:39:47 +01:00
Yvonne Schmidt
8ab37e73c1 Anpassung des Button designs 2024-11-15 18:39:21 +01:00
Luca Puderbach
afdf43ebf1 Übergang zu TestMap verbessert 2024-11-15 08:36:16 +01:00
Luca Puderbach
2e0d1c059d TestWord eingefügt 2024-11-15 07:00:55 +01:00
Yvonne Schmidt
2b772199b0 Merge remote-tracking branch 'origin/gui' into gui
# Conflicts:
#	Projekte/monopoly/client/src/main/java/pp/monopoly/client/StartMenu.java
2024-11-15 06:49:13 +01:00
Yvonne Schmidt
c37b850798 Buttons im Startmenü angepasst 2024-11-15 06:48:25 +01:00
Luca Puderbach
c31f924d77 CreateGame fertig für feinschliff (Icon test) 2024-11-15 06:25:21 +01:00
Luca Puderbach
ed87a6167d Verbesserung SettingsMenu 2024-11-15 05:36:57 +01:00
Yvonne Schmidt
0d86ba0ca9 Merge remote-tracking branch 'origin/gui' into gui
# Conflicts:
#	Projekte/monopoly/client/src/main/java/pp/monopoly/client/StartMenu.java
2024-11-15 05:12:39 +01:00
Luca Puderbach
f2fd283d06 Positionierung StartMenu Buttons & SettingsMenu 2024-11-15 05:04:25 +01:00
Johannes Schmelz
10b978debf fixed addPlayer 2024-11-15 04:27:32 +01:00
Luca Puderbach
85756713df Erweitern des Setting und CreateGameMenü 2024-11-15 03:23:27 +01:00
Johannes Schmelz
3bdfd6a78a TradeHandler logic 2024-11-15 03:19:48 +01:00
Johannes Schmelz
e59ab4a320 cleintmessages logic 2024-11-15 03:06:07 +01:00
Luca Puderbach
15b3902bd3 SettingsMenü Anpassungen 2024-11-15 02:31:12 +01:00
Yvonne Schmidt
b622d66942 Buttons im Startmenü ausgerichtet 2024-11-15 02:28:10 +01:00
Luca Puderbach
12ef219064 Änderungs des StartBildschirms 2024-11-15 01:25:09 +01:00
Luca Puderbach
853b52b52d Implementierung eines grundlegenden Startmenüs 2024-11-15 00:39:47 +01:00
Johannes Schmelz
7a2ad1d31a corrected server states 2024-11-14 23:50:18 +01:00
Johannes Schmelz
c5ad476eaf added rent payment logic
added player on field logic
2024-11-14 23:50:06 +01:00
Filip Szepielewicz
12978ff410 T001 - T034 erster versuch 2024-11-14 21:54:27 +01:00
Yvonne Schmidt
caa45097c3 klassen angepasst 2024-11-14 21:31:47 +01:00
Johannes Schmelz
232e3a117c corrected rent prices 2024-11-14 01:08:22 +01:00
Johannes Schmelz
3668382911 FineField in Player 2024-11-13 23:50:06 +01:00
Johannes Schmelz
fafa53ffb7 rent calculation 2024-11-13 23:49:37 +01:00
Johannes Schmelz
44673fd57e createBoard method 2024-11-13 23:30:04 +01:00
Johannes Schmelz
f7149f225c Interpreter fuer messages hinzugefuegt 2024-11-13 18:54:24 +01:00
Johannes Schmelz
6773e18d34 Message Klassen hinzugefuegt 2024-11-13 14:11:20 +01:00
Johannes Schmelz
19a9b06f3c Merge branch 'gui' into 'main'
First compileable version of Client

See merge request progproj/gruppen-ht24/Gruppe-02!4
2024-11-13 12:42:37 +00:00
Johannes Schmelz
7ee2273761 First compileable version of Client 2024-11-13 12:42:37 +00:00
Johannes Schmelz
86b8297c9d fixed bugs, game now compiles 2024-11-13 13:31:02 +01:00
Yvonne Schmidt
17533112a1 Startmenü implementiert und Spielmenü Stummel erstellt 2024-11-12 23:30:44 +01:00
Johannes Schmelz
2cc1a338ec added Figure to Player for visual representation 2024-11-12 22:36:02 +01:00
Johannes Schmelz
81731247c7 added Fields 2024-11-12 22:35:41 +01:00
Johannes Schmelz
65c85aacf0 started UC-gameplay-15 2024-11-12 22:34:46 +01:00
Johannes Schmelz
dca23151a8 added Visitors 2024-11-12 22:33:10 +01:00
Johannes Schmelz
25305760c5 added Player 2024-11-12 22:32:55 +01:00
Yvonne Schmidt
3ef2459ad0 Hintergrundfarbe der Menüs zu Weiß geändert 2024-11-12 21:32:46 +01:00
Johannes Schmelz
29a56f42a8 Merge branch 'main' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 2024-11-12 14:53:08 +01:00
Johannes Schmelz
3784348f91 init for monopoly 2024-11-12 14:53:04 +01:00
Johannes Schmelz
188ec03abd working version of battleship 2024-11-12 00:37:05 +01:00
381 changed files with 584421 additions and 770 deletions

1
.gitignore vendored
View File

@@ -4,6 +4,7 @@ build
# VSC
bin
.vscode
# IntelliJ
*.iml

View File

@@ -0,0 +1,18 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="MonopolyApp (Mac)" type="Application" factoryName="Application"
singleton="false">
<option name="MAIN_CLASS_NAME" value="pp.monopoly.client.MonopolyApp"/>
<module name="Projekte.monopoly.client.main"/>
<option name="VM_PARAMETERS" value="-XstartOnFirstThread"/>
<option name="WORKING_DIRECTORY" value="$MODULE_WORKING_DIR$"/>
<extension name="coverage">
<pattern>
<option name="PATTERN" value="pp.monopoly.client.*"/>
<option name="ENABLED" value="true"/>
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true"/>
</method>
</configuration>
</component>

View File

@@ -0,0 +1,18 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="MonopolyApp" type="Application" factoryName="Application" singleton="false"
nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="pp.monopoly.client.MonopolyApp"/>
<module name="Projekte.monopoly.client.main"/>
<option name="VM_PARAMETERS" value="-Djava.util.logging.config.file=logging.properties"/>
<option name="WORKING_DIRECTORY" value="$MODULE_WORKING_DIR$"/>
<extension name="coverage">
<pattern>
<option name="PATTERN" value="pp.monopoly.client.*"/>
<option name="ENABLED" value="true"/>
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true"/>
</method>
</configuration>
</component>

View File

@@ -0,0 +1,17 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="MonopolyServer" type="Application" factoryName="Application"
nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="pp.monopoly.server.MonopolyServer"/>
<module name="Projekte.monopoly.server.main"/>
<option name="WORKING_DIRECTORY" value="$MODULE_WORKING_DIR$"/>
<extension name="coverage">
<pattern>
<option name="PATTERN" value="pp.monopoly.server.*"/>
<option name="ENABLED" value="true"/>
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true"/>
</method>
</configuration>
</component>

View File

@@ -9,6 +9,7 @@ dependencies {
implementation project(":battleship:model")
implementation libs.jme3.desktop
implementation libs.jme3.effects
runtimeOnly libs.jme3.awt.dialogs
runtimeOnly libs.jme3.plugins

View File

@@ -9,7 +9,7 @@
#
# Specifies the map used by the opponent in single mode.
# Single mode is activated if this property is set.
map.opponent=maps/map2.json
#map.opponent=maps/map2.json
#
# Specifies the map used by the player in single mode.
# The player must define their own map if this property is not set.

View File

@@ -1,66 +0,0 @@
{
"width": 10,
"height": 10,
"ships": [
{
"length": 4,
"x": 15,
"y": 5,
"rot": "DOWN"
},
{
"length": 3,
"x": 0,
"y": 9,
"rot": "DOWN"
},
{
"length": 3,
"x": 2,
"y": 6,
"rot": "RIGHT"
},
{
"length": 2,
"x": 4,
"y": 8,
"rot": "RIGHT"
},
{
"length": 2,
"x": 2,
"y": 4,
"rot": "DOWN"
},
{
"length": 2,
"x": 2,
"y": 1,
"rot": "DOWN"
},
{
"length": 1,
"x": 6,
"y": 2,
"rot": "RIGHT"
},
{
"length": 1,
"x": 8,
"y": 2,
"rot": "RIGHT"
},
{
"length": 1,
"x": 6,
"y": 0,
"rot": "RIGHT"
},
{
"length": 1,
"x": 8,
"y": 0,
"rot": "RIGHT"
}
]
}

View File

@@ -1,66 +0,0 @@
{
"width": 10,
"height": 10,
"ships": [
{
"length": 4,
"x": 0,
"y": 5,
"rot": "DOWN"
},
{
"length": 3,
"x": 0,
"y": 9,
"rot": "DOWN"
},
{
"length": 3,
"x": 2,
"y": 6,
"rot": "RIGHT"
},
{
"length": 2,
"x": 0,
"y": 8,
"rot": "RIGHT"
},
{
"length": 2,
"x": 2,
"y": 4,
"rot": "DOWN"
},
{
"length": 2,
"x": 2,
"y": 1,
"rot": "DOWN"
},
{
"length": 1,
"x": 6,
"y": 2,
"rot": "RIGHT"
},
{
"length": 1,
"x": 8,
"y": 2,
"rot": "RIGHT"
},
{
"length": 1,
"x": 6,
"y": 0,
"rot": "RIGHT"
},
{
"length": 1,
"x": 8,
"y": 0,
"rot": "RIGHT"
}
]
}

View File

@@ -1,66 +0,0 @@
{
"width": 10,
"height": 10,
"ships": [
{
"length": 4,
"x": 0,
"y": 5,
"rot": "DOWN"
},
{
"length": 3,
"x": 0,
"y": 9,
"rot": "DOWN"
},
{
"length": 3,
"x": 0,
"y": 6,
"rot": "RIGHT"
},
{
"length": 2,
"x": 4,
"y": 8,
"rot": "RIGHT"
},
{
"length": 2,
"x": 2,
"y": 4,
"rot": "DOWN"
},
{
"length": 2,
"x": 2,
"y": 1,
"rot": "DOWN"
},
{
"length": 1,
"x": 6,
"y": 2,
"rot": "RIGHT"
},
{
"length": 1,
"x": 8,
"y": 2,
"rot": "RIGHT"
},
{
"length": 1,
"x": 6,
"y": 0,
"rot": "RIGHT"
},
{
"length": 1,
"x": 8,
"y": 0,
"rot": "RIGHT"
}
]
}

View File

@@ -1,60 +0,0 @@
{
"width": 10,
"height": 10,
"ships": [
{
"length": 3,
"x": 0,
"y": 9,
"rot": "DOWN"
},
{
"length": 3,
"x": 2,
"y": 6,
"rot": "RIGHT"
},
{
"length": 2,
"x": 4,
"y": 8,
"rot": "RIGHT"
},
{
"length": 2,
"x": 2,
"y": 4,
"rot": "DOWN"
},
{
"length": 2,
"x": 2,
"y": 1,
"rot": "DOWN"
},
{
"length": 1,
"x": 6,
"y": 2,
"rot": "RIGHT"
},
{
"length": 1,
"x": 8,
"y": 2,
"rot": "RIGHT"
},
{
"length": 1,
"x": 6,
"y": 0,
"rot": "RIGHT"
},
{
"length": 1,
"x": 8,
"y": 0,
"rot": "RIGHT"
}
]
}

View File

@@ -1,66 +0,0 @@
{
"width": 10,
"height": 10,
"ships": [
{
"length": 4,
"x": 0,
"y": 9,
"rot": "RIGHT"
},
{
"length": 3,
"x": 4,
"y": 9,
"rot": "RIGHT"
},
{
"length": 3,
"x": 7,
"y": 9,
"rot": "RIGHT"
},
{
"length": 2,
"x": 0,
"y": 8,
"rot": "RIGHT"
},
{
"length": 2,
"x": 2,
"y": 8,
"rot": "RIGHT"
},
{
"length": 2,
"x": 4,
"y": 8,
"rot": "RIGHT"
},
{
"length": 1,
"x": 6,
"y": 8,
"rot": "RIGHT"
},
{
"length": 1,
"x": 7,
"y": 8,
"rot": "RIGHT"
},
{
"length": 1,
"x": 8,
"y": 8,
"rot": "RIGHT"
},
{
"length": 1,
"x": 9,
"y": 8,
"rot": "RIGHT"
}
]
}

View File

@@ -1,66 +0,0 @@
{
"width": 10,
"height": 10,
"ships": [
{
"length": 4,
"x": 0,
"y": 9,
"rot": "RIGHT"
},
{
"length": 3,
"x": 0,
"y": 8,
"rot": "RIGHT"
},
{
"length": 3,
"x": 0,
"y": 7,
"rot": "RIGHT"
},
{
"length": 2,
"x": 0,
"y": 6,
"rot": "RIGHT"
},
{
"length": 2,
"x": 0,
"y": 5,
"rot": "RIGHT"
},
{
"length": 2,
"x": 0,
"y": 4,
"rot": "RIGHT"
},
{
"length": 1,
"x": 0,
"y": 3,
"rot": "RIGHT"
},
{
"length": 1,
"x": 0,
"y": 2,
"rot": "RIGHT"
},
{
"length": 1,
"x": 0,
"y": 1,
"rot": "RIGHT"
},
{
"length": 1,
"x": 0,
"y": 0,
"rot": "RIGHT"
}
]
}

View File

@@ -22,6 +22,7 @@ import com.simsilica.lemur.GuiGlobals;
import com.simsilica.lemur.style.BaseStyles;
import pp.battleship.client.gui.BattleAppState;
import pp.battleship.client.gui.EditorAppState;
import pp.battleship.client.gui.GameMusic;
import pp.battleship.client.gui.SeaAppState;
import pp.battleship.game.client.BattleshipClient;
import pp.battleship.game.client.ClientGameLogic;
@@ -282,15 +283,14 @@ public class BattleshipApp extends SimpleApplication implements BattleshipClient
}
/**
* Attaches the music state and sets its initial enabled state.
* Attaches the background music state and sets its initial enabled state.
*/
private void attachGameMusic() {
final GameMusic gameMusic = new GameMusic();
gameMusic.setEnabled(GameMusic.enabledInPreferences());
stateManager.attach(gameMusic);
final GameMusic gameSound = new GameMusic();
gameSound.setEnabled(GameMusic.enabledInPreferences());
stateManager.attach(gameSound);
}
/**
* Updates the application state every frame.
* This method is called once per frame during the game loop.

View File

@@ -80,7 +80,6 @@ public class GameSound extends AbstractAppState implements GameEventListener {
splashSound = loadSound(app, "Sound/Effects/splash.wav"); //NON-NLS
explosionSound = loadSound(app, "Sound/Effects/explosion.wav"); //NON-NLS
shellFlyingSound = loadSound(app, "Sound/Effects/shell_flying.wav");
}
/**
@@ -138,7 +137,7 @@ public class GameSound extends AbstractAppState implements GameEventListener {
/**
* Handles a recieved {@code SoundEvent} and plays the according sound.
*
*
* @param event the Sound event to be processed
*/
@Override
@@ -148,7 +147,6 @@ public class GameSound extends AbstractAppState implements GameEventListener {
case SPLASH -> splash();
case DESTROYED_SHIP -> shipDestroyed();
case SHELL_FLYING -> shellFly();
}
}
}

View File

@@ -7,22 +7,22 @@
package pp.battleship.client;
import com.simsilica.lemur.Button;
import com.simsilica.lemur.Checkbox;
import com.simsilica.lemur.Label;
import com.simsilica.lemur.style.ElementId;
import pp.dialog.Dialog;
import pp.dialog.StateCheckboxModel;
import pp.dialog.TextInputDialog;
import pp.battleship.client.GameMusic;
import pp.battleship.client.VolumeSlider;
import java.io.File;
import java.io.IOException;
import java.util.prefs.Preferences;
import com.simsilica.lemur.Button;
import com.simsilica.lemur.Checkbox;
import com.simsilica.lemur.Label;
import com.simsilica.lemur.style.ElementId;
import static pp.battleship.Resources.lookup;
import pp.battleship.client.gui.GameMusic;
import pp.dialog.Dialog;
import pp.dialog.StateCheckboxModel;
import pp.dialog.TextInputDialog;
import pp.battleship.client.gui.VolumeSlider;
import static pp.util.PreferencesUtils.getPreferences;
/**
@@ -39,7 +39,7 @@ class Menu extends Dialog {
private final VolumeSlider slider;
/**
* Constructs the Menu dialog for the Battleship application.
* Constructs the Menu dialog for the Battleship application.+
*
* @param app the BattleshipApp instance
*/
@@ -51,17 +51,14 @@ class Menu extends Dialog {
addChild(new Checkbox(lookup("menu.sound-enabled"), new StateCheckboxModel(app, GameSound.class)));
addChild(new Checkbox(lookup("menu.background-sound-enabled"), new StateCheckboxModel(app, GameMusic.class)));
addChild(slider);
addChild(loadButton)
.addClickCommands(s -> ifTopDialog(this::loadDialog));
addChild(saveButton)
.addClickCommands(s -> ifTopDialog(this::saveDialog));
addChild(new Button(lookup("menu.return-to-game")))
.addClickCommands(s -> ifTopDialog(this::close));
addChild(new Button(lookup("menu.quit")))
.addClickCommands(s -> ifTopDialog(app::closeApp));
addChild(loadButton).addClickCommands(s -> ifTopDialog(this::loadDialog));
addChild(saveButton).addClickCommands(s -> ifTopDialog(this::saveDialog));
addChild(new Button(lookup("menu.return-to-game"))).addClickCommands(s -> ifTopDialog(this::close));
addChild(new Button(lookup("menu.quit"))).addClickCommands(s -> ifTopDialog(app::closeApp));
update();
}
@@ -74,6 +71,11 @@ class Menu extends Dialog {
saveButton.setEnabled(app.getGameLogic().maySaveMap());
}
@Override
public void update(float delta) {
slider.update();
}
/**
* As an escape action, this method closes the menu if it is the top dialog.
*/
@@ -149,13 +151,4 @@ class Menu extends Dialog {
private void saveDialog() {
fileDialog(app.getGameLogic()::saveMap, lookup("menu.map.save"));
}
/**
* Updates the position of the volume control slider.
*/
@Override
public void update(float delta) {
slider.update();
}
}

View File

@@ -7,22 +7,22 @@
package pp.battleship.client;
import com.simsilica.lemur.Button;
import com.simsilica.lemur.Container;
import com.simsilica.lemur.Label;
import com.simsilica.lemur.TextField;
import com.simsilica.lemur.component.SpringGridLayout;
import pp.battleship.server.BattleshipServer;
import pp.dialog.Dialog;
import pp.dialog.DialogBuilder;
import pp.dialog.SimpleDialog;
import java.lang.System.Logger;
import java.lang.System.Logger.Level;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import com.simsilica.lemur.Button;
import com.simsilica.lemur.Container;
import com.simsilica.lemur.Label;
import com.simsilica.lemur.TextField;
import com.simsilica.lemur.component.SpringGridLayout;
import static pp.battleship.Resources.lookup;
import pp.battleship.server.BattleshipServer;
import pp.dialog.Dialog;
import pp.dialog.DialogBuilder;
import pp.dialog.SimpleDialog;
/**
* Represents a dialog for setting up a network connection in the Battleship game.
@@ -31,7 +31,7 @@ import static pp.battleship.Resources.lookup;
class NetworkDialog extends SimpleDialog {
private static final Logger LOGGER = System.getLogger(NetworkDialog.class.getName());
private static final String LOCALHOST = "localhost"; //NON-NLS
private static final String DEFAULT_PORT = "1234"; //NON-NLS
private static final String DEFAULT_PORT = "42069"; //NON-NLS
private final NetworkSupport network;
private final TextField host = new TextField(LOCALHOST);
private final TextField port = new TextField(DEFAULT_PORT);
@@ -69,7 +69,7 @@ class NetworkDialog extends SimpleDialog {
.setOkClose(false)
.setNoClose(false)
.build(this);
//Add the button to start the sever
addChild(serverButton).addClickCommands(s -> ifTopDialog(this::startServerInThread));
}

View File

@@ -1,4 +1,4 @@
package pp.battleship.client;
package pp.battleship.client.gui;
import static pp.util.PreferencesUtils.getPreferences;
@@ -14,6 +14,9 @@ import com.jme3.asset.AssetNotFoundException;
import com.jme3.audio.AudioData;
import com.jme3.audio.AudioNode;
/**
* Handles the background music beeing played. Is able to start and stop the music. Set the Volume of the Audio.
*/
public class GameMusic extends AbstractAppState{
private static final Logger LOGGER = System.getLogger(GameMusic.class.getName());
private static final Preferences PREFERENCES = getPreferences(GameMusic.class);
@@ -31,10 +34,10 @@ public class GameMusic extends AbstractAppState{
return PREFERENCES.getBoolean(ENABLED_PREF, true);
}
/**
/**
* Checks if sound is enabled in the preferences.
*
*
* @return float to which the volume is set
*/
public static float volumeInPreferences() {
return PREFERENCES.getFloat(VOLUME_PREF, 0.5f);
@@ -50,7 +53,7 @@ public class GameMusic extends AbstractAppState{
@Override
public void initialize(AppStateManager stateManager, Application app) {
super.initialize(stateManager, app);
music = loadSound(app, "Sound/DasBootMenu.ogg");
music = loadSound(app, "Sound/background.ogg");
setVolume(volumeInPreferences());
music.setLooping(true);
if (isEnabled() && music != null) {
@@ -87,11 +90,15 @@ public class GameMusic extends AbstractAppState{
@Override
public void setEnabled(boolean enabled) {
if (isEnabled() == enabled) return;
else if(!isEnabled() && enabled) {
if (music != null) music.play();
} else if (isEnabled() && !enabled) {
if (music != null) music.stop();
if (music != null) {
if (enabled) {
music.play();
} else {
music.stop();
}
}
super.setEnabled(enabled);
LOGGER.log(Level.INFO, "Sound enabled: {0}", enabled); //NON-NLS
PREFERENCES.putBoolean(ENABLED_PREF, enabled);
@@ -104,8 +111,12 @@ public class GameMusic extends AbstractAppState{
setEnabled(!isEnabled());
}
/**
* Sets the volume of music
* @param vol the volume to which the music should be set
*/
public void setVolume(float vol){
music.setVolume(vol);
PREFERENCES.putFloat(VOLUME_PREF, vol);
}
}
}

View File

@@ -15,10 +15,12 @@ import com.jme3.scene.Geometry;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.jme3.scene.shape.Sphere;
import pp.battleship.model.Battleship;
import pp.battleship.model.Shell;
import pp.battleship.model.Shot;
import pp.util.Position;
import static com.jme3.material.Materials.UNSHADED;
@@ -130,7 +132,7 @@ class MapViewSynchronizer extends ShipMapSynchronizer {
return view.getApp().getDraw().makeFatLine(x1, y1, x2, y2, SHIP_DEPTH, color, SHIP_LINE_WIDTH);
}
/**
/**
* Creates and returns a Spatial representation of the given {@code Shell} object
* for 2D visualization in the game. The shell is represented as a circle.
*
@@ -148,6 +150,5 @@ class MapViewSynchronizer extends ShipMapSynchronizer {
ellipse.setMaterial(mat);
ellipse.addControl(new Shell2DControl(view, shell));
return ellipse;
}
}
}

View File

@@ -7,28 +7,30 @@ import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.FastMath;
import com.jme3.math.Vector3f;
import pp.battleship.client.BattleshipApp;
public class ParticleCreator {
/**
* Factory class responsible for creating particle effects used in the game.
* This centralizes the creation of various types of particle emitters.
*/
public class ParticleEffectFactory {
private static final int COUNT_FACTOR = 1;
private static final float COUNT_FACTOR_F = 1f;
private static final boolean POINT_SPRITE = true;
private static final Type EMITTER_TYPE = POINT_SPRITE ? Type.Point : Type.Triangle;
private final BattleshipApp app;
ParticleCreator(BattleshipApp app) {
ParticleEffectFactory(BattleshipApp app) {
this.app = app;
}
/**
* Creates a flame particle emitter.
*
*
* @return a configured flame particle emitter
*/
ParticleEmitter createFlame(){
ParticleEmitter createFlame() {
ParticleEmitter flame = new ParticleEmitter("Flame", EMITTER_TYPE, 32 * COUNT_FACTOR);
flame.setSelectRandomImage(true);
flame.setStartColor(new ColorRGBA(1f, 0.4f, 0.05f, (1f / COUNT_FACTOR_F)));
@@ -54,7 +56,7 @@ public class ParticleCreator {
/**
* Creates a flash particle emitter.
*
*
* @return a configured flash particle emitter
*/
ParticleEmitter createFlash() {
@@ -83,7 +85,7 @@ public class ParticleCreator {
/**
* Creates a round spark particle emitter.
*
*
* @return a configured round spark particle emitter
*/
ParticleEmitter createRoundSpark() {
@@ -111,7 +113,7 @@ public class ParticleCreator {
/**
* Creates a spark particle emitter.
*
*
* @return a configured spark particle emitter
*/
ParticleEmitter createSpark() {
@@ -123,9 +125,9 @@ public class ParticleCreator {
spark.setFacingVelocity(true);
spark.setParticlesPerSec(0);
spark.setGravity(0, 5, 0);
spark.setLowLife(0.5f);
spark.setLowLife(1.1f);
spark.setHighLife(1.5f);
spark.getParticleInfluencer().setInitialVelocity(new Vector3f(0, 8, 0)); // y20
spark.getParticleInfluencer().setInitialVelocity(new Vector3f(0, 20, 0));
spark.getParticleInfluencer().setVelocityVariation(1);
spark.setImagesX(1);
spark.setImagesY(1);
@@ -138,7 +140,7 @@ public class ParticleCreator {
/**
* Creates a smoke trail particle emitter.
*
*
* @return a configured smoke trail particle emitter
*/
ParticleEmitter createSmokeTrail() {
@@ -165,7 +167,7 @@ public class ParticleCreator {
/**
* Creates a debris particle emitter.
*
*
* @return a configured debris particle emitter
*/
ParticleEmitter createDebris() {
@@ -194,7 +196,7 @@ public class ParticleCreator {
/**
* Creates a shockwave particle emitter.
*
*
* @return a configured shockwave particle emitter
*/
ParticleEmitter createShockwave() {
@@ -221,7 +223,7 @@ public class ParticleCreator {
/**
* Creates a moving smoke emitter.
*
*
* @return a configured smoke emitter
*/
ParticleEmitter createMovingSmokeEmitter() {
@@ -241,20 +243,20 @@ public class ParticleCreator {
/**
* Creates a one-time water splash particle emitter.
*
*
* @return a configured one-time water splash particle emitter
*/
public ParticleEmitter createWaterSplash() {
// Create a new particle emitter for the splash effect
ParticleEmitter waterSplash = new ParticleEmitter("WaterSplash", Type.Triangle, 30);
// Set the shape of the emitter, making particles emit from a point or small area
waterSplash.setShape(new EmitterSphereShape(Vector3f.ZERO, 0.2f));
// Start and end colors for water (blue, fading out)
waterSplash.setStartColor(new ColorRGBA(0.4f, 0.4f, 1f, 1f)); // Light blue at start
waterSplash.setEndColor(new ColorRGBA(0.4f, 0.4f, 1f, 0f)); // Transparent at the end
// Particle size: small at start, larger before fading out
waterSplash.setStartSize(0.1f);
waterSplash.setEndSize(0.3f);
@@ -265,14 +267,14 @@ public class ParticleCreator {
// Gravity: Pull the water particles downwards
waterSplash.setGravity(0, -9.81f, 0); // Earth's gravity simulation
// Velocity: Give particles an initial burst upward (simulates splash)
waterSplash.getParticleInfluencer().setInitialVelocity(new Vector3f(0, 3, 0));
waterSplash.getParticleInfluencer().setVelocityVariation(0.6f); // Add randomness to splash
// Set how many particles are emitted per second (0 to emit all particles at once)
waterSplash.setParticlesPerSec(0);
// Load a texture for the water splash (assuming a texture exists at this path)
Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Particle.j3md");
mat.setTexture("Texture", app.getAssetManager().loadTexture("Effects/Splash/splash.png"));
@@ -280,5 +282,4 @@ public class ParticleCreator {
return waterSplash;
}
}

View File

@@ -37,9 +37,9 @@ import static pp.util.FloatMath.PI;
class SeaSynchronizer extends ShipMapSynchronizer {
private static final String UNSHADED = "Common/MatDefs/Misc/Unshaded.j3md"; //NON-NLS
private static final String KING_GEORGE_V_MODEL = "Models/KingGeorgeV/KingGeorgeV.j3o"; //NON-NLS
private static final String SMALL_SHIP_MODEL = "Models/SmallShip/SmallShip.j3o"; //NON-NLS
private static final String U_BOAT_MODEL = "Models/WWII_ship_German_Type_II_U-boat_v2/WW2Uboat.j3o"; //NON-NLS
private static final String TUG_BOAT_MODEL = "Models/TugBoat/TugBoat.j3o"; //NON-NLS
private static final String BOAT_SMALL_MODEL = "Models/BoatSmall/12219_boat_v2_L2.j3o"; //NON-NLS
private static final String CV_MODEL = "Models/CV/CV.j3o"; //NON-NLS
private static final String BATTLE_MODEL = "Models/Battle/Battle.j3o"; //NON-NLS
private static final String LIGHTING = "Common/MatDefs/Light/Lighting.j3md";
private static final String COLOR = "Color"; //NON-NLS
private static final String SHIP = "ship"; //NON-NLS
@@ -50,8 +50,7 @@ class SeaSynchronizer extends ShipMapSynchronizer {
private final ShipMap map;
private final BattleshipApp app;
private final ParticleCreator particlecreator;
private final ParticleEffectFactory particleFactory;
/**
* Constructs a {@code SeaSynchronizer} object with the specified application, root node, and ship map.
@@ -64,7 +63,7 @@ class SeaSynchronizer extends ShipMapSynchronizer {
super(app.getGameLogic().getOwnMap(), root);
this.app = app;
this.map = map;
this.particlecreator = new ParticleCreator(app);
this.particleFactory = new ParticleEffectFactory(app);
addExisting();
}
@@ -91,7 +90,7 @@ class SeaSynchronizer extends ShipMapSynchronizer {
Node shotNode = new Node("ShotNode");
Geometry shotCylinder = createCylinder(shot);
shotNode.attachChild(shotCylinder);
ParticleEmitter waterSplash = particlecreator.createWaterSplash();
ParticleEmitter waterSplash = particleFactory.createWaterSplash();
waterSplash.setLocalTranslation(shot.getY() + 0.5f, 0f, shot.getX() + 0.5f);
shotNode.attachChild(waterSplash);
waterSplash.emitAllParticles();
@@ -104,46 +103,45 @@ class SeaSynchronizer extends ShipMapSynchronizer {
* @param ship the ship to be sunk
*/
private void sinkAndRemoveShip(Battleship ship) {
Battleship dasIstGelebteTeamarbeit = ship;
final Node shipNode = (Node) getSpatial(dasIstGelebteTeamarbeit);
Battleship wilkeningklaunichtmeinencode = ship;
final Node shipNode = (Node) getSpatial(wilkeningklaunichtmeinencode);
if (shipNode == null) return;
// Add sinking control to animate the sinking
shipNode.addControl(new SinkControl(shipNode));
shipNode.addControl(new SinkingControl(shipNode));
// Add particle effects
ParticleEmitter bubbles = particlecreator.createWaterSplash();
ParticleEmitter bubbles = particleFactory.createWaterSplash();
bubbles.setLocalTranslation(shipNode.getLocalTranslation());
shipNode.attachChild(bubbles);
bubbles.emitAllParticles();
}
/**
* Handles a hit by attaching its representation to the node that
* contains the ship model as a child so that it moves with the ship.
*
* @param shot a hit
* @return always null to prevent the representation from being attached
* to the items node as well
* @return always null to prevent the representation from being attached to the items node as well
*/
private Spatial handleHit(Shot shot) {
final Battleship ship = requireNonNull(map.findShipAt(shot), "Missing ship");
final Node shipNode = requireNonNull((Node) getSpatial(ship), "Missing ship node");
// Create a new node specifically for the hit effects
Node hitEffectNode = new Node("HitEffectNode");
// Create particle effects
ParticleEmitter flame = particlecreator.createFlame();
ParticleEmitter flash = particlecreator.createFlash();
ParticleEmitter spark = particlecreator.createSpark();
ParticleEmitter roundSpark = particlecreator.createRoundSpark();
ParticleEmitter smokeTrail = particlecreator.createSmokeTrail();
ParticleEmitter debris = particlecreator.createDebris();
ParticleEmitter shockwave = particlecreator.createShockwave();
ParticleEmitter movingSmoke = particlecreator.createMovingSmokeEmitter();
ParticleEmitter flame = particleFactory.createFlame();
ParticleEmitter flash = particleFactory.createFlash();
ParticleEmitter spark = particleFactory.createSpark();
ParticleEmitter roundSpark = particleFactory.createRoundSpark();
ParticleEmitter smokeTrail = particleFactory.createSmokeTrail();
ParticleEmitter debris = particleFactory.createDebris();
ParticleEmitter shockwave = particleFactory.createShockwave();
ParticleEmitter movingSmoke = particleFactory.createMovingSmokeEmitter();
// Attach all effects to the hitEffectNode
hitEffectNode.attachChild(flame);
@@ -157,8 +155,8 @@ class SeaSynchronizer extends ShipMapSynchronizer {
// Set the local translation for the hit effect to the point of impact
hitEffectNode.setLocalTranslation(shot.getY() + 0.5f - shipNode.getLocalTranslation().x,
0.5f, // Adjust as needed for height above the ship
shot.getX() + 0.5f - shipNode.getLocalTranslation().z);
0.5f, // Adjust as needed for height above the ship
shot.getX() + 0.5f - shipNode.getLocalTranslation().z);
// Attach the hitEffectNode to the shipNode so it moves with the ship
shipNode.attachChild(hitEffectNode);
@@ -231,18 +229,12 @@ class SeaSynchronizer extends ShipMapSynchronizer {
*/
private Spatial createShip(Battleship ship) {
switch (ship.getLength()) {
case 4:
return createBattleship(ship);
case 3:
return createLargeship(ship);
case 2:
return createMediumship(ship);
case 1:
return createSmallship(ship);
default:
return createBox(ship);
case 4: return createBattleship(ship);
case 3: return createCV(ship);
case 2: return createBattle(ship);
case 1: return createSmallship(ship);
default: return createBox(ship);
}
}
/**
@@ -292,13 +284,20 @@ class SeaSynchronizer extends ShipMapSynchronizer {
model.rotate(-HALF_PI, calculateRotationAngle(ship.getRot()), 0f);
model.scale(1.48f);
// model.scale(0.0007f);
model.setShadowMode(ShadowMode.CastAndReceive);
return model;
}
/**
* Creates a detailed 3D model to represent a small tug boat.
*
* @param ship the battleship to be represented
* @return the spatial representing a small tug boat
*/
private Spatial createSmallship(Battleship ship) {
final Spatial model = app.getAssetManager().loadModel(SMALL_SHIP_MODEL);
final Spatial model = app.getAssetManager().loadModel(BOAT_SMALL_MODEL);
model.rotate(-HALF_PI, calculateRotationAngle(ship.getRot()), 0f);
model.scale(0.0005f);
@@ -307,21 +306,35 @@ class SeaSynchronizer extends ShipMapSynchronizer {
return model;
}
private Spatial createMediumship(Battleship ship) {
final Spatial model = app.getAssetManager().loadModel(U_BOAT_MODEL);
/**
* Creates a detailed 3D model to represent a "German WWII UBoat".
*
* @param ship the battleship to be represented
* @return the spatial representing the "German WWII UBoat"
*/
private Spatial createCV(Battleship ship) {
final Spatial model = app.getAssetManager().loadModel(CV_MODEL);
model.rotate(-HALF_PI, calculateRotationAngle(ship.getRot()), 0f);
model.scale(0.27f);
model.rotate(0f, calculateRotationAngle(ship.getRot()), 0f);
model.move(0f, 0.25f, 0f);
model.scale(0.85f);
model.setShadowMode(ShadowMode.CastAndReceive);
return model;
}
private Spatial createLargeship(Battleship ship) {
final Spatial model = app.getAssetManager().loadModel(TUG_BOAT_MODEL);
/**
* Creates a detailed 3D model to represent a battleship.
*
* @param ship the battleship to be represented
* @return the spatial representing a battleship
*/
private Spatial createBattle(Battleship ship) {
final Spatial model = app.getAssetManager().loadModel(BATTLE_MODEL);
model.rotate(-HALF_PI, calculateRotationAngle(ship.getRot()), 0f);
model.scale(0.0004f);
model.move(0f, -0.06f, 0f);
model.scale(0.27f);
model.setShadowMode(ShadowMode.CastAndReceive);
return model;
@@ -362,4 +375,4 @@ class SeaSynchronizer extends ShipMapSynchronizer {
model.addControl(new ShellControl(shell));
return model;
}
}
}

View File

@@ -42,6 +42,14 @@ public class Shell2DControl extends AbstractControl {
spatial.setLocalTranslation(viewPos.getX() + MapView.FIELD_SIZE / 2, viewPos.getY() + MapView.FIELD_SIZE / 2, 0);
}
/**
* This method is called during the rendering phase, but it does not perform any
* operations in this implementation as the control only influences the spatial's
* transformation, not its rendering process.
*
* @param rm the RenderManager rendering the controlled Spatial (not null)
* @param vp the ViewPort being rendered (not null)
*/
@Override
protected void controlRender(RenderManager rm, ViewPort vp) {
// No rendering-specific behavior required for this control

View File

@@ -43,6 +43,14 @@ public class ShellControl extends AbstractControl {
spatial.rotate(PI/2,0,0);
}
/**
* This method is called during the rendering phase, but it does not perform any
* operations in this implementation as the control only influences the spatial's
* transformation, not its rendering process.
*
* @param rm the RenderManager rendering the controlled Spatial (not null)
* @param vp the ViewPort being rendered (not null)
*/
@Override
protected void controlRender(RenderManager rm, ViewPort vp) {
// No rendering-specific behavior required for this control

View File

@@ -10,7 +10,7 @@ import com.jme3.scene.Node;
* Control that handles the sinking effect for destroyed ships.
* It will gradually move the ship downwards and then remove it from the scene.
*/
class SinkControl extends AbstractControl {
class SinkingControl extends AbstractControl {
private static final float SINK_DURATION = 5f; // Duration of the sinking animation
private static final float SINK_SPEED = 0.1f; // Speed at which the ship sinks
private float elapsedTime = 0;
@@ -21,13 +21,13 @@ class SinkControl extends AbstractControl {
* Constructs a {@code SinkingControl} object with the shipNode to be to be sunk
* @param shipNode the node to handeld
*/
public SinkControl(Node shipNode) {
public SinkingControl(Node shipNode) {
this.shipNode = shipNode;
}
/**
* Updated the Map to sink the ship
*
*
* @param tpf time per frame
*/
@Override
@@ -46,9 +46,16 @@ class SinkControl extends AbstractControl {
}
}
/**
* This method is called during the rendering phase, but it does not perform any
* operations in this implementation as the control only influences the spatial's
* transformation, not its rendering process.
*
* @param rm the RenderManager rendering the controlled Spatial (not null)
* @param vp the ViewPort being rendered (not null)
*/
@Override
protected void controlRender(RenderManager rm, ViewPort vp) {
// No rendering-related code needed
}
}

View File

@@ -1,13 +1,21 @@
package pp.battleship.client;
package pp.battleship.client.gui;
import com.simsilica.lemur.Slider;
/**
* The VolumeSlider class represents the Volume Slider in the Menu.
* It extends the Slider class and provides functionalities for setting the music volume,
* with the help of the Slider in the GUI
*/
public class VolumeSlider extends Slider {
private final GameMusic music;
private double vol;
/**
* Constructs the Volume Slider for the Menu dialog
* @param music the music instance
*/
public VolumeSlider(GameMusic music) {
super();
this.music = music;
@@ -15,10 +23,14 @@ public class VolumeSlider extends Slider {
getModel().setPercent(vol);
}
/**
* when triggered it updates the volume to the value set with the slider
*/
public void update() {
if (vol != getModel().getPercent()) {
vol = getModel().getPercent();
music.setVolume( (float) vol);
}
}
}
}

View File

@@ -18,8 +18,8 @@ import pp.battleship.BattleshipConfig;
import pp.battleship.game.server.Player;
import pp.battleship.game.server.ServerGameLogic;
import pp.battleship.game.server.ServerSender;
import pp.battleship.message.client.ClientMessage;
import pp.battleship.message.client.AnimationFinishedMessage;
import pp.battleship.message.client.ClientMessage;
import pp.battleship.message.client.MapMessage;
import pp.battleship.message.client.ShootMessage;
import pp.battleship.message.server.EffectMessage;
@@ -179,5 +179,4 @@ public class BattleshipServer implements MessageListener<HostedConnection>, Conn
else
LOGGER.log(Level.ERROR, "there is no connection with id={0}", id); //NON-NLS
}
}
}

View File

@@ -15,4 +15,3 @@ record ReceivedMessage(ClientMessage message, int from) {
message.accept(interpreter, from);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 670 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

View File

@@ -42,9 +42,15 @@ public class ModelExporter extends SimpleApplication {
@Override
public void simpleInitApp() {
export("Models/KingGeorgeV/King_George_V.obj", "KingGeorgeV.j3o"); //NON-NLS
export("Models/SmallShip/12219_boat_v2_L2.obj", "SmallShip.j3o"); //NON-NLS
export("Models/WWII_ship_German_Type_II_U-boat_v2/14084_WWII_Ship_German_Type_II_U-boat_v2_L1.obj", "WW2Uboat.j3o"); //NON-NLS
export("Models/TugBoat/12218_tugboat_v1_L2.obj", "TugBoat.j3o"); //NON-NLS
export("Models/BoatSmall/12219_boat_v2_L2.obj", "BoatSmall.j3o"); //NON-NLS
export("Models/Battle/14084_WWII_Ship_German_Type_II_U-boat_v2_L1.obj", "Battle.j3o"); //NON-NLS
export("Models/CV/essex_scb-125_generic.obj", "CV.j3o"); //NON-NLS
export("Models/Figures/Würfel_blau.obj", "Würfel_blau.j30");
export("Models/Figures/Würfel_gelb.obj", "Würfel_gelb.j30");
export("Models/Figures/Würfel_grün.obj", "Würfel_grün.j30");
export("Models/Figures/Würfel_rosa.obj", "Würfel_rosa.j30");
export("Models/Figures/Würfel_rot.obj", "Würfel_rot.j30");
export("Models/Figures/Würfel_schwarz.obj", "Würfel_schwarz.j30");
stop();
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Some files were not shown because too many files have changed in this diff Show More