Files
lakebane/src/engine/ConfigParsing/EffectsParser.java
T

182 lines
7.0 KiB
Java
Raw Normal View History

2024-07-23 20:47:39 -05:00
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2024
// www.magicbane.com
package engine.ConfigParsing;
2024-07-24 12:56:24 -04:00
2024-08-06 16:56:41 -04:00
import engine.ConfigParsing.EffectEntry.EffectEntry;
2024-08-10 16:29:55 -04:00
import engine.ConfigParsing.EffectEntry.EffectModifier;
2024-07-23 20:47:39 -05:00
import engine.gameManager.ConfigManager;
2024-08-10 17:54:29 -04:00
import engine.mbEnums;
import org.pmw.tinylog.Logger;
2024-07-23 21:15:37 -05:00
2024-07-23 20:47:39 -05:00
import java.io.IOException;
2024-07-24 12:56:24 -04:00
import java.nio.file.Files;
import java.nio.file.Paths;
2024-08-08 12:19:53 -04:00
import java.util.ArrayList;
2024-07-23 21:07:29 -05:00
import java.util.HashMap;
2024-08-06 16:52:06 -04:00
import java.util.regex.Matcher;
import java.util.regex.Pattern;
2024-07-23 20:47:39 -05:00
public class EffectsParser {
2024-07-24 12:56:24 -04:00
2024-07-23 21:02:41 -05:00
public static String EffectsPath = ConfigManager.DEFAULT_DATA_DIR + "wpak/Effects.cfg";
2024-08-06 16:56:41 -04:00
public static HashMap<String, EffectEntry> effect_data = new HashMap<>();
2024-08-08 11:56:31 -04:00
private static final Pattern EFFECT_REGEX = Pattern.compile("(?<=EFFECTBEGIN)(.+?)(?=EFFECTEND)", Pattern.DOTALL);
private static final Pattern SOURCE_REGEX = Pattern.compile("(?<=SOURCEBEGIN)(.+?)(?=SOURCEEND)", Pattern.DOTALL);
2024-08-10 18:02:22 -04:00
private static final Pattern MODS_REGEX = Pattern.compile("(?<=MODSBEGIN)(.+?)(?=MODSEND)", Pattern.DOTALL);
2024-08-08 13:07:20 -04:00
private static final Pattern STRSPLIT_REGEX = Pattern.compile("([^\"]\\S*|\"[^\"]*\")\\s*");
2024-08-12 08:14:52 -04:00
2024-07-23 20:47:39 -05:00
public static void init() throws IOException {
2024-07-24 12:56:24 -04:00
2024-08-06 16:52:06 -04:00
byte[] fileData = Files.readAllBytes(Paths.get(EffectsPath));
String fileContents = new String(fileData);
2024-08-06 17:07:07 -04:00
Matcher matcher = EFFECT_REGEX.matcher(fileContents);
2024-07-24 12:56:24 -04:00
2024-08-06 17:07:07 -04:00
// Iterate effect entries from .wpak config data
2024-07-24 12:56:24 -04:00
2024-08-06 16:52:06 -04:00
while (matcher.find()) {
2024-08-08 11:47:45 -04:00
EffectEntry effectEntry = parseEffectEntry(matcher.group());
2024-07-24 12:56:24 -04:00
2024-08-06 17:07:07 -04:00
if (effectEntry != null)
effect_data.put(effectEntry.id, effectEntry);
}
2024-07-23 20:47:39 -05:00
}
2024-08-06 17:07:07 -04:00
private static EffectEntry parseEffectEntry(String effectData) {
EffectEntry effectEntry = new EffectEntry();
2024-08-08 11:38:09 -04:00
// Remove all lines that contain a # and leading/trailing blanks
2024-08-06 17:07:07 -04:00
2024-08-08 11:36:00 -04:00
effectData = effectData.replaceAll("(?m)^.*#.*\r?\n?", "");
2024-08-08 11:38:09 -04:00
effectData = effectData.trim();
2024-08-06 16:56:41 -04:00
2024-08-06 17:17:57 -04:00
// Parse effect entry description
2024-08-08 12:54:58 -04:00
String firstLine;
ArrayList<String> effectDescription = new ArrayList<>();
2024-08-08 12:28:35 -04:00
2024-08-08 12:57:03 -04:00
// Some effects exist without sources/mods or conditions
// (ACID "MOB" 0)
2024-08-08 13:14:21 -04:00
2024-08-08 12:54:58 -04:00
if (effectData.indexOf('\n') > 0)
2024-08-08 12:28:35 -04:00
firstLine = effectData.substring(0, effectData.indexOf('\n'));
2024-08-08 12:54:58 -04:00
else
firstLine = effectData;
2024-08-08 12:28:35 -04:00
2024-08-08 12:54:58 -04:00
// Regex ignores spaces within quotes
2024-08-08 12:19:53 -04:00
Matcher matcher = STRSPLIT_REGEX.matcher(firstLine);
while (matcher.find())
2024-08-08 12:57:03 -04:00
effectDescription.add(matcher.group(1).trim());
2024-08-06 17:17:57 -04:00
2024-08-08 12:19:53 -04:00
effectEntry.id = effectDescription.get(0);
effectEntry.name = effectDescription.get(1);
2024-08-10 16:18:33 -04:00
effectEntry.name = effectEntry.name.replaceAll("\"", "");
2024-08-06 17:17:57 -04:00
2024-08-08 13:14:07 -04:00
// Some effect mods have no icon
// (SEEINVIS-SHADE "See Invis")
if (effectDescription.size() == 3)
2024-08-08 13:02:01 -04:00
effectEntry.icon = Integer.parseInt(effectDescription.get(2));
2024-08-08 13:14:07 -04:00
else
2024-08-08 13:11:10 -04:00
effectEntry.icon = 0;
2024-08-08 13:14:07 -04:00
2024-08-06 17:17:57 -04:00
// Parse source entries
2024-08-08 12:19:53 -04:00
matcher = SOURCE_REGEX.matcher(effectData);
2024-08-06 17:17:57 -04:00
while (matcher.find())
2024-08-08 11:47:45 -04:00
effectEntry.sources.add(matcher.group().trim());
2024-08-06 17:17:57 -04:00
2024-08-06 17:18:46 -04:00
// Parse modifier entries
2024-08-06 17:17:57 -04:00
2024-08-10 16:29:55 -04:00
matcher = MODS_REGEX.matcher(effectData);
// Iterate effect entries from .wpak config data
while (matcher.find()) {
EffectModifier effectModifier = parseModEntry(matcher.group());
2024-08-10 16:30:43 -04:00
if (effectModifier != null)
2024-08-10 16:29:55 -04:00
effectEntry.mods.add(effectModifier);
}
2024-08-06 17:07:07 -04:00
return effectEntry;
2024-08-06 16:56:41 -04:00
}
2024-08-10 16:29:55 -04:00
private static EffectModifier parseModEntry(String modData) {
EffectModifier effectModifier = new EffectModifier();
2024-08-10 18:07:54 -04:00
String[] modEntries = modData.trim().split("\n");
2024-08-10 17:54:29 -04:00
2024-08-10 18:13:15 -04:00
for (String modEntry : modEntries) {
2024-08-10 17:54:29 -04:00
2024-08-10 18:13:15 -04:00
ArrayList<String> modValues = new ArrayList<>();
2024-08-10 18:45:23 -04:00
Matcher matcher = STRSPLIT_REGEX.matcher(modEntry.trim());
2024-08-10 18:13:15 -04:00
while (matcher.find())
modValues.add(matcher.group(1).trim());
effectModifier.type = mbEnums.ModType.valueOf(modValues.get(0).trim());
switch (effectModifier.type) {
case AnimOverride:
2024-08-10 18:13:56 -04:00
effectModifier.min = Integer.parseInt(modValues.get(1).trim());
effectModifier.max = Integer.parseInt(modValues.get(2).trim());
2024-08-10 18:13:15 -04:00
break;
2024-08-12 09:00:59 -04:00
case Health:
2024-08-12 09:09:44 -04:00
case Mana:
case Stamina:
2024-08-12 09:00:59 -04:00
effectModifier.min = Integer.parseInt(modValues.get(1).trim());
effectModifier.max = Integer.parseInt(modValues.get(2).trim());
effectModifier.scale = Float.parseFloat(modValues.get(3).trim());
2024-08-12 09:01:49 -04:00
// Parameter 4 is always 0.
2024-08-12 09:00:59 -04:00
effectModifier.compoundCurveType = mbEnums.CompoundCurveType.valueOf(modValues.get(5).trim());
effectModifier.arg1 = modValues.get(6).trim();
2024-08-12 08:45:42 -04:00
case Attr:
2024-08-12 08:52:24 -04:00
case Resistance:
case Skill:
2024-08-12 08:45:42 -04:00
effectModifier.min = Integer.parseInt(modValues.get(1).trim());
effectModifier.scale = Float.parseFloat(modValues.get(2).trim());
effectModifier.compoundCurveType = mbEnums.CompoundCurveType.valueOf(modValues.get(3).trim());
effectModifier.arg1 = modValues.get(4).trim();
2024-08-12 08:47:57 -04:00
break;
2024-08-10 18:23:40 -04:00
case BladeTrails:
2024-08-12 09:13:29 -04:00
case CannotCast:
2024-08-10 18:23:40 -04:00
break;
case MeleeDamageModifier:
2024-08-10 18:27:17 -04:00
case OCV:
case DCV:
2024-08-11 12:44:54 -04:00
case AttackDelay:
case AdjustAboveDmgCap:
case DamageCap:
case ArmorPiercing:
2024-08-12 09:13:29 -04:00
case Speed:
2024-08-11 12:01:18 -04:00
effectModifier.min = Integer.parseInt(modValues.get(1).trim());
2024-08-10 18:27:17 -04:00
effectModifier.scale = Float.parseFloat(modValues.get(2).trim());
2024-08-11 17:07:56 -04:00
effectModifier.compoundCurveType = mbEnums.CompoundCurveType.valueOf(modValues.get(3).trim());
2024-08-10 18:50:28 -04:00
break;
2024-08-11 12:48:56 -04:00
case ItemName:
effectModifier.arg1 = modValues.get(1).trim();
effectModifier.arg2 = modValues.get(2).trim();
break;
2024-08-10 18:13:15 -04:00
default:
Logger.error("Unhandled type: " + effectModifier.type);
break;
}
2024-08-10 17:54:29 -04:00
}
2024-08-10 18:13:15 -04:00
2024-08-10 16:29:55 -04:00
return effectModifier;
}
2024-08-06 16:52:06 -04:00
}