106 lines
3.7 KiB
Java
Executable File
106 lines
3.7 KiB
Java
Executable File
package net.cmr.jurassicrevived.config;
|
|
|
|
import java.io.IOException;
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Path;
|
|
|
|
public final class JRConfigManager {
|
|
private static JRConfig config = new JRConfig();
|
|
|
|
private JRConfigManager() {}
|
|
|
|
public static JRConfig get() {
|
|
return config;
|
|
}
|
|
|
|
/**
|
|
* Loader modules should call this with the platform's config directory.
|
|
*/
|
|
public static void load(Path configDir) {
|
|
Path file = configDir.resolve("jurassicrevived.json");
|
|
if (!Files.exists(file)) {
|
|
save(configDir);
|
|
return;
|
|
}
|
|
|
|
// Minimal placeholder IO (swap to Gson/Jackson later if you want)
|
|
// For now: keep it simple and non-fatal.
|
|
try {
|
|
String text = Files.readString(file, StandardCharsets.UTF_8);
|
|
JRConfig loaded = new JRConfig();
|
|
|
|
loaded.requirePower = readBoolean(text, "requirePower", loaded.requirePower);
|
|
loaded.naturallySpawning = readBoolean(text, "naturallySpawning", loaded.naturallySpawning);
|
|
loaded.fePerSecond = readPositiveInt(text, "fePerSecond", loaded.fePerSecond);
|
|
loaded.itemsPerSecond = readPositiveInt(text, "itemsPerSecond", loaded.itemsPerSecond);
|
|
loaded.milliBucketsPerSecond = readPositiveInt(text, "milliBucketsPerSecond", loaded.milliBucketsPerSecond);
|
|
|
|
config = loaded;
|
|
save(configDir);
|
|
} catch (IOException e) {
|
|
// Keep defaults if load fails
|
|
}
|
|
}
|
|
|
|
public static void save(Path configDir) {
|
|
try {
|
|
Files.createDirectories(configDir);
|
|
Path file = configDir.resolve("jurassicrevived.json");
|
|
|
|
String text = "{\n" +
|
|
" \"requirePower\": " + config.requirePower + ",\n" +
|
|
" \"naturallySpawning\": " + config.naturallySpawning + ",\n" +
|
|
" \"fePerSecond\": " + config.fePerSecond + ",\n" +
|
|
" \"itemsPerSecond\": " + config.itemsPerSecond + ",\n" +
|
|
" \"milliBucketsPerSecond\": " + config.milliBucketsPerSecond + "\n" +
|
|
"}\n";
|
|
|
|
Files.writeString(file, text, StandardCharsets.UTF_8);
|
|
} catch (IOException e) {
|
|
// ignore / log via your logger if desired
|
|
}
|
|
}
|
|
|
|
private static boolean readBoolean(String text, String key, boolean fallback) {
|
|
String value = readRawValue(text, key);
|
|
if ("true".equalsIgnoreCase(value)) return true;
|
|
if ("false".equalsIgnoreCase(value)) return false;
|
|
return fallback;
|
|
}
|
|
|
|
private static int readPositiveInt(String text, String key, int fallback) {
|
|
String value = readRawValue(text, key);
|
|
if (value == null) return fallback;
|
|
|
|
try {
|
|
return Math.max(1, Integer.parseInt(value));
|
|
} catch (NumberFormatException e) {
|
|
return fallback;
|
|
}
|
|
}
|
|
|
|
private static String readRawValue(String text, String key) {
|
|
String quotedKey = "\"" + key + "\"";
|
|
int keyIndex = text.indexOf(quotedKey);
|
|
if (keyIndex < 0) return null;
|
|
|
|
int colonIndex = text.indexOf(':', keyIndex + quotedKey.length());
|
|
if (colonIndex < 0) return null;
|
|
|
|
int valueStart = colonIndex + 1;
|
|
while (valueStart < text.length() && Character.isWhitespace(text.charAt(valueStart))) {
|
|
valueStart++;
|
|
}
|
|
|
|
int valueEnd = valueStart;
|
|
while (valueEnd < text.length()) {
|
|
char c = text.charAt(valueEnd);
|
|
if (c == ',' || c == '\n' || c == '\r' || c == '}') break;
|
|
valueEnd++;
|
|
}
|
|
|
|
return text.substring(valueStart, valueEnd).trim();
|
|
}
|
|
}
|