|
|
|
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
|
|
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
|
|
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
|
|
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
|
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
|
|
// Magicbane Emulator Project © 2013 - 2024
|
|
|
|
// www.magicbane.com
|
|
|
|
|
|
|
|
package engine.wpak;
|
|
|
|
|
|
|
|
import engine.gameManager.ConfigManager;
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.nio.file.Files;
|
|
|
|
import java.nio.file.Paths;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.regex.Matcher;
|
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
|
|
public class PowersParser {
|
|
|
|
|
|
|
|
public static String powersPath = ConfigManager.DEFAULT_DATA_DIR + "wpak/Powers.cfg";
|
|
|
|
private static final Pattern POWER_REGEX = Pattern.compile("(?<=POWERBEGIN)(.+?)(?=POWEREND)", Pattern.DOTALL);
|
|
|
|
private static final Pattern STRSPLIT_REGEX = Pattern.compile("([^\"]\\S*|\"[^\"]*\")\\s*");
|
|
|
|
|
|
|
|
public static void parseWpakFile() throws IOException {
|
|
|
|
|
|
|
|
// Read .wpak file from disk
|
|
|
|
|
|
|
|
byte[] fileData = Files.readAllBytes(Paths.get(powersPath));
|
|
|
|
String fileContents = new String(fileData);
|
|
|
|
|
|
|
|
// Iterate over power entries from .wpak data
|
|
|
|
|
|
|
|
Matcher matcher = POWER_REGEX.matcher(fileContents);
|
|
|
|
|
|
|
|
while (matcher.find()) {
|
|
|
|
|
|
|
|
PowerEntry powerEntry = parsePowerEntry(matcher.group().trim());
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static PowerEntry parsePowerEntry(String powerData) {
|
|
|
|
|
|
|
|
PowerEntry powerEntry = new PowerEntry();
|
|
|
|
String[] powerEntries = powerData.trim().split("\n");
|
|
|
|
ArrayList<String> powerHeader = new ArrayList<>();
|
|
|
|
|
|
|
|
// Parse header
|
|
|
|
|
|
|
|
String headerString = powerEntries[0];
|
|
|
|
headerString = headerString.replace("\n", " ");
|
|
|
|
|
|
|
|
Matcher matcher = STRSPLIT_REGEX.matcher(headerString);
|
|
|
|
|
|
|
|
while (matcher.find())
|
|
|
|
powerHeader.add(matcher.group().trim());
|
|
|
|
|
|
|
|
powerEntry.power_id = powerHeader.get(0);
|
|
|
|
powerEntry.power_name = powerHeader.get(1).replaceAll("\"", "");
|
|
|
|
powerEntry.power_type = powerHeader.get(2);
|
|
|
|
powerEntry.skill_id = Integer.parseInt(powerHeader.get(3));
|
|
|
|
powerEntry.skill_name = powerHeader.get(4).replaceAll("\"", "");
|
|
|
|
powerEntry.target_type = powerHeader.get(5);
|
|
|
|
powerEntry.range = Integer.parseInt(powerHeader.get(6));
|
|
|
|
powerEntry.radiusType = powerHeader.get(7);
|
|
|
|
powerEntry.radius = Integer.parseInt(powerHeader.get(8));
|
|
|
|
powerEntry.groupReq = powerHeader.get(9);
|
|
|
|
powerEntry.costType = powerHeader.get(10);
|
|
|
|
powerEntry.cost = Float.parseFloat(powerHeader.get(11));
|
|
|
|
powerEntry.unknown01 = Integer.parseInt(powerHeader.get(12));
|
|
|
|
powerEntry.unknown02 = Integer.parseInt(powerHeader.get(13));
|
|
|
|
powerEntry.cast_time = Float.parseFloat(powerHeader.get(14));
|
|
|
|
powerEntry.cool_down = Float.parseFloat(powerHeader.get(15));
|
|
|
|
powerEntry.recycle_time = Float.parseFloat(powerHeader.get(16));
|
|
|
|
powerEntry.unknown03 = Integer.parseInt(powerHeader.get(17));
|
|
|
|
powerEntry.combatRequirement = powerHeader.get(18);
|
|
|
|
powerEntry.unknown04 = Integer.parseInt(powerHeader.get(19));
|
|
|
|
powerEntry.unknown05 = Integer.parseInt(powerHeader.get(20));
|
|
|
|
powerEntry.targetRequirement = powerHeader.get(21);
|
|
|
|
|
|
|
|
for (int x = 2; x < powerEntries.length; x++) {
|
|
|
|
// Parse key/pair values
|
|
|
|
// via switch
|
|
|
|
}
|
|
|
|
|
|
|
|
return powerEntry;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|