47 Commits

Author SHA1 Message Date
Johannes Schmelz
10e30d9bd9 Merge branch 'main' into 'gui'
# Conflicts:
#   Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/EventCardPopup.java
2024-12-12 16:50:21 +00:00
Johannes Schmelz
5de76f3226 demo 2024-12-12 17:48:24 +01:00
Johannes Schmelz
e2db058fc7 java doc 2024-12-12 17:38:46 +01:00
Johannes Schmelz
7c79bb77e7 Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-12-12 16:13:55 +01:00
Johannes Schmelz
444cf9db4e fixed names in Player Popups 2024-12-12 16:13:50 +01:00
Simon Wilkening
9e199d677e Bahnhöfe --> Tore 2024-12-10 13:46:35 +01:00
Johannes Schmelz
df4a81cbf2 disable snow 2024-12-10 11:23:49 +01:00
Johannes Schmelz
c635df9369 Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-12-10 11:23:10 +01:00
Johannes Schmelz
c6ad605021 basic camera movement 2024-12-10 11:22:21 +01:00
Luca Puderbach
1e20a2ac6e Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-12-10 10:32:08 +01:00
Luca Puderbach
36a9a7addf Karten add 2024-12-10 10:29:51 +01:00
Johannes Schmelz
e1190cd4a2 cleanup 2024-12-10 10:23:33 +01:00
Johannes Schmelz
34ecd2277b cleanup 2024-12-10 10:19:59 +01:00
Johannes Schmelz
5959f36a21 new background 2024-12-10 10:14:06 +01:00
Simon Wilkening
1db2d9ebac Fixed "Spieler" in ...Trade-Popups 2024-12-10 08:27:23 +01:00
Yvonne Schmidt
54bac50a7e Merge remote-tracking branch 'origin/gui' into gui 2024-12-10 07:17:33 +01:00
Yvonne Schmidt
274ed2b25d added new background 2024-12-10 07:17:18 +01:00
Johannes Schmelz
371fa83319 remove deck cards 2024-12-10 06:15:13 +01:00
Simon Wilkening
c1faf91188 Fixed Containers for Buildings 2024-12-10 04:36:55 +01:00
Johannes Schmelz
617d707df8 fixed GateFieldPopUp 2024-12-10 04:07:30 +01:00
Johannes Schmelz
d18cea435c Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-12-10 03:56:01 +01:00
Johannes Schmelz
1543f0dcea more models 2024-12-10 03:55:57 +01:00
Johannes Schmelz
ae181e4eff more models 2024-12-10 03:55:44 +01:00
Johannes Schmelz
fa96324c15 mode models 2024-12-10 03:55:33 +01:00
Johannes Schmelz
9f559fe0d7 more models 2024-12-10 03:55:08 +01:00
Johannes Schmelz
cf6ee535b8 remove old textures 2024-12-10 03:54:56 +01:00
Johannes Schmelz
be89bf1a27 haus models 2024-12-10 03:54:29 +01:00
Yvonne Schmidt
6f2027c2fb added toolbar spacer 2024-12-10 03:45:08 +01:00
Yvonne Schmidt
6e99f17787 adjusted font 2024-12-10 03:40:04 +01:00
Yvonne Schmidt
b7e2e3213a Merge remote-tracking branch 'origin/gui' into gui 2024-12-10 03:27:59 +01:00
Yvonne Schmidt
3ea6452d6d fixed font 2024-12-10 03:27:36 +01:00
Luca Puderbach
fd3c141967 Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-12-10 03:27:06 +01:00
Luca Puderbach
b3d2dfed08 Kamera Update T1 2024-12-10 03:26:55 +01:00
Simon Wilkening
5306208107 Containers PropertyCards 2024-12-10 03:22:26 +01:00
Yvonne Schmidt
2a7cbeed89 fixed bankrupt warning 2024-12-10 03:08:36 +01:00
Yvonne Schmidt
0a34751825 resized startmenu logos 2024-12-10 02:40:32 +01:00
Johannes Schmelz
996bc0118a Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-12-10 02:32:11 +01:00
Johannes Schmelz
bbcb12c131 working tank model 2024-12-10 02:32:07 +01:00
Yvonne Schmidt
1969afc58f Merge remote-tracking branch 'origin/gui' into gui 2024-12-10 02:24:41 +01:00
Yvonne Schmidt
ad0c432102 added greyed button 2024-12-10 02:24:29 +01:00
Johannes Schmelz
315739646c free cam 2024-12-10 01:12:56 +01:00
Luca Puderbach
330e788498 Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-12-10 00:52:41 +01:00
Luca Puderbach
fc5a2809c8 Jägermeister 2024-12-10 00:52:30 +01:00
Luca Puderbach
0acb63adb6 Mac Blocker 2024-12-10 00:48:43 +01:00
Johannes Schmelz
249110f83c Merge remote-tracking branch 'origin/gui' 2024-12-09 14:13:44 +01:00
Johannes Schmelz
a686671c15 Merge branch 'reworkedGui' into 'main'
refactor Worlds and client States

See merge request progproj/gruppen-ht24/Gruppe-02!18
2024-12-08 01:18:35 +00:00
Johannes Schmelz
e102d22f14 refactor Worlds and client States 2024-12-08 01:18:35 +00:00
125 changed files with 1413 additions and 571 deletions

View File

