From 2c1e1ae2fbe3db4319c6aeb494a5f22b910074e8 Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:07:05 -0800 Subject: [PATCH] Spawn the shop npc at the end of a monolith run --- .../emu/nebula/game/tower/StarTowerGame.java | 37 ++++++++++++++++--- .../game/tower/cases/StarTowerBattleCase.java | 16 ++------ .../game/tower/cases/StarTowerHawkerCase.java | 12 ++++++ .../tower/cases/StarTowerPotentialCase.java | 16 ++------ .../game/tower/room/StarTowerHawkerRoom.java | 12 +----- 5 files changed, 53 insertions(+), 40 deletions(-) diff --git a/src/main/java/emu/nebula/game/tower/StarTowerGame.java b/src/main/java/emu/nebula/game/tower/StarTowerGame.java index 03bcd94..19b9e0d 100644 --- a/src/main/java/emu/nebula/game/tower/StarTowerGame.java +++ b/src/main/java/emu/nebula/game/tower/StarTowerGame.java @@ -16,6 +16,8 @@ import emu.nebula.game.player.Player; import emu.nebula.game.player.PlayerChangeInfo; import emu.nebula.game.tower.cases.StarTowerBaseCase; import emu.nebula.game.tower.cases.StarTowerDoorCase; +import emu.nebula.game.tower.cases.StarTowerHawkerCase; +import emu.nebula.game.tower.cases.StarTowerNpcRecoveryHPCase; import emu.nebula.game.tower.cases.StarTowerPotentialCase; import emu.nebula.game.tower.room.RoomType; import emu.nebula.game.tower.room.StarTowerBaseRoom; @@ -403,16 +405,39 @@ public class StarTowerGame { } /** - * Creates a potential selector for the client if there are any potential selectors avaliable. - * If there are none, then return null. + * Creates a potential selectors for the client if there are any potential selectors avaliable. + * If there are none, then create the door case so the player can exit */ - public StarTowerBaseCase handlePendingPotentialSelectors() { + public List handlePendingPotentialSelectors() { + // Create potential selectors if any are avaliable if (this.pendingPotentialCases > 0) { this.pendingPotentialCases--; - return this.createPotentialSelector(); - } else { - return null; + + return List.of(this.createPotentialSelector()); } + + // Return empty list if room already has an exit + if (this.getRoom().hasDoor()) { + return List.of(); + } + + // Init List of next cases + List cases = new ArrayList<>(); + + // Add door case here + cases.add(this.createExit()); + + // Create shop npc if this is the last room + if (this.isOnFinalFloor()) { + // Create hawker case (shop) + cases.add(new StarTowerHawkerCase(this)); + } else if (this.getRoom() instanceof StarTowerBattleRoom) { + // Create recovery npc + cases.add(new StarTowerNpcRecoveryHPCase()); + } + + // Complete + return cases; } /** diff --git a/src/main/java/emu/nebula/game/tower/cases/StarTowerBattleCase.java b/src/main/java/emu/nebula/game/tower/cases/StarTowerBattleCase.java index 8194f52..e5f74d0 100644 --- a/src/main/java/emu/nebula/game/tower/cases/StarTowerBattleCase.java +++ b/src/main/java/emu/nebula/game/tower/cases/StarTowerBattleCase.java @@ -3,7 +3,6 @@ package emu.nebula.game.tower.cases; import emu.nebula.GameConstants; import emu.nebula.data.GameData; import emu.nebula.game.player.PlayerChangeInfo; -import emu.nebula.game.tower.room.StarTowerBattleRoom; import emu.nebula.proto.PublicStarTower.StarTowerRoomCase; import emu.nebula.proto.StarTowerInteract.StarTowerInteractReq; import emu.nebula.proto.StarTowerInteract.StarTowerInteractResp; @@ -85,17 +84,10 @@ public class StarTowerBattleCase extends StarTowerBaseCase { this.getGame().addItem(GameConstants.STAR_TOWER_GOLD_ITEM_ID, money, change); // Handle pending potential selectors - var potentialCase = this.getGame().handlePendingPotentialSelectors(); - if (potentialCase != null) { - // Create potential selector - this.getGame().addCase(rsp.getMutableCases(), potentialCase); - } else if (!this.getRoom().hasDoor()) { - // Add door case here if door hasn't opened yet - this.getGame().createExit(rsp.getMutableCases()); - // Create recovery npc - if (this.getRoom() instanceof StarTowerBattleRoom) { - this.getRoom().addCase(rsp.getMutableCases(), new StarTowerNpcRecoveryHPCase()); - } + var nextCases = this.getGame().handlePendingPotentialSelectors(); + + for (var towerCase : nextCases) { + this.getGame().addCase(rsp.getMutableCases(), towerCase); } // Add sub note skills diff --git a/src/main/java/emu/nebula/game/tower/cases/StarTowerHawkerCase.java b/src/main/java/emu/nebula/game/tower/cases/StarTowerHawkerCase.java index 171077f..5f8b399 100644 --- a/src/main/java/emu/nebula/game/tower/cases/StarTowerHawkerCase.java +++ b/src/main/java/emu/nebula/game/tower/cases/StarTowerHawkerCase.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.Map; import emu.nebula.GameConstants; +import emu.nebula.game.tower.StarTowerGame; import emu.nebula.game.tower.StarTowerShopGoods; import emu.nebula.proto.PublicStarTower.HawkerGoods; import emu.nebula.proto.PublicStarTower.StarTowerRoomCase; @@ -18,6 +19,17 @@ public class StarTowerHawkerCase extends StarTowerBaseCase { public StarTowerHawkerCase() { this.goods = new HashMap<>(); } + + public StarTowerHawkerCase(StarTowerGame game) { + this(); + + // Create shop goods + for (int i = 0; i < 6; i++) { + this.addGoods(new StarTowerShopGoods(1, 1, 200)); + } + + // TODO apply discounts based on star tower talents + } @Override public CaseType getType() { diff --git a/src/main/java/emu/nebula/game/tower/cases/StarTowerPotentialCase.java b/src/main/java/emu/nebula/game/tower/cases/StarTowerPotentialCase.java index f06ea70..a883182 100644 --- a/src/main/java/emu/nebula/game/tower/cases/StarTowerPotentialCase.java +++ b/src/main/java/emu/nebula/game/tower/cases/StarTowerPotentialCase.java @@ -1,6 +1,5 @@ package emu.nebula.game.tower.cases; -import emu.nebula.game.tower.room.StarTowerBattleRoom; import emu.nebula.proto.PublicStarTower.PotentialInfo; import emu.nebula.proto.PublicStarTower.StarTowerRoomCase; import emu.nebula.proto.StarTowerInteract.StarTowerInteractReq; @@ -51,17 +50,10 @@ public class StarTowerPotentialCase extends StarTowerBaseCase { rsp.setChange(change.toProto()); // Handle pending potential selectors - var potentialCase = this.getGame().handlePendingPotentialSelectors(); - if (potentialCase != null) { - // Create potential selector - this.getGame().addCase(rsp.getMutableCases(), potentialCase); - } else if (!this.getRoom().hasDoor()) { - // Add door case here if door hasn't opened yet - this.getGame().createExit(rsp.getMutableCases()); - // Create recovery npc - if (this.getRoom() instanceof StarTowerBattleRoom) { - this.getRoom().addCase(rsp.getMutableCases(), new StarTowerNpcRecoveryHPCase()); - } + var nextCases = this.getGame().handlePendingPotentialSelectors(); + + for (var towerCase : nextCases) { + this.getGame().addCase(rsp.getMutableCases(), towerCase); } return rsp; diff --git a/src/main/java/emu/nebula/game/tower/room/StarTowerHawkerRoom.java b/src/main/java/emu/nebula/game/tower/room/StarTowerHawkerRoom.java index e587e36..2e4e144 100644 --- a/src/main/java/emu/nebula/game/tower/room/StarTowerHawkerRoom.java +++ b/src/main/java/emu/nebula/game/tower/room/StarTowerHawkerRoom.java @@ -2,7 +2,6 @@ package emu.nebula.game.tower.room; import emu.nebula.data.resources.StarTowerStageDef; import emu.nebula.game.tower.StarTowerGame; -import emu.nebula.game.tower.StarTowerShopGoods; import emu.nebula.game.tower.cases.StarTowerHawkerCase; import emu.nebula.game.tower.cases.StarTowerSyncHPCase; import lombok.Getter; @@ -16,15 +15,8 @@ public class StarTowerHawkerRoom extends StarTowerBaseRoom { @Override public void onEnter() { - // Create hawker case - var hawker = new StarTowerHawkerCase(); - - // TODO - for (int i = 0; i < 8; i++) { - hawker.addGoods(new StarTowerShopGoods(1, 1, 200)); - } - - this.getGame().addCase(hawker); + // Create hawker case (shop) + this.getGame().addCase(new StarTowerHawkerCase(this.getGame())); // Create door case this.getGame().createExit();