feat(startower): leveling up

This commit is contained in:
Fishia
2025-11-27 20:57:52 +07:00
committed by Melledy
parent bfb22eddff
commit 4356b194df
4 changed files with 118 additions and 5 deletions

View File

@@ -113,6 +113,8 @@ public class GameData {
@Getter private static DataTable<StarTowerDef> StarTowerDataTable = new DataTable<>();
@Getter private static DataTable<StarTowerStageDef> StarTowerStageDataTable = new DataTable<>();
@Getter private static DataTable<StarTowerGrowthNodeDef> StarTowerGrowthNodeDataTable = new DataTable<>();
@Getter private static DataTable<StarTowerFloorExpDef> StarTowerFloorExpDataTable = new DataTable<>();
@Getter private static DataTable<StarTowerTeamExpDef> StarTowerTeamExpDataTable = new DataTable<>();
@Getter private static DataTable<PotentialDef> PotentialDataTable = new DataTable<>();
@Getter private static DataTable<SubNoteSkillPromoteGroupDef> SubNoteSkillPromoteGroupDataTable = new DataTable<>();

View File

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

View File

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

View File

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