| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- package util.economy;
- import model.items.ITEM_NAME;
- import model.tiles.InteractiveTileType;
- import java.io.*;
- import java.util.*;
- public class EconomyInfo {
- private static final String FILE_PATH = "/economy/economy.json";
- private static final Map<InteractiveTileType, EconomyData> economyHashmap = new HashMap<>();
- public static void load() {
- economyHashmap.clear();
- try (InputStream is = EconomyInfo.class.getResourceAsStream(FILE_PATH);
- BufferedReader reader = new BufferedReader(new InputStreamReader(is))) {
- StringBuilder jsonBuilder = new StringBuilder();
- String line;
- while ((line = reader.readLine()) != null) {
- jsonBuilder.append(line);
- }
- String json = jsonBuilder.toString().trim();
- if (json.startsWith("{") && json.endsWith("}")) {
- json = json.substring(1, json.length() - 1);
- }
- parseTopLevel(json);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- private static void parseTopLevel(String json) {
- int index = 0;
- while (index < json.length()) {
- int keyStart = json.indexOf('"', index);
- if (keyStart == -1) break;
- int keyEnd = json.indexOf('"', keyStart + 1);
- String typeName = json.substring(keyStart + 1, keyEnd);
- int dataStart = json.indexOf('{', keyEnd);
- if (dataStart == -1) break;
- int depth = 1;
- int dataEnd = dataStart + 1;
- while (dataEnd < json.length() && depth > 0) {
- if (json.charAt(dataEnd) == '{') depth++;
- else if (json.charAt(dataEnd) == '}') depth--;
- dataEnd++;
- }
- if (depth != 0) break;
- String dataJson = json.substring(dataStart, dataEnd);
- parseTileData(InteractiveTileType.valueOf(typeName), dataJson);
- index = dataEnd;
- }
- }
- private static void parseTileData(InteractiveTileType tileType, String json) {
- int maxLevel = extractIntValue(json, "maxLevel");
- Map<Integer, Map<ITEM_NAME, Integer>> costs = extractNestedMap(json, "costs");
- Map<Integer, Integer> lighthouseLevels = extractFlatMap(json, "lighthouseLevels");
- Map<Integer, Integer> productionTimes = extractFlatMap(json, "productionTimeInSec");
- economyHashmap.put(tileType, new EconomyData(
- costs,
- maxLevel,
- lighthouseLevels,
- productionTimes
- ));
- }
- private static int extractIntValue(String json, String key) {
- int keyIndex = json.indexOf("\"" + key + "\":");
- if (keyIndex == -1) return -1;
- int valueStart = json.indexOf(':', keyIndex) + 1;
- int valueEnd = findValueEnd(json, valueStart);
- String value = json.substring(valueStart, valueEnd).trim();
- try {
- return Integer.parseInt(value);
- } catch (NumberFormatException e) {
- return -1;
- }
- }
- private static Map<Integer, Map<ITEM_NAME, Integer>> extractNestedMap(String json, String key) {
- Map<Integer, Map<ITEM_NAME, Integer>> result = new HashMap<>();
- String mapJson = extractSubJson(json, key);
- if (mapJson == null) return result;
- int index = 0;
- while (index < mapJson.length()) {
- int levelStart = mapJson.indexOf('"', index);
- if (levelStart == -1) break;
- int levelEnd = mapJson.indexOf('"', levelStart + 1);
- int level = Integer.parseInt(mapJson.substring(levelStart + 1, levelEnd));
- int innerStart = mapJson.indexOf('{', levelEnd);
- if (innerStart == -1) break;
- int innerDepth = 1;
- int innerEnd = innerStart + 1;
- while (innerEnd < mapJson.length() && innerDepth > 0) {
- if (mapJson.charAt(innerEnd) == '{') innerDepth++;
- else if (mapJson.charAt(innerEnd) == '}') innerDepth--;
- innerEnd++;
- }
- if (innerDepth != 0) break;
- String innerJson = mapJson.substring(innerStart + 1, innerEnd - 1);
- Map<ITEM_NAME, Integer> innerMap = parseInnerMap(innerJson);
- result.put(level, innerMap);
- index = innerEnd;
- }
- return result;
- }
- private static Map<ITEM_NAME, Integer> parseInnerMap(String innerJson) {
- Map<ITEM_NAME, Integer> map = new HashMap<>();
- int index = 0;
- while (index < innerJson.length()) {
- int keyStart = innerJson.indexOf('"', index);
- if (keyStart == -1) break;
- int keyEnd = innerJson.indexOf('"', keyStart + 1);
- String itemName = innerJson.substring(keyStart + 1, keyEnd);
- int valueStart = innerJson.indexOf(':', keyEnd) + 1;
- int valueEnd = findValueEnd(innerJson, valueStart);
- String valueStr = innerJson.substring(valueStart, valueEnd).trim();
- try {
- ITEM_NAME item = ITEM_NAME.valueOf(itemName);
- int amount = Integer.parseInt(valueStr);
- map.put(item, amount);
- } catch (IllegalArgumentException ignored) {
- }
- index = valueEnd + 1;
- }
- return map;
- }
- private static Map<Integer, Integer> extractFlatMap(String json, String key) {
- Map<Integer, Integer> result = new HashMap<>();
- String mapJson = extractSubJson(json, key);
- if (mapJson == null) return result;
- int index = 0;
- while (index < mapJson.length()) {
- int keyStart = mapJson.indexOf('"', index);
- if (keyStart == -1) break;
- int keyEnd = mapJson.indexOf('"', keyStart + 1);
- int level = Integer.parseInt(mapJson.substring(keyStart + 1, keyEnd));
- int valueStart = mapJson.indexOf(':', keyEnd) + 1;
- int valueEnd = findValueEnd(mapJson, valueStart);
- String valueStr = mapJson.substring(valueStart, valueEnd).trim();
- try {
- int value = Integer.parseInt(valueStr);
- result.put(level, value);
- } catch (NumberFormatException ignored) {
- }
- index = valueEnd + 1;
- }
- return result;
- }
- private static String extractSubJson(String json, String key) {
- String searchKey = "\"" + key + "\":";
- int keyIndex = json.indexOf(searchKey);
- if (keyIndex == -1) return null;
- int start = json.indexOf('{', keyIndex + searchKey.length());
- if (start == -1) return null;
- int depth = 1;
- int end = start + 1;
- while (end < json.length() && depth > 0) {
- if (json.charAt(end) == '{') depth++;
- else if (json.charAt(end) == '}') depth--;
- end++;
- }
- if (depth != 0) return null;
- return json.substring(start, end);
- }
- private static int findValueEnd(String json, int start) {
- int end = start;
- while (end < json.length()) {
- char c = json.charAt(end);
- if (c == ',' || c == '}' || c == ']') break;
- end++;
- }
- return end;
- }
- public static EconomyData infoOf(InteractiveTileType type) {
- return economyHashmap.get(type);
- }
- }
|