Spawn the shop npc at the end of a monolith run

This commit is contained in:
Melledy
2025-12-03 12:07:05 -08:00
parent e3d34bfa48
commit 2c1e1ae2fb
5 changed files with 53 additions and 40 deletions
@@ -16,6 +16,8 @@ import emu.nebula.game.player.Player;
import emu.nebula.game.player.PlayerChangeInfo; import emu.nebula.game.player.PlayerChangeInfo;
import emu.nebula.game.tower.cases.StarTowerBaseCase; import emu.nebula.game.tower.cases.StarTowerBaseCase;
import emu.nebula.game.tower.cases.StarTowerDoorCase; 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.cases.StarTowerPotentialCase;
import emu.nebula.game.tower.room.RoomType; import emu.nebula.game.tower.room.RoomType;
import emu.nebula.game.tower.room.StarTowerBaseRoom; 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. * Creates a potential selectors for the client if there are any potential selectors avaliable.
* If there are none, then return null. * If there are none, then create the door case so the player can exit
*/ */
public StarTowerBaseCase handlePendingPotentialSelectors() { public List<StarTowerBaseCase> handlePendingPotentialSelectors() {
// Create potential selectors if any are avaliable
if (this.pendingPotentialCases > 0) { if (this.pendingPotentialCases > 0) {
this.pendingPotentialCases--; this.pendingPotentialCases--;
return this.createPotentialSelector();
} else { return List.of(this.createPotentialSelector());
return null;
} }
// Return empty list if room already has an exit
if (this.getRoom().hasDoor()) {
return List.of();
}
// Init List of next cases
List<StarTowerBaseCase> 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;
} }
/** /**
@@ -3,7 +3,6 @@ package emu.nebula.game.tower.cases;
import emu.nebula.GameConstants; import emu.nebula.GameConstants;
import emu.nebula.data.GameData; import emu.nebula.data.GameData;
import emu.nebula.game.player.PlayerChangeInfo; import emu.nebula.game.player.PlayerChangeInfo;
import emu.nebula.game.tower.room.StarTowerBattleRoom;
import emu.nebula.proto.PublicStarTower.StarTowerRoomCase; import emu.nebula.proto.PublicStarTower.StarTowerRoomCase;
import emu.nebula.proto.StarTowerInteract.StarTowerInteractReq; import emu.nebula.proto.StarTowerInteract.StarTowerInteractReq;
import emu.nebula.proto.StarTowerInteract.StarTowerInteractResp; 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); this.getGame().addItem(GameConstants.STAR_TOWER_GOLD_ITEM_ID, money, change);
// Handle pending potential selectors // Handle pending potential selectors
var potentialCase = this.getGame().handlePendingPotentialSelectors(); var nextCases = this.getGame().handlePendingPotentialSelectors();
if (potentialCase != null) {
// Create potential selector for (var towerCase : nextCases) {
this.getGame().addCase(rsp.getMutableCases(), potentialCase); this.getGame().addCase(rsp.getMutableCases(), towerCase);
} 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());
}
} }
// Add sub note skills // Add sub note skills
@@ -4,6 +4,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import emu.nebula.GameConstants; import emu.nebula.GameConstants;
import emu.nebula.game.tower.StarTowerGame;
import emu.nebula.game.tower.StarTowerShopGoods; import emu.nebula.game.tower.StarTowerShopGoods;
import emu.nebula.proto.PublicStarTower.HawkerGoods; import emu.nebula.proto.PublicStarTower.HawkerGoods;
import emu.nebula.proto.PublicStarTower.StarTowerRoomCase; import emu.nebula.proto.PublicStarTower.StarTowerRoomCase;
@@ -19,6 +20,17 @@ public class StarTowerHawkerCase extends StarTowerBaseCase {
this.goods = new HashMap<>(); 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 @Override
public CaseType getType() { public CaseType getType() {
return CaseType.Hawker; return CaseType.Hawker;
@@ -1,6 +1,5 @@
package emu.nebula.game.tower.cases; package emu.nebula.game.tower.cases;
import emu.nebula.game.tower.room.StarTowerBattleRoom;
import emu.nebula.proto.PublicStarTower.PotentialInfo; import emu.nebula.proto.PublicStarTower.PotentialInfo;
import emu.nebula.proto.PublicStarTower.StarTowerRoomCase; import emu.nebula.proto.PublicStarTower.StarTowerRoomCase;
import emu.nebula.proto.StarTowerInteract.StarTowerInteractReq; import emu.nebula.proto.StarTowerInteract.StarTowerInteractReq;
@@ -51,17 +50,10 @@ public class StarTowerPotentialCase extends StarTowerBaseCase {
rsp.setChange(change.toProto()); rsp.setChange(change.toProto());
// Handle pending potential selectors // Handle pending potential selectors
var potentialCase = this.getGame().handlePendingPotentialSelectors(); var nextCases = this.getGame().handlePendingPotentialSelectors();
if (potentialCase != null) {
// Create potential selector for (var towerCase : nextCases) {
this.getGame().addCase(rsp.getMutableCases(), potentialCase); this.getGame().addCase(rsp.getMutableCases(), towerCase);
} 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());
}
} }
return rsp; return rsp;
@@ -2,7 +2,6 @@ package emu.nebula.game.tower.room;
import emu.nebula.data.resources.StarTowerStageDef; import emu.nebula.data.resources.StarTowerStageDef;
import emu.nebula.game.tower.StarTowerGame; 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.StarTowerHawkerCase;
import emu.nebula.game.tower.cases.StarTowerSyncHPCase; import emu.nebula.game.tower.cases.StarTowerSyncHPCase;
import lombok.Getter; import lombok.Getter;
@@ -16,15 +15,8 @@ public class StarTowerHawkerRoom extends StarTowerBaseRoom {
@Override @Override
public void onEnter() { public void onEnter() {
// Create hawker case // Create hawker case (shop)
var hawker = new StarTowerHawkerCase(); this.getGame().addCase(new StarTowerHawkerCase(this.getGame()));
// TODO
for (int i = 0; i < 8; i++) {
hawker.addGoods(new StarTowerShopGoods(1, 1, 200));
}
this.getGame().addCase(hawker);
// Create door case // Create door case
this.getGame().createExit(); this.getGame().createExit();