166 Commits

Author SHA1 Message Date
Luca Puderbach
c346058631 Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-27 17:34:52 +01:00
Luca Puderbach
f2678ea33d doppelwürfel 2024-11-27 17:34:41 +01:00
Yvonne Schmidt
45a43d6998 Merge remote-tracking branch 'origin/gui' into gui 2024-11-27 00:17:31 +01:00
Yvonne Schmidt
cb9888af7a completed BuildingAdminMenu 2024-11-27 00:17:04 +01:00
Johannes Schmelz
93b183254f Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-27 00:11:11 +01:00
Johannes Schmelz
e92b305a56 cleanup 2024-11-27 00:11:07 +01:00
Johannes Schmelz
5b0628da15 dynamically get the fieldid for by popups 2024-11-27 00:10:59 +01:00
Yvonne Schmidt
8d087a8e84 added framework for BuildingAdminMenu 2024-11-26 23:15:14 +01:00
Johannes Schmelz
1715926c1c Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-26 23:01:59 +01:00
Johannes Schmelz
c8b69efca2 added correct colors in LobbyMenu 2024-11-26 23:01:55 +01:00
Yvonne Schmidt
7f6011720c lobbyMenu ready button toggles to grey 2024-11-26 22:30:13 +01:00
Yvonne Schmidt
bdc5f0269f fixed cancel button position 2024-11-26 22:27:55 +01:00
Yvonne Schmidt
a6054e825e fixed trade display 2024-11-26 22:24:03 +01:00
Johannes Schmelz
156e76fe0a cleanup 2024-11-26 21:31:21 +01:00
Johannes Schmelz
89587a4c78 set default value for drop down selection 2024-11-26 21:28:41 +01:00
Johannes Schmelz
29cc73e83b automaticyally set player name as 'Spieler'+ id+1 2024-11-26 20:58:57 +01:00
Johannes Schmelz
e56cdb1dcb Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-26 20:00:54 +01:00
Johannes Schmelz
9107a08011 dynamically set players in ChoosePatner 2024-11-26 20:00:50 +01:00
Yvonne Schmidt
0242587a5f added groundwork for selection listeners 2024-11-26 19:54:02 +01:00
Yvonne Schmidt
3ce27023c2 Merge remote-tracking branch 'origin/gui' into gui 2024-11-26 19:42:01 +01:00
Johannes Schmelz
174958c6b1 can now dynamically update toolbar view 2024-11-26 18:50:24 +01:00
Johannes Schmelz
c71e8b1e8e removed hostplayer as hostplayer always has id 0 2024-11-26 18:48:13 +01:00
Yvonne Schmidt
ada067a2a0 added and centered buttons 2024-11-26 18:25:23 +01:00
Johannes Schmelz
f4c4f6bc93 cleanup 2024-11-26 17:53:49 +01:00
Simon Wilkening
6eeb6fd209 Properties_de übersetzt 2024-11-26 15:29:45 +01:00
Simon Wilkening
efba3c496a Deckhelper korrigiert, Properties angepasst 2024-11-26 15:15:29 +01:00
Johannes Schmelz
27a0ab52e6 dice button now works and update dice images accordingly 2024-11-26 14:59:48 +01:00
Yvonne Schmidt
d6ce859fcd ChoosePartner accept-button opens TradeMenu 2024-11-26 01:12:29 +01:00
Yvonne Schmidt
e5f69c9536 Merge remote-tracking branch 'origin/gui' into gui
# Conflicts:
#	Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/ChoosePartner.java
2024-11-26 01:08:59 +01:00
Yvonne Schmidt
d8a2225038 added framework for TradeMenu 2024-11-26 01:07:59 +01:00
Johannes Schmelz
7b91a679f5 abbrechen button in chossePatner 2024-11-26 00:57:22 +01:00
Yvonne Schmidt
840658b590 fixed background location again 2024-11-26 00:34:49 +01:00
Yvonne Schmidt
c5e7ef855e fixed background location 2024-11-26 00:25:31 +01:00
Yvonne Schmidt
170227c97f fixed header in ChoosePartner menu 2024-11-26 00:21:13 +01:00
Johannes Schmelz
379803278b Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-26 00:11:42 +01:00
Johannes Schmelz
3956d8efa7 show all playe stats in toolbar 2024-11-26 00:11:37 +01:00
Yvonne Schmidt
269aceaf1a added ChoosePartner menu 2024-11-26 00:11:01 +01:00
Yvonne Schmidt
41127565fc Merge remote-tracking branch 'origin/gui' into gui 2024-11-26 00:10:52 +01:00
Johannes Schmelz
0e405d2f90 send PlayerHandler in GameStart 2024-11-25 22:11:35 +01:00
Yvonne Schmidt
f67810b288 fixed toolbar buttons 2024-11-25 21:29:54 +01:00
Johannes Schmelz
4095d9e79d fixed buyCard color and button function 2024-11-25 21:29:00 +01:00
Johannes Schmelz
547a4c2353 cleanup toolbar 2024-11-25 21:14:38 +01:00
Johannes Schmelz
9120e4d53c show test world when GameStart message is recieved 2024-11-25 17:50:54 +01:00
Johannes Schmelz
1a62b76104 corrected map size 2024-11-25 16:28:50 +01:00
Johannes Schmelz
cc7f277bef fixed b button 2024-11-25 15:05:02 +01:00
Johannes Schmelz
274df8dfd1 Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-25 06:50:05 +01:00
Johannes Schmelz
0c2b266f5e Merge branch 'main' into 'gui'
# Conflicts:
#   Projekte/battleship/client/src/main/java/pp/battleship/client/Menu.java
#   Projekte/jme-common/src/main/resources/Interface/Lemur/pp-styles.groovy
#   Projekte/monopoly/model/src/main/java/pp/monopoly/game/server/Player.java
2024-11-25 05:33:21 +00:00
Simon Wilkening
16b4dbae18 Deckhelper korrigiert 2024-11-25 06:30:04 +01:00
Johannes Schmelz
88409dcc99 Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-25 05:42:49 +01:00
Johannes Schmelz
5cacff39b7 refactor typo 2024-11-25 05:42:45 +01:00
Yvonne Schmidt
093723a9d0 added outline for ChoosePartner Menu 2024-11-25 05:40:49 +01:00
Johannes Schmelz
dfdbcdc9f3 board visible again 2024-11-25 05:16:24 +01:00
Johannes Schmelz
bd725e2dc4 refactor 2024-11-25 04:54:35 +01:00
Johannes Schmelz
dd9d9144dd Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-25 04:52:56 +01:00
Johannes Schmelz
1a429e4bb6 fixed settings in toolbar 2024-11-25 04:52:53 +01:00
Yvonne Schmidt
ad6fb5e926 added dice containers 2024-11-25 04:52:34 +01:00
Johannes Schmelz
72cb7049ba remove demo cube 2024-11-25 04:19:13 +01:00
Johannes Schmelz
2e42f3afac added testing shortcuts 2024-11-25 04:09:48 +01:00
Yvonne Schmidt
8474c9f5bc fixed EventCard sizing 2024-11-25 03:56:07 +01:00
Johannes Schmelz
b7ed03f7e8 resolve merge conflicts 2024-11-25 03:55:06 +01:00
Johannes Schmelz
a44b6b5e4c Merge branch 'connect' into 'gui'
Client connect to server

See merge request progproj/gruppen-ht24/Gruppe-02!14
2024-11-25 02:46:03 +00:00
Johannes Schmelz
5268f75e17 Client connect to server 2024-11-25 02:46:03 +00:00
Simon Wilkening
687d1621fc EventCard erweitert 2024-11-25 00:06:12 +01:00
Johannes Schmelz
a6944aa6e3 added dice images 2024-11-24 23:38:22 +01:00
Johannes Schmelz
b8365c76a1 fix mac executable 2024-11-24 22:58:47 +01:00
Johannes Schmelz
19216cc174 refactor 2024-11-24 22:57:19 +01:00
Johannes Schmelz
c6a23b9b8e execute for apple 2024-11-24 22:56:52 +01:00
Johannes Schmelz
c0f42fb1eb refactor 2024-11-24 22:50:52 +01:00
Tamino Mueller
160873e2cc added pictures and popups fixed 2024-11-24 22:42:32 +01:00
Tamino Mueller
8df859bbef Merge remote-tracking branch 'origin/gui' into gui 2024-11-24 22:34:54 +01:00
Tamino Mueller
e30d10a85d Pop-Up hinzugefügt 2024-11-24 22:34:19 +01:00
Yvonne Schmidt
bafc3f1db6 Merge remote-tracking branch 'origin/gui' into gui 2024-11-24 19:25:12 +01:00
Yvonne Schmidt
03571fcf74 code cleanup in der lobby 2024-11-24 19:24:51 +01:00
Johannes Schmelz
e7a6802488 fixed buyProperty 2024-11-24 19:14:56 +01:00
Yvonne Schmidt
a6e6b5e158 lobby übergibt figur 2024-11-24 19:05:28 +01:00
Simon Wilkening
74c3d925e6 TODOs und Kommentare ergänst 2024-11-24 19:04:58 +01:00
Yvonne Schmidt
f67fa4d7f0 lobby übergibt namen 2024-11-24 18:39:32 +01:00
Simon Wilkening
225a8c0e08 BuildingPropertyCard adjusted 2024-11-24 18:11:42 +01:00
Yvonne Schmidt
9a6ce27fe1 lobby uebergibt farbe und startgeld 2024-11-24 18:07:39 +01:00
Johannes Schmelz
437114704a get client id 2024-11-24 17:20:35 +01:00
Johannes Schmelz
9b4cac4e56 send PlayerHandler when starting game 2024-11-24 16:51:00 +01:00
Johannes Schmelz
e780513b35 saving the players 2024-11-24 00:32:16 +01:00
Johannes Schmelz
d582c59a7d added playerState changes 2024-11-24 00:29:48 +01:00
Johannes Schmelz
7d2c85f617 fixed card bug 2024-11-24 00:13:32 +01:00
Johannes Schmelz
4a882bc4ac Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-24 00:11:18 +01:00
Johannes Schmelz
3c4eac1fcd added logic for visiting event field 2024-11-24 00:11:14 +01:00
Yvonne Schmidt
75d5a15bdb defaultwerte in die Lobby eingefügt 2024-11-23 23:19:53 +01:00
Yvonne Schmidt
17f121f7d1 Merge remote-tracking branch 'origin/gui' into gui 2024-11-23 23:15:04 +01:00
Johannes Schmelz
a66c570b51 remove 2d map view 2024-11-23 23:09:02 +01:00
Yvonne Schmidt
e1e7f2eaf6 überschneidungen von elementen beseitigt 2024-11-23 23:07:42 +01:00
Johannes Schmelz
46d2dce372 Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-23 22:12:39 +01:00
Johannes Schmelz
c39f1f6d4c tweaked camera params 2024-11-23 22:12:34 +01:00
Yvonne Schmidt
738b04f2d9 oberfläche der lobby fertig 2024-11-23 21:29:14 +01:00
Simon Wilkening
ecba1c3135 GateField korrigiert 2024-11-23 21:22:54 +01:00
Johannes Schmelz
748226f4ed added Move Camera based on player position 2024-11-23 19:27:04 +01:00
Johannes Schmelz
f658f53ba9 refactor 2024-11-23 19:26:36 +01:00
Johannes Schmelz
4a8304ee4f relabled FoodField 2024-11-23 18:53:29 +01:00
Simon Wilkening
7fe9604338 FoodField korrigiert 2024-11-23 18:28:28 +01:00
Johannes Schmelz
7f09a6dae8 refactor 2024-11-23 18:02:46 +01:00
Johannes Schmelz
270129bc97 fixed typo 2024-11-23 17:58:56 +01:00
Johannes Schmelz
62ec6f6bef dynamically allocate values 2024-11-23 17:58:17 +01:00
Johannes Schmelz
b24c14900c food field dynamic value allocation 2024-11-23 17:54:11 +01:00
Johannes Schmelz
44c55ce3a6 refactor 2024-11-23 17:42:51 +01:00
Johannes Schmelz
895bea048c Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-23 17:41:47 +01:00
Johannes Schmelz
885ab5bdc9 dynamically allocate values 2024-11-23 17:41:20 +01:00
Yvonne Schmidt
c6355b2c09 dropdown lesbar 2024-11-23 17:37:27 +01:00
Yvonne Schmidt
ada6bf3f24 changed GateField font color 2024-11-23 17:24:41 +01:00
Simon Wilkening
db471ac679 Merge remote-tracking branch 'origin/gui' into gui 2024-11-23 17:22:37 +01:00
Simon Wilkening
84059c4085 GateField 2024-11-23 17:22:24 +01:00
Yvonne Schmidt
09b363f943 auswahllogik im dropdown implementiert 2024-11-23 17:03:56 +01:00
Simon Wilkening
fd347c7780 Building property eingefügt 2024-11-23 16:50:16 +01:00
Johannes Schmelz
b38a34efa5 add figure when player added 2024-11-23 16:35:33 +01:00
Johannes Schmelz
10e24cf30e small bug fixes 2024-11-23 16:16:40 +01:00
Johannes Schmelz
3369057afb update the players figure when moved 2024-11-23 16:08:46 +01:00
Johannes Schmelz
7ada56e215 limit the amount of players to 6 2024-11-23 14:41:17 +01:00
Johannes Schmelz
373b9e6d53 allow the host player to set start money 2024-11-23 13:20:05 +01:00
Johannes Schmelz
3de31de9f7 bind playercolor to join order 2024-11-23 12:46:20 +01:00
Johannes Schmelz
7252259ab3 updated trade and client logic 2024-11-23 09:15:57 +01:00
Yvonne Schmidt
f33c673a05 lobby für feinschliff vorbereitet 2024-11-22 07:15:25 +01:00
Yvonne Schmidt
65a7958b66 popup ebenen angepasst und dropdown entfernt 2024-11-22 05:28:51 +01:00
Simon Wilkening
91e4df7478 B-Taste um Karte Kaufen Popup zu öffnen 2024-11-22 05:23:52 +01:00
Yvonne Schmidt
399606d9a0 Toolbar-Design angepasst 2024-11-22 04:45:27 +01:00
Johannes Schmelz
559afcaffd added NextPlayerTurn 2024-11-22 01:38:48 +01:00
Johannes Schmelz
15f5f91ddb rename sound files 2024-11-22 01:02:48 +01:00
Johannes Schmelz
067a8063a5 Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-22 00:54:13 +01:00
Johannes Schmelz
35e367ba24 added sounds 2024-11-22 00:54:09 +01:00
Simon Wilkening
fe68d991fc Merge remote-tracking branch 'origin/gui' into gui 2024-11-22 00:44:55 +01:00
Simon Wilkening
88dc633e8e Würfellogik mit toolbar erneut verbunden 2024-11-22 00:44:36 +01:00
Johannes Schmelz
0b9cbb0f5f view assets response now send alls properties and fixed which players properties are sent 2024-11-22 00:42:07 +01:00
Johannes Schmelz
c3a33b4402 added house prices and color to buildingfields 2024-11-21 15:30:34 +01:00
Luca Puderbach
e12f00aad6 Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-20 03:36:59 +01:00
Luca Puderbach
47bac0185f Port fix 2024-11-20 03:36:54 +01:00
Yvonne Schmidt
dafe1dab2a Merge remote-tracking branch 'origin/gui' into gui 2024-11-20 03:24:46 +01:00
Yvonne Schmidt
8ba4ea2819 menues angepasst und vorlage für dropdown implementiert 2024-11-20 03:24:27 +01:00
Simon Wilkening
f6f708fd5b Angepasste Toolbar 2024-11-20 03:17:10 +01:00
Luca Puderbach
1203077aed Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-20 02:39:20 +01:00
Luca Puderbach
ddbf79c928 can now add players 2024-11-20 02:37:00 +01:00
Johannes Schmelz
aa47dd579f added selenium dependecy for drop down menu 2024-11-20 02:21:23 +01:00
Johannes Schmelz
cdce478d77 send GameStart message with a list of all Players 2024-11-20 01:45:34 +01:00
Johannes Schmelz
f11f4a59f1 fixed lemurproto dependecy 2024-11-20 00:55:33 +01:00
Luca Puderbach
d631e8df1e TempFix 2024-11-20 00:50:19 +01:00
Johannes Schmelz
af80d40700 fix server start 2024-11-19 23:59:23 +01:00
Johannes Schmelz
3a6f8a945a palyer ready fix 2024-11-19 23:59:16 +01:00
Luca Puderbach
bb9727d54a Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-19 23:09:44 +01:00
Luca Puderbach
7da8b3e545 Spieler Lobby 2024-11-19 23:09:39 +01:00
Johannes Schmelz
b6968df451 Merge branch 'main' into 'gui'
Main

