Add a CompoundCurve to (ramp, add) helper with a boot check

FlatLine -> (0, add), SlopedLine p -> (p, add), SlopedInitValLine p ->
(p, no add), checked against every static_power_effectmod and
static_power_action row (6228 rows; the 11 ramp value diffs are the
known 4.0 effectmod diffs). DefaultCurveUp/Down have no ramp form and
no mod or action uses them. The world boot checks five known DB rows
and logs curves without a ramp form.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MagicBotandClaude Opus 5.5 committed 2026-10-25 08:22:48 -04:00
1 parent f409e4ee4c
commit 4cc45f1304
2 files changed
+86

No files matched your search

@@ -0,0 +1,83 @@
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2026
// https://www.magicbane.com
package engine.parsers.objects.wpak;
import org.pmw.tinylog.Logger;
// A CompoundCurve in the server's (ramp, add) form, as stored in the DB ramp/useRampAdd and ramp/useAddFormula columns.
// Mapping checked against every static_power_effectmod and static_power_action row (JSON-Refactor-Plan/scripts/p41.py).
public class CurveRamp {
private static final int RAMP_RANGE = 100;
public final float ramp;
public final boolean useAdd;
private CurveRamp(float ramp, boolean useAdd) {
this.ramp = ramp;
this.useAdd = useAdd;
}
// Null when the curve is unknown or has no ramp form (multi-segment, or a range other than 100).
public static CurveRamp fromCurve(String curveName) {
CompoundCurveTemplate curve = CompoundCurveTemplate._curves.get(curveName);
CompoundCurveTemplate.Segment segment;
if (curve == null || curve.segments.size() != 1)
return null;
segment = curve.segments.get(0);
if (segment.down_per_range != RAMP_RANGE)
return null;
switch (segment.simple_curve) {
case "FlatLine":
return new CurveRamp(0, true);
case "SlopedLine":
return new CurveRamp(segment.params[0], true);
case "SlopedInitValLine":
return new CurveRamp(segment.params[0], false);
default:
return null;
}
}
// Boot check against known DB effectmod rows, one per curve kind, then a list of curves with no ramp form.
public static void verifyRampForms() {
int noRampCount = 0;
verify("SL0083Up", 0.83f, true); // 1AX-001A MeleeDamageModifier
verify("SL0100Down", -1f, true); // ACM-003A MeleeDamageModifier
verify("DefaultFlat", 0f, true); // 1AX-003A DCV
verify("SIVL0014", 0.014f, false); // ANM-002A Health
verify("SL0050Down", -0.5f, true); // CON-100A Health
for (CompoundCurveTemplate curve : CompoundCurveTemplate._curves.values())
if (fromCurve(curve.name) == null) {
Logger.warn("Compound curve " + curve.name + " has no ramp form");
noRampCount++;
}
Logger.info("Compound curves with a ramp form: " + (CompoundCurveTemplate._curves.size() - noRampCount)
+ " of " + CompoundCurveTemplate._curves.size());
}
private static void verify(String curveName, float ramp, boolean useAdd) {
CurveRamp curveRamp = fromCurve(curveName);
if (curveRamp == null || Math.abs(curveRamp.ramp - ramp) > 0.0001f || curveRamp.useAdd != useAdd)
Logger.error("Curve ramp check failed for " + curveName + ": expected (" + ramp + ", " + useAdd + ")"
+ (curveRamp == null ? " got none" : " got (" + curveRamp.ramp + ", " + curveRamp.useAdd + ")"));
}
}
+3
View File
@@ -41,6 +41,7 @@ import engine.parsers.objects.ItemTemplate;
import engine.parsers.objects.RuneTemplate;
import engine.parsers.objects.wpak.CharCreateRuneList;
import engine.parsers.objects.wpak.CompoundCurveTemplate;
import engine.parsers.objects.wpak.CurveRamp;
import engine.parsers.objects.wpak.EffectTemplate;
import engine.parsers.objects.wpak.ModTypeTemplate;
import engine.parsers.objects.wpak.PowActionCostTemplate;
@@ -306,6 +307,8 @@ public class WorldServer {
exit(1);
}
CurveRamp.verifyRampForms();
Logger.info("Loading Mod Types");
ModTypeTemplate._modTypes = ModTypeParser.parseModTypesFile();