Build power action lists from Powers.cfg ACTION= lines

ActionsBase(ActionEntry, powerID, id, powerAction) with the duration ramp
from CurveRamp; PowersManager.loadActionLists fills PowersBase.actions in
Powers.cfg order (ids 1..2278 + 10000), then the OPENGATE actions
(5001-5008, unchanged). StackType gains the 10 cfg stack types it lacked
and loses the DB-only ResistanceDebuff spelling.

Parity (JSON-Refactor-Plan/scripts/p49.py, dev export, every column):
2287 DB rows vs 2278 cfg lines; 1453/1455 powers have the same action
list; all curves have a ramp form, every action id exists.

Value changes (cfg wins):
- TRA-003..010 lose their DB OPENGATE row; the synthetic OPENGATE action
  was already added, so each gate power applied OPENGATE twice
- HFG-001 loses the DB-only third action HFG-001B (Str +25, attack
  delay -15, melee damage +15)
- SCT-004 applies SCT-004A (Speed SL0125Up, Buff/Effect) instead of
  RNG-033A (Speed SL0100Up, also Chant)
- durations: ALF-001A 180->60, COM-001A 60->30, FGM-002A/003A
  1800->900, RNG-033A 60->30
- stack priority: DEF/OFF/PRE/NOSTANCE A and B Always->GreaterThanOrEqualTo,
  BRD-016A and PRS-031A GreaterThan->GreaterThanOrEqualTo
- stack types: the 16 resist debuffs split from ResistanceDeBuff/
  ResistanceDebuff into Cold/Fire/Lightning/Holy/Unholy/Magic/Mental
  DeBuff (FUR-029A IgnoreStack->ElementalDeBuff), so debuffs of different
  elements now stack; HNT-023A..C StackableAttr*Buff->PersonalAttr*Buff
- IgnoreStack effect keys: action line ids follow cfg order (runtime only)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MagicBotandClaude Opus 5.5 committed 2026-10-26 10:20:34 -04:00
1 parent f44f1ca138
commit 2a19a85108
3 files changed
+84 -4

No files matched your search

+44
View File
@@ -16,6 +16,8 @@ import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.mbEnums.StackType;
import engine.objects.*;
import engine.parsers.objects.wpak.CurveRamp;
import engine.parsers.objects.wpak.PowerTemplate;
import engine.powers.poweractions.AbstractPowerAction;
import org.pmw.tinylog.Logger;
@@ -89,6 +91,43 @@ public class ActionsBase {
this.powerAction = apa.get(this.effectID);
}
public ActionsBase(PowerTemplate.ActionEntry actionEntry, String powerID, int id, AbstractPowerAction powerAction) {
CurveRamp durationRamp = CurveRamp.fromCurve(actionEntry.duration_curve);
if (durationRamp == null) {
Logger.warn("Power " + powerID + " action " + actionEntry.action_id + " duration curve "
+ actionEntry.duration_curve + " has no ramp form");
durationRamp = CurveRamp.NONE;
}
this.UUID = id + ACTION_ID_OFFSET;
this.IDString = powerID;
this.effectID = actionEntry.action_id;
this.minTrains = actionEntry.min_trains;
this.maxTrains = actionEntry.max_trains;
this.duration = actionEntry.duration;
this.ramp = durationRamp.ramp;
this.addFormula = durationRamp.useAdd;
this.stackType = actionEntry.stack_type;
this.stackTypeType = StackType.GetStackType(this.stackType);
this.stackOrder = actionEntry.stack_order;
this.stackPriority = actionEntry.stack_priority.name();
switch (actionEntry.stack_priority) {
case GreaterThanOrEqualTo:
this.greaterThanEqual = true;
break;
case Always:
this.always = true;
break;
case GreaterThan:
this.greaterThan = true;
break;
}
this.powerAction = powerAction;
}
protected ActionsBase(int uUID, String effectID, int minTrains, int maxTrains, float duration, float ramp,
boolean addFormula, String stackType, int stackOrder, boolean greaterThanEqual, boolean always,
boolean greaterThan, AbstractPowerAction powerAction) {
@@ -162,6 +201,11 @@ public class ActionsBase {
Logger.error(e.toString());
}
addOpenGateActions(powers);
}
public static void addOpenGateActions(HashMap<String, PowersBase> powers) {
int gateID = 5000;
for (String IDString : Runegate.GetAllOpenGateIDStrings()) {