From 466eab940195a1e16eb0760222164d0f5def8542 Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Mon, 3 Nov 2025 15:26:40 -0800 Subject: [PATCH] Implement monolith settle --- .../nebula/data/resources/StarTowerDef.java | 9 +++ .../emu/nebula/game/tower/StarTowerGame.java | 55 ++++++++++++++----- .../nebula/game/tower/StarTowerManager.java | 10 ++-- .../handlers/HandlerStarTowerGiveUpReq.java | 2 +- 4 files changed, 56 insertions(+), 20 deletions(-) diff --git a/src/main/java/emu/nebula/data/resources/StarTowerDef.java b/src/main/java/emu/nebula/data/resources/StarTowerDef.java index 43fdd30..6b0b008 100644 --- a/src/main/java/emu/nebula/data/resources/StarTowerDef.java +++ b/src/main/java/emu/nebula/data/resources/StarTowerDef.java @@ -1,5 +1,7 @@ package emu.nebula.data.resources; +import java.util.Arrays; + import emu.nebula.data.BaseDef; import emu.nebula.data.ResourceType; import lombok.Getter; @@ -10,6 +12,8 @@ public class StarTowerDef extends BaseDef { private int Id; private int[] FloorNum; + private transient int maxFloors; + @Override public int getId() { return Id; @@ -24,4 +28,9 @@ public class StarTowerDef extends BaseDef { return this.FloorNum[index]; } + + @Override + public void onLoad() { + this.maxFloors = Arrays.stream(this.FloorNum).reduce(0, Integer::sum); + } } diff --git a/src/main/java/emu/nebula/game/tower/StarTowerGame.java b/src/main/java/emu/nebula/game/tower/StarTowerGame.java index 551a873..1fb55b3 100644 --- a/src/main/java/emu/nebula/game/tower/StarTowerGame.java +++ b/src/main/java/emu/nebula/game/tower/StarTowerGame.java @@ -35,7 +35,8 @@ public class StarTowerGame { private int id; // Room - private int stage; + private int stageNum; + private int stageFloor; private int floor; private int mapId; private int mapTableId; @@ -93,7 +94,8 @@ public class StarTowerGame { this.formationId = req.getFormationId(); this.buildId = Snowflake.newUid(); this.teamLevel = 1; - this.stage = 1; + this.stageNum = 1; + this.stageFloor = 1; this.floor = 1; this.charHp = -1; this.chars = new ArrayList<>(); @@ -145,7 +147,7 @@ public class StarTowerGame { // Debug var doorCase = this.addCase(new StarTowerCase(CaseType.OpenDoor)); - doorCase.setFloorId(this.getFloor() + 1); + doorCase.setFloorId(this.getStageFloor() + 1); var nextStage = this.getNextStageData(); if (nextStage != null) { @@ -171,10 +173,10 @@ public class StarTowerGame { } public StarTowerStageDef getNextStageData() { - int stage = this.stage; - int floor = this.floor + 1; + int stage = this.stageNum; + int floor = this.stageFloor + 1; - if (floor >= this.getData().getMaxFloor(this.getStage())) { + if (floor >= this.getData().getMaxFloor(this.getStageNum())) { floor = 1; stage++; } @@ -353,6 +355,7 @@ public class StarTowerGame { // Add any items var data = rsp.getMutableData(); + if (this.getNewInfos().size() > 0) { // Add item protos for (var entry : this.getNewInfos()) { @@ -451,17 +454,25 @@ public class StarTowerGame { this.mapTableId = proto.getMapTableId(); this.mapParam = proto.getMapParam(); this.paramId = proto.getParamId(); - - // Next floor this.floor++; - if (this.floor >= this.getData().getMaxFloor(this.getStage())) { - this.floor = 1; - this.stage++; + // Check if we need to settle + if (this.floor > this.getData().getMaxFloors()) { + return this.settle(rsp); + } + + // Next floor + int nextFloor = this.stageFloor + 1; + + if (this.stageFloor >= this.getData().getMaxFloor(this.getStageNum())) { + this.stageFloor = 1; + this.stageNum++; + } else { + this.stageFloor = nextFloor; } // Calculate stage - var stageData = this.getStageData(this.getStage(), this.getFloor()); + var stageData = this.getStageData(this.getStageNum(), this.getStageFloor()); if (stageData != null) { this.roomType = stageData.getRoomType(); @@ -491,7 +502,7 @@ public class StarTowerGame { room.setData(this.toRoomDataProto()); // Handle room type TODO - if (this.roomType <= StarTowerRoomType.EliteBattleRoom.getValue()) { + if (this.roomType <= StarTowerRoomType.FinalBossRoom.getValue()) { var battleCase = new StarTowerCase(CaseType.Battle); battleCase.setSubNoteSkillNum(Utils.randomRange(1, 3)); @@ -517,6 +528,22 @@ public class StarTowerGame { return rsp; } + public StarTowerInteractResp settle(StarTowerInteractResp rsp) { + // End game + this.getManager().endGame(); + + // Settle info + var settle = rsp.getMutableSettle() + .setTotalTime(this.getBattleTime()) + .setBuild(this.getBuild().toProto()); + + // Mark change info + settle.getMutableChange(); + + // Complete + return rsp; + } + // Proto public StarTowerInfo toProto() { @@ -563,7 +590,7 @@ public class StarTowerGame { public StarTowerRoomData toRoomDataProto() { var proto = StarTowerRoomData.newInstance() - .setFloor(this.getFloor()) + .setFloor(this.getStageFloor()) .setMapId(this.getMapId()) .setRoomType(this.getRoomType()) .setMapTableId(this.getMapTableId()); diff --git a/src/main/java/emu/nebula/game/tower/StarTowerManager.java b/src/main/java/emu/nebula/game/tower/StarTowerManager.java index 73bbb7b..3116242 100644 --- a/src/main/java/emu/nebula/game/tower/StarTowerManager.java +++ b/src/main/java/emu/nebula/game/tower/StarTowerManager.java @@ -77,19 +77,19 @@ public class StarTowerManager extends PlayerManager implements GameDatabaseObjec return this.game; } - public StarTowerGame giveUp() { + public StarTowerGame endGame() { // Cache instance - var instance = this.game; + var game = this.game; - if (instance != null) { + if (game != null) { // Set last build - this.lastBuild = instance.getBuild(); + this.lastBuild = game.getBuild(); // Clear instance this.game = null; } - return instance; + return game; } public boolean saveBuild(boolean delete, String name, boolean lock) { diff --git a/src/main/java/emu/nebula/server/handlers/HandlerStarTowerGiveUpReq.java b/src/main/java/emu/nebula/server/handlers/HandlerStarTowerGiveUpReq.java index 05dedce..760f76b 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerStarTowerGiveUpReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerStarTowerGiveUpReq.java @@ -11,7 +11,7 @@ public class HandlerStarTowerGiveUpReq extends NetHandler { @Override public byte[] handle(GameSession session, byte[] message) throws Exception { - var game = session.getPlayer().getStarTowerManager().giveUp(); + var game = session.getPlayer().getStarTowerManager().endGame(); if (game == null) { return session.encodeMsg(NetMsgId.star_tower_give_up_failed_ack);