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

View File

@@ -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<StarTowerBaseCase> 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<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;
}
/**

View File

@@ -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

View File

@@ -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() {

View File

@@ -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;

View File

@@ -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();