Skip to content

Commit bf67d8f

Browse files
committed
feat(editor): add scene2d compact preset families (v2.0.27)
1 parent f1fcccf commit bf67d8f

4 files changed

Lines changed: 147 additions & 12 deletions

File tree

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@
22

33
All notable changes to this project will be documented in this file.
44

5+
## [2.0.27] - 2026-04-06
6+
7+
### Added
8+
- **Scene2D Compact Preset Families:** `CustomGameEditor.java` now groups starter presets into clearer family rows and adds curated `Sprint Drop`, `Zen Garden`, and `Micro Stack` templates alongside the original presets.
9+
10+
### Changed
11+
- Expanded preset application so the Scene2D editor now seeds gravity, lock delay, and next-piece preview counts more explicitly for each family starter.
12+
- Bumped `VERSION.md` to `2.0.27`.
13+
14+
### Validation
15+
- `./gradlew compileJava`
16+
517
## [2.0.26] - 2026-04-06
618

719
### Added

HANDOFF.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,16 +135,17 @@ This session focused on the newer Scene2D `CustomGameEditor` so the Java port ha
135135
- Expanded block behavior reporting so field-wide consequences appear alongside the existing chain and reward hooks.
136136
- Bumped the Java repo version again to `2.0.24`.
137137

138-
### Additional Follow-Up - 2026-04-06 (Saved Template Slot Summaries)
139-
- Added compact Scene2D preset-slot status rows so each slot now advertises its stored ruleset name, mode, piece count, and rotation count.
140-
- Preset slot saves/loads now refresh a dedicated saved-template summary table, reducing guesswork when juggling multiple rulesets during one editor session.
141-
- Bumped the Java repo version again to `2.0.26`.
138+
### Additional Follow-Up - 2026-04-06 (Compact Preset Families)
139+
- Grouped starter presets into clearer Scene2D family rows for competitive drop, puzzle chainers, and arcade stackers.
140+
- Added new curated family templates: `Sprint Drop`, `Zen Garden`, and `Micro Stack`.
141+
- Expanded preset application so those templates also seed gravity, lock delay, and next-piece preview counts more deliberately.
142+
- Bumped the Java repo version again to `2.0.27`.
142143

143144
### Recommended Next Steps
144145
1. Bridge Scene2D custom editor state into the older TWL editor stack where useful.
145146
2. Replace the temporary reflection bridge with a direct adapter once the exact TWL/LWJGL API contract is fully normalized.
146147
3. Add a targeted Java regression test or smoke harness for nD puzzle bootstrap + editor launch.
147-
4. Consider compact preset families, then later more advanced block-rule depth like multi-step transformation graphs and exploding-block conversion targets.
148+
4. Consider richer saved-template browsing, then later more advanced block-rule depth like multi-step transformation graphs and exploding-block conversion targets.
148149

149150
## Summary
150151
This session focused on modernizing the internal Swing-based Editor tools (`SpriteEditor`, `MapCanvas`, `DialogueEditor`) to include features found in industry-standard tools like Aseprite and Pyxel Edit.

VERSION.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.0.26
1+
2.0.27

src/main/java/com/bobsgame/client/engine/game/gui/customGameEditor/CustomGameEditor.java

