// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ . // ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌· // ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀ // ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌ // ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀ // Magicbane Emulator Project © 2013 - 2024 // www.magicbane.com package engine.ConfigParsing; import engine.ConfigParsing.EffectsData.Condition; import engine.ConfigParsing.EffectsData.EffectData; import engine.ConfigParsing.EffectsData.Mod; import engine.gameManager.ConfigManager; import engine.mbEnums; import org.pmw.tinylog.Logger; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class EffectsParser { public static String EffectsPath = ConfigManager.DEFAULT_DATA_DIR + "wpak/Effects.cfg"; public static HashMap effect_data = new HashMap<>(); public static void init() throws IOException { ArrayList> compiledData = new ArrayList<>(); List fileData = Files.readAllLines(Paths.get(EffectsPath)); ArrayList modData = new ArrayList<>(); for (String line : fileData) { if (line.contains("EFFECTBEGIN")) { modData = new ArrayList<>(); continue; } if (line.contains("EFFECTEND")) compiledData.add(modData); else modData.add(line); } CreateBlocks(compiledData); } public static void CreateBlocks(ArrayList> compiledData) { for (ArrayList compiledLines : compiledData) { EffectData effectData = new EffectData(); effectData.id = compiledLines.get(1).replace(" ", "").split(" ")[0]; effectData.sources = new ArrayList<>(); effectData.mods = new ArrayList<>(); effectData.conditions = new ArrayList<>(); try { String rawData = compiledLines.get(1).replace(" ", ""); if(rawData.contains("\"")){ int startIndex = rawData.indexOf('"'); int endIndex = rawData.lastIndexOf('"'); char[] nameValue = rawData.toCharArray(); String name = ""; for(int i = startIndex; i < endIndex; i++){ name += nameValue[i]; } effectData.name = name; } int iconID; try { iconID = Integer.parseInt(compiledLines.get(1).replace(" ", "").split(" ")[2]); } catch(Exception e){ iconID = 0; } effectData.icon = iconID; } catch (Exception e) { Logger.error(e); } int index = 0; //log all sources for (String line : compiledLines) { if (line.contains("SOURCEBEGIN")) effectData.sources.add(mbEnums.EffectSourceType.valueOf(compiledLines.get(index + 1).replace(" ", ""))); index++; } //log all mods index = 0; for (String line : compiledLines) { if (line.contains("MODSBEGIN")) { int extra = 1; Mod mod = new Mod(); while (!compiledLines.get(index + extra).contains("MODSEND")) { //data.mods.add(lines[index + extra].Replace(" ", "")); mod.type = mbEnums.ModType.valueOf(compiledLines.get(index + extra).replace(" ", "").split(" ")[0]); GenerateModValues(mod, compiledLines.get(index + extra).replace(" ", "").replace(" ", "").split(" ")); extra++; } effectData.mods.add(mod); } index++; } //log all conditions index = 0; for (String line : compiledLines) { if (line.contains("CONDITIONBEGIN")) { int extra = 1; while (!compiledLines.get(index + extra).contains("CONDITIONEND")) { if (!compiledLines.get(index + extra).contains("#")) { //data.conditions.add(lines[index + extra].Replace(" ", "")); Condition condition = new Condition(); condition.type = compiledLines.get(index + extra).replace(" ", "").split(" ")[0]; condition.value = compiledLines.get(index + extra).replace(" ", "").split(" ")[1]; } extra++; } } index++; } effect_data.put(effectData.id, effectData); } Logger.info("Effects.cfg Parsing Completed"); } public static void GenerateModValues(Mod inMod, String[] data) { int maxValue = 5; if(inMod.type != null && inMod.type.name().equals("Health")){ maxValue = 7; } if(data.length < maxValue) maxValue = data.length; inMod.values = new ArrayList<>(); for (int i = 1; i < data.length; i++) if (!data[i].isEmpty()) { if (i >= maxValue) continue; if (i == maxValue - 1) try { String entry = ""; for (int j = i; j < data.length; j ++){ entry += data[j] + " "; } entry = entry.trim(); inMod.values.add(entry.trim()); } catch (Exception e) { inMod.values.add(data[i]); } else inMod.values.add(data[i]); } } }