Improve achievement params handling

This commit is contained in:
Melledy
2025-12-16 00:11:18 -08:00
parent 85b08c7593
commit d9b502002c
24 changed files with 1768 additions and 229 deletions
@@ -122,6 +122,7 @@ public class GameData {
@Getter private static DataTable<StarTowerFloorExpDef> StarTowerFloorExpDataTable = new DataTable<>();
@Getter private static DataTable<StarTowerTeamExpDef> StarTowerTeamExpDataTable = new DataTable<>();
@Getter private static DataTable<StarTowerEventDef> StarTowerEventDataTable = new DataTable<>();
@Getter private static DataTable<StarTowerBuildRankDef> StarTowerBuildRankDataTable = new DataTable<>();
@Getter private static DataTable<SubNoteSkillPromoteGroupDef> SubNoteSkillPromoteGroupDataTable = new DataTable<>();
@Getter private static DataTable<PotentialDef> PotentialDataTable = new DataTable<>();
@@ -0,0 +1,33 @@
package emu.nebula.data.custom;
import emu.nebula.data.BaseDef;
import emu.nebula.data.GameData;
import emu.nebula.data.ResourceType;
import emu.nebula.data.ResourceType.LoadPriority;
import lombok.Getter;
@Getter
@ResourceType(name = "AchievementParam.json", useInternal = true, loadPriority = LoadPriority.LOW)
public class AchievementParamDef extends BaseDef {
private int Id;
private int Param1;
private int ParamCond1;
private int Param2;
private int ParamCond2;
@Override
public int getId() {
return Id;
}
@Override
public void onLoad() {
var achievement = GameData.getAchievementDataTable().get(this.Id);
if (achievement == null) {
return;
}
achievement.setParams(this);
}
}
@@ -2,7 +2,9 @@ package emu.nebula.data.resources;
import emu.nebula.data.BaseDef;
import emu.nebula.data.ResourceType;
import emu.nebula.data.custom.AchievementParamDef;
import emu.nebula.game.achievement.AchievementHelper;
import emu.nebula.game.achievement.AchievementParamCond;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import lombok.Getter;
@@ -20,43 +22,50 @@ public class AchievementDef extends BaseDef {
private int Qty1;
// Custom params
private transient int param1; // -1 == any, 0 = no param, 1+ = param required
private transient int param2; // -1 == any, 0 = no param, 1+ = param required
private transient int param1;
private transient AchievementParamCond paramCond1;
private transient int param2;
private transient AchievementParamCond paramCond2;
@Override
public int getId() {
return Id;
}
@Deprecated
public void setParams(int param1, int param2) {
this.param1 = param1;
this.param2 = param2;
}
public void setParams(AchievementParamDef params) {
this.param1 = params.getParam1();
this.param2 = params.getParam2();
this.paramCond1 = AchievementParamCond.getByValue(params.getParamCond1());
this.paramCond2 = AchievementParamCond.getByValue(params.getParamCond2());
}
/**
* Checks if this achievement requires params to match
*/
public boolean hasParam1(int param) {
if (this.param1 < 0) {
return false;
} else if (this.param1 == 0) {
return param != 0;
} else {
return true;
public boolean matchParam1(int value) {
if (this.paramCond1 == null) {
this.paramCond1 = AchievementParamCond.EQUALS;
}
return this.paramCond1.test(this.param1, value);
}
/**
* Checks if this achievement requires params to match
*/
public boolean hasParam2(int param) {
if (this.param2 < 0) {
return false;
} else if (this.param2 == 0) {
return param != 0;
} else {
return true;
public boolean matchParam2(int value) {
if (this.paramCond2 == null) {
this.paramCond2 = AchievementParamCond.EQUALS;
}
return this.paramCond2.test(this.param2, value);
}
@Override
@@ -4,9 +4,9 @@ import emu.nebula.data.BaseDef;
import emu.nebula.data.GameData;
import emu.nebula.data.ResourceType;
import emu.nebula.data.custom.CharGemAttrGroupDef;
import emu.nebula.util.CustomIntArray;
import emu.nebula.util.Utils;
import emu.nebula.util.WeightedList;
import emu.nebula.util.ints.CustomIntArray;
import it.unimi.dsi.fastutil.ints.IntList;
import lombok.Getter;
@@ -4,7 +4,6 @@ import emu.nebula.data.BaseDef;
import emu.nebula.data.GameData;
import emu.nebula.data.ResourceType;
import emu.nebula.util.WeightedList;
import lombok.Getter;
@Getter
@@ -0,0 +1,18 @@
package emu.nebula.data.resources;
import emu.nebula.data.BaseDef;
import emu.nebula.data.ResourceType;
import lombok.Getter;
@Getter
@ResourceType(name = "StarTowerBuildRank.json")
public class StarTowerBuildRankDef extends BaseDef {
private int Id;
private int MinGrade;
private int Rarity;
@Override
public int getId() {
return Id;
}
}