Lines changed: 128 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,11 @@ public class CustomGameEditor extends Scene2DPanel {
3434
private final TextButton saveSlot3Btn;
3535
private final TextButton loadSlot3Btn;
3636
private final TextButton presetClassicBtn;
37+
private final TextButton presetSprintBtn;
3738
private final TextButton presetCascadeBtn;
39+
private final TextButton presetZenBtn;
3840
private final TextButton presetStackBtn;
41+
private final TextButton presetMicroBtn;
3942
private final TextButton addBlockBtn;
4043
private final TextButton removeBlockBtn;
4144
private final TextButton prevBlockBtn;
@@ -202,8 +205,11 @@ public CustomGameEditor(Engine engine) {
202205
saveSlot3Btn = new TextButton("Save Slot 3", skin);
203206
loadSlot3Btn = new TextButton("Load Slot 3", skin);
204207
presetClassicBtn = new TextButton("Classic Drop", skin);
208+
presetSprintBtn = new TextButton("Sprint Drop", skin);
205209
presetCascadeBtn = new TextButton("Cascade Puzzle", skin);
210+
presetZenBtn = new TextButton("Zen Garden", skin);
206211
presetStackBtn = new TextButton("Stack Arcade", skin);
212+
presetMicroBtn = new TextButton("Micro Stack", skin);
207213
addBlockBtn = new TextButton("Add Block", skin);
208214
removeBlockBtn = new TextButton("Remove Block", skin);
209215
prevBlockBtn = new TextButton("< Block", skin);
@@ -250,11 +256,23 @@ public CustomGameEditor(Engine engine) {
250256
presetRow.add(importBtn);
251257
presetRow.add(shareBtn);
252258

253-
Table presetQuickRow = new Table();
254-
presetQuickRow.defaults().pad(4);
255-
presetQuickRow.add(presetClassicBtn);
256-
presetQuickRow.add(presetCascadeBtn);
257-
presetQuickRow.add(presetStackBtn);
259+
Label presetCompetitiveLabel = new Label("Preset Family — Competitive Drop", skin);
260+
Table presetCompetitiveRow = new Table();
261+
presetCompetitiveRow.defaults().pad(4);
262+
presetCompetitiveRow.add(presetClassicBtn);
263+
presetCompetitiveRow.add(presetSprintBtn);
264+
265+
Label presetPuzzleLabel = new Label("Preset Family — Puzzle Chainers", skin);
266+
Table presetPuzzleRow = new Table();
267+
presetPuzzleRow.defaults().pad(4);
268+
presetPuzzleRow.add(presetCascadeBtn);
269+
presetPuzzleRow.add(presetZenBtn);
270+
271+
Label presetArcadeLabel = new Label("Preset Family — Arcade Stackers", skin);
272+
Table presetArcadeRow = new Table();
273+
presetArcadeRow.defaults().pad(4);
274+
presetArcadeRow.add(presetStackBtn);
275+
presetArcadeRow.add(presetMicroBtn);
258276

259277
Table presetStatusRow = new Table();
260278
presetStatusRow.defaults().left().pad(4);
@@ -413,18 +431,36 @@ public void clicked(InputEvent event, float x, float y) {
413431
applyPreset("classic");
414432
}
415433
});
434+
presetSprintBtn.addListener(new ClickListener() {
435+
@Override
436+
public void clicked(InputEvent event, float x, float y) {
437+
applyPreset("sprint");
438+
}
439+
});
416440
presetCascadeBtn.addListener(new ClickListener() {
417441
@Override
418442
public void clicked(InputEvent event, float x, float y) {
419443
applyPreset("cascade");
420444
}
421445
});
446+
presetZenBtn.addListener(new ClickListener() {
447+
@Override
448+
public void clicked(InputEvent event, float x, float y) {
449+
applyPreset("zen");
450+
}
451+
});
422452
presetStackBtn.addListener(new ClickListener() {
423453
@Override
424454
public void clicked(InputEvent event, float x, float y) {
425455
applyPreset("stack");
426456
}
427457
});
458+
presetMicroBtn.addListener(new ClickListener() {
459+
@Override
460+
public void clicked(InputEvent event, float x, float y) {
461+
applyPreset("micro");
462+
}
463+
});
428464
addBlockBtn.addListener(new ClickListener() {
429465
@Override
430466
public void clicked(InputEvent event, float x, float y) {
@@ -752,7 +788,12 @@ public void clicked(InputEvent event, float x, float y) {
752788
mainTable.add(titleLabel).left().row();
753789
mainTable.add(hintLabel).width(520).left().row();
754790
mainTable.add(presetRow).left().row();
755-
mainTable.add(presetQuickRow).left().row();
791+
mainTable.add(presetCompetitiveLabel).left().row();
792+
mainTable.add(presetCompetitiveRow).left().row();
793+
mainTable.add(presetPuzzleLabel).left().row();
794+
mainTable.add(presetPuzzleRow).left().row();
795+
mainTable.add(presetArcadeLabel).left().row();
796+
mainTable.add(presetArcadeRow).left().row();
756797
mainTable.add(presetSlotsLabel).left().row();
757798
mainTable.add(presetStatusRow).left().row();
758799
mainTable.add(blockControlsRow1).left().row();
@@ -1152,6 +1193,33 @@ private void applyPreset(String preset) {
11521193
currentGameType.gameMode = GameType.GameMode.DROP;
11531194
currentGameType.gridWidth = 10;
11541195
currentGameType.gridHeight = 20;
1196+
currentGameType.numberOfNextPiecesToShow = 3;
1197+
currentGameType.maxLockDelayTicks = 500;
1198+
currentGameType.gravityRule_ticksToMoveDownBlocksOverBlankSpaces = 100;
1199+
currentGameType.chainRule_AmountPerChain = 4;
1200+
currentGameType.moveDownAllLinesOverBlankSpacesAtOnce = false;
1201+
currentGameType.gravityRule_onlyMoveDownDisconnectedBlocks = false;
1202+
currentGameType.chainRule_CheckRow = true;
1203+
currentGameType.chainRule_CheckColumn = false;
1204+
currentGameType.chainRule_CheckDiagonal = false;
1205+
currentGameType.chainRule_CheckRecursiveConnections = false;
1206+
currentGameType.nextPieceEnabled = true;
1207+
currentGameType.holdPieceEnabled = true;
1208+
currentGameType.currentPieceRule_getNewPiecesRandomlyOutOfBagWithOneOfEachPieceUntilEmpty = true;
1209+
currentGameType.hardDropPunchThroughToLowestValidGridPosition = false;
1210+
currentGameType.twoSpaceWallKickAllowed = true;
1211+
currentGameType.diagonalWallKickAllowed = true;
1212+
currentGameType.pieceClimbingAllowed = true;
1213+
currentGameType.flip180Allowed = true;
1214+
currentGameType.floorKickAllowed = true;
1215+
} else if ("sprint".equals(preset)) {
1216+
currentGameType.name = "Sprint Drop";
1217+
currentGameType.gameMode = GameType.GameMode.DROP;
1218+
currentGameType.gridWidth = 10;
1219+
currentGameType.gridHeight = 20;
1220+
currentGameType.numberOfNextPiecesToShow = 5;
1221+
currentGameType.maxLockDelayTicks = 240;
1222+
currentGameType.gravityRule_ticksToMoveDownBlocksOverBlankSpaces = 40;
11551223
currentGameType.chainRule_AmountPerChain = 4;
11561224
currentGameType.moveDownAllLinesOverBlankSpacesAtOnce = false;
11571225
currentGameType.gravityRule_onlyMoveDownDisconnectedBlocks = false;
@@ -1173,6 +1241,9 @@ private void applyPreset(String preset) {
11731241
currentGameType.gameMode = GameType.GameMode.DROP;
11741242
currentGameType.gridWidth = 8;
11751243
currentGameType.gridHeight = 16;
1244+
currentGameType.numberOfNextPiecesToShow = 3;
1245+
currentGameType.maxLockDelayTicks = 450;
1246+
currentGameType.gravityRule_ticksToMoveDownBlocksOverBlankSpaces = 120;
11761247
currentGameType.chainRule_AmountPerChain = 3;
11771248
currentGameType.moveDownAllLinesOverBlankSpacesAtOnce = true;
11781249
currentGameType.gravityRule_onlyMoveDownDisconnectedBlocks = true;
@@ -1189,11 +1260,62 @@ private void applyPreset(String preset) {
11891260
currentGameType.pieceClimbingAllowed = false;
11901261
currentGameType.flip180Allowed = false;
11911262
currentGameType.floorKickAllowed = false;
1263+
} else if ("zen".equals(preset)) {
1264+
currentGameType.name = "Zen Garden";
1265+
currentGameType.gameMode = GameType.GameMode.DROP;
1266+
currentGameType.gridWidth = 10;
1267+
currentGameType.gridHeight = 18;
1268+
currentGameType.numberOfNextPiecesToShow = 5;
1269+
currentGameType.maxLockDelayTicks = 900;
1270+
currentGameType.gravityRule_ticksToMoveDownBlocksOverBlankSpaces = 220;
1271+
currentGameType.chainRule_AmountPerChain = 4;
1272+
currentGameType.moveDownAllLinesOverBlankSpacesAtOnce = true;
1273+
currentGameType.gravityRule_onlyMoveDownDisconnectedBlocks = false;
1274+
currentGameType.chainRule_CheckRow = true;
1275+
currentGameType.chainRule_CheckColumn = true;
1276+
currentGameType.chainRule_CheckDiagonal = false;
1277+
currentGameType.chainRule_CheckRecursiveConnections = true;
1278+
currentGameType.nextPieceEnabled = true;
1279+
currentGameType.holdPieceEnabled = true;
1280+
currentGameType.currentPieceRule_getNewPiecesRandomlyOutOfBagWithOneOfEachPieceUntilEmpty = true;
1281+
currentGameType.hardDropPunchThroughToLowestValidGridPosition = false;
1282+
currentGameType.twoSpaceWallKickAllowed = false;
1283+
currentGameType.diagonalWallKickAllowed = false;
1284+
currentGameType.pieceClimbingAllowed = false;
1285+
currentGameType.flip180Allowed = true;
1286+
currentGameType.floorKickAllowed = false;
11921287
} else if ("stack".equals(preset)) {
11931288
currentGameType.name = "Stack Arcade";
11941289
currentGameType.gameMode = GameType.GameMode.STACK;
11951290
currentGameType.gridWidth = 6;
11961291
currentGameType.gridHeight = 12;
1292+
currentGameType.numberOfNextPiecesToShow = 3;
1293+
currentGameType.maxLockDelayTicks = 350;
1294+
currentGameType.gravityRule_ticksToMoveDownBlocksOverBlankSpaces = 90;
1295+
currentGameType.chainRule_AmountPerChain = 3;
1296+
currentGameType.moveDownAllLinesOverBlankSpacesAtOnce = false;
1297+
currentGameType.gravityRule_onlyMoveDownDisconnectedBlocks = false;
1298+
currentGameType.chainRule_CheckRow = true;
1299+
currentGameType.chainRule_CheckColumn = true;
1300+
currentGameType.chainRule_CheckDiagonal = false;
1301+
currentGameType.chainRule_CheckRecursiveConnections = false;
1302+
currentGameType.nextPieceEnabled = true;
1303+
currentGameType.holdPieceEnabled = false;
1304+
currentGameType.currentPieceRule_getNewPiecesRandomlyOutOfBagWithOneOfEachPieceUntilEmpty = false;
1305+
currentGameType.hardDropPunchThroughToLowestValidGridPosition = false;
1306+
currentGameType.twoSpaceWallKickAllowed = true;
1307+
currentGameType.diagonalWallKickAllowed = false;
1308+
currentGameType.pieceClimbingAllowed = false;
1309+
currentGameType.flip180Allowed = false;
1310+
currentGameType.floorKickAllowed = false;
1311+
} else if ("micro".equals(preset)) {
1312+
currentGameType.name = "Micro Stack";
1313+
currentGameType.gameMode = GameType.GameMode.STACK;
1314+
currentGameType.gridWidth = 5;
1315+
currentGameType.gridHeight = 10;
1316+
currentGameType.numberOfNextPiecesToShow = 2;
1317+
currentGameType.maxLockDelayTicks = 220;
1318+
currentGameType.gravityRule_ticksToMoveDownBlocksOverBlankSpaces = 70;
11971319
currentGameType.chainRule_AmountPerChain = 3;
11981320
currentGameType.moveDownAllLinesOverBlankSpacesAtOnce = false;
11991321
currentGameType.gravityRule_onlyMoveDownDisconnectedBlocks = false;

0 commit comments

Comments
 (0)