See merge request progproj/gruppen-ht24/Gruppe-02!13
2024-11-19 20:30:56 +00:00
Johannes Schmelz
aa986fb948 added backgroud music file 2024-11-19 20:51:24 +01:00
Yvonne Schmidt
6e63de6e99 Merge remote-tracking branch 'origin/gui' into gui 2024-11-19 19:54:40 +01:00
Yvonne Schmidt
962ecd08fa SettingsMenu hat neues design 2024-11-19 19:54:22 +01:00
Luca Puderbach
580a26b3ea Grundlage Toolbar 2024-11-19 19:50:25 +01:00
Johannes Schmelz
0cda6b5fa0 added first sound files 2024-11-19 19:40:27 +01:00
Johannes Schmelz
cc8c3795b8 added game sound logic 2024-11-19 19:27:52 +01:00
Johannes Schmelz
3c21165efb adjusted config params 2024-11-19 19:09:37 +01:00
Luca Puderbach
818fdf4670 Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-19 17:44:57 +01:00
Luca Puderbach
b7d679b492 neue map 2024-11-19 17:44:52 +01:00
Yvonne Schmidt
a42093df23 SettingsMenu nochmal angepasst 2024-11-19 17:34:22 +01:00
Johannes Schmelz
6157db51da added server label 2024-11-19 14:46:11 +01:00
Yvonne Schmidt
843052989b Merge remote-tracking branch 'origin/gui' into gui 2024-11-18 23:04:43 +01:00
Yvonne Schmidt
8e01fa3192 SettingsMenu angepasst 2024-11-18 23:04:09 +01:00
Johannes Schmelz
e2126a7ea7 implemented self host for server 2024-11-18 23:01:34 +01:00
Luca Puderbach
0b46d14650 LobbyServer Einfügen 2024-11-18 18:56:42 +01:00
Luca Puderbach
9e28deedf7 Grundlagen Lobby 2024-11-18 18:30:35 +01:00
Luca Puderbach
9c0172b413 Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-18 17:27:51 +01:00
Luca Puderbach
2933d022aa Veränderung Erreichen der Testwelt 2024-11-18 17:27:46 +01:00
Yvonne Schmidt
bdefb7193e Merge remote-tracking branch 'origin/gui' into gui 2024-11-18 17:13:13 +01:00
Yvonne Schmidt
69b68a6975 toolbar style hinzugefügt 2024-11-18 17:08:58 +01:00
49 changed files with 1390 additions and 443 deletions

View File

@@ -0,0 +1,110 @@
////////////////////////////////////////
// Programming project code
// UniBw M, 2022, 2023, 2024
// www.unibw.de/inf2
// (c) Mark Minas (mark.minas@unibw.de)
////////////////////////////////////////
package pp.monopoly.client;
import com.jme3.input.controls.ActionListener;
import com.jme3.scene.Node;
import com.jme3.system.AppSettings;
import pp.monopoly.client.MonopolyAppState;
import pp.monopoly.client.gui.TestWorld;
import pp.monopoly.model.IntPoint;
import java.lang.System.Logger;
import java.lang.System.Logger.Level;
/**
* Represents the state responsible for managing the battle interface within the Battleship game.
* This state handles the display and interaction of the battle map, including the opponent's map.
* It manages GUI components, input events, and the layout of the interface when this state is enabled.
*/
public class GameAppState extends MonopolyAppState {
private static final Logger LOGGER = System.getLogger(MonopolyAppState.class.getName());
private static final float DEPTH = 0f;
private static final float GAP = 20f;
/**
* A listener for handling click events in the battle interface.
* When a click is detected, it triggers the corresponding actions on the opponent's map.
*/
private final ActionListener clickListener = (name, isPressed, tpf) -> click(isPressed);
/**
* The root node for all GUI components in the battle state.
*/
private final Node battleNode = new Node("Game"); //NON-NLS
/**
* A view representing the opponent's map in the GUI.
*/
private TestWorld testWorld;
/**
* Enables the battle state by initializing, laying out, and adding GUI components.
* Attaches the components to the GUI node and registers input listeners.
*/
@Override
protected void enableState() {
battleNode.detachAllChildren();
initializeGuiComponents();
layoutGuiComponents();
addGuiComponents();
getApp().getGuiNode().attachChild(battleNode);
}
/**
* Disables the battle state by removing GUI components and unregistering input listeners.
* Also handles cleanup of resources, such as the opponent's map view.
*/
@Override
protected void disableState() {
getApp().getGuiNode().detachChild(battleNode);
getApp().getInputManager().removeListener(clickListener);
}
/**
* Initializes the GUI components used in the battle state.
* Creates the opponent's map view and adds a grid overlay to it.
*/
private void initializeGuiComponents() {
testWorld = new TestWorld(getApp());
testWorld.initializeScene();
}
/**
* Adds the initialized GUI components to the battle node.
* Currently, it attaches the opponent's map view to the node.
*/
private void addGuiComponents() {
}
/**
* Lays out the GUI components within the window, positioning them appropriately.
* The opponent's map view is positioned based on the window's dimensions and a specified gap.
*/
private void layoutGuiComponents() {
final AppSettings s = getApp().getContext().getSettings();
final float windowWidth = s.getWidth();
final float windowHeight = s.getHeight();
}
/**
* Handles click events in the battle interface. If the event indicates a click (not a release),
* it translates the cursor position to the model's coordinate system and triggers the game logic
* for interacting with the opponent's map.
*
* @param isPressed whether the mouse button is currently pressed (true) or released (false)
*/
private void click(boolean isPressed) {
}
@Override
public void update(float tpf) {
testWorld.update(tpf);
super.update(tpf);
}
}

View File

@@ -221,7 +221,7 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga
/** /**
* Returns the current configuration settings for the Battleship client. * Returns the current configuration settings for the Battleship client.
* *
* @return The {@link BattleshipClientConfig} instance. * @return The {@link BattleshipClientConfig} instance. //TODO Fehler im Kommentar
*/ */
@Override @Override
public MonopolyAppConfig getConfig() { public MonopolyAppConfig getConfig() {
@@ -279,19 +279,7 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga
private void handleB(boolean isPressed) { private void handleB(boolean isPressed) {
if (isPressed) { if (isPressed) {
Dialog tmp = new BuyCard(this); Dialog tmp = new BuyCard(this);
if (eventCard != null && isBuyCardPopupOpen) { tmp.open();
// Schließe das SettingsMenu
System.out.println("Schließe BuyCardPopup...");
eventCard.close();
eventCard = null;
tmp.open();
} else {
// Öffne das SettingsMenu
System.out.println("Öffne BuyCardPopup...");
eventCard = new EventCard(this);
eventCard.open();
dialogManager.close(tmp);
}
} }
} }
@@ -320,6 +308,7 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga
attachGameSound(); attachGameSound();
attachGameMusic(); attachGameMusic();
stateManager.attach(new GameAppState());
} }
/** /**
@@ -443,6 +432,7 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga
*/ */
@Override @Override
public void receivedEvent(ClientStateEvent event) { public void receivedEvent(ClientStateEvent event) {
stateManager.getState(GameAppState.class).setEnabled(true);
} }
/** /**
@@ -503,4 +493,9 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga
public void disconnect() { public void disconnect() {
serverConnection.disconnect(); serverConnection.disconnect();
} }
public int getId() {
if (serverConnection != null && serverConnection instanceof NetworkSupport) return ((NetworkSupport) serverConnection).getId();
return 0;
}
} }

View File

@@ -0,0 +1,169 @@
package pp.monopoly.client.gui;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Quad;
import com.jme3.texture.Texture;
import com.simsilica.lemur.*;
import com.simsilica.lemur.component.QuadBackgroundComponent;
import com.simsilica.lemur.component.SpringGridLayout;
import com.simsilica.lemur.style.ElementId;
import pp.dialog.Dialog;
import pp.monopoly.client.MonopolyApp;
import pp.monopoly.notification.Sound;
public class BuildingAdminMenu extends Dialog {
private final MonopolyApp app;
private final Container mainContainer;
private final Button backButton = new Button("Zurück");
private final Button buildButton = new Button("Bauen");
private final Button demolishButton = new Button("Abriss");
private final Button takeMortgageButton = new Button("Hypothek aufnehmen");
private final Button payMortgageButton = new Button("Hypothek bezahlen");
private final Button overviewButton = new Button("Übersicht");
public BuildingAdminMenu(MonopolyApp app) {
super(app.getDialogManager());
this.app = app;
// Background Image
addBackgroundImage();
// Main container for the UI components
mainContainer = new Container(new SpringGridLayout(Axis.Y, Axis.X));
mainContainer.setPreferredSize(new Vector3f(800, 600, 0));
mainContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(1, 1, 1, 0.7f))); // Translucent white background
// Add header
mainContainer.addChild(createHeaderContainer());
// Add content
mainContainer.addChild(createContent());
// Attach main container to GUI node
app.getGuiNode().attachChild(mainContainer);
mainContainer.setLocalTranslation(
(app.getCamera().getWidth() - mainContainer.getPreferredSize().x) / 2,
(app.getCamera().getHeight() + mainContainer.getPreferredSize().y) / 2,
7
);
}
/**
* Creates the header container.
*
* @return The header container.
*/
private Container createHeaderContainer() {
Container headerContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y));
headerContainer.setPreferredSize(new Vector3f(800, 100, 0));
Label headerLabel = headerContainer.addChild(new Label("Grundstücke Verwalten", new ElementId("header")));
headerLabel.setFontSize(45);
headerLabel.setInsets(new Insets3f(10, 10, 10, 10));
return headerContainer;
}
/**
* Creates the main content container with columns for Overview, Build, and Mortgage.
*
* @return The content container.
*/
private Container createContent() {
Container contentContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y));
contentContainer.setPreferredSize(new Vector3f(800, 500, 0));
// Overview Column
Container overviewColumn = new Container(new SpringGridLayout(Axis.Y, Axis.X));
overviewColumn.addChild(new Label("Übersicht:")).setFontSize(30);
overviewButton.setPreferredSize(new Vector3f(200, 50, 0));
overviewButton.addClickCommands(s -> ifTopDialog(() -> {
app.getGameLogic().playSound(Sound.BUTTON);
}));
overviewColumn.addChild(overviewButton);
// Back Button
backButton.setPreferredSize(new Vector3f(200, 50, 0));
backButton.addClickCommands(s -> ifTopDialog(() -> {
app.getGameLogic().playSound(Sound.BUTTON);
this.close();
}));
overviewColumn.addChild(backButton);
contentContainer.addChild(overviewColumn);
// Build Column
Container buildColumn = new Container(new SpringGridLayout(Axis.Y, Axis.X));
buildColumn.addChild(new Label("Bauen:")).setFontSize(30);
buildButton.setPreferredSize(new Vector3f(200, 50, 0));
buildButton.addClickCommands(s -> ifTopDialog(() -> {
app.getGameLogic().playSound(Sound.BUTTON);
}));
buildColumn.addChild(buildButton);
demolishButton.setPreferredSize(new Vector3f(200, 50, 0));
demolishButton.addClickCommands(s -> ifTopDialog(() -> {
app.getGameLogic().playSound(Sound.BUTTON);
}));
buildColumn.addChild(demolishButton);
contentContainer.addChild(buildColumn);
// Mortgage Column
Container mortgageColumn = new Container(new SpringGridLayout(Axis.Y, Axis.X));
mortgageColumn.addChild(new Label("Hypotheken:")).setFontSize(30);
takeMortgageButton.setPreferredSize(new Vector3f(200, 50, 0));
takeMortgageButton.addClickCommands(s -> ifTopDialog(() -> {
app.getGameLogic().playSound(Sound.BUTTON);
}));
mortgageColumn.addChild(takeMortgageButton);
payMortgageButton.setPreferredSize(new Vector3f(200, 50, 0));
payMortgageButton.addClickCommands(s -> ifTopDialog(() -> {
app.getGameLogic().playSound(Sound.BUTTON);
}));
mortgageColumn.addChild(payMortgageButton);
contentContainer.addChild(mortgageColumn);
return contentContainer;
}
/**
* Adds a background image to the dialog.
*/
private void addBackgroundImage() {
Texture backgroundImage = app.getAssetManager().loadTexture("Pictures/unibw-Bib2.png");
Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
Geometry background = new Geometry("Background", quad);
Material backgroundMaterial = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
backgroundMaterial.setTexture("ColorMap", backgroundImage);
background.setMaterial(backgroundMaterial);
background.setLocalTranslation(0, 0, 6); // Position behind other GUI elements
app.getGuiNode().attachChild(background);
}
/**
* Handles the "Zurück" action.
*/
private void handleBack() {
app.getGameLogic().playSound(Sound.BUTTON);
close();
}
@Override
public void escape() {
handleBack();
}
@Override
public void update(float delta) {
// Periodic updates if necessary
}
}

View File

@@ -1,5 +1,9 @@
package pp.monopoly.client.gui; package pp.monopoly.client.gui;
import java.util.Set;
import com.jme3.app.Application;
import com.jme3.app.state.BaseAppState;
import com.jme3.material.Material; import com.jme3.material.Material;
import com.jme3.math.ColorRGBA; import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f; import com.jme3.math.Vector3f;
@@ -7,48 +11,149 @@ import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Quad; import com.jme3.scene.shape.Quad;
import com.jme3.texture.Texture; import com.jme3.texture.Texture;
import com.simsilica.lemur.Axis; import com.simsilica.lemur.Axis;
import com.simsilica.lemur.Button;
import com.simsilica.lemur.Container; import com.simsilica.lemur.Container;
import com.simsilica.lemur.Label; import com.simsilica.lemur.Label;
import com.simsilica.lemur.TextField; import com.simsilica.lemur.Selector;
import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.component.QuadBackgroundComponent;
import com.simsilica.lemur.component.SpringGridLayout; import com.simsilica.lemur.component.SpringGridLayout;
import com.simsilica.lemur.core.VersionedList;
import com.simsilica.lemur.core.VersionedReference;
import com.simsilica.lemur.style.ElementId; import com.simsilica.lemur.style.ElementId;
import pp.dialog.Dialog; import pp.dialog.Dialog;
import pp.monopoly.client.MonopolyApp; import pp.monopoly.client.MonopolyApp;
import pp.monopoly.game.server.Player;
import pp.monopoly.model.TradeHandler;
import pp.monopoly.notification.Sound;
public class ChoosePartner extends Dialog { public class ChoosePartner extends Dialog {
private final MonopolyApp app; private final MonopolyApp app;
private final Container menuContainer; private Selector<String> playerSelector;
private final Button cancelButton = new Button("Abbrechen");
private final Button confirmButton = new Button("Bestätigen");
private final Container mainContainer;
private Container lowerLeftMenu;
private Container lowerRightMenu;
private Geometry background; private Geometry background;
private TradeHandler tradeHandler;
QuadBackgroundComponent translucentWhiteBackground =
new QuadBackgroundComponent(new ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f));
/**
* Constructs the ChoosePartner dialog.
*
* @param app The Monopoly application instance.
*/
public ChoosePartner(MonopolyApp app) { public ChoosePartner(MonopolyApp app) {
super(app.getDialogManager()); super(app.getDialogManager());
this.app = app; this.app = app;
tradeHandler = new TradeHandler(app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()));
// Hintergrundbild laden und hinzufügen // Background Image
addBackgroundImage(); addBackgroundImage();
QuadBackgroundComponent translucentWhiteBackground = // Main container for the UI components
new QuadBackgroundComponent(new ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f)); mainContainer = new Container(new SpringGridLayout(Axis.Y, Axis.X));
mainContainer.setPreferredSize(new Vector3f(1000, 600, 0));
mainContainer.setBackground(translucentWhiteBackground);
menuContainer = new Container(new SpringGridLayout(Axis.Y, Axis.X)); // Add title with background
menuContainer.setPreferredSize(new Vector3f(1000, 600, 0)); // Fixed size of the container Label headerLabel = mainContainer.addChild(new Label("Wähle deinen Handelspartner:", new ElementId("label-Bold")));
menuContainer.setBackground(translucentWhiteBackground); headerLabel.setFontSize(40);
headerLabel.setBackground(new QuadBackgroundComponent(new ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f)));
// Create a smaller horizontal container for the label, input field, and spacers // Dropdown for player selection
Container horizontalContainer = menuContainer.addChild(new Container(new SpringGridLayout(Axis.X, Axis.Y))); mainContainer.addChild(createDropdown());
horizontalContainer.setPreferredSize(new Vector3f(600, 40, 0)); // Adjust container size
horizontalContainer.setBackground(null);
Label title = horizontalContainer.addChild(new Label("Wähle deinen Handelspartner:", new ElementId("label-Bold"))); // Add buttons
title.setFontSize(40); mainContainer.addChild(createButtonContainer());
addSelectionActionListener(playerSelector, this::onDropdownSelectionChanged);
// Attach main container to GUI node
app.getGuiNode().attachChild(mainContainer);
mainContainer.setLocalTranslation(
(app.getCamera().getWidth() - mainContainer.getPreferredSize().x) / 2,
(app.getCamera().getHeight() + mainContainer.getPreferredSize().y) / 2,
4
);
} }
/** /**
* Lädt das Hintergrundbild und fügt es als geometrische Ebene hinzu. * Creates the dropdown menu for selecting a partner.
*
* @return The dropdown container.
*/
private Container createDropdown() {
Container dropdownContainer = new Container(new SpringGridLayout(Axis.Y, Axis.X));
dropdownContainer.setPreferredSize(new Vector3f(100, 80, 0));
dropdownContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(ColorRGBA.Black)));
VersionedList<String> playerOptions = new VersionedList<>();
for (Player player : app.getGameLogic().getPlayerHandler().getPlayers()) {
if (player.getId() != app.getId()) {
playerOptions.add(player.getName() + " (ID: "+player.getId()+")");
}
}
playerSelector = new Selector<>(playerOptions, "glass");
dropdownContainer.addChild(playerSelector);
Vector3f dimens = dropdownContainer.getPreferredSize();
Vector3f dimens2 = playerSelector.getPopupContainer().getPreferredSize();
dimens2.setX( dimens.getX() );
playerSelector.getPopupContainer().setPreferredSize(new Vector3f(200,200,3));
playerSelector.setLocalTranslation(0,0,5);
onDropdownSelectionChanged(playerOptions.get(0));
return dropdownContainer;
}
/**
* Creates the button container with cancel and confirm buttons.
*
* @return The button container.
*/
private Container createButtonContainer() {
Container buttonContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y));
buttonContainer.setBackground(translucentWhiteBackground);
// "Abbrechen" button
lowerLeftMenu = new Container();
cancelButton.setPreferredSize(new Vector3f(200, 60, 0));
cancelButton.setFontSize(30);
cancelButton.addClickCommands(s -> ifTopDialog(() -> {
app.getGameLogic().playSound(Sound.BUTTON);
close();
}));
lowerLeftMenu.addChild(cancelButton);
// Position the container near the bottom-left corner
lowerLeftMenu.setLocalTranslation(new Vector3f(120, 170, 5)); // Adjust X and Y to align with the bottom-left corner
app.getGuiNode().attachChild(lowerLeftMenu);
// "Bestätigen" button
lowerRightMenu = new Container();
confirmButton.setPreferredSize(new Vector3f(200, 60, 0));
confirmButton.setFontSize(30);
confirmButton.addClickCommands(s -> ifTopDialog(() -> {
app.getGameLogic().playSound(Sound.BUTTON);
close();
new TradeMenu(app).open();
}));
lowerRightMenu.addChild(confirmButton);
// Position the container near the bottom-right corner
lowerRightMenu.setLocalTranslation(new Vector3f(app.getCamera().getWidth() - 320, 170, 5)); // X: 220px from the right, Y: 50px above the bottom
app.getGuiNode().attachChild(lowerRightMenu);
return buttonContainer;
}
/**
* Adds a background image to the dialog.
*/ */
private void addBackgroundImage() { private void addBackgroundImage() {
Texture backgroundImage = app.getAssetManager().loadTexture("Pictures/unibw-Bib2.png"); Texture backgroundImage = app.getAssetManager().loadTexture("Pictures/unibw-Bib2.png");
@@ -57,8 +162,100 @@ public class ChoosePartner extends Dialog {
Material backgroundMaterial = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); Material backgroundMaterial = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
backgroundMaterial.setTexture("ColorMap", backgroundImage); backgroundMaterial.setTexture("ColorMap", backgroundImage);
background.setMaterial(backgroundMaterial); background.setMaterial(backgroundMaterial);
background.setLocalTranslation(0, 0, -1); // Hintergrundebene background.setLocalTranslation(0, 0, 3); // Position behind other GUI elements
app.getGuiNode().attachChild(background); app.getGuiNode().attachChild(background);
} }
/**
* Handles the escape action for the dialog.
*/
@Override
public void escape() {
new SettingsMenu(app).open();
}
/**
* Updates the dialog periodically, called by the dialog manager.
*
* @param delta The time elapsed since the last update.
*/
@Override
public void update(float delta) {
// Periodic updates (if needed) can be implemented here
}
@Override
public void close() {
app.getGuiNode().detachChild(playerSelector);
app.getGuiNode().detachChild(lowerLeftMenu);
app.getGuiNode().detachChild(lowerRightMenu);
app.getGuiNode().detachChild(mainContainer);
app.getGuiNode().detachChild(background);
super.close();
}
/**
* Adds a custom action listener to the Selector.
*/
private void addSelectionActionListener(Selector<String> selector, SelectionActionListener<String> listener) {
VersionedReference<Set<Integer>> selectionRef = selector.getSelectionModel().createReference();
app.getStateManager().attach(new BaseAppState() {
@Override
public void update(float tpf) {
if (selectionRef.update()) {
String selected = selectionRef.get().toString();
listener.onSelectionChanged(selected);
}
}
@Override
protected void initialize(Application app) {
update(1);
}
@Override
protected void cleanup(Application app) {
}
@Override
protected void onEnable() {
}
@Override
protected void onDisable() {
}
});
}
/**
* Callback for when the dropdown selection changes.
*/
private void onDropdownSelectionChanged(String selected) {
app.getGameLogic().playSound(Sound.BUTTON);
int idStart = selected.indexOf("(ID: ") + 5; // Find start of the ID
int idEnd = selected.indexOf(")", idStart); // Find end of the ID
String idStr = selected.substring(idStart, idEnd); // Extract the ID as a string
int playerId = Integer.parseInt(idStr); // Convert the ID to an integer
// Find the player by ID
Player selectedPlayer = app.getGameLogic().getPlayerHandler().getPlayerById(playerId);
if (selectedPlayer != null) {
tradeHandler.setReceiver(selectedPlayer); // Set the receiver in TradeHandler
}
}
/**
* Functional interface for a selection action listener.
*/
@FunctionalInterface
private interface SelectionActionListener<T> {
void onSelectionChanged(T selection);
}
} }

