Why isn't this editable?¶
Some game classes have fields that will never get an editor, because an editor could not change anything. This page records which, and why.
Read from the class default, not the instance¶
This is the largest group. An editor writes the ability template's instance of an effect.
If the game reads the field as default.X, it is reading the class default from XComGameCore.ini and never looks at the instance. The edit is applied, logged, and ignored.
// X2Effect_Vengeance.uc:43 - every one of its 11 config ints reads this way
StatChance = default.STAT_BASE_CHANCE + DeadRank * default.STAT_PER_RANK_CHANCE;
These fields are not unreachable. They are already tunable, globally, in the game's own config, and that is the right place to change them:
What an editor would add is per-ability control, which the code does not support for these fields. Adding it would need a global-scope edit family.
| Class | Fields read via default. |
Where |
|---|---|---|
X2Effect_Vengeance |
all 11 config ints | X2Effect_Vengeance.uc |
X2Effect_CombatStims |
ARMOR_CHANCE, ARMOR_MITIGATION |
X2Effect_CombatStims.uc |
X2Effect_IncendiaryRounds |
AimMod |
X2Effect_IncendiaryRounds.uc |
X2Effect_TracerRounds |
AimMod |
X2Effect_TracerRounds.uc |
X2Effect_ApplyPoisonToWorld |
Duration (the particle name is editable) |
X2Effect_ApplyPoisonToWorld.uc |
X2Effect_ApplySmokeGrenadeToWorld |
Duration (the particle name is editable) |
X2Effect_ApplySmokeGrenadeToWorld.uc |
X2Effect_Deflect |
5 config ints | |
X2Effect_Marked |
3 config ints | |
X2Effect_Shredder |
ConventionalShred, MagneticShred, BeamShred |
|
X2Effect_Suppression |
3 aim penalties | |
X2Effect_ZeroIn |
CritPerShot, LockedInAimPerShot |
|
X2Effect_BiggestBooms |
CRIT_CHANCE_BONUS, CRIT_DAMAGE_BONUS |
|
X2Effect_Frenzy |
FRENZY_NUM_ACTION_POINTS_ADDED |
|
X2Effect_AidProtocol |
BASE_DEFENSE |
|
X2Effect_Dazed |
DAZE_REMOVE_EFFECTS_TARGET |
|
X2Effect_TheLostHeadshot |
ValidHeadshotAbilities |
|
X2Effect_Blind |
BlindStatusIcon |
|
X2Effect_Burrowed |
BURROWED_PERCENT_DAMAGE_REDUCTION |
|
X2Effect_GatekeeperClosed |
GATEKEEPER_CLOSED_PERCENT_DAMAGE_REDUCTION |
|
X2Effect_ProximityMine |
PersistentParticles |
|
X2Effect_DisableWeapon |
HideVisualizationOfResults, WeaponsImmuneToDisable |
|
X2Effect_SkirmisherReflex |
ReflexUnitValue, TotalEarnedValue |
X2Effect_SkirmisherReflex.uc, XComGameState_Effect.uc |
X2Effect_TargetDefinition |
TargetDefinitionTriggeredEventName |
|
X2Effect_MimicBeacon |
REMOVE_EFFECT_ANIM_NAME (ABILITIES_ALLOWED_TO_HIT is editable) |
|
X2Effect_SpectralArmyUnit |
ADD_EFFECT_ANIM_NAME, REMOVE_EFFECT_ANIM_NAME |
|
X2Effect_DLC_Day60Freeze (Alien Hunters) |
DefenseMod, ConfigStatusIcon - only read by the static factory (the duration and ruler-count fields are editable, through the Alien Hunters bridge) |
DLC_2\X2Effect_DLC_Day60Freeze.uc |
X2Condition_DLC_2_UnitInEscapePortal (Alien Hunters) |
ALIEN_RULER_ESCAPE_RADIUS_TILES_SQ |
|
X2Effect_DLC_3Overdrive (Lost Towers) |
OverdriveUnitValue, ShotModifier |
DLC_3\X2Effect_DLC_3Overdrive.uc |
X2Effect_DLC_3_Nova (Lost Towers) |
MultiTargetPerTickIncrease, SourcePerTickIncrease |
|
X2Effect_DLC_3SacrificeShield (Lost Towers) |
IgnoreDamageTypes, IgnoreAbilities, AbilitiesDisabledForAI |
|
X2Effect_DLC_3AbsorptionField (Lost Towers) |
AbsorbedAbilities |
|
X2Effect_Reaper |
ReaperActivatedName, ReaperKillName |
|
X2Effect_ScanningProtocol |
LookAtDuration |
|
X2Effect_ParthenogenicPoison |
ParthenogenicPoisonType, ParthenogenicPoisonCocoonSpawnedName (AltUnitToSpawnName is editable) |
X2Effect_ParthenogenicPoison.uc, X2Ability_DefaultAbilitySet.uc |
X2Effect_CombatStims is worse
It overrides GetArmorMitigation() to return default.ARMOR_MITIGATION. So the ArmorMitigationAmount field it inherits from the BonusArmor editor is silently ignored too
An entry naming X2Effect_CombatStims and setting ArmorMitigationAmount applies cleanly and does nothing.
X2Effect_DLC_Day60Freeze ignores NumTurns
It overrides GetStartingNumTurns(), so the NumTurns it inherits from the Persistent editor is applied, logged and ignored.
Its length comes from NormalUnitFreezeDuration, LargeUnitFreezeDuration and the ruler freeze counts, all provided by the Alien Hunters bridge.
Never read at all¶
| Class | Field | Evidence |
|---|---|---|
X2AbilityToHitCalc_StasisLance |
HP_THRESHOLD, CLAMPED_MIN, CLAMPED_MAX |
only inside commented-out code. BASE_CHANCE is live but default.-read. |
X2AbilityMultiTarget_Volt |
DistanceBetweenTargets |
not referenced in the SDK. |
X2Effect_DLC_Day60Freeze (Alien Hunters) |
bAllowReorder |
declared, never read. |
No plain field to write¶
There is no assignment an editor could make. An editor would have to call the setter, or map a config name to a delegate.
| Class | Route |
|---|---|
X2Effect_AdditionalAnimSets |
AddAnimSetWithPath(string) - append-only, no way to clear |
X2AbilityTrigger_OnAbilityActivated |
SetListenerData(name) - also overwrites ListenerData.EventID/EventFn/Deferral/Filter, so it resets the whole listener |
X2Effect_Unkillable |
AdditionalEffectsFN delegate |
X2Effect_WeakPoint |
GetValueFn delegate |
DLC packages¶
Classes in the DLC script packages cannot get built-in editors - a mod importing DLC_2 fails to load for players without Alien Hunters - so they go through bridge mods.
What the packages hold, for the nine families:
- DLC_2 (Alien Hunters): three classes with per-ability fields, covered by the
AbilityEditorAlienHuntersbridge: X2Effect_DLC_Day60Freeze,X2Effect_DLC_Day60TurnStartRemoveActionPointsandX2AbilityTrigger_DLC_Day60OnAbilityActivated.X2Effect_DLC_2RulerActionPoint,X2Effect_DLC_Day60FreezingLash,X2Effect_DLC_Day60ShadowfallandX2Effect_DLC_Day60DecrementEffectCounterdeclare no fields of their own and are edited through their ancestors' editors without any bridge.- DLC_3 (Lost Towers): six effects, none with a per-ability field. Every value is read from the class default (rows above) and tuned globally in
DLC_3\XComGameCore.ini;X2Effect_DLC_3RainmakerandX2Effect_DLC_3StrikeDamagetake their numbers from other classes. There is no Lost Towers bridge because it would have nothing to write. - DLC_1 (Anarchy's Children) and TLE: no ability classes at all.
Deliberately skipped¶
| Class | Why |
|---|---|
X2Effect_Panicked, X2Effect_Executed, X2Effect_SpawnGhost |
Localised strings only. That belongs in a localisation file, not an ability edit. |
X2Condition_Wrath |
TargetTile is runtime scratch, set by X2Effect_GetOverThere when applied. |
X2Effect_CallReinforcements |
m_kAudioEvent is an AkEvent object reference. Would need DynamicLoadObject. |
Editable, despite appearances¶
X2Effect_Burning has no editor of its own and does not need one. Its only settable var, BURNED_IGNORES_SHIELDS, is consumed inside SetBurnDamage() at template-build time, before this mod runs.
Its duration and removal rules come from the X2Effect_Persistent editor it falls through to, and its damage lives in a nested X2Effect_ApplyWeaponDamage at ApplyOnTick[0], reachable with ApplyOnTickClass - see Examples.
X2AbilityCooldown and X2AbilityCharges are the only two family base classes that are themselves concrete.
Neither has an IsA editor, but their own vars are written by ApplyBaseEdit in the abstract family editor, reached through the _Base catch-all.
private, protected and const fields. UnrealScript access modifiers exist only at compile time.
The build compiles against an SDK overlay that relaxes the few this mod writes, so X2Effect_Solace.DamageTypeImmunities, X2Effect_BondmateAimAdjust's three bonuses and the like have ordinary editors.
What the overlay cannot fix is a default. read.