diff options
Diffstat (limited to 'src/main/java/net/sowgro/npehero/levelapi/Difficulty.java')
-rwxr-xr-x | src/main/java/net/sowgro/npehero/levelapi/Difficulty.java | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/main/java/net/sowgro/npehero/levelapi/Difficulty.java b/src/main/java/net/sowgro/npehero/levelapi/Difficulty.java new file mode 100755 index 0000000..2e99a7a --- /dev/null +++ b/src/main/java/net/sowgro/npehero/levelapi/Difficulty.java @@ -0,0 +1,95 @@ +package net.sowgro.npehero.levelapi; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.ToNumberPolicy; + +import java.io.*; +import java.util.Map; + +/** + * Represents a difficulty + * Responsible for the data in metadata.yml + */ +public class Difficulty implements Comparable<Difficulty> +{ + public final File thisDir; + public final Level level; + + public String title = "Unnamed"; + public Double bpm = 0.0; + public double endTime = 0; + public int order = 0; + + public final Leaderboard leaderboard; + public final Notes notes; + + private final Gson jsonParser = new GsonBuilder().serializeNulls().setPrettyPrinting().setNumberToNumberStrategy(ToNumberPolicy.DOUBLE).create(); + private final File jsonFile; + + /** + * Creates a new Difficulty + * @param newDir: The file path of the Difficulty + * @throws IOException If there are any problems reading the metadata or leaderboard files + */ + public Difficulty(File newDir, Level level) throws IOException { + thisDir = newDir; + this.level = level; + jsonFile = new File(thisDir, "metadata.json"); + readMetadata(); + notes = new Notes(new File(thisDir, "notes.txt"), this); // needs metadata first + leaderboard = new Leaderboard(new File(thisDir, "leaderboard.json")); + } + + /** + * Read in the data from metadata.json + * @throws IOException If there are any problems loading the file. + */ + public void readMetadata() throws IOException { + if (!jsonFile.exists()) { + return; + } + Map<String, Object> data = jsonParser.fromJson(new FileReader(jsonFile), Map.class); + + title = (String) data.getOrDefault("title", title); + bpm = (Double) data.getOrDefault("bpm", bpm); + endTime = (double) data.getOrDefault("endTime", endTime); + if (endTime == 0) { + int tmp = (int) (double) data.getOrDefault("numBeats", 0.0); + if (tmp != 0) { + endTime = Notes.beatToSecond(tmp, bpm); + } + } + order = (int) (double) data.getOrDefault("priority", (double) order); + } + + /** + * Checks the validity of the difficulty + * <p> + * A valid difficulty has at least one note + * @return True if the difficulty is valid + */ + public boolean isValid() { + return !notes.list.isEmpty(); + } + + /** + * Writes metadata to json file + * @throws IOException If there is a problem writing to the file + */ + public void writeMetadata() throws IOException { + jsonFile.createNewFile(); + Map<String, Object> data = jsonParser.fromJson(new FileReader(jsonFile), Map.class); // start with previous values + data.put("title", title); + data.put("endTime", endTime); + data.put("priority", order); + FileWriter fileWriter = new FileWriter(jsonFile); + jsonParser.toJson(data, fileWriter); + fileWriter.close(); + } + + @Override + public int compareTo(Difficulty d) { + return order - d.order; + } +} |