From 2af715477e04d55b3cbb70fd518a2d2bb2feb2a5 Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Mon, 8 Dec 2025 18:01:44 -0800 Subject: [PATCH] Implement random npc event chance in Monoliths --- .../emu/nebula/game/tower/StarTowerGame.java | 11 +++-- .../nebula/game/tower/StarTowerModifiers.java | 10 ++++ .../game/tower/room/StarTowerBaseRoom.java | 46 ++++++++++++++++++- .../game/tower/room/StarTowerEventRoom.java | 44 ------------------ 4 files changed, 63 insertions(+), 48 deletions(-) diff --git a/src/main/java/emu/nebula/game/tower/StarTowerGame.java b/src/main/java/emu/nebula/game/tower/StarTowerGame.java index 65cd444..f654e54 100644 --- a/src/main/java/emu/nebula/game/tower/StarTowerGame.java +++ b/src/main/java/emu/nebula/game/tower/StarTowerGame.java @@ -518,7 +518,7 @@ public class StarTowerGame { cases.add(this.createExit()); // Create shop npc if this is the last room - if (this.isOnFinalFloor()) { + if (this.getRoom().getType() == RoomType.FinalBossRoom) { // Create hawker case (shop) cases.add(new StarTowerHawkerCase()); // Create strengthen machine @@ -526,8 +526,13 @@ public class StarTowerGame { cases.add(new StarTowerStrengthenMachineCase()); } } else if (this.getRoom() instanceof StarTowerBattleRoom) { - // Create recovery npc - cases.add(new StarTowerNpcRecoveryHPCase()); + if (this.getRoom().getType() == RoomType.BattleRoom && Utils.randomChance(this.getModifiers().getBattleNpcEventChance())) { + // Create npc event + cases.add(this.getRoom().createNpcEvent()); + } else { + // Create recovery npc + cases.add(new StarTowerNpcRecoveryHPCase()); + } } // Complete diff --git a/src/main/java/emu/nebula/game/tower/StarTowerModifiers.java b/src/main/java/emu/nebula/game/tower/StarTowerModifiers.java index f7bd476..08feb8d 100644 --- a/src/main/java/emu/nebula/game/tower/StarTowerModifiers.java +++ b/src/main/java/emu/nebula/game/tower/StarTowerModifiers.java @@ -51,6 +51,9 @@ public class StarTowerModifiers { private double bonusCoinChance; private int bonusCoinCount; + // Random npc event + private double battleNpcEventChance; + public StarTowerModifiers(StarTowerGame game) { this.game = game; @@ -184,6 +187,13 @@ public class StarTowerModifiers { this.bonusCoinChance = 0.1; this.bonusCoinCount = 10; } + + // Battle npc event chance (Destiny's Choice) + if (game.getDifficulty() >= 4 && this.hasGrowthNode(20503)) { + this.battleNpcEventChance = 0.3; + } else if (game.getDifficulty() >= 3 && this.hasGrowthNode(10901)) { + this.battleNpcEventChance = 0.2; + } } public boolean hasGrowthNode(int nodeId) { diff --git a/src/main/java/emu/nebula/game/tower/room/StarTowerBaseRoom.java b/src/main/java/emu/nebula/game/tower/room/StarTowerBaseRoom.java index c3f4ebf..adbcc27 100644 --- a/src/main/java/emu/nebula/game/tower/room/StarTowerBaseRoom.java +++ b/src/main/java/emu/nebula/game/tower/room/StarTowerBaseRoom.java @@ -1,16 +1,23 @@ package emu.nebula.game.tower.room; +import java.util.Arrays; +import java.util.Objects; + +import emu.nebula.GameConstants; +import emu.nebula.data.GameData; +import emu.nebula.data.resources.StarTowerEventDef; import emu.nebula.data.resources.StarTowerStageDef; import emu.nebula.game.tower.StarTowerGame; import emu.nebula.game.tower.StarTowerModifiers; import emu.nebula.game.tower.cases.CaseType; import emu.nebula.game.tower.cases.StarTowerBaseCase; +import emu.nebula.game.tower.cases.StarTowerNpcEventCase; import emu.nebula.game.tower.cases.StarTowerSyncHPCase; import emu.nebula.proto.PublicStarTower.InteractEnterReq; import emu.nebula.proto.PublicStarTower.StarTowerRoomCase; import emu.nebula.proto.PublicStarTower.StarTowerRoomData; import emu.nebula.proto.StarTowerApply.StarTowerApplyReq; - +import emu.nebula.util.Utils; import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; @@ -75,6 +82,43 @@ public class StarTowerBaseRoom { this.paramId = req.getParamId(); } + // NPC events + + private StarTowerEventDef getRandomEvent() { + /* + var list = GameData.getStarTowerEventDataTable() + .values() + .stream() + .toList(); + */ + + var list = Arrays.stream(GameConstants.TOWER_EVENTS_IDS) + .mapToObj(GameData.getStarTowerEventDataTable()::get) + .filter(Objects::nonNull) + .toList(); + + if (list.isEmpty()) { + return null; + } + + return Utils.randomElement(list); + } + + public StarTowerBaseCase createNpcEvent() { + // Get random event + var event = this.getRandomEvent(); + + if (event == null) { + return null; + } + + // Get random npc + int npcId = Utils.randomElement(event.getRelatedNPCs()); + + // Create case with event + return new StarTowerNpcEventCase(npcId, event); + } + // Cases public int getNextCaseId() { diff --git a/src/main/java/emu/nebula/game/tower/room/StarTowerEventRoom.java b/src/main/java/emu/nebula/game/tower/room/StarTowerEventRoom.java index 5ecfa65..0702d37 100644 --- a/src/main/java/emu/nebula/game/tower/room/StarTowerEventRoom.java +++ b/src/main/java/emu/nebula/game/tower/room/StarTowerEventRoom.java @@ -1,17 +1,8 @@ package emu.nebula.game.tower.room; -import java.util.Arrays; -import java.util.Objects; - -import emu.nebula.GameConstants; -import emu.nebula.data.GameData; -import emu.nebula.data.resources.StarTowerEventDef; import emu.nebula.data.resources.StarTowerStageDef; import emu.nebula.game.tower.StarTowerGame; -import emu.nebula.game.tower.cases.StarTowerBaseCase; -import emu.nebula.game.tower.cases.StarTowerNpcEventCase; import emu.nebula.game.tower.cases.StarTowerSyncHPCase; -import emu.nebula.util.Utils; import lombok.Getter; @@ -21,41 +12,6 @@ public class StarTowerEventRoom extends StarTowerBaseRoom { public StarTowerEventRoom(StarTowerGame game, StarTowerStageDef stage) { super(game, stage); } - - private StarTowerEventDef getRandomEvent() { - /* - var list = GameData.getStarTowerEventDataTable() - .values() - .stream() - .toList(); - */ - - var list = Arrays.stream(GameConstants.TOWER_EVENTS_IDS) - .mapToObj(GameData.getStarTowerEventDataTable()::get) - .filter(Objects::nonNull) - .toList(); - - if (list.isEmpty()) { - return null; - } - - return Utils.randomElement(list); - } - - public StarTowerBaseCase createNpcEvent() { - // Get random event - var event = this.getRandomEvent(); - - if (event == null) { - return null; - } - - // Get random npc - int npcId = Utils.randomElement(event.getRelatedNPCs()); - - // Create case with event - return new StarTowerNpcEventCase(npcId, event); - } @Override public void onEnter() {