diff --git a/src/main/java/emu/nebula/data/GameData.java b/src/main/java/emu/nebula/data/GameData.java index ce350c5..9b6e8cc 100644 --- a/src/main/java/emu/nebula/data/GameData.java +++ b/src/main/java/emu/nebula/data/GameData.java @@ -113,6 +113,8 @@ public class GameData { @Getter private static DataTable StarTowerDataTable = new DataTable<>(); @Getter private static DataTable StarTowerStageDataTable = new DataTable<>(); @Getter private static DataTable StarTowerGrowthNodeDataTable = new DataTable<>(); + @Getter private static DataTable StarTowerFloorExpDataTable = new DataTable<>(); + @Getter private static DataTable StarTowerTeamExpDataTable = new DataTable<>(); @Getter private static DataTable PotentialDataTable = new DataTable<>(); @Getter private static DataTable SubNoteSkillPromoteGroupDataTable = new DataTable<>(); diff --git a/src/main/java/emu/nebula/data/resources/StarTowerFloorExpDef.java b/src/main/java/emu/nebula/data/resources/StarTowerFloorExpDef.java new file mode 100644 index 0000000..fb5c36e --- /dev/null +++ b/src/main/java/emu/nebula/data/resources/StarTowerFloorExpDef.java @@ -0,0 +1,22 @@ +package emu.nebula.data.resources; + +import emu.nebula.data.BaseDef; +import emu.nebula.data.ResourceType; +import lombok.Getter; + +@Getter +@ResourceType(name = "StarTowerFloorExp.json") +public class StarTowerFloorExpDef extends BaseDef { + private int Id; + private int StarTowerId; + private int Stage; + private int NormalExp; + private int EliteExp; + private int BossExp; + private int FinalBossExp; + + @Override + public int getId() { + return StarTowerId; + } +} diff --git a/src/main/java/emu/nebula/data/resources/StarTowerTeamExpDef.java b/src/main/java/emu/nebula/data/resources/StarTowerTeamExpDef.java new file mode 100644 index 0000000..3d65411 --- /dev/null +++ b/src/main/java/emu/nebula/data/resources/StarTowerTeamExpDef.java @@ -0,0 +1,19 @@ +package emu.nebula.data.resources; + +import emu.nebula.data.BaseDef; +import emu.nebula.data.ResourceType; +import lombok.Getter; + +@Getter +@ResourceType(name = "StarTowerTeamExp.json") +public class StarTowerTeamExpDef extends BaseDef { + private int Id; + private int GroupId; + private int Level; + private int NeedExp; + + @Override + public int getId() { + return Id; + } +} diff --git a/src/main/java/emu/nebula/game/tower/StarTowerGame.java b/src/main/java/emu/nebula/game/tower/StarTowerGame.java index 4065ea4..7303574 100644 --- a/src/main/java/emu/nebula/game/tower/StarTowerGame.java +++ b/src/main/java/emu/nebula/game/tower/StarTowerGame.java @@ -6,6 +6,7 @@ import java.util.List; import dev.morphia.annotations.Entity; import emu.nebula.GameConstants; +import emu.nebula.Nebula; import emu.nebula.data.GameData; import emu.nebula.data.resources.PotentialDef; import emu.nebula.data.resources.StarTowerDef; @@ -55,6 +56,7 @@ public class StarTowerGame { private int buildId; private int teamLevel; private int teamExp; + private int nextLevelExp; private int charHp; private int battleTime; private int battleCount; @@ -103,6 +105,8 @@ public class StarTowerGame { this.formationId = req.getFormationId(); this.buildId = Snowflake.newUid(); this.teamLevel = 1; + this.teamExp = 0; + this.nextLevelExp = GameData.getStarTowerTeamExpDataTable().get(2).getNeedExp(); this.stageNum = 1; this.stageFloor = 1; this.floor = 1; @@ -223,6 +227,37 @@ public class StarTowerGame { return gold; } + + public int levelUp(int exp, int picks) { + if (this.teamExp + exp >= this.nextLevelExp) { + // Level up + this.teamLevel++; + + // Add 1 to pending potential picks + picks++; + + // Handle excess exp + if (this.teamExp + exp - this.nextLevelExp > 0) { + int excessExp = this.teamExp + exp - this.nextLevelExp; + return levelUp(excessExp, picks); + } + + // Next level + this.nextLevelExp = GameData.getStarTowerTeamExpDataTable().get(this.teamLevel + 1).getNeedExp(); + } + else { + // Update current team exp + this.teamExp += exp; + } + + // Return picks + return picks; + } + + public int levelUp(int exp) { + int potentialPicks = 0; + return this.levelUp(exp, potentialPicks); + } // Cases @@ -443,8 +478,34 @@ public class StarTowerGame { // Handle victory/defeat if (proto.hasVictory()) { - // Add team level - this.teamLevel++; + // Handle leveling up + + // Get relevant floor exp data + var floorExpData = GameData.getStarTowerFloorExpDataTable().get(this.getId()); + int expReward = 0; + + // Determine appropriate exp reward + switch (this.getRoomType()) { + // Regular battle room + case 0: + expReward = floorExpData.getNormalExp(); + break; + // Elite battle room + case 1: + expReward = floorExpData.getEliteExp(); + break; + // Non-final boss room + case 2: + expReward = floorExpData.getBossExp(); + break; + // Final room + case 3: + expReward = floorExpData.getFinalBossExp(); + break; + } + + // Level up + this.pendingPotentialCases += this.levelUp(expReward); // Add clear time this.battleTime += proto.getVictory().getTime(); @@ -460,9 +521,6 @@ public class StarTowerGame { this.addItem(GameConstants.STAR_TOWER_GOLD_ITEM_ID, money, change); - // Add potential selectors - this.pendingPotentialCases += 1; - // Handle pending potential selectors if (this.pendingPotentialCases > 0) { // Create potential selector @@ -471,6 +529,18 @@ public class StarTowerGame { this.pendingPotentialCases--; } + else { + // Add door case here + var doorCase = this.addCase(new StarTowerCase(CaseType.OpenDoor)); + doorCase.setFloorId(this.getStageFloor() + 1); + + var nextStage = this.getNextStageData(); + if (nextStage != null) { + doorCase.setRoomType(nextStage.getRoomType()); + } + + this.addCase(rsp.getMutableCases(), doorCase); + } // Add sub note skills var battleCase = this.getCase(CaseType.Battle);