Skip to content

Commit 0ca2833

Browse files
Refac
1 parent 03fb3b5 commit 0ca2833

File tree

8 files changed

+129
-99
lines changed

8 files changed

+129
-99
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/*
2+
Copyright (c) 2021-2025 Armin Reichert (MIT License)
3+
See file LICENSE in repository root directory for details.
4+
*/
5+
package de.amr.pacmanfx.tengen.ms_pacman;
6+
7+
import de.amr.pacmanfx.controller.GameState;
8+
import de.amr.pacmanfx.tengen.ms_pacman.model.PacBooster;
9+
import de.amr.pacmanfx.tengen.ms_pacman.model.TengenMsPacMan_GameModel;
10+
import de.amr.pacmanfx.tengen.ms_pacman.scenes.SceneDisplayMode;
11+
import de.amr.pacmanfx.ui.AbstractGameAction;
12+
import de.amr.pacmanfx.ui.api.GameUI;
13+
14+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_Properties.PROPERTY_JOYPAD_BINDINGS_DISPLAYED;
15+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_Properties.PROPERTY_PLAY_SCENE_DISPLAY_MODE;
16+
import static de.amr.pacmanfx.ui.api.GameUI_Config.SCENE_ID_PLAY_SCENE_2D;
17+
import static de.amr.pacmanfx.uilib.Ufx.toggle;
18+
19+
public interface TengenMsPacMan_Actions {
20+
21+
AbstractGameAction ACTION_ENTER_START_SCREEN = new AbstractGameAction("ENTER_START_SCREEN") {
22+
@Override
23+
public void execute(GameUI ui) {
24+
ui.gameContext().theGameController().changeGameState(GameState.SETTING_OPTIONS_FOR_START);
25+
}
26+
};
27+
28+
AbstractGameAction ACTION_QUIT_DEMO_LEVEL = new AbstractGameAction("QUIT_DEMO_LEVEL") {
29+
@Override
30+
public void execute(GameUI ui) {
31+
ui.gameContext().theGameController().changeGameState(GameState.SETTING_OPTIONS_FOR_START);
32+
}
33+
34+
@Override
35+
public boolean isEnabled(GameUI ui) {
36+
return ui.gameContext().optGameLevel().isPresent() && ui.gameContext().theGameLevel().isDemoLevel();
37+
}
38+
};
39+
40+
AbstractGameAction ACTION_START_PLAYING = new AbstractGameAction("START_PLAYING") {
41+
@Override
42+
public void execute(GameUI ui) {
43+
ui.soundManager().stopAll();
44+
ui.gameContext().theGame().playingProperty().set(false);
45+
ui.gameContext().theGameController().changeGameState(GameState.STARTING_GAME);
46+
}
47+
};
48+
49+
AbstractGameAction ACTION_TOGGLE_PLAY_SCENE_DISPLAY_MODE = new AbstractGameAction("TOGGLE_PLAY_SCENE_DISPLAY_MODE") {
50+
@Override
51+
public void execute(GameUI ui) {
52+
SceneDisplayMode mode = PROPERTY_PLAY_SCENE_DISPLAY_MODE.get();
53+
PROPERTY_PLAY_SCENE_DISPLAY_MODE.set(mode == SceneDisplayMode.SCROLLING
54+
? SceneDisplayMode.SCALED_TO_FIT
55+
: SceneDisplayMode.SCROLLING);
56+
}
57+
58+
@Override
59+
public boolean isEnabled(GameUI ui) {
60+
return ui.isCurrentGameSceneID(SCENE_ID_PLAY_SCENE_2D);
61+
}
62+
};
63+
64+
AbstractGameAction ACTION_TOGGLE_JOYPAD_BINDINGS_DISPLAY = new AbstractGameAction("TOGGLE_JOYPAD_BINDINGS_DISPLAYED") {
65+
@Override
66+
public void execute(GameUI ui) {
67+
toggle(PROPERTY_JOYPAD_BINDINGS_DISPLAYED);
68+
}
69+
};
70+
71+
AbstractGameAction ACTION_TOGGLE_PAC_BOOSTER = new AbstractGameAction("TOGGLE_PAC_BOOSTER") {
72+
@Override
73+
public void execute(GameUI ui) {
74+
var gameModel = ui.gameContext().<TengenMsPacMan_GameModel>theGame();
75+
gameModel.activatePacBooster(!gameModel.isBoosterActive());
76+
if (gameModel.isBoosterActive()) {
77+
ui.showFlashMessage("Booster!");
78+
}
79+
}
80+
81+
@Override
82+
public boolean isEnabled(GameUI ui) {
83+
var gameModel = ui.gameContext().<TengenMsPacMan_GameModel>theGame();
84+
return gameModel.pacBooster() == PacBooster.USE_A_OR_B;
85+
}
86+
};
87+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
Copyright (c) 2021-2025 Armin Reichert (MIT License)
3+
See file LICENSE in repository root directory for details.
4+
*/
5+
package de.amr.pacmanfx.tengen.ms_pacman;
6+
7+
import de.amr.pacmanfx.tengen.ms_pacman.scenes.SceneDisplayMode;
8+
import javafx.beans.property.BooleanProperty;
9+
import javafx.beans.property.ObjectProperty;
10+
import javafx.beans.property.SimpleBooleanProperty;
11+
import javafx.beans.property.SimpleObjectProperty;
12+
13+
public interface TengenMsPacMan_Properties {
14+
BooleanProperty PROPERTY_JOYPAD_BINDINGS_DISPLAYED = new SimpleBooleanProperty(false);
15+
ObjectProperty<SceneDisplayMode> PROPERTY_PLAY_SCENE_DISPLAY_MODE = new SimpleObjectProperty<>(SceneDisplayMode.SCROLLING);
16+
}

pacman-app-tengen-mspacman/src/main/java/de/amr/pacmanfx/tengen/ms_pacman/TengenMsPacMan_UIConfig.java

Lines changed: 2 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,10 @@
1515
import de.amr.pacmanfx.lib.tilemap.WorldMap;
1616
import de.amr.pacmanfx.model.actors.Ghost;
1717
import de.amr.pacmanfx.model.actors.Pac;
18-
import de.amr.pacmanfx.tengen.ms_pacman.model.PacBooster;
1918
import de.amr.pacmanfx.tengen.ms_pacman.model.TengenMsPacMan_GameModel;
2019
import de.amr.pacmanfx.tengen.ms_pacman.model.TengenMsPacMan_MapRepository;
2120
import de.amr.pacmanfx.tengen.ms_pacman.rendering.*;
2221
import de.amr.pacmanfx.tengen.ms_pacman.scenes.*;
23-
import de.amr.pacmanfx.ui.AbstractGameAction;
2422
import de.amr.pacmanfx.ui.ActionBinding;
2523
import de.amr.pacmanfx.ui.GameUI_Implementation;
2624
import de.amr.pacmanfx.ui.api.GameScene;
@@ -36,10 +34,6 @@
3634
import de.amr.pacmanfx.uilib.assets.WorldMapColorScheme;
3735
import de.amr.pacmanfx.uilib.model3D.MsPacMan3D;
3836
import de.amr.pacmanfx.uilib.model3D.MsPacManBody;
39-
import javafx.beans.property.BooleanProperty;
40-
import javafx.beans.property.ObjectProperty;
41-
import javafx.beans.property.SimpleBooleanProperty;
42-
import javafx.beans.property.SimpleObjectProperty;
4337
import javafx.scene.canvas.Canvas;
4438
import javafx.scene.image.Image;
4539
import javafx.scene.input.KeyCode;
@@ -53,11 +47,12 @@
5347
import java.util.stream.Stream;
5448

5549
import static de.amr.pacmanfx.Globals.TS;
50+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_Actions.*;
51+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_Properties.PROPERTY_PLAY_SCENE_DISPLAY_MODE;
5652
import static de.amr.pacmanfx.ui.CommonGameActions.*;
5753
import static de.amr.pacmanfx.ui.api.GameUI_Properties.PROPERTY_3D_ENABLED;
5854
import static de.amr.pacmanfx.ui.api.GameUI_Properties.PROPERTY_CANVAS_BACKGROUND_COLOR;
5955
import static de.amr.pacmanfx.ui.input.Keyboard.*;
60-
import static de.amr.pacmanfx.uilib.Ufx.toggle;
6156
import static java.util.Objects.requireNonNull;
6257

6358
public class TengenMsPacMan_UIConfig implements GameUI_Config {
@@ -86,80 +81,6 @@ public static Color nesPaletteColor(int index) {
8681
return Color.web(NES_Palette.color(index));
8782
}
8883

89-
// Actions specific to Tengen Ms. Pac-Man
90-
91-
//TODO not sure these belong here
92-
public static final BooleanProperty PROPERTY_JOYPAD_BINDINGS_DISPLAYED = new SimpleBooleanProperty(false);
93-
public static final ObjectProperty<SceneDisplayMode> PROPERTY_PLAY_SCENE_DISPLAY_MODE = new SimpleObjectProperty<>(SceneDisplayMode.SCROLLING);
94-
95-
96-
public static final AbstractGameAction ACTION_QUIT_DEMO_LEVEL = new AbstractGameAction("QUIT_DEMO_LEVEL") {
97-
@Override
98-
public void execute(GameUI ui) {
99-
ui.gameContext().theGameController().changeGameState(GameState.SETTING_OPTIONS_FOR_START);
100-
}
101-
102-
@Override
103-
public boolean isEnabled(GameUI ui) {
104-
return ui.gameContext().optGameLevel().isPresent() && ui.gameContext().theGameLevel().isDemoLevel();
105-
}
106-
};
107-
108-
public static final AbstractGameAction ACTION_ENTER_START_SCREEN = new AbstractGameAction("ENTER_START_SCREEN") {
109-
@Override
110-
public void execute(GameUI ui) {
111-
ui.gameContext().theGameController().changeGameState(GameState.SETTING_OPTIONS_FOR_START);
112-
}
113-
};
114-
115-
public static final AbstractGameAction ACTION_START_PLAYING = new AbstractGameAction("START_PLAYING") {
116-
@Override
117-
public void execute(GameUI ui) {
118-
ui.soundManager().stopAll();
119-
ui.gameContext().theGame().playingProperty().set(false);
120-
ui.gameContext().theGameController().changeGameState(GameState.STARTING_GAME);
121-
}
122-
};
123-
124-
public static final AbstractGameAction ACTION_TOGGLE_PLAY_SCENE_DISPLAY_MODE = new AbstractGameAction("TOGGLE_PLAY_SCENE_DISPLAY_MODE") {
125-
@Override
126-
public void execute(GameUI ui) {
127-
SceneDisplayMode mode = PROPERTY_PLAY_SCENE_DISPLAY_MODE.get();
128-
PROPERTY_PLAY_SCENE_DISPLAY_MODE.set(mode == SceneDisplayMode.SCROLLING
129-
? SceneDisplayMode.SCALED_TO_FIT
130-
: SceneDisplayMode.SCROLLING);
131-
}
132-
133-
@Override
134-
public boolean isEnabled(GameUI ui) {
135-
return ui.isCurrentGameSceneID(SCENE_ID_PLAY_SCENE_2D);
136-
}
137-
};
138-
139-
public static final AbstractGameAction ACTION_TOGGLE_JOYPAD_BINDINGS_DISPLAY = new AbstractGameAction("TOGGLE_JOYPAD_BINDINGS_DISPLAYED") {
140-
@Override
141-
public void execute(GameUI ui) {
142-
toggle(PROPERTY_JOYPAD_BINDINGS_DISPLAYED);
143-
}
144-
};
145-
146-
public static final AbstractGameAction ACTION_TOGGLE_PAC_BOOSTER = new AbstractGameAction("TOGGLE_PAC_BOOSTER") {
147-
@Override
148-
public void execute(GameUI ui) {
149-
var gameModel = ui.gameContext().<TengenMsPacMan_GameModel>theGame();
150-
gameModel.activatePacBooster(!gameModel.isBoosterActive());
151-
if (gameModel.isBoosterActive()) {
152-
ui.showFlashMessage("Booster!");
153-
}
154-
}
155-
156-
@Override
157-
public boolean isEnabled(GameUI ui) {
158-
var gameModel = ui.gameContext().<TengenMsPacMan_GameModel>theGame();
159-
return gameModel.pacBooster() == PacBooster.USE_A_OR_B;
160-
}
161-
};
162-
16384
private final GameUI ui;
16485
private final DefaultSoundManager soundManager = new DefaultSoundManager();
16586
private final Map<String, GameScene> scenesByID = new HashMap<>();
@@ -405,10 +326,6 @@ public void createGameScenes() {
405326
scenesByID.put(SCENE_ID_CUT_SCENE_N_2D.formatted(2), new TengenMsPacMan_CutScene2(ui));
406327
scenesByID.put(SCENE_ID_CUT_SCENE_N_2D.formatted(3), new TengenMsPacMan_CutScene3(ui));
407328
scenesByID.put(SCENE_ID_CUT_SCENE_N_2D.formatted(4), new TengenMsPacMan_CutScene4(ui));
408-
409-
//TODO where is the best place to do that?
410-
var playScene2D = (TengenMsPacMan_PlayScene2D) scenesByID.get(SCENE_ID_PLAY_SCENE_2D);
411-
playScene2D.displayModeProperty().bind(PROPERTY_PLAY_SCENE_DISPLAY_MODE);
412329
}
413330

414331
@Override

pacman-app-tengen-mspacman/src/main/java/de/amr/pacmanfx/tengen/ms_pacman/scenes/TengenMsPacMan_CreditsScene.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import de.amr.pacmanfx.ui.api.GameUI;
1212

1313
import static de.amr.pacmanfx.Globals.TS;
14+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_Actions.ACTION_ENTER_START_SCREEN;
1415
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_UIConfig.*;
1516

1617
/**

pacman-app-tengen-mspacman/src/main/java/de/amr/pacmanfx/tengen/ms_pacman/scenes/TengenMsPacMan_IntroScene.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@
3030
import static de.amr.pacmanfx.Globals.*;
3131
import static de.amr.pacmanfx.model.actors.CommonAnimationID.ANIM_GHOST_NORMAL;
3232
import static de.amr.pacmanfx.model.actors.CommonAnimationID.ANIM_PAC_MUNCHING;
33-
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_UIConfig.*;
33+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_Actions.ACTION_ENTER_START_SCREEN;
34+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_Actions.ACTION_TOGGLE_JOYPAD_BINDINGS_DISPLAY;
35+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_Properties.PROPERTY_JOYPAD_BINDINGS_DISPLAYED;
36+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_UIConfig.NES_SIZE_PX;
37+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_UIConfig.nesPaletteColor;
3438
import static de.amr.pacmanfx.tengen.ms_pacman.model.TengenMsPacMan_GameModel.createGhost;
3539
import static de.amr.pacmanfx.tengen.ms_pacman.model.TengenMsPacMan_GameModel.createMsPacMan;
3640
import static de.amr.pacmanfx.tengen.ms_pacman.rendering.TengenMsPacMan_GameRenderer.blueShadedColor;
@@ -148,8 +152,7 @@ public void drawSceneContent() {
148152
}
149153
}
150154

151-
var config = (TengenMsPacMan_UIConfig) ui.currentConfig();
152-
if (config.PROPERTY_JOYPAD_BINDINGS_DISPLAYED.get()) {
155+
if (PROPERTY_JOYPAD_BINDINGS_DISPLAYED.get()) {
153156
renderer().drawJoypadKeyBinding(ui.joypad().currentKeyBinding());
154157
}
155158
}

pacman-app-tengen-mspacman/src/main/java/de/amr/pacmanfx/tengen/ms_pacman/scenes/TengenMsPacMan_OptionsScene.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
import javafx.scene.text.Font;
2727

2828
import static de.amr.pacmanfx.Globals.TS;
29+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_Actions.ACTION_START_PLAYING;
30+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_Actions.ACTION_TOGGLE_JOYPAD_BINDINGS_DISPLAY;
31+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_Properties.PROPERTY_JOYPAD_BINDINGS_DISPLAYED;
2932
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_UIConfig.*;
3033
import static de.amr.pacmanfx.ui.CommonGameActions.*;
3134
import static de.amr.pacmanfx.ui.input.Keyboard.alt;
@@ -245,8 +248,7 @@ public void drawSceneContent() {
245248
renderer().ctx().setFont(scaledArcadeFont8());
246249
renderer().drawVerticalSceneBorders();
247250

248-
var config = ui.<TengenMsPacMan_UIConfig>currentConfig();
249-
if (config.PROPERTY_JOYPAD_BINDINGS_DISPLAYED.get()) {
251+
if (PROPERTY_JOYPAD_BINDINGS_DISPLAYED.get()) {
250252
renderer().drawJoypadKeyBinding(ui.joypad().currentKeyBinding());
251253
}
252254

pacman-app-tengen-mspacman/src/main/java/de/amr/pacmanfx/tengen/ms_pacman/scenes/TengenMsPacMan_PlayScene2D.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@
4747
import static de.amr.pacmanfx.Globals.*;
4848
import static de.amr.pacmanfx.controller.GameState.TESTING_LEVELS_MEDIUM;
4949
import static de.amr.pacmanfx.controller.GameState.TESTING_LEVELS_SHORT;
50-
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_UIConfig.*;
50+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_Actions.*;
51+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_Properties.PROPERTY_PLAY_SCENE_DISPLAY_MODE;
52+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_UIConfig.NES_SIZE_PX;
53+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_UIConfig.NES_TILES;
5154
import static de.amr.pacmanfx.ui.CommonGameActions.*;
5255
import static de.amr.pacmanfx.ui.api.GameUI_Properties.PROPERTY_MUTED;
5356
import static de.amr.pacmanfx.uilib.Ufx.createContextMenuTitle;
@@ -78,6 +81,8 @@ public class TengenMsPacMan_PlayScene2D extends GameScene2D {
7881
public TengenMsPacMan_PlayScene2D(GameUI ui) {
7982
super(ui);
8083

84+
displayModeProperty().bind(PROPERTY_PLAY_SCENE_DISPLAY_MODE);
85+
8186
// use own canvas, not the shared canvas from the game view
8287
canvas = new Canvas();
8388
canvas.widthProperty() .bind(scalingProperty().multiply(UNSCALED_CANVAS_WIDTH));
@@ -182,26 +187,25 @@ private void handlePlaySceneDisplayModeChange(
182187

183188
@Override
184189
public List<MenuItem> supplyContextMenuItems(ContextMenuEvent menuEvent, ContextMenu menu) {
185-
var config = ui.<TengenMsPacMan_UIConfig>currentConfig();
186-
SceneDisplayMode displayMode = config.PROPERTY_PLAY_SCENE_DISPLAY_MODE.get();
190+
SceneDisplayMode displayMode = PROPERTY_PLAY_SCENE_DISPLAY_MODE.get();
187191

188192
miScaledToFit = new RadioMenuItem(ui.assets().translated("scaled_to_fit"));
189193
miScaledToFit.setSelected(displayMode == SceneDisplayMode.SCALED_TO_FIT);
190-
miScaledToFit.setOnAction(e -> config.PROPERTY_PLAY_SCENE_DISPLAY_MODE.set(SceneDisplayMode.SCALED_TO_FIT));
194+
miScaledToFit.setOnAction(e -> PROPERTY_PLAY_SCENE_DISPLAY_MODE.set(SceneDisplayMode.SCALED_TO_FIT));
191195

192196
miScrolling = new RadioMenuItem(ui.assets().translated("scrolling"));
193197
miScrolling.setSelected(displayMode == SceneDisplayMode.SCROLLING);
194-
miScrolling.setOnAction(e -> config.PROPERTY_PLAY_SCENE_DISPLAY_MODE.set(SceneDisplayMode.SCROLLING));
198+
miScrolling.setOnAction(e -> PROPERTY_PLAY_SCENE_DISPLAY_MODE.set(SceneDisplayMode.SCROLLING));
195199

196200
toggleGroup = new ToggleGroup();
197201
miScaledToFit.setToggleGroup(toggleGroup);
198202
miScrolling.setToggleGroup(toggleGroup);
199203

200-
config.PROPERTY_PLAY_SCENE_DISPLAY_MODE.addListener(this::handlePlaySceneDisplayModeChange);
204+
PROPERTY_PLAY_SCENE_DISPLAY_MODE.addListener(this::handlePlaySceneDisplayModeChange);
201205
Logger.info("Added listener to config propertyPlaySceneDisplayMode property");
202206
//TODO might interfere with onHidden event handler set elsewhere on this menu
203207
menu.setOnHidden(e -> {
204-
config.PROPERTY_PLAY_SCENE_DISPLAY_MODE.removeListener(this::handlePlaySceneDisplayModeChange);
208+
PROPERTY_PLAY_SCENE_DISPLAY_MODE.removeListener(this::handlePlaySceneDisplayModeChange);
205209
Logger.info("Removed listener from config propertyPlaySceneDisplayMode property");
206210
});
207211

pacman-app-tengen-mspacman/src/main/java/de/amr/pacmanfx/tengen/ms_pacman/scenes/TengenMsPacMan_PlayScene3D.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
import de.amr.pacmanfx.ui.api.GameUI;
1313
import javafx.scene.paint.Color;
1414

15-
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_UIConfig.ACTION_QUIT_DEMO_LEVEL;
16-
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_UIConfig.ACTION_TOGGLE_PAC_BOOSTER;
15+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_Actions.ACTION_QUIT_DEMO_LEVEL;
16+
import static de.amr.pacmanfx.tengen.ms_pacman.TengenMsPacMan_Actions.ACTION_TOGGLE_PAC_BOOSTER;
1717
import static de.amr.pacmanfx.ui.CommonGameActions.*;
1818

1919
/**

0 commit comments

Comments
 (0)