Build effect modifiers from Effects.cfg

Each EffectsBase builds its modifiers from its EffectTemplate MODS
lines, with ramps from the CompoundCurve helper. The Value mods now
fill Item.enchantValues, replacing LOAD_ENCHANT_VALUES. The ItemName
skip list of DB row IDs is gone; it only hid Centurion's and
Imperturbable from ./makeitem.

Value changes (cfg wins): weapon power X effects lose the DB-only OCV
mod; PRE-210A..237A resists and SUF-153A..171A resists (doubled);
Speed on SPRINT, SNT-010A, BHN-001A, HNT/RNG-037A, BRD-016A, PRS-031A,
and RNG-049A loses Speed; ARM-058A Necromancy +1; TMP-040A, WLR-018A;
PARRY/CRU-032A gain their Parry line. RESTORE's damage type is NONE
(cfg typo, as the client reads it).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MagicBotandClaude Opus 5.5 committed 2026-10-26 04:40:43 -04:00
1 parent 27c59749fa
commit e2ec8eb8a6
70 files changed
+597 -8

No files matched your search

+224 -1
View File
@@ -27,11 +27,12 @@ import engine.net.client.msg.ApplyEffectMsg;
import engine.objects.AbstractCharacter;
import engine.objects.AbstractWorldObject;
import engine.objects.Effect;
import engine.objects.Item;
import engine.objects.PlayerCharacter;
import engine.parsers.objects.wpak.CurveRamp;
import engine.parsers.objects.wpak.EffectTemplate;
import engine.parsers.objects.wpak.PowerActionTemplate;
import engine.powers.effectmodifiers.AbstractEffectModifier;
import engine.powers.effectmodifiers.*;
import engine.server.MBServerStatics;
import engine.util.Hasher;
import org.pmw.tinylog.Logger;
@@ -140,6 +141,7 @@ public class EffectsBase {
this.isPrefix = this.IDString.startsWith("PRE-");
this.isSuffix = this.IDString.startsWith("SUF-");
loadModifiers(effectTemplate.mods);
loadFailConditions(effectTemplate.conditions);
loadSourceTypes(effectTemplate.sources);
}
@@ -240,6 +242,227 @@ public class EffectsBase {
}
}
// AnimOverride is client-only and has no server modifier
private void loadModifiers(ArrayList<EffectTemplate.ModEntry> mods) {
AbstractEffectModifier modifier;
for (EffectTemplate.ModEntry modEntry : mods) {
switch (modEntry.mod_type) {
case AdjustAboveDmgCap:
modifier = new AdjustAboveDmgCapEffectModifier(this.IDString, modEntry);
break;
case Ambidexterity:
modifier = new AmbidexterityEffectModifier(this.IDString, modEntry);
break;
case ArmorPiercing:
modifier = new ArmorPiercingEffectModifier(this.IDString, modEntry);
break;
case AttackDelay:
modifier = new AttackDelayEffectModifier(this.IDString, modEntry);
break;
case Attr:
modifier = new AttributeEffectModifier(this.IDString, modEntry);
break;
case BlackMantle:
modifier = new BlackMantleEffectModifier(this.IDString, modEntry);
break;
case BladeTrails:
modifier = new BladeTrailsEffectModifier(this.IDString, modEntry);
break;
case Block:
modifier = new BlockEffectModifier(this.IDString, modEntry);
break;
case BlockedPowerType:
modifier = new BlockedPowerTypeEffectModifier(this.IDString, modEntry);
break;
case CannotAttack:
modifier = new CannotAttackEffectModifier(this.IDString, modEntry);
break;
case CannotCast:
modifier = new CannotCastEffectModifier(this.IDString, modEntry);
break;
case CannotMove:
modifier = new CannotMoveEffectModifier(this.IDString, modEntry);
break;
case CannotTrack:
modifier = new CannotTrackEffectModifier(this.IDString, modEntry);
break;
case Charmed:
modifier = new CharmedEffectModifier(this.IDString, modEntry);
break;
case ConstrainedAmbidexterity:
modifier = new ConstrainedAmbidexterityEffectModifier(this.IDString, modEntry);
break;
case DamageCap:
modifier = new DamageCapEffectModifier(this.IDString, modEntry);
break;
case DamageShield:
modifier = new DamageShieldEffectModifier(this.IDString, modEntry);
break;
case DCV:
modifier = new DCVEffectModifier(this.IDString, modEntry);
break;
case Dodge:
modifier = new DodgeEffectModifier(this.IDString, modEntry);
break;
case DR:
modifier = new DREffectModifier(this.IDString, modEntry);
break;
case Durability:
modifier = new DurabilityEffectModifier(this.IDString, modEntry);
break;
case ExclusiveDamageCap:
modifier = new ExclusiveDamageCapEffectModifier(this.IDString, modEntry);
break;
case Fade:
modifier = new FadeEffectModifier(this.IDString, modEntry);
break;
case Fly:
modifier = new FlyEffectModifier(this.IDString, modEntry);
break;
case Health:
modifier = new HealthEffectModifier(this.IDString, modEntry);
break;
case HealthFull:
modifier = new HealthFullEffectModifier(this.IDString, modEntry);
break;
case HealthRecoverRate:
modifier = new HealthRecoverRateEffectModifier(this.IDString, modEntry);
break;
case IgnoreDamageCap:
modifier = new IgnoreDamageCapEffectModifier(this.IDString, modEntry);
break;
case IgnorePassiveDefense:
modifier = new IgnorePassiveDefenseEffectModifier(this.IDString, modEntry);
break;
case ImmuneTo:
modifier = new ImmuneToEffectModifier(this.IDString, modEntry);
break;
case ImmuneToAttack:
modifier = new ImmuneToAttackEffectModifier(this.IDString, modEntry);
break;
case ImmuneToPowers:
modifier = new ImmuneToPowersEffectModifier(this.IDString, modEntry);
break;
case Invisible:
modifier = new InvisibleEffectModifier(this.IDString, modEntry);
break;
case ItemName:
modifier = new ItemNameEffectModifier(this.IDString, modEntry);
if (!((ItemNameEffectModifier) modifier).name.isEmpty())
this.name = ((ItemNameEffectModifier) modifier).name;
break;
case Mana:
modifier = new ManaEffectModifier(this.IDString, modEntry);
break;
case ManaFull:
modifier = new ManaFullEffectModifier(this.IDString, modEntry);
break;
case ManaRecoverRate:
modifier = new ManaRecoverRateEffectModifier(this.IDString, modEntry);
break;
case MaxDamage:
modifier = new MaxDamageEffectModifier(this.IDString, modEntry);
break;
case MeleeDamageModifier:
modifier = new MeleeDamageEffectModifier(this.IDString, modEntry);
break;
case MinDamage:
modifier = new MinDamageEffectModifier(this.IDString, modEntry);
break;
case NoMod:
modifier = new NoModEffectModifier(this.IDString, modEntry);
break;
case OCV:
modifier = new OCVEffectModifier(this.IDString, modEntry);
break;
case Parry:
modifier = new ParryEffectModifier(this.IDString, modEntry);
break;
case PassiveDefense:
modifier = new PassiveDefenseEffectModifier(this.IDString, modEntry);
break;
case PowerCost:
modifier = new PowerCostEffectModifier(this.IDString, modEntry);
break;
case PowerCostHealth:
modifier = new PowerCostHealthEffectModifier(this.IDString, modEntry);
break;
case PowerDamageModifier:
modifier = new PowerDamageEffectModifier(this.IDString, modEntry);
break;
case ProtectionFrom:
modifier = new ProtectionFromEffectModifier(this.IDString, modEntry);
break;
case Resistance:
modifier = new ResistanceEffectModifier(this.IDString, modEntry);
break;
case ScaleHeight:
modifier = new ScaleHeightEffectModifier(this.IDString, modEntry);
break;
case ScaleWidth:
modifier = new ScaleWidthEffectModifier(this.IDString, modEntry);
break;
case ScanRange:
modifier = new ScanRangeEffectModifier(this.IDString, modEntry);
break;
case SeeInvisible:
modifier = new SeeInvisibleEffectModifier(this.IDString, modEntry);
break;
case Silenced:
modifier = new SilencedEffectModifier(this.IDString, modEntry);
break;
case Skill:
modifier = new SkillEffectModifier(this.IDString, modEntry);
break;
case Slay:
modifier = new SlayEffectModifier(this.IDString, modEntry);
break;
case Speed:
modifier = new SpeedEffectModifier(this.IDString, modEntry);
break;
case SpireBlock:
modifier = new SpireBlockEffectModifier(this.IDString, modEntry);
break;
case Stamina:
modifier = new StaminaEffectModifier(this.IDString, modEntry);
break;
case StaminaFull:
modifier = new StaminaFullEffectModifier(this.IDString, modEntry);
break;
case StaminaRecoverRate:
modifier = new StaminaRecoverRateEffectModifier(this.IDString, modEntry);
break;
case Stunned:
modifier = new StunnedEffectModifier(this.IDString, modEntry);
break;
case Value:
modifier = new ValueEffectModifier(this.IDString, modEntry);
this.value = modifier.minMod;
Item.addEnchantValue(this.IDString, (int) modifier.minMod);
break;
case WeaponProc:
modifier = new WeaponProcEffectModifier(this.IDString, modEntry);
break;
case WeaponRange:
modifier = new WeaponRangeEffectModifier(this.IDString, modEntry);
break;
case WeaponSpeed:
modifier = new WeaponSpeedEffectModifier(this.IDString, modEntry);
break;
default:
continue;
}
if (!EffectsBase.modifiersMap.containsKey(this.IDString))
EffectsBase.modifiersMap.put(this.IDString, new HashSet<>());
EffectsBase.modifiersMap.get(this.IDString).add(modifier);
}
}
private void loadSourceTypes(ArrayList<String> sources) {
if (sources.isEmpty())