@@ -192,6 +192,11 @@ public class DialogManager {
dialogStack.peek().escape(); dialogStack.peek().escape();
} }
/**
* Updates all dialogs in the dialog stack.
*
* @param delta the time since the last update
*/
public void update(float delta) { public void update(float delta) {
for (Dialog dialog : dialogStack) for (Dialog dialog : dialogStack)
dialog.update(delta); dialog.update(delta);

View File

@@ -1,5 +1,10 @@
package pp.dialog; package pp.dialog;
/** An interface for tagging Dialogs as PopUps for handling in the DialogManager */
public interface PopupDialog { public interface PopupDialog {
/**
* Shows the popup.
*/
void show(); void show();
} }

View File

@@ -405,3 +405,44 @@ selector("button-clear", "pp") { playerColor ->
textHAlignment = HAlignment.Center // Text-Zentrierung textHAlignment = HAlignment.Center // Text-Zentrierung
textVAlignment = VAlignment.Center // Text-Zentrierung textVAlignment = VAlignment.Center // Text-Zentrierung
} }
def enabledCommandToolbar2= new Command<Button>() {
void execute(Button source) {
if (source.isEnabled()){
source.setColor(ColorRGBA.White)
def orangeBackground = new QuadBackgroundComponent(color(1, 0.5, 0, 1)); // Orange background
source.setBackground(orangeBackground);
} else{
source.setColor(ColorRGBA.White)
def grayBackground = new QuadBackgroundComponent(ColorRGBA.Gray); // Gray background
source.setBackground(grayBackground);
}
}
}
def stdButtonCommandsToolbar2 =[
(ButtonAction.Down) : [pressedCommand],
(ButtonAction.Up) : [pressedCommand],
(ButtonAction.Enabled) : [enabledCommandToolbar2],
(ButtonAction.Disabled): [enabledCommandToolbar2]
]
selector("button-toolbar2", "pp") {
def outerBackground = new QuadBackgroundComponent(color(1, 0.5, 0, 1)) // Orange border
def innerBackground = new QuadBackgroundComponent(buttonBgColor) // Inner button background
// Apply the outer border as the main background
background = outerBackground
// Use insets to create a margin/padding effect for the inner background
insets = new Insets3f(3, 3, 3, 3) // Adjust the border thickness
textHAlignment = HAlignment.Center
textVAlignment = VAlignment.Center
buttonCommands = stdButtonCommandsToolbar2
}

View File

@@ -9,32 +9,29 @@ import com.jme3.effect.shapes.EmitterSphereShape;
import com.jme3.light.AmbientLight; import com.jme3.light.AmbientLight;
import com.jme3.light.DirectionalLight; import com.jme3.light.DirectionalLight;
import com.jme3.material.Material; import com.jme3.material.Material;
import com.jme3.material.RenderState.FaceCullMode;
import com.jme3.math.ColorRGBA; import com.jme3.math.ColorRGBA;
import com.jme3.math.FastMath; import com.jme3.math.FastMath;
import com.jme3.math.Quaternion; import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f; import com.jme3.math.Vector3f;
import com.jme3.renderer.Camera; import com.jme3.renderer.queue.RenderQueue;
import com.jme3.renderer.queue.RenderQueue.ShadowMode; import com.jme3.renderer.queue.RenderQueue.ShadowMode;
import com.jme3.scene.Geometry; import com.jme3.scene.Geometry;
import com.jme3.scene.Node; import com.jme3.scene.Node;
import com.jme3.scene.Spatial; import com.jme3.scene.Spatial;
import com.jme3.scene.shape.Box; import com.jme3.scene.shape.Box;
import com.jme3.scene.shape.Cylinder;
import com.jme3.shadow.DirectionalLightShadowRenderer; import com.jme3.shadow.DirectionalLightShadowRenderer;
import com.jme3.shadow.EdgeFilteringMode; import com.jme3.shadow.EdgeFilteringMode;
import com.jme3.texture.Texture; import com.jme3.texture.Texture;
import com.jme3.util.SkyFactory;
import com.jme3.util.TangentBinormalGenerator; import com.jme3.util.TangentBinormalGenerator;
import pp.monopoly.client.gui.BobTheBuilder; import pp.monopoly.client.gui.BobTheBuilder;
import pp.monopoly.client.gui.CameraController;
import pp.monopoly.client.gui.CameraInputHandler;
import pp.monopoly.client.gui.Toolbar; import pp.monopoly.client.gui.Toolbar;
import pp.monopoly.model.Board; import pp.monopoly.model.Board;
import pp.monopoly.client.gui.FigureControl;
import static java.lang.Math.divideExact;
import static pp.util.FloatMath.TWO_PI;
import static pp.util.FloatMath.cos;
import static pp.util.FloatMath.sin;
import static pp.util.FloatMath.sqrt;
/** /**
* Manages the rendering and visual aspects of the sea and sky in the Battleship game. * Manages the rendering and visual aspects of the sea and sky in the Battleship game.
@@ -70,9 +67,18 @@ public class BoardAppState extends MonopolyAppState {
/** /**
* The pop-up manager for displaying messages and notifications. * The pop-up manager for displaying messages and notifications.
*/ */
private PopUpManager popUpManager;; private PopUpManager popUpManager;
/**
* The camera controller for managing the camera's position and orientation.
*/
private CameraController cameraController;
/**
* The input handler for controlling the camera's movement and rotation.
*/
private CameraInputHandler cameraInputHandler;
private Vector3f currentTarget = new Vector3f(0f,0,0f);
/** /**
* Initializes the state by setting up the sky, lights, and other visual components. * Initializes the state by setting up the sky, lights, and other visual components.
@@ -84,10 +90,19 @@ public class BoardAppState extends MonopolyAppState {
@Override @Override
public void initialize(AppStateManager stateManager, Application application) { public void initialize(AppStateManager stateManager, Application application) {
super.initialize(stateManager, application); super.initialize(stateManager, application);
// Initialisiere den CameraController zuerst
cameraController = new CameraController(getApp().getCamera(), getApp());
// Danach den CameraInputHandler mit dem initialisierten CameraController
cameraInputHandler = new CameraInputHandler(cameraController, getApp().getInputManager());
popUpManager = new PopUpManager(getApp()); popUpManager = new PopUpManager(getApp());
viewNode.attachChild(sceneNode); viewNode.attachChild(sceneNode);
setupLights(); setupLights();
setupSky(); // setupSky();
getApp().getViewPort().setBackgroundColor(new com.jme3.math.ColorRGBA(0.5f, 0.7f, 1.0f, 1.0f));
} }
/** /**
@@ -110,30 +125,6 @@ public class BoardAppState extends MonopolyAppState {
} }
getApp().getRootNode().attachChild(viewNode); getApp().getRootNode().attachChild(viewNode);
} }
//TODO remove this only for camera testing
private static final float ABOVE_SEA_LEVEL = 10f;
private static final float INCLINATION = 2.5f;
private float cameraAngle;
/**
* Adjusts the camera position and orientation to create a circular motion around
* the center of the map. This provides a dynamic view of the sea and surrounding environment.
*/
private void adjustCamera() {
final Board board = getGameLogic().getBoard();
final float mx = 0.5f * board.getWidth();
final float my = 0.5f * board.getHeight();
final float radius = 2f * sqrt(mx * mx + my + my);
final float cos = radius * cos(cameraAngle);
final float sin = radius * sin(cameraAngle);
final float x = mx - cos;
final float y = my - sin;
final Camera camera = getApp().getCamera();
camera.setLocation(new Vector3f(30,20,0));
camera.lookAt(new Vector3f(getCurrentTarget()),
Vector3f.UNIT_Y);
camera.update();
}
@@ -150,18 +141,7 @@ public class BoardAppState extends MonopolyAppState {
} }
} }
/**
* Updates the state each frame, moving the camera to simulate it circling around the map.
*
* @param tpf the time per frame (seconds)
*/
@Override
public void update(float tpf) {
super.update(tpf);
//TODO remove this only for camera testing
cameraAngle += TWO_PI * 0.05f * tpf;
adjustCamera();
}
/** /**
* Sets up the lighting for the scene, including directional and ambient lights. * Sets up the lighting for the scene, including directional and ambient lights.
@@ -190,17 +170,79 @@ public class BoardAppState extends MonopolyAppState {
*/ */
private void setupSky() { private void setupSky() {
final AssetManager assetManager = getApp().getAssetManager(); final AssetManager assetManager = getApp().getAssetManager();
final Texture west = assetManager.loadTexture("Pictures/Backdrop/west.jpg"); //NON-NLS
final Texture east = assetManager.loadTexture("Pictures/Backdrop/ost.jpg"); //NON-NLS // Create a cylinder for the sky
final Texture north = assetManager.loadTexture("Pictures/Backdrop/nord.jpg"); //NON-NLS float radius = 500f; // Adjust radius as needed
final Texture south = assetManager.loadTexture("Pictures/Backdrop/sued.jpg"); //NON-NLS float height = 200f; // Height of the cylinder
final Texture up = assetManager.loadTexture("Pictures/Backdrop/sued.jpg"); //NON-NLS int radialSamples = 64; // Number of radial segments for smoothness
final Texture down = assetManager.loadTexture("Pictures/Backdrop/sued.jpg"); //NON-NLS int axisSamples = 2; // No vertical divisions (flat vertical surface)
final Spatial sky = SkyFactory.createSky(assetManager, west, east, north, south, up, down);
// sky.rotate(0, PI, 0); Cylinder skyCylinder = new Cylinder(axisSamples, radialSamples, radius, height, true);
viewNode.attachChild(sky);
// Create a geometry for the cylinder
Geometry skyGeometry = new Geometry("CylinderSky", skyCylinder);
// Load the cylindrical texture
Texture cylinderTexture = assetManager.loadTexture("Textures/CylinderMap.jpg");
// Create a material and apply the texture
Material skyMaterial = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
skyMaterial.setTexture("ColorMap", cylinderTexture);
skyMaterial.getAdditionalRenderState().setFaceCullMode(FaceCullMode.Off); // Render inside of the cylinder
// Assign material to the geometry
skyGeometry.setMaterial(skyMaterial);
skyGeometry.rotate(-FastMath.HALF_PI, 0, 0); // Rotate 90° along the Y-axis
// Position and attach the cylinder to the scene
skyGeometry.setQueueBucket(RenderQueue.Bucket.Sky); // Ensure it's rendered in the background
skyGeometry.setCullHint(Spatial.CullHint.Never); // Always render the sky
viewNode.attachChild(skyGeometry);
addCylinderCaps();
} }
/**
* Adds top and bottom caps to the cylinder sky.
*/
private void addCylinderCaps() {
final AssetManager assetManager = getApp().getAssetManager();
float radius = 500f; // Match the cylinder's radius
float height = 225f; // Match the cylinder's height
int radialSamples = 64; // Match the cylinder's radial samples
// Bottom Cap
Cylinder bottomCap = new Cylinder(2, radialSamples, radius, 0.01f, true, false); // Thin bottom cap
Geometry bottomGeometry = new Geometry("BottomCap", bottomCap);
bottomGeometry.setLocalTranslation(0, -height / 2, 0); // Position at the bottom
bottomGeometry.rotate(FastMath.HALF_PI, 0, 0); // Rotate to make it horizontal
Material bottomMaterial = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
bottomMaterial.setTexture("ColorMap", assetManager.loadTexture("Textures/grass.jpg")); // Bottom texture
bottomMaterial.getAdditionalRenderState().setFaceCullMode(FaceCullMode.Off); // Render both sides
bottomGeometry.setMaterial(bottomMaterial);
bottomGeometry.setQueueBucket(RenderQueue.Bucket.Sky);
bottomGeometry.setCullHint(Spatial.CullHint.Never);
// Top Cap
Cylinder topCap = new Cylinder(2, radialSamples, radius, 0.01f, true, false); // Thin top cap
Geometry topGeometry = new Geometry("TopCap", topCap);
topGeometry.setLocalTranslation(0, height / 2, 0); // Position at the top
topGeometry.rotate(FastMath.HALF_PI, 0, 0); // Rotate to make it horizontal
Material topMaterial = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
topMaterial.setTexture("ColorMap", assetManager.loadTexture("Textures/Top.png")); // Top texture
topMaterial.getAdditionalRenderState().setFaceCullMode(FaceCullMode.Off); // Render both sides
topGeometry.setMaterial(topMaterial);
topGeometry.setQueueBucket(RenderQueue.Bucket.Sky);
topGeometry.setCullHint(Spatial.CullHint.Never);
// Attach caps to the view node
viewNode.attachChild(bottomGeometry);
viewNode.attachChild(topGeometry);
}
/** /**
* Sets up the sea surface in the scene. This includes creating the sea mesh, * Sets up the sea surface in the scene. This includes creating the sea mesh,
* applying textures, and enabling shadows. * applying textures, and enabling shadows.
@@ -216,7 +258,7 @@ public class BoardAppState extends MonopolyAppState {
rotation.fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_Y); rotation.fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_Y);
seaGeo.setLocalRotation(rotation); seaGeo.setLocalRotation(rotation);
final Material seaMat = new Material(getApp().getAssetManager(), "Common/MatDefs/Light/Lighting.j3md"); final Material seaMat = new Material(getApp().getAssetManager(), "Common/MatDefs/Light/Lighting.j3md");
Texture texture = getApp().getAssetManager().loadTexture("Pictures/board2.png"); Texture texture = getApp().getAssetManager().loadTexture(BoardTexture);
seaMat.setTexture("DiffuseMap", texture); seaMat.setTexture("DiffuseMap", texture);
seaGeo.setMaterial(seaMat); seaGeo.setMaterial(seaMat);
seaGeo.setShadowMode(ShadowMode.CastAndReceive); seaGeo.setShadowMode(ShadowMode.CastAndReceive);
@@ -229,27 +271,54 @@ public class BoardAppState extends MonopolyAppState {
addSnowEffect(sceneNode); addSnowEffect(sceneNode);
} }
/**
* Creates a card deck with six event and six community cards.
* @return the node containing the card deck
*/
private Node createCardDeck() { private Node createCardDeck() {
Node cardDeck = new Node("cardDeck"); Node cardDeck = new Node("cardDeck");
Spatial card = getApp().getAssetManager().loadModel("models/Kartendecks/Ereigniskarten_Deck.j3o");
card.setLocalTranslation(5.5f, 0, 2.7f);
card.setLocalScale(4.1f);
card.setLocalRotation(new Quaternion().fromAngleAxis(FastMath.QUARTER_PI, Vector3f.UNIT_Y));
Spatial card2 = getApp().getAssetManager().loadModel("models/Kartendecks/Gemeinschaftskarten_Deck.j3o"); // Ereigniskarten
card2.setLocalTranslation(-1.4f, 0, -3.8f); Vector3f basePosition1 = new Vector3f(3.1f, 0.4f, 3.8f); // Basisposition für Ereigniskarten
card2.setLocalScale(4.1f); float baseRotation1 = -60; // Basisrotation in Grad
card2.setLocalRotation(new Quaternion().fromAngleAxis(FastMath.QUARTER_PI , Vector3f.UNIT_Y)); for (int i = 0; i < 6; i++) {
Box box = new Box(1.2f, 0.05f, 1.8f); // Sehr flaches Rechteck
Geometry flatCard = new Geometry("Ereigniskarten_" + i, box);
Material mat = new Material(getApp().getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
mat.setTexture("ColorMap", getApp().getAssetManager().loadTexture("Textures/Ereigniskarten.png"));
flatCard.setMaterial(mat);
// Position und Rotation für die Karte
flatCard.setLocalTranslation(basePosition1.x, basePosition1.y - (i * 0.08f), basePosition1.z);
flatCard.setLocalRotation(new Quaternion().fromAngleAxis(FastMath.DEG_TO_RAD * (baseRotation1 - (i * 5)), Vector3f.UNIT_Y));
cardDeck.attachChild(flatCard);
}
// Gemeinschaftskarten
Vector3f basePosition2 = new Vector3f(-3.3f, 0.4f, -3.8f); // Basisposition für Gemeinschaftskarten
float baseRotation2 = -220; // Basisrotation in Grad
for (int i = 0; i < 6; i++) {
Box box = new Box(1.2f, 0.04f, 1.8f); // Sehr flaches Rechteck
Geometry flatCard = new Geometry("Gemeinschaftskarten_" + i, box);
Material mat = new Material(getApp().getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
mat.setTexture("ColorMap", getApp().getAssetManager().loadTexture("Textures/Gemeinschaftskarten.png"));
flatCard.setMaterial(mat);
// Position und Rotation für die Karte
flatCard.setLocalTranslation(basePosition2.x, basePosition2.y - (i * 0.08f), basePosition2.z);
flatCard.setLocalRotation(new Quaternion().fromAngleAxis(FastMath.DEG_TO_RAD * (baseRotation2 - (i * 5)), Vector3f.UNIT_Y));
cardDeck.attachChild(flatCard);
}
cardDeck.attachChild(card);
cardDeck.attachChild(card2);
return cardDeck; return cardDeck;
} }
public Vector3f getCurrentTarget(){ /**
return currentTarget; * Adds a snow effect to the scene by creating a particle emitter with snowflakes.
} * @param parentNode the parent node to attach the snow effect to
*/
private void addSnowEffect(Node parentNode) { private void addSnowEffect(Node parentNode) {
// ParticleEmitter für Schnee // ParticleEmitter für Schnee
ParticleEmitter snowEmitter = new ParticleEmitter("Snow", ParticleMesh.Type.Triangle, 5000); ParticleEmitter snowEmitter = new ParticleEmitter("Snow", ParticleMesh.Type.Triangle, 5000);
@@ -278,4 +347,16 @@ public class BoardAppState extends MonopolyAppState {
// Emitter zur Szene hinzufügen // Emitter zur Szene hinzufügen
parentNode.attachChild(snowEmitter); parentNode.attachChild(snowEmitter);
} }
/**
* Updates the state by moving the camera and updating the visual elements.
*
* @param tpf the time per frame
*/
@Override
public void update(float tpf) {
super.update(tpf);
cameraController.update(tpf);
}
} }

View File

@@ -48,16 +48,27 @@ public class GameSound extends AbstractAppState implements GameEventListener {
*/ */
private static final String VOLUME_PREF = "volume"; //NON-NLS private static final String VOLUME_PREF = "volume"; //NON-NLS
/** The sound effect for passing the start field. */
private AudioNode passStartSound; private AudioNode passStartSound;
/** The sound effect for drawing an event card. */
private AudioNode eventCardSound; private AudioNode eventCardSound;
/** The sound effect for going to the gulag. */
private AudioNode gulagSound; private AudioNode gulagSound;
/** The sound effect for rolling the dice. */
private AudioNode diceRollSound; private AudioNode diceRollSound;
/** The sound effect for collecting money. */
private AudioNode moneyCollectSound; private AudioNode moneyCollectSound;
/** The sound effect for losing money. */
private AudioNode moneyLostSound; private AudioNode moneyLostSound;
/** The sound effect for accepting a trade. */
private AudioNode tradeAcceptedSound; private AudioNode tradeAcceptedSound;
/** The sound effect for rejecting a trade. */
private AudioNode tradeRejectedSound; private AudioNode tradeRejectedSound;
/** The sound effect for winning the game. */
private AudioNode winnerSound; private AudioNode winnerSound;
/** The sound effect for loosing the game. */
private AudioNode looserSound; private AudioNode looserSound;
/** The sound effect for pressing a button. */
private AudioNode buttonSound; private AudioNode buttonSound;
/** /**

View File

@@ -172,12 +172,19 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga
private AppSettings makeSettings() { private AppSettings makeSettings() {
final AppSettings settings = new AppSettings(true); final AppSettings settings = new AppSettings(true);
settings.setTitle(lookup("monopoly.name")); settings.setTitle(lookup("monopoly.name"));
try {
settings.setIcons(new Image[]{ImageIO.read(new File("src/main/resources/icons/Uniman.png"))}); // Set the icon for the application window
}
catch (IOException e) { // try {
LOGGER.log(Level.ERROR, e.getMessage()); // // Prüfen, ob das Betriebssystem ein Mac-System ist
} // if (!System.getProperty("os.name").toLowerCase().contains("mac")) {
// settings.setIcons(new Image[]{ImageIO.read(new File("src/main/resources/icons/Uniman.png"))});
// } else {
// LOGGER.log(Level.INFO, "Icon setting skipped on macOS due to system restrictions.");
// }
// } catch (IOException e) {
// LOGGER.log(Level.ERROR, e.getMessage());
// }
settings.setResolution(config.getResolutionWidth(), config.getResolutionHeight()); settings.setResolution(config.getResolutionWidth(), config.getResolutionHeight());
settings.setFullscreen(config.fullScreen()); settings.setFullscreen(config.fullScreen());
settings.setUseRetinaFrameBuffer(config.useRetinaFrameBuffer()); settings.setUseRetinaFrameBuffer(config.useRetinaFrameBuffer());
@@ -289,6 +296,8 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga
stateManager.attach(stats); stateManager.attach(stats);
} }
flyCam.setEnabled(false); flyCam.setEnabled(false);
flyCam.setMoveSpeed(4f); // Setzt die Bewegungsgeschwindigkeit der Kamera (Standardwert ist 1f)
stateManager.detach(stateManager.getState(StatsAppState.class)); stateManager.detach(stateManager.getState(StatsAppState.class));
stateManager.detach(stateManager.getState(DebugKeysAppState.class)); stateManager.detach(stateManager.getState(DebugKeysAppState.class));

View File

@@ -27,15 +27,32 @@ import pp.monopoly.notification.EventCardEvent;
import pp.monopoly.notification.GameEventListener; import pp.monopoly.notification.GameEventListener;
import pp.monopoly.notification.PopUpEvent; import pp.monopoly.notification.PopUpEvent;
/**
* This class is responsible for managing the popups that are shown to the user.
* It listens for events that require a popup to be shown and then shows the
* appropriate popup.
*/
public class PopUpManager implements GameEventListener { public class PopUpManager implements GameEventListener {
/** The MonopolyApp instance */
private final MonopolyApp app; private final MonopolyApp app;
/**
* Constructor for the PopUpManager.
*
* @param app The MonopolyApp instance
*/
public PopUpManager(MonopolyApp app) { public PopUpManager(MonopolyApp app) {
this.app = app; this.app = app;
app.getGameLogic().addListener(this); app.getGameLogic().addListener(this);
} }
/**
* This method is called when a PopUpEvent is received.
* It checks the message of the event and shows the appropriate popup.
*
* @param event The PopUpEvent
*/
@Override @Override
public void receivedEvent(PopUpEvent event) { public void receivedEvent(PopUpEvent event) {
if (event.msg().equals("Buy")) { if (event.msg().equals("Buy")) {
@@ -84,6 +101,12 @@ public class PopUpManager implements GameEventListener {
} }
} }
/**
* This method is called when an EventCardEvent is received.
* It shows the EventCardPopup.
*
* @param event The EventCardEvent
*/
@Override @Override
public void receivedEvent(EventCardEvent event) { public void receivedEvent(EventCardEvent event) {
Timer timer = new Timer(); Timer timer = new Timer();

View File

@@ -17,18 +17,35 @@ import pp.monopoly.model.Figure;
import pp.monopoly.model.Hotel; import pp.monopoly.model.Hotel;
import pp.monopoly.model.House; import pp.monopoly.model.House;
import pp.monopoly.model.Item; import pp.monopoly.model.Item;
import pp.monopoly.notification.UpdatePlayerView;
/**
* The {@code BobTheBuilder} class is responsible for synchronizing the graphical
* representation of the figures and buildings on the board with the underlying data model.
* It extends the {@link GameBoardSynchronizer} to provide specific synchronization
* logic for the board.
*/
public class BobTheBuilder extends GameBoardSynchronizer { public class BobTheBuilder extends GameBoardSynchronizer {
/** The String representing the path to the unshaded material*/
private static final String UNSHADED = "Common/MatDefs/Misc/Unshaded.j3md"; //NON-NLS private static final String UNSHADED = "Common/MatDefs/Misc/Unshaded.j3md"; //NON-NLS
/** The String representing the color parameter in the material*/
private static final String COLOR = "Color"; //NON-NLS private static final String COLOR = "Color"; //NON-NLS
/** The String representing the figure node*/
private static final String FIGURE = "figure"; //NON-NLS private static final String FIGURE = "figure"; //NON-NLS
/** The String representing the house node*/
private static final String HOUSE = "house"; //NON-NLS private static final String HOUSE = "house"; //NON-NLS
/** The String representing the hotel node*/
private static final String HOTEL = "hotel"; //NON-NLS private static final String HOTEL = "hotel"; //NON-NLS
/** The {@link MonopolyApp} instance*/
private final MonopolyApp app; private final MonopolyApp app;
/**
* Creates a new {@code BobTheBuilder} instance with the specified {@link MonopolyApp} and root node.
*
* @param app the {@link MonopolyApp} instance
* @param root the root node of the scene graph
*/
public BobTheBuilder(MonopolyApp app, Node root) { public BobTheBuilder(MonopolyApp app, Node root) {
super(app.getGameLogic().getBoard(), root); super(app.getGameLogic().getBoard(), root);
this.app = app; this.app = app;
@@ -83,16 +100,33 @@ public class BobTheBuilder extends GameBoardSynchronizer {
return node; return node;
} }
/**
* Creates a new spatial to represent the specified figure.
*
* @param figure the figure to be represented
* @return the geometry representing the figure
*/
private Spatial createFigure(Figure figure) { private Spatial createFigure(Figure figure) {
// Lade das Modell Spatial model;
Spatial model = app.getAssetManager().loadModel("models/" + "Spielfiguren/" + figure.getType() + "/" + figure.getType() + ".j3o");
// Skaliere und positioniere das Modell try {
model.scale(0.5f); // Lade das Modell
model = app.getAssetManager().loadModel("models/" + "Spielfiguren/" + figure.getType() + "/" + figure.getType() + ".j3o");
// Skaliere und positioniere das Modell
model.scale(0.5f);
} catch (Exception e) {
model = createBox(figure);
}
return model; return model;
} }
/**
* Creates a new spatial to represent the specified hotel.
* @param hotel the hotel to be represented
* @return the geometry representing the hotel
*/
private Spatial createHotel(Hotel hotel) { private Spatial createHotel(Hotel hotel) {
Spatial model = app.getAssetManager().loadModel("models/Hotel/Hotel.j3o"); Spatial model = app.getAssetManager().loadModel("models/Hotel/Hotel.j3o");
model.scale(0.2f); model.scale(0.2f);
@@ -100,7 +134,11 @@ public class BobTheBuilder extends GameBoardSynchronizer {
return model; return model;
} }
/**
* Creates a new spatial to represent the specified house.
* @param house the house to be represented
* @return the geometry representing the house
*/
private Spatial createHouse(House house) { private Spatial createHouse(House house) {
Spatial model = app.getAssetManager().loadModel("models/Haus/"+house.getStage()+"Haus.j3o"); Spatial model = app.getAssetManager().loadModel("models/Haus/"+house.getStage()+"Haus.j3o");
model.scale(0.5f); model.scale(0.5f);

View File

@@ -191,9 +191,6 @@ public class BuildingAdminMenu extends Dialog {
app.getGuiNode().attachChild(background); app.getGuiNode().attachChild(background);
} }
/**
* Closes the building administration menu and detaches its elements from the GUI.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(mainContainer); app.getGuiNode().detachChild(mainContainer);
@@ -201,21 +198,8 @@ public class BuildingAdminMenu extends Dialog {
super.close(); super.close();
} }
/**
* Opens the settings menu when the escape key is pressed.
*/
@Override @Override
public void escape() { public void escape() {
new SettingsMenu(app).open(); new SettingsMenu(app).open();
} }
/**
* Periodic updates for the menu, if required.
*
* @param delta Time since the last update in seconds.
*/
@Override
public void update(float delta) {
// Periodic updates if necessary
}
} }

View File

@@ -3,64 +3,149 @@ package pp.monopoly.client.gui;
import com.jme3.math.Vector3f; import com.jme3.math.Vector3f;
import com.jme3.renderer.Camera; import com.jme3.renderer.Camera;
import pp.monopoly.client.MonopolyApp;
import pp.monopoly.game.server.PlayerHandler;
import pp.monopoly.notification.GameEventListener;
import pp.monopoly.notification.UpdatePlayerView;
/** /**
* Controls the movement of the camera within the scene. * Represents a camera controller for the Monopoly application.
*/ */
public class CameraController { public class CameraController implements GameEventListener{
private final Camera camera;
private final float height = 25; // Height of the camera above the game board
/** /**
* Constructor for the CameraController. * Enum representing the camera mode for the CameraController.
*
* @param camera The camera to be controlled
*/ */
public CameraController(Camera camera) { public enum CameraMode {
FOCUS_CURRENT_PLAYER,
FOCUS_SELF,
FREECAM
}
/** The camera to control */
private final Camera camera;
/** The current camera mode */
private CameraMode currentMode;
/** The player handler instance */
private PlayerHandler playerHandler;
/** The {@link MonopolyApp} instance*/
private final MonopolyApp app;
/**
* Constructs a new CameraController instance.
* @param camera The camera to control
* @param app The MonopolyApp instance
*/
public CameraController(Camera camera, MonopolyApp app) {
this.camera = camera; this.camera = camera;
setPosition(0); this.playerHandler = app.getGameLogic().getPlayerHandler();
camera.lookAt(Vector3f.ZERO, Vector3f.UNIT_Y); this.app = app;
app.getGameLogic().addListener(this);
setMode(CameraMode.FOCUS_SELF); // Initialize the camera mode
} }
/** /**
* Updates the camera's position and orientation. * Sets the camera mode to the specified mode.
* @param mode The camera mode to set
*/
public void setMode(CameraMode mode) {
this.currentMode = mode;
}
/**
* Updates the camera behavior based on the current mode and the time-per-frame (tpf).
* <p>
* This method checks the current mode of the camera and updates its position or behavior accordingly.
* Supported modes include:
* <ul>
* <li>FOCUS_CURRENT_PLAYER: Updates the camera position to focus on the current player.</li>
* <li>FOCUS_SELF: Updates the camera position to focus on the self (the object controlled by the player).</li>
* <li>FREECAM: Leaves the camera position unchanged, allowing free movement.</li>
* </ul>
* *
* @param tpf Time per frame * @param tpf The time-per-frame value, typically provided by the game engine,
* which represents the elapsed time since the last frame.
*/ */
public void update(float tpf) { public void update(float tpf) {
camera.lookAt(Vector3f.ZERO, Vector3f.UNIT_Y);
switch (currentMode) {
case FOCUS_CURRENT_PLAYER:
updatePosition();
break;
case FOCUS_SELF:
updatePosition();
break;
case FREECAM:
break;
default:
break;
}
} }
/** /**
* Sets the camera's position based on the field ID. * Updates the camera position depending on the current mode.
*
* @param fieldID The ID of the field to which the camera should move
*/ */
public void setPosition(int fieldID) { public void updatePosition() {
camera.setLocation(fieldIdToVector(fieldID)); Vector3f newPosition = getPos();
camera.setLocation(newPosition);
camera.lookAt(app.getGameLogic().getBoard().getFigure(app.getId()).getPos(), Vector3f.UNIT_Y);
camera.update();
} }
/** /**
* Sets the camera's position using specific coordinates. * Returns the position for the camera depending on the current mode.
* * @return The position for the camera
* @param x The X-coordinate of the new camera position
* @param y The Y-coordinate of the new camera position
*/ */
public void setPosition(float x, float y) { private Vector3f getPos() {
camera.setLocation(new Vector3f(x, height, y)); Vector3f pos = new Vector3f();
switch (currentMode) {
case FOCUS_CURRENT_PLAYER:
pos = app.getGameLogic().getBoard().getFigure(playerHandler.getPlayerById(0).getId()).getPos();
case FOCUS_SELF:
pos = app.getGameLogic().getBoard().getFigure(app.getId()).getPos();
case FREECAM:
break;
default:
break;
}
Vector3f offset = getOffset();
pos = new Vector3f(pos.getX() + offset.getX(), pos.getY() + offset.getY(), pos.getZ() + offset.getZ());
return pos;
} }
/** /**
* Maps a field ID to its corresponding position in the game world. * Calculates the offset for the camera depending on the field the player is on.
* * @return The offset for the camera
* @param fieldID The ID of the field
* @return The position of the field as a {@link Vector3f}
* @throws IllegalArgumentException If the field ID is invalid
*/ */
private Vector3f fieldIdToVector(int fieldID) { private Vector3f getOffset() {
if (fieldID <= 10) return new Vector3f(30, height, 0); Vector3f offset = new Vector3f();
if (fieldID <= 20) return new Vector3f(0, height, 30);
if (fieldID <= 30) return new Vector3f(-30, height, 0); int fieldId = playerHandler.getPlayerById( (currentMode == CameraMode.FOCUS_SELF ? app.getId() : playerHandler.getPlayerAtIndex(0).getId()) ).getFieldID();
if (fieldID <= 40) return new Vector3f(0, height, -30); // System.out.println();
else throw new IllegalArgumentException(); if(fieldId < 10) {
offset = new Vector3f(0, 15, -20);
} else if(fieldId < 20) {
offset = new Vector3f(20 , 15, 0);
} else if(fieldId < 30) {
offset = new Vector3f(0, 15, 20 );
} else {
offset = new Vector3f(-20, 15, 0);
}
return offset;
}
@Override
public void receivedEvent(UpdatePlayerView event) {
playerHandler = app.getGameLogic().getPlayerHandler();
} }
} }

View File

@@ -1,60 +1,44 @@
//package pp.monopoly.client.gui; package pp.monopoly.client.gui;
//
//import com.jme3.input.InputManager; import com.jme3.input.InputManager;
//import com.jme3.input.KeyInput; import com.jme3.input.KeyInput;
//import com.jme3.input.controls.ActionListener; import com.jme3.input.controls.ActionListener;
//import com.jme3.input.controls.KeyTrigger; import com.jme3.input.controls.KeyTrigger;
//
///** /**
// * Handhabt die Eingaben für die Kamera. * Class to handle the input for the camera.
// */ */
//public class CameraInputHandler { public class CameraInputHandler {
//
// private CameraController cameraController; // Kamera-Controller /**The camera controller */
// private CameraController cameraController;
// /**
// * Konstruktor für den CameraInputHandler. /**
// * * Constructor for the CameraInputHandler.
// * @param cameraController Der Kamera-Controller, der gesteuert werden soll. * @param cameraController The camera controller.
// * @param inputManager Der InputManager, um Eingaben zu registrieren. * @param inputManager The input manager.
// */ */
// public CameraInputHandler(CameraController cameraController, InputManager inputManager) { public CameraInputHandler(CameraController cameraController, InputManager inputManager) {
// if (cameraController == null || inputManager == null) { this.cameraController = cameraController;
// throw new IllegalArgumentException("CameraController und InputManager dürfen nicht null sein");
// } // Tasten für die verschiedenen Kameramodi registrieren
// this.cameraController = cameraController; inputManager.addMapping("FocusCurrentPlayer", new KeyTrigger(KeyInput.KEY_1));
// inputManager.addMapping("FocusSelf", new KeyTrigger(KeyInput.KEY_2));
// // Mappings für Kamerasteuerung inputManager.addMapping("FreeCam", new KeyTrigger(KeyInput.KEY_3));
// inputManager.addMapping("FocusCurrentPlayer", new KeyTrigger(KeyInput.KEY_1)); // Modus 1
// inputManager.addMapping("FocusSelf", new KeyTrigger(KeyInput.KEY_2)); // Modus 2 inputManager.addListener(actionListener, "FocusCurrentPlayer", "FocusSelf", "FreeCam");
// inputManager.addMapping("FreeCam", new KeyTrigger(KeyInput.KEY_3)); // Modus 3 }
//
// // Listener für die Kameramodi /**
// inputManager.addListener(actionListener, "FocusCurrentPlayer", "FocusSelf", "FreeCam"); * ActionListener for the camera.
// } */
// private final ActionListener actionListener = (name, isPressed, tpf) -> {
// /** if (!isPressed) return;
// * ActionListener für die Kamerasteuerung.
// */ switch (name) {
// private final ActionListener actionListener = (name, isPressed, tpf) -> { case "FocusCurrentPlayer" -> cameraController.setMode(CameraController.CameraMode.FOCUS_CURRENT_PLAYER);
// if (!isPressed) return; case "FocusSelf" -> cameraController.setMode(CameraController.CameraMode.FOCUS_SELF);
// case "FreeCam" -> cameraController.setMode(CameraController.CameraMode.FREECAM);
// // Umschalten der Kamera-Modi basierend auf der Eingabe }
// switch (name) { };
// case "FocusCurrentPlayer" -> { }
// cameraController.setMode(CameraController.CameraMode.FOCUS_CURRENT_PLAYER);
// System.out.println("Kameramodus: Fokus auf aktuellen Spieler");
// }
// case "FocusSelf" -> {
// cameraController.setMode(CameraController.CameraMode.FOCUS_SELF);
// System.out.println("Kameramodus: Fokus auf eigene Figur");
// }
// case "FreeCam" -> {
// cameraController.setMode(CameraController.CameraMode.FREECAM);
// System.out.println("Kameramodus: Freie Kamera");
// }
// default -> System.err.println("Unbekannter Kameramodus: " + name);
// }
// };
//}
//

View File

@@ -22,21 +22,34 @@ import pp.monopoly.message.client.ViewAssetsRequest;
import pp.monopoly.model.TradeHandler; import pp.monopoly.model.TradeHandler;
import pp.monopoly.notification.Sound; import pp.monopoly.notification.Sound;
/**
* Dialog for choosing a trade partner.
*/
public class ChoosePartner extends Dialog { public class ChoosePartner extends Dialog {
/** The {@link MonopolyApp} instance*/
private final MonopolyApp app; private final MonopolyApp app;
/** Selector for selecting the player */
private Selector<String> playerSelector; private Selector<String> playerSelector;
/** Button for cancel*/
private final Button cancelButton = new Button("Abbrechen"); private final Button cancelButton = new Button("Abbrechen");
/** Button for confirm*/
private final Button confirmButton = new Button("Bestätigen"); private final Button confirmButton = new Button("Bestätigen");
/** Main container for the UI components */
private final Container mainContainer; private final Container mainContainer;
/** Container for the lower left menu */
private Container lowerLeftMenu; private Container lowerLeftMenu;
/** Container for the lower right menu */
private Container lowerRightMenu; private Container lowerRightMenu;
/** The background image */
private Geometry background; private Geometry background;
/** The trade handler */
private TradeHandler tradeHandler; private TradeHandler tradeHandler;
private VersionedReference<Set<Integer>> selectionRef; // Reference to track selector changes /** Reference to track selector changes */
private String lastSelected = ""; // To keep track of the last selected value private VersionedReference<Set<Integer>> selectionRef;
/** The last selected value */
QuadBackgroundComponent translucentWhiteBackground = private String lastSelected = "";
new QuadBackgroundComponent(new ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f)); /** The translucent white background */
private QuadBackgroundComponent translucentWhiteBackground = new QuadBackgroundComponent(new ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f));
/** /**
* Constructs the ChoosePartner dialog. * Constructs the ChoosePartner dialog.
@@ -169,9 +182,6 @@ public class ChoosePartner extends Dialog {
app.getGuiNode().attachChild(background); app.getGuiNode().attachChild(background);
} }
/**
* Handles the escape action for the dialog.
*/
@Override @Override
public void escape() { public void escape() {
new SettingsMenu(app).open(); new SettingsMenu(app).open();

View File

@@ -38,18 +38,31 @@ import pp.dialog.DialogBuilder;
* Allows users to specify the host and port for connecting to a game server. * Allows users to specify the host and port for connecting to a game server.
*/ */
public class CreateGameMenu extends Dialog { public class CreateGameMenu extends Dialog {
/** The Logger for this class */
private static final Logger LOGGER = System.getLogger(CreateGameMenu.class.getName()); private static final Logger LOGGER = System.getLogger(CreateGameMenu.class.getName());
/** A string represing the localhost default */
private static final String LOCALHOST = "localhost"; //NON-NLS private static final String LOCALHOST = "localhost"; //NON-NLS
/** A string representing the default port number */
private static final String DEFAULT_PORT = "42069"; //NON-NLS private static final String DEFAULT_PORT = "42069"; //NON-NLS
/** The NetworkSupport instance to be used for network operations */
private final NetworkSupport network; private final NetworkSupport network;
/** The text field for the host name */
private final TextField host = new TextField(LOCALHOST); private final TextField host = new TextField(LOCALHOST);
/** The text field for the port number */
private final TextField port = new TextField(DEFAULT_PORT); private final TextField port = new TextField(DEFAULT_PORT);
/** The button for starting the server */
private final Button serverButton = new Button("Selber hosten"); private final Button serverButton = new Button("Selber hosten");
/** The button for canceling the connection */
private final Button cancelButton = new Button("Abbrechen"); private final Button cancelButton = new Button("Abbrechen");
/** The button for joining a game */
private final Button joinButton = new Button("Beitreten"); private final Button joinButton = new Button("Beitreten");
/** The hostname of the server */
private String hostname; private String hostname;
/** The port number of the server */
private int portNumber; private int portNumber;
/** The future representing the connection to the server */
private Future<Object> connectionFuture; private Future<Object> connectionFuture;
/** The dialog for indicating that the connection is in progress */
private Dialog progressDialog; private Dialog progressDialog;
/** /**

View File

@@ -9,31 +9,49 @@ import com.jme3.scene.Node;
import com.jme3.scene.control.AbstractControl; import com.jme3.scene.control.AbstractControl;
import pp.monopoly.client.MonopolyApp; import pp.monopoly.client.MonopolyApp;
import pp.monopoly.game.client.ClientGameLogic;
import pp.monopoly.model.Figure; import pp.monopoly.model.Figure;
import pp.monopoly.notification.GameEventListener; import pp.monopoly.notification.GameEventListener;
import pp.monopoly.notification.UpdatePlayerView; import pp.monopoly.notification.UpdatePlayerView;
// import java.lang.System.Logger; import java.lang.System.Logger;
// import java.lang.System.Logger.Level; import java.lang.System.Logger.Level;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.Queue; import java.util.Queue;
/**
* Control class for the figure objects.
*
* Handles the movement of the figure along a path.
*
*/
public class FigureControl extends AbstractControl implements GameEventListener { public class FigureControl extends AbstractControl implements GameEventListener {
/** The Logger for this class */
// // // private static final Logger LOGGER = System.getLogger(FigureControl.class.getName()); private static final Logger LOGGER = System.getLogger(FigureControl.class.getName());
/** The Figure object to control */
private final Figure figure; private final Figure figure;
/** The spatial object of the figure*/
private final Node spatial; private final Node spatial;
/** The MonopolyApp instance */
private final MonopolyApp app; private final MonopolyApp app;
private Queue<Vector3f> path; // Path to follow /** The path to follow */
private Queue<Vector3f> path;
/** The current target position */
private Vector3f currentTarget; private Vector3f currentTarget;
private float animationTime = 0f; // Time elapsed for the current movement /** The time elapsed for the current movement */
private final float durationPerField = 0.5f; // Time to move between fields private float animationTime = 0f;
private float delayTime = 3f; // Verzögerung in Sekunden /** The duration per field */
private float delayElapsed = 0f; // Zeit, die seit dem Start der Verzögerung vergangen ist private final float durationPerField = 0.5f;
/** The delay time */
private float delayTime = 3f;
/** The delay elapsed time */
private float delayElapsed = 0f;
/**
* Constructor for the FigureControl class
* @param spatial The spatial object of the figure
* @param figure The figure object
* @param app The MonopolyApp object
*/
public FigureControl(Node spatial, Figure figure, MonopolyApp app) { public FigureControl(Node spatial, Figure figure, MonopolyApp app) {
super(); super();
this.figure = figure; this.figure = figure;
@@ -43,6 +61,14 @@ public class FigureControl extends AbstractControl implements GameEventListener
app.getGameLogic().addListener(this); app.getGameLogic().addListener(this);
} }
/**
* Updates the figure's movement along a path.
*
* Handles movement delays, rotates at specific fields (0, 10, 20, 30),
* and moves the figure with a hop effect toward the next target.
*
* @param tpf Time-per-frame since the last update.
*/
@Override @Override
protected void controlUpdate(float tpf) { protected void controlUpdate(float tpf) {
if (delayTime > 0) { if (delayTime > 0) {
@@ -61,7 +87,6 @@ public class FigureControl extends AbstractControl implements GameEventListener
// Prüfe, ob eine Drehung erforderlich ist (Felder 0, 10, 20, 30) // Prüfe, ob eine Drehung erforderlich ist (Felder 0, 10, 20, 30)
int currentField = figure.getCurrentFieldID(); int currentField = figure.getCurrentFieldID();
int nextField = nextField(currentField);
if ((nextField(currentField) == 10) || if ((nextField(currentField) == 10) ||
(nextField(currentField) == 20) || (nextField(currentField) == 20) ||
@@ -100,8 +125,11 @@ public class FigureControl extends AbstractControl implements GameEventListener
} }
} }
/**
* Calculate the next field on the board
* @param currentField The current field id
* @return The next field id
*/
private int nextField(int currentField) { private int nextField(int currentField) {
return (currentField + 1) % 40; return (currentField + 1) % 40;
} }
@@ -113,35 +141,40 @@ public class FigureControl extends AbstractControl implements GameEventListener
// No rendering logic required // No rendering logic required
} }
/**
* Set the path for the figure to follow
* @param startField The field the figure is currently on
* @param endField The field the figure should move to
*/
public void setPath(int startField, int endField) { public void setPath(int startField, int endField) {
// LOGGER.log(Level.TRACE, "setPath called with startField: {0} to endField {1}", startField, endField); LOGGER.log(Level.TRACE, "setPath called with startField: {0} to endField {1}", startField, endField);
path.clear(); path.clear();
for (int fieldId = startField; fieldId != endField; fieldId = (fieldId + 1) % 40) { for (int fieldId = startField; fieldId != endField; fieldId = (fieldId + 1) % 40) {
Vector3f position = figure.calculateFieldPosition(fieldId); Vector3f position = figure.calculateFieldPosition(fieldId);
// LOGGER.log(Level.DEBUG, "Adding postition to path: {0}", position); LOGGER.log(Level.DEBUG, "Adding postition to path: {0}", position);
path.add(position); path.add(position);
} }
Vector3f finalPosition = figure.calculateFieldPosition(endField); Vector3f finalPosition = figure.calculateFieldPosition(endField);
path.add(finalPosition); path.add(finalPosition);
// LOGGER.log(Level.DEBUG, "Final position added to path: {0}", finalPosition); LOGGER.log(Level.DEBUG, "Final position added to path: {0}", finalPosition);
// LOGGER.log(Level.TRACE, "Path size: {0}", path.size()); LOGGER.log(Level.TRACE, "Path size: {0}", path.size());
} }
@Override @Override
public void receivedEvent(UpdatePlayerView event) { public void receivedEvent(UpdatePlayerView event) {
// LOGGER.log(Level.TRACE, "receivedEvent called with event: {0}", event); LOGGER.log(Level.TRACE, "receivedEvent called with event: {0}", event);
int newPos = app.getGameLogic().getPlayerHandler().getPlayerById(figure.getId()).getFieldID(); int newPos = app.getGameLogic().getPlayerHandler().getPlayerById(figure.getId()).getFieldID();
int currentField = figure.getCurrentFieldID(); int currentField = figure.getCurrentFieldID();
if (currentField == newPos) { if (currentField == newPos) {
// LOGGER.log(Level.DEBUG, "No movement required. Current field: {0}, New field: {1}", currentField, newPos); LOGGER.log(Level.DEBUG, "No movement required. Current field: {0}, New field: {1}", currentField, newPos);
return; return;
} }
// LOGGER.log(Level.DEBUG, "Movement required. Current field: {0}, New field: {1}", currentField, newPos); LOGGER.log(Level.DEBUG, "Movement required. Current field: {0}, New field: {1}", currentField, newPos);
setPath(currentField, newPos); setPath(currentField, newPos);
@@ -150,9 +183,4 @@ public class FigureControl extends AbstractControl implements GameEventListener
} }
} }

View File

@@ -4,26 +4,23 @@ import com.jme3.scene.Node;
import com.jme3.scene.Spatial; import com.jme3.scene.Spatial;
import pp.monopoly.model.Item; import pp.monopoly.model.Item;
import pp.monopoly.model.Visitor; import pp.monopoly.model.Visitor;
import pp.monopoly.notification.DiceRollEvent;
import pp.monopoly.notification.GameEventListener; import pp.monopoly.notification.GameEventListener;
import pp.monopoly.notification.ItemAddedEvent; import pp.monopoly.notification.ItemAddedEvent;
import pp.monopoly.notification.ItemRemovedEvent; import pp.monopoly.notification.ItemRemovedEvent;
import pp.monopoly.notification.UpdatePlayerView;
import pp.monopoly.model.Board; import pp.monopoly.model.Board;
import pp.monopoly.model.Figure;
import pp.view.ModelViewSynchronizer; import pp.view.ModelViewSynchronizer;
/** /**
* Abstract base class for synchronizing the visual representation of a {@link Board} with its model state. * Abstract base class for synchronizing the visual representation of a {@link Board} with its model state.
* This class handles the addition and removal of items from the board, ensuring that changes in the model * This class handles the addition and removal of items from the board, ensuring that changes in the model
* are accurately reflected in the view. * are accurately reflected in the view.
* <p> *
* Subclasses are responsible for providing the specific implementation of how each item in the map * Subclasses are responsible for providing the specific implementation of how each item in the map
* is represented visually by implementing the {@link Visitor} interface. * is represented visually by implementing the {@link Visitor} interface.
* </p> *
*/ */
abstract class GameBoardSynchronizer extends ModelViewSynchronizer<Item> implements Visitor<Spatial>, GameEventListener { abstract class GameBoardSynchronizer extends ModelViewSynchronizer<Item> implements Visitor<Spatial>, GameEventListener {
// The board that this synchronizer is responsible for /** The board that this synchronizer is responsible for*/
protected final Board board; protected final Board board;
/** /**

View File

@@ -9,12 +9,24 @@ import pp.monopoly.game.server.Player;
import pp.monopoly.game.server.PlayerColor; import pp.monopoly.game.server.PlayerColor;
import pp.monopoly.notification.Sound; import pp.monopoly.notification.Sound;
/**
* A custom button class that uses images for its appearance. The button's appearance changes based on its state (enabled,
*/
public class ImageButton extends Button { public class ImageButton extends Button {
/** The MonopolyApp instance */
private final MonopolyApp app; private final MonopolyApp app;
/** The button's functionality (e.g., "end_turn", "roll_dice") */
private final String functionality; private final String functionality;
/** The player's color */
private final PlayerColor playerColor; private final PlayerColor playerColor;
/**
* Creates a new ImageButton with the given functionality and MonopolyApp instance.
*
* @param functionality the button's functionality (e.g., "end_turn", "roll_dice")
* @param app the MonopolyApp instance
*/
public ImageButton(String functionality, MonopolyApp app) { public ImageButton(String functionality, MonopolyApp app) {
super("", "button-clear"); super("", "button-clear");
this.app = app; this.app = app;
@@ -82,10 +94,12 @@ public class ImageButton extends Button {
ENABLED, DISABLED, HOVER ENABLED, DISABLED, HOVER
} }
@Override
public void addClickCommands( Command<? super Button> command ) { public void addClickCommands( Command<? super Button> command ) {
super.addCommands(ButtonAction.Down, command); super.addCommands(ButtonAction.Down, command);
} }
@Override
@SuppressWarnings("unchecked") // because Java doesn't like var-arg generics @SuppressWarnings("unchecked") // because Java doesn't like var-arg generics
public void addClickCommands( Command<? super Button>... commands ) { public void addClickCommands( Command<? super Button>... commands ) {
super.addCommands(ButtonAction.Down, commands); super.addCommands(ButtonAction.Down, commands);

View File

@@ -32,10 +32,10 @@ import java.util.Set;
/** /**
* Represents the lobby menu in the Monopoly application. * Represents the lobby menu in the Monopoly application.
* <p> *
* Provides functionality for player configuration, including input for starting capital, * Provides functionality for player configuration, including input for starting capital,
* player name, and figure selection, as well as options to ready up or exit the game. * player name, and figure selection, as well as options to ready up or exit the game.
* </p> *
*/ */
public class LobbyMenu extends Dialog { public class LobbyMenu extends Dialog {
@@ -270,9 +270,6 @@ public class LobbyMenu extends Dialog {
app.getGameLogic().send(new PlayerReady(true, playerInputField.getText(), figure, Integer.parseInt(startingCapital.getText()))); app.getGameLogic().send(new PlayerReady(true, playerInputField.getText(), figure, Integer.parseInt(startingCapital.getText())));
} }
/**
* Opens the settings menu when the escape key is pressed.
*/
@Override @Override
public void escape() { public void escape() {
new SettingsMenu(app).open(); new SettingsMenu(app).open();
@@ -291,11 +288,6 @@ public class LobbyMenu extends Dialog {
} }
} }
/**
* Closes the current menu and transitions music playback.
* Stops the secondary music (if playing) and resumes the main background music
* if music is enabled in the preferences. Ensures smooth transitions in audio.
*/
@Override @Override
public void close() { public void close() {
GameMusic music = app.getStateManager().getState(GameMusic.class); GameMusic music = app.getStateManager().getState(GameMusic.class);
@@ -326,6 +318,7 @@ public class LobbyMenu extends Dialog {
figure = selector.getSelectedItem(); figure = selector.getSelectedItem();
break; break;
} }
System.out.println("FIGUR:::::"+figure);
} }
/** /**

View File

@@ -28,10 +28,15 @@ import java.util.stream.Collectors;
* PropertyOverviewMenu is a dialog for displaying the player's properties in the game. * PropertyOverviewMenu is a dialog for displaying the player's properties in the game.
*/ */
public class PropertyOverviewMenu extends Dialog { public class PropertyOverviewMenu extends Dialog {
/** The MonopolyApp instance */
private final MonopolyApp app; private final MonopolyApp app;
/** The main container for the menu layout */
private final Container mainContainer; private final Container mainContainer;
/** The container for displaying the "Gebäude" cards */
private final Container displayContainer; private final Container displayContainer;
/** The horizontal slider for scrolling through cards */
private final Slider horizontalSlider; private final Slider horizontalSlider;
/** The list of cards to display */
private final List<Container> cards; private final List<Container> cards;
/** /**
@@ -124,6 +129,9 @@ public class PropertyOverviewMenu extends Dialog {
/** /**
* Creates a card for BuildingProperty with detailed rent and cost information. * Creates a card for BuildingProperty with detailed rent and cost information.
*
* @param field The BuildingProperty to create a card for.
* @return The created card container.
*/ */
private Container createBuildingCard(BuildingProperty field) { private Container createBuildingCard(BuildingProperty field) {
Container card = new Container(); Container card = new Container();
@@ -156,6 +164,9 @@ public class PropertyOverviewMenu extends Dialog {
/** /**
* Creates a card for FoodField with dynamic pricing and rent details. * Creates a card for FoodField with dynamic pricing and rent details.
*
* @param field The FoodField to create a card for.
* @return The created card container.
*/ */
private Container createFoodFieldCard(FoodField field) { private Container createFoodFieldCard(FoodField field) {
Container card = new Container(); Container card = new Container();
@@ -188,6 +199,9 @@ public class PropertyOverviewMenu extends Dialog {
/** /**
* Creates a card for GateField with rent details for owning multiple gates. * Creates a card for GateField with rent details for owning multiple gates.
*
* @param field The GateField to create a card for.
* @return The created card container.
*/ */
private Container createGateFieldCard(GateField field) { private Container createGateFieldCard(GateField field) {
Container card = new Container(); Container card = new Container();
@@ -206,11 +220,11 @@ public class PropertyOverviewMenu extends Dialog {
propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))).setFontSize(14); propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))).setFontSize(14);
propertyValuesContainer.addChild(new Label("Miete: 250 EUR", new ElementId("label-Text"))).setFontSize(14); propertyValuesContainer.addChild(new Label("Miete: 250 EUR", new ElementId("label-Text"))).setFontSize(14);
propertyValuesContainer.addChild(new Label("Wenn man", new ElementId("label-Text"))).setFontSize(14); propertyValuesContainer.addChild(new Label("Wenn man", new ElementId("label-Text"))).setFontSize(14);
propertyValuesContainer.addChild(new Label("2 Bahnhof besitzt: 500 EUR", new ElementId("label-Text"))).setFontSize(14); propertyValuesContainer.addChild(new Label("2 Tore besitzt: 500 EUR", new ElementId("label-Text"))).setFontSize(14);
propertyValuesContainer.addChild(new Label("Wenn man", new ElementId("label-Text"))).setFontSize(14); propertyValuesContainer.addChild(new Label("Wenn man", new ElementId("label-Text"))).setFontSize(14);
propertyValuesContainer.addChild(new Label("3 Bahnhof besitzt: 1000 EUR", new ElementId("label-Text"))).setFontSize(14); propertyValuesContainer.addChild(new Label("3 Tore besitzt: 1000 EUR", new ElementId("label-Text"))).setFontSize(14);
propertyValuesContainer.addChild(new Label("Wenn man", new ElementId("label-Text"))).setFontSize(14); propertyValuesContainer.addChild(new Label("Wenn man", new ElementId("label-Text"))).setFontSize(14);
propertyValuesContainer.addChild(new Label("4 Bahnhof besitzt: 2000 EUR", new ElementId("label-Text"))).setFontSize(14); propertyValuesContainer.addChild(new Label("4 Tore besitzt: 2000 EUR", new ElementId("label-Text"))).setFontSize(14);
propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))).setFontSize(14); propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))).setFontSize(14);
propertyValuesContainer.addChild(new Label("„Hypothek: " + field.getHypo() + " EUR", new ElementId("label-Text"))).setFontSize(14); propertyValuesContainer.addChild(new Label("„Hypothek: " + field.getHypo() + " EUR", new ElementId("label-Text"))).setFontSize(14);
propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); // Dark grey background propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); // Dark grey background
@@ -260,9 +274,6 @@ public class PropertyOverviewMenu extends Dialog {
} }
/**
* Closes the dialog and detaches it from the GUI node.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(mainContainer); app.getGuiNode().detachChild(mainContainer);

View File

@@ -136,9 +136,6 @@ public class SettingsMenu extends Dialog {
update(); update();
} }
/**
* As an escape action, this method closes the menu if it is the top dialog.
*/
@Override @Override
public void escape() { public void escape() {
close(); close();

View File

@@ -3,12 +3,15 @@ package pp.monopoly.client.gui;
import com.simsilica.lemur.Slider; import com.simsilica.lemur.Slider;
import pp.monopoly.client.GameSound; import pp.monopoly.client.GameSound;
/**
* A slider for the sound effects volume.
*/
public class SoundSlider extends Slider { public class SoundSlider extends Slider {
/** /**
* Manages sound effects for the game. * Manages sound effects for the game.
*/ */
private final pp.monopoly.client.GameSound sound; private final GameSound sound;
/** /**
* Volume level for the game sounds. * Volume level for the game sounds.

View File

@@ -20,6 +20,9 @@ import pp.monopoly.notification.Sound;
* Constructs the startup menu dialog for the Monopoly application. * Constructs the startup menu dialog for the Monopoly application.
*/ */
public class StartMenu extends Dialog { public class StartMenu extends Dialog {
/**
* The Monopoly application instance.
*/
private final MonopolyApp app; private final MonopolyApp app;
/** /**
@@ -91,8 +94,8 @@ public class StartMenu extends Dialog {
QuadBackgroundComponent unibwBackground = new QuadBackgroundComponent(unibwTexture); QuadBackgroundComponent unibwBackground = new QuadBackgroundComponent(unibwTexture);
unibwContainer.setBackground(unibwBackground); unibwContainer.setBackground(unibwBackground);
float unibwWidth = 512; float unibwWidth = 662;
float unibwHeight = 128; float unibwHeight = 180;
unibwContainer.setPreferredSize(new Vector3f(unibwWidth, unibwHeight, 0)); unibwContainer.setPreferredSize(new Vector3f(unibwWidth, unibwHeight, 0));
unibwContainer.setLocalTranslation(new Vector3f( unibwContainer.setLocalTranslation(new Vector3f(
@@ -105,17 +108,11 @@ public class StartMenu extends Dialog {
app.getGuiNode().attachChild(unibwContainer); app.getGuiNode().attachChild(unibwContainer);
} }
/**
* Opens the settings menu when the escape key is pressed.
*/
@Override @Override
public void escape() { public void escape() {
new SettingsMenu(app).open(); new SettingsMenu(app).open();
} }
/**
* Closes the startup menu and detaches all GUI elements.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachAllChildren(); app.getGuiNode().detachAllChildren();

View File

@@ -101,6 +101,7 @@ public class Toolbar extends Dialog implements GameEventListener {
setupBorders(container); setupBorders(container);
setupSpacer(container); setupSpacer(container);
setupPlayerInfoSection(container); setupPlayerInfoSection(container);
setupSpacer(container);
setupDiceSection(container); setupDiceSection(container);
setupActionMenu(container); setupActionMenu(container);
@@ -195,16 +196,6 @@ public class Toolbar extends Dialog implements GameEventListener {
menuContainer.setBackground(null); menuContainer.setBackground(null);
} }
/**
* Returns the color of the current player.
*
* @return The color of the current player.
*/
private ColorRGBA getCurrentPlayerColor() {
Player currentPlayer = playerHandler.getPlayerById(app.getId());
return Player.getColor(currentPlayer.getId()).getColor();
}
/** /**
* Creates the dice display section of the toolbar interface. * Creates the dice display section of the toolbar interface.
* *
@@ -292,7 +283,11 @@ public class Toolbar extends Dialog implements GameEventListener {
}); });
} }
/**
* Creates the trade button.
*
* @return The trade button.
*/
private Button createTradeButton() { private Button createTradeButton() {
String iconPath = "icons/icon-handeln.png"; String iconPath = "icons/icon-handeln.png";
// createActionButton(playerColor, "icons/icon-handeln.png", 100, () -> new ChoosePartner(app).open()); // createActionButton(playerColor, "icons/icon-handeln.png", 100, () -> new ChoosePartner(app).open());
@@ -307,12 +302,17 @@ public class Toolbar extends Dialog implements GameEventListener {
tradeButton.addClickCommands(s -> ifTopDialog(() -> { tradeButton.addClickCommands(s -> ifTopDialog(() -> {
new ChoosePartner(app).open(); new ChoosePartner(app).open();
})); }));
return tradeButton; return tradeButton;
} }
/**
* Creates the property menu button.
*
* @return The property menu button.
*/
private Button createPropertyMenuButton() { private Button createPropertyMenuButton() {
String iconPath = "icons/icon-gebaude.png"; String iconPath = "icons/icon-gebaude.png";
@@ -332,6 +332,11 @@ public class Toolbar extends Dialog implements GameEventListener {
return propertyMenuButton; return propertyMenuButton;
} }
/**
* Creates the end turn button.
*
* @return The end turn button.
*/
private Button createEndTurnButton() { private Button createEndTurnButton() {
// return createActionButton(playerColor, "icons/icon-zugbeenden.png", 75, () -> handleEndTurn()); // return createActionButton(playerColor, "icons/icon-zugbeenden.png", 75, () -> handleEndTurn());
@@ -352,18 +357,6 @@ public class Toolbar extends Dialog implements GameEventListener {
return endTurnButton; return endTurnButton;
} }
/**
* Creates a background with the specified color.
*
* @param color The color of the background.
* @return The background component.
*/
private QuadBackgroundComponent createButtonBackground(ColorRGBA color) {
QuadBackgroundComponent background = new QuadBackgroundComponent(color);
Texture gradient = app.getAssetManager().loadTexture("Textures/gradient.png");
if (gradient != null) background.setTexture(gradient);
return background;
}
/** /**
* Handles the end turn event. * Handles the end turn event.
@@ -545,18 +538,11 @@ public class Toolbar extends Dialog implements GameEventListener {
endTurnButton.setEnabled(false); endTurnButton.setEnabled(false);
} }
/**
* Closes the toolbar, detaching it from the GUI.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(toolbarContainer); app.getGuiNode().detachChild(toolbarContainer);
super.close(); super.close();
} }
/**
* Opens the settings menu when the escape key is pressed.
*/
@Override @Override
public void escape() { public void escape() {
new SettingsMenu(app).open(); new SettingsMenu(app).open();

View File

@@ -30,10 +30,10 @@ import java.util.stream.Collectors;
/** /**
* Represents the trade menu dialog in the Monopoly application. * Represents the trade menu dialog in the Monopoly application.
* <p> *
* Facilitates trade interactions between players, including selection of properties, * Facilitates trade interactions between players, including selection of properties,
* currency, and special cards for offers and requests. * currency, and special cards for offers and requests.
* </p> *
*/ */
public class TradeMenu extends Dialog { public class TradeMenu extends Dialog {
@@ -48,17 +48,26 @@ public class TradeMenu extends Dialog {
/** Background geometry for the menu. */ /** Background geometry for the menu. */
private Geometry background; private Geometry background;
/** The building and card selector for the left column. */
private Selector<String> leftBuildingSelector, leftSpecialCardSelector; private Selector<String> leftBuildingSelector, leftSpecialCardSelector;
/** The building and card selector for the right column. */
private Selector<String> rightBuildingSelector, rightSpecialCardSelector; private Selector<String> rightBuildingSelector, rightSpecialCardSelector;
/** The labels for displaying selected properties. */
private Label leftSelectionsLabel, rightSelectionsLabel; private Label leftSelectionsLabel, rightSelectionsLabel;
/** The text fields for currency input. */
private TextField leftCurrencyInput, rightCurrencyInput; private TextField leftCurrencyInput, rightCurrencyInput;
/** References for tracking UI changes. */
private VersionedReference<Set<Integer>> leftBuildingRef, rightBuildingRef; private VersionedReference<Set<Integer>> leftBuildingRef, rightBuildingRef;
/** References for tracking UI changes. */
private VersionedReference<Set<Integer>> leftCardRef, rightCardRef; private VersionedReference<Set<Integer>> leftCardRef, rightCardRef;
/** The selected buildings for the trade. */
private Set<String> rightselBuildings = new HashSet<>(); private Set<String> rightselBuildings = new HashSet<>();
/** The selected buildings for the trade. */
private Set<String> leftselBuildings = new HashSet<>(); private Set<String> leftselBuildings = new HashSet<>();
/** The color for the trade menu background. */
private static final ColorRGBA TRANSLUCENT_WHITE = new ColorRGBA(1, 1, 1, 0.5f); private static final ColorRGBA TRANSLUCENT_WHITE = new ColorRGBA(1, 1, 1, 0.5f);
/** /**
@@ -80,7 +89,11 @@ public class TradeMenu extends Dialog {
initializeReferences(); initializeReferences();
} }
/** Creates the main container for the trade menu UI. */
/**
* Creates the main container for the trade menu.
* @return the created main container
*/
private Container createMainContainer() { private Container createMainContainer() {
Container container = new Container(new SpringGridLayout(Axis.Y, Axis.X)); Container container = new Container(new SpringGridLayout(Axis.Y, Axis.X));
container.setPreferredSize(new Vector3f(1200, 800, 0)); container.setPreferredSize(new Vector3f(1200, 800, 0));
@@ -90,7 +103,11 @@ public class TradeMenu extends Dialog {
container.addChild(createMainContent()); container.addChild(createMainContent());
return container; return container;
} }
/** Creates the header label for the trade menu. */
/**
* Creates the header label for the trade menu.
* @return the created header label
*/
private Label createHeader() { private Label createHeader() {
Label header = new Label("Handelsmenü", new ElementId("label-Bold")); Label header = new Label("Handelsmenü", new ElementId("label-Bold"));
header.setFontSize(50); header.setFontSize(50);
@@ -98,7 +115,11 @@ public class TradeMenu extends Dialog {
header.setBackground(new QuadBackgroundComponent(TRANSLUCENT_WHITE)); header.setBackground(new QuadBackgroundComponent(TRANSLUCENT_WHITE));
return header; return header;
} }
/** Creates the main content section of the trade menu. */
/**
* Creates the main content for the trade menu.
* @return the created main content container
*/
private Container createMainContent() { private Container createMainContent() {
Container mainContent = new Container(new SpringGridLayout(Axis.X, Axis.Y)); Container mainContent = new Container(new SpringGridLayout(Axis.X, Axis.Y));
mainContent.setPreferredSize(new Vector3f(1200, 700, 0)); mainContent.setPreferredSize(new Vector3f(1200, 700, 0));
@@ -110,7 +131,9 @@ public class TradeMenu extends Dialog {
return mainContent; return mainContent;
} }
/** Sets the trade data based on the current selections. */ /**
* Sets the trade values based on the user input.
*/
private void setTrades() { private void setTrades() {
String leftCurreny = leftCurrencyInput.getText().equals("")? "0" : leftCurrencyInput.getText(); String leftCurreny = leftCurrencyInput.getText().equals("")? "0" : leftCurrencyInput.getText();
String rightCurreny = rightCurrencyInput.getText().equals("")? "0" : rightCurrencyInput.getText(); String rightCurreny = rightCurrencyInput.getText().equals("")? "0" : rightCurrencyInput.getText();
@@ -232,13 +255,21 @@ public class TradeMenu extends Dialog {
combinedProperties = combinedProperties.stream().sorted(Comparator.comparingInt(PropertyField::getId)).collect(Collectors.toList()); combinedProperties = combinedProperties.stream().sorted(Comparator.comparingInt(PropertyField::getId)).collect(Collectors.toList());
return combinedProperties; return combinedProperties;
} }
/** Creates a text field for currency input. */
/**
* Creates a currency input field for the trade menu.
* @return the created currency input field
*/
private TextField createCurrencyInput() { private TextField createCurrencyInput() {
TextField currencyInput = new TextField("0"); TextField currencyInput = new TextField("0");
styleTextField(currencyInput); styleTextField(currencyInput);
return currencyInput; return currencyInput;
} }
/** Creates the middle section containing buttons and summary fields. */
/**
* Creates the middle section of the trade menu.
* @return the created middle section container
*/
private Container createMiddleSection() { private Container createMiddleSection() {
Container middleSection = new Container(new SpringGridLayout(Axis.Y, Axis.X)); Container middleSection = new Container(new SpringGridLayout(Axis.Y, Axis.X));
middleSection.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8f, 0.8f, 0.8f, 1.0f))); middleSection.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8f, 0.8f, 0.8f, 1.0f)));
@@ -281,13 +312,19 @@ public class TradeMenu extends Dialog {
return middleSection; return middleSection;
} }
/** Styles the given selector with insets and background color. */ /**
* Styles the given selector with insets and background color.
* @param selector the selector to style
*/
private void styleSelector(Selector<String> selector) { private void styleSelector(Selector<String> selector) {
selector.setInsets(new Insets3f(5, 10, 5, 10)); selector.setInsets(new Insets3f(5, 10, 5, 10));
selector.setBackground(new QuadBackgroundComponent(ColorRGBA.Black)); selector.setBackground(new QuadBackgroundComponent(ColorRGBA.Black));
} }
/** Styles the given text field with insets and background color. */ /**
* Styles the given text field with insets and background color.
* @param textField the text field to style
*/
private void styleTextField(TextField textField) { private void styleTextField(TextField textField) {
textField.setInsets(new Insets3f(5, 10, 5, 10)); textField.setInsets(new Insets3f(5, 10, 5, 10));
textField.setBackground(new QuadBackgroundComponent(ColorRGBA.Black)); textField.setBackground(new QuadBackgroundComponent(ColorRGBA.Black));
@@ -314,7 +351,10 @@ public class TradeMenu extends Dialog {
rightCurrencyInput = currencyInput; rightCurrencyInput = currencyInput;
} }
} }
/** Positions the main container at the center of the screen. */
/**
* Positions the main container in the center of the screen.
*/
private void positionMainContainer() { private void positionMainContainer() {
mainContainer.setLocalTranslation( mainContainer.setLocalTranslation(
(app.getCamera().getWidth() - mainContainer.getPreferredSize().x) / 2, (app.getCamera().getWidth() - mainContainer.getPreferredSize().x) / 2,
@@ -322,7 +362,10 @@ public class TradeMenu extends Dialog {
7 7
); );
} }
/** Adds a background image to the trade menu. */
/**
* Adds a background image to the trade menu.
*/
private void addBackgroundImage() { private void addBackgroundImage() {
Texture backgroundImage = app.getAssetManager().loadTexture("Pictures/unibw-Bib2.png"); Texture backgroundImage = app.getAssetManager().loadTexture("Pictures/unibw-Bib2.png");
Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight()); Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
@@ -333,6 +376,7 @@ public class TradeMenu extends Dialog {
background.setLocalTranslation(0, 0, 6); background.setLocalTranslation(0, 0, 6);
app.getGuiNode().attachChild(background); app.getGuiNode().attachChild(background);
} }
/** Initializes references for tracking UI changes. */ /** Initializes references for tracking UI changes. */
private void initializeReferences() { private void initializeReferences() {
leftBuildingRef = leftBuildingSelector.getSelectionModel().createReference(); leftBuildingRef = leftBuildingSelector.getSelectionModel().createReference();

View File

@@ -10,7 +10,9 @@ import pp.monopoly.client.GameMusic;
*/ */
public class VolumeSlider extends Slider { public class VolumeSlider extends Slider {
private final pp.monopoly.client.GameMusic music; /** The GameMusic instance to handel */
private final GameMusic music;
/** The volume of the music */
private double vol; private double vol;
/** /**

View File

@@ -92,7 +92,7 @@ public class AcceptTrade extends Dialog implements PopupDialog {
// Message // Message
Container textContainer = noMoneyWarningContainer.addChild(new Container()); Container textContainer = noMoneyWarningContainer.addChild(new Container());
textContainer.addChild(new Label("Du hast Spieler " + msg.getTradeHandler().getReceiver().getName() + " einen Handel vorgeschlagen.", new ElementId("label-Text"))); textContainer.addChild(new Label("Du hast " + msg.getTradeHandler().getReceiver().getName() + " einen Handel vorgeschlagen.", new ElementId("label-Text")));
textContainer.addChild(new Label("", new ElementId("label-Text"))); textContainer.addChild(new Label("", new ElementId("label-Text")));
textContainer.addChild(new Label("Der Handel wurde angenommen.", new ElementId("label-Text"))); textContainer.addChild(new Label("Der Handel wurde angenommen.", new ElementId("label-Text")));
textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));

View File

@@ -73,7 +73,7 @@ public class Bankrupt extends Dialog implements PopupDialog {
private void createBankruptContainer() { private void createBankruptContainer() {
bankruptContainer = new Container(); bankruptContainer = new Container();
bankruptContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); bankruptContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
bankruptContainer.setPreferredSize(new Vector3f(550, 250, 10)); bankruptContainer.setPreferredSize(new Vector3f(550, 350, 10));
// Title // Title
Label title = bankruptContainer.addChild(new Label("Vorsicht!", new ElementId("warning-title"))); Label title = bankruptContainer.addChild(new Label("Vorsicht!", new ElementId("warning-title")));
@@ -117,9 +117,6 @@ public class Bankrupt extends Dialog implements PopupDialog {
); );
} }
/**
* Displays the popup by attaching it to the GUI.
*/
@Override @Override
public void show() { public void show() {
app.getGuiNode().attachChild(overlayBackground); app.getGuiNode().attachChild(overlayBackground);
@@ -128,9 +125,6 @@ public class Bankrupt extends Dialog implements PopupDialog {
centerContainers(); centerContainers();
} }
/**
* Closes the popup and removes the associated GUI elements.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(overlayBackground); app.getGuiNode().detachChild(overlayBackground);
@@ -139,9 +133,6 @@ public class Bankrupt extends Dialog implements PopupDialog {
super.close(); super.close();
} }
/**
* Handles the escape key action by closing the popup.
*/
@Override @Override
public void escape() { public void escape() {
close(); close();

View File

@@ -1,6 +1,7 @@
package pp.monopoly.client.gui.popups; package pp.monopoly.client.gui.popups;
import com.jme3.math.ColorRGBA; import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
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;
@@ -21,8 +22,11 @@ import pp.monopoly.notification.Sound;
*/ */
public class BuildingPropertyCard extends Dialog implements PopupDialog { public class BuildingPropertyCard extends Dialog implements PopupDialog {
/**The Monopoly application instance*/
private final MonopolyApp app; private final MonopolyApp app;
/**The main container for the popup*/
private final Container buildingPropertyContainer; private final Container buildingPropertyContainer;
/**The background container for the popup*/
private final Container backgroundContainer; private final Container backgroundContainer;
/** /**
@@ -41,6 +45,8 @@ public class BuildingPropertyCard extends Dialog implements PopupDialog {
buildingPropertyContainer = new Container(); buildingPropertyContainer = new Container();
buildingPropertyContainer.setBackground(new QuadBackgroundComponent(field.getColor().getColor())); buildingPropertyContainer.setBackground(new QuadBackgroundComponent(field.getColor().getColor()));
addContentToContainer(buildingPropertyContainer, field); addContentToContainer(buildingPropertyContainer, field);
buildingPropertyContainer.setPreferredSize(new Vector3f(360,460,1));
System.out.println(buildingPropertyContainer.getPreferredSize());
// Create the background container // Create the background container
backgroundContainer = new Container(); backgroundContainer = new Container();
@@ -50,6 +56,9 @@ public class BuildingPropertyCard extends Dialog implements PopupDialog {
float padding = 10f; float padding = 10f;
backgroundContainer.setPreferredSize(buildingPropertyContainer.getPreferredSize().addLocal(padding, padding, 0)); backgroundContainer.setPreferredSize(buildingPropertyContainer.getPreferredSize().addLocal(padding, padding, 0));
System.out.println(backgroundContainer.getPreferredSize());
// Position the containers // Position the containers
centerContainers(padding); centerContainers(padding);
} }
@@ -64,11 +73,12 @@ public class BuildingPropertyCard extends Dialog implements PopupDialog {
// Title // Title
Label title = container.addChild(new Label(field.getName(), new ElementId("label-Bold"))); Label title = container.addChild(new Label(field.getName(), new ElementId("label-Bold")));
title.setBackground(new QuadBackgroundComponent(field.getColor().getColor())); title.setBackground(new QuadBackgroundComponent(field.getColor().getColor()));
title.setFontSize(48); title.setFontSize(38);
// Property details // Property details
Container propertyValuesContainer = container.addChild(new Container()); Container propertyValuesContainer = container.addChild(new Container());
propertyValuesContainer.addChild(new Label("Grundstückswert: " + field.getPrice() + " EUR", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("Grundstückswert: " + field.getPrice() + " EUR", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("Miete allein: " + field.getAllRent().get(0) + " EUR", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("Miete allein: " + field.getAllRent().get(0) + " EUR", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("- mit 1 Haus: " + field.getAllRent().get(1) + " EUR", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("- mit 1 Haus: " + field.getAllRent().get(1) + " EUR", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("- mit 2 Häusern: " + field.getAllRent().get(2) + " EUR", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("- mit 2 Häusern: " + field.getAllRent().get(2) + " EUR", new ElementId("label-Text")));
@@ -76,6 +86,7 @@ public class BuildingPropertyCard extends Dialog implements PopupDialog {
propertyValuesContainer.addChild(new Label("- mit 4 Häusern: " + field.getAllRent().get(4) + " EUR", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("- mit 4 Häusern: " + field.getAllRent().get(4) + " EUR", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("- mit 1 Hotel: " + field.getAllRent().get(5) + " EUR", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("- mit 1 Hotel: " + field.getAllRent().get(5) + " EUR", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("1 Haus kostet: " + field.getHousePrice() + " EUR", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("1 Haus kostet: " + field.getHousePrice() + " EUR", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));
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)));
@@ -128,18 +139,12 @@ public class BuildingPropertyCard extends Dialog implements PopupDialog {
); );
} }
/**
* Attaches the popup to the GUI through the DialogManager.
*/
@Override @Override
public void show() { public void show() {
app.getGuiNode().attachChild(backgroundContainer); app.getGuiNode().attachChild(backgroundContainer);
app.getGuiNode().attachChild(buildingPropertyContainer); app.getGuiNode().attachChild(buildingPropertyContainer);
} }
/**
* Closes the popup and removes associated GUI elements.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(buildingPropertyContainer); app.getGuiNode().detachChild(buildingPropertyContainer);
@@ -147,9 +152,6 @@ public class BuildingPropertyCard extends Dialog implements PopupDialog {
super.close(); super.close();
} }
/**
* Opens the settings menu when the escape key is pressed.
*/
@Override @Override
public void escape() { public void escape() {
new SettingsMenu(app).open(); new SettingsMenu(app).open();

View File

@@ -7,7 +7,6 @@ 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.Selector; import com.simsilica.lemur.Selector;
import com.simsilica.lemur.TextField;
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.VersionedList;
@@ -125,13 +124,13 @@ public class BuyHouse extends Dialog {
buyHouseContainer.setLocalTranslation( buyHouseContainer.setLocalTranslation(
(app.getCamera().getWidth() - buyHouseContainer.getPreferredSize().x) / 2, (app.getCamera().getWidth() - buyHouseContainer.getPreferredSize().x) / 2,
(app.getCamera().getHeight() + buyHouseContainer.getPreferredSize().y) / 2, (app.getCamera().getHeight() + buyHouseContainer.getPreferredSize().y) / 2,
8 9
); );
backgroundContainer.setLocalTranslation( backgroundContainer.setLocalTranslation(
(app.getCamera().getWidth() - buyHouseContainer.getPreferredSize().x - padding) / 2, (app.getCamera().getWidth() - buyHouseContainer.getPreferredSize().x - padding) / 2,
(app.getCamera().getHeight() + buyHouseContainer.getPreferredSize().y + padding) / 2, (app.getCamera().getHeight() + buyHouseContainer.getPreferredSize().y + padding) / 2,
7 8
); );
app.getGuiNode().attachChild(buyHouseContainer); app.getGuiNode().attachChild(buyHouseContainer);
@@ -228,9 +227,6 @@ public class BuyHouse extends Dialog {
this.cost.setText(cost+""); this.cost.setText(cost+"");
} }
/**
* Closes the popup and removes its GUI elements.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(buyHouseContainer); app.getGuiNode().detachChild(buyHouseContainer);
@@ -238,9 +234,6 @@ public class BuyHouse extends Dialog {
super.close(); super.close();
} }
/**
* Opens the settings menu when the escape key is pressed.
*/
@Override @Override
public void escape() { public void escape() {
new SettingsMenu(app).open(); new SettingsMenu(app).open();

View File

@@ -79,7 +79,7 @@ public class ConfirmTrade extends Dialog implements PopupDialog {
// Trade details // Trade details
Container propertyValuesContainer = confirmTradeContainer.addChild(new Container()); Container propertyValuesContainer = confirmTradeContainer.addChild(new Container());
propertyValuesContainer.addChild(new Label("„Spieler " + tradeHandler.getSender().getName() + " möchte:", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label( tradeHandler.getSender().getName() + " möchte:", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("- " + offeredProperties, new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("- " + offeredProperties, new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("- " + tradeHandler.getOfferedAmount() + " EUR", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("- " + tradeHandler.getOfferedAmount() + " EUR", new ElementId("label-Text")));
@@ -124,9 +124,6 @@ public class ConfirmTrade extends Dialog implements PopupDialog {
})); }));
} }
/**
* Displays the popup by attaching it to the GUI.
*/
@Override @Override
public void show() { public void show() {
float padding = 10; float padding = 10;
@@ -149,9 +146,6 @@ public class ConfirmTrade extends Dialog implements PopupDialog {
app.getGuiNode().attachChild(confirmTradeContainer); app.getGuiNode().attachChild(confirmTradeContainer);
} }
/**
* Closes the popup and removes its GUI elements.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(confirmTradeContainer); app.getGuiNode().detachChild(confirmTradeContainer);
@@ -159,9 +153,6 @@ public class ConfirmTrade extends Dialog implements PopupDialog {
super.close(); super.close();
} }
/**
* Opens the settings menu when the escape key is pressed.
*/
@Override @Override
public void escape() { public void escape() {
new SettingsMenu(app).open(); new SettingsMenu(app).open();

View File

@@ -99,9 +99,6 @@ public class EventCardPopup extends Dialog implements PopupDialog {
})); }));
} }
/**
* Displays the popup by attaching it to the GUI.
*/
@Override @Override
public void show() { public void show() {
float padding = 10; float padding = 10;
@@ -125,9 +122,6 @@ public class EventCardPopup extends Dialog implements PopupDialog {
app.getGuiNode().attachChild(eventCardContainer); app.getGuiNode().attachChild(eventCardContainer);
} }
/**
* Closes the popup and removes its associated GUI elements.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(overlayBackground); app.getGuiNode().detachChild(overlayBackground);
@@ -136,9 +130,6 @@ public class EventCardPopup extends Dialog implements PopupDialog {
super.close(); super.close();
} }
/**
* Handles the escape key action by closing the popup.
*/
@Override @Override
public void escape() { public void escape() {
close(); close();

View File

@@ -3,6 +3,7 @@ package pp.monopoly.client.gui.popups;
import com.jme3.material.Material; import com.jme3.material.Material;
import com.jme3.material.RenderState.BlendMode; import com.jme3.material.RenderState.BlendMode;
import com.jme3.math.ColorRGBA; import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
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.Button;
@@ -72,6 +73,7 @@ public class FoodFieldCard extends Dialog implements PopupDialog {
private void createBackgroundContainer() { private void createBackgroundContainer() {
backgroundContainer = new Container(); backgroundContainer = new Container();
backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background
} }
/** /**
@@ -82,6 +84,7 @@ public class FoodFieldCard extends Dialog implements PopupDialog {
private void createFoodFieldContainer(FoodField field) { private void createFoodFieldContainer(FoodField field) {
foodFieldContainer = new Container(); foodFieldContainer = new Container();
foodFieldContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.1f, 0.1f, 0.1f, 0.9f))); foodFieldContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.1f, 0.1f, 0.1f, 0.9f)));
foodFieldContainer.setPreferredSize(new Vector3f(360,445,1));
// Title // Title
Label title = foodFieldContainer.addChild(new Label(field.getName(), new ElementId("label-Bold"))); Label title = foodFieldContainer.addChild(new Label(field.getName(), new ElementId("label-Bold")));
@@ -92,8 +95,12 @@ public class FoodFieldCard extends Dialog implements PopupDialog {
Container propertyValuesContainer = foodFieldContainer.addChild(new Container()); Container propertyValuesContainer = foodFieldContainer.addChild(new Container());
propertyValuesContainer.addChild(new Label("„Preis: " + field.getPrice() + " EUR", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("„Preis: " + field.getPrice() + " EUR", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Empty line propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Empty line
propertyValuesContainer.addChild(new Label("„Miete: 40x Würfel-Augen, wenn Besitzer eines Restaurants.", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("„Miete: 40x Würfel-Augen,", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("Miete: 100x Würfel-Augen, wenn Besitzer beider Restaurants.", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("„wenn Besitzer eines ", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("„Restaurants.", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("„Miete: 100x Würfel-Augen, ", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("„wenn Besitzer eines ", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("„Restaurants.", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Empty line propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Empty line
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)));
@@ -116,9 +123,6 @@ public class FoodFieldCard extends Dialog implements PopupDialog {
})); }));
} }
/**
* Displays the popup by attaching its elements to the GUI.
*/
@Override @Override
public void show() { public void show() {
float padding = 10; float padding = 10;
@@ -142,9 +146,6 @@ public class FoodFieldCard extends Dialog implements PopupDialog {
app.getGuiNode().attachChild(foodFieldContainer); app.getGuiNode().attachChild(foodFieldContainer);
} }
/**
* Closes the popup and removes its associated GUI elements.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(overlayBackground); app.getGuiNode().detachChild(overlayBackground);
@@ -153,9 +154,6 @@ public class FoodFieldCard extends Dialog implements PopupDialog {
super.close(); super.close();
} }
/**
* Handles the escape key action by closing the popup.
*/
@Override @Override
public void escape() { public void escape() {
close(); close();

View File

@@ -1,6 +1,7 @@
package pp.monopoly.client.gui.popups; package pp.monopoly.client.gui.popups;
import com.jme3.math.ColorRGBA; import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
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;
@@ -61,6 +62,8 @@ public class GateFieldCard extends Dialog implements PopupDialog {
*/ */
private void createGateFieldContainer(GateField field) { private void createGateFieldContainer(GateField field) {
gateFieldContainer = new Container(); gateFieldContainer = new Container();
//TODO: Set the size of the container to the size of the screen @Simon
gateFieldContainer.setPreferredSize(new Vector3f(360,460,1));
gateFieldContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); gateFieldContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
// Title // Title
@@ -73,9 +76,12 @@ public class GateFieldCard extends Dialog implements PopupDialog {
propertyValuesContainer.addChild(new Label("„Preis: " + field.getPrice() + " EUR", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("„Preis: " + field.getPrice() + " EUR", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Empty line propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Empty line
propertyValuesContainer.addChild(new Label("Miete: 250 EUR", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("Miete: 250 EUR", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("Wenn man 2 Bahnhöfe besitzt: 500 EUR", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("Wenn man 2 Tore", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("Wenn man 3 Bahnhöfe besitzt: 1000 EUR", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("besitzt: 500 EUR", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("Wenn man 4 Bahnhöfe besitzt: 2000 EUR", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("Wenn man 3 Tore", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("besitzt: 1000 EUR", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("Wenn man 4 Tore", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("besitzt: 2000 EUR", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Empty line propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Empty line
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)));
@@ -98,9 +104,6 @@ public class GateFieldCard extends Dialog implements PopupDialog {
})); }));
} }
/**
* Displays the popup by attaching its elements to the GUI.
*/
@Override @Override
public void show() { public void show() {
float padding = 10; float padding = 10;
@@ -123,9 +126,6 @@ public class GateFieldCard extends Dialog implements PopupDialog {
app.getGuiNode().attachChild(gateFieldContainer); app.getGuiNode().attachChild(gateFieldContainer);
} }
/**
* Closes the popup and removes its associated GUI elements.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(gateFieldContainer); // Remove main container app.getGuiNode().detachChild(gateFieldContainer); // Remove main container
@@ -133,9 +133,6 @@ public class GateFieldCard extends Dialog implements PopupDialog {
super.close(); super.close();
} }
/**
* Opens the settings menu when the escape key is pressed.
*/
@Override @Override
public void escape() { public void escape() {
new SettingsMenu(app).open(); new SettingsMenu(app).open();

View File

@@ -19,9 +19,9 @@ import pp.monopoly.notification.Sound;
/** /**
* Gulag is a warning popup triggered when a player lands on the "Wache" field in the Monopoly game. * Gulag is a warning popup triggered when a player lands on the "Wache" field in the Monopoly game.
* <p> *
* This popup informs the player that they are being sent to the Gulag and includes a confirmation button. * This popup informs the player that they are being sent to the Gulag and includes a confirmation button.
* </p> *
*/ */
public class Gulag extends Dialog implements PopupDialog { public class Gulag extends Dialog implements PopupDialog {
/** Reference to the Monopoly application instance. */ /** Reference to the Monopoly application instance. */
@@ -94,9 +94,6 @@ public class Gulag extends Dialog implements PopupDialog {
})); }));
} }
/**
* Displays the popup by attaching its elements to the GUI.
*/
@Override @Override
public void show() { public void show() {
float padding = 10; float padding = 10;
@@ -120,9 +117,6 @@ public class Gulag extends Dialog implements PopupDialog {
app.getGuiNode().attachChild(gulagContainer); app.getGuiNode().attachChild(gulagContainer);
} }
/**
* Closes the popup and removes its associated GUI elements.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(overlayBackground); app.getGuiNode().detachChild(overlayBackground);
@@ -131,9 +125,6 @@ public class Gulag extends Dialog implements PopupDialog {
super.close(); super.close();
} }
/**
* Handles the escape action by closing the popup.
*/
@Override @Override
public void escape() { public void escape() {
close(); close();

View File

@@ -93,7 +93,7 @@ public class GulagInfo extends Dialog implements PopupDialog {
})); }));
// Use Jail-Free Card Button // Use Jail-Free Card Button
Button eventCardButton = gulagInfoContainer.addChild(new Button("Ereigniskarte nutzen", new ElementId("button"))); Button eventCardButton = gulagInfoContainer.addChild(new Button("Ereigniskarte nutzen", new ElementId("button-toolbar2")));
eventCardButton.setFontSize(32); eventCardButton.setFontSize(32);
eventCardButton.addClickCommands(s -> ifTopDialog(() -> { eventCardButton.addClickCommands(s -> ifTopDialog(() -> {
app.getGameLogic().playSound(Sound.BUTTON); app.getGameLogic().playSound(Sound.BUTTON);
@@ -115,9 +115,6 @@ public class GulagInfo extends Dialog implements PopupDialog {
} }
} }
/**
* Displays the popup by attaching its elements to the GUI.
*/
@Override @Override
public void show() { public void show() {
float padding = 10; float padding = 10;
@@ -142,13 +139,15 @@ public class GulagInfo extends Dialog implements PopupDialog {
app.getGuiNode().attachChild(gulagInfoContainer); app.getGuiNode().attachChild(gulagInfoContainer);
} }
/**
* Closes the GulagInfo popup and removes its GUI elements.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(gulagInfoContainer); // Remove dialog app.getGuiNode().detachChild(gulagInfoContainer); // Remove dialog
app.getGuiNode().detachChild(backgroundContainer); // Remove background app.getGuiNode().detachChild(backgroundContainer); // Remove background
super.close(); super.close();
} }
@Override
public void escape() {
close();
}
} }

View File

@@ -18,9 +18,9 @@ import pp.monopoly.notification.Sound;
/** /**
* LooserPopUp is a dialog that appears when a player loses the game. * LooserPopUp is a dialog that appears when a player loses the game.
* <p> *
* This popup provides a message of encouragement and an option to quit the game. * This popup provides a message of encouragement and an option to quit the game.
* </p> *
*/ */
public class LooserPopUp extends Dialog { public class LooserPopUp extends Dialog {
/** Reference to the Monopoly application instance. */ /** Reference to the Monopoly application instance. */
@@ -123,9 +123,6 @@ public class LooserPopUp extends Dialog {
return overlay; return overlay;
} }
/**
* Closes the LooserPopUp dialog and removes its GUI elements.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(LooserContainer); // Entferne das Menü app.getGuiNode().detachChild(LooserContainer); // Entferne das Menü
@@ -134,9 +131,6 @@ public class LooserPopUp extends Dialog {
super.close(); super.close();
} }
/**
* Handles the escape action to close the dialog.
*/
@Override @Override
public void escape() { public void escape() {
close(); close();

View File

@@ -127,9 +127,6 @@ public class NoMoneyWarning extends Dialog implements PopupDialog {
); );
} }
/**
* Displays the dialog by attaching its components to the GUI node.
*/
@Override @Override
public void show() { public void show() {
app.getGuiNode().attachChild(overlayBackground); app.getGuiNode().attachChild(overlayBackground);
@@ -137,9 +134,6 @@ public class NoMoneyWarning extends Dialog implements PopupDialog {
app.getGuiNode().attachChild(noMoneyWarningContainer); app.getGuiNode().attachChild(noMoneyWarningContainer);
} }
/**
* Closes the dialog and removes its components from the GUI node.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(overlayBackground); app.getGuiNode().detachChild(overlayBackground);
@@ -148,9 +142,6 @@ public class NoMoneyWarning extends Dialog implements PopupDialog {
super.close(); super.close();
} }
/**
* Handles the escape action to close the dialog.
*/
@Override @Override
public void escape() { public void escape() {
close(); close();

View File

@@ -125,9 +125,6 @@ public class ReceivedRent extends Dialog implements PopupDialog {
); );
} }
/**
* Displays the popup by attaching it to the GUI through the DialogManager.
*/
@Override @Override
public void show() { public void show() {
app.getGuiNode().attachChild(overlayBackground); app.getGuiNode().attachChild(overlayBackground);
@@ -136,9 +133,6 @@ public class ReceivedRent extends Dialog implements PopupDialog {
centerContainers(); centerContainers();
} }
/**
* Closes the popup and removes GUI elements.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(overlayBackground); app.getGuiNode().detachChild(overlayBackground);
@@ -147,9 +141,6 @@ public class ReceivedRent extends Dialog implements PopupDialog {
super.close(); super.close();
} }
/**
* Handles the escape action to close the dialog.
*/
@Override @Override
public void escape() { public void escape() {
close(); close();

View File

@@ -96,7 +96,7 @@ public class RejectTrade extends Dialog implements PopupDialog {
// Rejection message // Rejection message
Container textContainer = container.addChild(new Container()); Container textContainer = container.addChild(new Container());
textContainer.addChild(new Label("Du hast Spieler " + msg.getTradeHandler().getReceiver().getName() textContainer.addChild(new Label("Du hast " + msg.getTradeHandler().getReceiver().getName()
+ " einen Handel vorgeschlagen.", new ElementId("label-Text"))); + " einen Handel vorgeschlagen.", new ElementId("label-Text")));
textContainer.addChild(new Label("", new ElementId("label-Text"))); textContainer.addChild(new Label("", new ElementId("label-Text")));
textContainer.addChild(new Label("Der Handel wurde abgelehnt.", new ElementId("label-Text"))); textContainer.addChild(new Label("Der Handel wurde abgelehnt.", new ElementId("label-Text")));
@@ -134,9 +134,6 @@ public class RejectTrade extends Dialog implements PopupDialog {
); );
} }
/**
* Displays the popup by attaching its elements to the GUI node.
*/
@Override @Override
public void show() { public void show() {
app.getGuiNode().attachChild(overlayBackground); app.getGuiNode().attachChild(overlayBackground);
@@ -144,9 +141,6 @@ public class RejectTrade extends Dialog implements PopupDialog {
app.getGuiNode().attachChild(rejectTradeContainer); app.getGuiNode().attachChild(rejectTradeContainer);
} }
/**
* Closes the menu and removes the GUI elements.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(overlayBackground); app.getGuiNode().detachChild(overlayBackground);
@@ -155,9 +149,6 @@ public class RejectTrade extends Dialog implements PopupDialog {
super.close(); super.close();
} }
/**
* Handles the escape key action by closing the popup.
*/
@Override @Override
public void escape() { public void escape() {
close(); close();

View File

@@ -19,17 +19,28 @@ import pp.monopoly.notification.Sound;
/** /**
* Rent is a popup that is triggered when a player lands on a property owned by another player * Rent is a popup that is triggered when a player lands on a property owned by another player
* and needs to pay rent in the Monopoly application. * and needs to pay rent in the Monopoly application.
* <p> *
* Displays the rent amount and the recipient player's name, with an option to confirm the payment. * Displays the rent amount and the recipient player's name, with an option to confirm the payment.
* </p> *
*/ */
public class Rent extends Dialog implements PopupDialog { public class Rent extends Dialog implements PopupDialog {
private final MonopolyApp app;
/** Reference to the Monopoly application instance. */
private final MonopolyApp app;
/** Semi-transparent overlay background for the popup. */
private final Geometry overlayBackground; private final Geometry overlayBackground;
/** Main container for the rent information and action. */
private final Container rentContainer; private final Container rentContainer;
/** Background container providing a border for the rent popup. */
private final Container backgroundContainer; private final Container backgroundContainer;
/**
* Constructs the Rent popup displaying the rent amount and recipient player's name.
*
* @param app the Monopoly application instance
* @param playerName the name of the player to pay rent to
* @param amount the amount of rent to pay
*/
public Rent(MonopolyApp app, String playerName, int amount) { public Rent(MonopolyApp app, String playerName, int amount) {
super(app.getDialogManager()); super(app.getDialogManager());
this.app = app; this.app = app;
@@ -43,6 +54,11 @@ public class Rent extends Dialog implements PopupDialog {
centerContainers(); centerContainers();
} }
/**
* Creates the semi-transparent overlay background for the popup.
*
* @return the geometry of the overlay
*/
private Geometry createOverlayBackground() { private Geometry createOverlayBackground() {
Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight()); Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
Geometry overlay = new Geometry("Overlay", quad); Geometry overlay = new Geometry("Overlay", quad);
@@ -54,12 +70,24 @@ public class Rent extends Dialog implements PopupDialog {
return overlay; return overlay;
} }
/**
* Creates the background container for the rent popup.
*
* @return the background container
*/
private Container createBackgroundContainer() { private Container createBackgroundContainer() {
Container container = new Container(); Container container = new Container();
container.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); container.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
return container; return container;
} }
/**
* Creates the main container for the rent popup.
*
* @param playerName the name of the player to pay rent to
* @param amount the amount of rent to pay
* @return the rent container
*/
private Container createRentContainer(String playerName, int amount) { private Container createRentContainer(String playerName, int amount) {
Container container = new Container(); Container container = new Container();
container.setBackground(new QuadBackgroundComponent(ColorRGBA.Gray)); container.setBackground(new QuadBackgroundComponent(ColorRGBA.Gray));
@@ -85,6 +113,9 @@ public class Rent extends Dialog implements PopupDialog {
return container; return container;
} }
/**
* Centers the rent and background containers on the screen.
*/
private void centerContainers() { private void centerContainers() {
float padding = 10; float padding = 10;

View File

@@ -7,7 +7,6 @@ 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.Selector; import com.simsilica.lemur.Selector;
import com.simsilica.lemur.TextField;
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.VersionedList;
@@ -30,10 +29,10 @@ import java.util.stream.Collectors;
/** /**
* RepayMortage is a popup that appears when a player selects the "Repay Mortgage" option * RepayMortage is a popup that appears when a player selects the "Repay Mortgage" option
* in the Building Administration Menu. * in the Building Administration Menu.
* <p> *
* This popup allows the player to select mortgaged properties and repay their mortgages, * This popup allows the player to select mortgaged properties and repay their mortgages,
* showing the total cost of the repayment. Includes options to confirm or cancel the repayment. * showing the total cost of the repayment. Includes options to confirm or cancel the repayment.
* </p> *
*/ */
public class RepayMortage extends Dialog { public class RepayMortage extends Dialog {
/** Reference to the Monopoly application instance. */ /** Reference to the Monopoly application instance. */
@@ -128,14 +127,14 @@ public class RepayMortage extends Dialog {
repayMortageContainer.setLocalTranslation( repayMortageContainer.setLocalTranslation(
(app.getCamera().getWidth() - repayMortageContainer.getPreferredSize().x) / 2, (app.getCamera().getWidth() - repayMortageContainer.getPreferredSize().x) / 2,
(app.getCamera().getHeight() + repayMortageContainer.getPreferredSize().y) / 2, (app.getCamera().getHeight() + repayMortageContainer.getPreferredSize().y) / 2,
8 9
); );
// Zentriere das Popup // Zentriere das Popup
backgroundContainer.setLocalTranslation( backgroundContainer.setLocalTranslation(
(app.getCamera().getWidth() - repayMortageContainer.getPreferredSize().x - padding) / 2, (app.getCamera().getWidth() - repayMortageContainer.getPreferredSize().x - padding) / 2,
(app.getCamera().getHeight() + repayMortageContainer.getPreferredSize().y+ padding) / 2, (app.getCamera().getHeight() + repayMortageContainer.getPreferredSize().y+ padding) / 2,
7 8
); );
app.getGuiNode().attachChild(repayMortageContainer); app.getGuiNode().attachChild(repayMortageContainer);
@@ -232,9 +231,6 @@ public class RepayMortage extends Dialog {
this.cost.setText(cost+""); this.cost.setText(cost+"");
} }
/**
* Closes the popup and removes its associated GUI elements.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(repayMortageContainer); // Entferne das Menü app.getGuiNode().detachChild(repayMortageContainer); // Entferne das Menü
@@ -242,9 +238,6 @@ public class RepayMortage extends Dialog {
super.close(); super.close();
} }
/**
* Opens the settings menu when the escape key is pressed.
*/
@Override @Override
public void escape() { public void escape() {
new SettingsMenu(app).open(); new SettingsMenu(app).open();

View File

@@ -7,7 +7,6 @@ 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.Selector; import com.simsilica.lemur.Selector;
import com.simsilica.lemur.TextField;
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.VersionedList;
@@ -30,10 +29,10 @@ import java.util.stream.Collectors;
/** /**
* SellHouse is a popup that appears when a player clicks on the "Demolish" button * SellHouse is a popup that appears when a player clicks on the "Demolish" button
* in the BuildingAdminMenu. * in the BuildingAdminMenu.
* <p> *
* This dialog allows players to select their properties and demolish houses or hotels * This dialog allows players to select their properties and demolish houses or hotels
* for a partial refund of their purchase cost. * for a partial refund of their purchase cost.
* </p> *
*/ */
public class SellHouse extends Dialog { public class SellHouse extends Dialog {
/** Reference to the Monopoly application instance. */ /** Reference to the Monopoly application instance. */
@@ -128,14 +127,14 @@ public class SellHouse extends Dialog {
sellhouseContainer.setLocalTranslation( sellhouseContainer.setLocalTranslation(
(app.getCamera().getWidth() - sellhouseContainer.getPreferredSize().x) / 2, (app.getCamera().getWidth() - sellhouseContainer.getPreferredSize().x) / 2,
(app.getCamera().getHeight() + sellhouseContainer.getPreferredSize().y) / 2, (app.getCamera().getHeight() + sellhouseContainer.getPreferredSize().y) / 2,
8 9
); );
// Zentriere das Popup // Zentriere das Popup
backgroundContainer.setLocalTranslation( backgroundContainer.setLocalTranslation(
(app.getCamera().getWidth() - sellhouseContainer.getPreferredSize().x - padding) / 2, (app.getCamera().getWidth() - sellhouseContainer.getPreferredSize().x - padding) / 2,
(app.getCamera().getHeight() + sellhouseContainer.getPreferredSize().y+ padding) / 2, (app.getCamera().getHeight() + sellhouseContainer.getPreferredSize().y+ padding) / 2,
7 8
); );
app.getGuiNode().attachChild(sellhouseContainer); app.getGuiNode().attachChild(sellhouseContainer);
@@ -231,9 +230,6 @@ public class SellHouse extends Dialog {
this.cost.setText(cost+""); this.cost.setText(cost+"");
} }
/**
* Closes the dialog and removes GUI elements from the screen.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(sellhouseContainer); // Entferne das Menü app.getGuiNode().detachChild(sellhouseContainer); // Entferne das Menü
@@ -241,9 +237,6 @@ public class SellHouse extends Dialog {
super.close(); super.close();
} }
/**
* Handles the escape action to close the dialog.
*/
@Override @Override
public void escape() { public void escape() {
new SettingsMenu(app).open(); new SettingsMenu(app).open();

View File

@@ -7,7 +7,6 @@ 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.Selector; import com.simsilica.lemur.Selector;
import com.simsilica.lemur.TextField;
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.VersionedList;
@@ -129,14 +128,14 @@ public class TakeMortage extends Dialog {
takeMortageContainer.setLocalTranslation( takeMortageContainer.setLocalTranslation(
(app.getCamera().getWidth() - takeMortageContainer.getPreferredSize().x) / 2, (app.getCamera().getWidth() - takeMortageContainer.getPreferredSize().x) / 2,
(app.getCamera().getHeight() + takeMortageContainer.getPreferredSize().y) / 2, (app.getCamera().getHeight() + takeMortageContainer.getPreferredSize().y) / 2,
8 9
); );
// Zentriere das Popup // Zentriere das Popup
backgroundContainer.setLocalTranslation( backgroundContainer.setLocalTranslation(
(app.getCamera().getWidth() - takeMortageContainer.getPreferredSize().x - padding) / 2, (app.getCamera().getWidth() - takeMortageContainer.getPreferredSize().x - padding) / 2,
(app.getCamera().getHeight() + takeMortageContainer.getPreferredSize().y+ padding) / 2, (app.getCamera().getHeight() + takeMortageContainer.getPreferredSize().y+ padding) / 2,
7 8
); );
app.getGuiNode().attachChild(takeMortageContainer); app.getGuiNode().attachChild(takeMortageContainer);
@@ -241,9 +240,6 @@ public class TakeMortage extends Dialog {
this.cost.setText(cost+""); this.cost.setText(cost+"");
} }
/**
* Closes the dialog and removes GUI elements from the screen.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(takeMortageContainer); // Entferne das Menü app.getGuiNode().detachChild(takeMortageContainer); // Entferne das Menü
@@ -251,9 +247,6 @@ public class TakeMortage extends Dialog {
super.close(); super.close();
} }
/**
* Handles the escape action to close the dialog.
*/
@Override @Override
public void escape() { public void escape() {
new SettingsMenu(app).open(); new SettingsMenu(app).open();

View File

@@ -18,9 +18,9 @@ import pp.monopoly.notification.Sound;
/** /**
* WinnerPopUp is a dialog displayed when a player wins the Monopoly game. * WinnerPopUp is a dialog displayed when a player wins the Monopoly game.
* <p> *
* This popup congratulates the player for their victory and provides an option to quit the game. * This popup congratulates the player for their victory and provides an option to quit the game.
* </p> *
*/ */
public class WinnerPopUp extends Dialog { public class WinnerPopUp extends Dialog {
/** Reference to the Monopoly application instance. */ /** Reference to the Monopoly application instance. */
@@ -121,9 +121,6 @@ public class WinnerPopUp extends Dialog {
return overlay; return overlay;
} }
/**
* Closes the WinnerPopUp dialog and removes its GUI elements.
*/
@Override @Override
public void close() { public void close() {
app.getGuiNode().detachChild(WinnerContainer); // Entferne das Menü app.getGuiNode().detachChild(WinnerContainer); // Entferne das Menü
@@ -132,9 +129,6 @@ public class WinnerPopUp extends Dialog {
super.close(); super.close();
} }
/**
* Handles the escape action to close the dialog.
*/
@Override @Override
public void escape() { public void escape() {
close(); close();

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 473 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 707 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 478 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 518 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 552 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

View File

@@ -69,10 +69,13 @@ 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);
/** The player handler containing information about all players in the game. */
private PlayerHandler playerHandler; private PlayerHandler playerHandler;
/** The board manager containing information about all fields on the board. */
private BoardManager boardManager = new BoardManager(); private BoardManager boardManager = new BoardManager();
/** The trade handler containing information about trades in the game. */
private TradeHandler tradeHandler; private TradeHandler tradeHandler;

View File

@@ -7,6 +7,7 @@
package pp.monopoly.game.server; package pp.monopoly.game.server;
import java.lang.System.Logger;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@@ -39,24 +40,35 @@ import pp.monopoly.model.fields.WacheField;
* Class representing a player * Class representing a player
*/ */
@Serializable @Serializable
public class Player implements FieldVisitor<Void>{ public class Player implements FieldVisitor<Void> {
/** The logger for this class */
private final static Logger LOGGER = System.getLogger(Player.class.getName());
/** The player id */
private final int id; private final int id;
/** The player name */
private String name; private String name;
/** The player account balance */
private int accountBalance = 15000; private int accountBalance = 15000;
/** The player figure */
private String figure; private String figure;
/** The player properties */
private Set<Integer> properties = new HashSet<>(); private Set<Integer> properties = new HashSet<>();
/** The number of GetOutOfJailCards owned by the player */
private int getOutOfJailCard; private int getOutOfJailCard;
/** The current field id of the player */
private int fieldID; private int fieldID;
/** The result of the last dice roll */
private DiceResult rollResult; private DiceResult rollResult;
/** The player handler */
private transient final PlayerHandler handler; private transient final PlayerHandler handler;
/** The current state of the player */
private transient PlayerState state = new WaitForTurnState(); private transient PlayerState state = new WaitForTurnState();
/** /**
* Default constructor for serialization purposes. * Default constructor for serialization purposes.
*/ */
private Player(){ private Player(){
id = 0; this(0, null);
handler = null;
} }
/** /**
@@ -69,6 +81,7 @@ public class Player implements FieldVisitor<Void>{
this.name = name; this.name = name;
this.id = id; this.id = id;
this.handler = handler; this.handler = handler;
LOGGER.log(Logger.Level.INFO, "Player created: " + name);
} }
/** /**
@@ -77,8 +90,7 @@ public class Player implements FieldVisitor<Void>{
* @param handler the PlayerHandler this player is a part of * @param handler the PlayerHandler this player is a part of
*/ */
public Player(int id, PlayerHandler handler) { public Player(int id, PlayerHandler handler) {
this.id = id; this(id, null, handler);
this.handler = handler;
} }
/** /**
@@ -97,6 +109,10 @@ public class Player implements FieldVisitor<Void>{
return figure; return figure;
} }
/**
* Returns the color of the player
* @return the color of the player
*/
public static PlayerColor getColor(int id) { public static PlayerColor getColor(int id) {
switch ((id%6)+1) { switch ((id%6)+1) {
case 1: return PlayerColor.CYAN; case 1: return PlayerColor.CYAN;
@@ -143,6 +159,10 @@ public class Player implements FieldVisitor<Void>{
return fieldID; return fieldID;
} }
/**
* Sets the state of the player to active
* If the player is in jail, the player will be asked to pay the bail
*/
void setActive() { void setActive() {
System.out.println("State: "+state.getClass().getName()); System.out.println("State: "+state.getClass().getName());
if(!(state instanceof JailState)) { if(!(state instanceof JailState)) {
@@ -153,6 +173,11 @@ public class Player implements FieldVisitor<Void>{
} }
} }
/**
* Finish the turn of the player
* If the player has a negative account balance, the player will be bankrupted
* @return true if the turn was finished successfully, false if the player is bankrupt
*/
boolean finishTurn() { boolean finishTurn() {
if(canFinishTurn()) { if(canFinishTurn()) {
if (state instanceof ActiveState) state = new WaitForTurnState(); if (state instanceof ActiveState) state = new WaitForTurnState();
@@ -164,14 +189,26 @@ public class Player implements FieldVisitor<Void>{
} }
} }
/**
* Checks if the player can finish the turn
* @return true if the player can finish the turn, false if the player is bankrupt
*/
boolean canFinishTurn() { boolean canFinishTurn() {
return accountBalance >= 0; return accountBalance >= 0;
} }
/**
* Returns the current state of the player
* @return the current state of the player
*/
public PlayerState getState() { public PlayerState getState() {
return state; return state;
} }
/**
* Sets the state of the player
* @param state the new state of the player
*/
public void setState(PlayerState state) { public void setState(PlayerState state) {
this.state = state; this.state = state;
} }
@@ -206,7 +243,7 @@ public class Player implements FieldVisitor<Void>{
return fieldID; return fieldID;
} }
/** /**
* Sets the player to the specified Position on the board * Sets the player to the specified Position on the board
* @param position the position to move to * @param position the position to move to
* @return the new position * @return the new position
@@ -297,7 +334,7 @@ public class Player implements FieldVisitor<Void>{
/** /**
* Return the number of GEtOutOfJailCards owned by this player * Return the number of GEtOutOfJailCards owned by this player
* @return * @return the number of GetOutOfJailCards owned by this player
*/ */
public int getNumJailCard() { public int getNumJailCard() {
return getOutOfJailCard; return getOutOfJailCard;
@@ -335,7 +372,11 @@ public class Player implements FieldVisitor<Void>{
state.useJailCard(); state.useJailCard();
} }
private void sendRentNotification(String keyword, Player player, int amount) { /**
* Sends a notification to the player
* @param keyword the keyword of the notification
*/
private void sendNotification(String keyword, Player player, int amount) {
NotificationMessage msg = new NotificationMessage(keyword); NotificationMessage msg = new NotificationMessage(keyword);
msg.setRentAmount(amount); msg.setRentAmount(amount);
msg.setRentOwnerId(player.getName()); msg.setRentOwnerId(player.getName());
@@ -351,8 +392,8 @@ public class Player implements FieldVisitor<Void>{
int rent = field.calcRent(); int rent = field.calcRent();
field.getOwner().earnMoney(rent); field.getOwner().earnMoney(rent);
pay(rent); pay(rent);
sendRentNotification("ReceivedRent", field.getOwner(), rent); sendNotification("ReceivedRent", this, rent);
sendRentNotification("rent", this, rent); sendNotification("rent", field.getOwner(), rent);
} }
return null; return null;
} }
@@ -369,8 +410,8 @@ public class Player implements FieldVisitor<Void>{
int rent = rollResult.calcTotal()*factor; int rent = rollResult.calcTotal()*factor;
field.getOwner().earnMoney(rent); field.getOwner().earnMoney(rent);
pay(rent); pay(rent);
sendRentNotification("ReceivedRent", field.getOwner(), rent); sendNotification("ReceivedRent", this, rent);
sendRentNotification("rent", this, rent); sendNotification("rent", field.getOwner(), rent);
} }
return null; return null;
} }
@@ -384,8 +425,8 @@ public class Player implements FieldVisitor<Void>{
field.getOwner().earnMoney(rent); field.getOwner().earnMoney(rent);
pay(rent); pay(rent);
sendRentNotification("ReceivedRent", field.getOwner(), rent); sendNotification("ReceivedRent", this, rent);
sendRentNotification("rent", this, rent); sendNotification("rent", field.getOwner(), rent);
} }
return null; return null;
} }
@@ -450,6 +491,9 @@ public class Player implements FieldVisitor<Void>{
handler.getLogic().send(this, new JailEvent(true)); handler.getLogic().send(this, new JailEvent(true));
} }
/**
* Sends the player to jail by setting position and state.
*/
void jail() { void jail() {
state = new JailState(); state = new JailState();
fieldID = 10; fieldID = 10;
@@ -473,6 +517,10 @@ public class Player implements FieldVisitor<Void>{
return count; return count;
} }
/**
* Return the number of Houses owned by the player
* @return the number of houses owned by the player
*/
public int getNumHouses() { public int getNumHouses() {
int total = 0; int total = 0;
for (PropertyField field : getPropertyFields()) { for (PropertyField field : getPropertyFields()) {
@@ -483,6 +531,10 @@ public class Player implements FieldVisitor<Void>{
return total; return total;
} }
/**
* Return the number of Hotels owned by the player
* @return the number of hotels owned by the player
*/
public int getNumHotels() { public int getNumHotels() {
int total = 0; int total = 0;
for (PropertyField field : getPropertyFields()) { for (PropertyField field : getPropertyFields()) {
@@ -527,6 +579,9 @@ public class Player implements FieldVisitor<Void>{
return state.rollDice(); return state.rollDice();
} }
/**
* Bankrupts the player by removing all properties and setting the account balance to 0.
*/
private void bankrupt() { private void bankrupt() {
for (PropertyField field : getPropertyFields()) { for (PropertyField field : getPropertyFields()) {
field.setOwner(null); field.setOwner(null);
@@ -654,6 +709,10 @@ public class Player implements FieldVisitor<Void>{
} }
} }
/**
* A class to represent the WaitForTurn PlayerState
* Set when it is not the players turn
*/
private class WaitForTurnState implements PlayerState { private class WaitForTurnState implements PlayerState {
@Override @Override
@@ -676,10 +735,18 @@ public class Player implements FieldVisitor<Void>{
return "Player{name=" + name + ", figure=" + figure + "}"; return "Player{name=" + name + ", figure=" + figure + "}";
} }
/**
* Adds a property to the player
* @param id the id of the property to be added
*/
public void addProperty(Integer id) { public void addProperty(Integer id) {
properties.add(id); properties.add(id);
} }
/**
* Removes a property from the player
* @param id the id of the property to be removed
*/
public void removeProperty(Integer id) { public void removeProperty(Integer id) {
properties.remove(id); properties.remove(id);
} }

View File

@@ -120,7 +120,7 @@ public class PlayerHandler {
* @param index the index of the queue * @param index the index of the queue
* @return the Player at the required index * @return the Player at the required index
*/ */
Player getPlayerAtIndex(int index) { public Player getPlayerAtIndex(int index) {
return players.get(index); return players.get(index);
} }
@@ -172,12 +172,20 @@ public class PlayerHandler {
players.get(0).setActive(); players.get(0).setActive();
} }
/**
* Sets the starting balance for all players
* @param amount the amount to be set
*/
public void setStartBalance(int amount) { public void setStartBalance(int amount) {
for (Player player : players) { for (Player player : players) {
player.setAccountBalance(amount); player.setAccountBalance(amount);
} }
} }
/**
* Sets a player to have an extra turn
* @param player the player to have an extra turn
*/
public void extraTurn(Player player) { public void extraTurn(Player player) {
if (players.contains(player)) extra = player; if (players.contains(player)) extra = player;
} }

View File

@@ -38,15 +38,26 @@ import pp.monopoly.model.fields.PropertyField;
* Manages game states, player interactions, and message handling. * Manages game states, player interactions, and message handling.
*/ */
public class ServerGameLogic implements ClientInterpreter { public class ServerGameLogic implements ClientInterpreter {
/**
* The logger for the ServerGameLogic class.
*/
private static final Logger LOGGER = System.getLogger(ServerGameLogic.class.getName()); private static final Logger LOGGER = System.getLogger(ServerGameLogic.class.getName());
/** The game configuration. */
private final MonopolyConfig config; private final MonopolyConfig config;
/** The player handler for managing players. */
private final PlayerHandler playerHandler = new PlayerHandler(this); private final PlayerHandler playerHandler = new PlayerHandler(this);
/** The sender used to send messages to clients. */
private final ServerSender serverSender; private final ServerSender serverSender;
/** The current state of the game. */
private ServerState state = ServerState.LOBBY; private ServerState state = ServerState.LOBBY;
/** The maximum number of players allowed in the game. */
private static final int MAX_PLAYERS = 6; private static final int MAX_PLAYERS = 6;
/** The board manager for managing the game board. */
private BoardManager boardManager = new BoardManager(); private BoardManager boardManager = new BoardManager();
/** The deck helper for managing card decks. */
private final DeckHelper deckHelper = new DeckHelper(); private final DeckHelper deckHelper = new DeckHelper();
/** The amount of money each player starts with. */
private int startMoney; private int startMoney;
/** /**
@@ -383,10 +394,21 @@ public class ServerGameLogic implements ClientInterpreter {
return boardManager; return boardManager;
} }
/**
* Retrieves the player handler, which manages player actions and turns.
*
* @param id the id of the player to retrieve
* @return the PlayerHandler instance managing players
*/
public Player getPlayerById(int id) { public Player getPlayerById(int id) {
return playerHandler.getPlayerById(id); return playerHandler.getPlayerById(id);
} }
/**
* Retrieves the deck helper, which manages decks of cards.
*
* @return the deck helper
*/
public DeckHelper getDeckHelper() { public DeckHelper getDeckHelper() {
return deckHelper; return deckHelper;
} }
@@ -452,6 +474,9 @@ public class ServerGameLogic implements ClientInterpreter {
updateAllPlayers(); updateAllPlayers();
} }
/**
* Generates a predefined game state for testing and demo purposes.
*/
private void generatePredefinedGameState() { private void generatePredefinedGameState() {
if(playerHandler.getPlayerCount() < 2) { if(playerHandler.getPlayerCount() < 2) {

View File

@@ -4,14 +4,24 @@ import java.util.Set;
import com.jme3.network.serializing.Serializable; import com.jme3.network.serializing.Serializable;
/**
* Sent by the client to the server to alter the properties of a field.
*/
@Serializable @Serializable
public class AlterProperty extends ClientMessage{ public class AlterProperty extends ClientMessage{
/** The keyword to indicate what action should be performed */
private String keyword; private String keyword;
/** The properties that should be altered */
private Set<Integer> properties; private Set<Integer> properties;
/** No-Args Construcotr for serilization */
private AlterProperty() {} private AlterProperty() {}
/**
* Create a new AlterProperty message.
* @param keyword The keyword to indicate what action should be performed
*/
public AlterProperty(String keyword) { public AlterProperty(String keyword) {
this.keyword = keyword; this.keyword = keyword;
} }
@@ -21,14 +31,26 @@ public class AlterProperty extends ClientMessage{
interpreter.received(this, from); interpreter.received(this, from);
} }
/**
* Returns the keyword to indicate what action should be performed.
* @return keyword The keyword to indicate what action should be performed
*/
public String getKeyword() { public String getKeyword() {
return keyword; return keyword;
} }
/**
* Sets the properties that should be altered.
* @param properties The properties that should be altered
*/
public void setProperties(Set<Integer> properties) { public void setProperties(Set<Integer> properties) {
this.properties = properties; this.properties = properties;
} }
/**
* Returns the properties that should be altered.
* @return properties The properties that should be altered
*/
public Set<Integer> getProperties() { public Set<Integer> getProperties() {
return properties; return properties;
} }

View File

@@ -2,17 +2,30 @@ package pp.monopoly.message.client;
import com.jme3.network.serializing.Serializable; import com.jme3.network.serializing.Serializable;
/**
* Sent by the client to answer a notification.
*/
@Serializable @Serializable
public class NotificationAnswer extends ClientMessage{ public class NotificationAnswer extends ClientMessage{
/** The keyword to indicate the awnser */
private String keyword; private String keyword;
/** No-Args constructor for serilization */
private NotificationAnswer() {} private NotificationAnswer() {}
/**
* Create a new NotificationAnswer
* @param keyword the keyword to indicate the awnser
*/
public NotificationAnswer(String keyword) { public NotificationAnswer(String keyword) {
this.keyword = keyword; this.keyword = keyword;
} }
/**
* Get the keyword to indicate the awnser
* @return the keyword to indicate the awnser
*/
public String getKeyword() { public String getKeyword() {
return keyword; return keyword;
} }

View File

@@ -31,18 +31,34 @@ public class PlayerReady extends ClientMessage {
this.startMoney = startMoney; this.startMoney = startMoney;
} }
/**
* Returns the name of the player.
* @return the name of the player
*/
public String getName() { public String getName() {
return name; return name;
} }
/**
* Returns the figure of the player.
* @return the figure of the player
*/
public String getFigure() { public String getFigure() {
return figure; return figure;
} }
/**
* Returns whether the player is ready.
* @return whether the player is ready
*/
public boolean isReady() { public boolean isReady() {
return isReady; return isReady;
} }
/**
* Returns the initial capital of the game.
* @return the initial capital of the game
*/
public int getStartMoney() { public int getStartMoney() {
return startMoney; return startMoney;
} }

View File

@@ -25,6 +25,11 @@ public class TradeOffer extends ClientMessage{
this.tradehandler = tradehandler; this.tradehandler = tradehandler;
} }
/**
* Returns the tradehandler.
*
* @return the tradehandler
*/
public TradeHandler getTradeHandler() { return tradehandler; } public TradeHandler getTradeHandler() { return tradehandler; }
@Override @Override

View File

@@ -8,8 +8,10 @@ import com.jme3.network.serializing.Serializable;
@Serializable @Serializable
public class ViewAssetsRequest extends ClientMessage{ public class ViewAssetsRequest extends ClientMessage{
public ViewAssetsRequest() { /**
} * Constructor needed for the serialization.
*/
public ViewAssetsRequest() {}
@Override @Override
public void accept(ClientInterpreter interpreter, int from) { public void accept(ClientInterpreter interpreter, int from) {

View File

@@ -2,26 +2,44 @@ package pp.monopoly.message.server;
import com.jme3.network.serializing.Serializable; import com.jme3.network.serializing.Serializable;
/**
* Sent from server to client to inform about a build action.
*/
@Serializable @Serializable
public class BuildInfo extends ServerMessage { public class BuildInfo extends ServerMessage {
/** Id of the field that was altered */
private final int id; private final int id;
/** True if a house/hotel was added, false if it was removed */
private final boolean added; private final boolean added;
/** No-args constructor required for serialization */
private BuildInfo() { private BuildInfo() {
this(0, false); this(0, false);
} }
/**
* Create a new BuildInfo message.
* @param id Id of the field that was altered
* @param added True if a house/hotel was added, false if it was removed
*/
public BuildInfo(int id, boolean added) { public BuildInfo(int id, boolean added) {
this.id = id; this.id = id;
this.added = added; this.added = added;
} }
/**
* Get the id of the field that was altered.
* @return Id of the field that was altered
*/
public int getId() { public int getId() {
return id; return id;
} }
/**
* Check if a house/hotel was added.
* @return True if a house/hotel was added, false if it was removed
*/
public boolean isAdded() { public boolean isAdded() {
return added; return added;
} }

View File

@@ -2,6 +2,9 @@ package pp.monopoly.message.server;
import com.jme3.network.serializing.Serializable; import com.jme3.network.serializing.Serializable;
/**
* Sent by the server to the client to request the client to show a buy property popup.
*/
@Serializable @Serializable
public class BuyPropertyRequest extends ServerMessage{ public class BuyPropertyRequest extends ServerMessage{

View File

@@ -4,10 +4,15 @@ import java.util.List;
import com.jme3.network.serializing.Serializable; import com.jme3.network.serializing.Serializable;
/**
* Sent by the server to the client to inform the client about the result of a dice roll.
*/
@Serializable @Serializable
public class DiceResult extends ServerMessage{ public class DiceResult extends ServerMessage{
/** The first value of the DiceRoll */
private final int a; private final int a;
/** The second value of the DiceRoll */
private final int b; private final int b;
/** /**
@@ -18,11 +23,20 @@ public class DiceResult extends ServerMessage{
b = 1; b = 1;
} }
/**
* Creates a new DiceResult with the given values.
* @param a The first value of the DiceRoll
* @param b The second value of the DiceRoll
*/
public DiceResult(int a, int b) { public DiceResult(int a, int b) {
this.a = a; this.a = a;
this.b = b; this.b = b;
} }
/**
* Returns the values of the DiceRoll.
* @return The values of the DiceRoll
*/
public List<Integer> getRollResult() { public List<Integer> getRollResult() {
return List.of(a,b); return List.of(a,b);
} }
@@ -32,10 +46,18 @@ public class DiceResult extends ServerMessage{
interpreter.received(this); interpreter.received(this);
} }
/**
* Returns whether the DiceRoll is a doublets.
* @return Whether the DiceRoll is a doublets
*/
public boolean isDoublets() { public boolean isDoublets() {
return a == b; return a == b;
} }
/**
* Returns the total value of the DiceRoll.
* @return The total value of the DiceRoll
*/
public int calcTotal() { public int calcTotal() {
return a+b; return a+b;
} }

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