diff --git a/src/main/java/emu/nebula/game/tower/StarTowerGame.java b/src/main/java/emu/nebula/game/tower/StarTowerGame.java index 77322f0..6868609 100644 --- a/src/main/java/emu/nebula/game/tower/StarTowerGame.java +++ b/src/main/java/emu/nebula/game/tower/StarTowerGame.java @@ -76,6 +76,7 @@ public class StarTowerGame { private int pendingPotentialCases = 0; private int pendingSubNotes = 0; + private boolean completed; // Bag private ItemParamMap items; @@ -807,29 +808,20 @@ public class StarTowerGame { } public StarTowerInteractResp settle(StarTowerInteractResp rsp, boolean isWin) { + // Set completed flag + this.completed = true; + // End game - this.getManager().endGame(isWin); + this.getManager().settleGame(isWin); // Settle info var settle = rsp.getMutableSettle() .setTotalTime(this.getBattleTime()) .setBuild(this.getBuild().toProto()); - // Mark change info + // Set empty change info settle.getMutableChange(); - // Log victory - if (isWin) { - // Add star tower history - this.getManager().getPlayer().getProgress().addStarTowerLog(this.getId()); - - // Trigger achievement - var elementType = this.getTeamElement(); - if (elementType != null) { - this.getAchievementManager().trigger(AchievementCondition.TowerClearSpecificCharacterTypeWithTotal, 1, elementType.getValue(), 0); - } - } - // Complete return rsp; } diff --git a/src/main/java/emu/nebula/game/tower/StarTowerManager.java b/src/main/java/emu/nebula/game/tower/StarTowerManager.java index de8a6dc..2229d67 100644 --- a/src/main/java/emu/nebula/game/tower/StarTowerManager.java +++ b/src/main/java/emu/nebula/game/tower/StarTowerManager.java @@ -10,6 +10,7 @@ import emu.nebula.game.player.PlayerManager; import emu.nebula.game.player.PlayerProgress; import emu.nebula.game.quest.QuestCondition; import emu.nebula.proto.StarTowerApply.StarTowerApplyReq; +import emu.nebula.util.Utils; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; @@ -219,7 +220,7 @@ public class StarTowerManager extends PlayerManager { return change.setExtraData(this.game); } - public StarTowerGame endGame(boolean victory) { + public StarTowerGame settleGame(boolean victory) { // Cache instance var game = this.game; @@ -232,27 +233,61 @@ public class StarTowerManager extends PlayerManager { // Handle victory events if (victory) { - // Trigger achievements - this.getPlayer().trigger(AchievementCondition.TowerClearTotal, 1); - this.getPlayer().trigger( + // Add star tower history + this.getPlayer().getProgress().addStarTowerLog(game.getId()); + + // Achievement conditions + var achievements = this.getPlayer().getAchievementManager(); + + achievements.trigger(AchievementCondition.TowerClearTotal, 1); + achievements.trigger( AchievementCondition.TowerClearSpecificGroupIdAndDifficulty, 1, game.getData().getGroupId(), game.getData().getDifficulty() ); - this.getPlayer().trigger( + achievements.trigger( AchievementCondition.TowerClearSpecificLevelWithDifficultyAndTotal, 1, game.getData().getId(), game.getData().getDifficulty() ); + + var elementType = game.getTeamElement(); + if (elementType != null) { + achievements.trigger(AchievementCondition.TowerClearSpecificCharacterTypeWithTotal, 1, elementType.getValue(), 0); + } } + // Return game + return game; + } + + public PlayerChangeInfo addRewards(PlayerChangeInfo change) { + // Create change info + if (change == null) { + change = new PlayerChangeInfo(); + } + + // Get game + var game = this.getGame(); + + if (game == null || !game.isCompleted()) { + return change; + } + + // Add journey tickets + this.getPlayer().getInventory().addItem(12, game.getModifiers().calculateTickets(), change); + + // (Custom) Add research materials since tower quests are not implemented yet + int amount = 50 + (Utils.randomRange(game.getDifficulty() - 1, game.getDifficulty() * 2) * 10); + this.getPlayer().getInventory().addItem(51, amount, change); + // Clear game instance this.game = null; - // Return game - return game; + // Return change info + return change; } // Build @@ -277,8 +312,10 @@ public class StarTowerManager extends PlayerManager { // Create player change info var change = new PlayerChangeInfo(); - // Cache build and clear reference + // Cache build var build = this.lastBuild; + + // Clear reference to build this.lastBuild = null; // Check if the player wants this build or not diff --git a/src/main/java/emu/nebula/game/tower/StarTowerModifiers.java b/src/main/java/emu/nebula/game/tower/StarTowerModifiers.java index 354df15..0fdeaad 100644 --- a/src/main/java/emu/nebula/game/tower/StarTowerModifiers.java +++ b/src/main/java/emu/nebula/game/tower/StarTowerModifiers.java @@ -1,6 +1,7 @@ package emu.nebula.game.tower; import emu.nebula.GameConstants; +import emu.nebula.util.Utils; import lombok.Getter; /** @@ -178,4 +179,27 @@ public class StarTowerModifiers { public void consumeShopReroll() { this.shopRerollCount = Math.max(this.shopRerollCount - 1, 0); } + + /** + * Returns the amount of tickets we earn from completing this monolith + */ + public int calculateTickets() { + // Get base amount + int tickets = 50; + + // Add tickets based on difficulty + tickets += Utils.randomRange(game.getDifficulty() * 50, game.getDifficulty() * 100); + + // Apply talent modifiers + if (this.hasGrowthNode(20403)) { + tickets *= 2; // +100% + } else if (this.hasGrowthNode(20102)) { + tickets *= 1.6; // +60% + } else if (this.hasGrowthNode(10501)) { + tickets *= 1.3; // +30% + } + + // Complete + return tickets; + } } diff --git a/src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildWhetherSaveReq.java b/src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildWhetherSaveReq.java index 71435a9..ae37df5 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildWhetherSaveReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerStarTowerBuildWhetherSaveReq.java @@ -26,6 +26,9 @@ public class HandlerStarTowerBuildWhetherSaveReq extends NetHandler { return session.encodeMsg(NetMsgId.star_tower_build_whether_save_failed_ack); } + // Add rewards from game + session.getPlayer().getStarTowerManager().addRewards(change); + // Build response var rsp = StarTowerBuildWhetherSaveResp.newInstance() .setChange(change.toProto()); diff --git a/src/main/java/emu/nebula/server/handlers/HandlerStarTowerGiveUpReq.java b/src/main/java/emu/nebula/server/handlers/HandlerStarTowerGiveUpReq.java index 5d73e30..44c48dd 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().endGame(false); + var game = session.getPlayer().getStarTowerManager().settleGame(false); if (game == null) { return session.encodeMsg(NetMsgId.star_tower_give_up_failed_ack);