EconomyInfo.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. package util.economy;
  2. import model.items.ITEM_NAME;
  3. import model.tiles.InteractiveTileType;
  4. import java.io.*;
  5. import java.util.*;
  6. public class EconomyInfo {
  7. private static final String FILE_PATH = "/economy/economy.json";
  8. private static final Map<InteractiveTileType, EconomyData> economyHashmap = new HashMap<>();
  9. public static void load() {
  10. economyHashmap.clear();
  11. try (InputStream is = EconomyInfo.class.getResourceAsStream(FILE_PATH);
  12. BufferedReader reader = new BufferedReader(new InputStreamReader(is))) {
  13. StringBuilder jsonBuilder = new StringBuilder();
  14. String line;
  15. while ((line = reader.readLine()) != null) {
  16. jsonBuilder.append(line);
  17. }
  18. String json = jsonBuilder.toString().trim();
  19. if (json.startsWith("{") && json.endsWith("}")) {
  20. json = json.substring(1, json.length() - 1);
  21. }
  22. parseTopLevel(json);
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. private static void parseTopLevel(String json) {
  28. int index = 0;
  29. while (index < json.length()) {
  30. int keyStart = json.indexOf('"', index);
  31. if (keyStart == -1) break;
  32. int keyEnd = json.indexOf('"', keyStart + 1);
  33. String typeName = json.substring(keyStart + 1, keyEnd);
  34. int dataStart = json.indexOf('{', keyEnd);
  35. if (dataStart == -1) break;
  36. int depth = 1;
  37. int dataEnd = dataStart + 1;
  38. while (dataEnd < json.length() && depth > 0) {
  39. if (json.charAt(dataEnd) == '{') depth++;
  40. else if (json.charAt(dataEnd) == '}') depth--;
  41. dataEnd++;
  42. }
  43. if (depth != 0) break;
  44. String dataJson = json.substring(dataStart, dataEnd);
  45. parseTileData(InteractiveTileType.valueOf(typeName), dataJson);
  46. index = dataEnd;
  47. }
  48. }
  49. private static void parseTileData(InteractiveTileType tileType, String json) {
  50. int maxLevel = extractIntValue(json, "maxLevel");
  51. Map<Integer, Map<ITEM_NAME, Integer>> costs = extractNestedMap(json, "costs");
  52. Map<Integer, Integer> lighthouseLevels = extractFlatMap(json, "lighthouseLevels");
  53. Map<Integer, Integer> productionTimes = extractFlatMap(json, "productionTimeInSec");
  54. economyHashmap.put(tileType, new EconomyData(
  55. costs,
  56. maxLevel,
  57. lighthouseLevels,
  58. productionTimes
  59. ));
  60. }
  61. private static int extractIntValue(String json, String key) {
  62. int keyIndex = json.indexOf("\"" + key + "\":");
  63. if (keyIndex == -1) return -1;
  64. int valueStart = json.indexOf(':', keyIndex) + 1;
  65. int valueEnd = findValueEnd(json, valueStart);
  66. String value = json.substring(valueStart, valueEnd).trim();
  67. try {
  68. return Integer.parseInt(value);
  69. } catch (NumberFormatException e) {
  70. return -1;
  71. }
  72. }
  73. private static Map<Integer, Map<ITEM_NAME, Integer>> extractNestedMap(String json, String key) {
  74. Map<Integer, Map<ITEM_NAME, Integer>> result = new HashMap<>();
  75. String mapJson = extractSubJson(json, key);
  76. if (mapJson == null) return result;
  77. int index = 0;
  78. while (index < mapJson.length()) {
  79. int levelStart = mapJson.indexOf('"', index);
  80. if (levelStart == -1) break;
  81. int levelEnd = mapJson.indexOf('"', levelStart + 1);
  82. int level = Integer.parseInt(mapJson.substring(levelStart + 1, levelEnd));
  83. int innerStart = mapJson.indexOf('{', levelEnd);
  84. if (innerStart == -1) break;
  85. int innerDepth = 1;
  86. int innerEnd = innerStart + 1;
  87. while (innerEnd < mapJson.length() && innerDepth > 0) {
  88. if (mapJson.charAt(innerEnd) == '{') innerDepth++;
  89. else if (mapJson.charAt(innerEnd) == '}') innerDepth--;
  90. innerEnd++;
  91. }
  92. if (innerDepth != 0) break;
  93. String innerJson = mapJson.substring(innerStart + 1, innerEnd - 1);
  94. Map<ITEM_NAME, Integer> innerMap = parseInnerMap(innerJson);
  95. result.put(level, innerMap);
  96. index = innerEnd;
  97. }
  98. return result;
  99. }
  100. private static Map<ITEM_NAME, Integer> parseInnerMap(String innerJson) {
  101. Map<ITEM_NAME, Integer> map = new HashMap<>();
  102. int index = 0;
  103. while (index < innerJson.length()) {
  104. int keyStart = innerJson.indexOf('"', index);
  105. if (keyStart == -1) break;
  106. int keyEnd = innerJson.indexOf('"', keyStart + 1);
  107. String itemName = innerJson.substring(keyStart + 1, keyEnd);
  108. int valueStart = innerJson.indexOf(':', keyEnd) + 1;
  109. int valueEnd = findValueEnd(innerJson, valueStart);
  110. String valueStr = innerJson.substring(valueStart, valueEnd).trim();
  111. try {
  112. ITEM_NAME item = ITEM_NAME.valueOf(itemName);
  113. int amount = Integer.parseInt(valueStr);
  114. map.put(item, amount);
  115. } catch (IllegalArgumentException ignored) {
  116. }
  117. index = valueEnd + 1;
  118. }
  119. return map;
  120. }
  121. private static Map<Integer, Integer> extractFlatMap(String json, String key) {
  122. Map<Integer, Integer> result = new HashMap<>();
  123. String mapJson = extractSubJson(json, key);
  124. if (mapJson == null) return result;
  125. int index = 0;
  126. while (index < mapJson.length()) {
  127. int keyStart = mapJson.indexOf('"', index);
  128. if (keyStart == -1) break;
  129. int keyEnd = mapJson.indexOf('"', keyStart + 1);
  130. int level = Integer.parseInt(mapJson.substring(keyStart + 1, keyEnd));
  131. int valueStart = mapJson.indexOf(':', keyEnd) + 1;
  132. int valueEnd = findValueEnd(mapJson, valueStart);
  133. String valueStr = mapJson.substring(valueStart, valueEnd).trim();
  134. try {
  135. int value = Integer.parseInt(valueStr);
  136. result.put(level, value);
  137. } catch (NumberFormatException ignored) {
  138. }
  139. index = valueEnd + 1;
  140. }
  141. return result;
  142. }
  143. private static String extractSubJson(String json, String key) {
  144. String searchKey = "\"" + key + "\":";
  145. int keyIndex = json.indexOf(searchKey);
  146. if (keyIndex == -1) return null;
  147. int start = json.indexOf('{', keyIndex + searchKey.length());
  148. if (start == -1) return null;
  149. int depth = 1;
  150. int end = start + 1;
  151. while (end < json.length() && depth > 0) {
  152. if (json.charAt(end) == '{') depth++;
  153. else if (json.charAt(end) == '}') depth--;
  154. end++;
  155. }
  156. if (depth != 0) return null;
  157. return json.substring(start, end);
  158. }
  159. private static int findValueEnd(String json, int start) {
  160. int end = start;
  161. while (end < json.length()) {
  162. char c = json.charAt(end);
  163. if (c == ',' || c == '}' || c == ']') break;
  164. end++;
  165. }
  166. return end;
  167. }
  168. public static EconomyData infoOf(InteractiveTileType type) {
  169. return economyHashmap.get(type);
  170. }
  171. }