View File

@@ -66,7 +66,7 @@ public class CreateGameMenu extends Dialog {
final MonopolyApp app = network.getApp(); final MonopolyApp app = network.getApp();
int screenWidth = app.getContext().getSettings().getWidth(); int screenWidth = app.getContext().getSettings().getWidth();
int screenHeight = app.getContext().getSettings().getHeight(); int screenHeight = app.getContext().getSettings().getHeight();
// Set up the background image // Set up the background image

View File

@@ -25,6 +25,7 @@ import com.simsilica.lemur.style.ElementId;
import pp.dialog.Dialog; import pp.dialog.Dialog;
import pp.monopoly.client.MonopolyApp; import pp.monopoly.client.MonopolyApp;
import pp.monopoly.game.server.PlayerColor;
import pp.monopoly.message.client.PlayerReady; import pp.monopoly.message.client.PlayerReady;
import pp.monopoly.notification.Sound; import pp.monopoly.notification.Sound;
@@ -39,7 +40,7 @@ public class LobbyMenu extends Dialog {
private Container lowerLeftMenu; private Container lowerLeftMenu;
private Container lowerRightMenu; private Container lowerRightMenu;
private TextField playerInputField = new TextField("Spieler 1"); private TextField playerInputField;
private TextField startingCapital = new TextField("15000"); private TextField startingCapital = new TextField("15000");
private String figure; private String figure;
@@ -47,6 +48,7 @@ public class LobbyMenu extends Dialog {
super(app.getDialogManager()); super(app.getDialogManager());
this.app = app; this.app = app;
playerInputField = new TextField("Spieler "+(app.getId()+1));
// Hintergrundbild laden und hinzufügen // Hintergrundbild laden und hinzufügen
addBackgroundImage(); addBackgroundImage();
@@ -88,6 +90,7 @@ public class LobbyMenu extends Dialog {
// Dropdowns and Labels // Dropdowns and Labels
Container dropdownContainer = menuContainer.addChild(new Container(new SpringGridLayout(Axis.X, Axis.Y))); Container dropdownContainer = menuContainer.addChild(new Container(new SpringGridLayout(Axis.X, Axis.Y)));
dropdownContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(ColorRGBA.Black)));
dropdownContainer.setPreferredSize(new Vector3f(800, 200, 0)); dropdownContainer.setPreferredSize(new Vector3f(800, 200, 0));
dropdownContainer.setBackground(null); dropdownContainer.setBackground(null);
dropdownContainer.setInsets(new Insets3f(10, 0, 0, 0)); dropdownContainer.setInsets(new Insets3f(10, 0, 0, 0));
@@ -118,10 +121,18 @@ public class LobbyMenu extends Dialog {
figures.add("OOP"); figures.add("OOP");
figures.add("Handyholster"); figures.add("Handyholster");
Selector<String> figureDropdown = new Selector<>(figures, "glass"); Selector<String> figureDropdown = new Selector<>(figures, "glass");
figureDropdown.setBackground(new QuadBackgroundComponent(ColorRGBA.DarkGray)); figureDropdown.setBackground(new QuadBackgroundComponent(ColorRGBA.DarkGray));
figureDropdown.setPreferredSize(new Vector3f(100, 20, 0)); figureDropdown.setPreferredSize(new Vector3f(100, 20, 0));
figureDropdownContainer.addChild(figureDropdown); figureDropdownContainer.addChild(figureDropdown);
Vector3f dimens = dropdownContainer.getPreferredSize();
Vector3f dimens2 = figureDropdown.getPopupContainer().getPreferredSize();
dimens2.setX( dimens.getX() );
figureDropdown.getPopupContainer().setPreferredSize(new Vector3f(200,200,5));
figureDropdown.getSelectionModel().setSelection(0);
figure = "Laptop";
addSelectionActionListener(figureDropdown, this::onDropdownSelectionChanged); addSelectionActionListener(figureDropdown, this::onDropdownSelectionChanged);
@@ -153,6 +164,7 @@ public class LobbyMenu extends Dialog {
readyButton.addClickCommands(s -> ifTopDialog(() -> { readyButton.addClickCommands(s -> ifTopDialog(() -> {
toggleReady(); toggleReady();
app.getGameLogic().playSound(Sound.BUTTON); app.getGameLogic().playSound(Sound.BUTTON);
readyButton.setBackground(new QuadBackgroundComponent(ColorRGBA.DarkGray));
})); }));
lowerRightMenu.addChild(readyButton); lowerRightMenu.addChild(readyButton);
@@ -161,7 +173,7 @@ public class LobbyMenu extends Dialog {
app.getGuiNode().attachChild(lowerRightMenu); app.getGuiNode().attachChild(lowerRightMenu);
// Add a colored circle between the input field and the dropdown menu // Add a colored circle between the input field and the dropdown menu
circle = createCircle( ColorRGBA.Red); // 50 is the diameter, Red is the color circle = createCircle(); // 50 is the diameter, Red is the color
circle.setLocalTranslation(new Vector3f( circle.setLocalTranslation(new Vector3f(
(app.getCamera().getWidth()) / 2, // Center horizontally (app.getCamera().getWidth()) / 2, // Center horizontally
(app.getCamera().getHeight() / 2) - 90, // Adjust Y position (app.getCamera().getHeight() / 2) - 90, // Adjust Y position
@@ -195,19 +207,33 @@ public class LobbyMenu extends Dialog {
app.getGuiNode().attachChild(background); app.getGuiNode().attachChild(background);
} }
private Geometry createCircle(ColorRGBA color) { private Geometry createCircle() {
Sphere sphere = new Sphere(90,90,60.0f); Sphere sphere = new Sphere(90,90,60.0f);
Geometry circleGeometry = new Geometry("Circle", sphere); Geometry circleGeometry = new Geometry("Circle", sphere);
// Create a material with a solid color // Create a material with a solid color
Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
material.setColor("Color", color); // Set the desired color material.setColor("Color", idToColor()); // Set the desired color
circleGeometry.setMaterial(material); circleGeometry.setMaterial(material);
return circleGeometry; return circleGeometry;
} }
private ColorRGBA idToColor() {
switch (app.getId()+1) {
case 1: return PlayerColor.CYAN.getColor();
case 2: return PlayerColor.YELLOW.getColor();
case 3: return PlayerColor.RED.getColor();
case 4: return PlayerColor.PINK.getColor();
case 5: return PlayerColor.GREEN.getColor();
case 6: return PlayerColor.PURPLE.getColor();
default:
return null;
}
}
/** /**
* Schaltet den "Bereit"-Status um. * Schaltet den "Bereit"-Status um.
*/ */
@@ -231,7 +257,6 @@ public class LobbyMenu extends Dialog {
public void update(float tpf) { public void update(float tpf) {
if (selectionRef.update()) { if (selectionRef.update()) {
String selected = selectionRef.get().toString(); String selected = selectionRef.get().toString();
System.out.println(selected);
listener.onSelectionChanged(selected); listener.onSelectionChanged(selected);
} }
} }
@@ -260,7 +285,6 @@ public class LobbyMenu extends Dialog {
* Callback for when the dropdown selection changes. * Callback for when the dropdown selection changes.
*/ */
private void onDropdownSelectionChanged(String selected) { private void onDropdownSelectionChanged(String selected) {
System.out.println("Selected: " + selected);
app.getGameLogic().playSound(Sound.BUTTON); app.getGameLogic().playSound(Sound.BUTTON);
switch (selected) { switch (selected) {
case "[0]": case "[0]":

View File

@@ -1,8 +1,6 @@
package pp.monopoly.client.gui; package pp.monopoly.client.gui;
import java.util.concurrent.Executors; import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import com.jme3.material.Material; import com.jme3.material.Material;
import com.jme3.math.ColorRGBA; import com.jme3.math.ColorRGBA;
@@ -21,6 +19,7 @@ public class TestWorld {
private final MonopolyApp app; private final MonopolyApp app;
private CameraController cameraController; // Steuert die Kamera private CameraController cameraController; // Steuert die Kamera
private Toolbar toolbar;
/** /**
* Konstruktor für TestWorld. * Konstruktor für TestWorld.
@@ -51,7 +50,8 @@ public class TestWorld {
); );
// Füge die Toolbar hinzu // Füge die Toolbar hinzu
new Toolbar(app).open(); toolbar = new Toolbar(app);
toolbar.open();
cameraController.setPosition(0); cameraController.setPosition(0);
} }

View File

@@ -1,13 +1,15 @@
package pp.monopoly.client.gui; package pp.monopoly.client.gui;
import java.util.Random;
import com.jme3.font.BitmapText;
import com.jme3.math.ColorRGBA; import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector2f; import com.jme3.math.Vector2f;
import com.jme3.math.Vector3f; import com.jme3.math.Vector3f;
import com.simsilica.lemur.*; import com.simsilica.lemur.Axis;
import com.simsilica.lemur.Button;
import com.simsilica.lemur.Container;
import com.simsilica.lemur.HAlignment;
import com.simsilica.lemur.Label;
import com.simsilica.lemur.VAlignment;
import com.simsilica.lemur.component.IconComponent; import com.simsilica.lemur.component.IconComponent;
import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.component.QuadBackgroundComponent;
import com.simsilica.lemur.component.SpringGridLayout; import com.simsilica.lemur.component.SpringGridLayout;
@@ -16,22 +18,29 @@ import com.simsilica.lemur.style.ElementId;
import pp.dialog.Dialog; import pp.dialog.Dialog;
import pp.monopoly.client.MonopolyApp; import pp.monopoly.client.MonopolyApp;
import pp.monopoly.game.server.Player;
import pp.monopoly.game.server.PlayerHandler;
import pp.monopoly.message.client.EndTurn;
import pp.monopoly.message.client.RollDice;
import pp.monopoly.notification.DiceRollEvent;
import pp.monopoly.notification.GameEventListener;
import pp.monopoly.notification.Sound; import pp.monopoly.notification.Sound;
import pp.monopoly.notification.UpdatePlayerView;
/** /**
* Toolbar Klasse, die am unteren Rand der Szene angezeigt wird. * Toolbar Klasse, die am unteren Rand der Szene angezeigt wird.
* Die Buttons bewegen den Würfel auf dem Spielfeld. * Die Buttons bewegen den Würfel auf dem Spielfeld.
*/ */
public class Toolbar extends Dialog { public class Toolbar extends Dialog implements GameEventListener{
private final MonopolyApp app; private final MonopolyApp app;
private final Container toolbarContainer; private final Container toolbarContainer;
private final BitmapText positionText; // Anzeige für die aktuelle Position private Label imageLabel;
private final float boardLimit = 0.95f; // Grenzen des Bretts private Label imageLabel2;
private final float stepSize = 0.18f; // Schrittgröße pro Bewegung private Container overviewContainer;
private int currentPosition = 0; // Aktuelle Position auf dem Spielfeld private Container accountContainer;
private final int positionsPerSide = 10; // Anzahl der Positionen pro Seite private PlayerHandler playerHandler;
private final Random random = new Random(); // Zufallsgenerator für den Würfelwurf
/** /**
* Konstruktor für die Toolbar. * Konstruktor für die Toolbar.
@@ -42,6 +51,9 @@ public class Toolbar extends Dialog {
super(app.getDialogManager()); super(app.getDialogManager());
this.app = app; this.app = app;
app.getGameLogic().addListener(this);
playerHandler = app.getGameLogic().getPlayerHandler();
// Erstelle die Toolbar // Erstelle die Toolbar
toolbarContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y), "toolbar"); toolbarContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y), "toolbar");
@@ -54,31 +66,14 @@ public class Toolbar extends Dialog {
toolbarContainer.setPreferredSize(new Vector3f(app.getCamera().getWidth(), 200, 0)); // Volle Breite toolbarContainer.setPreferredSize(new Vector3f(app.getCamera().getWidth(), 200, 0)); // Volle Breite
// Füge Buttons zur Toolbar hinzu
//initializeButtons();
// Menü-Container: Ein Nested-Container für Kontostand und "Meine Gulag Frei Karten" // Menü-Container: Ein Nested-Container für Kontostand und "Meine Gulag Frei Karten"
Container accountContainer = toolbarContainer.addChild(new Container()); accountContainer = toolbarContainer.addChild(new Container());
accountContainer.addChild(new Label("Kontostand", new ElementId("label-Bold")));
accountContainer.addChild(new Label("6666€", new ElementId("label-Text"))); //TODO Variable hier einsetzen
accountContainer.addChild(new Label("Gulag Frei Karten", new ElementId("label-Bold")));
accountContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
// Add a spacer between accountContainer and overviewContainer
Panel spacer = new Panel(); // Create an empty panel as a spacer
spacer.setPreferredSize(new Vector3f(5, 0, 0)); // Adjust the width as needed
spacer.setBackground(null);
toolbarContainer.addChild(spacer);
// Menü-Container: Ein Container für Übersicht // Menü-Container: Ein Container für Übersicht
Container overviewContainer = toolbarContainer.addChild(new Container()); overviewContainer = toolbarContainer.addChild(new Container());
overviewContainer.addChild(new Label("Übersicht", new ElementId("label-Bold")));
overviewContainer.addChild(new Label("„Spieler 1“: 1244€", new ElementId("label-Text")));//TODO Variable hier einsetzen receivedEvent(new UpdatePlayerView());
overviewContainer.addChild(new Label("„Spieler 2“: 1244€", new ElementId("label-Text")));//TODO Variable hier einsetzen
overviewContainer.addChild(new Label("„Spieler 3“: 1244€", new ElementId("label-Text")));//TODO Variable hier einsetzen
overviewContainer.addChild(new Label("„Spieler 4“: 1244€", new ElementId("label-Text")));//TODO Variable hier einsetzen
overviewContainer.addChild(new Label("„Spieler 5“: 1244€", new ElementId("label-Text")));//TODO Variable hier einsetzen
overviewContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); overviewContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
// Menü-Container: Ein Container für Würfel // Menü-Container: Ein Container für Würfel
@@ -93,12 +88,12 @@ public class Toolbar extends Dialog {
Container leftContainer = new Container(); Container leftContainer = new Container();
leftContainer.setPreferredSize(new Vector3f(100, 150, 0)); // Adjust size as needed leftContainer.setPreferredSize(new Vector3f(100, 150, 0)); // Adjust size as needed
Label imageLabel = new Label(""); imageLabel = new Label("");
IconComponent icon = new IconComponent("Pictures/dice/one.png"); // Icon mit Textur erstellen IconComponent icon = new IconComponent("Pictures/dice/one.png"); // Icon mit Textur erstellen
icon.setIconSize(new Vector2f(100,100)); // Skalierung des Bildes icon.setIconSize(new Vector2f(100,100)); // Skalierung des Bildes
imageLabel.setIcon(icon); imageLabel.setIcon(icon);
Label imageLabel2 = new Label(""); imageLabel2 = new Label("");
IconComponent icon2 = new IconComponent("Pictures/dice/two.png"); // Icon mit Textur erstellen IconComponent icon2 = new IconComponent("Pictures/dice/two.png"); // Icon mit Textur erstellen
icon2.setIconSize(new Vector2f(100,100)); // Skalierung des Bildes icon2.setIconSize(new Vector2f(100,100)); // Skalierung des Bildes
imageLabel2.setIcon(icon2); imageLabel2.setIcon(icon2);
@@ -132,7 +127,7 @@ public class Toolbar extends Dialog {
Button diceButton = new Button("Würfeln"); Button diceButton = new Button("Würfeln");
diceButton.setPreferredSize(new Vector3f(200, 50, 0)); // Full width for Würfeln button diceButton.setPreferredSize(new Vector3f(200, 50, 0)); // Full width for Würfeln button
diceButton.addClickCommands(s -> ifTopDialog(() -> { diceButton.addClickCommands(s -> ifTopDialog(() -> {
rollDice(); app.getGameLogic().send(new RollDice());
app.getGameLogic().playSound(Sound.BUTTON); app.getGameLogic().playSound(Sound.BUTTON);
})); }));
diceContainer.addChild(diceButton); diceContainer.addChild(diceButton);
@@ -142,146 +137,49 @@ public class Toolbar extends Dialog {
// Menü-Container: Ein Nested-Container für Handeln, Grundstücke und Zug beenden // Menü-Container: Ein Nested-Container für Handeln, Grundstücke und Zug beenden
Container menuContainer = toolbarContainer.addChild(new Container()); Container menuContainer = toolbarContainer.addChild(new Container());
menuContainer.addChild(new Button("Handeln")); menuContainer.addChild(addTradeMenuButton());
menuContainer.addChild(new Button("Grundstücke")); menuContainer.addChild(addPropertyMenuButton());
menuContainer.addChild(new Button("Zug beenden")); menuContainer.addChild(addEndTurnButton());
menuContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); menuContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
// Füge die Toolbar zur GUI hinzu // Füge die Toolbar zur GUI hinzu
app.getGuiNode().attachChild(toolbarContainer); app.getGuiNode().attachChild(toolbarContainer);
// Erstelle die Position-Anzeige
positionText = createPositionDisplay();
updatePositionDisplay(); // Initialisiere die Anzeige mit der Startposition
} }
/** private Button addTradeMenuButton() {
* Initialisiert die Buttons in der Toolbar. Button tradebutton = new Button("Handeln");
*/ tradebutton.setPreferredSize(new Vector3f(150, 50, 0)); // Größe des Buttons
private void initializeButtons() { tradebutton.addClickCommands(s -> ifTopDialog( () -> {
addTradeMenuButton(); // Bewegung nach vorne
addEndTurnButton(); // Bewegung nach hinten
addDiceRollButton(); // Würfel-Button
}
/**
* Fügt einen Button mit einer Bewegung hinzu.
*
* @param label Der Text des Buttons
* @param step Schrittweite (+1 für vorwärts, -1 für rückwärts)
*/
/*private void addButton(String label, int step) {
Button button = new Button(label);
button.setPreferredSize(new Vector3f(150, 50, 0)); // Größe der Buttons
button.addClickCommands(source -> moveCube(step));
toolbarContainer.addChild(button);
}*/
/**
* Fügt den Würfel-Button hinzu, der die Figur entsprechend der gewürfelten Zahl bewegt.
*/
private Button addDiceRollButton() {
Button diceButton = new Button("Würfeln");
diceButton.setPreferredSize(new Vector3f(50, 20, 0));
diceButton.addClickCommands(s -> ifTopDialog(() -> {
rollDice();
app.getGameLogic().playSound(Sound.BUTTON); app.getGameLogic().playSound(Sound.BUTTON);
}));
toolbarContainer.addChild(diceButton);
return diceButton;
}
private void addTradeMenuButton() {
Button diceButton = new Button("Handeln");
diceButton.setPreferredSize(new Vector3f(150, 50, 0)); // Größe des Buttons
diceButton.addClickCommands(s -> {
rollDice();
app.getGameLogic().playSound(Sound.BUTTON);
this.close();
System.out.println("test");
new ChoosePartner(app).open(); new ChoosePartner(app).open();
});
toolbarContainer.addChild(diceButton);
}// TODO Funktion der Buttons Überarbeiten und prüfen
private void addEndTurnButton() {
Button diceButton = new Button("Grundstücke");
diceButton.setPreferredSize(new Vector3f(150, 50, 0)); // Größe des Buttons
diceButton.addClickCommands(s -> ifTopDialog(() -> {
rollDice();
app.getGameLogic().playSound(Sound.BUTTON);
})); }));
toolbarContainer.addChild(diceButton); return tradebutton;
} }
private void addPropertyMenuButton() { private Button addPropertyMenuButton() {
Button diceButton = new Button("Zug beenden"); Button propertyMenuButton = new Button("Grundstücke");
diceButton.setPreferredSize(new Vector3f(150, 50, 0)); // Größe des Buttons propertyMenuButton.setFontSize(30.0f);
diceButton.addClickCommands(s -> ifTopDialog(() -> { propertyMenuButton.setPreferredSize(new Vector3f(150, 50, 0)); // Größe des Buttons
rollDice(); propertyMenuButton.addClickCommands(s -> ifTopDialog(() -> {
app.getGameLogic().playSound(Sound.BUTTON); app.getGameLogic().playSound(Sound.BUTTON);
new BuildingAdminMenu(app).open();
})); }));
toolbarContainer.addChild(diceButton); return propertyMenuButton;
} }
/** private Button addEndTurnButton() {
* Simuliert einen Würfelwurf und bewegt die Figur entsprechend. Button endTurnButton = new Button("Zug beenden");
*/ endTurnButton.setPreferredSize(new Vector3f(150, 50, 0)); // Größe des Buttons
private void rollDice() { endTurnButton.addClickCommands(s -> ifTopDialog(() -> {
int diceRoll = random.nextInt(6) + 1; // Zahl zwischen 1 und 6 app.getGameLogic().playSound(Sound.BUTTON);
System.out.println("Gewürfelt: " + diceRoll); app.getGameLogic().send(new EndTurn());
} }));
return endTurnButton;
/**
* Berechnet die neue Position des Würfels basierend auf der aktuellen Brettseite und Position.
*
* @param position Aktuelle Position auf dem Spielfeld
* @return Die berechnete Position als Vector3f
*/
private Vector3f calculatePosition(int position) {
int side = position / positionsPerSide; // Seite des Bretts (0 = unten, 1 = rechts, 2 = oben, 3 = links)
int offset = position % positionsPerSide; // Position auf der aktuellen Seite
switch (side) {
case 0: // Unten (positive x-Achse)
return new Vector3f(-boardLimit + offset * stepSize, 0.1f, -boardLimit + 0.05f);
case 1: // Rechts (positive z-Achse)
return new Vector3f(boardLimit - 0.05f, 0.1f, -boardLimit + offset * stepSize);
case 2: // Oben (negative x-Achse)
return new Vector3f(boardLimit - offset * stepSize, 0.1f, boardLimit - 0.05f);
case 3: // Links (negative z-Achse)
return new Vector3f(-boardLimit + 0.05f, 0.1f, boardLimit - offset * stepSize);
default:
throw new IllegalArgumentException("Ungültige Position: " + position);
}
}
/**
* Erstellt die Anzeige für die aktuelle Position.
*
* @return Das BitmapText-Objekt für die Anzeige
*/
private BitmapText createPositionDisplay() {
BitmapText text = new BitmapText(app.getAssetManager().loadFont("Interface/Fonts/Default.fnt"), false);
text.setSize(20); // Schriftgröße
text.setLocalTranslation(10, app.getCamera().getHeight() - 10, 0); // Oben links
app.getGuiNode().attachChild(text);
return text;
}
/**
* Aktualisiert die Anzeige für die aktuelle Position.
*/
private void updatePositionDisplay() {
positionText.setText("Feld-ID: " + currentPosition);
} }
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(toolbarContainer); app.getGuiNode().detachChild(toolbarContainer);
app.getGuiNode().detachChild(positionText);
super.close(); super.close();
} }
@@ -289,4 +187,79 @@ public class Toolbar extends Dialog {
public void escape() { public void escape() {
new SettingsMenu(app).open(); new SettingsMenu(app).open();
} }
@Override
public void receivedEvent(DiceRollEvent event) {
updateDiceImages(event.a(), event.b());
}
@Override
public void receivedEvent(UpdatePlayerView event) {
// Clear existing accountContainer and overviewContainer content
accountContainer.clearChildren();
overviewContainer.clearChildren();
// Update accountContainer
accountContainer.addChild(new Label("Kontostand", new ElementId("label-Bold")));
accountContainer.addChild(new Label(
playerHandler.getPlayerById(app.getId()).getAccountBalance() + " EUR",
new ElementId("label-Text")
));
accountContainer.addChild(new Label("Gulag Karten", new ElementId("label-Bold")));
accountContainer.addChild(new Label(
playerHandler.getPlayerById(app.getId()).getNumJailCard() + "",
new ElementId("label-Text")
));
accountContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
// Update overviewContainer
overviewContainer.addChild(new Label("Übersicht", new ElementId("label-Bold")));
for (Player player : playerHandler.getPlayers()) {
if (player.getId() != app.getId()) { // Skip the current player
overviewContainer.addChild(new Label(
player.getName() + ": " + player.getAccountBalance() + " EUR",
new ElementId("label-Text")
));
}
}
overviewContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
}
private void updateDiceImages(int a, int b) {
//TODO dice toll animation
IconComponent icon1 = new IconComponent(diceToString(a));
IconComponent icon2 = new IconComponent(diceToString(b));
icon1.setIconSize(new Vector2f(100, 100));
icon2.setIconSize(new Vector2f(100, 100));
imageLabel.setIcon(icon1);
imageLabel2.setIcon(icon2);
}
private String diceToString(int i) {
switch (i) {
case 1:
return "Pictures/dice/one.png";
case 2:
return "Pictures/dice/two.png";
case 3:
return "Pictures/dice/three.png";
case 4:
return "Pictures/dice/four.png";
case 5:
return "Pictures/dice/five.png";
case 6:
return "Pictures/dice/six.png";
default:
throw new IllegalArgumentException("Invalid dice number: " + i);
}
}
} }

View File

@@ -0,0 +1,382 @@
package pp.monopoly.client.gui;
import com.jme3.app.Application;
import com.jme3.app.state.BaseAppState;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Quad;
import com.jme3.texture.Texture;
import com.simsilica.lemur.*;
import com.simsilica.lemur.component.QuadBackgroundComponent;
import com.simsilica.lemur.component.SpringGridLayout;
import com.simsilica.lemur.core.VersionedList;
import com.simsilica.lemur.core.VersionedReference;
import com.simsilica.lemur.style.ElementId;
import com.simsilica.lemur.text.DocumentModel;
import pp.dialog.Dialog;
import pp.monopoly.client.MonopolyApp;
import pp.monopoly.notification.Sound;
import java.util.Set;
public class TradeMenu extends Dialog {
private final MonopolyApp app;
private final Container mainContainer;
private Selector<String> leftBuildingSelector, leftCurrencySelector, leftSpecialCardSelector;
private Selector<String> rightBuildingSelector, rightCurrencySelector, rightSpecialCardSelector;
private final Button cancelButton = new Button("Abbrechen");
private final Button tradeButton = new Button("Handeln");
private Container lowerLeftMenu, lowerRightMenu;
private TextField leftSelectionsField;
private TextField rightSelectionsField;
private TextField leftCurrencyInput;
private TextField rightCurrencyInput;
QuadBackgroundComponent translucentWhiteBackground =
new QuadBackgroundComponent(new ColorRGBA(ColorRGBA.White));
/**
* Constructs the TradeMenu dialog.
*
* @param app The Monopoly application instance.
*/
public TradeMenu(MonopolyApp app) {
super(app.getDialogManager());
this.app = app;
// Background Image
addBackgroundImage();
// Main container for the UI components
mainContainer = new Container(new SpringGridLayout(Axis.Y, Axis.X));
mainContainer.setPreferredSize(new Vector3f(1200, 800, 0));
mainContainer.setBackground(translucentWhiteBackground);
// Add header container
mainContainer.addChild(createHeaderContainer());
// Add main content (three columns: left, middle, right)
mainContainer.addChild(createMainContent());
// Attach main container to GUI node
app.getGuiNode().attachChild(mainContainer);
mainContainer.setLocalTranslation(
(app.getCamera().getWidth() - mainContainer.getPreferredSize().x) / 2,
(app.getCamera().getHeight() + mainContainer.getPreferredSize().y) / 2,
7
);
}
/**
* Creates a container for the header with a fixed size.
*
* @return The header container.
*/
private Container createHeaderContainer() {
// Create a container for the header
Container headerContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y));
headerContainer.setPreferredSize(new Vector3f(200, 100, 0)); // Set fixed width and height
// Add the header label
Label headerLabel = headerContainer.addChild(new Label("Handelsmenü", new ElementId("label-Bold")));
headerLabel.setFontSize(50); // Adjust font size as needed
headerLabel.setInsets(new Insets3f(10, 10, 10, 10)); // Add padding around the label
headerLabel.setBackground(new QuadBackgroundComponent(new ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f))); // Optional background
return headerContainer;
}
/**
* Creates the main content layout (left, middle, right columns).
*
* @return The main content container.
*/
private Container createMainContent() {
Container mainContent = new Container(new SpringGridLayout(Axis.X, Axis.Y));
mainContent.setPreferredSize(new Vector3f(1200, 700, 0));
// Left Column
mainContent.addChild(createTradeColumn("Wähle Handelsobjekt:", true));
// Middle Section
Container middleSection = mainContent.addChild(new Container(new SpringGridLayout(Axis.Y, Axis.X)));
middleSection.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8f, 0.8f, 0.8f, 1.0f)));
// Add combined label
Label middleLabel = middleSection.addChild(new Label("Gebäude: Währung: Sonderkarten:"));
middleLabel.setFontSize(24); // Adjust font size as needed
middleLabel.setInsets(new Insets3f(5, 5, 5, 5)); // Add padding around the label
// Add the Quellobjekte TextField
leftSelectionsField = middleSection.addChild(new TextField(""));
leftSelectionsField.setPreferredSize(new Vector3f(600, 50, 0)); // Larger width to fit the split sections
addCustomSelectionListener(leftBuildingSelector, newSelection -> updateSelectionsField(leftSelectionsField, leftBuildingSelector, leftCurrencyInput, leftSpecialCardSelector));
addCustomSelectionListener(leftSpecialCardSelector, newSelection -> updateSelectionsField(leftSelectionsField, leftBuildingSelector, leftCurrencyInput, leftSpecialCardSelector));
// Add change listener for the currency input
monitorTextFieldChanges(leftCurrencyInput, () -> updateSelectionsField(leftSelectionsField, leftBuildingSelector, leftCurrencyInput, leftSpecialCardSelector));
Label arrows = middleSection.addChild(new Label(""));
arrows.setFontSize(40);
// Right Column
mainContent.addChild(createTradeColumn("Wähle Zielobjekt:", false));
// Add combined label
middleLabel = middleSection.addChild(new Label("Gebäude: Währung: Sonderkarten:"));
middleLabel.setFontSize(24); // Adjust font size as needed
middleLabel.setInsets(new Insets3f(5, 5, 5, 5)); // Add padding around the label
// Add the Zielobjekte TextField
rightSelectionsField = middleSection.addChild(new TextField(""));
rightSelectionsField.setPreferredSize(new Vector3f(600, 50, 0));
addCustomSelectionListener(rightBuildingSelector, newSelection -> updateSelectionsField(rightSelectionsField, rightBuildingSelector, rightCurrencyInput, rightSpecialCardSelector));
addCustomSelectionListener(rightSpecialCardSelector, newSelection -> updateSelectionsField(rightSelectionsField, rightBuildingSelector, rightCurrencyInput, rightSpecialCardSelector));
// Add change listener for the currency input
monitorTextFieldChanges(rightCurrencyInput, () -> updateSelectionsField(rightSelectionsField, rightBuildingSelector, rightCurrencyInput, rightSpecialCardSelector));
// "Bestätigen" button
lowerRightMenu = new Container();
tradeButton.setPreferredSize(new Vector3f(200, 60, 0));
tradeButton.setFontSize(30);
tradeButton.addClickCommands(s -> ifTopDialog(() -> {
app.getGameLogic().playSound(Sound.BUTTON);
close();
new TradeMenu(app).open();
}));
lowerRightMenu.addChild(tradeButton);
// Position the container near the bottom-right corner
lowerRightMenu.setLocalTranslation(new Vector3f(app.getCamera().getWidth() - 680, 100, 8)); // X: 220px from the right, Y: 50px above the bottom
app.getGuiNode().attachChild(lowerRightMenu);
Label spacer = middleSection.addChild(new Label("")); // Spacer
spacer.setPreferredSize(new Vector3f(1, 50, 0));
return mainContent;
}
/**
* Creates a column for trade objects (left or right side).
*
* @param label The label for the column.
* @param isLeft Whether this column is the left side.
* @return The column container.
*/
private Container createTradeColumn(String label, boolean isLeft) {
Container column = new Container(new SpringGridLayout(Axis.Y, Axis.X));
column.setBackground(new QuadBackgroundComponent(new ColorRGBA(ColorRGBA.White)));
Label columnLabel = column.addChild(new Label(label));
columnLabel.setFontSize(24);
columnLabel.setBackground(translucentWhiteBackground);
// Add dropdowns
column.addChild(new Label("Gebäude:"));
Selector<String> buildingSelector = column.addChild(new Selector<>(getSampleItems(),"glass"));
buildingSelector.setInsets(new Insets3f(5, 10, 5, 10));
buildingSelector.setBackground(new QuadBackgroundComponent(new ColorRGBA(ColorRGBA.Black)));
column.addChild(new Label("Währung:"));
TextField currencyInput = column.addChild(new TextField(""));
currencyInput.setInsets(new Insets3f(5, 10, 5, 10));
currencyInput.setBackground(new QuadBackgroundComponent(new ColorRGBA(ColorRGBA.Black)));
column.addChild(new Label("Sonderkarten:"));
Selector<String> specialCardSelector = column.addChild(new Selector<>(getSampleItems(),"glass"));
specialCardSelector.setInsets(new Insets3f(5, 10, 5, 10));
specialCardSelector.setBackground(new QuadBackgroundComponent(new ColorRGBA(ColorRGBA.Black)));
// Assign selectors to corresponding fields
if (isLeft) {
leftBuildingSelector = buildingSelector;
leftSpecialCardSelector = specialCardSelector;
leftCurrencyInput = currencyInput;
// "Abbrechen" button
lowerLeftMenu = new Container();
cancelButton.setPreferredSize(new Vector3f(200, 60, 0));
cancelButton.setFontSize(30);
cancelButton.addClickCommands(s -> ifTopDialog(() -> {
app.getGameLogic().playSound(Sound.BUTTON);
this.close();
}));
lowerLeftMenu.addChild(cancelButton);
// Position the container near the bottom-left corner
lowerLeftMenu.setLocalTranslation(new Vector3f(50, 100, 8)); // Adjust X and Y to align with the bottom-left corner
app.getGuiNode().attachChild(lowerLeftMenu);
Label spacer = column.addChild(new Label("")); // Spacer
spacer.setPreferredSize(new Vector3f(1, 130, 0));
} else {
rightBuildingSelector = buildingSelector;
rightSpecialCardSelector = specialCardSelector;
rightCurrencyInput = currencyInput;
Label spacer = column.addChild(new Label("")); // Spacer
spacer.setPreferredSize(new Vector3f(1, 130, 0));
}
return column;
}
/**
* Provides sample dropdown items.
*/
private VersionedList<String> getSampleItems() {
VersionedList<String> items = new VersionedList<>();
items.add("Option 1");
items.add("Option 2");
items.add("Option 3");
return items;
}
/**
* Adds a background image to the dialog.
*/
private void addBackgroundImage() {
Texture backgroundImage = app.getAssetManager().loadTexture("Pictures/unibw-Bib2.png");
Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
Geometry background = new Geometry("Background", quad);
Material backgroundMaterial = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
backgroundMaterial.setTexture("ColorMap", backgroundImage);
background.setMaterial(backgroundMaterial);
background.setLocalTranslation(0, 0, 6); // Position behind other GUI elements
app.getGuiNode().attachChild(background);
}
private String truncateText(String text, int maxLength) {
return text.length() > maxLength ? text.substring(0, maxLength) + "..." : text;
}
private void updateSelectionsField(TextField selectionsField, Selector<String> buildingSelector, TextField currencyInput, Selector<String> specialCardSelector) {
// Get selections from the building selector
String buildingSelections = buildingSelector != null && buildingSelector.getSelectedItem() != null
? buildingSelector.getSelectedItem().trim()
: "";
// Get text from the currency input
String currencySelections = currencyInput != null
? currencyInput.getText().trim()
: "";
// Get selections from the special card selector
String specialCardSelections = specialCardSelector != null && specialCardSelector.getSelectedItem() != null
? specialCardSelector.getSelectedItem().trim()
: "";
// Build the combined text without adding unnecessary spaces
StringBuilder combinedText = new StringBuilder();
if (!buildingSelections.isEmpty()) {
combinedText.append(buildingSelections);
}
if (!currencySelections.isEmpty()) {
if (combinedText.length() > 0) {
combinedText.append(" | "); // Add a separator if there's already text
}
combinedText.append(currencySelections);
}
if (!specialCardSelections.isEmpty()) {
if (combinedText.length() > 0) {
combinedText.append(" | "); // Add a separator if there's already text
}
combinedText.append(specialCardSelections);
}
// Update the content of the TextField
selectionsField.setText(combinedText.toString());
}
/**
* Handles the escape action for the dialog.
*/
@Override
public void escape() {
new SettingsMenu(app).open();
}
/**
* Updates the dialog periodically, called by the dialog manager.
*
* @param delta The time elapsed since the last update.
*/
@Override
public void update(float delta) {
// Periodic updates (if needed) can be implemented here
}
/**
* Functional interface for a selection action listener.
*/
@FunctionalInterface
private interface SelectionActionListener<T> {
void onSelectionChanged(T selection);
}
/**
* Adds a custom action listener to the Selector.
*/
private void addCustomSelectionListener(Selector<String> selector, SelectionActionListener<String> listener) {
VersionedReference<Set<Integer>> selectionRef = selector.getSelectionModel().createReference();
app.getStateManager().attach(new BaseAppState() {
@Override
public void update(float tpf) {
if (selectionRef.update()) {
String selected = selector.getSelectedItem();
listener.onSelectionChanged(selected);
}
}
@Override
protected void initialize(Application app) {}
@Override
protected void cleanup(Application app) {}
@Override
protected void onEnable() {}
@Override
protected void onDisable() {}
});
}
private void monitorTextFieldChanges(TextField textField, Runnable onChange) {
VersionedReference<DocumentModel> ref = textField.getDocumentModel().createReference();
app.getStateManager().attach(new BaseAppState() {
@Override
public void update(float tpf) {
if (ref.update()) {
onChange.run();
}
}
@Override
protected void initialize(Application app) {}
@Override
protected void cleanup(Application app) {}
@Override
protected void onEnable() {}
@Override
protected void onDisable() {}
});
}
}

View File

@@ -1,10 +1,6 @@
package pp.monopoly.client.gui.popups; package pp.monopoly.client.gui.popups;
import com.jme3.material.Material;
import com.jme3.material.RenderState.BlendMode;
import com.jme3.math.ColorRGBA; import com.jme3.math.ColorRGBA;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Quad;
import com.simsilica.lemur.Button; import com.simsilica.lemur.Button;
import com.simsilica.lemur.Container; import com.simsilica.lemur.Container;
import com.simsilica.lemur.Label; import com.simsilica.lemur.Label;
@@ -13,43 +9,40 @@ import com.simsilica.lemur.style.ElementId;
import pp.dialog.Dialog; import pp.dialog.Dialog;
import pp.monopoly.client.MonopolyApp; import pp.monopoly.client.MonopolyApp;
import pp.monopoly.client.gui.SettingsMenu; import pp.monopoly.client.gui.SettingsMenu;
import pp.monopoly.message.client.BuyPropertyRequest;
import pp.monopoly.model.fields.BoardManager; import pp.monopoly.model.fields.BoardManager;
import pp.monopoly.model.fields.BuildingProperty; import pp.monopoly.model.fields.BuildingProperty;
import pp.monopoly.notification.Sound;
/** /**
* SettingsMenu ist ein Overlay-Menü, das durch ESC aufgerufen werden kann. * SettingsMenu ist ein Overlay-Menü, das durch ESC aufgerufen werden kann.
*/ */
public class BuyCard extends Dialog { public class BuyCard extends Dialog {
private final MonopolyApp app; private final MonopolyApp app;
private final Geometry overlayBackground;
private final Container buyCardContainer; private final Container buyCardContainer;
private final Container backgroundContainer; private final Container backgroundContainer;
private int index = 37;
public BuyCard(MonopolyApp app) { public BuyCard(MonopolyApp app) {
super(app.getDialogManager()); super(app.getDialogManager());
this.app = app; this.app = app;
//Generate the corresponfing field //Generate the corresponfing field
int index = app.getGameLogic().getPlayerHandler().getPlayers().get(0).getFieldID();
BuildingProperty field = (BuildingProperty) new BoardManager().getFieldAtIndex(index); BuildingProperty field = (BuildingProperty) new BoardManager().getFieldAtIndex(index);
// Halbtransparentes Overlay hinzufügen
overlayBackground = createOverlayBackground();
app.getGuiNode().attachChild(overlayBackground);
// Create the background container // Create the background container
backgroundContainer = new Container(); backgroundContainer = new Container();
backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background
app.getGuiNode().attachChild(backgroundContainer); attachChild(backgroundContainer);
// Hauptcontainer für die Gebäudekarte // Hauptcontainer für die Gebäudekarte
buyCardContainer = new Container(); buyCardContainer = new Container();
buyCardContainer.setBackground(new QuadBackgroundComponent(field.getColor().getColor()));
Label title = buyCardContainer.addChild(new Label( field.getName(), new ElementId("label-Bold")));
Label settingsTitle = buyCardContainer.addChild(new Label( field.getName(), new ElementId("settings-title"))); title.setBackground(new QuadBackgroundComponent(field.getColor().getColor()));
settingsTitle.setFontSize(48); title.setFontSize(48);
// Text, der auf der Karte steht // Text, der auf der Karte steht
// Die Preise werden dynamisch dem BoardManager entnommen // Die Preise werden dynamisch dem BoardManager entnommen
@@ -70,9 +63,17 @@ public class BuyCard extends Dialog {
// Beenden-Button // Beenden-Button
Button quitButton = buyCardContainer.addChild(new Button("Beenden", new ElementId("button"))); Button quitButton = buyCardContainer.addChild(new Button("Beenden", new ElementId("button")));
quitButton.setFontSize(32); quitButton.setFontSize(32);
quitButton.addClickCommands(s -> ifTopDialog(() -> {
app.getGameLogic().playSound(Sound.BUTTON);
close();
}));
// Kaufen-Button // Kaufen-Button
Button buyButton = buyCardContainer.addChild(new Button("Kaufen", new ElementId("button"))); Button buyButton = buyCardContainer.addChild(new Button("Kaufen", new ElementId("button")));
buyButton.setFontSize(32); buyButton.setFontSize(32);
buyButton.addClickCommands(s -> ifTopDialog( () -> {
app.getGameLogic().playSound(Sound.BUTTON);
app.getGameLogic().send(new BuyPropertyRequest());
}));
float padding = 10; // Padding around the settingsContainer for the background float padding = 10; // Padding around the settingsContainer for the background
backgroundContainer.setPreferredSize(buyCardContainer.getPreferredSize().addLocal(padding, padding, 0)); backgroundContainer.setPreferredSize(buyCardContainer.getPreferredSize().addLocal(padding, padding, 0));
@@ -94,22 +95,6 @@ public class BuyCard extends Dialog {
app.getGuiNode().attachChild(buyCardContainer); app.getGuiNode().attachChild(buyCardContainer);
} }
/**
* Erstellt einen halbtransparenten Hintergrund für das Menü.
*
* @return Geometrie des Overlays
*/
private Geometry createOverlayBackground() {
Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
Geometry overlay = new Geometry("Overlay", quad);
Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Halbtransparent
material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
overlay.setMaterial(material);
overlay.setLocalTranslation(0, 0, 0);
return overlay;
}
/** /**
* Schließt das Menü und entfernt die GUI-Elemente. * Schließt das Menü und entfernt die GUI-Elemente.
*/ */
@@ -117,7 +102,6 @@ public class BuyCard extends Dialog {
public void close() { public void close() {
app.getGuiNode().detachChild(buyCardContainer); // Entferne das Menü app.getGuiNode().detachChild(buyCardContainer); // Entferne das Menü
app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
app.getGuiNode().detachChild(overlayBackground); // Entferne das Overlay
super.close(); super.close();
} }

View File

@@ -65,11 +65,6 @@ public class EventCard extends Dialog {
quitButton.setFontSize(32); quitButton.setFontSize(32);
quitButton.addClickCommands(source -> close()); quitButton.addClickCommands(source -> close());
// TODO Kaufen-Button wird nicht mehr benötigt, prüfen ob weg kann
//Button buyButton = buyCardContainer.addChild(new Button("Kaufen", new ElementId("button")));
//buyButton.setFontSize(32);
float padding = 10; // Padding around the settingsContainer for the background float padding = 10; // Padding around the settingsContainer for the background
backgroundContainer.setPreferredSize(eventCardContainer.getPreferredSize().addLocal(padding, padding, 0)); backgroundContainer.setPreferredSize(eventCardContainer.getPreferredSize().addLocal(padding, padding, 0));

View File

@@ -5,6 +5,7 @@ import com.jme3.material.RenderState.BlendMode;
import com.jme3.math.ColorRGBA; import com.jme3.math.ColorRGBA;
import com.jme3.scene.Geometry; import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Quad; import com.jme3.scene.shape.Quad;
import com.simsilica.lemur.Button;
import com.simsilica.lemur.Container; import com.simsilica.lemur.Container;
import com.simsilica.lemur.Label; import com.simsilica.lemur.Label;
import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.component.QuadBackgroundComponent;
@@ -13,7 +14,9 @@ import com.simsilica.lemur.style.ElementId;
import pp.dialog.Dialog; import pp.dialog.Dialog;
import pp.monopoly.client.MonopolyApp; import pp.monopoly.client.MonopolyApp;
import pp.monopoly.client.gui.SettingsMenu; import pp.monopoly.client.gui.SettingsMenu;
import pp.monopoly.message.client.BuyPropertyRequest;
import pp.monopoly.model.fields.FoodField; import pp.monopoly.model.fields.FoodField;
import pp.monopoly.notification.Sound;
/** /**
* FoodFieldCard erstellt die Geböudekarte vom Brandl und der Truppenküche * FoodFieldCard erstellt die Geböudekarte vom Brandl und der Truppenküche
@@ -23,13 +26,13 @@ public class FoodFieldCard extends Dialog {
private final Geometry overlayBackground; private final Geometry overlayBackground;
private final Container foodFieldContainer; private final Container foodFieldContainer;
private final Container backgroundContainer; private final Container backgroundContainer;
private int index = 12;
public FoodFieldCard(MonopolyApp app) { public FoodFieldCard(MonopolyApp app) {
super(app.getDialogManager()); super(app.getDialogManager());
this.app = app; this.app = app;
//Generate the corresponfing field //Generate the corresponfing field
int index = app.getGameLogic().getPlayerHandler().getPlayers().get(0).getFieldID();
FoodField field = (FoodField) app.getGameLogic().getBoardManager().getFieldAtIndex(index); FoodField field = (FoodField) app.getGameLogic().getBoardManager().getFieldAtIndex(index);
// Halbtransparentes Overlay hinzufügen // Halbtransparentes Overlay hinzufügen
@@ -68,22 +71,24 @@ public class FoodFieldCard extends Dialog {
propertyValuesContainer.addChild(new Label("„Hypothek: " + field.getHypo() + " EUR", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("„Hypothek: " + field.getHypo() + " EUR", new ElementId("label-Text")));
propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
//TODO eventuell diese Stelle löschen, da nur die BuyCard Kaufen und beenden hat
/*
// Beenden-Button // Beenden-Button
Button quitButton = foodFieldContainer.addChild(new Button("Beenden", new ElementId("button"))); Button quitButton = foodFieldContainer.addChild(new Button("Beenden", new ElementId("button")));
quitButton.setFontSize(32); quitButton.setFontSize(32);
quitButton.addClickCommands(s -> ifTopDialog(() -> {
app.getGameLogic().playSound(Sound.BUTTON);
close();
}));
// Kaufen-Button // Kaufen-Button
Button buyButton = foodFieldContainer.addChild(new Button("Kaufen", new ElementId("button"))); Button buyButton = foodFieldContainer.addChild(new Button("Kaufen", new ElementId("button")));
buyButton.setFontSize(32); buyButton.setFontSize(32);
*/ buyButton.addClickCommands(s -> ifTopDialog( () -> {
app.getGameLogic().playSound(Sound.BUTTON);
app.getGameLogic().send(new BuyPropertyRequest());
}));
float padding = 10; // Padding around the settingsContainer for the background float padding = 10; // Padding around the settingsContainer for the background
backgroundContainer.setPreferredSize(foodFieldContainer.getPreferredSize().addLocal(padding, padding, 0)); backgroundContainer.setPreferredSize(foodFieldContainer.getPreferredSize().addLocal(padding, padding, 0));
// Zentriere das Menü // Zentriere das Menü
foodFieldContainer.setLocalTranslation( foodFieldContainer.setLocalTranslation(
(app.getCamera().getWidth() - foodFieldContainer.getPreferredSize().x) / 2, (app.getCamera().getWidth() - foodFieldContainer.getPreferredSize().x) / 2,
@@ -127,10 +132,6 @@ public class FoodFieldCard extends Dialog {
super.close(); super.close();
} }
public void setIndex(int index) {
this.index = index;
}
@Override @Override
public void escape() { public void escape() {
new SettingsMenu(app).open(); new SettingsMenu(app).open();

View File

@@ -5,6 +5,7 @@ import com.jme3.material.RenderState.BlendMode;
import com.jme3.math.ColorRGBA; import com.jme3.math.ColorRGBA;
import com.jme3.scene.Geometry; import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Quad; import com.jme3.scene.shape.Quad;
import com.simsilica.lemur.Button;
import com.simsilica.lemur.Container; import com.simsilica.lemur.Container;
import com.simsilica.lemur.Label; import com.simsilica.lemur.Label;
import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.component.QuadBackgroundComponent;
@@ -12,7 +13,9 @@ import com.simsilica.lemur.style.ElementId;
import pp.dialog.Dialog; import pp.dialog.Dialog;
import pp.monopoly.client.MonopolyApp; import pp.monopoly.client.MonopolyApp;
import pp.monopoly.client.gui.SettingsMenu; import pp.monopoly.client.gui.SettingsMenu;
import pp.monopoly.message.client.BuyPropertyRequest;
import pp.monopoly.model.fields.GateField; import pp.monopoly.model.fields.GateField;
import pp.monopoly.notification.Sound;
/** /**
* SettingsMenu ist ein Overlay-Menü, das durch ESC aufgerufen werden kann. * SettingsMenu ist ein Overlay-Menü, das durch ESC aufgerufen werden kann.
@@ -22,13 +25,13 @@ public class GateFieldCard extends Dialog {
private final Geometry overlayBackground; private final Geometry overlayBackground;
private final Container gateFieldContainer; private final Container gateFieldContainer;
private final Container backgroundContainer; private final Container backgroundContainer;
private int index = 5;
public GateFieldCard(MonopolyApp app) { public GateFieldCard(MonopolyApp app) {
super(app.getDialogManager()); super(app.getDialogManager());
this.app = app; this.app = app;
//Generate the corresponfing field //Generate the corresponfing field
int index = app.getGameLogic().getPlayerHandler().getPlayers().get(0).getFieldID();
GateField field = (GateField) app.getGameLogic().getBoardManager().getFieldAtIndex(index); GateField field = (GateField) app.getGameLogic().getBoardManager().getFieldAtIndex(index);
// Halbtransparentes Overlay hinzufügen // Halbtransparentes Overlay hinzufügen
@@ -63,16 +66,21 @@ public class GateFieldCard extends Dialog {
propertyValuesContainer.addChild(new Label("„Hypothek: " + field.getHypo() + " EUR", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("„Hypothek: " + field.getHypo() + " EUR", new ElementId("label-Text")));
propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
//TODO eventuell diese Stelle löschen, da nur die BuyCard Kaufen und beenden hat
/*
// Beenden-Button // Beenden-Button
Button quitButton = foodFieldContainer.addChild(new Button("Beenden", new ElementId("button"))); Button quitButton = gateFieldContainer.addChild(new Button("Beenden", new ElementId("button")));
quitButton.setFontSize(32); quitButton.setFontSize(32);
quitButton.addClickCommands(s -> ifTopDialog(() -> {
app.getGameLogic().playSound(Sound.BUTTON);
close();
}));
// Kaufen-Button // Kaufen-Button
Button buyButton = foodFieldContainer.addChild(new Button("Kaufen", new ElementId("button"))); Button buyButton = gateFieldContainer.addChild(new Button("Kaufen", new ElementId("button")));
buyButton.setFontSize(32); buyButton.setFontSize(32);
*/ buyButton.addClickCommands(s -> ifTopDialog(() -> {
app.getGameLogic().playSound(Sound.BUTTON);
app.getGameLogic().send(new BuyPropertyRequest());
close();
}));
float padding = 10; // Padding around the settingsContainer for the background float padding = 10; // Padding around the settingsContainer for the background
backgroundContainer.setPreferredSize(gateFieldContainer.getPreferredSize().addLocal(padding, padding, 0)); backgroundContainer.setPreferredSize(gateFieldContainer.getPreferredSize().addLocal(padding, padding, 0));
@@ -121,10 +129,6 @@ public class GateFieldCard extends Dialog {
super.close(); super.close();
} }
public void setIndex(int index) {
this.index = index;
}
@Override @Override
public void escape() { public void escape() {
new SettingsMenu(app).open(); new SettingsMenu(app).open();

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

View File

@@ -34,13 +34,13 @@ public class MonopolyConfig extends Config {
* The width of the game map in terms of grid units. * The width of the game map in terms of grid units.
*/ */
@Property("map.width") @Property("map.width")
private int mapWidth = 12; private int mapWidth = 10;
/** /**
* The height of the game map in terms of grid units. * The height of the game map in terms of grid units.
*/ */
@Property("map.height") @Property("map.height")
private int mapHeight = 12; private int mapHeight = 10;
/** /**
* Creates an instance of {@code MonopolyConfig} with default settings. * Creates an instance of {@code MonopolyConfig} with default settings.

View File

@@ -6,6 +6,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
import pp.monopoly.game.server.PlayerHandler;
import pp.monopoly.message.client.ClientMessage; import pp.monopoly.message.client.ClientMessage;
import pp.monopoly.message.server.BuyPropertyResponse; import pp.monopoly.message.server.BuyPropertyResponse;
import pp.monopoly.message.server.DiceResult; import pp.monopoly.message.server.DiceResult;
@@ -24,6 +25,7 @@ import pp.monopoly.model.Board;
import pp.monopoly.model.IntPoint; import pp.monopoly.model.IntPoint;
import pp.monopoly.model.fields.BoardManager; import pp.monopoly.model.fields.BoardManager;
import pp.monopoly.notification.ClientStateEvent; import pp.monopoly.notification.ClientStateEvent;
import pp.monopoly.notification.DiceRollEvent;
import pp.monopoly.notification.GameEvent; import pp.monopoly.notification.GameEvent;
import pp.monopoly.notification.GameEventBroker; import pp.monopoly.notification.GameEventBroker;
import pp.monopoly.notification.GameEventListener; import pp.monopoly.notification.GameEventListener;
@@ -52,7 +54,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
/** The current state of the client game logic. */ /** The current state of the client game logic. */
private ClientState state = new LobbyState(this); private ClientState state = new LobbyState(this);
private List<Player> players; private PlayerHandler playerHandler;
private BoardManager boardManager = new BoardManager(); private BoardManager boardManager = new BoardManager();
@@ -94,8 +96,8 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
state.entry(); state.entry();
} }
public List<Player> getPlayers() { public PlayerHandler getPlayerHandler() {
return players; return playerHandler;
} }
/** /**
@@ -144,7 +146,6 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
LOGGER.log(Level.ERROR, "trying to send {0} with sender==null", msg); //NON-NLS LOGGER.log(Level.ERROR, "trying to send {0} with sender==null", msg); //NON-NLS
} else { } else {
clientSender.send(msg); clientSender.send(msg);
System.out.println("Message gesendet");
} }
} }
@@ -199,10 +200,10 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
@Override @Override
public void received(BuyPropertyResponse msg) { public void received(BuyPropertyResponse msg) {
if (msg.isSuccessful()) { if (msg.isSuccessful()) {
setInfoText("You successfully bought " + msg.getPropertyName() + "!");
playSound(Sound.MONEY_LOST); playSound(Sound.MONEY_LOST);
} else { } else {
setInfoText("Unable to buy " + msg.getPropertyName() + ". Reason: " + msg.getReason());
} }
} }
@@ -213,9 +214,8 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
*/ */
@Override @Override
public void received(DiceResult msg) { public void received(DiceResult msg) {
setInfoText("You rolled a " + msg.calcTotal() + "!");
//Set the dice images
playSound(Sound.DICE_ROLL); playSound(Sound.DICE_ROLL);
notifyListeners(new DiceRollEvent(msg.getRollResult().get(0), msg.getRollResult().get(1)));
} }
/** /**
@@ -225,7 +225,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
*/ */
@Override @Override
public void received(EventDrawCard msg) { public void received(EventDrawCard msg) {
setInfoText("Event card drawn: " + msg.getCardDescription());
// Kartenlogik // Kartenlogik
playSound(Sound.EVENT_CARD); playSound(Sound.EVENT_CARD);
} }
@@ -238,11 +238,11 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
@Override @Override
public void received(GameOver msg) { public void received(GameOver msg) {
if (msg.isWinner()) { if (msg.isWinner()) {
setInfoText("Congratulations! You have won the game!");
//Winner popup //Winner popup
playSound(Sound.WINNER); playSound(Sound.WINNER);
} else { } else {
setInfoText("Game over. Better luck next time!");
// Looser popup // Looser popup
playSound(Sound.LOSER); playSound(Sound.LOSER);
} }
@@ -255,9 +255,9 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
*/ */
@Override @Override
public void received(GameStart msg) { public void received(GameStart msg) {
players = msg.getPlayers(); playerHandler = msg.getPlayerHandler();
setInfoText("The game has started! Good luck!");
setState(new WaitForTurnState(this)); setState(new WaitForTurnState(this));
} }
/** /**
@@ -268,10 +268,10 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
@Override @Override
public void received(JailEvent msg) { public void received(JailEvent msg) {
if (msg.isGoingToJail()) { if (msg.isGoingToJail()) {
setInfoText("You are sent to jail!");
playSound(Sound.GULAG); playSound(Sound.GULAG);
} else { } else {
setInfoText("You are out of jail!");
} }
} }
@@ -283,7 +283,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
@Override @Override
public void received(PlayerStatusUpdate msg) { public void received(PlayerStatusUpdate msg) {
setInfoText("Player " + msg.getPlayerName() + " status updated: " + msg.getStatus());
} }
/** /**
@@ -293,7 +293,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
*/ */
@Override @Override
public void received(TimeOutWarning msg) { public void received(TimeOutWarning msg) {
setInfoText("Warning! Time is running out. You have " + msg.getRemainingTime() + " seconds left.");
} }
/** /**
@@ -303,7 +303,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
*/ */
@Override @Override
public void received(ViewAssetsResponse msg) { public void received(ViewAssetsResponse msg) {
setInfoText("Your current assets are being displayed.");
} }
/** /**
@@ -314,10 +314,10 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
@Override @Override
public void received(TradeReply msg) { public void received(TradeReply msg) {
if (msg.getTradeHandler().getStatus()) { if (msg.getTradeHandler().getStatus()) {
setInfoText("Trade accepted by " + msg.getTradeHandler().getReceiver().getName() + ".");
playSound(Sound.TRADE_ACCEPTED); playSound(Sound.TRADE_ACCEPTED);
} else { } else {
setInfoText("Trade rejected by " + msg.getTradeHandler().getReceiver().getName() + ".");
playSound(Sound.TRADE_REJECTED); playSound(Sound.TRADE_REJECTED);
} }
} }
@@ -329,7 +329,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
*/ */
@Override @Override
public void received(TradeRequest msg) { public void received(TradeRequest msg) {
setInfoText("Trade offer received from " + msg.getTradeHandler().getSender().getName());
// playSound(Sound.TRADE_REQUEST); no sound effect // playSound(Sound.TRADE_REQUEST); no sound effect
// notifyListeners(); // notifyListeners();
} }
@@ -341,7 +341,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
*/ */
@Override @Override
public void received(NextPlayerTurn msg) { public void received(NextPlayerTurn msg) {
setInfoText("It's your turn!");
setState(new ActiveState(this)); setState(new ActiveState(this));
} }
} }

View File

@@ -40,8 +40,8 @@ public class Player implements FieldVisitor<Void>{
private int getOutOfJailCard; private int getOutOfJailCard;
private int fieldID; private int fieldID;
private DiceResult rollResult; private DiceResult rollResult;
private final PlayerHandler handler; private transient final PlayerHandler handler;
private PlayerState state = new LobbyState(); private transient PlayerState state = new LobbyState();
/** /**
* Default constructor for serialization purposes. * Default constructor for serialization purposes.
@@ -79,12 +79,12 @@ public class Player implements FieldVisitor<Void>{
public PlayerColor getColor() { public PlayerColor getColor() {
switch ((id%6)+1) { switch ((id%6)+1) {
case 1: return PlayerColor.BLUE; case 1: return PlayerColor.CYAN;
case 2: return PlayerColor.GREEN_DARK; case 2: return PlayerColor.YELLOW;
case 3: return PlayerColor.GREEN_LIGHT; case 3: return PlayerColor.RED;
case 4: return PlayerColor.PINK; case 4: return PlayerColor.PINK;
case 5: return PlayerColor.RED; case 5: return PlayerColor.GREEN;
case 6: return PlayerColor.YELLOW; case 6: return PlayerColor.PURPLE;
default: default:
return null; return null;
@@ -439,7 +439,7 @@ public class Player implements FieldVisitor<Void>{
@Override @Override
public DiceResult rollDice() { public DiceResult rollDice() {
List<Integer> roll = List.of(Dice.rollDice(), Dice.rollDice()); List<Integer> roll = List.of(Dice.rollDice(), Dice.rollDice());
rollResult = new DiceResult(roll); rollResult = new DiceResult(roll.get(0), roll.get(1));
return rollResult; return rollResult;
} }
@@ -491,7 +491,7 @@ public class Player implements FieldVisitor<Void>{
@Override @Override
public DiceResult rollDice() { public DiceResult rollDice() {
List<Integer> roll = List.of(Dice.rollDice(), Dice.rollDice()); List<Integer> roll = List.of(Dice.rollDice(), Dice.rollDice());
rollResult = new DiceResult(roll); rollResult = new DiceResult(roll.get(0), roll.get(1));
if (rollResult.isDoublets()) { if (rollResult.isDoublets()) {
state = new ActiveState(); state = new ActiveState();
} else if (DoubletsCounter == 0) { } else if (DoubletsCounter == 0) {

View File

@@ -6,12 +6,12 @@ import com.jme3.math.ColorRGBA;
* Enum representing six distinct colors for players in the game. * Enum representing six distinct colors for players in the game.
*/ */
public enum PlayerColor { public enum PlayerColor {
GREEN_LIGHT(new ColorRGBA(0 / 255f, 204 / 255f, 0 / 255f, 1)), // Hex: 00cc00 CYAN(new ColorRGBA(1 / 255f, 190 / 255f, 254 / 255f, 1)),
RED(new ColorRGBA(255 / 255f, 0 / 255f, 0 / 255f, 1)), // Hex: ff0000 YELLOW(new ColorRGBA(255 / 255f, 255 / 255f, 0 / 255f, 1)),
BLUE(new ColorRGBA(0 / 255f, 0 / 255f, 204 / 255f, 1)), // Hex: 0000cc RED(new ColorRGBA(255 / 255f, 0 / 255f, 0 / 255f, 1)),
PINK(new ColorRGBA(255 / 255f, 77 / 255f, 166 / 255f, 1)), // Hex: ff4da6 PINK(new ColorRGBA(255 / 255f, 77 / 255f, 166 / 255f, 1)),
GREEN_DARK(new ColorRGBA(0 / 255f, 102 / 255f, 0 / 255f, 1)), // Hex: 006600 GREEN(new ColorRGBA(0 / 255f, 204 / 255f, 0 / 255f, 1)),
YELLOW(new ColorRGBA(255 / 255f, 255 / 255f, 0 / 255f, 1)); // Hex: ffff00 PURPLE(new ColorRGBA(143 / 255f, 0 / 255f, 255 / 255f, 1));
private final ColorRGBA color; private final ColorRGBA color;

View File

@@ -1,9 +1,9 @@
package pp.monopoly.game.server; package pp.monopoly.game.server;
import java.util.LinkedList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import java.util.Set; import java.util.Set;
@@ -16,10 +16,9 @@ import pp.monopoly.model.LimitedLinkedList;
*/ */
@Serializable @Serializable
public class PlayerHandler { public class PlayerHandler {
private List<Player> players = new LimitedLinkedList<>(6); private List<Player> players = new LinkedList<>();
private Set<Player> readyPlayers = new HashSet<>(); private Set<Player> readyPlayers = new HashSet<>();
private ServerGameLogic logic; private transient ServerGameLogic logic;
private Player hostPlayer;
private Player extra = null; private Player extra = null;
/** /**
@@ -55,14 +54,6 @@ public class PlayerHandler {
players.addAll(players); players.addAll(players);
} }
/**
* Return the host player
* @return the host player
*/
public Player getHostPlayer() {
return hostPlayer;
}
/** /**
* Return the number of players * Return the number of players
* @return number of players in the game * @return number of players in the game
@@ -114,9 +105,6 @@ public class PlayerHandler {
throw new IllegalArgumentException("Player already registered"); throw new IllegalArgumentException("Player already registered");
} }
players.add(player); players.add(player);
if(hostPlayer == null) {
hostPlayer = player;
}
} }
/** /**

View File

@@ -132,7 +132,6 @@ public class ServerGameLogic implements ClientInterpreter {
playerHandler.addPlayer(player); playerHandler.addPlayer(player);
LOGGER.log(Level.DEBUG, "Player added: {0}", player.getId()); LOGGER.log(Level.DEBUG, "Player added: {0}", player.getId());
System.out.println("Anzahl Spieler verbunden:"+ playerHandler.getPlayerCount());
return player; return player;
} }
@@ -175,7 +174,7 @@ public class ServerGameLogic implements ClientInterpreter {
LOGGER.log(Level.DEBUG, "Ending turn for player {0}", player.getName()); LOGGER.log(Level.DEBUG, "Ending turn for player {0}", player.getName());
Player next = playerHandler.nextPlayer(); Player next = playerHandler.nextPlayer();
next.setActive(); next.setActive();
send(next, new NextPlayerTurn(next)); send(next, new NextPlayerTurn());
} }
} }
} }
@@ -189,7 +188,7 @@ public class ServerGameLogic implements ClientInterpreter {
@Override @Override
public void received(PlayerReady msg, int from) { public void received(PlayerReady msg, int from) {
Player player = playerHandler.getPlayerById(from); Player player = playerHandler.getPlayerById(from);
if(player == playerHandler.getHostPlayer()) { if(player.getId() == 0) {
startMoney = msg.getStartMoney(); startMoney = msg.getStartMoney();
} }
@@ -204,10 +203,10 @@ public class ServerGameLogic implements ClientInterpreter {
if(playerHandler.allPlayersReady()) { if(playerHandler.allPlayersReady()) {
playerHandler.setStartBalance(startMoney); playerHandler.setStartBalance(startMoney);
for (Player p : playerHandler.getPlayers()) { for (Player p : playerHandler.getPlayers()) {
send(p, new GameStart(playerHandler.getPlayers())); send(p, new GameStart(playerHandler));
} }
playerHandler.randomOrder(); playerHandler.randomOrder();
send(playerHandler.getPlayerAtIndex(0), new NextPlayerTurn(playerHandler.getPlayerAtIndex(0))); send(playerHandler.getPlayerAtIndex(0), new NextPlayerTurn());
} }
} }
@@ -220,7 +219,7 @@ public class ServerGameLogic implements ClientInterpreter {
@Override @Override
public void received(RollDice msg, int from) { public void received(RollDice msg, int from) {
Player player = playerHandler.getPlayerById(from); Player player = playerHandler.getPlayerById(from);
if (player != null && state == ServerState.INGAME) { if (player != null) {
send(player, player.rollDice()); send(player, player.rollDice());
} }
} }

View File

@@ -7,30 +7,14 @@ import com.jme3.network.serializing.Serializable;
*/ */
@Serializable @Serializable
public class BuyPropertyRequest extends ClientMessage{ public class BuyPropertyRequest extends ClientMessage{
private int propertyId;
/**
* Default constructor for serialization purposes.
*/
private BuyPropertyRequest() { /* empty */ }
/** /**
* Constructs a BuyPropertyRequest with the specified property ID. * Constructs a BuyPropertyRequest with the specified property ID.
* *
* @param propertyId the ID of the property to buy * @param propertyId the ID of the property to buy
*/ */
public BuyPropertyRequest(int propertyId) { public BuyPropertyRequest() {}
this.propertyId = propertyId;
}
/**
* Gets the ID of the property to buy.
*
* @return the property ID
*/
public int getPropertyId() {
return propertyId;
}
@Override @Override
public void accept(ClientInterpreter interpreter, int from) { public void accept(ClientInterpreter interpreter, int from) {

View File

@@ -11,7 +11,7 @@ public class RollDice extends ClientMessage{
/** /**
* Default constructor for serialization purposes. * Default constructor for serialization purposes.
*/ */
private RollDice() { /* empty */ } public RollDice() { /* empty */ }
@Override @Override
public void accept(ClientInterpreter interpreter, int from) { public void accept(ClientInterpreter interpreter, int from) {

View File

@@ -7,19 +7,24 @@ import com.jme3.network.serializing.Serializable;
@Serializable @Serializable
public class DiceResult extends ServerMessage{ public class DiceResult extends ServerMessage{
private List<Integer> rollResult; private final int a;
private final int b;
/** /**
* Default constructor for serialization purposes. * Default constructor for serialization purposes.
*/ */
private DiceResult() { /* empty */ } private DiceResult() {
a = 1;
b = 1;
}
public DiceResult(List<Integer> rollResult) { public DiceResult(int a, int b) {
this.rollResult = rollResult; this.a = a;
this.b = b;
} }
public List<Integer> getRollResult() { public List<Integer> getRollResult() {
return rollResult; return List.of(a,b);
} }
@Override @Override
@@ -34,10 +39,10 @@ public class DiceResult extends ServerMessage{
} }
public boolean isDoublets() { public boolean isDoublets() {
return rollResult.get(0) == rollResult.get(1); return a == b;
} }
public int calcTotal() { public int calcTotal() {
return rollResult.get(0)+rollResult.get(1); return a+b;
} }
} }

View File

@@ -1,27 +1,25 @@
package pp.monopoly.message.server; package pp.monopoly.message.server;
import java.util.List;
import com.jme3.network.serializing.Serializable; import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.PlayerHandler;
@Serializable @Serializable
public class GameStart extends ServerMessage{ public class GameStart extends ServerMessage{
private List<Player> players; private PlayerHandler playerHandler;
/** /**
* Default constructor for serialization purposes. * Default constructor for serialization purposes.
*/ */
private GameStart() { /* empty */ } private GameStart() { /* empty */ }
public GameStart(List<Player> players) { public GameStart(PlayerHandler playerHandler) {
this.players = players; this.playerHandler = playerHandler;
} }
public List<Player> getPlayers() { public PlayerHandler getPlayerHandler() {
return players; return playerHandler;
} }
@Override @Override

View File

@@ -2,20 +2,13 @@ package pp.monopoly.message.server;
import com.jme3.network.serializing.Serializable; import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player;
@Serializable @Serializable
public class NextPlayerTurn extends ServerMessage{ public class NextPlayerTurn extends ServerMessage{
private Player player;
/** /**
* Default constructor for serialization purposes. * Default constructor for serialization purposes.
*/ */
private NextPlayerTurn() { /* empty */ } public NextPlayerTurn() {
public NextPlayerTurn(Player player) {
this.player = player;
} }
@Override @Override
@@ -28,9 +21,4 @@ public class NextPlayerTurn extends ServerMessage{
// TODO Auto-generated method stub // TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'getInfoTextKey'"); throw new UnsupportedOperationException("Unimplemented method 'getInfoTextKey'");
} }
public Player getPlayer() {
return player;
}
} }

View File

@@ -12,13 +12,13 @@ import java.util.List;
public class TradeHandler { public class TradeHandler {
private final Player sender; private final Player sender;
private final Player receiver; private Player receiver;
private final int offeredAmount; private int offeredAmount;
private final List<PropertyField> offeredProperties; private List<PropertyField> offeredProperties;
private final int offeredJailCards; private int offeredJailCards;
private final int requestedAmount; private int requestedAmount;
private final List<PropertyField> requestedProperties; private List<PropertyField> requestedProperties;
private final int requestedJailCards; private int requestedJailCards;
private Boolean status = null; private Boolean status = null;
/** /**
@@ -45,6 +45,22 @@ public class TradeHandler {
this.requestedJailCards = requestedJailCards; this.requestedJailCards = requestedJailCards;
} }
/**
* Constructs a TradeHandler for a single trade instance.
*
* @param sender the Player initiating the trade
* @param receiver the Player receiving the trade offer
* @param offeredAmount the amount of money offered by the sender
* @param offeredProperties the properties offered by the sender
* @param offeredJailCards the jail cards offered by the sender
* @param requestedAmount the amount of money requested from the receiver
* @param requestedProperties the properties requested from the receiver
* @param requestedJailCards the jail cards requested from the receiver
*/
public TradeHandler(Player sender) {
this.sender = sender;
}
public int getOfferedAmount() { public int getOfferedAmount() {
return offeredAmount; return offeredAmount;
} }
@@ -88,10 +104,10 @@ public class TradeHandler {
*/ */
public boolean initiateTrade() { public boolean initiateTrade() {
if (!validateTrade()) { if (!validateTrade()) {
System.out.println("Trade offer is invalid.");
return false; return false;
} }
System.out.println("Trade initiated by " + sender.getName() + " to " + receiver.getName());
return true; return true;
} }
@@ -122,14 +138,14 @@ public class TradeHandler {
transferJailCards(sender, receiver, offeredJailCards); transferJailCards(sender, receiver, offeredJailCards);
transferJailCards(receiver, sender, requestedJailCards); transferJailCards(receiver, sender, requestedJailCards);
System.out.println("Trade completed between " + sender.getName() + " and " + receiver.getName());
} }
/** /**
* Rejects the trade. * Rejects the trade.
*/ */
public void rejectTrade() { public void rejectTrade() {
System.out.println(receiver.getName() + " rejected the trade.");
} }
/** /**
@@ -140,13 +156,13 @@ public class TradeHandler {
private boolean validateTrade() { private boolean validateTrade() {
// Validate sender's ability to offer money // Validate sender's ability to offer money
if (sender.getAccountBalance() < offeredAmount) { if (sender.getAccountBalance() < offeredAmount) {
System.out.println("Sender does not have enough money to offer.");
return false; return false;
} }
// Validate receiver's ability to fulfill the requested amount // Validate receiver's ability to fulfill the requested amount
if (receiver.getAccountBalance() < requestedAmount) { if (receiver.getAccountBalance() < requestedAmount) {
System.out.println("Receiver does not have enough money to fulfill the request.");
return false; return false;
} }
@@ -154,7 +170,7 @@ public class TradeHandler {
if (offeredProperties != null) { if (offeredProperties != null) {
for (PropertyField property : offeredProperties) { for (PropertyField property : offeredProperties) {
if (!sender.getProperties().contains(property)) { if (!sender.getProperties().contains(property)) {
System.out.println("Sender does not own property: " + property.getName());
return false; return false;
} }
} }
@@ -162,7 +178,7 @@ public class TradeHandler {
if (requestedProperties != null) { if (requestedProperties != null) {
for (PropertyField property : requestedProperties) { for (PropertyField property : requestedProperties) {
if (!receiver.getProperties().contains(property)) { if (!receiver.getProperties().contains(property)) {
System.out.println("Receiver does not own property: " + property.getName());
return false; return false;
} }
} }
@@ -170,11 +186,11 @@ public class TradeHandler {
// Validate jail cards // Validate jail cards
if (sender.getNumJailCard() < offeredJailCards) { if (sender.getNumJailCard() < offeredJailCards) {
System.out.println("Sender does not have enough jail cards to offer.");
return false; return false;
} }
if (receiver.getNumJailCard() < requestedJailCards) { if (receiver.getNumJailCard() < requestedJailCards) {
System.out.println("Receiver does not have enough jail cards to fulfill the request.");
return false; return false;
} }
@@ -192,7 +208,7 @@ public class TradeHandler {
from.sellProperty(property); from.sellProperty(property);
to.buyProperty(property); to.buyProperty(property);
property.setOwner(to); property.setOwner(to);
System.out.println("Property " + property.getName() + " transferred from " + from.getName() + " to " + to.getName());
} }
/** /**
@@ -207,6 +223,34 @@ public class TradeHandler {
from.removeJailCard(); from.removeJailCard();
to.addJailCard(); to.addJailCard();
} }
System.out.println(numCards + " jail card(s) transferred from " + from.getName() + " to " + to.getName());
}
public void setOfferedAmount(int offeredAmount) {
this.offeredAmount = offeredAmount;
}
public void setOfferedJailCards(int offeredJailCards) {
this.offeredJailCards = offeredJailCards;
}
public void setOfferedProperties(List<PropertyField> offeredProperties) {
this.offeredProperties = offeredProperties;
}
public void setReceiver(Player receiver) {
this.receiver = receiver;
}
public void setRequestedAmount(int requestedAmount) {
this.requestedAmount = requestedAmount;
}
public void setRequestedJailCards(int requestedJailCards) {
this.requestedJailCards = requestedJailCards;
}
public void setRequestedProperties(List<PropertyField> requestedProperties) {
this.requestedProperties = requestedProperties;
} }
} }

View File

@@ -16,38 +16,38 @@ public class DeckHelper{
public DeckHelper() { public DeckHelper() {
cards = new LinkedList<Card>(); cards = new LinkedList<Card>();
cards.add(new Card("Du wurdest mit einem Dienst KFZ geblitzt. Zahle: 800", "dienst-kfz-blitzer")); cards.add(new Card("Du wurdest mit einem Dienst KFZ geblitzt. Zahle: 800 EUR", "dienst-kfz-blitzer"));
cards.add(new Card("Die erste Spoparty steht bevor. Ziehe vor zum 23er.", "spoparty")); cards.add(new Card("Die erste Spoparty steht bevor. Ziehe vor zum 23er.", "spoparty"));
cards.add(new Card("Du kommst aus dem Gulak frei.", "gulak-frei-1")); cards.add(new Card("Du kommst aus dem Gulak frei.", "gulak-frei-1"));
cards.add(new Card("Du kommst aus dem Gulak frei.", "gulak-frei-2")); cards.add(new Card("Du kommst aus dem Gulak frei.", "gulak-frei-2"));
cards.add(new Card("Du hast den Dienstführerschein bestanden. Ziehe vor bis Teststrecke.", "dienstfuehrerschein")); cards.add(new Card("Du hast den Dienstführerschein bestanden. Ziehe vor bis Teststrecke.", "dienstfuehrerschein"));
cards.add(new Card("Malkmus läd zum Pubquiz ein. Rücke vor bis zum 20er.", "pubquiz")); cards.add(new Card("Malkmus läd zum Pubquiz ein. Rücke vor bis zum 20er.", "pubquiz"));
cards.add(new Card("Du warst ohne Namensschild in der Truppenküche. Rücke vor zum 10er. Gehe nicht über Monatsgehalt. Ziehe keine 2000x ein.", "namensschild-truppenkueche")); cards.add(new Card("Du warst ohne Namensschild in der Truppenküche. Rücke vor zum 10er. Gehe nicht über Monatsgehalt. Ziehe keine 2000x EUR ein.", "namensschild-truppenkueche"));
cards.add(new Card("Du hast heute die Spendierhosen an und gibst eine Runde in der Unibar. Zahle jedem Spieler: 400", "spendierhosen-unibar")); cards.add(new Card("Du hast heute die Spendierhosen an und gibst eine Runde in der Unibar. Zahle jedem Spieler: 400 EUR", "spendierhosen-unibar"));
cards.add(new Card("Du warst in der Prüfungsphase krank. Gehe 3 Felder zurück.", "pruefungsphase-krank")); cards.add(new Card("Du warst in der Prüfungsphase krank. Gehe 3 Felder zurück.", "pruefungsphase-krank"));
cards.add(new Card("Ziehe vor bis zum nächsten Monatsgehalt.", "naechstes-monatsgehalt")); cards.add(new Card("Ziehe vor bis zum nächsten Monatsgehalt.", "naechstes-monatsgehalt"));
cards.add(new Card("Du hast ein Antreten verschlafen. Zahle: 500", "antreten-verschlafen-1")); cards.add(new Card("Du hast ein Antreten verschlafen. Zahle: 500 EUR", "antreten-verschlafen-1"));
cards.add(new Card("Du hast den Maibock organisiert. Du erhältst: 3000", "maibock-organisiert")); cards.add(new Card("Du hast den Maibock organisiert. Du erhältst: 3000 EUR", "maibock-organisiert"));
cards.add(new Card("Der Spieß macht eine unangekündigte Inventur. Zahle für jedes Haus: 400 und jedes Hotel: 2800", "inventur-haeuser-hotels")); cards.add(new Card("Der Spieß macht eine unangekündigte Inventur. Zahle für jedes Haus: 400 EUR und jedes Hotel: 2800 EUR", "inventur-haeuser-hotels"));
cards.add(new Card("Es gab keine Mozzarella Bällchen mehr für Thoma. Alle Spieler ziehen vor auf Gym.", "dienstsport-gym")); cards.add(new Card("Es gab keine Mozzarella Bällchen mehr für Thoma. Alle Spieler ziehen vor auf Gym.", "dienstsport-gym"));
cards.add(new Card("Auf deiner Stube wurde Schimmel gefunden. Gehe ins Gulak. Begib Dich direkt dorthin. Gehe nicht über Monatsgehalt. Ziehe nicht ein.", "schimmel-gulak")); cards.add(new Card("Auf deiner Stube wurde Schimmel gefunden. Gehe ins Gulak. Begib Dich direkt dorthin. Gehe nicht über Monatsgehalt. Ziehe nicht ein.", "schimmel-gulak"));
cards.add(new Card("Deine Stube ist nach einer Partynacht nicht mehr bewohnbar. Du ziehst ins Gulak. Begib Dich direkt dorthin. Gehe nicht über Monatsgehalt. Ziehe nicht ein.", "partynacht-gulak")); cards.add(new Card("Deine Stube ist nach einer Partynacht nicht mehr bewohnbar. Du ziehst ins Gulak. Begib Dich direkt dorthin. Gehe nicht über Monatsgehalt. Ziehe nicht ein.", "partynacht-gulak"));
cards.add(new Card("Das Jahresabschlussantreten steht an. Ziehe vor bis Schwimmhalle.", "jahresabschlussantreten")); cards.add(new Card("Das Jahresabschlussantreten steht an. Ziehe vor bis Schwimmhalle.", "jahresabschlussantreten"));
cards.add(new Card("Du wurdest beim Verkaufen von Versicherungen erwischt. Zahle: 4000", "verkaufen-versicherungen")); cards.add(new Card("Du wurdest beim Verkaufen von Versicherungen erwischt. Zahle: 4000 EUR", "verkaufen-versicherungen"));
cards.add(new Card("Du musstest einen Rückstuferantrag stellen. Setze eine Runde aus.", "rueckstuferantrag")); cards.add(new Card("Du musstest einen Rückstuferantrag stellen. Setze eine Runde aus.", "rueckstuferantrag"));
cards.add(new Card("Auf einer Hausfeier bist du betrunken auf der Treppe gestürzt und dabei auf einen Kameraden gefallen. Zahle: 800 und gehe zurück zu SanZ.", "hausfeier-sturz")); cards.add(new Card("Auf einer Hausfeier bist du betrunken auf der Treppe gestürzt und dabei auf einen Kameraden gefallen. Zahle: 800 EUR und gehe zurück zu SanZ.", "hausfeier-sturz"));
cards.add(new Card("Beförderung. Beim nächsten Monatsgehalt ziehst du ein: 3000", "befoerderung")); cards.add(new Card("Beförderung. Beim nächsten Monatsgehalt ziehst du ein: 3000 EUR", "befoerderung"));
cards.add(new Card("Du entscheidest dich für eine Dienstreise nach Lourd. Zahle: 1000 und setze eine Runde aus.", "dienstreise-lourd")); cards.add(new Card("Du entscheidest dich für eine Dienstreise nach Lourd. Zahle: 1000 EUR und setze eine Runde aus.", "dienstreise-lourd"));
cards.add(new Card("Du warst fleißig Blutspenden und erhältst einen Tag Sonderurlaub. Du bist nochmal an der Reihe.", "blutspenden-sonderurlaub")); cards.add(new Card("Du warst fleißig Blutspenden und erhältst einen Tag Sonderurlaub. Du bist nochmal an der Reihe.", "blutspenden-sonderurlaub"));
cards.add(new Card("Dir wurde auf dem Oktoberfest dein Geldbeutel geklaut. Gebe 10% deines Vermögens ab.", "geldbeutel-oktoberfest")); cards.add(new Card("Dir wurde auf dem Oktoberfest dein Geldbeutel geklaut. Gebe 10% deines Vermögens ab.", "geldbeutel-oktoberfest"));
cards.add(new Card("Du wirst von deinem Chef für vorbildliches Verhalten gelobt. Du erhältst: 4000", "lob-chef")); cards.add(new Card("Du wirst von deinem Chef für vorbildliches Verhalten gelobt. Du erhältst: 4000 EUR", "lob-chef"));
cards.add(new Card("Deine Bekanntschaft von letzter Nacht war eine Spo. Lasse dich testen und zahle: 200", "spo-testen")); cards.add(new Card("Deine Bekanntschaft von letzter Nacht war eine Spo. Lasse dich testen und zahle: 200 EUR", "spo-testen"));
cards.add(new Card("Du wurdest von Kranz geexmattet. Gehe zurück zu Prüfungsamt.", "kranz-exmatrikulation")); cards.add(new Card("Du wurdest von Kranz geexmattet. Gehe zurück zu Prüfungsamt.", "kranz-exmatrikulation"));
cards.add(new Card("Die letzte Party ist ein wenig eskaliert. Setze eine Runde aus.", "party-eskaliert")); cards.add(new Card("Die letzte Party ist ein wenig eskaliert. Setze eine Runde aus.", "party-eskaliert"));
cards.add(new Card("Du wurdest zur VP gewählt und schmeißt eine Einstandsparty. Zahle: 800", "vp-einstandsparty")); cards.add(new Card("Du wurdest zur VP gewählt und schmeißt eine Einstandsparty. Zahle: 800 EUR", "vp-einstandsparty"));
cards.add(new Card("Du hast eine Party veranstaltet und dick Gewinn gemacht. Ziehe ein: 1500", "party-gewinn")); cards.add(new Card("Du hast eine Party veranstaltet und dick Gewinn gemacht. Ziehe ein: 1500 EUR", "party-gewinn"));
cards.add(new Card("Zur falschen Zeit am falschen Ort. Du musst einen Bergmarsch planen und setzt eine Runde aus.", "bergmarsch")); cards.add(new Card("Zur falschen Zeit am falschen Ort. Du musst einen Bergmarsch planen und setzt eine Runde aus.", "bergmarsch"));
cards.add(new Card("Dein Jodel eines Eispenis mit Unterhodenbeleuchtung geht viral. Ziehe ein: 1000", "jodel-eispenis")); cards.add(new Card("Dein Jodel eines Eispenis mit Unterhodenbeleuchtung geht viral. Ziehe ein: 1000 EUR", "jodel-eispenis"));
} }
public void visit(Card card, Player player) { public void visit(Card card, Player player) {

View File

@@ -3,8 +3,11 @@ package pp.monopoly.model.fields;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
@Serializable
public class BuildingProperty extends PropertyField { public class BuildingProperty extends PropertyField {
private int houses; private int houses;
@@ -17,6 +20,12 @@ public class BuildingProperty extends PropertyField {
private final int rentFactor4 = 55; private final int rentFactor4 = 55;
private final int rentFactorHotel = 70; private final int rentFactorHotel = 70;
private BuildingProperty(){
super("", 0, 0, 0);
this.housePrice = 0;
this.color = null;
}
BuildingProperty(String name, int id, int price, int rent, int housePrice, FieldColor color) { BuildingProperty(String name, int id, int price, int rent, int housePrice, FieldColor color) {
super(name, id, price, rent); super(name, id, price, rent);
this.housePrice = housePrice; this.housePrice = housePrice;

View File

@@ -1,11 +1,18 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
@Serializable
public class EventField extends Field{ public class EventField extends Field{
public EventField(String name, int id) { private EventField() {
super("", 0);
}
EventField(String name, int id) {
super(name, id); super(name, id);
} }

View File

@@ -1,11 +1,19 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
abstract class Field { @Serializable
public abstract class Field {
protected final String name; protected final String name;
protected final int id; protected final int id;
private Field() {
this.name = "";
this.id = 0;
}
protected Field(String name, int id) { protected Field(String name, int id) {
this.name = name; this.name = name;
this.id= id; this.id= id;

View File

@@ -1,10 +1,12 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.math.ColorRGBA; import com.jme3.math.ColorRGBA;
import com.jme3.network.serializing.Serializable;
/** /**
* Enum representing eight distinct colors for properties in the game. * Enum representing eight distinct colors for properties in the game.
*/ */
// @Serializable
public enum FieldColor { public enum FieldColor {
BROWN(new ColorRGBA(148 / 255f, 86 / 255f, 57 / 255f, 1)), BROWN(new ColorRGBA(148 / 255f, 86 / 255f, 57 / 255f, 1)),
GREEN(new ColorRGBA(30 / 255f, 179 / 255f, 90 / 255f, 1)), GREEN(new ColorRGBA(30 / 255f, 179 / 255f, 90 / 255f, 1)),
@@ -17,6 +19,10 @@ public enum FieldColor {
private final ColorRGBA color; private final ColorRGBA color;
private FieldColor() {
this.color = null;
}
/** /**
* Constructs a FieldColor with the specified ColorRGBA value. * Constructs a FieldColor with the specified ColorRGBA value.
* *

View File

@@ -1,11 +1,19 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
@Serializable
public class FineField extends Field{ public class FineField extends Field{
private final int fine; private final int fine;
private FineField() {
super("", 0);
this.fine = 0;
}
FineField(String name, int id, int fine) { FineField(String name, int id, int fine) {
super(name, id); super(name, id);
this.fine = fine; this.fine = fine;

View File

@@ -1,10 +1,17 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
@Serializable
public class FoodField extends PropertyField { public class FoodField extends PropertyField {
public FoodField(String name, int id) { private FoodField() {
super("", 0, 0, 0);
}
FoodField(String name, int id) {
super(name, id, 1500,0); super(name, id, 1500,0);
} }

View File

@@ -1,9 +1,15 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import pp.monopoly.game.server.Player; import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player;
@Serializable
public class GateField extends PropertyField{ public class GateField extends PropertyField{
private GateField() {
super("", 0, 0, 0);
}
GateField(String name, int id) { GateField(String name, int id) {
super(name, id, 2000, 25); super(name, id, 2000, 25);
} }

View File

@@ -1,10 +1,12 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import pp.monopoly.game.server.Player; import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player;
@Serializable
public class GoField extends Field{ public class GoField extends Field{
public GoField() { GoField() {
super("Monatsgehalt", 0); super("Monatsgehalt", 0);
} }

View File

@@ -1,7 +1,9 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import pp.monopoly.game.server.Player; import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player;
@Serializable
public class GulagField extends Field{ public class GulagField extends Field{
private int bailCost = 500; private int bailCost = 500;

View File

@@ -1,11 +1,14 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
/** /**
* Represents an abstract property field in the Monopoly game. * Represents an abstract property field in the Monopoly game.
* Contains attributes related to ownership, price, rent, and mortgage status. * Contains attributes related to ownership, price, rent, and mortgage status.
*/ */
@Serializable
public abstract class PropertyField extends Field { public abstract class PropertyField extends Field {
private final int price; private final int price;
@@ -13,6 +16,12 @@ public abstract class PropertyField extends Field {
private Player owner; private Player owner;
private boolean mortgaged = false; private boolean mortgaged = false;
private PropertyField() {
super("", 0);
this.price = 0;
this.rent = 0;
}
/** /**
* Constructs a PropertyField with the specified name, ID, price, and rent. * Constructs a PropertyField with the specified name, ID, price, and rent.
* *

View File

@@ -1,7 +1,10 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
@Serializable
public class TestStreckeField extends Field{ public class TestStreckeField extends Field{
private int money; private int money;

View File

@@ -1,10 +1,13 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
@Serializable
public class WacheField extends Field{ public class WacheField extends Field{
public WacheField() { WacheField() {
super("Wache", 30); super("Wache", 30);
} }

View File

@@ -0,0 +1,10 @@
package pp.monopoly.notification;
public record DiceRollEvent(int a, int b) implements GameEvent{
@Override
public void notifyListener(GameEventListener listener) {
listener.receivedEvent(this);
}
}

View File

@@ -45,4 +45,18 @@ public interface GameEventListener {
* @param event the received event * @param event the received event
*/ */
default void receivedEvent(ClientStateEvent event) { /* do nothing */ } default void receivedEvent(ClientStateEvent event) { /* do nothing */ }
/**
* Indicates that the dice result has changed.
*
* @param event the received event
*/
default void receivedEvent(DiceRollEvent event) { /*Do nothing */}
/**
* Indicates that the players assets have changed.
*
* @param event the received event
*/
default void receivedEvent(UpdatePlayerView event) { /*Do nothing */}
} }

View File

@@ -0,0 +1,13 @@
package pp.monopoly.notification;
public record UpdatePlayerView() implements GameEvent{
/**
* Notifies the game event listener of this event.
*
* @param listener the game event listener
*/
@Override
public void notifyListener(GameEventListener listener) {
listener.receivedEvent(this);
}
}

View File

@@ -6,37 +6,37 @@
######################################## ########################################
# #
monopoly.name=Monopoly monopoly.name=Monopoly
button.play=Start Game button.play=Spiel starten
button.ready=Ready button.ready=Bereit
button.rotate=Rotate button.rotate=Drehen
server.connection.failed=Failed to establish a server connection. server.connection.failed=Fehler beim Herstellen einer Serververbindung.
its.your.turn=It's your turn! Click on the opponent's field to shoot... its.your.turn=Du bist am Zug! Klicke auf das Feld des Gegners, um zu schießen...
lost.connection.to.server=Lost connection to server. The game terminated. lost.connection.to.server=Verbindung zum Server verloren. Das Spiel wurde beendet.
place.ships.in.your.map=Place ships in your map. place.ships.in.your.map=Platziere Schiffe auf deiner Karte.
wait.for.an.opponent=Wait for an opponent! wait.for.an.opponent=Warte auf einen Gegner!
wait.for.opponent=Wait for your opponent! wait.for.opponent=Warte auf deinen Gegner!
confirm.leaving=Would you really like to leave the game? confirm.leaving=Möchtest du das Spiel wirklich beenden?
you.lost.the.game=You lost the game! you.lost.the.game=Du hast das Spiel verloren!
you.won.the.game=You won the game! you.won.the.game=Du hast das Spiel gewonnen!
button.yes=Yes button.yes=Ja
button.no=No button.no=Nein
button.ok=Ok button.ok=Ok
button.connect=Connect button.connect=Verbinden
button.cancel=Cancel button.cancel=Abbrechen
server.dialog=Server server.dialog=Server
host.name=Host host.name=Host
port.number=Port port.number=Port
wait.its.not.your.turn=Wait, it's not your turn!! wait.its.not.your.turn=Warte, es ist nicht dein Zug!!
menu.quit=Quit game menu.quit=Spiel beenden
menu.return-to-game=Return to game menu.return-to-game=Zum Spiel zurückkehren
menu.sound-enabled=Sound switched on menu.sound-enabled=Ton eingeschaltet
menu.background-sound-enabled=Background music switched on menu.background-sound-enabled=Hintergrundmusik eingeschaltet
menu.map.load=Load map from file... menu.map.load=Karte aus Datei laden...
menu.map.save=Save map in file... menu.map.save=Karte in Datei speichern...
label.file=File: label.file=Datei:
label.connecting=Connecting... label.connecting=Verbinde...
dialog.error=Error dialog.error=Fehler
dialog.question=Question dialog.question=Frage
port.must.be.integer=Port must be an integer number port.must.be.integer=Port muss eine ganze Zahl sein
map.doesnt.fit=The map doesn't fit to this game map.doesnt.fit=Die Karte passt nicht zu diesem Spiel
client.server-start=Start server client.server-start=Server starten

View File

@@ -37,6 +37,7 @@ import pp.monopoly.message.client.RollDice;
import pp.monopoly.message.client.TradeOffer; import pp.monopoly.message.client.TradeOffer;
import pp.monopoly.message.client.TradeResponse; import pp.monopoly.message.client.TradeResponse;
import pp.monopoly.message.client.ViewAssetsRequest; import pp.monopoly.message.client.ViewAssetsRequest;
import pp.monopoly.message.server.DiceResult;
import pp.monopoly.message.server.GameStart; import pp.monopoly.message.server.GameStart;
import pp.monopoly.message.server.NextPlayerTurn; import pp.monopoly.message.server.NextPlayerTurn;
import pp.monopoly.message.server.ServerMessage; import pp.monopoly.message.server.ServerMessage;
@@ -130,6 +131,7 @@ public class MonopolyServer implements MessageListener<HostedConnection>, Connec
Serializer.registerClass(Player.class); Serializer.registerClass(Player.class);
Serializer.registerClass(Figure.class); Serializer.registerClass(Figure.class);
Serializer.registerClass(PlayerHandler.class); Serializer.registerClass(PlayerHandler.class);
Serializer.registerClass(DiceResult.class);
} }
private void registerListeners() { private void registerListeners() {
@@ -145,7 +147,6 @@ public class MonopolyServer implements MessageListener<HostedConnection>, Connec
@Override @Override
public void messageReceived(HostedConnection source, Message message) { public void messageReceived(HostedConnection source, Message message) {
System.out.println("Message recieved");
LOGGER.log(Level.INFO, "message received from {0}: {1}", source.getId(), message); //NON-NLS LOGGER.log(Level.INFO, "message received from {0}: {1}", source.getId(), message); //NON-NLS
if (message instanceof ClientMessage clientMessage) if (message instanceof ClientMessage clientMessage)
pendingMessages.add(new ReceivedMessage(clientMessage, source.getId())); pendingMessages.add(new ReceivedMessage(clientMessage, source.getId()));
@@ -155,7 +156,6 @@ public class MonopolyServer implements MessageListener<HostedConnection>, Connec
public void connectionAdded(Server server, HostedConnection hostedConnection) { public void connectionAdded(Server server, HostedConnection hostedConnection) {
LOGGER.log(Level.INFO, "New connection established: {0}", hostedConnection); //NON-NLS LOGGER.log(Level.INFO, "New connection established: {0}", hostedConnection); //NON-NLS
logic.addPlayer(hostedConnection.getId()); logic.addPlayer(hostedConnection.getId());
System.out.println("Spieler verbunden: ID = " + hostedConnection.getId());
} }
@Override @Override