{
  "$comment": "Generated by .scripts/generate-docs.ps1 - do not edit by hand.",
  "sourceHash": "b63de9584fdc7e2b208f8bb1256d20dc14d52cab3bd324c202bd86e3b550e65f",
  "enums": [
    {
      "name": "EStatChangeMode",
      "values": [
        {
          "name": "eSCM_Replace",
          "description": "Clear existing stat changes (`m_aStatChanges`) before applying yours. (Default)"
        },
        {
          "name": "eSCM_Merge",
          "description": "Update the entry for each `StatType` if present, otherwise add it."
        }
      ]
    },
    {
      "name": "EAbilityEffectSlot",
      "values": [
        {
          "name": "eAES_Target",
          "description": "Edit `AbilityTargetEffects` (effects applied to the primary target). (Default)"
        },
        {
          "name": "eAES_MultiTarget",
          "description": "Edit `AbilityMultiTargetEffects`."
        },
        {
          "name": "eAES_Shooter",
          "description": "Edit `AbilityShooterEffects` (effects applied to the shooter)."
        }
      ]
    },
    {
      "name": "EChargesBonusMode",
      "values": [
        {
          "name": "eCBM_Replace",
          "description": "Clear existing `BonusCharges` entries before applying yours. (Default)"
        },
        {
          "name": "eCBM_Merge",
          "description": "Update the entry for each `AbilityName` if present, otherwise add it."
        }
      ]
    },
    {
      "name": "EAdditionalCooldownEditMode",
      "values": [
        {
          "name": "eACEM_Replace",
          "description": "Clear existing `AditionalAbilityCooldowns` entries before applying yours. (Default)"
        },
        {
          "name": "eACEM_Merge",
          "description": "Update the entry for each `AbilityName` if present, otherwise add it."
        }
      ]
    },
    {
      "name": "EAbilityCostEditMode",
      "values": [
        {
          "name": "eACEM_ReplaceAll",
          "description": "As `CostMode`: clear **all** existing costs before applying the entries. As per-entry `Mode`: edit in place if a cost of that class exists, otherwise skip (unless `CostMode=eACEM_ReplaceAll`, in which case a new cost is added). (Default)"
        },
        {
          "name": "eACEM_Merge",
          "description": "Edit the existing cost of that class in place; if none exists, instantiate and add it."
        },
        {
          "name": "eACEM_AddOnly",
          "description": "Same as `eACEM_Merge`: edit in place if present, otherwise add."
        },
        {
          "name": "eACEM_Remove",
          "description": "Remove the cost of that class from the ability."
        }
      ]
    },
    {
      "name": "EArrayEditMode",
      "values": [
        {
          "name": "eAEM_ReplaceAll",
          "description": "Clear the whole target array, then add this effect/condition. (Default)"
        },
        {
          "name": "eAEM_Merge",
          "description": "Edit the existing effect/condition of that class in place; if none exists, instantiate and add it."
        },
        {
          "name": "eAEM_AddOnly",
          "description": "Same as `eAEM_Merge`: edit in place if present, otherwise add."
        },
        {
          "name": "eAEM_Remove",
          "description": "Remove the first effect/condition of that class from the target array."
        }
      ]
    },
    {
      "name": "ENameArrayEditMode",
      "values": [
        {
          "name": "eNAEM_Replace",
          "description": "Replace the whole target array with the provided values. (Default)"
        },
        {
          "name": "eNAEM_Merge",
          "description": "Append each provided value that is not already present."
        },
        {
          "name": "eNAEM_AddOnly",
          "description": "Set the provided values **only if the target array is currently empty**; otherwise do nothing. It does not append."
        },
        {
          "name": "eNAEM_Remove",
          "description": "Remove each provided value from the target array."
        }
      ]
    },
    {
      "name": "EAbilityCreatePreset",
      "values": [
        {
          "name": "eACP_Standard",
          "description": "`TypicalAbility_BuildGameState`, `TypicalAbility_BuildVisualization` and `TypicalAbility_BuildInterruptGameState`: a normal activated ability such as a shot, a grenade or a protocol. The entry must still provide `TargetStyle`, `ToHitCalc` and `Triggers`. (Default)"
        },
        {
          "name": "eACP_MoveEnd",
          "description": "As Standard, but the game state is built by `TypicalMoveEndAbility_BuildGameState`: a move-then-act ability such as Slash. Expects an `X2AbilityTarget_MovingMelee` target style."
        },
        {
          "name": "eACP_Passive",
          "description": "`TypicalAbility_BuildGameState` only, no visualization, `bIsPassive=true`, neutral hostility, icon hidden in the HUD. Installs `X2AbilityTarget_Self`, `X2AbilityTrigger_UnitPostBeginPlay` and `X2AbilityToHitCalc_DeadEye`, so the entry only has to add the persistent effect."
        }
      ]
    }
  ],
  "structs": [
    {
      "name": "AdditionalCooldownEdit",
      "fields": [
        {
          "name": "AbilityName",
          "type": "name",
          "kind": "plain",
          "description": "Ability whose cooldown entry is added/updated in `AditionalAbilityCooldowns`."
        },
        {
          "name": "NumTurns",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Cooldown applied to that other ability, in turns.",
          "guard": "SetNumTurns"
        },
        {
          "name": "UseAbilityCooldownNumTurns",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetUseAbilityCooldownNumTurns"
        },
        {
          "name": "ApplyCooldownType",
          "type": "name",
          "kind": "plain",
          "description": "`AdditionalCooldown_ApplyLarger` or `AdditionalCooldown_ApplySmaller`. Applied when non-empty."
        }
      ]
    },
    {
      "name": "BonusChargeEdit",
      "fields": [
        {
          "name": "AbilityName",
          "type": "name",
          "kind": "plain",
          "description": "Ability that grants the bonus charges."
        },
        {
          "name": "NumCharges",
          "type": "int",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetNumCharges"
        }
      ]
    },
    {
      "name": "CostEdit",
      "fields": [
        {
          "name": "Class",
          "type": "string",
          "kind": "plain",
          "description": "Cost class to target/instantiate, e.g. `X2AbilityCost_ActionPoints`. Bare names are auto-prefixed with `XComGame.`; empty falls back to `X2AbilityCost`."
        },
        {
          "name": "Mode",
          "type": "EAbilityCostEditMode",
          "kind": "plain",
          "description": "Per-entry edit mode (`EAbilityCostEditMode`). Defaults to the enum's first value, which clears the existing list."
        },
        {
          "name": "FreeCost",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Makes the ability cost nothing. The ability must satisfy the requirement to be usable, but using it doesn't consume action point.",
          "guard": "SetFreeCost"
        },
        {
          "name": "NumPoints",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Action points the ability consumes.",
          "guard": "SetNumPoints"
        },
        {
          "name": "AddWeaponTypicalCost",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Adds the weapon's own typical action cost on top of NumPoints.",
          "guard": "SetAddWeaponTypicalCost"
        },
        {
          "name": "ConsumeAllPoints",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Ends the turn by consuming every remaining action point, rather than just NumPoints.",
          "guard": "SetConsumeAllPoints"
        },
        {
          "name": "MoveCost",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Treats the cost as movement, so effects and abilities that key off moving apply.",
          "guard": "SetMoveCost"
        },
        {
          "name": "AllowedTypes",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Action point types that may pay this cost. Restricting it stops the ability being paid for with, say, a Run-and-Gun point.",
          "modeField": "AllowedTypesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "AllowedTypesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "DoNotConsumeAllEffects",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "If the user is under any of these effects, ConsumeAllPoints is ignored and the turn does not end.",
          "modeField": "DoNotConsumeAllEffectsMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "DoNotConsumeAllEffectsMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "DoNotConsumeAllSoldierAbilities",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "If the user has any of these abilities, ConsumeAllPoints is ignored. This is how Blademaster lets Slash keep the turn going.",
          "modeField": "DoNotConsumeAllSoldierAbilitiesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "DoNotConsumeAllSoldierAbilitiesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "SharedAbilityCharges",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Other abilities whose charges are spent alongside this one, as Skulljack and Skullmine share a pool. Applied when paying, never when checking affordability.",
          "modeField": "SharedAbilityChargesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "SharedAbilityChargesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "FocusAmount",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Templar focus consumed.",
          "guard": "SetFocusAmount"
        },
        {
          "name": "ConsumeAllFocus",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Spends the user's entire focus pool rather than FocusAmount.",
          "guard": "SetConsumeAllFocus"
        },
        {
          "name": "GhostOnlyCost",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Only charges focus to a Ghost, leaving the original Templar's pool untouched.",
          "guard": "SetGhostOnlyCost"
        },
        {
          "name": "NumAmmo",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Ammo consumed per use. With ConsumeAllAmmo set this becomes the minimum needed to fire, rather than the amount spent.",
          "guard": "SetNumAmmo"
        },
        {
          "name": "UseLoadedAmmo",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Draws from the loaded grenade rather than the weapon's ammo, for grenade-launcher abilities.",
          "guard": "SetUseLoadedAmmo"
        },
        {
          "name": "ReturnChargesError",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reports a shortfall as \"out of charges\" instead of \"out of ammo\", for abilities presented to the player as charge-based.",
          "guard": "SetReturnChargesError"
        },
        {
          "name": "ConsumeAllAmmo",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Spends the whole magazine. NumAmmo then only sets the minimum required to fire.",
          "guard": "SetConsumeAllAmmo"
        },
        {
          "name": "NumCharges",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Charges consumed per use.",
          "guard": "SetNumCharges"
        },
        {
          "name": "OnlyOnHit",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Only spends the charge when the ability hits, so a miss costs nothing.",
          "guard": "SetOnlyOnHit"
        },
        {
          "name": "AlsoExpendChargesOnSharedBondmateAbility",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Also spends the bondmate's charges of the shared ability.",
          "guard": "SetAlsoExpendChargesOnSharedBondmateAbility"
        }
      ]
    },
    {
      "name": "CooldownEdit",
      "fields": [
        {
          "name": "Class",
          "type": "string",
          "kind": "plain",
          "description": "Optional. Omitted = edit the existing cooldown in place. Set = target/instantiate that class, e.g. `X2AbilityCooldown_PerPlayerType`. Bare names are auto-prefixed with `XComGame.`."
        },
        {
          "name": "NumTurns",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Turns the ability is unavailable after use.",
          "guard": "SetNumTurns"
        },
        {
          "name": "IgnoreOnHit",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Skips applying the cooldown when the ability hits, so only a miss puts it on cooldown.",
          "guard": "SetIgnoreOnHit"
        },
        {
          "name": "AdditionalCooldownMode",
          "type": "EAdditionalCooldownEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "AdditionalCooldowns",
          "type": "array<AdditionalCooldownEdit>",
          "kind": "nested",
          "description": "Cooldowns this ability also puts on *other* abilities, keyed by AbilityName. Used where firing one thing should lock out another.",
          "modeField": "AdditionalCooldownMode",
          "modeEnum": "EAdditionalCooldownEditMode"
        },
        {
          "name": "NumTurnsForAI",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Cooldown used when the unit is AI-controlled, letting XCOM and the enemy run different timings. Only on X2AbilityCooldown_PerPlayerType.",
          "guard": "SetNumTurnsForAI"
        },
        {
          "name": "NumGlobalTurns",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Cooldown applied across every unit on the team, not just the one that used the ability. Only on the global cooldown classes.",
          "guard": "SetNumGlobalTurns"
        }
      ]
    },
    {
      "name": "ChargesEdit",
      "fields": [
        {
          "name": "Class",
          "type": "string",
          "kind": "plain",
          "description": "Optional. Omitted = edit the existing charges object in place. Set = target/instantiate that class, e.g. `X2AbilityCharges_GremlinHeal`. Bare names are auto-prefixed with `XComGame.`."
        },
        {
          "name": "InitialCharges",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Charges the ability starts a mission with.",
          "guard": "SetInitialCharges"
        },
        {
          "name": "BonusChargesMode",
          "type": "EChargesBonusMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "BonusCharges",
          "type": "array<BonusChargeEdit>",
          "kind": "nested",
          "description": "Extra charges granted when the unit has another ability, keyed by AbilityName. This is how Restoration adds charges to the medikit heal.",
          "modeField": "BonusChargesMode",
          "modeEnum": "EChargesBonusMode"
        },
        {
          "name": "RemoveCharges",
          "type": "bool",
          "kind": "plain",
          "description": "Set to true to remove the ability's charges object entirely. No `Class` needed; the other fields of the block are ignored."
        },
        {
          "name": "Stabilize",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Whether the charges behave as the stabilise-style pool, on the charge classes that support it.",
          "guard": "SetStabilize"
        }
      ]
    },
    {
      "name": "AECustomProperty",
      "fields": [
        {
          "name": "Key",
          "type": "name",
          "kind": "plain",
          "description": ""
        },
        {
          "name": "Value",
          "type": "string",
          "kind": "plain",
          "description": ""
        }
      ]
    },
    {
      "name": "ConditionEdit",
      "fields": [
        {
          "name": "Class",
          "type": "string",
          "kind": "plain",
          "description": "Condition class to target/instantiate, e.g. `X2Condition_UnitProperty`. Bare names are auto-prefixed with `XComGame.`."
        },
        {
          "name": "Mode",
          "type": "EArrayEditMode",
          "kind": "plain",
          "description": "Per-entry edit mode (`EArrayEditMode`). Defaults to the enum's first value, which clears the existing array."
        },
        {
          "name": "OwnerHasSoldierAbilitiesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Condition_AbilityProperty"
        },
        {
          "name": "OwnerHasSoldierAbilities",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Soldier abilities the unit owning the ability must have.",
          "modeField": "OwnerHasSoldierAbilitiesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "TargetMustBeInValidTiles",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject targets standing outside the ability's valid tiles.",
          "guard": "SetTargetMustBeInValidTiles"
        },
        {
          "name": "WantsReload",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Fail with AA_AmmoAlreadyFull when the source weapon's clip is already full.",
          "guard": "SetWantsReload"
        },
        {
          "name": "CheckAmmo",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Compare the source weapon's ammo against CheckAmmoData.",
          "guard": "SetCheckAmmo"
        },
        {
          "name": "CheckAmmoData",
          "type": "CheckConfig",
          "kind": "optionalScalar",
          "description": "The ammo check used when CheckAmmo is true: Value, CheckType, and ValueMin/ValueMax for range checks.",
          "guard": "SetCheckAmmoData"
        },
        {
          "name": "NotLoadedAmmoInSecondaryWeapon",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Fail when the source weapon is currently loaded as ammo in the secondary weapon.",
          "guard": "SetNotLoadedAmmoInSecondaryWeapon"
        },
        {
          "name": "MatchGrenadeType",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Grenade template the source weapon, or its loaded ammo, must be.",
          "guard": "SetMatchGrenadeType"
        },
        {
          "name": "CheckGrenadeFriendlyFire",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject friendly targets unless the grenade template allows friendly fire.",
          "guard": "SetCheckGrenadeFriendlyFire"
        },
        {
          "name": "CheckAmmoTechLevel",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject the source ammo when it is not valid for the unit's primary weapon.",
          "guard": "SetCheckAmmoTechLevel"
        },
        {
          "name": "MatchWeaponTemplate",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Weapon template the source weapon must be, exact match on its DataName.",
          "guard": "SetMatchWeaponTemplate"
        },
        {
          "name": "StilettoRounds",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Pass only while the Stiletto Rounds dark event is active.",
          "guard": "SetStilettoRounds"
        },
        {
          "name": "RequiredGameplayTag",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Tactical gameplay tag XCOM HQ must carry for the ability to be valid.",
          "guard": "SetRequiredGameplayTag"
        },
        {
          "name": "DisallowGameplayTag",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Tactical gameplay tag that makes the ability invalid while XCOM HQ carries it.",
          "guard": "SetDisallowGameplayTag"
        },
        {
          "name": "HourChecksMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Condition_GameTime"
        },
        {
          "name": "HourChecks",
          "type": "array<CheckConfig>",
          "kind": "modedArray",
          "description": "Checks against the current hour of the day; the condition passes when any one of them does. Merge adds checks not already present.",
          "modeField": "HourChecksMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "NumTurnsCheck",
          "type": "CheckConfig",
          "kind": "optionalScalar",
          "description": "Check against the number of turns the target's controlling player has taken.",
          "guard": "SetNumTurnsCheck"
        },
        {
          "name": "ActionPointChecksMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Condition_UnitActionPoints (merged by ActionPointType)"
        },
        {
          "name": "ActionPointChecks",
          "type": "array<ActionPointCheck>",
          "kind": "modedArray",
          "description": "Action point checks; passes when any one of them does. Each names an action point type, whether to count reserved points, and the value check.",
          "modeField": "ActionPointChecksMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "RequiredAlertStatusMaximum",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Highest alert level the unit may have. -1 ignores it; the condition fails when both limits are -1.",
          "guard": "SetRequiredAlertStatusMaximum"
        },
        {
          "name": "RequiredAlertStatusMinimum",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Lowest alert level the unit may have. -1 ignores it; the condition fails when both limits are -1.",
          "guard": "SetRequiredAlertStatusMinimum"
        },
        {
          "name": "ExcludeEffectsMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Condition_UnitEffects and its subclasses (merged by EffectName)"
        },
        {
          "name": "ExcludeEffects",
          "type": "array<EffectReason>",
          "kind": "modedArray",
          "description": "Effects that reject the unit when present, each with the failure reason to return.",
          "modeField": "ExcludeEffectsMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "RequireEffectsMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "RequireEffects",
          "type": "array<EffectReason>",
          "kind": "modedArray",
          "description": "Effects that must all be present on the unit, each with the failure reason to return.",
          "modeField": "RequireEffectsMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "ExcludeDamageTypesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Condition_UnitImmunities"
        },
        {
          "name": "ExcludeDamageTypes",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Damage types; a unit immune to any of them is rejected.",
          "modeField": "ExcludeDamageTypesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "OnlyOnCharacterTemplate",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Consider only the immunities of the unit's character template, not those granted by effects.",
          "guard": "SetOnlyOnCharacterTemplate"
        },
        {
          "name": "InteractionType",
          "type": "UnitInterationType",
          "kind": "optionalScalar",
          "description": "Kind of interaction point the unit must be next to: eInteractionType_Normal or eInteractionType_Hack.",
          "guard": "SetInteractionType"
        },
        {
          "name": "RelevantSlot",
          "type": "EInventorySlot",
          "kind": "optionalScalar",
          "description": "Inventory slot whose item is checked.",
          "guard": "SetRelevantSlot"
        },
        {
          "name": "ExcludeWeaponCategory",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Weapon category that rejects the unit when the item in RelevantSlot has it.",
          "guard": "SetExcludeWeaponCategory"
        },
        {
          "name": "RequireWeaponCategory",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Weapon category the item in RelevantSlot must have. Fails when the slot is empty.",
          "guard": "SetRequireWeaponCategory"
        },
        {
          "name": "ExcludeAlive",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject living units.",
          "guard": "SetExcludeAlive"
        },
        {
          "name": "ExcludeDead",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject dead units.",
          "guard": "SetExcludeDead"
        },
        {
          "name": "ExcludeRobotic",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject robotic units.",
          "guard": "SetExcludeRobotic"
        },
        {
          "name": "ExcludeOrganic",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject organic units.",
          "guard": "SetExcludeOrganic"
        },
        {
          "name": "ExcludeCivilian",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject units whose character template is civilian, whatever their team.",
          "guard": "SetExcludeCivilian"
        },
        {
          "name": "ExcludeNonCivilian",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject units whose character template is not civilian, whatever their team.",
          "guard": "SetExcludeNonCivilian"
        },
        {
          "name": "ExcludeCosmetic",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject cosmetic units, such as Gremlins.",
          "guard": "SetExcludeCosmetic"
        },
        {
          "name": "ExcludeImpaired",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject impaired units.",
          "guard": "SetExcludeImpaired"
        },
        {
          "name": "ExcludePanicked",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject panicked units.",
          "guard": "SetExcludePanicked"
        },
        {
          "name": "ExcludeInStasis",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject units in stasis.",
          "guard": "SetExcludeInStasis"
        },
        {
          "name": "ExcludeTurret",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject turrets.",
          "guard": "SetExcludeTurret"
        },
        {
          "name": "ExcludePsionic",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject psionic units.",
          "guard": "SetExcludePsionic"
        },
        {
          "name": "ExcludeNonPsionic",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject non-psionic units.",
          "guard": "SetExcludeNonPsionic"
        },
        {
          "name": "IsAdvent",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require an ADVENT unit.",
          "guard": "SetIsAdvent"
        },
        {
          "name": "ExcludeAdvent",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject ADVENT units.",
          "guard": "SetExcludeAdvent"
        },
        {
          "name": "ExcludeNoCover",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject units that are not in cover.",
          "guard": "SetExcludeNoCover"
        },
        {
          "name": "ExcludeNoCoverToSource",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject units with no cover between them and the source.",
          "guard": "SetExcludeNoCoverToSource"
        },
        {
          "name": "ExcludeFullHealth",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject units at full HP, unless a persistent damage effect listed in MedikitHealEffectTypes is on them.",
          "guard": "SetExcludeFullHealth"
        },
        {
          "name": "IsBleedingOut",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require a unit that is bleeding out.",
          "guard": "SetIsBleedingOut"
        },
        {
          "name": "IsUnspotted",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require a unit that has not been spotted.",
          "guard": "SetIsUnspotted"
        },
        {
          "name": "CanBeCarried",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require a unit that can be carried.",
          "guard": "SetCanBeCarried"
        },
        {
          "name": "IsOutdoors",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require a unit standing outdoors.",
          "guard": "SetIsOutdoors"
        },
        {
          "name": "IsConcealed",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require a concealed unit.",
          "guard": "SetIsConcealed"
        },
        {
          "name": "ExcludeConcealed",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject concealed units. Only applies to the check without a source; visibility rules normally cover this.",
          "guard": "SetExcludeConcealed"
        },
        {
          "name": "IsSuperConcealed",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require a unit in super concealment.",
          "guard": "SetIsSuperConcealed"
        },
        {
          "name": "IsImpaired",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require an impaired unit.",
          "guard": "SetIsImpaired"
        },
        {
          "name": "HasClearanceToMaxZ",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require open space above the unit up to the map ceiling.",
          "guard": "SetHasClearanceToMaxZ"
        },
        {
          "name": "ExcludeAlien",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject alien units.",
          "guard": "SetExcludeAlien"
        },
        {
          "name": "ExcludeNonHumanoidAliens",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject aliens that are not humanoid.",
          "guard": "SetExcludeNonHumanoidAliens"
        },
        {
          "name": "ExcludeStunned",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject stunned units.",
          "guard": "SetExcludeStunned"
        },
        {
          "name": "ExcludeDazed",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject dazed units.",
          "guard": "SetExcludeDazed"
        },
        {
          "name": "ExcludeUnableToAct",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject units that are unable to act.",
          "guard": "SetExcludeUnableToAct"
        },
        {
          "name": "IsPlayerControlled",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require a player-controlled unit.",
          "guard": "SetIsPlayerControlled"
        },
        {
          "name": "ExcludeUnrevealedAI",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject AI units that have not been revealed yet.",
          "guard": "SetExcludeUnrevealedAI"
        },
        {
          "name": "IncludeWeakAgainstTechLikeRobot",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Treat units flagged as weak against tech as robotic for the robotic checks.",
          "guard": "SetIncludeWeakAgainstTechLikeRobot"
        },
        {
          "name": "ImpairedIgnoresStuns",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Do not count stuns when deciding whether a unit is impaired.",
          "guard": "SetImpairedIgnoresStuns"
        },
        {
          "name": "IsScampering",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require a unit that is currently scampering.",
          "guard": "SetIsScampering"
        },
        {
          "name": "ExcludeDeadFromSpecialDeath",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject units killed by a special death.",
          "guard": "SetExcludeDeadFromSpecialDeath"
        },
        {
          "name": "ExcludeLargeUnits",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject units larger than one tile.",
          "guard": "SetExcludeLargeUnits"
        },
        {
          "name": "ImpairedIgnoresImpairingMomentarily",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Do not count momentary impairment when deciding whether a unit is impaired.",
          "guard": "SetImpairedIgnoresImpairingMomentarily"
        },
        {
          "name": "MinRank",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Lowest soldier rank allowed.",
          "guard": "SetMinRank"
        },
        {
          "name": "MaxRank",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Highest soldier rank allowed.",
          "guard": "SetMaxRank"
        },
        {
          "name": "ExcludeSoldierClassesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "ExcludeSoldierClasses",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Soldier classes that reject the unit. Non-soldiers always pass.",
          "modeField": "ExcludeSoldierClassesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "RequireSoldierClassesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "RequireSoldierClasses",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Soldier classes the unit must be one of, when non-empty. Non-soldiers always fail.",
          "modeField": "RequireSoldierClassesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "ExcludeHostileToSource",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject units hostile to the source.",
          "guard": "SetExcludeHostileToSource"
        },
        {
          "name": "ExcludeFriendlyToSource",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject units friendly to the source.",
          "guard": "SetExcludeFriendlyToSource"
        },
        {
          "name": "TreatMindControlledSquadmateAsHostile",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Count a mind-controlled squadmate as hostile rather than friendly.",
          "guard": "SetTreatMindControlledSquadmateAsHostile"
        },
        {
          "name": "ExcludeSquadmates",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reject units on the same team as the source.",
          "guard": "SetExcludeSquadmates"
        },
        {
          "name": "RequireSquadmates",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require the unit to be on the same team as the source.",
          "guard": "SetRequireSquadmates"
        },
        {
          "name": "RequireWithinRange",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require the unit to be within WithinRange of the source.",
          "guard": "SetRequireWithinRange"
        },
        {
          "name": "WithinRange",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Maximum distance between source and target, in Unreal units. A tile is 96.",
          "guard": "SetWithinRange"
        },
        {
          "name": "RequireWithinMinRange",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require the unit to be within WithinMinRange of the source.",
          "guard": "SetRequireWithinMinRange"
        },
        {
          "name": "WithinMinRange",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Distance for the minimum-range check, in Unreal units. A tile is 96.",
          "guard": "SetWithinMinRange"
        },
        {
          "name": "BeingCarriedBySource",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require a unit currently carried by the source.",
          "guard": "SetBeingCarriedBySource"
        },
        {
          "name": "RequireUnitSelectedFromHQ",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require a unit that was selected from Headquarters for the mission. XCOM only.",
          "guard": "SetRequireUnitSelectedFromHQ"
        },
        {
          "name": "FailOnNonUnits",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Fail with AA_NotAUnit on non-unit targets instead of passing them through.",
          "guard": "SetFailOnNonUnits"
        },
        {
          "name": "CheckStatsMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Condition_UnitStatCheck (merged by StatType)"
        },
        {
          "name": "CheckStats",
          "type": "array<CheckStat>",
          "kind": "modedArray",
          "description": "Stat checks that must all pass: the stat, the value check, and whether to compare as a percentage of the stat's maximum.",
          "modeField": "CheckStatsMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "IncludeTypesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Condition_UnitType"
        },
        {
          "name": "IncludeTypes",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Character groups the unit must belong to, when non-empty. Takes precedence over ExcludeTypes.",
          "modeField": "IncludeTypesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "ExcludeTypesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "ExcludeTypes",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Character groups that reject the unit. Ignored while IncludeTypes is non-empty.",
          "modeField": "ExcludeTypesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "CheckValuesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Condition_UnitValue (merged by UnitValue)"
        },
        {
          "name": "CheckValues",
          "type": "array<CheckValue>",
          "kind": "modedArray",
          "description": "Unit value checks that must all pass: the value name, the value check, and an optional failure code to return instead of the default.",
          "modeField": "CheckValuesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "NoEnemyViewers",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Fail when any enemy can see the target.",
          "guard": "SetNoEnemyViewers"
        },
        {
          "name": "RequireMatchCoverType",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require the target to be in the cover type given by TargetCover.",
          "guard": "SetRequireMatchCoverType"
        },
        {
          "name": "RequireNotMatchCoverType",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require the target not to be in the cover type given by TargetCover.",
          "guard": "SetRequireNotMatchCoverType"
        },
        {
          "name": "TargetCover",
          "type": "ECoverType",
          "kind": "optionalScalar",
          "description": "Cover type used by RequireMatchCoverType and RequireNotMatchCoverType.",
          "guard": "SetTargetCover"
        },
        {
          "name": "CannotPeek",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require the shooter to see the target from its own tile, without peeking.",
          "guard": "SetCannotPeek"
        },
        {
          "name": "RequireLOS",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require line of sight.",
          "guard": "SetRequireLOS"
        },
        {
          "name": "RequireBasicVisibility",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require line of sight and range.",
          "guard": "SetRequireBasicVisibility"
        },
        {
          "name": "RequireGameplayVisible",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require line of sight, range and the situational gameplay-visibility rules.",
          "guard": "SetRequireGameplayVisible"
        },
        {
          "name": "AllowSquadsight",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Accept any squadmate's view of the target if the unit has Squadsight. Overrides RequireGameplayVisible.",
          "guard": "SetAllowSquadsight"
        },
        {
          "name": "ActAsSquadsight",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Accept any squadmate's view of the target whether or not the unit has Squadsight. Overrides RequireGameplayVisible.",
          "guard": "SetActAsSquadsight"
        },
        {
          "name": "VisibleToAnyAlly",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Accept the target when any squadmate can see it, without line of sight from the unit itself. Overrides RequireGameplayVisible.",
          "guard": "SetVisibleToAnyAlly"
        },
        {
          "name": "DisablePeeksOnMovement",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Forbid peeking once the target has moved.",
          "guard": "SetDisablePeeksOnMovement"
        },
        {
          "name": "ExcludeGameplayVisible",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Fail when the target has gameplay visibility of the source.",
          "guard": "SetExcludeGameplayVisible"
        },
        {
          "name": "RequireGameplayVisibleTagsMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "RequireGameplayVisibleTags",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Visibility tags that must be present on the visibility info, such as concealed or stealthed.",
          "modeField": "RequireGameplayVisibleTagsMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "MissionAborted",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require the mission to have been aborted.",
          "guard": "SetMissionAborted"
        },
        {
          "name": "MissionNotAborted",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require the mission not to have been aborted.",
          "guard": "SetMissionNotAborted"
        },
        {
          "name": "CiviliansTargetedByAliens",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require a mission where aliens target civilians.",
          "guard": "SetCiviliansTargetedByAliens"
        },
        {
          "name": "CiviliansNotTargetedByAliens",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require a mission where aliens do not target civilians.",
          "guard": "SetCiviliansNotTargetedByAliens"
        },
        {
          "name": "IncludeTheLostInEngagedCount",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Count the Lost among the engaged enemies.",
          "guard": "SetIncludeTheLostInEngagedCount"
        },
        {
          "name": "MinEngagedEnemies",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Fewest engaged enemies required. -1 ignores it.",
          "guard": "SetMinEngagedEnemies"
        },
        {
          "name": "MaxEngagedEnemies",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Most engaged enemies allowed. -1 ignores it.",
          "guard": "SetMaxEngagedEnemies"
        },
        {
          "name": "FailOnNonUnitTargets",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Fail with AA_NotAUnit on non-unit targets instead of passing them through.",
          "guard": "SetFailOnNonUnitTargets"
        },
        {
          "name": "MinBondLevel",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Lowest bond level between the two units, inclusive.",
          "guard": "SetMinBondLevel"
        },
        {
          "name": "MaxBondLevel",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Highest bond level between the two units, inclusive.",
          "guard": "SetMaxBondLevel"
        },
        {
          "name": "RequiresAdjacency",
          "type": "AdjacencyRequirement",
          "kind": "optionalScalar",
          "description": "Whether the bondmates may, must not, or must be adjacent: EAR_AnyAdjacency, EAR_DisallowAdjacency or EAR_RequireAdjacency.",
          "guard": "SetRequiresAdjacency"
        },
        {
          "name": "SkipCheckWithSource",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Only check that the source has a bondmate on the mission, not that the target is that bondmate. For self-targeted bondmate abilities.",
          "guard": "SetSkipCheckWithSource"
        },
        {
          "name": "IntrusionProtocol",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Hack objects at range: needs gameplay visibility of the object instead of an adjacent interaction point.",
          "guard": "SetIntrusionProtocol"
        },
        {
          "name": "HaywireProtocol",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Target units instead of objects: living, unhacked, robotic enemies the unit sees or has squadsight on.",
          "guard": "SetHaywireProtocol"
        },
        {
          "name": "RequiredAbilityName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Ability the interactive object must expose. For hacking, empty accepts any object; for a normal interaction it must match exactly.",
          "guard": "SetRequiredAbilityName"
        },
        {
          "name": "MustBeDoor",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require the object to be a door.",
          "guard": "SetMustBeDoor"
        },
        {
          "name": "RestrictRange",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require the loot to be within LootableRange of the source.",
          "guard": "SetRestrictRange"
        },
        {
          "name": "LootableRange",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Maximum distance to the loot, in Unreal units, when RestrictRange is set. A tile is 96.",
          "guard": "SetLootableRange"
        },
        {
          "name": "NotAFloorTileTag",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Tag of tiles that must not count as ground.",
          "guard": "SetNotAFloorTileTag"
        },
        {
          "name": "MaxPanicUnitsPerPod",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Most units of an AI pod that may be panicked at once. 0 removes the limit.",
          "guard": "SetMaxPanicUnitsPerPod"
        },
        {
          "name": "HackAbilityName",
          "type": "Name",
          "kind": "optionalScalar",
          "description": "Hack ability whose rewards the target must offer, e.g. FinalizeSKULLJACK.",
          "guard": "SetHackAbilityName"
        },
        {
          "name": "CheckFlanking",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Fail when any enemy flanks the unit.",
          "guard": "SetCheckFlanking"
        },
        {
          "name": "RequireVisible",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Require a free neighbouring tile the unit could be pulled to, rather than any free neighbouring tile.",
          "guard": "SetRequireVisible"
        },
        {
          "name": "AllowedBiomesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Condition_MapProperty"
        },
        {
          "name": "AllowedBiomes",
          "type": "array<string>",
          "kind": "modedArray",
          "description": "Map biomes the mission must be in, when non-empty.",
          "modeField": "AllowedBiomesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "CustomProperties",
          "type": "array<AECustomProperty>",
          "kind": "nested",
          "description": "Free-form key/value pairs for bridge-mod editors; ignored by the built-in editors."
        }
      ]
    },
    {
      "name": "StatChangeEdit",
      "fields": [
        {
          "name": "StatType",
          "type": "ECharStatType",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetStatType"
        },
        {
          "name": "StatAmount",
          "type": "float",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetStatAmount"
        },
        {
          "name": "ModOp",
          "type": "EStatModOp",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetModOp"
        },
        {
          "name": "ApplicationRule",
          "type": "ECharStatModApplicationRule",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetApplicationRule"
        }
      ]
    },
    {
      "name": "WeaponDamageValueEdit",
      "fields": [
        {
          "name": "Damage",
          "type": "int",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetDamage"
        },
        {
          "name": "Spread",
          "type": "int",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetSpread"
        },
        {
          "name": "PlusOne",
          "type": "int",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetPlusOne"
        },
        {
          "name": "Crit",
          "type": "int",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetCrit"
        },
        {
          "name": "Pierce",
          "type": "int",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetPierce"
        },
        {
          "name": "Rupture",
          "type": "int",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetRupture"
        },
        {
          "name": "Shred",
          "type": "int",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetShred"
        },
        {
          "name": "Tag",
          "type": "name",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetTag"
        },
        {
          "name": "DamageType",
          "type": "name",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetDamageType"
        }
      ]
    },
    {
      "name": "EffectEdit",
      "fields": [
        {
          "name": "Class",
          "type": "string",
          "kind": "plain",
          "description": "Effect class to target/instantiate, e.g. `X2Effect_ApplyWeaponDamage`. Bare names are auto-prefixed with `XComGame.`; empty falls back to `X2Effect`."
        },
        {
          "name": "Slot",
          "type": "EAbilityEffectSlot",
          "kind": "plain",
          "description": "Which effect array to edit (`EAbilityEffectSlot`): `eAES_Target`, `eAES_MultiTarget` or `eAES_Shooter`."
        },
        {
          "name": "Mode",
          "type": "EArrayEditMode",
          "kind": "plain",
          "description": "Per-entry edit mode (`EArrayEditMode`). Defaults to the enum's first value, which clears the existing array."
        },
        {
          "name": "ApplyOnTickClass",
          "type": "string",
          "kind": "plain",
          "description": "Redirects this entry at an effect nested in the parent's `ApplyOnTick` list, so every other field below applies to that child instead. Only `X2Effect_Persistent` and its subclasses have one. Use it to reach the damage of a damage-over-time effect: the `X2Effect_Burning` object itself only carries duration, while the per-tick damage lives in an `X2Effect_ApplyWeaponDamage` beneath it. Bare names are auto-prefixed with `XComGame.`."
        },
        {
          "name": "ApplyOnTickIndex",
          "type": "int",
          "kind": "plain",
          "description": "Which matching child to edit when several in `ApplyOnTick` share the same class. Counts only matches of `ApplyOnTickClass`, so 0 is the first one. Default 0."
        },
        {
          "name": "ApplyOnTickMode",
          "type": "EArrayEditMode",
          "kind": "plain",
          "description": "What to do when `ApplyOnTickClass` is not already in the list (`EArrayEditMode`): `eAEM_Merge`/`eAEM_AddOnly` append one, `eAEM_Remove` removes it, `eAEM_ReplaceAll` clears the list first. Ignored when `ApplyOnTickClass` is empty."
        },
        {
          "name": "ApplyOnHit",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
          "guard": "SetApplyOnHit"
        },
        {
          "name": "ApplyOnMiss",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Whether the effect is applied even when the ability misses.",
          "guard": "SetApplyOnMiss"
        },
        {
          "name": "ApplyChance",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
          "guard": "SetApplyChance"
        },
        {
          "name": "ApplyToWorldOnHit",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
          "guard": "SetApplyToWorldOnHit"
        },
        {
          "name": "ApplyToWorldOnMiss",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
          "guard": "SetApplyToWorldOnMiss"
        },
        {
          "name": "UseSourcePlayerState",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
          "guard": "SetUseSourcePlayerState"
        },
        {
          "name": "IsImpairing",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
          "guard": "SetIsImpairing"
        },
        {
          "name": "IsImpairingMomentarily",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
          "guard": "SetIsImpairingMomentarily"
        },
        {
          "name": "BringRemoveVisualizationForward",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
          "guard": "SetBringRemoveVisualizationForward"
        },
        {
          "name": "ShowImmunity",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
          "guard": "SetShowImmunity"
        },
        {
          "name": "ShowImmunityAnyFailure",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
          "guard": "SetShowImmunityAnyFailure"
        },
        {
          "name": "AppliesDamage",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
          "guard": "SetAppliesDamage"
        },
        {
          "name": "CanBeRedirected",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
          "guard": "SetCanBeRedirected"
        },
        {
          "name": "HideDeathWorldMessage",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
          "guard": "SetHideDeathWorldMessage"
        },
        {
          "name": "DamageTypesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "DamageTypes",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
          "modeField": "DamageTypesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "TargetConditions",
          "type": "array<ConditionEdit>",
          "kind": "nested",
          "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
        },
        {
          "name": "MinStatContestResult",
          "type": "int",
          "kind": "optionalScalar",
          "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
          "guard": "SetMinStatContestResult"
        },
        {
          "name": "MaxStatContestResult",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
          "guard": "SetMaxStatContestResult"
        },
        {
          "name": "DelayVisualizationSec",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
          "guard": "SetDelayVisualizationSec"
        },
        {
          "name": "OverrideMissMessage",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
          "guard": "SetOverrideMissMessage"
        },
        {
          "name": "NumTurns",
          "type": "int",
          "kind": "optionalScalar",
          "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
          "guard": "SetNumTurns"
        },
        {
          "name": "InitialShedChance",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
          "guard": "SetInitialShedChance"
        },
        {
          "name": "PerTurnShedChance",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
          "guard": "SetPerTurnShedChance"
        },
        {
          "name": "EffectRank",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
          "guard": "SetEffectRank"
        },
        {
          "name": "EffectHierarchyValue",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
          "guard": "SetEffectHierarchyValue"
        },
        {
          "name": "VisionArcDegreesOverride",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
          "guard": "SetVisionArcDegreesOverride"
        },
        {
          "name": "InfiniteDuration",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
          "guard": "SetInfiniteDuration"
        },
        {
          "name": "TickWhenApplied",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
          "guard": "SetTickWhenApplied"
        },
        {
          "name": "CanTickEveryAction",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
          "guard": "SetCanTickEveryAction"
        },
        {
          "name": "ConvertTurnsToActions",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
          "guard": "SetConvertTurnsToActions"
        },
        {
          "name": "RemoveWhenSourceDies",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
          "guard": "SetRemoveWhenSourceDies"
        },
        {
          "name": "RemoveWhenTargetDies",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
          "guard": "SetRemoveWhenTargetDies"
        },
        {
          "name": "RemoveWhenSourceDamaged",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
          "guard": "SetRemoveWhenSourceDamaged"
        },
        {
          "name": "RemoveWhenTargetConcealmentBroken",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
          "guard": "SetRemoveWhenTargetConcealmentBroken"
        },
        {
          "name": "PersistThroughTacticalGameEnd",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
          "guard": "SetPersistThroughTacticalGameEnd"
        },
        {
          "name": "IgnorePlayerCheckOnTick",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
          "guard": "SetIgnorePlayerCheckOnTick"
        },
        {
          "name": "UniqueTarget",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
          "guard": "SetUniqueTarget"
        },
        {
          "name": "StackOnRefresh",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
          "guard": "SetStackOnRefresh"
        },
        {
          "name": "DupeForSameSourceOnly",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
          "guard": "SetDupeForSameSourceOnly"
        },
        {
          "name": "EffectForcesBleedout",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
          "guard": "SetEffectForcesBleedout"
        },
        {
          "name": "DisplayInUI",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
          "guard": "SetDisplayInUI"
        },
        {
          "name": "DisplayInSpecialDamageMessageUI",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
          "guard": "SetDisplayInSpecialDamageMessageUI"
        },
        {
          "name": "SourceDisplayInUI",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
          "guard": "SetSourceDisplayInUI"
        },
        {
          "name": "CustomIdleOverrideAnim",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
          "guard": "SetCustomIdleOverrideAnim"
        },
        {
          "name": "EffectName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
          "guard": "SetEffectName"
        },
        {
          "name": "AbilitySourceName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
          "guard": "SetAbilitySourceName"
        },
        {
          "name": "EffectAppliedEventName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
          "guard": "SetEffectAppliedEventName"
        },
        {
          "name": "ChanceEventTriggerName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Event fired when the per-turn shed-chance roll succeeds.",
          "guard": "SetChanceEventTriggerName"
        },
        {
          "name": "VFXSocket",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Socket on the unit’s skeleton to attach the particle system to.",
          "guard": "SetVFXSocket"
        },
        {
          "name": "VFXSocketsArrayName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
          "guard": "SetVFXSocketsArrayName"
        },
        {
          "name": "FriendlyName",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Name shown in the unit’s status UI.",
          "guard": "SetFriendlyName"
        },
        {
          "name": "FriendlyDescription",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Description shown beneath FriendlyName in the status UI.",
          "guard": "SetFriendlyDescription"
        },
        {
          "name": "IconImage",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Path to the status icon shown in the UI.",
          "guard": "SetIconImage"
        },
        {
          "name": "SourceFriendlyName",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
          "guard": "SetSourceFriendlyName"
        },
        {
          "name": "SourceFriendlyDescription",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Description shown on the applying unit.",
          "guard": "SetSourceFriendlyDescription"
        },
        {
          "name": "SourceIconLabel",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Short label drawn on the applying unit’s icon.",
          "guard": "SetSourceIconLabel"
        },
        {
          "name": "StatusIcon",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
          "guard": "SetStatusIcon"
        },
        {
          "name": "VFXTemplateName",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Particle system played on the unit for as long as the effect lasts.",
          "guard": "SetVFXTemplateName"
        },
        {
          "name": "PersistentPerkName",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Perk effect played on the unit while this effect is active.",
          "guard": "SetPersistentPerkName"
        },
        {
          "name": "ExplosiveDamage",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Counts the damage as explosive, so explosive-specific rules such as Blast Padding apply.",
          "guard": "SetExplosiveDamage"
        },
        {
          "name": "IgnoreBaseDamage",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Leave out the weapon's base damage; only the effect's own damage and tagged extra damage apply.",
          "guard": "SetIgnoreBaseDamage"
        },
        {
          "name": "DamageTag",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Tag selecting one of the weapon's ExtraDamage entries and the upgrade bonus damage with the same tag.",
          "guard": "SetDamageTag"
        },
        {
          "name": "AlwaysKillsCivilians",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Civilian targets die outright regardless of the damage rolled.",
          "guard": "SetAlwaysKillsCivilians"
        },
        {
          "name": "ApplyWorldEffectsForEachTargetLocation",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Apply the ability's world effects at every target location instead of once.",
          "guard": "SetApplyWorldEffectsForEachTargetLocation"
        },
        {
          "name": "AllowFreeKill",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Let free-kill weapon upgrades, such as the Repeater, trigger on this damage.",
          "guard": "SetAllowFreeKill"
        },
        {
          "name": "AllowWeaponUpgrade",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Let weapon upgrades add their bonus damage.",
          "guard": "SetAllowWeaponUpgrade"
        },
        {
          "name": "BypassShields",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Damage ignores shield HP and goes straight to health.",
          "guard": "SetBypassShields"
        },
        {
          "name": "IgnoreArmor",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Damage ignores armor.",
          "guard": "SetIgnoreArmor"
        },
        {
          "name": "BypassSustainEffects",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Damage ignores sustain effects that would otherwise keep the unit alive.",
          "guard": "SetBypassSustainEffects"
        },
        {
          "name": "EnvironmentalDamageAmount",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Environmental damage dealt to terrain and cover.",
          "guard": "SetEnvironmentalDamageAmount"
        },
        {
          "name": "WeaponDamageValue",
          "type": "WeaponDamageValueEdit",
          "kind": "nested",
          "description": "Damage the effect adds on its own, on top of the weapon: Damage, Spread, Crit, Pierce, Shred, Rupture, PlusOne, DamageType and Tag."
        },
        {
          "name": "StatChangeMode",
          "type": "EStatChangeMode",
          "kind": "mode",
          "description": "X2Effect_PersistentStatChange"
        },
        {
          "name": "StatChange",
          "type": "array<StatChangeEdit>",
          "kind": "nested",
          "description": "Stat changes applied while the effect lasts, merged by StatType.",
          "modeField": "StatChangeMode",
          "modeEnum": "EStatChangeMode"
        },
        {
          "name": "CHLForceReapplyOnRefresh",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Re-apply the stat changes when the effect is refreshed. Community Highlander field.",
          "guard": "SetCHLForceReapplyOnRefresh"
        },
        {
          "name": "ImmuneTypesAreInclusive",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "true: immune to the listed damage types only. false: immune to every damage type except the listed ones.",
          "guard": "SetImmuneTypesAreInclusive"
        },
        {
          "name": "RemoveAfterAttackCount",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Remove the effect after this many attacks against the unit. 0 keeps it.",
          "guard": "SetRemoveAfterAttackCount"
        },
        {
          "name": "ImmuneTypesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "ImmuneTypes",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Damage types the immunity covers, or excludes when ImmuneTypesAreInclusive is false.",
          "modeField": "ImmuneTypesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "NumActionPoints",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Action points granted.",
          "guard": "SetNumActionPoints"
        },
        {
          "name": "PointType",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Type of action point granted, e.g. standard or move.",
          "guard": "SetPointType"
        },
        {
          "name": "ApplyOnlyWhenOut",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Grant only when the unit has no standard action points left.",
          "guard": "SetApplyOnlyWhenOut"
        },
        {
          "name": "SelectUnit",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Select the unit in the tactical UI once the points are granted.",
          "guard": "SetSelectUnit"
        },
        {
          "name": "SkipWithEffectMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "SkipWithEffect",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Effects that, when present on the unit, skip the grant.",
          "modeField": "SkipWithEffectMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "RecordUnitValueWithGrantMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Effect_GrantActionPointsWithRecord (merged by UnitValueName)"
        },
        {
          "name": "RecordUnitValueWithGrant",
          "type": "array<RecordData>",
          "kind": "modedArray",
          "description": "Unit values that accumulate the action points granted, each with its cleanup rule. Merge updates the entry with the same UnitValueName or adds it.",
          "modeField": "RecordUnitValueWithGrantMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "EffectNamesToRemoveMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Effect_RemoveEffects"
        },
        {
          "name": "EffectNamesToRemove",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Effect names removed from the target.",
          "modeField": "EffectNamesToRemoveMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "Cleanse",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Remove the effects as a cleanse, so whatever they do on wearing off does not trigger.",
          "guard": "SetCleanse"
        },
        {
          "name": "CheckSource",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Match effects whose source is this effect's target, instead of effects whose target it is.",
          "guard": "SetCheckSource"
        },
        {
          "name": "DoNotVisualize",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Skip the removal visualization, for when another RemoveEffects on the ability already shows it.",
          "guard": "SetDoNotVisualize"
        },
        {
          "name": "UnitName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Unit value written.",
          "guard": "SetUnitName"
        },
        {
          "name": "NewValueToSet",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Value written to the unit value.",
          "guard": "SetNewValueToSet"
        },
        {
          "name": "CleanupType",
          "type": "EUnitValueCleanup",
          "kind": "optionalScalar",
          "description": "When the unit value is cleared: eCleanup_BeginTurn, eCleanup_BeginTactical, eCleanup_Never or eCleanup_BeginTacticalChain.",
          "guard": "SetCleanupType"
        },
        {
          "name": "ArmorMitigationAmount",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Armor points granted while the effect lasts.",
          "guard": "SetArmorMitigationAmount"
        },
        {
          "name": "StunLevel",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Action points the stun takes away.",
          "guard": "SetStunLevel"
        },
        {
          "name": "SkipAnimation",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Skip the stun animations.",
          "guard": "SetSkipAnimation"
        },
        {
          "name": "StunStartAnimName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Animation played when the stun starts, if the unit can play it.",
          "guard": "SetStunStartAnimName"
        },
        {
          "name": "StunStopAnimName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Animation played when the stun ends.",
          "guard": "SetStunStopAnimName"
        },
        {
          "name": "StunnedTriggerName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Event fired when the unit is stunned.",
          "guard": "SetStunnedTriggerName"
        },
        {
          "name": "SustainedAbilityName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Ability on the source that is fired again once a full turn completes, to keep the effect going.",
          "guard": "SetSustainedAbilityName"
        },
        {
          "name": "FragileAmount",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Damage the source may take in a full turn before the effect breaks. 0 never breaks it.",
          "guard": "SetFragileAmount"
        },
        {
          "name": "EffectsToRemoveFromSourceMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "EffectsToRemoveFromSource",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Effects removed from the source when this effect ends.",
          "modeField": "EffectsToRemoveFromSourceMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "EffectsToRemoveFromTargetMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "EffectsToRemoveFromTarget",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Effects removed from the target when this effect ends.",
          "modeField": "EffectsToRemoveFromTargetMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "RegisterAdditionalEventsLikeImpairMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "RegisterAdditionalEventsLikeImpair",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Extra events on the source that end the effect as if the source had become impaired.",
          "modeField": "RegisterAdditionalEventsLikeImpairMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "ReasonNotVisible",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Visibility tag given as the reason the vanished unit cannot be seen.",
          "guard": "SetReasonNotVisible"
        },
        {
          "name": "VanishRevealAdditiveAnimName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Additive animation played on reveal when VanishRevealAnimName is empty.",
          "guard": "SetVanishRevealAdditiveAnimName"
        },
        {
          "name": "VanishRevealAnimName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Animation played when the unit is revealed.",
          "guard": "SetVanishRevealAnimName"
        },
        {
          "name": "VanishSyncAnimName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Additive animation played when the vanished state is visualized from a save.",
          "guard": "SetVanishSyncAnimName"
        },
        {
          "name": "ReserveType",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Type of action point reserved.",
          "guard": "SetReserveType"
        },
        {
          "name": "NumPoints",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Number of action points reserved.",
          "guard": "SetNumPoints"
        },
        {
          "name": "AbilityToActivate",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Ability fired when the covering fire check matches.",
          "guard": "SetAbilityToActivate"
        },
        {
          "name": "GrantActionPoint",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Reserve action point given to the covering unit when the check matches.",
          "guard": "SetGrantActionPoint"
        },
        {
          "name": "MaxPointsPerTurn",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Most times per turn the action point can be granted. 0 or less removes the limit.",
          "guard": "SetMaxPointsPerTurn"
        },
        {
          "name": "DirectAttackOnly",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Only match when the unit carrying the effect is attacked directly.",
          "guard": "SetDirectAttackOnly"
        },
        {
          "name": "PreEmptiveFire",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Fire before the attacker's shot resolves instead of after it.",
          "guard": "SetPreEmptiveFire"
        },
        {
          "name": "OnlyDuringEnemyTurn",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Only fire during the enemy turn.",
          "guard": "SetOnlyDuringEnemyTurn"
        },
        {
          "name": "UseMultiTargets",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Fire the ability at the covering unit itself and hit its multi-targets, instead of retaliating at the attacker.",
          "guard": "SetUseMultiTargets"
        },
        {
          "name": "OnlyWhenAttackMisses",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Only fire when the attack missed.",
          "guard": "SetOnlyWhenAttackMisses"
        },
        {
          "name": "SelfTargeting",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "The fired ability targets the covering unit itself.",
          "guard": "SetSelfTargeting"
        },
        {
          "name": "ActivationPercentChance",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Percent chance the ability fires when the check matches. 0 always fires.",
          "guard": "SetActivationPercentChance"
        },
        {
          "name": "TraversalChangesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Effect_PersistentTraversalChange (merged by Traversal)"
        },
        {
          "name": "TraversalChanges",
          "type": "array<TraversalChange>",
          "kind": "modedArray",
          "description": "Traversal types switched on or off while the effect lasts, merged by Traversal.",
          "modeField": "TraversalChangesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "ToHitMin",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Lowest hit chance at which the damage multiplier applies.",
          "guard": "SetToHitMin"
        },
        {
          "name": "DmgMod",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Multiplier applied to the damage when the effect's condition is met.",
          "guard": "SetDmgMod"
        },
        {
          "name": "AdverseClassesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Effect_AdverseSoldierClasses"
        },
        {
          "name": "AdverseClasses",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Soldier classes whose attacks trigger the damage multiplier.",
          "modeField": "AdverseClassesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "AlertRangeMeters",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Radius in meters within which Lost are alerted.",
          "guard": "SetAlertRangeMeters"
        },
        {
          "name": "BonusDamageMult",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Fraction of the damage added as bonus.",
          "guard": "SetBonusDamageMult"
        },
        {
          "name": "MinBonusDamage",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Smallest bonus damage applied, when the fraction comes out lower.",
          "guard": "SetMinBonusDamage"
        },
        {
          "name": "AcidParticleSystem1Tile",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Particle system path for an acid pool covering a single tile.",
          "guard": "SetAcidParticleSystem1Tile"
        },
        {
          "name": "AcidParticleSystem2Tiles",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Particle system path for an acid pool covering two tiles.",
          "guard": "SetAcidParticleSystem2Tiles"
        },
        {
          "name": "AcidParticleSystem3TilesLine",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Particle system path for an acid pool covering three tiles in a line.",
          "guard": "SetAcidParticleSystem3TilesLine"
        },
        {
          "name": "AcidParticleSystem3TilesCorner",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Particle system path for an acid pool covering three tiles in a corner.",
          "guard": "SetAcidParticleSystem3TilesCorner"
        },
        {
          "name": "AcidParticleSystem4TilesLine",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Particle system path for an acid pool covering four tiles in a line.",
          "guard": "SetAcidParticleSystem4TilesLine"
        },
        {
          "name": "AcidParticleSystem4TilesSquare",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Particle system path for an acid pool covering a 2x2 square.",
          "guard": "SetAcidParticleSystem4TilesSquare"
        },
        {
          "name": "AcidParticleSystem4TilesL",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Particle system path for an acid pool covering four tiles in an L shape.",
          "guard": "SetAcidParticleSystem4TilesL"
        },
        {
          "name": "AcidParticleSystem4TilesReverseL",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Particle system path for an acid pool covering four tiles in a mirrored L shape.",
          "guard": "SetAcidParticleSystem4TilesReverseL"
        },
        {
          "name": "AcidParticleSystem4TilesT",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Particle system path for an acid pool covering four tiles in a T shape (the game's 4pc_Middle).",
          "guard": "SetAcidParticleSystem4TilesT"
        },
        {
          "name": "AcidParticleSystem4TilesS",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Particle system path for an acid pool covering four tiles in an S shape.",
          "guard": "SetAcidParticleSystem4TilesS"
        },
        {
          "name": "AcidParticleSystem4TilesReverseS",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Particle system path for an acid pool covering four tiles in a mirrored S shape.",
          "guard": "SetAcidParticleSystem4TilesReverseS"
        },
        {
          "name": "OverrideParticleSystem",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Particle system path played on the target instead of the default one. Empty keeps the default.",
          "guard": "SetOverrideParticleSystem"
        },
        {
          "name": "DamageTypeTemplateName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Damage type of the environmental damage.",
          "guard": "SetDamageTypeTemplateName"
        },
        {
          "name": "PlusNumZTiles",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Extra tiles of height hit above the affected tile.",
          "guard": "SetPlusNumZTiles"
        },
        {
          "name": "UseWeaponEnvironmentalDamage",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Use the source weapon's environmental damage instead of EnvironmentalDamageAmount.",
          "guard": "SetUseWeaponEnvironmentalDamage"
        },
        {
          "name": "UseWeaponDamageType",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Use the source weapon's damage type instead of DamageTypeTemplateName.",
          "guard": "SetUseWeaponDamageType"
        },
        {
          "name": "HitSourceTile",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Apply the damage at the source's tile.",
          "guard": "SetHitSourceTile"
        },
        {
          "name": "HitTargetTile",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Apply the damage at the target's tile.",
          "guard": "SetHitTargetTile"
        },
        {
          "name": "HitAdjacentDestructibles",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Also damage destructibles adjacent to the hit tile along the damage direction.",
          "guard": "SetHitAdjacentDestructibles"
        },
        {
          "name": "AllowDestructionOfDamageCauseCover",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "When a unit caused the damage, allow it to destroy that unit's own cover, which is normally protected.",
          "guard": "SetAllowDestructionOfDamageCauseCover"
        },
        {
          "name": "FireChance_Level1",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Weight of a level 1 fire when rolling the intensity of new fires; relative to the other two levels.",
          "guard": "SetFireChance_Level1"
        },
        {
          "name": "FireChance_Level2",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Weight of a level 2 fire when rolling the intensity of new fires; relative to the other two levels.",
          "guard": "SetFireChance_Level2"
        },
        {
          "name": "FireChance_Level3",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Weight of a level 3 fire when rolling the intensity of new fires; relative to the other two levels.",
          "guard": "SetFireChance_Level3"
        },
        {
          "name": "UseFireChanceLevel",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Roll the fire intensity from the three FireChance weights instead of using the default.",
          "guard": "SetUseFireChanceLevel"
        },
        {
          "name": "DamageFragileOnly",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Only damage fragile objects.",
          "guard": "SetDamageFragileOnly"
        },
        {
          "name": "CheckForLOSFromTargetLocation",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Only set tiles on fire that are visible from the target location.",
          "guard": "SetCheckForLOSFromTargetLocation"
        },
        {
          "name": "PerUseHP",
          "type": "int",
          "kind": "optionalScalar",
          "description": "HP healed per application.",
          "guard": "SetPerUseHP"
        },
        {
          "name": "IncreasedHealProject",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Research that, once completed, switches the heal to IncreasedPerUseHP.",
          "guard": "SetIncreasedHealProject"
        },
        {
          "name": "IncreasedPerUseHP",
          "type": "int",
          "kind": "optionalScalar",
          "description": "HP healed per application once IncreasedHealProject is researched.",
          "guard": "SetIncreasedPerUseHP"
        },
        {
          "name": "PoisonParticleSystem",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Particle system path for a poison cloud tile.",
          "guard": "SetPoisonParticleSystem"
        },
        {
          "name": "SmokeParticleSystem",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Particle system path for a smoke tile.",
          "guard": "SetSmokeParticleSystem"
        },
        {
          "name": "Pierce",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Armor pierced.",
          "guard": "SetPierce"
        },
        {
          "name": "CritChance",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Crit chance added.",
          "guard": "SetCritChance"
        },
        {
          "name": "CritDamage",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Crit damage added.",
          "guard": "SetCritDamage"
        },
        {
          "name": "EventsToUpdateMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Effect_Aura"
        },
        {
          "name": "EventsToUpdate",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Events that make the aura re-evaluate which units it covers.",
          "modeField": "EventsToUpdateMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "NumHitsForMod",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Hits taken in the turn before the damage multiplier applies.",
          "guard": "SetNumHitsForMod"
        },
        {
          "name": "ExplosiveDamageReduction",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Fraction of explosive damage removed.",
          "guard": "SetExplosiveDamageReduction"
        },
        {
          "name": "BonusDamage",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Bonus damage added when the effect's condition is met.",
          "guard": "SetBonusDamage"
        },
        {
          "name": "ThreatenedBondmateAimBonus",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Aim bonus, from bond level 2, against a target that threatens the bondmate.",
          "guard": "SetThreatenedBondmateAimBonus"
        },
        {
          "name": "BondmateTargetAimBonus",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Aim bonus, from bond level 3, against a target the bondmate attacked since last turn.",
          "guard": "SetBondmateTargetAimBonus"
        },
        {
          "name": "BondmateTargetCritBonus",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Crit bonus, from bond level 3, against a target the bondmate attacked since last turn.",
          "guard": "SetBondmateTargetCritBonus"
        },
        {
          "name": "BleedoutDurationAdjustment",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Turns added to the bleedout duration.",
          "guard": "SetBleedoutDurationAdjustment"
        },
        {
          "name": "BonusDmg",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Bonus damage added to the weapon's damage.",
          "guard": "SetBonusDmg"
        },
        {
          "name": "WillMod",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Change applied to the target's current Will; negative lowers it.",
          "guard": "SetWillMod"
        },
        {
          "name": "DamageTypeImmunitiesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Effect_CombatStims, X2Effect_Solace"
        },
        {
          "name": "DamageTypeImmunities",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Damage types the affected unit is immune to while the effect lasts.",
          "modeField": "DamageTypeImmunitiesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "ModifyOutgoingDamage",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Apply to damage the unit deals.",
          "guard": "SetModifyOutgoingDamage"
        },
        {
          "name": "ModifyIncomingDamage",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Apply to damage the unit takes.",
          "guard": "SetModifyIncomingDamage"
        },
        {
          "name": "DamageModifier",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Damage multiplier; 1.0 leaves the damage unchanged.",
          "guard": "SetDamageModifier"
        },
        {
          "name": "DamageBonus",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Flat damage added after the multiplier.",
          "guard": "SetDamageBonus"
        },
        {
          "name": "DamageMultiplier",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Extra damage as a fraction of the damage being dealt.",
          "guard": "SetDamageMultiplier"
        },
        {
          "name": "TriggerEventName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Event the effect fires.",
          "guard": "SetTriggerEventName"
        },
        {
          "name": "ApplyRulerModifiers",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Subtract the per-ruler freeze modifier from the rolled ruler freeze count.",
          "guard": "SetApplyRulerModifiers"
        },
        {
          "name": "LargeUnitFreezeDuration",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Turns a large unit, an Avatar or a Chosen stays frozen.",
          "guard": "SetLargeUnitFreezeDuration"
        },
        {
          "name": "NormalUnitFreezeDuration",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Turns any other non-ruler unit stays frozen.",
          "guard": "SetNormalUnitFreezeDuration"
        },
        {
          "name": "MinRulerFreezeCount",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Lower bound of the XCOM actions a ruler stays frozen for. The roll is Rand(Max - Min) + Min.",
          "guard": "SetMinRulerFreezeCount"
        },
        {
          "name": "MaxRulerFreezeCount",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Upper bound of the ruler freeze roll, exclusive: Min equal to Max gives exactly Min actions.",
          "guard": "SetMaxRulerFreezeCount"
        },
        {
          "name": "ApplyToRevealedAIOnly",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Only revealed AI units lose their action points; unrevealed ones are left alone.",
          "guard": "SetApplyToRevealedAIOnly"
        },
        {
          "name": "GlobalAbility",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Global ability switched on for the rest of the battle.",
          "guard": "SetGlobalAbility"
        },
        {
          "name": "DamageImmunitiesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Effect_Fortress"
        },
        {
          "name": "DamageImmunities",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Damage types the unit is immune to. The game assumes Fire, Acid and Poison are among them.",
          "modeField": "DamageImmunitiesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "CoverType",
          "type": "ECoverForceFlag",
          "kind": "optionalScalar",
          "description": "Cover the unit provides to others: none, low or high (ECoverForceFlag).",
          "guard": "SetCoverType"
        },
        {
          "name": "RemoveWhenMoved",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Remove the effect when the unit moves.",
          "guard": "SetRemoveWhenMoved"
        },
        {
          "name": "RemoveOnOtherActivation",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Remove the effect when the unit activates another ability.",
          "guard": "SetRemoveOnOtherActivation"
        },
        {
          "name": "OverrideStartAnimName",
          "type": "Name",
          "kind": "optionalScalar",
          "description": "Animation played on the pulled unit at the start, when set.",
          "guard": "SetOverrideStartAnimName"
        },
        {
          "name": "OverrideStopAnimName",
          "type": "Name",
          "kind": "optionalScalar",
          "description": "Animation played on the pulled unit at the end, when set.",
          "guard": "SetOverrideStopAnimName"
        },
        {
          "name": "RequireVisibleTile",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Only pull to a neighbouring tile the target can be bound to; otherwise any free neighbouring tile will do.",
          "guard": "SetRequireVisibleTile"
        },
        {
          "name": "HeightBonus",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Extra aim an attacker gets when it has height advantage over the affected unit.",
          "guard": "SetHeightBonus"
        },
        {
          "name": "AllowedAbilitiesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Effect_Guardian"
        },
        {
          "name": "AllowedAbilities",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Abilities that can trigger the extra reaction shot.",
          "modeField": "AllowedAbilitiesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "ProcChance",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Percent chance of the extra reaction shot.",
          "guard": "SetProcChance"
        },
        {
          "name": "HitMod",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Hit chance modifier applied.",
          "guard": "SetHitMod"
        },
        {
          "name": "DelayTimeS",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Seconds before the death is visualized.",
          "guard": "SetDelayTimeS"
        },
        {
          "name": "AbilityToTrigger",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Ability fired when the mine goes off.",
          "guard": "SetAbilityToTrigger"
        },
        {
          "name": "BonusCritChance",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Crit chance added when the effect's condition is met.",
          "guard": "SetBonusCritChance"
        },
        {
          "name": "AbilityName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Ability fired by the effect.",
          "guard": "SetAbilityName"
        },
        {
          "name": "ActivateAbilityOnTarget",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Find and fire the ability on the target instead of the source.",
          "guard": "SetActivateAbilityOnTarget"
        },
        {
          "name": "EffectTargetOnly",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Fire only against the effect's target; false fires against every available target.",
          "guard": "SetEffectTargetOnly"
        },
        {
          "name": "ImplacableThisTurnValue",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Unit value that records Implacable already triggered this turn.",
          "guard": "SetImplacableThisTurnValue"
        },
        {
          "name": "CohesionAmount",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Cohesion added between the unit and its bondmate.",
          "guard": "SetCohesionAmount"
        },
        {
          "name": "ShieldPerMiss",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Shield HP gained each time an attack misses the unit.",
          "guard": "SetShieldPerMiss"
        },
        {
          "name": "KnockbackDistance",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Distance the unit is knocked back, in meters.",
          "guard": "SetKnockbackDistance"
        },
        {
          "name": "KnockbackDestroysNonFragile",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Let the knocked-back unit destroy non-fragile objects it hits.",
          "guard": "SetKnockbackDestroysNonFragile"
        },
        {
          "name": "OverrideRagdollFinishTimerSec",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Seconds before the ragdoll settles. Negative keeps the default.",
          "guard": "SetOverrideRagdollFinishTimerSec"
        },
        {
          "name": "OnlyOnDeath",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Only knock back units the attack kills.",
          "guard": "SetOnlyOnDeath"
        },
        {
          "name": "BenefitFromEmpoweredUpgrades",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Increase the crit bonus when XCOM has empowered weapon upgrades. Community Highlander field.",
          "guard": "SetBenefitFromEmpoweredUpgrades"
        },
        {
          "name": "CritBonus",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Crit chance added on top of the distance-based bonus.",
          "guard": "SetCritBonus"
        },
        {
          "name": "LifeAmountMultiplier",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Multiplier on the health stolen. 0 leaves the amount unchanged.",
          "guard": "SetLifeAmountMultiplier"
        },
        {
          "name": "AbilityToMark",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Ability whose valid activation tiles are marked.",
          "guard": "SetAbilityToMark"
        },
        {
          "name": "OnlyUseTargetLocation",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Mark only the target location, ignoring the ability's multi-target area.",
          "guard": "SetOnlyUseTargetLocation"
        },
        {
          "name": "VisualizeFlagsOnCursor",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Show the marked tiles on the targeting cursor.",
          "guard": "SetVisualizeFlagsOnCursor"
        },
        {
          "name": "DamageMod",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Damage added to attacks of the melee damage type.",
          "guard": "SetDamageMod"
        },
        {
          "name": "MeleeDamageTypeName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Damage type that counts as melee for the adjustment.",
          "guard": "SetMeleeDamageTypeName"
        },
        {
          "name": "AbilitiesAllowedToHitMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Effect_MimicBeacon"
        },
        {
          "name": "AbilitiesAllowedToHit",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Abilities that may still target the mimic beacon.",
          "modeField": "AbilitiesAllowedToHitMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "NumTurnsForAI",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Turns the control lasts when an AI player is the controller. 0 uses the effect's normal duration.",
          "guard": "SetNumTurnsForAI"
        },
        {
          "name": "RemoveGroupFromInitiativeOrder",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Remove the unit's group from the initiative order.",
          "guard": "SetRemoveGroupFromInitiativeOrder"
        },
        {
          "name": "AddGroupToInitiativeOrder",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Add the unit's group to the initiative order.",
          "guard": "SetAddGroupToInitiativeOrder"
        },
        {
          "name": "AllowCrit",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Allow reaction fire to crit.",
          "guard": "SetAllowCrit"
        },
        {
          "name": "ReactionModifier",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Aim modifier applied to reaction fire.",
          "guard": "SetReactionModifier"
        },
        {
          "name": "AdditionalSuccessModifiersMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Effect_ModifyStatCheckSuccesses (merged by AbilityName)"
        },
        {
          "name": "AdditionalSuccessModifiers",
          "type": "array<AdditionalSuccessModifier>",
          "kind": "modedArray",
          "description": "Bonus successes added to a stat check made by the named ability, when the checked unit is the ability's source. Merge updates the entry with the same AbilityName or adds it.",
          "modeField": "AdditionalSuccessModifiersMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "ModifyFocus",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Focus points added; negative removes them.",
          "guard": "SetModifyFocus"
        },
        {
          "name": "ArmorPierce",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Armor pierced.",
          "guard": "SetArmorPierce"
        },
        {
          "name": "ObsessedTargetValueName",
          "type": "Name",
          "kind": "optionalScalar",
          "description": "Unit value holding the object ID of the obsessed-over target.",
          "guard": "SetObsessedTargetValueName"
        },
        {
          "name": "DeathActionClass",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Qualified class path of the X2Action that replaces the normal death visualization, e.g. XComGame.X2Action_ExplodingUnitDeathAction. Empty removes the override.",
          "guard": "SetDeathActionClass"
        },
        {
          "name": "OverrideAnimNameOnLoad",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Death animation shown for the unit when a save is loaded.",
          "guard": "SetOverrideAnimNameOnLoad"
        },
        {
          "name": "CritBoostPerKill",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Crit chance gained per kill.",
          "guard": "SetCritBoostPerKill"
        },
        {
          "name": "MaxCritBoost",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Cap on the accumulated crit chance.",
          "guard": "SetMaxCritBoost"
        },
        {
          "name": "AltUnitToSpawnName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Character template spawned instead of the usual one, when set.",
          "guard": "SetAltUnitToSpawnName"
        },
        {
          "name": "UseWeaponRadius",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Use the source weapon's radius as the sight radius. Requires a source weapon.",
          "guard": "SetUseWeaponRadius"
        },
        {
          "name": "ViewRadius",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Sight radius of the viewer.",
          "guard": "SetViewRadius"
        },
        {
          "name": "UseSourceLocation",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Place the viewer at the source's location rather than the target's.",
          "guard": "SetUseSourceLocation"
        },
        {
          "name": "InitialDamage",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Damage dealt when the effect is applied.",
          "guard": "SetInitialDamage"
        },
        {
          "name": "WeaponTemplateName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Item template equipped on the possessed unit.",
          "guard": "SetWeaponTemplateName"
        },
        {
          "name": "Amount",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Turns taken off each cooldown.",
          "guard": "SetAmount"
        },
        {
          "name": "ReduceAll",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Clear the cooldowns entirely instead of reducing them by Amount.",
          "guard": "SetReduceAll"
        },
        {
          "name": "AbilitiesToTickMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Effect_ReduceCooldowns"
        },
        {
          "name": "AbilitiesToTick",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Abilities whose cooldowns are reduced. Empty means every ability.",
          "modeField": "AbilitiesToTickMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "HealAmount",
          "type": "int",
          "kind": "optionalScalar",
          "description": "HP healed per tick.",
          "guard": "SetHealAmount"
        },
        {
          "name": "MaxHealAmount",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Total HP the effect may heal, tracked in HealthRegeneratedName. 0 removes the cap.",
          "guard": "SetMaxHealAmount"
        },
        {
          "name": "HealthRegeneratedName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Unit value that accumulates the HP healed so far, for the MaxHealAmount cap.",
          "guard": "SetHealthRegeneratedName"
        },
        {
          "name": "EventToTriggerOnHeal",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Event fired after each heal.",
          "guard": "SetEventToTriggerOnHeal"
        },
        {
          "name": "UnitDamageMultiplier",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Multiplier on the damage the detonated object deals to units.",
          "guard": "SetUnitDamageMultiplier"
        },
        {
          "name": "DamageRadiusMultiplier",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Multiplier on the detonation's damage radius.",
          "guard": "SetDamageRadiusMultiplier"
        },
        {
          "name": "DamageTypesToRemoveMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Effect_RemoveEffectsByDamageType"
        },
        {
          "name": "DamageTypesToRemove",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Effects carrying any of these damage types are removed.",
          "modeField": "DamageTypesToRemoveMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "UseAllPointsWithAbilitiesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Effect_ReserveOverwatchPoints"
        },
        {
          "name": "UseAllPointsWithAbilities",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Abilities that, when the unit has any of them, reserve as many points as were spent instead of NumPoints.",
          "modeField": "UseAllPointsWithAbilitiesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "NumActions",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Number of behavior tree actions the unit runs.",
          "guard": "SetNumActions"
        },
        {
          "name": "BehaviorTreeName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Behavior tree run on the unit.",
          "guard": "SetBehaviorTreeName"
        },
        {
          "name": "InitFromPlayer",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Reset the behavior tree variables on each run as if the player turn were starting.",
          "guard": "SetInitFromPlayer"
        },
        {
          "name": "SetActionPointCount",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Standard action points given to the unit before the tree runs.",
          "guard": "SetSetActionPointCount"
        },
        {
          "name": "ShatteredTargetValueName",
          "type": "Name",
          "kind": "optionalScalar",
          "description": "Unit value holding the object ID of the unit that shattered the target.",
          "guard": "SetShatteredTargetValueName"
        },
        {
          "name": "UnitValueToRead",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Unit value read to find how much health to steal.",
          "guard": "SetUnitValueToRead"
        },
        {
          "name": "DestructibleArchetype",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Archetype path of the destructible actor spawned.",
          "guard": "SetDestructibleArchetype"
        },
        {
          "name": "DestroyOnRemoval",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Destroy the spawned actor when the effect is removed.",
          "guard": "SetDestroyOnRemoval"
        },
        {
          "name": "TargetableBySpawnedTeamOnly",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Only the team that spawned the actor can target it.",
          "guard": "SetTargetableBySpawnedTeamOnly"
        },
        {
          "name": "AnimationName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Reanimation animation played on the corpse.",
          "guard": "SetAnimationName"
        },
        {
          "name": "StartAnimationMinDelaySec",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Shortest delay, in seconds, before the reanimation animation starts.",
          "guard": "SetStartAnimationMinDelaySec"
        },
        {
          "name": "StartAnimationMaxDelaySec",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Longest delay, in seconds, before the reanimation animation starts.",
          "guard": "SetStartAnimationMaxDelaySec"
        },
        {
          "name": "ShadowbindUnconciousCheckName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Unit value checked to tell whether the shadowbound unit was unconscious.",
          "guard": "SetShadowbindUnconciousCheckName"
        },
        {
          "name": "UnitToSpawnName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Character template of the unit spawned.",
          "guard": "SetUnitToSpawnName"
        },
        {
          "name": "ClearTileBlockedByTargetUnitFlag",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Spawn on the target's own tile.",
          "guard": "SetClearTileBlockedByTargetUnitFlag"
        },
        {
          "name": "CopyTargetAppearance",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Give the spawned unit the target's appearance. Takes precedence over CopySourceAppearance.",
          "guard": "SetCopyTargetAppearance"
        },
        {
          "name": "CopySourceAppearance",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Give the spawned unit the source's appearance.",
          "guard": "SetCopySourceAppearance"
        },
        {
          "name": "KnockbackAffectsSpawnLocation",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Spawn where the target ended up after knockback rather than where it was hit.",
          "guard": "SetKnockbackAffectsSpawnLocation"
        },
        {
          "name": "AddToSourceGroup",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Put the spawned unit in the source's AI group.",
          "guard": "SetAddToSourceGroup"
        },
        {
          "name": "CopyReanimatedFromUnit",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Copy the reanimated unit's inventory and abilities too, not just its appearance.",
          "guard": "SetCopyReanimatedFromUnit"
        },
        {
          "name": "CopyReanimatedStatsFromUnit",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Copy the reanimated unit's stats.",
          "guard": "SetCopyReanimatedStatsFromUnit"
        },
        {
          "name": "SetProcessedScamperAs",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Mark the spawned unit's group as having already scampered, so it does not reveal and scamper on sight.",
          "guard": "SetSetProcessedScamperAs"
        },
        {
          "name": "BecomeUnspotted",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Mark the unit as unspotted instead of spotted.",
          "guard": "SetBecomeUnspotted"
        },
        {
          "name": "StunStartAnim",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Animation played when stasis starts.",
          "guard": "SetStunStartAnim"
        },
        {
          "name": "StunStopAnim",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Animation played when stasis ends.",
          "guard": "SetStunStopAnim"
        },
        {
          "name": "SkipFlyover",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Skip the flyover text.",
          "guard": "SetSkipFlyover"
        },
        {
          "name": "StartAnimBlendTime",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Blend time, in seconds, into the start animation.",
          "guard": "SetStartAnimBlendTime"
        },
        {
          "name": "ConcealAmountScalar",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Multiplier on the base chance of losing super concealment, added to the modifier.",
          "guard": "SetConcealAmountScalar"
        },
        {
          "name": "AbilitiesAffectedFilterMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Effect_SuperConcealModifier"
        },
        {
          "name": "AbilitiesAffectedFilter",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Abilities the modifier applies to. Empty means every ability.",
          "modeField": "AbilitiesAffectedFilterMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "RemoveOnAbilityActivationMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Effect_SuperConcealModifier"
        },
        {
          "name": "RemoveOnAbilityActivation",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Abilities whose activation removes the effect.",
          "modeField": "RemoveOnAbilityActivationMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "ResumeMissionTimer",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Resume the mission timer instead of suspending it.",
          "guard": "SetResumeMissionTimer"
        },
        {
          "name": "AimMod",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Aim added.",
          "guard": "SetAimMod"
        },
        {
          "name": "BonusDmgFloat",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Bonus damage: a flat amount with MODOP_Addition, or a multiplier on the damage with MODOP_Multiplication.",
          "guard": "SetBonusDmgFloat"
        },
        {
          "name": "BonusModType",
          "type": "EStatModOp",
          "kind": "optionalScalar",
          "description": "How BonusDmgFloat is applied: MODOP_Addition or MODOP_Multiplication.",
          "guard": "SetBonusModType"
        },
        {
          "name": "WithinTileDistance",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Farthest distance to the target, in tiles, at which the bonus applies.",
          "guard": "SetWithinTileDistance"
        },
        {
          "name": "PrimaryTargetOnly",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Only apply to the attack's primary target.",
          "guard": "SetPrimaryTargetOnly"
        },
        {
          "name": "BonusDamageTypesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Effect_TargetDamageTypeBonus"
        },
        {
          "name": "BonusDamageTypes",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Damage types the bonus applies to.",
          "modeField": "BonusDamageTypesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "ImmediateActionPoint",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Reserve action point given to the target as soon as the effect is applied.",
          "guard": "SetImmediateActionPoint"
        },
        {
          "name": "FocusLevelsMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Effect_TemplarFocus (merged by position: entry N is focus level N)"
        },
        {
          "name": "FocusLevels",
          "type": "array<FocusLevelModifiers>",
          "kind": "modedArray",
          "description": "One entry per focus level from level 0: the stat changes, armor mitigation and bonus weapon damage granted at that level. Merge overwrites the level at the same position or appends it.",
          "modeField": "FocusLevelsMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "ApplyAsTarget",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Apply the modifiers to attacks against the unit rather than attacks it makes.",
          "guard": "SetApplyAsTarget"
        },
        {
          "name": "ConeLength",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Length of the marked cone from the source to the target.",
          "guard": "SetConeLength"
        },
        {
          "name": "ConeEndDiameter",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Diameter of the marked cone at its far end.",
          "guard": "SetConeEndDiameter"
        },
        {
          "name": "PassTargetAsSource",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Fire the event with the target as its source.",
          "guard": "SetPassTargetAsSource"
        },
        {
          "name": "ActionPointType",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Type of action point added, or removed, at the start of the turn.",
          "guard": "SetActionPointType"
        },
        {
          "name": "ActionPointsRemoved",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Remove the action points instead of adding them.",
          "guard": "SetActionPointsRemoved"
        },
        {
          "name": "MovingVanishRevealAdditiveAnimName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Additive animation played on reveal when the unit is revealed while moving.",
          "guard": "SetMovingVanishRevealAdditiveAnimName"
        },
        {
          "name": "DamagePerAction",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Damage dealt for each action point stolen.",
          "guard": "SetDamagePerAction"
        },
        {
          "name": "HealthReturnMod",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Fraction of the damage dealt that is returned to the source as health.",
          "guard": "SetHealthReturnMod"
        },
        {
          "name": "WallBreakingEffectName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Name of the effect on the unit that grants wall breaking.",
          "guard": "SetWallBreakingEffectName"
        },
        {
          "name": "CenterTile",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Apply the world effect to the centre tile only.",
          "guard": "SetCenterTile"
        },
        {
          "name": "StatTypesToRestoreMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2Effect_PersistentStatChangeRestoreDefault"
        },
        {
          "name": "StatTypesToRestore",
          "type": "array<ECharStatType>",
          "kind": "modedArray",
          "description": "Stats reset to their default value while the effect lasts.",
          "modeField": "StatTypesToRestoreMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "ApplyDamageModConditions",
          "type": "array<ConditionEdit>",
          "kind": "nested",
          "description": "X2Effect_ConditionalDamageModifier"
        },
        {
          "name": "LethalDamageConditions",
          "type": "array<ConditionEdit>",
          "kind": "nested",
          "description": "X2Effect_LethalWeaponDamage"
        },
        {
          "name": "ToHitConditions",
          "type": "array<ConditionEdit>",
          "kind": "nested",
          "description": "X2Effect_ToHitModifier"
        },
        {
          "name": "EffectHitModifiers",
          "type": "array<EffectHitModifier>",
          "kind": "plainArray",
          "description": "**Replace-only**: when non-empty, replaces `X2Effect_ToHitModifier.Modifiers` entirely (`EffectHitModifier` entries, incl. `MatchToHit` class ref via qualified name)."
        },
        {
          "name": "CustomProperties",
          "type": "array<AECustomProperty>",
          "kind": "nested",
          "description": "Free-form key/value pairs for bridge-mod editors; ignored by the built-in editors."
        }
      ]
    },
    {
      "name": "ToHitCalcEdit",
      "fields": [
        {
          "name": "Class",
          "type": "string",
          "kind": "plain",
          "description": "Optional. Omitted = edit the existing calc in place. Set = target/instantiate that class, e.g. `X2AbilityToHitCalc_StandardAim`. Bare names are auto-prefixed with `XComGame.`."
        },
        {
          "name": "HitModifiers",
          "type": "array<ShotModifierInfo>",
          "kind": "plainArray",
          "description": "**Replace-only**: when non-empty, replaces the calc's always-on `HitModifiers` array entirely (`ShotModifierInfo`: `ModType`, `Value`, `Reason`)."
        },
        {
          "name": "IndirectFire",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Treats the attack as indirect, like a grenade: it always hits, though crit, dodge and armour mitigation still apply.",
          "guard": "SetIndirectFire"
        },
        {
          "name": "MeleeAttack",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Treats the attack as melee, which ignores cover and applies the intrinsic melee hit bonus.",
          "guard": "SetMeleeAttack"
        },
        {
          "name": "ReactionFire",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Treats the attack as reaction fire, which takes the reaction penalty and forgoes the flanking bonus.",
          "guard": "SetReactionFire"
        },
        {
          "name": "AllowCrit",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Whether crits are built into the hit table at all. Turning it off makes the ability incapable of critting.",
          "guard": "SetAllowCrit"
        },
        {
          "name": "HitsAreCrits",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Converts every successful hit into a crit after the roll is made.",
          "guard": "SetHitsAreCrits"
        },
        {
          "name": "MultiTargetOnly",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Guarantees success when the ability has no primary target, for abilities that only ever hit multi-targets.",
          "guard": "SetMultiTargetOnly"
        },
        {
          "name": "OnlyMultiHitWithSuccess",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Multi-target hits only land if the roll succeeded, as with Faceoff.",
          "guard": "SetOnlyMultiHitWithSuccess"
        },
        {
          "name": "GuaranteedHit",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Always hits, skipping the normal hit modifiers. Armour mitigation still rolls.",
          "guard": "SetGuaranteedHit"
        },
        {
          "name": "IgnoreCoverBonus",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Ignores the target's high and low cover bonuses.",
          "guard": "SetIgnoreCoverBonus"
        },
        {
          "name": "FinalMultiplier",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Scales the final hit chance after everything else. Appears in the shot breakdown attributed to the ability.",
          "guard": "SetFinalMultiplier"
        },
        {
          "name": "BuiltInHitMod",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Flat aim modifier the ability always carries.",
          "guard": "SetBuiltInHitMod"
        },
        {
          "name": "BuiltInCritMod",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Flat crit modifier the ability always carries.",
          "guard": "SetBuiltInCritMod"
        },
        {
          "name": "PercentToHit",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Flat percentage chance to hit, ignoring aim entirely. For abilities whose odds are fixed rather than calculated.",
          "guard": "SetPercentToHit"
        },
        {
          "name": "NoGameStateOnMiss",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Produces no game state at all on a miss, so nothing is recorded or visualised.",
          "guard": "SetNoGameStateOnMiss"
        },
        {
          "name": "FocusMultiplier",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Percentage points added to the hit chance per point of Templar focus.",
          "guard": "SetFocusMultiplier"
        },
        {
          "name": "PercentToHitInBuddyZone",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Replaces PercentToHit when the target is inside the buddy zone.",
          "guard": "SetPercentToHitInBuddyZone"
        },
        {
          "name": "AlwaysSucceed",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Makes the hack always succeed.",
          "guard": "SetAlwaysSucceed"
        },
        {
          "name": "StatToRoll",
          "type": "ECharStatType",
          "kind": "optionalScalar",
          "description": "Which unit stat the roll is made against.",
          "guard": "SetStatToRoll"
        },
        {
          "name": "BaseChance",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Base percentage before the stat is taken into account.",
          "guard": "SetBaseChance"
        },
        {
          "name": "BaseValue",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Base value the stat contest is measured against.",
          "guard": "SetBaseValue"
        },
        {
          "name": "AttackerStat",
          "type": "ECharStatType",
          "kind": "optionalScalar",
          "description": "Attacker's stat in a unit-versus-unit contest.",
          "guard": "SetAttackerStat"
        },
        {
          "name": "DefenderStat",
          "type": "ECharStatType",
          "kind": "optionalScalar",
          "description": "Defender's stat in a unit-versus-unit contest.",
          "guard": "SetDefenderStat"
        },
        {
          "name": "CustomProperties",
          "type": "array<AECustomProperty>",
          "kind": "nested",
          "description": "Free-form key/value pairs for bridge-mod editors; ignored by the built-in editors."
        }
      ]
    },
    {
      "name": "TargetStyleEdit",
      "fields": [
        {
          "name": "Class",
          "type": "string",
          "kind": "plain",
          "description": "Optional. Omitted = edit the existing style in place. Set = target/instantiate that class, e.g. `X2AbilityTarget_Cursor`. Bare names are auto-prefixed with `XComGame.`."
        },
        {
          "name": "OnlyIncludeTargetsInsideWeaponRange",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Excludes targets beyond the weapon's range from selection.",
          "guard": "SetOnlyIncludeTargetsInsideWeaponRange"
        },
        {
          "name": "AllowInteractiveObjects",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Lets the ability target interactive objects such as doors and consoles.",
          "guard": "SetAllowInteractiveObjects"
        },
        {
          "name": "AllowDestructibleObjects",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Lets the ability target destructible scenery.",
          "guard": "SetAllowDestructibleObjects"
        },
        {
          "name": "IncludeSelf",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Lets the user target itself.",
          "guard": "SetIncludeSelf"
        },
        {
          "name": "ShowAOE",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Draws the area-of-effect preview while aiming.",
          "guard": "SetShowAOE"
        },
        {
          "name": "RestrictToWeaponRange",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Limits the cursor to the weapon's range.",
          "guard": "SetRestrictToWeaponRange"
        },
        {
          "name": "IncreaseWeaponRange",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Extra range in tiles beyond the weapon's own, when restricted to weapon range.",
          "guard": "SetIncreaseWeaponRange"
        },
        {
          "name": "RestrictToSquadsightRange",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Limits the cursor to squadsight range rather than the weapon's.",
          "guard": "SetRestrictToSquadsightRange"
        },
        {
          "name": "FixedAbilityRange",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Fixed range in tiles, ignoring the weapon entirely.",
          "guard": "SetFixedAbilityRange"
        },
        {
          "name": "MovementRangeAdjustment",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Tiles added to or removed from how far the unit may move to reach a melee target.",
          "guard": "SetMovementRangeAdjustment"
        },
        {
          "name": "CustomProperties",
          "type": "array<AECustomProperty>",
          "kind": "nested",
          "description": "Free-form key/value pairs for bridge-mod editors; ignored by the built-in editors."
        }
      ]
    },
    {
      "name": "MultiTargetStyleEdit",
      "fields": [
        {
          "name": "Class",
          "type": "string",
          "kind": "plain",
          "description": "Optional. Omitted = edit the existing style in place. Set = target/instantiate that class, e.g. `X2AbilityMultiTarget_Radius`. Bare names are auto-prefixed with `XComGame.`."
        },
        {
          "name": "AllowSameTarget",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Lets the primary target also be picked up as a multi-target.",
          "guard": "SetAllowSameTarget"
        },
        {
          "name": "UseSourceWeaponLocation",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Measures the area from the shooter's weapon rather than the unit.",
          "guard": "SetUseSourceWeaponLocation"
        },
        {
          "name": "NumTargetsRequired",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Minimum targets that must be in the area for the ability to be usable.",
          "guard": "SetNumTargetsRequired"
        },
        {
          "name": "UseWeaponRadius",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Takes the radius from the weapon. TargetRadius is then added on top.",
          "guard": "SetUseWeaponRadius"
        },
        {
          "name": "UseWeaponBlockingCoverFlag",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Takes the weapon's setting for whether cover blocks the area.",
          "guard": "SetUseWeaponBlockingCoverFlag"
        },
        {
          "name": "IgnoreBlockingCover",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Lets the area pass through cover that would otherwise block it.",
          "guard": "SetIgnoreBlockingCover"
        },
        {
          "name": "TargetRadius",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Radius of the area in metres. Added to the weapon's radius when UseWeaponRadius is set.",
          "guard": "SetTargetRadius"
        },
        {
          "name": "TargetCoveragePercentage",
          "type": "float",
          "kind": "optionalScalar",
          "description": "How much of a tile the area must cover before that tile counts as affected.",
          "guard": "SetTargetCoveragePercentage"
        },
        {
          "name": "AddPrimaryTargetAsMultiTarget",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Moves the primary target into the multi-target list, so it is treated as part of the area rather than separately.",
          "guard": "SetAddPrimaryTargetAsMultiTarget"
        },
        {
          "name": "AllowDeadMultiTargetUnits",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Includes already-dead units in the area.",
          "guard": "SetAllowDeadMultiTargetUnits"
        },
        {
          "name": "ExcludeSelfAsTargetIfWithinRadius",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Leaves the user out of its own area of effect.",
          "guard": "SetExcludeSelfAsTargetIfWithinRadius"
        },
        {
          "name": "AbilityBonusRadiiMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "merged by RequiredAbility"
        },
        {
          "name": "AbilityBonusRadii",
          "type": "array<AbilityGrantedBonusRadius>",
          "kind": "modedArray",
          "description": "Extra radius granted when the unit has a particular ability, merged by RequiredAbility. Lets a perk widen the blast without a separate ability.",
          "modeField": "AbilityBonusRadiiMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "ConeEndDiameter",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Width of the cone at its far end, in metres.",
          "guard": "SetConeEndDiameter"
        },
        {
          "name": "ConeLength",
          "type": "float",
          "kind": "optionalScalar",
          "description": "How far the cone reaches, in metres.",
          "guard": "SetConeLength"
        },
        {
          "name": "UseWeaponRangeForLength",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Takes the cone's length from the weapon's range instead of ConeLength.",
          "guard": "SetUseWeaponRangeForLength"
        },
        {
          "name": "LockShooterZ",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Restricts the cone to tiles at the shooter's own height, so it does not spread up or down floors.",
          "guard": "SetLockShooterZ"
        },
        {
          "name": "AbilityBonusConesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "merged by RequiredAbility"
        },
        {
          "name": "AbilityBonusCones",
          "type": "array<AbilityGrantedBonusCone>",
          "kind": "modedArray",
          "description": "Extra cone length and width granted by a particular ability, merged by RequiredAbility.",
          "modeField": "AbilityBonusConesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "TileWidthExtension",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Extra tiles of width added to the line.",
          "guard": "SetTileWidthExtension"
        },
        {
          "name": "SightRangeLimited",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Stops the line at the limit of sight.",
          "guard": "SetSightRangeLimited"
        },
        {
          "name": "AbilityBonusWidthsMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "merged by RequiredAbility"
        },
        {
          "name": "AbilityBonusWidths",
          "type": "array<AbilityGrantedBonusWidth>",
          "kind": "modedArray",
          "description": "Extra line width granted by a particular ability, merged by RequiredAbility.",
          "modeField": "AbilityBonusWidthsMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "TargetHeight",
          "type": "float",
          "kind": "optionalScalar",
          "description": "Height of the cylinder in metres.",
          "guard": "SetTargetHeight"
        },
        {
          "name": "UseOnlyGroundTiles",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Restricts the cylinder to ground-level tiles.",
          "guard": "SetUseOnlyGroundTiles"
        },
        {
          "name": "NumExtraShots",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Additional shots fired at the same target beyond the first.",
          "guard": "SetNumExtraShots"
        },
        {
          "name": "OnlyAllyOfType",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Restricts targeting to allies of this character type.",
          "guard": "SetOnlyAllyOfType"
        },
        {
          "name": "AcceptFriendlyUnits",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Includes friendly units.",
          "guard": "SetAcceptFriendlyUnits"
        },
        {
          "name": "AcceptEnemyUnits",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Includes hostile units.",
          "guard": "SetAcceptEnemyUnits"
        },
        {
          "name": "OnlyAcceptRoboticUnits",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Restricts targeting to robotic units.",
          "guard": "SetOnlyAcceptRoboticUnits"
        },
        {
          "name": "OnlyAcceptAlienUnits",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Restricts targeting to aliens.",
          "guard": "SetOnlyAcceptAlienUnits"
        },
        {
          "name": "OnlyAcceptAdventUnits",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Restricts targeting to ADVENT units.",
          "guard": "SetOnlyAcceptAdventUnits"
        },
        {
          "name": "RandomlySelectOne",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Picks a single target at random from everything that qualified.",
          "guard": "SetRandomlySelectOne"
        },
        {
          "name": "DontAcceptNeutralUnits",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Leaves civilians and other neutrals out.",
          "guard": "SetDontAcceptNeutralUnits"
        },
        {
          "name": "RandomChance",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Percentage chance each qualifying unit is actually included.",
          "guard": "SetRandomChance"
        },
        {
          "name": "UseAbilitySourceAsPrimaryTarget",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Treats the ability's user as the primary target.",
          "guard": "SetUseAbilitySourceAsPrimaryTarget"
        },
        {
          "name": "ClaymoreEnvironmentalDamage",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Environmental damage the claymore blast does to scenery.",
          "guard": "SetClaymoreEnvironmentalDamage"
        },
        {
          "name": "CustomProperties",
          "type": "array<AECustomProperty>",
          "kind": "nested",
          "description": "Free-form key/value pairs for bridge-mod editors; ignored by the built-in editors."
        }
      ]
    },
    {
      "name": "TriggerEdit",
      "fields": [
        {
          "name": "Class",
          "type": "string",
          "kind": "plain",
          "description": "Trigger class to target/instantiate, e.g. `X2AbilityTrigger_UnitPostBeginPlay`. Bare names are auto-prefixed with `XComGame.`."
        },
        {
          "name": "Mode",
          "type": "EArrayEditMode",
          "kind": "plain",
          "description": "Per-entry edit mode (`EArrayEditMode`). Defaults to the enum's first value, which clears the existing array."
        },
        {
          "name": "Priority",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Order this trigger runs in relative to others on the same event. Lower runs first.",
          "guard": "SetPriority"
        },
        {
          "name": "ListenerEventID",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Event this listener waits for. The handling function can only be assigned in code, so a listener added purely from config never fires - editing an existing one does.",
          "guard": "SetListenerEventID"
        },
        {
          "name": "ListenerDeferral",
          "type": "EventListenerDeferral",
          "kind": "optionalScalar",
          "description": "When the listener runs relative to the event being processed.",
          "guard": "SetListenerDeferral"
        },
        {
          "name": "ListenerFilter",
          "type": "AbilityEventFilter",
          "kind": "optionalScalar",
          "description": "Which units the event is accepted from, such as only the source or only the target.",
          "guard": "SetListenerFilter"
        },
        {
          "name": "ListenerPriority",
          "type": "int",
          "kind": "optionalScalar",
          "description": "Order among listeners for the same event.",
          "guard": "SetListenerPriority"
        },
        {
          "name": "MethodName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Method on the observer class that the trigger calls.",
          "guard": "SetMethodName"
        },
        {
          "name": "EventObserverClass",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Class that observes the event. Loaded by name at runtime.",
          "guard": "SetEventObserverClass"
        },
        {
          "name": "RulerActionExclusions_XComEffectsMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "X2AbilityTrigger_DLC_Day60OnAbilityActivated (Alien Hunters, via the AbilityEditorAlienHunters bridge)"
        },
        {
          "name": "RulerActionExclusions_XComEffects",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Effects on the acting XCOM unit that stop the ruler from reacting.",
          "modeField": "RulerActionExclusions_XComEffectsMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "RulerActionExclusions_AbilityNamesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "RulerActionExclusions_AbilityNames",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "Abilities whose activation never triggers a ruler reaction.",
          "modeField": "RulerActionExclusions_AbilityNamesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "CustomProperties",
          "type": "array<AECustomProperty>",
          "kind": "nested",
          "description": "Free-form key/value pairs for bridge-mod editors; ignored by the built-in editors."
        }
      ]
    },
    {
      "name": "AbilityEventListenerEdit",
      "fields": [
        {
          "name": "EventID",
          "type": "name",
          "kind": "plain",
          "description": "Matches the existing `Template.AbilityEventListeners` entry to edit. Entries cannot be added (their `EventFn` delegate is code-only)."
        },
        {
          "name": "Deferral",
          "type": "EventListenerDeferral",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetDeferral"
        },
        {
          "name": "Filter",
          "type": "AbilityEventFilter",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetFilter"
        },
        {
          "name": "Priority",
          "type": "int",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetPriority"
        }
      ]
    },
    {
      "name": "ExtraEditorRegistration",
      "fields": [
        {
          "name": "EditorClass",
          "type": "string",
          "kind": "plain",
          "description": ""
        },
        {
          "name": "Priority",
          "type": "int",
          "kind": "plain",
          "description": ""
        }
      ]
    },
    {
      "name": "AbilityEdit",
      "fields": [
        {
          "name": "Ability",
          "type": "name",
          "kind": "plain",
          "description": "Required. Template name of the ability to edit, or - with `Create=true` - to create (e.g. `SwordSlice`)."
        },
        {
          "name": "Create",
          "type": "bool",
          "kind": "plain",
          "description": "Create the ability when no template of that name exists, then apply the rest of the entry to it. If it already exists, a warning is logged and the entry is applied as a normal edit."
        },
        {
          "name": "CloneFrom",
          "type": "name",
          "kind": "plain",
          "description": "With `Create=true`: existing ability to deep-copy as the starting point. Its costs, cooldown, charges, effects (including their `ApplyOnTick` and condition lists), conditions, triggers and styles are copied, not shared, so editing the copy never changes the original. Empty = blank template built by `Preset`. If the source does not exist, nothing is created."
        },
        {
          "name": "Preset",
          "type": "EAbilityCreatePreset",
          "kind": "plain",
          "description": "Blank creation only (`Create=true`, no `CloneFrom`): which standard game-state and visualization functions the new ability runs (`EAbilityCreatePreset`). Ignored when `CloneFrom` is set."
        },
        {
          "name": "Hostility",
          "type": "EAbilityHostility",
          "kind": "optionalScalar",
          "description": "Whether the ability is offensive, defensive or neutral. Drives AI targeting and the reticle colour. One of eHostility_Offensive, eHostility_Defensive, eHostility_Neutral.",
          "guard": "SetHostility"
        },
        {
          "name": "ConcealmentRule",
          "type": "EConcealmentRule",
          "kind": "optionalScalar",
          "description": "What happens to the shooter's concealment when the ability is used.",
          "guard": "SetConcealmentRule"
        },
        {
          "name": "AdditionalAbilities",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "",
          "modeField": "AdditionalAbilitiesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "AdditionalAbilitiesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "PrerequisiteAbilities",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "",
          "modeField": "PrerequisiteAbilitiesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "PrerequisiteAbilitiesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "OverrideAbilities",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "",
          "modeField": "OverrideAbilitiesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "OverrideAbilitiesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "Cooldown",
          "type": "CooldownEdit",
          "kind": "nested",
          "description": ""
        },
        {
          "name": "CostMode",
          "type": "EAbilityCostEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "Costs",
          "type": "array<CostEdit>",
          "kind": "nested",
          "description": "",
          "modeField": "CostMode",
          "modeEnum": "EAbilityCostEditMode"
        },
        {
          "name": "Charges",
          "type": "ChargesEdit",
          "kind": "nested",
          "description": ""
        },
        {
          "name": "Effects",
          "type": "array<EffectEdit>",
          "kind": "nested",
          "description": ""
        },
        {
          "name": "ShooterConditions",
          "type": "array<ConditionEdit>",
          "kind": "nested",
          "description": "Template-level condition arrays"
        },
        {
          "name": "TargetConditions",
          "type": "array<ConditionEdit>",
          "kind": "nested",
          "description": ""
        },
        {
          "name": "MultiTargetConditions",
          "type": "array<ConditionEdit>",
          "kind": "nested",
          "description": ""
        },
        {
          "name": "ToHitCalc",
          "type": "ToHitCalcEdit",
          "kind": "nested",
          "description": "To-hit calc slots"
        },
        {
          "name": "ToHitOwnerOnMissCalc",
          "type": "ToHitCalcEdit",
          "kind": "nested",
          "description": ""
        },
        {
          "name": "TargetStyle",
          "type": "TargetStyleEdit",
          "kind": "nested",
          "description": "Targeting style slots"
        },
        {
          "name": "MultiTargetStyle",
          "type": "MultiTargetStyleEdit",
          "kind": "nested",
          "description": ""
        },
        {
          "name": "Triggers",
          "type": "array<TriggerEdit>",
          "kind": "nested",
          "description": "Trigger array + event listener edits"
        },
        {
          "name": "AbilityEventListenerEdits",
          "type": "array<AbilityEventListenerEdit>",
          "kind": "nested",
          "description": ""
        },
        {
          "name": "CrossClassEligible",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetCrossClassEligible"
        },
        {
          "name": "IsPassive",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetIsPassive"
        },
        {
          "name": "UniqueSource",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetUniqueSource"
        },
        {
          "name": "AllowedByDefault",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetAllowedByDefault"
        },
        {
          "name": "TriggerChance",
          "type": "float",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetTriggerChance"
        },
        {
          "name": "SuperConcealmentLoss",
          "type": "int",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetSuperConcealmentLoss"
        },
        {
          "name": "ChosenActivationIncreasePerUse",
          "type": "int",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetChosenActivationIncreasePerUse"
        },
        {
          "name": "LostSpawnIncreasePerUse",
          "type": "int",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetLostSpawnIncreasePerUse"
        },
        {
          "name": "AbilityPointCost",
          "type": "int",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetAbilityPointCost"
        },
        {
          "name": "DefaultSourceItemSlot",
          "type": "EInventorySlot",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetDefaultSourceItemSlot"
        },
        {
          "name": "UseThrownGrenadeEffects",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetUseThrownGrenadeEffects"
        },
        {
          "name": "UseLaunchedGrenadeEffects",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetUseLaunchedGrenadeEffects"
        },
        {
          "name": "AllowFreeFireWeaponUpgrade",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetAllowFreeFireWeaponUpgrade"
        },
        {
          "name": "AllowAmmoEffects",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetAllowAmmoEffects"
        },
        {
          "name": "AllowBonusWeaponEffects",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetAllowBonusWeaponEffects"
        },
        {
          "name": "SilentAbility",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetSilentAbility"
        },
        {
          "name": "CannotTeleport",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetCannotTeleport"
        },
        {
          "name": "PreventsTargetTeleport",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetPreventsTargetTeleport"
        },
        {
          "name": "FinalizeAbilityName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetFinalizeAbilityName"
        },
        {
          "name": "CancelAbilityName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetCancelAbilityName"
        },
        {
          "name": "TwoTurnAttackAbility",
          "type": "name",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetTwoTurnAttackAbility"
        },
        {
          "name": "IconImage",
          "type": "string",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetIconImage"
        },
        {
          "name": "AbilityIconColor",
          "type": "string",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetAbilityIconColor"
        },
        {
          "name": "AbilityIconBehaviorHUD",
          "type": "EAbilityIconBehavior",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetAbilityIconBehaviorHUD"
        },
        {
          "name": "ShotHUDPriority",
          "type": "int",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetShotHUDPriority"
        },
        {
          "name": "DisplayInUITooltip",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetDisplayInUITooltip"
        },
        {
          "name": "DisplayInUITacticalText",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetDisplayInUITacticalText"
        },
        {
          "name": "DontDisplayInAbilitySummary",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetDontDisplayInAbilitySummary"
        },
        {
          "name": "DisplayTargetHitChance",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetDisplayTargetHitChance"
        },
        {
          "name": "HideOnClassUnlock",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetHideOnClassUnlock"
        },
        {
          "name": "AbilitySourceName",
          "type": "name",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetAbilitySourceName"
        },
        {
          "name": "LimitTargetIcons",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetLimitTargetIcons"
        },
        {
          "name": "BypassAbilityConfirm",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetBypassAbilityConfirm"
        },
        {
          "name": "UseAmmoAsChargesForHUD",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetUseAmmoAsChargesForHUD"
        },
        {
          "name": "AmmoAsChargesDivisor",
          "type": "int",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetAmmoAsChargesDivisor"
        },
        {
          "name": "FriendlyFireWarning",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetFriendlyFireWarning"
        },
        {
          "name": "FriendlyFireWarningRobotsOnly",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetFriendlyFireWarningRobotsOnly"
        },
        {
          "name": "CommanderAbility",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "",
          "guard": "SetCommanderAbility"
        },
        {
          "name": "FriendlyName",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Name shown in the UI. Short text only: the ini cannot carry quotes, commas or parentheses. For prose use a [MyAbility X2AbilityTemplate] section in XComGame.int.",
          "guard": "SetFriendlyName"
        },
        {
          "name": "LongDescription",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Description shown in the ability tooltip and on the promotion screen. Same limits as FriendlyName.",
          "guard": "SetLongDescription"
        },
        {
          "name": "HelpText",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Short help line shown in the tactical HUD tooltip. Same limits as FriendlyName.",
          "guard": "SetHelpText"
        },
        {
          "name": "FlyOverText",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Text of the flyover shown when the ability activates. Same limits as FriendlyName.",
          "guard": "SetFlyOverText"
        },
        {
          "name": "TargetingMethod",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Qualified class path of the targeting method, e.g. XComGame.X2TargetingMethod_OverTheShoulder. The class default is X2TargetingMethod_TopDown.",
          "guard": "SetTargetingMethod"
        },
        {
          "name": "CinescriptCameraType",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Cinescript camera played when the ability is visualized, e.g. StandardGunFiring (see DefaultCameras.ini).",
          "guard": "SetCinescriptCameraType"
        },
        {
          "name": "AbilityConfirmSound",
          "type": "string",
          "kind": "optionalScalar",
          "description": "Sound played when the ability is confirmed in the HUD, e.g. TacticalUI_SwordConfirm.",
          "guard": "SetAbilityConfirmSound"
        },
        {
          "name": "ActivationSpeech",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Speech line played when the ability activates.",
          "guard": "SetActivationSpeech"
        },
        {
          "name": "CustomFireAnim",
          "type": "name",
          "kind": "optionalScalar",
          "description": "Animation played instead of the weapon's normal fire animation.",
          "guard": "SetCustomFireAnim"
        },
        {
          "name": "SkipFireAction",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Do not exit cover, fire and re-enter cover when the ability activates.",
          "guard": "SetSkipFireAction"
        },
        {
          "name": "ShowActivation",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Show the ability name over the activating unit when it is used.",
          "guard": "SetShowActivation"
        },
        {
          "name": "SkipMoveStop",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Move-then-act abilities only: do not play the stop-moving animation before acting.",
          "guard": "SetSkipMoveStop"
        },
        {
          "name": "FrameEvenWhenUnitIsHidden",
          "type": "bool",
          "kind": "optionalScalar",
          "description": "Frame the camera on the source unit when the ability is used even if the unit is hidden in the fog.",
          "guard": "SetFrameEvenWhenUnitIsHidden"
        },
        {
          "name": "AssociatedPassivesMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": "--- Template name arrays ---"
        },
        {
          "name": "AssociatedPassives",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "",
          "modeField": "AssociatedPassivesMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "PostActivationEventsMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "PostActivationEvents",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "",
          "modeField": "PostActivationEventsMode",
          "modeEnum": "ENameArrayEditMode"
        },
        {
          "name": "HideIfAvailableMode",
          "type": "ENameArrayEditMode",
          "kind": "mode",
          "description": ""
        },
        {
          "name": "HideIfAvailable",
          "type": "array<name>",
          "kind": "modedArray",
          "description": "",
          "modeField": "HideIfAvailableMode",
          "modeEnum": "ENameArrayEditMode"
        }
      ]
    }
  ],
  "template": {
    "fields": [
      {
        "config": "Hostility",
        "type": "EAbilityHostility",
        "kind": "scalar",
        "gameField": "Hostility",
        "description": "Whether the ability is offensive, defensive or neutral. Drives AI targeting and the reticle colour. One of eHostility_Offensive, eHostility_Defensive, eHostility_Neutral.",
        "guard": "SetHostility"
      },
      {
        "config": "ConcealmentRule",
        "type": "EConcealmentRule",
        "kind": "scalar",
        "gameField": "ConcealmentRule",
        "description": "What happens to the shooter's concealment when the ability is used.",
        "guard": "SetConcealmentRule"
      },
      {
        "config": "CrossClassEligible",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bCrossClassEligible",
        "description": "",
        "guard": "SetCrossClassEligible"
      },
      {
        "config": "IsPassive",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bIsPassive",
        "description": "",
        "guard": "SetIsPassive"
      },
      {
        "config": "UniqueSource",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bUniqueSource",
        "description": "",
        "guard": "SetUniqueSource"
      },
      {
        "config": "AllowedByDefault",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bAllowedByDefault",
        "description": "",
        "guard": "SetAllowedByDefault"
      },
      {
        "config": "TriggerChance",
        "type": "float",
        "kind": "scalar",
        "gameField": "TriggerChance",
        "description": "",
        "guard": "SetTriggerChance"
      },
      {
        "config": "SuperConcealmentLoss",
        "type": "int",
        "kind": "scalar",
        "gameField": "SuperConcealmentLoss",
        "description": "",
        "guard": "SetSuperConcealmentLoss"
      },
      {
        "config": "ChosenActivationIncreasePerUse",
        "type": "int",
        "kind": "scalar",
        "gameField": "ChosenActivationIncreasePerUse",
        "description": "",
        "guard": "SetChosenActivationIncreasePerUse"
      },
      {
        "config": "LostSpawnIncreasePerUse",
        "type": "int",
        "kind": "scalar",
        "gameField": "LostSpawnIncreasePerUse",
        "description": "",
        "guard": "SetLostSpawnIncreasePerUse"
      },
      {
        "config": "AbilityPointCost",
        "type": "int",
        "kind": "scalar",
        "gameField": "AbilityPointCost",
        "description": "",
        "guard": "SetAbilityPointCost"
      },
      {
        "config": "DefaultSourceItemSlot",
        "type": "EInventorySlot",
        "kind": "scalar",
        "gameField": "DefaultSourceItemSlot",
        "description": "",
        "guard": "SetDefaultSourceItemSlot"
      },
      {
        "config": "UseThrownGrenadeEffects",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bUseThrownGrenadeEffects",
        "description": "",
        "guard": "SetUseThrownGrenadeEffects"
      },
      {
        "config": "UseLaunchedGrenadeEffects",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bUseLaunchedGrenadeEffects",
        "description": "",
        "guard": "SetUseLaunchedGrenadeEffects"
      },
      {
        "config": "AllowFreeFireWeaponUpgrade",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bAllowFreeFireWeaponUpgrade",
        "description": "",
        "guard": "SetAllowFreeFireWeaponUpgrade"
      },
      {
        "config": "AllowAmmoEffects",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bAllowAmmoEffects",
        "description": "",
        "guard": "SetAllowAmmoEffects"
      },
      {
        "config": "AllowBonusWeaponEffects",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bAllowBonusWeaponEffects",
        "description": "",
        "guard": "SetAllowBonusWeaponEffects"
      },
      {
        "config": "SilentAbility",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bSilentAbility",
        "description": "",
        "guard": "SetSilentAbility"
      },
      {
        "config": "CannotTeleport",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bCannotTeleport",
        "description": "",
        "guard": "SetCannotTeleport"
      },
      {
        "config": "PreventsTargetTeleport",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bPreventsTargetTeleport",
        "description": "",
        "guard": "SetPreventsTargetTeleport"
      },
      {
        "config": "FinalizeAbilityName",
        "type": "name",
        "kind": "scalar",
        "gameField": "FinalizeAbilityName",
        "description": "",
        "guard": "SetFinalizeAbilityName"
      },
      {
        "config": "CancelAbilityName",
        "type": "name",
        "kind": "scalar",
        "gameField": "CancelAbilityName",
        "description": "",
        "guard": "SetCancelAbilityName"
      },
      {
        "config": "TwoTurnAttackAbility",
        "type": "name",
        "kind": "scalar",
        "gameField": "TwoTurnAttackAbility",
        "description": "",
        "guard": "SetTwoTurnAttackAbility"
      },
      {
        "config": "IconImage",
        "type": "string",
        "kind": "scalar",
        "gameField": "IconImage",
        "description": "",
        "guard": "SetIconImage"
      },
      {
        "config": "AbilityIconColor",
        "type": "string",
        "kind": "scalar",
        "gameField": "AbilityIconColor",
        "description": "",
        "guard": "SetAbilityIconColor"
      },
      {
        "config": "AbilityIconBehaviorHUD",
        "type": "EAbilityIconBehavior",
        "kind": "scalar",
        "gameField": "eAbilityIconBehaviorHUD",
        "description": "",
        "guard": "SetAbilityIconBehaviorHUD"
      },
      {
        "config": "ShotHUDPriority",
        "type": "int",
        "kind": "scalar",
        "gameField": "ShotHUDPriority",
        "description": "",
        "guard": "SetShotHUDPriority"
      },
      {
        "config": "DisplayInUITooltip",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bDisplayInUITooltip",
        "description": "",
        "guard": "SetDisplayInUITooltip"
      },
      {
        "config": "DisplayInUITacticalText",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bDisplayInUITacticalText",
        "description": "",
        "guard": "SetDisplayInUITacticalText"
      },
      {
        "config": "DontDisplayInAbilitySummary",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bDontDisplayInAbilitySummary",
        "description": "",
        "guard": "SetDontDisplayInAbilitySummary"
      },
      {
        "config": "DisplayTargetHitChance",
        "type": "bool",
        "kind": "scalar",
        "gameField": "DisplayTargetHitChance",
        "description": "",
        "guard": "SetDisplayTargetHitChance"
      },
      {
        "config": "HideOnClassUnlock",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bHideOnClassUnlock",
        "description": "",
        "guard": "SetHideOnClassUnlock"
      },
      {
        "config": "AbilitySourceName",
        "type": "name",
        "kind": "scalar",
        "gameField": "AbilitySourceName",
        "description": "",
        "guard": "SetAbilitySourceName"
      },
      {
        "config": "LimitTargetIcons",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bLimitTargetIcons",
        "description": "",
        "guard": "SetLimitTargetIcons"
      },
      {
        "config": "BypassAbilityConfirm",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bBypassAbilityConfirm",
        "description": "",
        "guard": "SetBypassAbilityConfirm"
      },
      {
        "config": "UseAmmoAsChargesForHUD",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bUseAmmoAsChargesForHUD",
        "description": "",
        "guard": "SetUseAmmoAsChargesForHUD"
      },
      {
        "config": "AmmoAsChargesDivisor",
        "type": "int",
        "kind": "scalar",
        "gameField": "iAmmoAsChargesDivisor",
        "description": "",
        "guard": "SetAmmoAsChargesDivisor"
      },
      {
        "config": "FriendlyFireWarning",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bFriendlyFireWarning",
        "description": "",
        "guard": "SetFriendlyFireWarning"
      },
      {
        "config": "FriendlyFireWarningRobotsOnly",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bFriendlyFireWarningRobotsOnly",
        "description": "",
        "guard": "SetFriendlyFireWarningRobotsOnly"
      },
      {
        "config": "CommanderAbility",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bCommanderAbility",
        "description": "",
        "guard": "SetCommanderAbility"
      },
      {
        "config": "FriendlyName",
        "type": "string",
        "kind": "scalar",
        "gameField": "LocFriendlyName",
        "description": "Name shown in the UI. Short text only: the ini cannot carry quotes, commas or parentheses. For prose use a [MyAbility X2AbilityTemplate] section in XComGame.int.",
        "guard": "SetFriendlyName"
      },
      {
        "config": "LongDescription",
        "type": "string",
        "kind": "scalar",
        "gameField": "LocLongDescription",
        "description": "Description shown in the ability tooltip and on the promotion screen. Same limits as FriendlyName.",
        "guard": "SetLongDescription"
      },
      {
        "config": "HelpText",
        "type": "string",
        "kind": "scalar",
        "gameField": "LocHelpText",
        "description": "Short help line shown in the tactical HUD tooltip. Same limits as FriendlyName.",
        "guard": "SetHelpText"
      },
      {
        "config": "FlyOverText",
        "type": "string",
        "kind": "scalar",
        "gameField": "LocFlyOverText",
        "description": "Text of the flyover shown when the ability activates. Same limits as FriendlyName.",
        "guard": "SetFlyOverText"
      },
      {
        "config": "TargetingMethod",
        "type": "string",
        "kind": "scalar",
        "gameField": "TargetingMethod",
        "description": "Qualified class path of the targeting method, e.g. XComGame.X2TargetingMethod_OverTheShoulder. The class default is X2TargetingMethod_TopDown.",
        "guard": "SetTargetingMethod"
      },
      {
        "config": "CinescriptCameraType",
        "type": "string",
        "kind": "scalar",
        "gameField": "CinescriptCameraType",
        "description": "Cinescript camera played when the ability is visualized, e.g. StandardGunFiring (see DefaultCameras.ini).",
        "guard": "SetCinescriptCameraType"
      },
      {
        "config": "AbilityConfirmSound",
        "type": "string",
        "kind": "scalar",
        "gameField": "AbilityConfirmSound",
        "description": "Sound played when the ability is confirmed in the HUD, e.g. TacticalUI_SwordConfirm.",
        "guard": "SetAbilityConfirmSound"
      },
      {
        "config": "ActivationSpeech",
        "type": "name",
        "kind": "scalar",
        "gameField": "ActivationSpeech",
        "description": "Speech line played when the ability activates.",
        "guard": "SetActivationSpeech"
      },
      {
        "config": "CustomFireAnim",
        "type": "name",
        "kind": "scalar",
        "gameField": "CustomFireAnim",
        "description": "Animation played instead of the weapon's normal fire animation.",
        "guard": "SetCustomFireAnim"
      },
      {
        "config": "SkipFireAction",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bSkipFireAction",
        "description": "Do not exit cover, fire and re-enter cover when the ability activates.",
        "guard": "SetSkipFireAction"
      },
      {
        "config": "ShowActivation",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bShowActivation",
        "description": "Show the ability name over the activating unit when it is used.",
        "guard": "SetShowActivation"
      },
      {
        "config": "SkipMoveStop",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bSkipMoveStop",
        "description": "Move-then-act abilities only: do not play the stop-moving animation before acting.",
        "guard": "SetSkipMoveStop"
      },
      {
        "config": "FrameEvenWhenUnitIsHidden",
        "type": "bool",
        "kind": "scalar",
        "gameField": "bFrameEvenWhenUnitIsHidden",
        "description": "Frame the camera on the source unit when the ability is used even if the unit is hidden in the fog.",
        "guard": "SetFrameEvenWhenUnitIsHidden"
      },
      {
        "config": "AdditionalAbilities",
        "type": "array<name>",
        "kind": "namearray",
        "gameField": "AdditionalAbilities",
        "description": "",
        "modeField": "AdditionalAbilitiesMode",
        "modeEnum": "ENameArrayEditMode"
      },
      {
        "config": "PrerequisiteAbilities",
        "type": "array<name>",
        "kind": "namearray",
        "gameField": "PrerequisiteAbilities",
        "description": "",
        "modeField": "PrerequisiteAbilitiesMode",
        "modeEnum": "ENameArrayEditMode"
      },
      {
        "config": "OverrideAbilities",
        "type": "array<name>",
        "kind": "namearray",
        "gameField": "OverrideAbilities",
        "description": "",
        "modeField": "OverrideAbilitiesMode",
        "modeEnum": "ENameArrayEditMode"
      },
      {
        "config": "AssociatedPassives",
        "type": "array<name>",
        "kind": "namearray",
        "gameField": "AssociatedPassives",
        "description": "",
        "modeField": "AssociatedPassivesMode",
        "modeEnum": "ENameArrayEditMode"
      },
      {
        "config": "PostActivationEvents",
        "type": "array<name>",
        "kind": "namearray",
        "gameField": "PostActivationEvents",
        "description": "",
        "modeField": "PostActivationEventsMode",
        "modeEnum": "ENameArrayEditMode"
      },
      {
        "config": "HideIfAvailable",
        "type": "array<name>",
        "kind": "namearray",
        "gameField": "HideIfAvailable",
        "description": "",
        "modeField": "HideIfAvailableMode",
        "modeEnum": "ENameArrayEditMode"
      }
    ],
    "notEditable": [
      {
        "name": "Requirements",
        "reason": "type `StrategyRequirement`"
      },
      {
        "name": "bRecordValidTiles",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "bTickPerActionEffects",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "bCheckCollision",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "bAffectNeighboringTiles",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "bFragileDamageOnly",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "AbilityRevealEvent",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "ChosenReinforcementGroupName",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "ChosenTraitType",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "ChosenExcludeTraits",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "ChosenTraitForceLevelGate",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "LocPromotionPopupText",
        "reason": "localized &mdash; use .int localization files"
      },
      {
        "name": "LocMissMessage",
        "reason": "localized &mdash; use .int localization files"
      },
      {
        "name": "LocHitMessage",
        "reason": "localized &mdash; use .int localization files"
      },
      {
        "name": "LocFriendlyNameWhenConcealed",
        "reason": "localized &mdash; use .int localization files"
      },
      {
        "name": "LocLongDescriptionWhenConcealed",
        "reason": "localized &mdash; use .int localization files"
      },
      {
        "name": "LocDefaultSoldierClass",
        "reason": "localized &mdash; use .int localization files"
      },
      {
        "name": "LocDefaultPrimaryWeapon",
        "reason": "localized &mdash; use .int localization files"
      },
      {
        "name": "LocDefaultSecondaryWeapon",
        "reason": "localized &mdash; use .int localization files"
      },
      {
        "name": "HideErrors",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "bNoConfirmationWithHotKey",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "DefaultKeyBinding",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "UIStatMarkups",
        "reason": "array of `UIAbilityStatMarkup`"
      },
      {
        "name": "CustomFireKillAnim",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "CustomMovingFireAnim",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "CustomMovingFireKillAnim",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "CustomMovingTurnLeftFireAnim",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "CustomMovingTurnLeftFireKillAnim",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "CustomMovingTurnRightFireAnim",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "CustomMovingTurnRightFireKillAnim",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "CustomSelfFireAnim",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "AssociatedPlayTiming",
        "reason": "type `SequencePlayTiming`"
      },
      {
        "name": "bShowPostActivation",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "bSkipExitCoverWhenFiring",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "bSkipPerkActivationActions",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "bSkipPerkActivationActionsSync",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "bOverrideMeleeDeath",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "bOverrideVisualResult",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "OverrideVisualResult",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "bHideWeaponDuringFire",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "bHideAmmoWeaponDuringFire",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "bIsASuppressionEffect",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "bOverrideAim",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "bUseSourceLocationZToAim",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "bOverrideWeapon",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "bStationaryWeapon",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "ActionFireClass",
        "reason": "class reference"
      },
      {
        "name": "bForceProjectileTouchEvents",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "SourceHitSpeech",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "TargetHitSpeech",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "SourceMissSpeech",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "TargetMissSpeech",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "TargetKilledByAlienSpeech",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "TargetKilledByXComSpeech",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "MultiTargetsKilledByAlienSpeech",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "MultiTargetsKilledByXComSpeech",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "TargetWingedSpeech",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "TargetArmorHitSpeech",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "TargetMissedSpeech",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "AbilityPassiveAOEStyle",
        "reason": "type `X2AbilityPassiveAOEStyle`"
      },
      {
        "name": "bAllowUnderhandAnim",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "SecondaryTargetingMethod",
        "reason": "class reference"
      },
      {
        "name": "SkipRenderOfAOETargetingTiles",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "SkipRenderOfTargetingTemplate",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "MeleePuckMeshPath",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "CameraPriority",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "bUsesFiringCamera",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "FrameAbilityCameraType",
        "reason": "not covered (deliberate core-set choice)"
      },
      {
        "name": "BuildNewGameStateFn",
        "reason": "delegate &mdash; code-only"
      },
      {
        "name": "BuildInterruptGameStateFn",
        "reason": "delegate &mdash; code-only"
      },
      {
        "name": "BuildVisualizationFn",
        "reason": "delegate &mdash; code-only"
      },
      {
        "name": "BuildAppliedVisualizationSyncFn",
        "reason": "delegate &mdash; code-only"
      },
      {
        "name": "BuildAffectedVisualizationSyncFn",
        "reason": "delegate &mdash; code-only"
      },
      {
        "name": "SoldierAbilityPurchasedFn",
        "reason": "delegate &mdash; code-only"
      },
      {
        "name": "OnVisualizationTrackInsertedFn",
        "reason": "delegate &mdash; code-only"
      },
      {
        "name": "ModifyNewContextFn",
        "reason": "delegate &mdash; code-only"
      },
      {
        "name": "DamagePreviewFn",
        "reason": "delegate &mdash; code-only"
      },
      {
        "name": "GetBonusWeaponAmmoFn",
        "reason": "delegate &mdash; code-only"
      },
      {
        "name": "MergeVisualizationFn",
        "reason": "delegate &mdash; code-only"
      },
      {
        "name": "AlternateFriendlyNameFn",
        "reason": "delegate &mdash; code-only"
      },
      {
        "name": "ShouldRevealChosenTraitFn",
        "reason": "delegate &mdash; code-only"
      },
      {
        "name": "OverrideAbilityAvailabilityFn",
        "reason": "delegate &mdash; code-only"
      },
      {
        "name": "MP_PerkOverride",
        "reason": "not covered (deliberate core-set choice)"
      }
    ]
  },
  "bridges": [
    {
      "name": "AbilityEditorAlienHunters",
      "displayName": "Ability Editor: Alien Hunters",
      "repo": "https://github.com/boundir/AbilityEditorAlienHunters",
      "requires": {
        "mods": [
          "AbilityEditor"
        ],
        "dlc": [
          "Alien Hunters"
        ]
      },
      "sourceHash": "fa51af737991cef72c96208d41a34b777a5a9670f7cb745ed3ee9da8ab20d26a",
      "generatedFrom": "b63de9584fdc7e2b208f8bb1256d20dc14d52cab3bd324c202bd86e3b550e65f",
      "stale": false,
      "editorCount": 3,
      "editors": [
        {
          "family": "Effects",
          "class": "X2AbilityEffectsEditor_DLC_Day60Freeze",
          "gameClass": "X2Effect_DLC_Day60Freeze",
          "package": "DLC_2"
        },
        {
          "family": "Effects",
          "class": "X2AbilityEffectsEditor_DLC_Day60TurnStartRemoveActionPoints",
          "gameClass": "X2Effect_DLC_Day60TurnStartRemoveActionPoints",
          "package": "DLC_2"
        },
        {
          "family": "Triggers",
          "class": "X2AbilityTriggerEditor_DLC_Day60OnAbilityActivated",
          "gameClass": "X2AbilityTrigger_DLC_Day60OnAbilityActivated",
          "package": "DLC_2"
        }
      ]
    }
  ],
  "families": [
    {
      "name": "Costs",
      "configKey": "Costs",
      "editStruct": "CostEdit",
      "wired": true,
      "dispatchOrder": [
        "X2AbilityCostEditor_Ammo",
        "X2AbilityCostEditor_Charges",
        "X2AbilityCostEditor_ConsumeItem",
        "X2AbilityCostEditor_Focus",
        "X2AbilityCostEditor_ReserveActionPoints",
        "X2AbilityCostEditor_HeavyWeaponActionPoints",
        "X2AbilityCostEditor_QuickdrawActionPoints",
        "X2AbilityCostEditor_ActionPoints",
        "X2AbilityCostEditor_Base"
      ],
      "intro": "Edits the `AbilityCosts` array of the template. Costs are edited **in place** when a cost of the given `Class` already exists; otherwise behaviour depends on the modes below. Fields you do not `Set` keep their current value.",
      "editors": [
        {
          "class": "X2AbilityCostEditor_Ammo",
          "extends": "X2AbilityCostEditor",
          "gameClass": "X2AbilityCost_Ammo",
          "catchAll": false,
          "fields": [
            {
              "config": "FreeCost",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bFreeCost",
              "origin": "base",
              "inheritedFrom": "X2AbilityCostEditor",
              "description": "Makes the ability cost nothing. The ability must satisfy the requirement to be usable, but using it doesn't consume action point.",
              "guard": "SetFreeCost"
            },
            {
              "config": "NumAmmo",
              "type": "int",
              "kind": "scalar",
              "gameField": "iAmmo",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Ammo consumed per use. With ConsumeAllAmmo set this becomes the minimum needed to fire, rather than the amount spent.",
              "guard": "SetNumAmmo"
            },
            {
              "config": "UseLoadedAmmo",
              "type": "bool",
              "kind": "scalar",
              "gameField": "UseLoadedAmmo",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Draws from the loaded grenade rather than the weapon's ammo, for grenade-launcher abilities.",
              "guard": "SetUseLoadedAmmo"
            },
            {
              "config": "ReturnChargesError",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bReturnChargesError",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reports a shortfall as \"out of charges\" instead of \"out of ammo\", for abilities presented to the player as charge-based.",
              "guard": "SetReturnChargesError"
            },
            {
              "config": "ConsumeAllAmmo",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConsumeAllAmmo",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Spends the whole magazine. NumAmmo then only sets the minimum required to fire.",
              "guard": "SetConsumeAllAmmo"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityCostEditor_Charges",
          "extends": "X2AbilityCostEditor",
          "gameClass": "X2AbilityCost_Charges",
          "catchAll": false,
          "fields": [
            {
              "config": "FreeCost",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bFreeCost",
              "origin": "base",
              "inheritedFrom": "X2AbilityCostEditor",
              "description": "Makes the ability cost nothing. The ability must satisfy the requirement to be usable, but using it doesn't consume action point.",
              "guard": "SetFreeCost"
            },
            {
              "config": "NumCharges",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumCharges",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Charges consumed per use.",
              "guard": "SetNumCharges"
            },
            {
              "config": "OnlyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bOnlyOnHit",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Only spends the charge when the ability hits, so a miss costs nothing.",
              "guard": "SetOnlyOnHit"
            },
            {
              "config": "AlsoExpendChargesOnSharedBondmateAbility",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAlsoExpendChargesOnSharedBondmateAbility",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Also spends the bondmate's charges of the shared ability.",
              "guard": "SetAlsoExpendChargesOnSharedBondmateAbility"
            },
            {
              "config": "SharedAbilityCharges",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "SharedAbilityCharges",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Other abilities whose charges are spent alongside this one, as Skulljack and Skullmine share a pool. Applied when paying, never when checking affordability.",
              "modeField": "SharedAbilityChargesMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityCostEditor_ConsumeItem",
          "extends": "X2AbilityCostEditor",
          "gameClass": "X2AbilityCost_ConsumeItem",
          "catchAll": false,
          "fields": [
            {
              "config": "FreeCost",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bFreeCost",
              "origin": "base",
              "inheritedFrom": "X2AbilityCostEditor",
              "description": "Makes the ability cost nothing. The ability must satisfy the requirement to be usable, but using it doesn't consume action point.",
              "guard": "SetFreeCost"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityCostEditor_Focus",
          "extends": "X2AbilityCostEditor",
          "gameClass": "X2AbilityCost_Focus",
          "catchAll": false,
          "fields": [
            {
              "config": "FreeCost",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bFreeCost",
              "origin": "base",
              "inheritedFrom": "X2AbilityCostEditor",
              "description": "Makes the ability cost nothing. The ability must satisfy the requirement to be usable, but using it doesn't consume action point.",
              "guard": "SetFreeCost"
            },
            {
              "config": "FocusAmount",
              "type": "int",
              "kind": "scalar",
              "gameField": "FocusAmount",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Templar focus consumed.",
              "guard": "SetFocusAmount"
            },
            {
              "config": "ConsumeAllFocus",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ConsumeAllFocus",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Spends the user's entire focus pool rather than FocusAmount.",
              "guard": "SetConsumeAllFocus"
            },
            {
              "config": "GhostOnlyCost",
              "type": "bool",
              "kind": "scalar",
              "gameField": "GhostOnlyCost",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Only charges focus to a Ghost, leaving the original Templar's pool untouched.",
              "guard": "SetGhostOnlyCost"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityCostEditor_ReserveActionPoints",
          "extends": "X2AbilityCostEditor",
          "gameClass": "X2AbilityCost_ReserveActionPoints",
          "catchAll": false,
          "fields": [
            {
              "config": "FreeCost",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bFreeCost",
              "origin": "base",
              "inheritedFrom": "X2AbilityCostEditor",
              "description": "Makes the ability cost nothing. The ability must satisfy the requirement to be usable, but using it doesn't consume action point.",
              "guard": "SetFreeCost"
            },
            {
              "config": "NumPoints",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumPoints",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Action points the ability consumes.",
              "guard": "SetNumPoints"
            },
            {
              "config": "ConsumeAllPoints",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConsumeAllPoints",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Ends the turn by consuming every remaining action point, rather than just NumPoints.",
              "guard": "SetConsumeAllPoints"
            },
            {
              "config": "AllowedTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "AllowedTypes",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Action point types that may pay this cost. Restricting it stops the ability being paid for with, say, a Run-and-Gun point.",
              "modeField": "AllowedTypesMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityCostEditor_HeavyWeaponActionPoints",
          "extends": "X2AbilityCostEditor_ActionPoints",
          "gameClass": "X2AbilityCost_HeavyWeaponActionPoints",
          "catchAll": false,
          "fields": [
            {
              "config": "FreeCost",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bFreeCost",
              "origin": "base",
              "inheritedFrom": "X2AbilityCostEditor",
              "description": "Makes the ability cost nothing. The ability must satisfy the requirement to be usable, but using it doesn't consume action point.",
              "guard": "SetFreeCost"
            },
            {
              "config": "NumPoints",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumPoints",
              "origin": "derived",
              "inheritedFrom": "X2AbilityCostEditor_ActionPoints",
              "description": "Action points the ability consumes.",
              "guard": "SetNumPoints"
            },
            {
              "config": "ConsumeAllPoints",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConsumeAllPoints",
              "origin": "derived",
              "inheritedFrom": "X2AbilityCostEditor_ActionPoints",
              "description": "Ends the turn by consuming every remaining action point, rather than just NumPoints.",
              "guard": "SetConsumeAllPoints"
            },
            {
              "config": "AddWeaponTypicalCost",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAddWeaponTypicalCost",
              "origin": "derived",
              "inheritedFrom": "X2AbilityCostEditor_ActionPoints",
              "description": "Adds the weapon's own typical action cost on top of NumPoints.",
              "guard": "SetAddWeaponTypicalCost"
            },
            {
              "config": "MoveCost",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bMoveCost",
              "origin": "derived",
              "inheritedFrom": "X2AbilityCostEditor_ActionPoints",
              "description": "Treats the cost as movement, so effects and abilities that key off moving apply.",
              "guard": "SetMoveCost"
            },
            {
              "config": "AllowedTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "AllowedTypes",
              "origin": "derived",
              "inheritedFrom": "X2AbilityCostEditor_ActionPoints",
              "description": "Action point types that may pay this cost. Restricting it stops the ability being paid for with, say, a Run-and-Gun point.",
              "modeField": "AllowedTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "DoNotConsumeAllEffects",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DoNotConsumeAllEffects",
              "origin": "derived",
              "inheritedFrom": "X2AbilityCostEditor_ActionPoints",
              "description": "If the user is under any of these effects, ConsumeAllPoints is ignored and the turn does not end.",
              "modeField": "DoNotConsumeAllEffectsMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "DoNotConsumeAllSoldierAbilities",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DoNotConsumeAllSoldierAbilities",
              "origin": "derived",
              "inheritedFrom": "X2AbilityCostEditor_ActionPoints",
              "description": "If the user has any of these abilities, ConsumeAllPoints is ignored. This is how Blademaster lets Slash keep the turn going.",
              "modeField": "DoNotConsumeAllSoldierAbilitiesMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityCostEditor_QuickdrawActionPoints",
          "extends": "X2AbilityCostEditor_ActionPoints",
          "gameClass": "X2AbilityCost_QuickdrawActionPoints",
          "catchAll": false,
          "fields": [
            {
              "config": "FreeCost",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bFreeCost",
              "origin": "base",
              "inheritedFrom": "X2AbilityCostEditor",
              "description": "Makes the ability cost nothing. The ability must satisfy the requirement to be usable, but using it doesn't consume action point.",
              "guard": "SetFreeCost"
            },
            {
              "config": "NumPoints",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumPoints",
              "origin": "derived",
              "inheritedFrom": "X2AbilityCostEditor_ActionPoints",
              "description": "Action points the ability consumes.",
              "guard": "SetNumPoints"
            },
            {
              "config": "ConsumeAllPoints",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConsumeAllPoints",
              "origin": "derived",
              "inheritedFrom": "X2AbilityCostEditor_ActionPoints",
              "description": "Ends the turn by consuming every remaining action point, rather than just NumPoints.",
              "guard": "SetConsumeAllPoints"
            },
            {
              "config": "AddWeaponTypicalCost",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAddWeaponTypicalCost",
              "origin": "derived",
              "inheritedFrom": "X2AbilityCostEditor_ActionPoints",
              "description": "Adds the weapon's own typical action cost on top of NumPoints.",
              "guard": "SetAddWeaponTypicalCost"
            },
            {
              "config": "MoveCost",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bMoveCost",
              "origin": "derived",
              "inheritedFrom": "X2AbilityCostEditor_ActionPoints",
              "description": "Treats the cost as movement, so effects and abilities that key off moving apply.",
              "guard": "SetMoveCost"
            },
            {
              "config": "AllowedTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "AllowedTypes",
              "origin": "derived",
              "inheritedFrom": "X2AbilityCostEditor_ActionPoints",
              "description": "Action point types that may pay this cost. Restricting it stops the ability being paid for with, say, a Run-and-Gun point.",
              "modeField": "AllowedTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "DoNotConsumeAllEffects",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DoNotConsumeAllEffects",
              "origin": "derived",
              "inheritedFrom": "X2AbilityCostEditor_ActionPoints",
              "description": "If the user is under any of these effects, ConsumeAllPoints is ignored and the turn does not end.",
              "modeField": "DoNotConsumeAllEffectsMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "DoNotConsumeAllSoldierAbilities",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DoNotConsumeAllSoldierAbilities",
              "origin": "derived",
              "inheritedFrom": "X2AbilityCostEditor_ActionPoints",
              "description": "If the user has any of these abilities, ConsumeAllPoints is ignored. This is how Blademaster lets Slash keep the turn going.",
              "modeField": "DoNotConsumeAllSoldierAbilitiesMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityCostEditor_ActionPoints",
          "extends": "X2AbilityCostEditor",
          "gameClass": "X2AbilityCost_ActionPoints",
          "catchAll": false,
          "fields": [
            {
              "config": "FreeCost",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bFreeCost",
              "origin": "base",
              "inheritedFrom": "X2AbilityCostEditor",
              "description": "Makes the ability cost nothing. The ability must satisfy the requirement to be usable, but using it doesn't consume action point.",
              "guard": "SetFreeCost"
            },
            {
              "config": "NumPoints",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumPoints",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Action points the ability consumes.",
              "guard": "SetNumPoints"
            },
            {
              "config": "ConsumeAllPoints",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConsumeAllPoints",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Ends the turn by consuming every remaining action point, rather than just NumPoints.",
              "guard": "SetConsumeAllPoints"
            },
            {
              "config": "AddWeaponTypicalCost",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAddWeaponTypicalCost",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Adds the weapon's own typical action cost on top of NumPoints.",
              "guard": "SetAddWeaponTypicalCost"
            },
            {
              "config": "MoveCost",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bMoveCost",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Treats the cost as movement, so effects and abilities that key off moving apply.",
              "guard": "SetMoveCost"
            },
            {
              "config": "AllowedTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "AllowedTypes",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Action point types that may pay this cost. Restricting it stops the ability being paid for with, say, a Run-and-Gun point.",
              "modeField": "AllowedTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "DoNotConsumeAllEffects",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DoNotConsumeAllEffects",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "If the user is under any of these effects, ConsumeAllPoints is ignored and the turn does not end.",
              "modeField": "DoNotConsumeAllEffectsMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "DoNotConsumeAllSoldierAbilities",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DoNotConsumeAllSoldierAbilities",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "If the user has any of these abilities, ConsumeAllPoints is ignored. This is how Blademaster lets Slash keep the turn going.",
              "modeField": "DoNotConsumeAllSoldierAbilitiesMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityCostEditor_Base",
          "extends": "X2AbilityCostEditor",
          "gameClass": null,
          "catchAll": true,
          "fields": [
            {
              "config": "FreeCost",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bFreeCost",
              "origin": "base",
              "inheritedFrom": "X2AbilityCostEditor",
              "description": "Makes the ability cost nothing. The ability must satisfy the requirement to be usable, but using it doesn't consume action point.",
              "guard": "SetFreeCost"
            }
          ]
        }
      ]
    },
    {
      "name": "Cooldown",
      "configKey": "Cooldown",
      "editStruct": "CooldownEdit",
      "wired": true,
      "dispatchOrder": [
        "X2AbilityCooldownEditor_AidProtocol",
        "X2AbilityCooldownEditor_PerPlayerType",
        "X2AbilityCooldownEditor_LocalAndGlobal",
        "X2AbilityCooldownEditor_Global",
        "X2AbilityCooldownEditor_Rend",
        "X2AbilityCooldownEditor_Base"
      ],
      "intro": "Edits the template's `AbilityCooldown`. With `Class` **omitted**, the existing cooldown is edited **in place** (no-op if the ability has none). With `Class` set, the existing cooldown is edited in place when it is already exactly that class; otherwise it is **replaced** by a new instance - any field you do not `Set` then takes the class's default value.",
      "editors": [
        {
          "class": "X2AbilityCooldownEditor_AidProtocol",
          "extends": "X2AbilityCooldownEditor",
          "gameClass": "X2AbilityCooldown_AidProtocol",
          "catchAll": false,
          "fields": [
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "base",
              "inheritedFrom": "X2AbilityCooldownEditor",
              "description": "Turns the ability is unavailable after use.",
              "guard": "SetNumTurns"
            },
            {
              "config": "IgnoreOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDoNotApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityCooldownEditor",
              "description": "Skips applying the cooldown when the ability hits, so only a miss puts it on cooldown.",
              "guard": "SetIgnoreOnHit"
            },
            {
              "config": "AdditionalCooldowns",
              "type": "array<AdditionalCooldownEdit>",
              "kind": "nested",
              "gameField": "AditionalAbilityCooldowns",
              "origin": "base",
              "inheritedFrom": "X2AbilityCooldownEditor",
              "description": "Cooldowns this ability also puts on *other* abilities, keyed by AbilityName. Used where firing one thing should lock out another.",
              "modeField": "AdditionalCooldownMode",
              "modeEnum": "EAdditionalCooldownEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityCooldownEditor_PerPlayerType",
          "extends": "X2AbilityCooldownEditor_LocalAndGlobal",
          "gameClass": "X2AbilityCooldown_PerPlayerType",
          "catchAll": false,
          "fields": [
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "base",
              "inheritedFrom": "X2AbilityCooldownEditor",
              "description": "Turns the ability is unavailable after use.",
              "guard": "SetNumTurns"
            },
            {
              "config": "IgnoreOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDoNotApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityCooldownEditor",
              "description": "Skips applying the cooldown when the ability hits, so only a miss puts it on cooldown.",
              "guard": "SetIgnoreOnHit"
            },
            {
              "config": "AdditionalCooldowns",
              "type": "array<AdditionalCooldownEdit>",
              "kind": "nested",
              "gameField": "AditionalAbilityCooldowns",
              "origin": "base",
              "inheritedFrom": "X2AbilityCooldownEditor",
              "description": "Cooldowns this ability also puts on *other* abilities, keyed by AbilityName. Used where firing one thing should lock out another.",
              "modeField": "AdditionalCooldownMode",
              "modeEnum": "EAdditionalCooldownEditMode"
            },
            {
              "config": "NumTurnsForAI",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurnsForAI",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Cooldown used when the unit is AI-controlled, letting XCOM and the enemy run different timings. Only on X2AbilityCooldown_PerPlayerType.",
              "guard": "SetNumTurnsForAI"
            },
            {
              "config": "NumGlobalTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumGlobalTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityCooldownEditor_LocalAndGlobal",
              "description": "Cooldown applied across every unit on the team, not just the one that used the ability. Only on the global cooldown classes.",
              "guard": "SetNumGlobalTurns"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityCooldownEditor_LocalAndGlobal",
          "extends": "X2AbilityCooldownEditor",
          "gameClass": "X2AbilityCooldown_LocalAndGlobal",
          "catchAll": false,
          "fields": [
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "base",
              "inheritedFrom": "X2AbilityCooldownEditor",
              "description": "Turns the ability is unavailable after use.",
              "guard": "SetNumTurns"
            },
            {
              "config": "IgnoreOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDoNotApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityCooldownEditor",
              "description": "Skips applying the cooldown when the ability hits, so only a miss puts it on cooldown.",
              "guard": "SetIgnoreOnHit"
            },
            {
              "config": "AdditionalCooldowns",
              "type": "array<AdditionalCooldownEdit>",
              "kind": "nested",
              "gameField": "AditionalAbilityCooldowns",
              "origin": "base",
              "inheritedFrom": "X2AbilityCooldownEditor",
              "description": "Cooldowns this ability also puts on *other* abilities, keyed by AbilityName. Used where firing one thing should lock out another.",
              "modeField": "AdditionalCooldownMode",
              "modeEnum": "EAdditionalCooldownEditMode"
            },
            {
              "config": "NumGlobalTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumGlobalTurns",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Cooldown applied across every unit on the team, not just the one that used the ability. Only on the global cooldown classes.",
              "guard": "SetNumGlobalTurns"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityCooldownEditor_Global",
          "extends": "X2AbilityCooldownEditor",
          "gameClass": "X2AbilityCooldown_Global",
          "catchAll": false,
          "fields": [
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "base",
              "inheritedFrom": "X2AbilityCooldownEditor",
              "description": "Turns the ability is unavailable after use.",
              "guard": "SetNumTurns"
            },
            {
              "config": "IgnoreOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDoNotApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityCooldownEditor",
              "description": "Skips applying the cooldown when the ability hits, so only a miss puts it on cooldown.",
              "guard": "SetIgnoreOnHit"
            },
            {
              "config": "AdditionalCooldowns",
              "type": "array<AdditionalCooldownEdit>",
              "kind": "nested",
              "gameField": "AditionalAbilityCooldowns",
              "origin": "base",
              "inheritedFrom": "X2AbilityCooldownEditor",
              "description": "Cooldowns this ability also puts on *other* abilities, keyed by AbilityName. Used where firing one thing should lock out another.",
              "modeField": "AdditionalCooldownMode",
              "modeEnum": "EAdditionalCooldownEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityCooldownEditor_Rend",
          "extends": "X2AbilityCooldownEditor",
          "gameClass": "X2AbilityCooldown_Rend",
          "catchAll": false,
          "fields": [
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "base",
              "inheritedFrom": "X2AbilityCooldownEditor",
              "description": "Turns the ability is unavailable after use.",
              "guard": "SetNumTurns"
            },
            {
              "config": "IgnoreOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDoNotApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityCooldownEditor",
              "description": "Skips applying the cooldown when the ability hits, so only a miss puts it on cooldown.",
              "guard": "SetIgnoreOnHit"
            },
            {
              "config": "AdditionalCooldowns",
              "type": "array<AdditionalCooldownEdit>",
              "kind": "nested",
              "gameField": "AditionalAbilityCooldowns",
              "origin": "base",
              "inheritedFrom": "X2AbilityCooldownEditor",
              "description": "Cooldowns this ability also puts on *other* abilities, keyed by AbilityName. Used where firing one thing should lock out another.",
              "modeField": "AdditionalCooldownMode",
              "modeEnum": "EAdditionalCooldownEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityCooldownEditor_Base",
          "extends": "X2AbilityCooldownEditor",
          "gameClass": null,
          "catchAll": true,
          "fields": [
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "base",
              "inheritedFrom": "X2AbilityCooldownEditor",
              "description": "Turns the ability is unavailable after use.",
              "guard": "SetNumTurns"
            },
            {
              "config": "IgnoreOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDoNotApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityCooldownEditor",
              "description": "Skips applying the cooldown when the ability hits, so only a miss puts it on cooldown.",
              "guard": "SetIgnoreOnHit"
            },
            {
              "config": "AdditionalCooldowns",
              "type": "array<AdditionalCooldownEdit>",
              "kind": "nested",
              "gameField": "AditionalAbilityCooldowns",
              "origin": "base",
              "inheritedFrom": "X2AbilityCooldownEditor",
              "description": "Cooldowns this ability also puts on *other* abilities, keyed by AbilityName. Used where firing one thing should lock out another.",
              "modeField": "AdditionalCooldownMode",
              "modeEnum": "EAdditionalCooldownEditMode"
            }
          ]
        }
      ]
    },
    {
      "name": "Charges",
      "configKey": "Charges",
      "editStruct": "ChargesEdit",
      "wired": true,
      "dispatchOrder": [
        "X2AbilityChargesEditor_CocoonSpawnChryssalid",
        "X2AbilityChargesEditor_GremlinHeal",
        "X2AbilityChargesEditor_RevivalProtocol",
        "X2AbilityChargesEditor_ScanningProtocol",
        "X2AbilityChargesEditor_StasisLance",
        "X2AbilityChargesEditor_Base"
      ],
      "intro": "Edits the template's `AbilityCharges`. With `Class` **omitted**, the existing charges object is edited **in place** (no-op if the ability has none). With `Class` set, the existing object is edited in place when it is already exactly that class; otherwise it is **replaced** by a new instance - any field you do not `Set` then takes the class's default value. `RemoveCharges=true` removes the charges object entirely.",
      "editors": [
        {
          "class": "X2AbilityChargesEditor_CocoonSpawnChryssalid",
          "extends": "X2AbilityChargesEditor",
          "gameClass": "X2AbilityCharges_CocoonSpawnChryssalid",
          "catchAll": false,
          "fields": [
            {
              "config": "InitialCharges",
              "type": "int",
              "kind": "scalar",
              "gameField": "InitialCharges",
              "origin": "base",
              "inheritedFrom": "X2AbilityChargesEditor",
              "description": "Charges the ability starts a mission with.",
              "guard": "SetInitialCharges"
            },
            {
              "config": "BonusCharges",
              "type": "array<BonusChargeEdit>",
              "kind": "nested",
              "gameField": "BonusCharges",
              "origin": "base",
              "inheritedFrom": "X2AbilityChargesEditor",
              "description": "Extra charges granted when the unit has another ability, keyed by AbilityName. This is how Restoration adds charges to the medikit heal.",
              "modeField": "BonusChargesMode",
              "modeEnum": "EChargesBonusMode"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "SPAWN_CHARGES",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityChargesEditor_GremlinHeal",
          "extends": "X2AbilityChargesEditor",
          "gameClass": "X2AbilityCharges_GremlinHeal",
          "catchAll": false,
          "fields": [
            {
              "config": "InitialCharges",
              "type": "int",
              "kind": "scalar",
              "gameField": "InitialCharges",
              "origin": "base",
              "inheritedFrom": "X2AbilityChargesEditor",
              "description": "Charges the ability starts a mission with.",
              "guard": "SetInitialCharges"
            },
            {
              "config": "BonusCharges",
              "type": "array<BonusChargeEdit>",
              "kind": "nested",
              "gameField": "BonusCharges",
              "origin": "base",
              "inheritedFrom": "X2AbilityChargesEditor",
              "description": "Extra charges granted when the unit has another ability, keyed by AbilityName. This is how Restoration adds charges to the medikit heal.",
              "modeField": "BonusChargesMode",
              "modeEnum": "EChargesBonusMode"
            },
            {
              "config": "Stabilize",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStabilize",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Whether the charges behave as the stabilise-style pool, on the charge classes that support it.",
              "guard": "SetStabilize"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityChargesEditor_RevivalProtocol",
          "extends": "X2AbilityChargesEditor",
          "gameClass": "X2AbilityCharges_RevivalProtocol",
          "catchAll": false,
          "fields": [
            {
              "config": "InitialCharges",
              "type": "int",
              "kind": "scalar",
              "gameField": "InitialCharges",
              "origin": "base",
              "inheritedFrom": "X2AbilityChargesEditor",
              "description": "Charges the ability starts a mission with.",
              "guard": "SetInitialCharges"
            },
            {
              "config": "BonusCharges",
              "type": "array<BonusChargeEdit>",
              "kind": "nested",
              "gameField": "BonusCharges",
              "origin": "base",
              "inheritedFrom": "X2AbilityChargesEditor",
              "description": "Extra charges granted when the unit has another ability, keyed by AbilityName. This is how Restoration adds charges to the medikit heal.",
              "modeField": "BonusChargesMode",
              "modeEnum": "EChargesBonusMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityChargesEditor_ScanningProtocol",
          "extends": "X2AbilityChargesEditor",
          "gameClass": "X2AbilityCharges_ScanningProtocol",
          "catchAll": false,
          "fields": [
            {
              "config": "InitialCharges",
              "type": "int",
              "kind": "scalar",
              "gameField": "InitialCharges",
              "origin": "base",
              "inheritedFrom": "X2AbilityChargesEditor",
              "description": "Charges the ability starts a mission with.",
              "guard": "SetInitialCharges"
            },
            {
              "config": "BonusCharges",
              "type": "array<BonusChargeEdit>",
              "kind": "nested",
              "gameField": "BonusCharges",
              "origin": "base",
              "inheritedFrom": "X2AbilityChargesEditor",
              "description": "Extra charges granted when the unit has another ability, keyed by AbilityName. This is how Restoration adds charges to the medikit heal.",
              "modeField": "BonusChargesMode",
              "modeEnum": "EChargesBonusMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityChargesEditor_StasisLance",
          "extends": "X2AbilityChargesEditor",
          "gameClass": "X2AbilityCharges_StasisLance",
          "catchAll": false,
          "fields": [
            {
              "config": "InitialCharges",
              "type": "int",
              "kind": "scalar",
              "gameField": "InitialCharges",
              "origin": "base",
              "inheritedFrom": "X2AbilityChargesEditor",
              "description": "Charges the ability starts a mission with.",
              "guard": "SetInitialCharges"
            },
            {
              "config": "BonusCharges",
              "type": "array<BonusChargeEdit>",
              "kind": "nested",
              "gameField": "BonusCharges",
              "origin": "base",
              "inheritedFrom": "X2AbilityChargesEditor",
              "description": "Extra charges granted when the unit has another ability, keyed by AbilityName. This is how Restoration adds charges to the medikit heal.",
              "modeField": "BonusChargesMode",
              "modeEnum": "EChargesBonusMode"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "BASE_CHARGES",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityChargesEditor_Base",
          "extends": "X2AbilityChargesEditor",
          "gameClass": null,
          "catchAll": true,
          "fields": [
            {
              "config": "InitialCharges",
              "type": "int",
              "kind": "scalar",
              "gameField": "InitialCharges",
              "origin": "base",
              "inheritedFrom": "X2AbilityChargesEditor",
              "description": "Charges the ability starts a mission with.",
              "guard": "SetInitialCharges"
            },
            {
              "config": "BonusCharges",
              "type": "array<BonusChargeEdit>",
              "kind": "nested",
              "gameField": "BonusCharges",
              "origin": "base",
              "inheritedFrom": "X2AbilityChargesEditor",
              "description": "Extra charges granted when the unit has another ability, keyed by AbilityName. This is how Restoration adds charges to the medikit heal.",
              "modeField": "BonusChargesMode",
              "modeEnum": "EChargesBonusMode"
            }
          ]
        }
      ]
    },
    {
      "name": "Effects",
      "configKey": "Effects",
      "editStruct": "EffectEdit",
      "wired": true,
      "dispatchOrder": [
        "X2AbilityEffectsEditor_DLC_Day60Freeze",
        "X2AbilityEffectsEditor_DLC_Day60TurnStartRemoveActionPoints",
        "X2AbilityEffectsEditor_Obsessed",
        "X2AbilityEffectsEditor_Shattered",
        "X2AbilityEffectsEditor_VanishingWind",
        "X2AbilityEffectsEditor_KineticPlating",
        "X2AbilityEffectsEditor_Vanish",
        "X2AbilityEffectsEditor_BlastPadding",
        "X2AbilityEffectsEditor_KillUnit",
        "X2AbilityEffectsEditor_ParthenogenicPoison",
        "X2AbilityEffectsEditor_PersistentStatChange",
        "X2AbilityEffectsEditor_PersistentStatChangeRestoreDefault",
        "X2AbilityEffectsEditor_SpawnPsiZombie",
        "X2AbilityEffectsEditor_SpawnShadowbindUnit",
        "X2AbilityEffectsEditor_ThreatAssessment",
        "X2AbilityEffectsEditor_WallBreaking",
        "X2AbilityEffectsEditor_Achilles",
        "X2AbilityEffectsEditor_AdverseSoldierClasses",
        "X2AbilityEffectsEditor_Amplify",
        "X2AbilityEffectsEditor_ApplyAcidToWorld",
        "X2AbilityEffectsEditor_ApplyBlazingPinionsTargetToWorld",
        "X2AbilityEffectsEditor_ApplyFireToWorld",
        "X2AbilityEffectsEditor_ApplyPoisonToWorld",
        "X2AbilityEffectsEditor_ApplySmokeGrenadeToWorld",
        "X2AbilityEffectsEditor_ApplySmokeToWorld",
        "X2AbilityEffectsEditor_APRounds",
        "X2AbilityEffectsEditor_Aura",
        "X2AbilityEffectsEditor_Bewildered",
        "X2AbilityEffectsEditor_BloodTrail",
        "X2AbilityEffectsEditor_BondmateAimAdjust",
        "X2AbilityEffectsEditor_BondmateBleedout",
        "X2AbilityEffectsEditor_CombatStims",
        "X2AbilityEffectsEditor_BonusArmor",
        "X2AbilityEffectsEditor_BonusWeaponDamage",
        "X2AbilityEffectsEditor_ChryssalidBurrowedAttack",
        "X2AbilityEffectsEditor_ConditionalDamageModifier",
        "X2AbilityEffectsEditor_CoveringFire",
        "X2AbilityEffectsEditor_DamageImmunity",
        "X2AbilityEffectsEditor_DeadeyeDamage",
        "X2AbilityEffectsEditor_DelayedAbilityActivation",
        "X2AbilityEffectsEditor_FaceMultiRoundTarget",
        "X2AbilityEffectsEditor_Fortress",
        "X2AbilityEffectsEditor_GenerateCover",
        "X2AbilityEffectsEditor_Groundling",
        "X2AbilityEffectsEditor_Guardian",
        "X2AbilityEffectsEditor_HoloTarget",
        "X2AbilityEffectsEditor_HolyWarriorDeath",
        "X2AbilityEffectsEditor_HomingMine",
        "X2AbilityEffectsEditor_HuntersInstinctDamage",
        "X2AbilityEffectsEditor_ImmediateAbilityActivation",
        "X2AbilityEffectsEditor_Impatient",
        "X2AbilityEffectsEditor_Implacable",
        "X2AbilityEffectsEditor_LaserSight",
        "X2AbilityEffectsEditor_MeleeDamageAdjust",
        "X2AbilityEffectsEditor_MimicBeacon",
        "X2AbilityEffectsEditor_MindControl",
        "X2AbilityEffectsEditor_ModifyReactionFire",
        "X2AbilityEffectsEditor_ModifyStatCheckSuccesses",
        "X2AbilityEffectsEditor_TemplarFocus",
        "X2AbilityEffectsEditor_ModifyStats",
        "X2AbilityEffectsEditor_Nearsighted",
        "X2AbilityEffectsEditor_Needle",
        "X2AbilityEffectsEditor_Oblivious",
        "X2AbilityEffectsEditor_OverrideDeathAction",
        "X2AbilityEffectsEditor_OverrideDeathAnimOnLoad",
        "X2AbilityEffectsEditor_PaleHorse",
        "X2AbilityEffectsEditor_PersistentSquadViewer",
        "X2AbilityEffectsEditor_PersistentTraversalChange",
        "X2AbilityEffectsEditor_PersistentVoidConduit",
        "X2AbilityEffectsEditor_Possessed",
        "X2AbilityEffectsEditor_Regeneration",
        "X2AbilityEffectsEditor_RemoveEffectsByDamageType",
        "X2AbilityEffectsEditor_ReserveOverwatchPoints",
        "X2AbilityEffectsEditor_RunBehaviorTree",
        "X2AbilityEffectsEditor_SmokeGrenade",
        "X2AbilityEffectsEditor_Solace",
        "X2AbilityEffectsEditor_SpawnDestructible",
        "X2AbilityEffectsEditor_SpawnUnit",
        "X2AbilityEffectsEditor_Stasis",
        "X2AbilityEffectsEditor_Stunned",
        "X2AbilityEffectsEditor_SuperConcealModifier",
        "X2AbilityEffectsEditor_Sustain",
        "X2AbilityEffectsEditor_Sustained",
        "X2AbilityEffectsEditor_TalonRounds",
        "X2AbilityEffectsEditor_TargetDamageDistanceBonus",
        "X2AbilityEffectsEditor_TargetDamageTypeBonus",
        "X2AbilityEffectsEditor_ToHitModifier",
        "X2AbilityEffectsEditor_TrackingShotMarkTarget",
        "X2AbilityEffectsEditor_TurnStartActionPoints",
        "X2AbilityEffectsEditor_VolatileMix",
        "X2AbilityEffectsEditor_AlertTheLost",
        "X2AbilityEffectsEditor_ApplyDirectionalWorldDamage",
        "X2AbilityEffectsEditor_ApplyMedikitHeal",
        "X2AbilityEffectsEditor_ApplyWeaponDamage",
        "X2AbilityEffectsEditor_Brutal",
        "X2AbilityEffectsEditor_EnableGlobalAbility",
        "X2AbilityEffectsEditor_GetOverHere",
        "X2AbilityEffectsEditor_GrantActionPointsWithRecord",
        "X2AbilityEffectsEditor_GrantActionPoints",
        "X2AbilityEffectsEditor_IncreaseBondmateCohesion",
        "X2AbilityEffectsEditor_Knockback",
        "X2AbilityEffectsEditor_LifeSteal",
        "X2AbilityEffectsEditor_MarkValidActivationTiles",
        "X2AbilityEffectsEditor_ModifyInitiativeOrder",
        "X2AbilityEffectsEditor_ModifyTemplarFocus",
        "X2AbilityEffectsEditor_LethalWeaponDamage",
        "X2AbilityEffectsEditor_Persistent",
        "X2AbilityEffectsEditor_ReduceCooldowns",
        "X2AbilityEffectsEditor_RemoteStart",
        "X2AbilityEffectsEditor_RemoveEffects",
        "X2AbilityEffectsEditor_ReserveActionPoints",
        "X2AbilityEffectsEditor_SetUnitValue",
        "X2AbilityEffectsEditor_SoulSteal",
        "X2AbilityEffectsEditor_Spotted",
        "X2AbilityEffectsEditor_SuspendMissionTimer",
        "X2AbilityEffectsEditor_TriggerEvent",
        "X2AbilityEffectsEditor_VoidConduit",
        "X2AbilityEffectsEditor_World",
        "X2AbilityEffectsEditor_Base"
      ],
      "intro": "Edits the effect arrays of the template. `Slot` selects which array is edited (see `EAbilityEffectSlot`). Within the selected array the effect of class `Class` is edited **in place** if present; otherwise behaviour depends on `Mode`.",
      "editors": [
        {
          "class": "X2AbilityEffectsEditor_Obsessed",
          "extends": "X2AbilityEffectsEditor_PersistentStatChange",
          "gameClass": "X2Effect_Obsessed",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ObsessedTargetValueName",
              "type": "Name",
              "kind": "scalar",
              "gameField": "ObsessedTargetValueName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Unit value holding the object ID of the obsessed-over target.",
              "guard": "SetObsessedTargetValueName"
            },
            {
              "config": "CHLForceReapplyOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bForceReapplyOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_PersistentStatChange",
              "description": "Re-apply the stat changes when the effect is refreshed. Community Highlander field.",
              "guard": "SetCHLForceReapplyOnRefresh"
            },
            {
              "config": "StatChange",
              "type": "array<StatChangeEdit>",
              "kind": "nested",
              "gameField": "m_aStatChanges",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_PersistentStatChange",
              "description": "Stat changes applied while the effect lasts, merged by StatType.",
              "modeField": "StatChangeMode",
              "modeEnum": "EStatChangeMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_Shattered",
          "extends": "X2AbilityEffectsEditor_PersistentStatChange",
          "gameClass": "X2Effect_Shattered",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ShatteredTargetValueName",
              "type": "Name",
              "kind": "scalar",
              "gameField": "ShatteredTargetValueName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Unit value holding the object ID of the unit that shattered the target.",
              "guard": "SetShatteredTargetValueName"
            },
            {
              "config": "CHLForceReapplyOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bForceReapplyOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_PersistentStatChange",
              "description": "Re-apply the stat changes when the effect is refreshed. Community Highlander field.",
              "guard": "SetCHLForceReapplyOnRefresh"
            },
            {
              "config": "StatChange",
              "type": "array<StatChangeEdit>",
              "kind": "nested",
              "gameField": "m_aStatChanges",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_PersistentStatChange",
              "description": "Stat changes applied while the effect lasts, merged by StatType.",
              "modeField": "StatChangeMode",
              "modeEnum": "EStatChangeMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_VanishingWind",
          "extends": "X2AbilityEffectsEditor_Vanish",
          "gameClass": "X2Effect_VanishingWind",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "MovingVanishRevealAdditiveAnimName",
              "type": "name",
              "kind": "scalar",
              "gameField": "MovingVanishRevealAdditiveAnimName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Additive animation played on reveal when the unit is revealed while moving.",
              "guard": "SetMovingVanishRevealAdditiveAnimName"
            },
            {
              "config": "ReasonNotVisible",
              "type": "name",
              "kind": "scalar",
              "gameField": "ReasonNotVisible",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Vanish",
              "description": "Visibility tag given as the reason the vanished unit cannot be seen.",
              "guard": "SetReasonNotVisible"
            },
            {
              "config": "VanishRevealAdditiveAnimName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VanishRevealAdditiveAnimName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Vanish",
              "description": "Additive animation played on reveal when VanishRevealAnimName is empty.",
              "guard": "SetVanishRevealAdditiveAnimName"
            },
            {
              "config": "VanishRevealAnimName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VanishRevealAnimName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Vanish",
              "description": "Animation played when the unit is revealed.",
              "guard": "SetVanishRevealAnimName"
            },
            {
              "config": "VanishSyncAnimName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VanishSyncAnimName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Vanish",
              "description": "Additive animation played when the vanished state is visualized from a save.",
              "guard": "SetVanishSyncAnimName"
            },
            {
              "config": "CHLForceReapplyOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bForceReapplyOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_PersistentStatChange",
              "description": "Re-apply the stat changes when the effect is refreshed. Community Highlander field.",
              "guard": "SetCHLForceReapplyOnRefresh"
            },
            {
              "config": "StatChange",
              "type": "array<StatChangeEdit>",
              "kind": "nested",
              "gameField": "m_aStatChanges",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_PersistentStatChange",
              "description": "Stat changes applied while the effect lasts, merged by StatType.",
              "modeField": "StatChangeMode",
              "modeEnum": "EStatChangeMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "PARTINGSILKREVEAL_MIN_TILE_DISTANCE",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_KineticPlating",
          "extends": "X2AbilityEffectsEditor_PersistentStatChange",
          "gameClass": "X2Effect_KineticPlating",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ShieldPerMiss",
              "type": "int",
              "kind": "scalar",
              "gameField": "ShieldPerMiss",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Shield HP gained each time an attack misses the unit.",
              "guard": "SetShieldPerMiss"
            },
            {
              "config": "CHLForceReapplyOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bForceReapplyOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_PersistentStatChange",
              "description": "Re-apply the stat changes when the effect is refreshed. Community Highlander field.",
              "guard": "SetCHLForceReapplyOnRefresh"
            },
            {
              "config": "StatChange",
              "type": "array<StatChangeEdit>",
              "kind": "nested",
              "gameField": "m_aStatChanges",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_PersistentStatChange",
              "description": "Stat changes applied while the effect lasts, merged by StatType.",
              "modeField": "StatChangeMode",
              "modeEnum": "EStatChangeMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_Vanish",
          "extends": "X2AbilityEffectsEditor_PersistentStatChange",
          "gameClass": "X2Effect_Vanish",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ReasonNotVisible",
              "type": "name",
              "kind": "scalar",
              "gameField": "ReasonNotVisible",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Visibility tag given as the reason the vanished unit cannot be seen.",
              "guard": "SetReasonNotVisible"
            },
            {
              "config": "VanishRevealAdditiveAnimName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VanishRevealAdditiveAnimName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Additive animation played on reveal when VanishRevealAnimName is empty.",
              "guard": "SetVanishRevealAdditiveAnimName"
            },
            {
              "config": "VanishRevealAnimName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VanishRevealAnimName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Animation played when the unit is revealed.",
              "guard": "SetVanishRevealAnimName"
            },
            {
              "config": "VanishSyncAnimName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VanishSyncAnimName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Additive animation played when the vanished state is visualized from a save.",
              "guard": "SetVanishSyncAnimName"
            },
            {
              "config": "CHLForceReapplyOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bForceReapplyOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_PersistentStatChange",
              "description": "Re-apply the stat changes when the effect is refreshed. Community Highlander field.",
              "guard": "SetCHLForceReapplyOnRefresh"
            },
            {
              "config": "StatChange",
              "type": "array<StatChangeEdit>",
              "kind": "nested",
              "gameField": "m_aStatChanges",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_PersistentStatChange",
              "description": "Stat changes applied while the effect lasts, merged by StatType.",
              "modeField": "StatChangeMode",
              "modeEnum": "EStatChangeMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "COLLISION_MIN_TILE_DISTANCE",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "COLLISION_MAX_TILE_DISTANCE",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "VANISH_EXCLUDE_EFFECTS",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_BlastPadding",
          "extends": "X2AbilityEffectsEditor_BonusArmor",
          "gameClass": "X2Effect_BlastPadding",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ExplosiveDamageReduction",
              "type": "float",
              "kind": "scalar",
              "gameField": "ExplosiveDamageReduction",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Fraction of explosive damage removed.",
              "guard": "SetExplosiveDamageReduction"
            },
            {
              "config": "ArmorMitigationAmount",
              "type": "int",
              "kind": "scalar",
              "gameField": "ArmorMitigationAmount",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_BonusArmor",
              "description": "Armor points granted while the effect lasts.",
              "guard": "SetArmorMitigationAmount"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "ARMOR_CHANCE",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "ARMOR_MITIGATION",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_KillUnit",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_KillUnit",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_ParthenogenicPoison",
          "extends": "X2AbilityEffectsEditor_SpawnUnit",
          "gameClass": "X2Effect_ParthenogenicPoison",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "AltUnitToSpawnName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AltUnitToSpawnName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Character template spawned instead of the usual one, when set.",
              "guard": "SetAltUnitToSpawnName"
            },
            {
              "config": "UnitToSpawnName",
              "type": "name",
              "kind": "scalar",
              "gameField": "UnitToSpawnName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Character template of the unit spawned.",
              "guard": "SetUnitToSpawnName"
            },
            {
              "config": "ClearTileBlockedByTargetUnitFlag",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bClearTileBlockedByTargetUnitFlag",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Spawn on the target's own tile.",
              "guard": "SetClearTileBlockedByTargetUnitFlag"
            },
            {
              "config": "CopyTargetAppearance",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCopyTargetAppearance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Give the spawned unit the target's appearance. Takes precedence over CopySourceAppearance.",
              "guard": "SetCopyTargetAppearance"
            },
            {
              "config": "CopySourceAppearance",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCopySourceAppearance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Give the spawned unit the source's appearance.",
              "guard": "SetCopySourceAppearance"
            },
            {
              "config": "KnockbackAffectsSpawnLocation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bKnockbackAffectsSpawnLocation",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Spawn where the target ended up after knockback rather than where it was hit.",
              "guard": "SetKnockbackAffectsSpawnLocation"
            },
            {
              "config": "AddToSourceGroup",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAddToSourceGroup",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Put the spawned unit in the source's AI group.",
              "guard": "SetAddToSourceGroup"
            },
            {
              "config": "CopyReanimatedFromUnit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCopyReanimatedFromUnit",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Copy the reanimated unit's inventory and abilities too, not just its appearance.",
              "guard": "SetCopyReanimatedFromUnit"
            },
            {
              "config": "CopyReanimatedStatsFromUnit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCopyReanimatedStatsFromUnit",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Copy the reanimated unit's stats.",
              "guard": "SetCopyReanimatedStatsFromUnit"
            },
            {
              "config": "SetProcessedScamperAs",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSetProcessedScamperAs",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Mark the spawned unit's group as having already scampered, so it does not reveal and scamper on sight.",
              "guard": "SetSetProcessedScamperAs"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "ParthenogenicPoisonText",
              "reason": "localized &mdash; use .int localization files"
            },
            {
              "name": "ParthenogenicPoisonType",
              "reason": "not yet supported"
            },
            {
              "name": "ParthenogenicPoisonCocoonSpawnedName",
              "reason": "not yet supported"
            },
            {
              "name": "DiedWithParthenogenicPoisonTriggerName",
              "reason": "private/protected"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_PersistentStatChange",
          "extends": "X2AbilityEffectsEditor_ModifyStats",
          "gameClass": "X2Effect_PersistentStatChange",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "CHLForceReapplyOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bForceReapplyOnRefresh",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Re-apply the stat changes when the effect is refreshed. Community Highlander field.",
              "guard": "SetCHLForceReapplyOnRefresh"
            },
            {
              "config": "StatChange",
              "type": "array<StatChangeEdit>",
              "kind": "nested",
              "gameField": "m_aStatChanges",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Stat changes applied while the effect lasts, merged by StatType.",
              "modeField": "StatChangeMode",
              "modeEnum": "EStatChangeMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_PersistentStatChangeRestoreDefault",
          "extends": "X2AbilityEffectsEditor_ModifyStats",
          "gameClass": "X2Effect_PersistentStatChangeRestoreDefault",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "StatTypesToRestore",
              "type": "array<ECharStatType>",
              "kind": "namearray",
              "gameField": "StatTypesToRestore",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Stats reset to their default value while the effect lasts.",
              "modeField": "StatTypesToRestoreMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_SpawnPsiZombie",
          "extends": "X2AbilityEffectsEditor_SpawnUnit",
          "gameClass": "X2Effect_SpawnPsiZombie",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "AnimationName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AnimationName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reanimation animation played on the corpse.",
              "guard": "SetAnimationName"
            },
            {
              "config": "AltUnitToSpawnName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AltUnitToSpawnName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Character template spawned instead of the usual one, when set.",
              "guard": "SetAltUnitToSpawnName"
            },
            {
              "config": "StartAnimationMinDelaySec",
              "type": "float",
              "kind": "scalar",
              "gameField": "StartAnimationMinDelaySec",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Shortest delay, in seconds, before the reanimation animation starts.",
              "guard": "SetStartAnimationMinDelaySec"
            },
            {
              "config": "StartAnimationMaxDelaySec",
              "type": "float",
              "kind": "scalar",
              "gameField": "StartAnimationMaxDelaySec",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Longest delay, in seconds, before the reanimation animation starts.",
              "guard": "SetStartAnimationMaxDelaySec"
            },
            {
              "config": "UnitToSpawnName",
              "type": "name",
              "kind": "scalar",
              "gameField": "UnitToSpawnName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Character template of the unit spawned.",
              "guard": "SetUnitToSpawnName"
            },
            {
              "config": "ClearTileBlockedByTargetUnitFlag",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bClearTileBlockedByTargetUnitFlag",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Spawn on the target's own tile.",
              "guard": "SetClearTileBlockedByTargetUnitFlag"
            },
            {
              "config": "CopyTargetAppearance",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCopyTargetAppearance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Give the spawned unit the target's appearance. Takes precedence over CopySourceAppearance.",
              "guard": "SetCopyTargetAppearance"
            },
            {
              "config": "CopySourceAppearance",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCopySourceAppearance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Give the spawned unit the source's appearance.",
              "guard": "SetCopySourceAppearance"
            },
            {
              "config": "KnockbackAffectsSpawnLocation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bKnockbackAffectsSpawnLocation",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Spawn where the target ended up after knockback rather than where it was hit.",
              "guard": "SetKnockbackAffectsSpawnLocation"
            },
            {
              "config": "AddToSourceGroup",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAddToSourceGroup",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Put the spawned unit in the source's AI group.",
              "guard": "SetAddToSourceGroup"
            },
            {
              "config": "CopyReanimatedFromUnit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCopyReanimatedFromUnit",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Copy the reanimated unit's inventory and abilities too, not just its appearance.",
              "guard": "SetCopyReanimatedFromUnit"
            },
            {
              "config": "CopyReanimatedStatsFromUnit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCopyReanimatedStatsFromUnit",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Copy the reanimated unit's stats.",
              "guard": "SetCopyReanimatedStatsFromUnit"
            },
            {
              "config": "SetProcessedScamperAs",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSetProcessedScamperAs",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Mark the spawned unit's group as having already scampered, so it does not reveal and scamper on sight.",
              "guard": "SetSetProcessedScamperAs"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "ZombieFlyoverText",
              "reason": "localized &mdash; use .int localization files"
            },
            {
              "name": "TurnedZombieName",
              "reason": "private/protected"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_SpawnShadowbindUnit",
          "extends": "X2AbilityEffectsEditor_SpawnUnit",
          "gameClass": "X2Effect_SpawnShadowbindUnit",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ShadowbindUnconciousCheckName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ShadowbindUnconciousCheckName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Unit value checked to tell whether the shadowbound unit was unconscious.",
              "guard": "SetShadowbindUnconciousCheckName"
            },
            {
              "config": "UnitToSpawnName",
              "type": "name",
              "kind": "scalar",
              "gameField": "UnitToSpawnName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Character template of the unit spawned.",
              "guard": "SetUnitToSpawnName"
            },
            {
              "config": "ClearTileBlockedByTargetUnitFlag",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bClearTileBlockedByTargetUnitFlag",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Spawn on the target's own tile.",
              "guard": "SetClearTileBlockedByTargetUnitFlag"
            },
            {
              "config": "CopyTargetAppearance",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCopyTargetAppearance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Give the spawned unit the target's appearance. Takes precedence over CopySourceAppearance.",
              "guard": "SetCopyTargetAppearance"
            },
            {
              "config": "CopySourceAppearance",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCopySourceAppearance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Give the spawned unit the source's appearance.",
              "guard": "SetCopySourceAppearance"
            },
            {
              "config": "KnockbackAffectsSpawnLocation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bKnockbackAffectsSpawnLocation",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Spawn where the target ended up after knockback rather than where it was hit.",
              "guard": "SetKnockbackAffectsSpawnLocation"
            },
            {
              "config": "AddToSourceGroup",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAddToSourceGroup",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Put the spawned unit in the source's AI group.",
              "guard": "SetAddToSourceGroup"
            },
            {
              "config": "CopyReanimatedFromUnit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCopyReanimatedFromUnit",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Copy the reanimated unit's inventory and abilities too, not just its appearance.",
              "guard": "SetCopyReanimatedFromUnit"
            },
            {
              "config": "CopyReanimatedStatsFromUnit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCopyReanimatedStatsFromUnit",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Copy the reanimated unit's stats.",
              "guard": "SetCopyReanimatedStatsFromUnit"
            },
            {
              "config": "SetProcessedScamperAs",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSetProcessedScamperAs",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_SpawnUnit",
              "description": "Mark the spawned unit's group as having already scampered, so it does not reveal and scamper on sight.",
              "guard": "SetSetProcessedScamperAs"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "AbilitiesShadowCantHave",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_ThreatAssessment",
          "extends": "X2AbilityEffectsEditor_CoveringFire",
          "gameClass": "X2Effect_ThreatAssessment",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ImmediateActionPoint",
              "type": "name",
              "kind": "scalar",
              "gameField": "ImmediateActionPoint",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reserve action point given to the target as soon as the effect is applied.",
              "guard": "SetImmediateActionPoint"
            },
            {
              "config": "AbilityToActivate",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilityToActivate",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_CoveringFire",
              "description": "Ability fired when the covering fire check matches.",
              "guard": "SetAbilityToActivate"
            },
            {
              "config": "GrantActionPoint",
              "type": "name",
              "kind": "scalar",
              "gameField": "GrantActionPoint",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_CoveringFire",
              "description": "Reserve action point given to the covering unit when the check matches.",
              "guard": "SetGrantActionPoint"
            },
            {
              "config": "MaxPointsPerTurn",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxPointsPerTurn",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_CoveringFire",
              "description": "Most times per turn the action point can be granted. 0 or less removes the limit.",
              "guard": "SetMaxPointsPerTurn"
            },
            {
              "config": "DirectAttackOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDirectAttackOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_CoveringFire",
              "description": "Only match when the unit carrying the effect is attacked directly.",
              "guard": "SetDirectAttackOnly"
            },
            {
              "config": "PreEmptiveFire",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPreEmptiveFire",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_CoveringFire",
              "description": "Fire before the attacker's shot resolves instead of after it.",
              "guard": "SetPreEmptiveFire"
            },
            {
              "config": "OnlyDuringEnemyTurn",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bOnlyDuringEnemyTurn",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_CoveringFire",
              "description": "Only fire during the enemy turn.",
              "guard": "SetOnlyDuringEnemyTurn"
            },
            {
              "config": "UseMultiTargets",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseMultiTargets",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_CoveringFire",
              "description": "Fire the ability at the covering unit itself and hit its multi-targets, instead of retaliating at the attacker.",
              "guard": "SetUseMultiTargets"
            },
            {
              "config": "OnlyWhenAttackMisses",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bOnlyWhenAttackMisses",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_CoveringFire",
              "description": "Only fire when the attack missed.",
              "guard": "SetOnlyWhenAttackMisses"
            },
            {
              "config": "SelfTargeting",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSelfTargeting",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_CoveringFire",
              "description": "The fired ability targets the covering unit itself.",
              "guard": "SetSelfTargeting"
            },
            {
              "config": "ActivationPercentChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ActivationPercentChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_CoveringFire",
              "description": "Percent chance the ability fires when the check matches. 0 always fires.",
              "guard": "SetActivationPercentChance"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_WallBreaking",
          "extends": "X2AbilityEffectsEditor_PersistentTraversalChange",
          "gameClass": "X2Effect_WallBreaking",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "WallBreakingEffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "WallBreakingEffectName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Name of the effect on the unit that grants wall breaking.",
              "guard": "SetWallBreakingEffectName"
            },
            {
              "config": "TraversalChanges",
              "type": "array<TraversalChange>",
              "kind": "namearray",
              "gameField": "aTraversalChanges",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_PersistentTraversalChange",
              "description": "Traversal types switched on or off while the effect lasts, merged by Traversal.",
              "modeField": "TraversalChangesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_Achilles",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Achilles",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ToHitMin",
              "type": "int",
              "kind": "scalar",
              "gameField": "ToHitMin",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Lowest hit chance at which the damage multiplier applies.",
              "guard": "SetToHitMin"
            },
            {
              "config": "DmgMod",
              "type": "float",
              "kind": "scalar",
              "gameField": "DmgMod",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Multiplier applied to the damage when the effect's condition is met.",
              "guard": "SetDmgMod"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_AdverseSoldierClasses",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_AdverseSoldierClasses",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "AdverseClasses",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "AdverseClasses",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Soldier classes whose attacks trigger the damage multiplier.",
              "modeField": "AdverseClassesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "DmgMod",
              "type": "float",
              "kind": "scalar",
              "gameField": "DmgMod",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Multiplier applied to the damage when the effect's condition is met.",
              "guard": "SetDmgMod"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_Amplify",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Amplify",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "BonusDamageMult",
              "type": "float",
              "kind": "scalar",
              "gameField": "BonusDamageMult",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Fraction of the damage added as bonus.",
              "guard": "SetBonusDamageMult"
            },
            {
              "config": "MinBonusDamage",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinBonusDamage",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Smallest bonus damage applied, when the fraction comes out lower.",
              "guard": "SetMinBonusDamage"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "AmplifyRemoved",
              "reason": "localized &mdash; use .int localization files"
            },
            {
              "name": "AmplifyCountdown",
              "reason": "localized &mdash; use .int localization files"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_ApplyAcidToWorld",
          "extends": "X2AbilityEffectsEditor_World",
          "gameClass": "X2Effect_ApplyAcidToWorld",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "AcidParticleSystem1Tile",
              "type": "string",
              "kind": "scalar",
              "gameField": "AcidParticleSystemFill_Name_1pc",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Particle system path for an acid pool covering a single tile.",
              "guard": "SetAcidParticleSystem1Tile"
            },
            {
              "config": "AcidParticleSystem2Tiles",
              "type": "string",
              "kind": "scalar",
              "gameField": "AcidParticleSystemFill_Name_2pc",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Particle system path for an acid pool covering two tiles.",
              "guard": "SetAcidParticleSystem2Tiles"
            },
            {
              "config": "AcidParticleSystem3TilesLine",
              "type": "string",
              "kind": "scalar",
              "gameField": "AcidParticleSystemFill_Name_3pc_Long",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Particle system path for an acid pool covering three tiles in a line.",
              "guard": "SetAcidParticleSystem3TilesLine"
            },
            {
              "config": "AcidParticleSystem3TilesCorner",
              "type": "string",
              "kind": "scalar",
              "gameField": "AcidParticleSystemFill_Name_3pc_Corner",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Particle system path for an acid pool covering three tiles in a corner.",
              "guard": "SetAcidParticleSystem3TilesCorner"
            },
            {
              "config": "AcidParticleSystem4TilesLine",
              "type": "string",
              "kind": "scalar",
              "gameField": "AcidParticleSystemFill_Name_4pc_Long",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Particle system path for an acid pool covering four tiles in a line.",
              "guard": "SetAcidParticleSystem4TilesLine"
            },
            {
              "config": "AcidParticleSystem4TilesSquare",
              "type": "string",
              "kind": "scalar",
              "gameField": "AcidParticleSystemFill_Name_4pc_Square",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Particle system path for an acid pool covering a 2x2 square.",
              "guard": "SetAcidParticleSystem4TilesSquare"
            },
            {
              "config": "AcidParticleSystem4TilesL",
              "type": "string",
              "kind": "scalar",
              "gameField": "AcidParticleSystemFill_Name_4pc_L",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Particle system path for an acid pool covering four tiles in an L shape.",
              "guard": "SetAcidParticleSystem4TilesL"
            },
            {
              "config": "AcidParticleSystem4TilesReverseL",
              "type": "string",
              "kind": "scalar",
              "gameField": "AcidParticleSystemFill_Name_4pc_Reverse_L",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Particle system path for an acid pool covering four tiles in a mirrored L shape.",
              "guard": "SetAcidParticleSystem4TilesReverseL"
            },
            {
              "config": "AcidParticleSystem4TilesT",
              "type": "string",
              "kind": "scalar",
              "gameField": "AcidParticleSystemFill_Name_4pc_Middle",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Particle system path for an acid pool covering four tiles in a T shape (the game's 4pc_Middle).",
              "guard": "SetAcidParticleSystem4TilesT"
            },
            {
              "config": "AcidParticleSystem4TilesS",
              "type": "string",
              "kind": "scalar",
              "gameField": "AcidParticleSystemFill_Name_4pc_S",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Particle system path for an acid pool covering four tiles in an S shape.",
              "guard": "SetAcidParticleSystem4TilesS"
            },
            {
              "config": "AcidParticleSystem4TilesReverseS",
              "type": "string",
              "kind": "scalar",
              "gameField": "AcidParticleSystemFill_Name_4pc_Reverse_S",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Particle system path for an acid pool covering four tiles in a mirrored S shape.",
              "guard": "SetAcidParticleSystem4TilesReverseS"
            },
            {
              "config": "CenterTile",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCenterTile",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_World",
              "description": "Apply the world effect to the centre tile only.",
              "guard": "SetCenterTile"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_ApplyBlazingPinionsTargetToWorld",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_ApplyBlazingPinionsTargetToWorld",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "OverrideParticleSystem",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideParticleSystemFill_Name",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Particle system path played on the target instead of the default one. Empty keeps the default.",
              "guard": "SetOverrideParticleSystem"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "BlazingPinionsParticleSystemFill_Name",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_ApplyFireToWorld",
          "extends": "X2AbilityEffectsEditor_World",
          "gameClass": "X2Effect_ApplyFireToWorld",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "FireChance_Level1",
              "type": "float",
              "kind": "scalar",
              "gameField": "FireChance_Level1",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Weight of a level 1 fire when rolling the intensity of new fires; relative to the other two levels.",
              "guard": "SetFireChance_Level1"
            },
            {
              "config": "FireChance_Level2",
              "type": "float",
              "kind": "scalar",
              "gameField": "FireChance_Level2",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Weight of a level 2 fire when rolling the intensity of new fires; relative to the other two levels.",
              "guard": "SetFireChance_Level2"
            },
            {
              "config": "FireChance_Level3",
              "type": "float",
              "kind": "scalar",
              "gameField": "FireChance_Level3",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Weight of a level 3 fire when rolling the intensity of new fires; relative to the other two levels.",
              "guard": "SetFireChance_Level3"
            },
            {
              "config": "UseFireChanceLevel",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseFireChanceLevel",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Roll the fire intensity from the three FireChance weights instead of using the default.",
              "guard": "SetUseFireChanceLevel"
            },
            {
              "config": "DamageFragileOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDamageFragileOnly",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Only damage fragile objects.",
              "guard": "SetDamageFragileOnly"
            },
            {
              "config": "CheckForLOSFromTargetLocation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCheckForLOSFromTargetLocation",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Only set tiles on fire that are visible from the target location.",
              "guard": "SetCheckForLOSFromTargetLocation"
            },
            {
              "config": "CenterTile",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCenterTile",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_World",
              "description": "Apply the world effect to the centre tile only.",
              "guard": "SetCenterTile"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "FireParticleSystemFill_Name",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "MAX_INTENSITY_2_TILES",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "LimitFireSpreadTiles",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "FillIntensityLERPTimeSecs",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_ApplyPoisonToWorld",
          "extends": "X2AbilityEffectsEditor_World",
          "gameClass": "X2Effect_ApplyPoisonToWorld",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "PoisonParticleSystem",
              "type": "string",
              "kind": "scalar",
              "gameField": "PoisonParticleSystemFill_Name",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Particle system path for a poison cloud tile.",
              "guard": "SetPoisonParticleSystem"
            },
            {
              "config": "CenterTile",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCenterTile",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_World",
              "description": "Apply the world effect to the centre tile only.",
              "guard": "SetCenterTile"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "Duration",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_ApplySmokeGrenadeToWorld",
          "extends": "X2AbilityEffectsEditor_World",
          "gameClass": "X2Effect_ApplySmokeGrenadeToWorld",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "SmokeParticleSystem",
              "type": "string",
              "kind": "scalar",
              "gameField": "SmokeParticleSystemFill_Name",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Particle system path for a smoke tile.",
              "guard": "SetSmokeParticleSystem"
            },
            {
              "config": "CenterTile",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCenterTile",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_World",
              "description": "Apply the world effect to the centre tile only.",
              "guard": "SetCenterTile"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "Duration",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_ApplySmokeToWorld",
          "extends": "X2AbilityEffectsEditor_World",
          "gameClass": "X2Effect_ApplySmokeToWorld",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "SmokeParticleSystem",
              "type": "string",
              "kind": "scalar",
              "gameField": "SmokeParticleSystemFill_Name",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Particle system path for a smoke tile.",
              "guard": "SetSmokeParticleSystem"
            },
            {
              "config": "CenterTile",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCenterTile",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_World",
              "description": "Apply the world effect to the centre tile only.",
              "guard": "SetCenterTile"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_APRounds",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_APRounds",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "Pierce",
              "type": "int",
              "kind": "scalar",
              "gameField": "Pierce",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Armor pierced.",
              "guard": "SetPierce"
            },
            {
              "config": "CritChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "CritChance",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Crit chance added.",
              "guard": "SetCritChance"
            },
            {
              "config": "CritDamage",
              "type": "int",
              "kind": "scalar",
              "gameField": "CritDamage",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Crit damage added.",
              "guard": "SetCritDamage"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_Aura",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Aura",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "EventsToUpdate",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "EventsToUpdate",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Events that make the aura re-evaluate which units it covers.",
              "modeField": "EventsToUpdateMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_Bewildered",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Bewildered",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "DmgMod",
              "type": "float",
              "kind": "scalar",
              "gameField": "DmgMod",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Multiplier applied to the damage when the effect's condition is met.",
              "guard": "SetDmgMod"
            },
            {
              "config": "NumHitsForMod",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumHitsForMod",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Hits taken in the turn before the damage multiplier applies.",
              "guard": "SetNumHitsForMod"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_BloodTrail",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_BloodTrail",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "BonusDamage",
              "type": "int",
              "kind": "scalar",
              "gameField": "BonusDamage",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Bonus damage added when the effect's condition is met.",
              "guard": "SetBonusDamage"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_BondmateAimAdjust",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_BondmateAimAdjust",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ThreatenedBondmateAimBonus",
              "type": "int",
              "kind": "scalar",
              "gameField": "ThreatenedBondmateAimBonus",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Aim bonus, from bond level 2, against a target that threatens the bondmate.",
              "guard": "SetThreatenedBondmateAimBonus"
            },
            {
              "config": "BondmateTargetAimBonus",
              "type": "int",
              "kind": "scalar",
              "gameField": "BondmateTargetAimBonus",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Aim bonus, from bond level 3, against a target the bondmate attacked since last turn.",
              "guard": "SetBondmateTargetAimBonus"
            },
            {
              "config": "BondmateTargetCritBonus",
              "type": "int",
              "kind": "scalar",
              "gameField": "BondmateTargetCritBonus",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Crit bonus, from bond level 3, against a target the bondmate attacked since last turn.",
              "guard": "SetBondmateTargetCritBonus"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_BondmateBleedout",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_BondmateBleedout",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "BleedoutDurationAdjustment",
              "type": "int",
              "kind": "scalar",
              "gameField": "BleedoutDurationAdjustment",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Turns added to the bleedout duration.",
              "guard": "SetBleedoutDurationAdjustment"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_CombatStims",
          "extends": "X2AbilityEffectsEditor_BonusArmor",
          "gameClass": "X2Effect_CombatStims",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "DamageTypeImmunities",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypeImmunities",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Damage types the affected unit is immune to while the effect lasts.",
              "modeField": "DamageTypeImmunitiesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "ArmorMitigationAmount",
              "type": "int",
              "kind": "scalar",
              "gameField": "ArmorMitigationAmount",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_BonusArmor",
              "description": "Armor points granted while the effect lasts.",
              "guard": "SetArmorMitigationAmount"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "ARMOR_CHANCE",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "ARMOR_MITIGATION",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_BonusArmor",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_BonusArmor",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ArmorMitigationAmount",
              "type": "int",
              "kind": "scalar",
              "gameField": "ArmorMitigationAmount",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Armor points granted while the effect lasts.",
              "guard": "SetArmorMitigationAmount"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_BonusWeaponDamage",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_BonusWeaponDamage",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "BonusDmg",
              "type": "int",
              "kind": "scalar",
              "gameField": "BonusDmg",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Bonus damage added to the weapon's damage.",
              "guard": "SetBonusDmg"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_ChryssalidBurrowedAttack",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_ChryssalidBurrowedAttack",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "NumActions",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumActions",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Number of behavior tree actions the unit runs.",
              "guard": "SetNumActions"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_ConditionalDamageModifier",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_ConditionalDamageModifier",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ModifyOutgoingDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bModifyOutgoingDamage",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Apply to damage the unit deals.",
              "guard": "SetModifyOutgoingDamage"
            },
            {
              "config": "ModifyIncomingDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bModifyIncomingDamage",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Apply to damage the unit takes.",
              "guard": "SetModifyIncomingDamage"
            },
            {
              "config": "DamageModifier",
              "type": "float",
              "kind": "scalar",
              "gameField": "DamageModifier",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Damage multiplier; 1.0 leaves the damage unchanged.",
              "guard": "SetDamageModifier"
            },
            {
              "config": "DamageBonus",
              "type": "int",
              "kind": "scalar",
              "gameField": "DamageBonus",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Flat damage added after the multiplier.",
              "guard": "SetDamageBonus"
            },
            {
              "config": "ApplyDamageModConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": null,
              "origin": "derived",
              "inheritedFrom": null,
              "description": "X2Effect_ConditionalDamageModifier"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "ApplyDamageModConditions",
              "reason": "array of `X2Condition`"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_CoveringFire",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_CoveringFire",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "AbilityToActivate",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilityToActivate",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Ability fired when the covering fire check matches.",
              "guard": "SetAbilityToActivate"
            },
            {
              "config": "GrantActionPoint",
              "type": "name",
              "kind": "scalar",
              "gameField": "GrantActionPoint",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reserve action point given to the covering unit when the check matches.",
              "guard": "SetGrantActionPoint"
            },
            {
              "config": "MaxPointsPerTurn",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxPointsPerTurn",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Most times per turn the action point can be granted. 0 or less removes the limit.",
              "guard": "SetMaxPointsPerTurn"
            },
            {
              "config": "DirectAttackOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDirectAttackOnly",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Only match when the unit carrying the effect is attacked directly.",
              "guard": "SetDirectAttackOnly"
            },
            {
              "config": "PreEmptiveFire",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPreEmptiveFire",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Fire before the attacker's shot resolves instead of after it.",
              "guard": "SetPreEmptiveFire"
            },
            {
              "config": "OnlyDuringEnemyTurn",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bOnlyDuringEnemyTurn",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Only fire during the enemy turn.",
              "guard": "SetOnlyDuringEnemyTurn"
            },
            {
              "config": "UseMultiTargets",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseMultiTargets",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Fire the ability at the covering unit itself and hit its multi-targets, instead of retaliating at the attacker.",
              "guard": "SetUseMultiTargets"
            },
            {
              "config": "OnlyWhenAttackMisses",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bOnlyWhenAttackMisses",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Only fire when the attack missed.",
              "guard": "SetOnlyWhenAttackMisses"
            },
            {
              "config": "SelfTargeting",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSelfTargeting",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "The fired ability targets the covering unit itself.",
              "guard": "SetSelfTargeting"
            },
            {
              "config": "ActivationPercentChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ActivationPercentChance",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Percent chance the ability fires when the check matches. 0 always fires.",
              "guard": "SetActivationPercentChance"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_DamageImmunity",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_DamageImmunity",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ImmuneTypesAreInclusive",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ImmueTypesAreInclusive",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "true: immune to the listed damage types only. false: immune to every damage type except the listed ones.",
              "guard": "SetImmuneTypesAreInclusive"
            },
            {
              "config": "RemoveAfterAttackCount",
              "type": "int",
              "kind": "scalar",
              "gameField": "RemoveAfterAttackCount",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Remove the effect after this many attacks against the unit. 0 keeps it.",
              "guard": "SetRemoveAfterAttackCount"
            },
            {
              "config": "ImmuneTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "ImmuneTypes",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Damage types the immunity covers, or excludes when ImmuneTypesAreInclusive is false.",
              "modeField": "ImmuneTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_DeadeyeDamage",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_DeadeyeDamage",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "DamageMultiplier",
              "type": "float",
              "kind": "scalar",
              "gameField": "DamageMultiplier",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Extra damage as a fraction of the damage being dealt.",
              "guard": "SetDamageMultiplier"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_DelayedAbilityActivation",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_DelayedAbilityActivation",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "TriggerEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "TriggerEventName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Event the effect fires.",
              "guard": "SetTriggerEventName"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_FaceMultiRoundTarget",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_FaceMultiRoundTarget",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "TriggerEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "TriggerEventName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Event the effect fires.",
              "guard": "SetTriggerEventName"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_Fortress",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Fortress",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "DamageImmunities",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageImmunities",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Damage types the unit is immune to. The game assumes Fire, Acid and Poison are among them.",
              "modeField": "DamageImmunitiesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_GenerateCover",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_GenerateCover",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "CoverType",
              "type": "ECoverForceFlag",
              "kind": "scalar",
              "gameField": "CoverType",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Cover the unit provides to others: none, low or high (ECoverForceFlag).",
              "guard": "SetCoverType"
            },
            {
              "config": "RemoveWhenMoved",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenMoved",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Remove the effect when the unit moves.",
              "guard": "SetRemoveWhenMoved"
            },
            {
              "config": "RemoveOnOtherActivation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveOnOtherActivation",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Remove the effect when the unit activates another ability.",
              "guard": "SetRemoveOnOtherActivation"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_Groundling",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Groundling",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "HeightBonus",
              "type": "int",
              "kind": "scalar",
              "gameField": "HeightBonus",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Extra aim an attacker gets when it has height advantage over the affected unit.",
              "guard": "SetHeightBonus"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_Guardian",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Guardian",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "AllowedAbilities",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "AllowedAbilities",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Abilities that can trigger the extra reaction shot.",
              "modeField": "AllowedAbilitiesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "ProcChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ProcChance",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Percent chance of the extra reaction shot.",
              "guard": "SetProcChance"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_HoloTarget",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_HoloTarget",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "HitMod",
              "type": "int",
              "kind": "scalar",
              "gameField": "HitMod",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Hit chance modifier applied.",
              "guard": "SetHitMod"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_HolyWarriorDeath",
          "extends": "X2AbilityEffectsEditor_ApplyWeaponDamage",
          "gameClass": "X2Effect_HolyWarriorDeath",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "DelayTimeS",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayTimeS",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Seconds before the death is visualized.",
              "guard": "SetDelayTimeS"
            },
            {
              "config": "ExplosiveDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bExplosiveDamage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_ApplyWeaponDamage",
              "description": "Counts the damage as explosive, so explosive-specific rules such as Blast Padding apply.",
              "guard": "SetExplosiveDamage"
            },
            {
              "config": "IgnoreBaseDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnoreBaseDamage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_ApplyWeaponDamage",
              "description": "Leave out the weapon's base damage; only the effect's own damage and tagged extra damage apply.",
              "guard": "SetIgnoreBaseDamage"
            },
            {
              "config": "DamageTag",
              "type": "name",
              "kind": "scalar",
              "gameField": "DamageTag",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_ApplyWeaponDamage",
              "description": "Tag selecting one of the weapon's ExtraDamage entries and the upgrade bonus damage with the same tag.",
              "guard": "SetDamageTag"
            },
            {
              "config": "AlwaysKillsCivilians",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAlwaysKillsCivilians",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_ApplyWeaponDamage",
              "description": "Civilian targets die outright regardless of the damage rolled.",
              "guard": "SetAlwaysKillsCivilians"
            },
            {
              "config": "ApplyWorldEffectsForEachTargetLocation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyWorldEffectsForEachTargetLocation",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_ApplyWeaponDamage",
              "description": "Apply the ability's world effects at every target location instead of once.",
              "guard": "SetApplyWorldEffectsForEachTargetLocation"
            },
            {
              "config": "AllowFreeKill",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowFreeKill",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_ApplyWeaponDamage",
              "description": "Let free-kill weapon upgrades, such as the Repeater, trigger on this damage.",
              "guard": "SetAllowFreeKill"
            },
            {
              "config": "AllowWeaponUpgrade",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowWeaponUpgrade",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_ApplyWeaponDamage",
              "description": "Let weapon upgrades add their bonus damage.",
              "guard": "SetAllowWeaponUpgrade"
            },
            {
              "config": "BypassShields",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBypassShields",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_ApplyWeaponDamage",
              "description": "Damage ignores shield HP and goes straight to health.",
              "guard": "SetBypassShields"
            },
            {
              "config": "IgnoreArmor",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnoreArmor",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_ApplyWeaponDamage",
              "description": "Damage ignores armor.",
              "guard": "SetIgnoreArmor"
            },
            {
              "config": "BypassSustainEffects",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBypassSustainEffects",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_ApplyWeaponDamage",
              "description": "Damage ignores sustain effects that would otherwise keep the unit alive.",
              "guard": "SetBypassSustainEffects"
            },
            {
              "config": "EnvironmentalDamageAmount",
              "type": "int",
              "kind": "scalar",
              "gameField": "EnvironmentalDamageAmount",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_ApplyWeaponDamage",
              "description": "Environmental damage dealt to terrain and cover.",
              "guard": "SetEnvironmentalDamageAmount"
            },
            {
              "config": "WeaponDamageValue",
              "type": "WeaponDamageValueEdit",
              "kind": "nested",
              "gameField": "EffectDamageValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_ApplyWeaponDamage",
              "description": "Damage the effect adds on its own, on top of the weapon: Damage, Spread, Crit, Pierce, Shred, Rupture, PlusOne, DamageType and Tag."
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "DoNotKillUnitTypes",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_HomingMine",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_HomingMine",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "AbilityToTrigger",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilityToTrigger",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Ability fired when the mine goes off.",
              "guard": "SetAbilityToTrigger"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_HuntersInstinctDamage",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_HuntersInstinctDamage",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "BonusDamage",
              "type": "int",
              "kind": "scalar",
              "gameField": "BonusDamage",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Bonus damage added when the effect's condition is met.",
              "guard": "SetBonusDamage"
            },
            {
              "config": "BonusCritChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "BonusCritChance",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Crit chance added when the effect's condition is met.",
              "guard": "SetBonusCritChance"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_ImmediateAbilityActivation",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_ImmediateAbilityActivation",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "AbilityName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilityName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Ability fired by the effect.",
              "guard": "SetAbilityName"
            },
            {
              "config": "ActivateAbilityOnTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ActivateAbilityOnTarget",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Find and fire the ability on the target instead of the source.",
              "guard": "SetActivateAbilityOnTarget"
            },
            {
              "config": "EffectTargetOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "EffectTargetOnly",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Fire only against the effect's target; false fires against every available target.",
              "guard": "SetEffectTargetOnly"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "EventName",
              "reason": "private/protected"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_Impatient",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Impatient",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "DmgMod",
              "type": "float",
              "kind": "scalar",
              "gameField": "DmgMod",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Multiplier applied to the damage when the effect's condition is met.",
              "guard": "SetDmgMod"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_Implacable",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Implacable",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ImplacableThisTurnValue",
              "type": "name",
              "kind": "scalar",
              "gameField": "ImplacableThisTurnValue",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Unit value that records Implacable already triggered this turn.",
              "guard": "SetImplacableThisTurnValue"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_LaserSight",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_LaserSight",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "BenefitFromEmpoweredUpgrades",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBenefitFromEmpoweredUpgrades",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Increase the crit bonus when XCOM has empowered weapon upgrades. Community Highlander field.",
              "guard": "SetBenefitFromEmpoweredUpgrades"
            },
            {
              "config": "CritBonus",
              "type": "int",
              "kind": "scalar",
              "gameField": "CritBonus",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Crit chance added on top of the distance-based bonus.",
              "guard": "SetCritBonus"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "CritBoostArray",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_MeleeDamageAdjust",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_MeleeDamageAdjust",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "DamageMod",
              "type": "int",
              "kind": "scalar",
              "gameField": "DamageMod",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Damage added to attacks of the melee damage type.",
              "guard": "SetDamageMod"
            },
            {
              "config": "MeleeDamageTypeName",
              "type": "name",
              "kind": "scalar",
              "gameField": "MeleeDamageTypeName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Damage type that counts as melee for the adjustment.",
              "guard": "SetMeleeDamageTypeName"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_MimicBeacon",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_MimicBeacon",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "AbilitiesAllowedToHit",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "ABILITIES_ALLOWED_TO_HIT",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Abilities that may still target the mimic beacon.",
              "modeField": "AbilitiesAllowedToHitMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "REMOVE_EFFECT_ANIM_NAME",
              "reason": "private/protected"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_MindControl",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_MindControl",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "NumTurnsForAI",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurnsForAI",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Turns the control lasts when an AI player is the controller. 0 uses the effect's normal duration.",
              "guard": "SetNumTurnsForAI"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_ModifyReactionFire",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_ModifyReactionFire",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "AllowCrit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowCrit",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Allow reaction fire to crit.",
              "guard": "SetAllowCrit"
            },
            {
              "config": "ReactionModifier",
              "type": "int",
              "kind": "scalar",
              "gameField": "ReactionModifier",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Aim modifier applied to reaction fire.",
              "guard": "SetReactionModifier"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_ModifyStatCheckSuccesses",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_ModifyStatCheckSuccesses",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "AdditionalSuccessModifiers",
              "type": "array<AdditionalSuccessModifier>",
              "kind": "namearray",
              "gameField": "AdditionalSuccessModifiers",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Bonus successes added to a stat check made by the named ability, when the checked unit is the ability's source. Merge updates the entry with the same AbilityName or adds it.",
              "modeField": "AdditionalSuccessModifiersMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_TemplarFocus",
          "extends": "X2AbilityEffectsEditor_ModifyStats",
          "gameClass": "X2Effect_TemplarFocus",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "FocusLevels",
              "type": "array<FocusLevelModifiers>",
              "kind": "namearray",
              "gameField": "arrFocusModifiers",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "One entry per focus level from level 0: the stat changes, armor mitigation and bonus weapon damage granted at that level. Merge overwrites the level at the same position or appends it.",
              "modeField": "FocusLevelsMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "SpecialDamageName",
              "reason": "localized &mdash; use .int localization files"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_ModifyStats",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_ModifyStats",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": true,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_Nearsighted",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Nearsighted",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "DmgMod",
              "type": "float",
              "kind": "scalar",
              "gameField": "DmgMod",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Multiplier applied to the damage when the effect's condition is met.",
              "guard": "SetDmgMod"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_Needle",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Needle",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ArmorPierce",
              "type": "int",
              "kind": "scalar",
              "gameField": "ArmorPierce",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Armor pierced.",
              "guard": "SetArmorPierce"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_Oblivious",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Oblivious",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "DmgMod",
              "type": "float",
              "kind": "scalar",
              "gameField": "DmgMod",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Multiplier applied to the damage when the effect's condition is met.",
              "guard": "SetDmgMod"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_OverrideDeathAction",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_OverrideDeathAction",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "DeathActionClass",
              "type": "string",
              "kind": "scalar",
              "gameField": "DeathActionClass",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Qualified class path of the X2Action that replaces the normal death visualization, e.g. XComGame.X2Action_ExplodingUnitDeathAction. Empty removes the override.",
              "guard": "SetDeathActionClass"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_OverrideDeathAnimOnLoad",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_OverrideDeathAnimOnLoad",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "OverrideAnimNameOnLoad",
              "type": "name",
              "kind": "scalar",
              "gameField": "OverrideAnimNameOnLoad",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Death animation shown for the unit when a save is loaded.",
              "guard": "SetOverrideAnimNameOnLoad"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_PaleHorse",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_PaleHorse",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "CritBoostPerKill",
              "type": "int",
              "kind": "scalar",
              "gameField": "CritBoostPerKill",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Crit chance gained per kill.",
              "guard": "SetCritBoostPerKill"
            },
            {
              "config": "MaxCritBoost",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxCritBoost",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Cap on the accumulated crit chance.",
              "guard": "SetMaxCritBoost"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_PersistentSquadViewer",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_PersistentSquadViewer",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "UseWeaponRadius",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseWeaponRadius",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Use the source weapon's radius as the sight radius. Requires a source weapon.",
              "guard": "SetUseWeaponRadius"
            },
            {
              "config": "ViewRadius",
              "type": "float",
              "kind": "scalar",
              "gameField": "ViewRadius",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Sight radius of the viewer.",
              "guard": "SetViewRadius"
            },
            {
              "config": "UseSourceLocation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourceLocation",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Place the viewer at the source's location rather than the target's.",
              "guard": "SetUseSourceLocation"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_PersistentTraversalChange",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_PersistentTraversalChange",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "TraversalChanges",
              "type": "array<TraversalChange>",
              "kind": "namearray",
              "gameField": "aTraversalChanges",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Traversal types switched on or off while the effect lasts, merged by Traversal.",
              "modeField": "TraversalChangesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_PersistentVoidConduit",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_PersistentVoidConduit",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "InitialDamage",
              "type": "int",
              "kind": "scalar",
              "gameField": "InitialDamage",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Damage dealt when the effect is applied.",
              "guard": "SetInitialDamage"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "VoidConduitActionsLeft",
              "reason": "private/protected"
            },
            {
              "name": "StolenActionsThisTick",
              "reason": "private/protected"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_Possessed",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Possessed",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "WeaponTemplateName",
              "type": "name",
              "kind": "scalar",
              "gameField": "WeaponTemplateName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Item template equipped on the possessed unit.",
              "guard": "SetWeaponTemplateName"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "FlyoverText",
              "reason": "localized &mdash; use .int localization files"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_Regeneration",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Regeneration",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "HealAmount",
              "type": "int",
              "kind": "scalar",
              "gameField": "HealAmount",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "HP healed per tick.",
              "guard": "SetHealAmount"
            },
            {
              "config": "MaxHealAmount",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxHealAmount",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Total HP the effect may heal, tracked in HealthRegeneratedName. 0 removes the cap.",
              "guard": "SetMaxHealAmount"
            },
            {
              "config": "HealthRegeneratedName",
              "type": "name",
              "kind": "scalar",
              "gameField": "HealthRegeneratedName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Unit value that accumulates the HP healed so far, for the MaxHealAmount cap.",
              "guard": "SetHealthRegeneratedName"
            },
            {
              "config": "EventToTriggerOnHeal",
              "type": "name",
              "kind": "scalar",
              "gameField": "EventToTriggerOnHeal",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Event fired after each heal.",
              "guard": "SetEventToTriggerOnHeal"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "HealedMessage",
              "reason": "localized &mdash; use .int localization files"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_RemoveEffectsByDamageType",
          "extends": "X2AbilityEffectsEditor_RemoveEffects",
          "gameClass": "X2Effect_RemoveEffectsByDamageType",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "DamageTypesToRemove",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypesToRemove",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Effects carrying any of these damage types are removed.",
              "modeField": "DamageTypesToRemoveMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "Cleanse",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCleanse",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_RemoveEffects",
              "description": "Remove the effects as a cleanse, so whatever they do on wearing off does not trigger.",
              "guard": "SetCleanse"
            },
            {
              "config": "CheckSource",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCheckSource",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_RemoveEffects",
              "description": "Match effects whose source is this effect's target, instead of effects whose target it is.",
              "guard": "SetCheckSource"
            },
            {
              "config": "DoNotVisualize",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDoNotVisualize",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_RemoveEffects",
              "description": "Skip the removal visualization, for when another RemoveEffects on the ability already shows it.",
              "guard": "SetDoNotVisualize"
            },
            {
              "config": "EffectNamesToRemove",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "EffectNamesToRemove",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_RemoveEffects",
              "description": "Effect names removed from the target.",
              "modeField": "EffectNamesToRemoveMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_ReserveOverwatchPoints",
          "extends": "X2AbilityEffectsEditor_ReserveActionPoints",
          "gameClass": "X2Effect_ReserveOverwatchPoints",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "UseAllPointsWithAbilities",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "UseAllPointsWithAbilities",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Abilities that, when the unit has any of them, reserve as many points as were spent instead of NumPoints.",
              "modeField": "UseAllPointsWithAbilitiesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "ReserveType",
              "type": "name",
              "kind": "scalar",
              "gameField": "ReserveType",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_ReserveActionPoints",
              "description": "Type of action point reserved.",
              "guard": "SetReserveType"
            },
            {
              "config": "NumPoints",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumPoints",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_ReserveActionPoints",
              "description": "Number of action points reserved.",
              "guard": "SetNumPoints"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_RunBehaviorTree",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_RunBehaviorTree",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "NumActions",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumActions",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Number of behavior tree actions the unit runs.",
              "guard": "SetNumActions"
            },
            {
              "config": "BehaviorTreeName",
              "type": "name",
              "kind": "scalar",
              "gameField": "BehaviorTreeName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Behavior tree run on the unit.",
              "guard": "SetBehaviorTreeName"
            },
            {
              "config": "InitFromPlayer",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInitFromPlayer",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reset the behavior tree variables on each run as if the player turn were starting.",
              "guard": "SetInitFromPlayer"
            },
            {
              "config": "SetActionPointCount",
              "type": "int",
              "kind": "scalar",
              "gameField": "SetActionPointCount",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Standard action points given to the unit before the tree runs.",
              "guard": "SetSetActionPointCount"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_SmokeGrenade",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_SmokeGrenade",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "HitMod",
              "type": "int",
              "kind": "scalar",
              "gameField": "HitMod",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Hit chance modifier applied.",
              "guard": "SetHitMod"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_Solace",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Solace",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "DamageTypeImmunities",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypeImmunities",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Damage types the affected unit is immune to while the effect lasts.",
              "modeField": "DamageTypeImmunitiesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_SpawnDestructible",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_SpawnDestructible",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "DestructibleArchetype",
              "type": "string",
              "kind": "scalar",
              "gameField": "DestructibleArchetype",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Archetype path of the destructible actor spawned.",
              "guard": "SetDestructibleArchetype"
            },
            {
              "config": "DestroyOnRemoval",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDestroyOnRemoval",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Destroy the spawned actor when the effect is removed.",
              "guard": "SetDestroyOnRemoval"
            },
            {
              "config": "TargetableBySpawnedTeamOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTargetableBySpawnedTeamOnly",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Only the team that spawned the actor can target it.",
              "guard": "SetTargetableBySpawnedTeamOnly"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "TargetingIcon",
              "reason": "type `Texture2D`"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_SpawnUnit",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_SpawnUnit",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "UnitToSpawnName",
              "type": "name",
              "kind": "scalar",
              "gameField": "UnitToSpawnName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Character template of the unit spawned.",
              "guard": "SetUnitToSpawnName"
            },
            {
              "config": "ClearTileBlockedByTargetUnitFlag",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bClearTileBlockedByTargetUnitFlag",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Spawn on the target's own tile.",
              "guard": "SetClearTileBlockedByTargetUnitFlag"
            },
            {
              "config": "CopyTargetAppearance",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCopyTargetAppearance",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Give the spawned unit the target's appearance. Takes precedence over CopySourceAppearance.",
              "guard": "SetCopyTargetAppearance"
            },
            {
              "config": "CopySourceAppearance",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCopySourceAppearance",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Give the spawned unit the source's appearance.",
              "guard": "SetCopySourceAppearance"
            },
            {
              "config": "KnockbackAffectsSpawnLocation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bKnockbackAffectsSpawnLocation",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Spawn where the target ended up after knockback rather than where it was hit.",
              "guard": "SetKnockbackAffectsSpawnLocation"
            },
            {
              "config": "AddToSourceGroup",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAddToSourceGroup",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Put the spawned unit in the source's AI group.",
              "guard": "SetAddToSourceGroup"
            },
            {
              "config": "CopyReanimatedFromUnit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCopyReanimatedFromUnit",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Copy the reanimated unit's inventory and abilities too, not just its appearance.",
              "guard": "SetCopyReanimatedFromUnit"
            },
            {
              "config": "CopyReanimatedStatsFromUnit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCopyReanimatedStatsFromUnit",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Copy the reanimated unit's stats.",
              "guard": "SetCopyReanimatedStatsFromUnit"
            },
            {
              "config": "SetProcessedScamperAs",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSetProcessedScamperAs",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Mark the spawned unit's group as having already scampered, so it does not reveal and scamper on sight.",
              "guard": "SetSetProcessedScamperAs"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "SpawnUnitTriggerName",
              "reason": "private/protected"
            },
            {
              "name": "SpawnedUnitValueName",
              "reason": "private/protected"
            },
            {
              "name": "SpawnedThisTurnUnitValueName",
              "reason": "private/protected"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_Stasis",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Stasis",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "StunStartAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "StunStartAnim",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Animation played when stasis starts.",
              "guard": "SetStunStartAnim"
            },
            {
              "config": "StunStopAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "StunStopAnim",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Animation played when stasis ends.",
              "guard": "SetStunStopAnim"
            },
            {
              "config": "SkipFlyover",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSkipFlyover",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Skip the flyover text.",
              "guard": "SetSkipFlyover"
            },
            {
              "config": "StartAnimBlendTime",
              "type": "float",
              "kind": "scalar",
              "gameField": "StartAnimBlendTime",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Blend time, in seconds, into the start animation.",
              "guard": "SetStartAnimBlendTime"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "StasisFlyover",
              "reason": "localized &mdash; use .int localization files"
            },
            {
              "name": "StasisRemoved",
              "reason": "localized &mdash; use .int localization files"
            },
            {
              "name": "StasisRemovedText",
              "reason": "localized &mdash; use .int localization files"
            },
            {
              "name": "STASIS_REMOVE_EFFECTS_SOURCE",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "STASIS_REMOVE_EFFECTS_TARGET",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_Stunned",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Stunned",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "StunLevel",
              "type": "int",
              "kind": "scalar",
              "gameField": "StunLevel",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Action points the stun takes away.",
              "guard": "SetStunLevel"
            },
            {
              "config": "SkipAnimation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSkipAnimation",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Skip the stun animations.",
              "guard": "SetSkipAnimation"
            },
            {
              "config": "StunStartAnimName",
              "type": "name",
              "kind": "scalar",
              "gameField": "StunStartAnimName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Animation played when the stun starts, if the unit can play it.",
              "guard": "SetStunStartAnimName"
            },
            {
              "config": "StunStopAnimName",
              "type": "name",
              "kind": "scalar",
              "gameField": "StunStopAnimName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Animation played when the stun ends.",
              "guard": "SetStunStopAnimName"
            },
            {
              "config": "StunnedTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "StunnedTriggerName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Event fired when the unit is stunned.",
              "guard": "SetStunnedTriggerName"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "StunnedText",
              "reason": "localized &mdash; use .int localization files"
            },
            {
              "name": "RoboticStunnedText",
              "reason": "localized &mdash; use .int localization files"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_SuperConcealModifier",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_SuperConcealModifier",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ConcealAmountScalar",
              "type": "float",
              "kind": "scalar",
              "gameField": "ConcealAmountScalar",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Multiplier on the base chance of losing super concealment, added to the modifier.",
              "guard": "SetConcealAmountScalar"
            },
            {
              "config": "AbilitiesAffectedFilter",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "AbilitiesAffectedFilter",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Abilities the modifier applies to. Empty means every ability.",
              "modeField": "AbilitiesAffectedFilterMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "RemoveOnAbilityActivation",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "RemoveOnAbilityActivation",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Abilities whose activation removes the effect.",
              "modeField": "RemoveOnAbilityActivationMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_Sustain",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Sustain",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "SUSTAINTRIGGERUNITCHECK_ARRAY",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "SustainUsed",
              "reason": "private/protected"
            },
            {
              "name": "SustainEvent",
              "reason": "private/protected"
            },
            {
              "name": "SustainTriggeredEvent",
              "reason": "private/protected"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_Sustained",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_Sustained",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "SustainedAbilityName",
              "type": "name",
              "kind": "scalar",
              "gameField": "SustainedAbilityName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Ability on the source that is fired again once a full turn completes, to keep the effect going.",
              "guard": "SetSustainedAbilityName"
            },
            {
              "config": "FragileAmount",
              "type": "int",
              "kind": "scalar",
              "gameField": "FragileAmount",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Damage the source may take in a full turn before the effect breaks. 0 never breaks it.",
              "guard": "SetFragileAmount"
            },
            {
              "config": "EffectsToRemoveFromSource",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "EffectsToRemoveFromSource",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Effects removed from the source when this effect ends.",
              "modeField": "EffectsToRemoveFromSourceMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "EffectsToRemoveFromTarget",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "EffectsToRemoveFromTarget",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Effects removed from the target when this effect ends.",
              "modeField": "EffectsToRemoveFromTargetMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "RegisterAdditionalEventsLikeImpair",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "RegisterAdditionalEventsLikeImpair",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Extra events on the source that end the effect as if the source had become impaired.",
              "modeField": "RegisterAdditionalEventsLikeImpairMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_TalonRounds",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_TalonRounds",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "AimMod",
              "type": "int",
              "kind": "scalar",
              "gameField": "AimMod",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Aim added.",
              "guard": "SetAimMod"
            },
            {
              "config": "CritChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "CritChance",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Crit chance added.",
              "guard": "SetCritChance"
            },
            {
              "config": "CritDamage",
              "type": "int",
              "kind": "scalar",
              "gameField": "CritDamage",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Crit damage added.",
              "guard": "SetCritDamage"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_TargetDamageDistanceBonus",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_TargetDamageDistanceBonus",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "BonusDmgFloat",
              "type": "float",
              "kind": "scalar",
              "gameField": "BonusDmg",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Bonus damage: a flat amount with MODOP_Addition, or a multiplier on the damage with MODOP_Multiplication.",
              "guard": "SetBonusDmgFloat"
            },
            {
              "config": "BonusModType",
              "type": "EStatModOp",
              "kind": "scalar",
              "gameField": "BonusModType",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "How BonusDmgFloat is applied: MODOP_Addition or MODOP_Multiplication.",
              "guard": "SetBonusModType"
            },
            {
              "config": "WithinTileDistance",
              "type": "int",
              "kind": "scalar",
              "gameField": "WithinTileDistance",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Farthest distance to the target, in tiles, at which the bonus applies.",
              "guard": "SetWithinTileDistance"
            },
            {
              "config": "PrimaryTargetOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPrimaryTargetOnly",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Only apply to the attack's primary target.",
              "guard": "SetPrimaryTargetOnly"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_TargetDamageTypeBonus",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_TargetDamageTypeBonus",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "BonusDmgFloat",
              "type": "float",
              "kind": "scalar",
              "gameField": "BonusDmg",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Bonus damage: a flat amount with MODOP_Addition, or a multiplier on the damage with MODOP_Multiplication.",
              "guard": "SetBonusDmgFloat"
            },
            {
              "config": "BonusModType",
              "type": "EStatModOp",
              "kind": "scalar",
              "gameField": "BonusModType",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "How BonusDmgFloat is applied: MODOP_Addition or MODOP_Multiplication.",
              "guard": "SetBonusModType"
            },
            {
              "config": "BonusDamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "BonusDamageTypes",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Damage types the bonus applies to.",
              "modeField": "BonusDamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_ToHitModifier",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_ToHitModifier",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ApplyAsTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyAsTarget",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Apply the modifiers to attacks against the unit rather than attacks it makes.",
              "guard": "SetApplyAsTarget"
            },
            {
              "config": "EffectHitModifiers",
              "type": "array<EffectHitModifier>",
              "kind": "namearray",
              "gameField": "Modifiers",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "X2Effect_ToHitModifier: replace-only - when non-empty, replaces Modifiers entirely",
              "replaceOnly": true
            },
            {
              "config": "ToHitConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": null,
              "origin": "derived",
              "inheritedFrom": null,
              "description": "X2Effect_ToHitModifier"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "ToHitConditions",
              "reason": "array of `X2Condition`"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_TrackingShotMarkTarget",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_TrackingShotMarkTarget",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ConeLength",
              "type": "float",
              "kind": "scalar",
              "gameField": "ConeLength",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Length of the marked cone from the source to the target.",
              "guard": "SetConeLength"
            },
            {
              "config": "ConeEndDiameter",
              "type": "float",
              "kind": "scalar",
              "gameField": "ConeEndDiameter",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Diameter of the marked cone at its far end.",
              "guard": "SetConeEndDiameter"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_TurnStartActionPoints",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_TurnStartActionPoints",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ActionPointType",
              "type": "name",
              "kind": "scalar",
              "gameField": "ActionPointType",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Type of action point added, or removed, at the start of the turn.",
              "guard": "SetActionPointType"
            },
            {
              "config": "NumActionPoints",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumActionPoints",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Action points granted.",
              "guard": "SetNumActionPoints"
            },
            {
              "config": "ActionPointsRemoved",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bActionPointsRemoved",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Remove the action points instead of adding them.",
              "guard": "SetActionPointsRemoved"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_VolatileMix",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_VolatileMix",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "BonusDamage",
              "type": "int",
              "kind": "scalar",
              "gameField": "BonusDamage",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Bonus damage added when the effect's condition is met.",
              "guard": "SetBonusDamage"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_AlertTheLost",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_AlertTheLost",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "AlertRangeMeters",
              "type": "int",
              "kind": "scalar",
              "gameField": "AlertRangeMeters",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Radius in meters within which Lost are alerted.",
              "guard": "SetAlertRangeMeters"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_ApplyDirectionalWorldDamage",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_ApplyDirectionalWorldDamage",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "EnvironmentalDamageAmount",
              "type": "int",
              "kind": "scalar",
              "gameField": "EnvironmentalDamageAmount",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Environmental damage dealt to terrain and cover.",
              "guard": "SetEnvironmentalDamageAmount"
            },
            {
              "config": "DamageTypeTemplateName",
              "type": "name",
              "kind": "scalar",
              "gameField": "DamageTypeTemplateName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Damage type of the environmental damage.",
              "guard": "SetDamageTypeTemplateName"
            },
            {
              "config": "PlusNumZTiles",
              "type": "int",
              "kind": "scalar",
              "gameField": "PlusNumZTiles",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Extra tiles of height hit above the affected tile.",
              "guard": "SetPlusNumZTiles"
            },
            {
              "config": "UseWeaponEnvironmentalDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseWeaponEnvironmentalDamage",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Use the source weapon's environmental damage instead of EnvironmentalDamageAmount.",
              "guard": "SetUseWeaponEnvironmentalDamage"
            },
            {
              "config": "UseWeaponDamageType",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseWeaponDamageType",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Use the source weapon's damage type instead of DamageTypeTemplateName.",
              "guard": "SetUseWeaponDamageType"
            },
            {
              "config": "HitSourceTile",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHitSourceTile",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Apply the damage at the source's tile.",
              "guard": "SetHitSourceTile"
            },
            {
              "config": "HitTargetTile",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHitTargetTile",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Apply the damage at the target's tile.",
              "guard": "SetHitTargetTile"
            },
            {
              "config": "HitAdjacentDestructibles",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHitAdjacentDestructibles",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Also damage destructibles adjacent to the hit tile along the damage direction.",
              "guard": "SetHitAdjacentDestructibles"
            },
            {
              "config": "AllowDestructionOfDamageCauseCover",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowDestructionOfDamageCauseCover",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "When a unit caused the damage, allow it to destroy that unit's own cover, which is normally protected.",
              "guard": "SetAllowDestructionOfDamageCauseCover"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_ApplyMedikitHeal",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_ApplyMedikitHeal",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "PerUseHP",
              "type": "int",
              "kind": "scalar",
              "gameField": "PerUseHP",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "HP healed per application.",
              "guard": "SetPerUseHP"
            },
            {
              "config": "IncreasedHealProject",
              "type": "name",
              "kind": "scalar",
              "gameField": "IncreasedHealProject",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Research that, once completed, switches the heal to IncreasedPerUseHP.",
              "guard": "SetIncreasedHealProject"
            },
            {
              "config": "IncreasedPerUseHP",
              "type": "int",
              "kind": "scalar",
              "gameField": "IncreasedPerUseHP",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "HP healed per application once IncreasedHealProject is researched.",
              "guard": "SetIncreasedPerUseHP"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "HealedMessage",
              "reason": "localized &mdash; use .int localization files"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_ApplyWeaponDamage",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_ApplyWeaponDamage",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ExplosiveDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bExplosiveDamage",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Counts the damage as explosive, so explosive-specific rules such as Blast Padding apply.",
              "guard": "SetExplosiveDamage"
            },
            {
              "config": "IgnoreBaseDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnoreBaseDamage",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Leave out the weapon's base damage; only the effect's own damage and tagged extra damage apply.",
              "guard": "SetIgnoreBaseDamage"
            },
            {
              "config": "DamageTag",
              "type": "name",
              "kind": "scalar",
              "gameField": "DamageTag",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Tag selecting one of the weapon's ExtraDamage entries and the upgrade bonus damage with the same tag.",
              "guard": "SetDamageTag"
            },
            {
              "config": "AlwaysKillsCivilians",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAlwaysKillsCivilians",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Civilian targets die outright regardless of the damage rolled.",
              "guard": "SetAlwaysKillsCivilians"
            },
            {
              "config": "ApplyWorldEffectsForEachTargetLocation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyWorldEffectsForEachTargetLocation",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Apply the ability's world effects at every target location instead of once.",
              "guard": "SetApplyWorldEffectsForEachTargetLocation"
            },
            {
              "config": "AllowFreeKill",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowFreeKill",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Let free-kill weapon upgrades, such as the Repeater, trigger on this damage.",
              "guard": "SetAllowFreeKill"
            },
            {
              "config": "AllowWeaponUpgrade",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowWeaponUpgrade",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Let weapon upgrades add their bonus damage.",
              "guard": "SetAllowWeaponUpgrade"
            },
            {
              "config": "BypassShields",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBypassShields",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Damage ignores shield HP and goes straight to health.",
              "guard": "SetBypassShields"
            },
            {
              "config": "IgnoreArmor",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnoreArmor",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Damage ignores armor.",
              "guard": "SetIgnoreArmor"
            },
            {
              "config": "BypassSustainEffects",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBypassSustainEffects",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Damage ignores sustain effects that would otherwise keep the unit alive.",
              "guard": "SetBypassSustainEffects"
            },
            {
              "config": "EnvironmentalDamageAmount",
              "type": "int",
              "kind": "scalar",
              "gameField": "EnvironmentalDamageAmount",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Environmental damage dealt to terrain and cover.",
              "guard": "SetEnvironmentalDamageAmount"
            },
            {
              "config": "WeaponDamageValue",
              "type": "WeaponDamageValueEdit",
              "kind": "nested",
              "gameField": "EffectDamageValue",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Damage the effect adds on its own, on top of the weapon: Damage, Spread, Crit, Pierce, Shred, Rupture, PlusOne, DamageType and Tag."
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "CurrentAbilityNameForImmunityCheck",
              "reason": "private/protected"
            },
            {
              "name": "HideVisualizationOfResultsAdditional",
              "reason": "not yet supported"
            },
            {
              "name": "NO_MINIMUM_DAMAGE",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "ARMOR_BEFORE_SHIELD",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "GRAZE_DMG_MULT",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "HideVisualizationOfResults",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_Brutal",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_Brutal",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "WillMod",
              "type": "int",
              "kind": "scalar",
              "gameField": "WillMod",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Change applied to the target's current Will; negative lowers it.",
              "guard": "SetWillMod"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "WillChangeMessage",
              "reason": "localized &mdash; use .int localization files"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_EnableGlobalAbility",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_EnableGlobalAbility",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "GlobalAbility",
              "type": "name",
              "kind": "scalar",
              "gameField": "GlobalAbility",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Global ability switched on for the rest of the battle.",
              "guard": "SetGlobalAbility"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_GetOverHere",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_GetOverHere",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "OverrideStartAnimName",
              "type": "Name",
              "kind": "scalar",
              "gameField": "OverrideStartAnimName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Animation played on the pulled unit at the start, when set.",
              "guard": "SetOverrideStartAnimName"
            },
            {
              "config": "OverrideStopAnimName",
              "type": "Name",
              "kind": "scalar",
              "gameField": "OverrideStopAnimName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Animation played on the pulled unit at the end, when set.",
              "guard": "SetOverrideStopAnimName"
            },
            {
              "config": "RequireVisibleTile",
              "type": "bool",
              "kind": "scalar",
              "gameField": "RequireVisibleTile",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Only pull to a neighbouring tile the target can be bound to; otherwise any free neighbouring tile will do.",
              "guard": "SetRequireVisibleTile"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_GrantActionPointsWithRecord",
          "extends": "X2AbilityEffectsEditor_GrantActionPoints",
          "gameClass": "X2Effect_GrantActionPointsWithRecord",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "RecordUnitValueWithGrant",
              "type": "array<RecordData>",
              "kind": "namearray",
              "gameField": "RecordUnitValueWithGrant",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Unit values that accumulate the action points granted, each with its cleanup rule. Merge updates the entry with the same UnitValueName or adds it.",
              "modeField": "RecordUnitValueWithGrantMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "NumActionPoints",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumActionPoints",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_GrantActionPoints",
              "description": "Action points granted.",
              "guard": "SetNumActionPoints"
            },
            {
              "config": "PointType",
              "type": "name",
              "kind": "scalar",
              "gameField": "PointType",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_GrantActionPoints",
              "description": "Type of action point granted, e.g. standard or move.",
              "guard": "SetPointType"
            },
            {
              "config": "ApplyOnlyWhenOut",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnlyWhenOut",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_GrantActionPoints",
              "description": "Grant only when the unit has no standard action points left.",
              "guard": "SetApplyOnlyWhenOut"
            },
            {
              "config": "SelectUnit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSelectUnit",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_GrantActionPoints",
              "description": "Select the unit in the tactical UI once the points are granted.",
              "guard": "SetSelectUnit"
            },
            {
              "config": "SkipWithEffect",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "SkipWithEffect",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_GrantActionPoints",
              "description": "Effects that, when present on the unit, skip the grant.",
              "modeField": "SkipWithEffectMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_GrantActionPoints",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_GrantActionPoints",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "NumActionPoints",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumActionPoints",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Action points granted.",
              "guard": "SetNumActionPoints"
            },
            {
              "config": "PointType",
              "type": "name",
              "kind": "scalar",
              "gameField": "PointType",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Type of action point granted, e.g. standard or move.",
              "guard": "SetPointType"
            },
            {
              "config": "ApplyOnlyWhenOut",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnlyWhenOut",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Grant only when the unit has no standard action points left.",
              "guard": "SetApplyOnlyWhenOut"
            },
            {
              "config": "SelectUnit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSelectUnit",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Select the unit in the tactical UI once the points are granted.",
              "guard": "SetSelectUnit"
            },
            {
              "config": "SkipWithEffect",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "SkipWithEffect",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Effects that, when present on the unit, skip the grant.",
              "modeField": "SkipWithEffectMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_IncreaseBondmateCohesion",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_IncreaseBondmateCohesion",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "CohesionAmount",
              "type": "int",
              "kind": "scalar",
              "gameField": "CohesionAmount",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Cohesion added between the unit and its bondmate.",
              "guard": "SetCohesionAmount"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_Knockback",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_Knockback",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "KnockbackDistance",
              "type": "int",
              "kind": "scalar",
              "gameField": "KnockbackDistance",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Distance the unit is knocked back, in meters.",
              "guard": "SetKnockbackDistance"
            },
            {
              "config": "KnockbackDestroysNonFragile",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bKnockbackDestroysNonFragile",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Let the knocked-back unit destroy non-fragile objects it hits.",
              "guard": "SetKnockbackDestroysNonFragile"
            },
            {
              "config": "OverrideRagdollFinishTimerSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "OverrideRagdollFinishTimerSec",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Seconds before the ragdoll settles. Negative keeps the default.",
              "guard": "SetOverrideRagdollFinishTimerSec"
            },
            {
              "config": "OnlyOnDeath",
              "type": "bool",
              "kind": "scalar",
              "gameField": "OnlyOnDeath",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Only knock back units the attack kills.",
              "guard": "SetOnlyOnDeath"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "IncrementalStepSize",
              "reason": "private/protected"
            },
            {
              "name": "DefaultDamage",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "DefaultRadius",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "KnockbackDistanceOverrides",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_LifeSteal",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_LifeSteal",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "LifeAmountMultiplier",
              "type": "float",
              "kind": "scalar",
              "gameField": "LifeAmountMultiplier",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Multiplier on the health stolen. 0 leaves the amount unchanged.",
              "guard": "SetLifeAmountMultiplier"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_MarkValidActivationTiles",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_MarkValidActivationTiles",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "AbilityToMark",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilityToMark",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Ability whose valid activation tiles are marked.",
              "guard": "SetAbilityToMark"
            },
            {
              "config": "OnlyUseTargetLocation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "OnlyUseTargetLocation",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Mark only the target location, ignoring the ability's multi-target area.",
              "guard": "SetOnlyUseTargetLocation"
            },
            {
              "config": "VisualizeFlagsOnCursor",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bVisualizeFlagsOnCursor",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Show the marked tiles on the targeting cursor.",
              "guard": "SetVisualizeFlagsOnCursor"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_ModifyInitiativeOrder",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_ModifyInitiativeOrder",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "RemoveGroupFromInitiativeOrder",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveGroupFromInitiativeOrder",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Remove the unit's group from the initiative order.",
              "guard": "SetRemoveGroupFromInitiativeOrder"
            },
            {
              "config": "AddGroupToInitiativeOrder",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAddGroupToInitiativeOrder",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Add the unit's group to the initiative order.",
              "guard": "SetAddGroupToInitiativeOrder"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_ModifyTemplarFocus",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_ModifyTemplarFocus",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ModifyFocus",
              "type": "int",
              "kind": "scalar",
              "gameField": "ModifyFocus",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Focus points added; negative removes them.",
              "guard": "SetModifyFocus"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "FlyoverText",
              "reason": "localized &mdash; use .int localization files"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_LethalWeaponDamage",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_LethalWeaponDamage",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "LethalDamageConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": null,
              "origin": "derived",
              "inheritedFrom": null,
              "description": "X2Effect_LethalWeaponDamage"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "LethalDamageConditions",
              "reason": "array of `X2Condition`"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_Persistent",
          "extends": "X2AbilityEffectsEditor",
          "gameClass": "X2Effect_Persistent",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "TickTriggers",
              "reason": "array of `X2EffectTrigger`"
            },
            {
              "name": "DuplicateResponse",
              "reason": "not yet supported"
            },
            {
              "name": "ApplyOnTick",
              "reason": "array of `X2Effect`"
            },
            {
              "name": "WatchRule",
              "reason": "type `GameRuleStateChange`"
            },
            {
              "name": "BuffCategory",
              "reason": "not yet supported"
            },
            {
              "name": "SourceBuffCategory",
              "reason": "not yet supported"
            },
            {
              "name": "GameStateEffectClass",
              "reason": "class reference"
            },
            {
              "name": "VisualizationFn",
              "reason": "delegate &mdash; code-only"
            },
            {
              "name": "CleansedVisualizationFn",
              "reason": "delegate &mdash; code-only"
            },
            {
              "name": "EffectTickedVisualizationFn",
              "reason": "delegate &mdash; code-only"
            },
            {
              "name": "EffectSyncVisualizationFn",
              "reason": "delegate &mdash; code-only"
            },
            {
              "name": "EffectRemovedVisualizationFn",
              "reason": "delegate &mdash; code-only"
            },
            {
              "name": "EffectRemovedSourceVisualizationFn",
              "reason": "delegate &mdash; code-only"
            },
            {
              "name": "DeathVisualizationFn",
              "reason": "delegate &mdash; code-only"
            },
            {
              "name": "ModifyTracksFn",
              "reason": "delegate &mdash; code-only"
            },
            {
              "name": "EffectRemovedFn",
              "reason": "delegate &mdash; code-only"
            },
            {
              "name": "EffectAddedFn",
              "reason": "delegate &mdash; code-only"
            },
            {
              "name": "EffectTickedFn",
              "reason": "delegate &mdash; code-only"
            },
            {
              "name": "GetModifyChosenActivationIncreasePerUseFn",
              "reason": "delegate &mdash; code-only"
            },
            {
              "name": "UnitBreaksConcealmentIgnoringDistanceFn",
              "reason": "delegate &mdash; code-only"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_ReduceCooldowns",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_ReduceCooldowns",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "Amount",
              "type": "int",
              "kind": "scalar",
              "gameField": "Amount",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Turns taken off each cooldown.",
              "guard": "SetAmount"
            },
            {
              "config": "ReduceAll",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ReduceAll",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Clear the cooldowns entirely instead of reducing them by Amount.",
              "guard": "SetReduceAll"
            },
            {
              "config": "AbilitiesToTick",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "AbilitiesToTick",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Abilities whose cooldowns are reduced. Empty means every ability.",
              "modeField": "AbilitiesToTickMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_RemoteStart",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_RemoteStart",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "UnitDamageMultiplier",
              "type": "float",
              "kind": "scalar",
              "gameField": "UnitDamageMultiplier",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Multiplier on the damage the detonated object deals to units.",
              "guard": "SetUnitDamageMultiplier"
            },
            {
              "config": "DamageRadiusMultiplier",
              "type": "float",
              "kind": "scalar",
              "gameField": "DamageRadiusMultiplier",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Multiplier on the detonation's damage radius.",
              "guard": "SetDamageRadiusMultiplier"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_RemoveEffects",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_RemoveEffects",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "Cleanse",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCleanse",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Remove the effects as a cleanse, so whatever they do on wearing off does not trigger.",
              "guard": "SetCleanse"
            },
            {
              "config": "CheckSource",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCheckSource",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Match effects whose source is this effect's target, instead of effects whose target it is.",
              "guard": "SetCheckSource"
            },
            {
              "config": "DoNotVisualize",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDoNotVisualize",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Skip the removal visualization, for when another RemoveEffects on the ability already shows it.",
              "guard": "SetDoNotVisualize"
            },
            {
              "config": "EffectNamesToRemove",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "EffectNamesToRemove",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Effect names removed from the target.",
              "modeField": "EffectNamesToRemoveMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_ReserveActionPoints",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_ReserveActionPoints",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ReserveType",
              "type": "name",
              "kind": "scalar",
              "gameField": "ReserveType",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Type of action point reserved.",
              "guard": "SetReserveType"
            },
            {
              "config": "NumPoints",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumPoints",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Number of action points reserved.",
              "guard": "SetNumPoints"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_SetUnitValue",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_SetUnitValue",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "UnitName",
              "type": "name",
              "kind": "scalar",
              "gameField": "UnitName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Unit value written.",
              "guard": "SetUnitName"
            },
            {
              "config": "NewValueToSet",
              "type": "float",
              "kind": "scalar",
              "gameField": "NewValueToSet",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Value written to the unit value.",
              "guard": "SetNewValueToSet"
            },
            {
              "config": "CleanupType",
              "type": "EUnitValueCleanup",
              "kind": "scalar",
              "gameField": "CleanupType",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "When the unit value is cleared: eCleanup_BeginTurn, eCleanup_BeginTactical, eCleanup_Never or eCleanup_BeginTacticalChain.",
              "guard": "SetCleanupType"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_SoulSteal",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_SoulSteal",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "UnitValueToRead",
              "type": "name",
              "kind": "scalar",
              "gameField": "UnitValueToRead",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Unit value read to find how much health to steal.",
              "guard": "SetUnitValueToRead"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "HealedMessage",
              "reason": "localized &mdash; use .int localization files"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_Spotted",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_Spotted",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "BecomeUnspotted",
              "type": "bool",
              "kind": "scalar",
              "gameField": "m_bBecomeUnspotted",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Mark the unit as unspotted instead of spotted.",
              "guard": "SetBecomeUnspotted"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_SuspendMissionTimer",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_SuspendMissionTimer",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "ResumeMissionTimer",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bResumeMissionTimer",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Resume the mission timer instead of suspending it.",
              "guard": "SetResumeMissionTimer"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_TriggerEvent",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_TriggerEvent",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "TriggerEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "TriggerEventName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Event the effect fires.",
              "guard": "SetTriggerEventName"
            },
            {
              "config": "PassTargetAsSource",
              "type": "bool",
              "kind": "scalar",
              "gameField": "PassTargetAsSource",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Fire the event with the target as its source.",
              "guard": "SetPassTargetAsSource"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_VoidConduit",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_VoidConduit",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "DamagePerAction",
              "type": "int",
              "kind": "scalar",
              "gameField": "DamagePerAction",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Damage dealt for each action point stolen.",
              "guard": "SetDamagePerAction"
            },
            {
              "config": "HealthReturnMod",
              "type": "float",
              "kind": "scalar",
              "gameField": "HealthReturnMod",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Fraction of the damage dealt that is returned to the source as health.",
              "guard": "SetHealthReturnMod"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_World",
          "extends": "X2AbilityEffectsEditor_Base",
          "gameClass": "X2Effect_World",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "CenterTile",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCenterTile",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Apply the world effect to the centre tile only.",
              "guard": "SetCenterTile"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityEffectsEditor_Base",
          "extends": "X2AbilityEffectsEditor",
          "gameClass": null,
          "catchAll": true,
          "fields": [
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_DLC_Day60Freeze",
          "extends": "X2AbilityEffectsEditor_PersistentStatChange",
          "gameClass": "X2Effect_DLC_Day60Freeze",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyRulerModifiers",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyRulerModifiers",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Subtract the per-ruler freeze modifier from the rolled ruler freeze count.",
              "guard": "SetApplyRulerModifiers"
            },
            {
              "config": "LargeUnitFreezeDuration",
              "type": "int",
              "kind": "scalar",
              "gameField": "LARGE_UNIT_FREEZE_DURATION",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Turns a large unit, an Avatar or a Chosen stays frozen.",
              "guard": "SetLargeUnitFreezeDuration"
            },
            {
              "config": "NormalUnitFreezeDuration",
              "type": "int",
              "kind": "scalar",
              "gameField": "NORMAL_UNIT_FREEZE_DURATION",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Turns any other non-ruler unit stays frozen.",
              "guard": "SetNormalUnitFreezeDuration"
            },
            {
              "config": "MinRulerFreezeCount",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinRulerFreezeCount",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Lower bound of the XCOM actions a ruler stays frozen for. The roll is Rand(Max - Min) + Min.",
              "guard": "SetMinRulerFreezeCount"
            },
            {
              "config": "MaxRulerFreezeCount",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxRulerFreezeCount",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Upper bound of the ruler freeze roll, exclusive: Min equal to Max gives exactly Min actions.",
              "guard": "SetMaxRulerFreezeCount"
            },
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "CHLForceReapplyOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bForceReapplyOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_PersistentStatChange",
              "description": "Re-apply the stat changes when the effect is refreshed. Community Highlander field.",
              "guard": "SetCHLForceReapplyOnRefresh"
            },
            {
              "config": "StatChange",
              "type": "array<StatChangeEdit>",
              "kind": "nested",
              "gameField": "m_aStatChanges",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_PersistentStatChange",
              "description": "Stat changes applied while the effect lasts, merged by StatType.",
              "modeField": "StatChangeMode",
              "modeEnum": "EStatChangeMode"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "bridge": "AbilityEditorAlienHunters",
          "package": "DLC_2",
          "priority": 10,
          "registration": "ExtraEffectsEditors",
          "abstract": false,
          "notEditable": [
            {
              "name": "FreezeName",
              "reason": "localized &mdash; use .int localization files"
            },
            {
              "name": "FreezeDesc",
              "reason": "localized &mdash; use .int localization files"
            },
            {
              "name": "RulerFreezeTickFlyover",
              "reason": "localized &mdash; use .int localization files"
            },
            {
              "name": "FreezeEffectAddedString",
              "reason": "localized &mdash; use .int localization files"
            },
            {
              "name": "FreezeEffectPersistsString",
              "reason": "localized &mdash; use .int localization files"
            },
            {
              "name": "FreezeEffectRemovedString",
              "reason": "localized &mdash; use .int localization files"
            },
            {
              "name": "FreezeLostFlyover",
              "reason": "localized &mdash; use .int localization files"
            },
            {
              "name": "LargeUnitFreezeLostFlyover",
              "reason": "localized &mdash; use .int localization files"
            },
            {
              "name": "DefenseMod",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "ConfigStatusIcon",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "bAllowReorder",
              "reason": "not yet supported"
            }
          ]
        },
        {
          "class": "X2AbilityEffectsEditor_DLC_Day60TurnStartRemoveActionPoints",
          "extends": "X2AbilityEffectsEditor_Persistent",
          "gameClass": "X2Effect_DLC_Day60TurnStartRemoveActionPoints",
          "catchAll": false,
          "fields": [
            {
              "config": "ApplyToRevealedAIOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToRevealedAIOnly",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Only revealed AI units lose their action points; unrevealed ones are left alone.",
              "guard": "SetApplyToRevealedAIOnly"
            },
            {
              "config": "ApplyOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied when the ability hits. Most effects want this true; setting it false is how an effect is made to trigger only on a miss.",
              "guard": "SetApplyOnHit"
            },
            {
              "config": "ApplyOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied even when the ability misses.",
              "guard": "SetApplyOnMiss"
            },
            {
              "config": "ApplyChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "ApplyChance",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Percentage chance the effect applies at all, rolled per target. 0 behaves as \"always\", since the roll is only made when a chance is set.",
              "guard": "SetApplyChance"
            },
            {
              "config": "ApplyToWorldOnHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnHit",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is applied to the world (tiles, cover, environment) on a hit, rather than to a unit. Used by fire, smoke, acid and the other world effects.",
              "guard": "SetApplyToWorldOnHit"
            },
            {
              "config": "ApplyToWorldOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bApplyToWorldOnMiss",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "As ApplyToWorldOnHit, but for a miss. Grenades typically set both, so they still affect the ground when they scatter.",
              "guard": "SetApplyToWorldOnMiss"
            },
            {
              "config": "UseSourcePlayerState",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourcePlayerState",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Records the source player on the effect when it is applied, so later logic can tell whose effect it was. Needed by effects that behave differently for XCOM and the AI.",
              "guard": "SetUseSourcePlayerState"
            },
            {
              "config": "IsImpairing",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairing",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as impairing the unit, which fires the impairment event and makes the unit report as impaired. This is what stuns, panic and disorientation use.",
              "guard": "SetIsImpairing"
            },
            {
              "config": "IsImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIsImpairingMomentarily",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Fires the impairment event without leaving the unit flagged as impaired afterwards. For effects that interrupt an action but do not linger.",
              "guard": "SetIsImpairingMomentarily"
            },
            {
              "config": "BringRemoveVisualizationForward",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bBringRemoveVisualizationForward",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Moves this effect's removal visualization earlier in the sequence, taking the whole context's visualization with it. Used when a removal must be seen before what follows.",
              "guard": "SetBringRemoveVisualizationForward"
            },
            {
              "config": "ShowImmunity",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunity",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows a flyover when the target is immune to this effect. Only when the application actually failed because of immunity.",
              "guard": "SetShowImmunity"
            },
            {
              "config": "ShowImmunityAnyFailure",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowImmunityAnyFailure",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Shows the immunity flyover whenever the effect fails to apply for any reason, not only immunity. Broader, and noisier, than ShowImmunity.",
              "guard": "SetShowImmunityAnyFailure"
            },
            {
              "config": "AppliesDamage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAppliesDamage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Marks the effect as dealing damage, so it counts towards damage statistics and raises the generic ability-damage events. Set it on any custom source of damage.",
              "guard": "SetAppliesDamage"
            },
            {
              "config": "CanBeRedirected",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanBeRedirected",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Whether the effect is eligible to be redirected onto another target, by Untouchable, Bladestorm parries and similar. Leave false for effects that must hit their target.",
              "guard": "SetCanBeRedirected"
            },
            {
              "config": "HideDeathWorldMessage",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHideDeathWorldMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Suppresses the usual death message when this effect is what kills the unit, for deaths that should read as something other than a normal kill.",
              "guard": "SetHideDeathWorldMessage"
            },
            {
              "config": "MinStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "For effects resolved by a stat contest: the contest result must be at least this for the effect to apply. Used to band outcomes, so a stronger roll applies a stronger effect.",
              "guard": "SetMinStatContestResult"
            },
            {
              "config": "MaxStatContestResult",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxStatContestResult",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Upper bound of the same stat-contest band. Ignored when it is below MinStatContestResult.",
              "guard": "SetMaxStatContestResult"
            },
            {
              "config": "DelayVisualizationSec",
              "type": "float",
              "kind": "scalar",
              "gameField": "DelayVisualizationSec",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Seconds to delay this effect's visualization, for sequencing it against the rest of the ability rather than changing any game state.",
              "guard": "SetDelayVisualizationSec"
            },
            {
              "config": "OverrideMissMessage",
              "type": "string",
              "kind": "scalar",
              "gameField": "OverrideMissMessage",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Replaces the usual \"Miss\" flyover with your own text, for abilities where a miss should read as something else.",
              "guard": "SetOverrideMissMessage"
            },
            {
              "config": "DamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "DamageTypes",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Damage types this effect counts as. A unit immune to any type listed here resists the effect, and cleansing effects look at these types to decide what they can remove.",
              "modeField": "DamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "TargetConditions",
              "type": "array<ConditionEdit>",
              "kind": "nested",
              "gameField": "TargetConditions",
              "origin": "base",
              "inheritedFrom": "X2AbilityEffectsEditor",
              "description": "Conditions attached to the effect (X2Effect.TargetConditions)"
            },
            {
              "config": "InfiniteDuration",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bInfiniteDuration",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "The effect never expires on its own. It then only ends through one of the RemoveWhen... rules below, or by something cleansing it.",
              "guard": "SetInfiniteDuration"
            },
            {
              "config": "TickWhenApplied",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bTickWhenApplied",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks once the moment it is applied, rather than waiting for the turn to come round. Damage-over-time effects use this to hurt immediately.",
              "guard": "SetTickWhenApplied"
            },
            {
              "config": "CanTickEveryAction",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCanTickEveryAction",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks after every action the target takes rather than once a turn, where the character template supports it.",
              "guard": "SetCanTickEveryAction"
            },
            {
              "config": "ConvertTurnsToActions",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bConvertTurnsToActions",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When ticking per action, multiplies NumTurns by the actions available per turn, so a \"3 turn\" effect still lasts roughly three turns.",
              "guard": "SetConvertTurnsToActions"
            },
            {
              "config": "RemoveWhenSourceDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when whoever applied it dies. Typical for effects sustained by their caster, such as mind control.",
              "guard": "SetRemoveWhenSourceDies"
            },
            {
              "config": "RemoveWhenTargetDies",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetDies",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the affected unit dies, rather than leaving it on the body.",
              "guard": "SetRemoveWhenTargetDies"
            },
            {
              "config": "RemoveWhenSourceDamaged",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenSourceDamaged",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect as soon as the source takes damage, for concentration-style effects broken by being hit.",
              "guard": "SetRemoveWhenSourceDamaged"
            },
            {
              "config": "RemoveWhenTargetConcealmentBroken",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRemoveWhenTargetConcealmentBroken",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Removes the effect when the target loses concealment. Used by effects that only make sense while hidden.",
              "guard": "SetRemoveWhenTargetConcealmentBroken"
            },
            {
              "config": "PersistThroughTacticalGameEnd",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bPersistThroughTacticalGameEnd",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Keeps the effect on the unit after it leaves play, until the mission ends. Needed by effects that must still be read when the mission is scored.",
              "guard": "SetPersistThroughTacticalGameEnd"
            },
            {
              "config": "IgnorePlayerCheckOnTick",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnorePlayerCheckOnTick",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Ticks regardless of whose turn it is. Normally an effect only ticks on its owner’s turn.",
              "guard": "SetIgnorePlayerCheckOnTick"
            },
            {
              "config": "UniqueTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUniqueTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Only one target may carry this effect from a given source at a time; applying it elsewhere removes the earlier one.",
              "guard": "SetUniqueTarget"
            },
            {
              "config": "StackOnRefresh",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStackOnRefresh",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Re-applying the effect increments a stack counter instead of simply refreshing its duration, so effects that grow with repetition can read the count.",
              "guard": "SetStackOnRefresh"
            },
            {
              "config": "DupeForSameSourceOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDupeForSameSourceOnly",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "When checking whether the target already has this effect, only consider copies from the same source. Lets several units apply their own instance.",
              "guard": "SetDupeForSameSourceOnly"
            },
            {
              "config": "EffectForcesBleedout",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bEffectForcesBleedout",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "A unit reduced to zero health while under this effect bleeds out instead of dying outright.",
              "guard": "SetEffectForcesBleedout"
            },
            {
              "config": "DisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Whether the effect appears in the unit’s status UI at all. An effect with no FriendlyName set will show as blank.",
              "guard": "SetDisplayInUI"
            },
            {
              "config": "DisplayInSpecialDamageMessageUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisplayInSpecialDamageMessageUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Shows FriendlyName in the damage feedback as a distinct source, so its damage reads separately from the weapon’s.",
              "guard": "SetDisplayInSpecialDamageMessageUI"
            },
            {
              "config": "SourceDisplayInUI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSourceDisplayInUI",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "As DisplayInUI, but for the unit that applied the effect rather than the one carrying it.",
              "guard": "SetSourceDisplayInUI"
            },
            {
              "config": "NumTurns",
              "type": "int",
              "kind": "scalar",
              "gameField": "iNumTurns",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "How many turns the effect lasts. Ignored when InfiniteDuration is true.",
              "guard": "SetNumTurns"
            },
            {
              "config": "InitialShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iInitialShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance the effect is shed immediately on the first tick, before PerTurnShedChance takes over.",
              "guard": "SetInitialShedChance"
            },
            {
              "config": "PerTurnShedChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "iPerTurnShedChance",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Percentage chance per tick that the effect wears off early. 0 means it only ends when its turns run out.",
              "guard": "SetPerTurnShedChance"
            },
            {
              "config": "EffectRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectRank",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Precedence among effects of the same kind, used by auras so a stronger source wins over a weaker one.",
              "guard": "SetEffectRank"
            },
            {
              "config": "EffectHierarchyValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "EffectHierarchyValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Decides which effect controls the unit’s animation when several apply at once. The higher value wins.",
              "guard": "SetEffectHierarchyValue"
            },
            {
              "config": "VisionArcDegreesOverride",
              "type": "float",
              "kind": "scalar",
              "gameField": "VisionArcDegreesOverride",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Narrows the unit’s sight arc to this many degrees. When two effects both set it, the smaller arc applies.",
              "guard": "SetVisionArcDegreesOverride"
            },
            {
              "config": "CustomIdleOverrideAnim",
              "type": "name",
              "kind": "scalar",
              "gameField": "CustomIdleOverrideAnim",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Idle animation to play while the effect is active, taking over the unit’s normal idle.",
              "guard": "SetCustomIdleOverrideAnim"
            },
            {
              "config": "EffectName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Identifier used when deciding how this effect stacks with others, and the name other effects use to find or remove it.",
              "guard": "SetEffectName"
            },
            {
              "config": "AbilitySourceName",
              "type": "name",
              "kind": "scalar",
              "gameField": "AbilitySourceName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Which ability this is presented as coming from. Controls how a passive buff is coloured in the HUD.",
              "guard": "SetAbilitySourceName"
            },
            {
              "config": "EffectAppliedEventName",
              "type": "name",
              "kind": "scalar",
              "gameField": "EffectAppliedEventName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the effect is applied, for listeners and triggered abilities to react to.",
              "guard": "SetEffectAppliedEventName"
            },
            {
              "config": "ChanceEventTriggerName",
              "type": "name",
              "kind": "scalar",
              "gameField": "ChanceEventTriggerName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Event fired when the per-turn shed-chance roll succeeds.",
              "guard": "SetChanceEventTriggerName"
            },
            {
              "config": "VFXSocket",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocket",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Socket on the unit’s skeleton to attach the particle system to.",
              "guard": "SetVFXSocket"
            },
            {
              "config": "VFXSocketsArrayName",
              "type": "name",
              "kind": "scalar",
              "gameField": "VFXSocketsArrayName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Named array of sockets to attach the particle system to, for effects that appear in several places at once. Optional.",
              "guard": "SetVFXSocketsArrayName"
            },
            {
              "config": "FriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown in the unit’s status UI.",
              "guard": "SetFriendlyName"
            },
            {
              "config": "FriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "FriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown beneath FriendlyName in the status UI.",
              "guard": "SetFriendlyDescription"
            },
            {
              "config": "IconImage",
              "type": "string",
              "kind": "scalar",
              "gameField": "IconImage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the status icon shown in the UI.",
              "guard": "SetIconImage"
            },
            {
              "config": "SourceFriendlyName",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Name shown on the unit that applied the effect, as opposed to the one carrying it.",
              "guard": "SetSourceFriendlyName"
            },
            {
              "config": "SourceFriendlyDescription",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceFriendlyDescription",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Description shown on the applying unit.",
              "guard": "SetSourceFriendlyDescription"
            },
            {
              "config": "SourceIconLabel",
              "type": "string",
              "kind": "scalar",
              "gameField": "SourceIconLabel",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Short label drawn on the applying unit’s icon.",
              "guard": "SetSourceIconLabel"
            },
            {
              "config": "StatusIcon",
              "type": "string",
              "kind": "scalar",
              "gameField": "StatusIcon",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Path to the small status icon used in condensed UI, alongside IconImage.",
              "guard": "SetStatusIcon"
            },
            {
              "config": "VFXTemplateName",
              "type": "string",
              "kind": "scalar",
              "gameField": "VFXTemplateName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Particle system played on the unit for as long as the effect lasts.",
              "guard": "SetVFXTemplateName"
            },
            {
              "config": "PersistentPerkName",
              "type": "string",
              "kind": "scalar",
              "gameField": "PersistentPerkName",
              "origin": "derived",
              "inheritedFrom": "X2AbilityEffectsEditor_Persistent",
              "description": "Perk effect played on the unit while this effect is active.",
              "guard": "SetPersistentPerkName"
            }
          ],
          "bridge": "AbilityEditorAlienHunters",
          "package": "DLC_2",
          "priority": 10,
          "registration": "ExtraEffectsEditors",
          "abstract": false,
          "notEditable": []
        }
      ]
    },
    {
      "name": "Conditions",
      "configKey": "",
      "editStruct": "ConditionEdit",
      "wired": true,
      "dispatchOrder": [
        "X2AbilityConditionEditor_UnitEffectsApplying",
        "X2AbilityConditionEditor_UnitEffectsOnSource",
        "X2AbilityConditionEditor_UnitEffectsWithAbilitySource",
        "X2AbilityConditionEditor_UnitEffectsWithAbilityTarget",
        "X2AbilityConditionEditor_AbilityProperty",
        "X2AbilityConditionEditor_AbilitySourceWeapon",
        "X2AbilityConditionEditor_BattleState",
        "X2AbilityConditionEditor_BerserkerDevastatingPunch",
        "X2AbilityConditionEditor_Bondmate",
        "X2AbilityConditionEditor_DarkEvent",
        "X2AbilityConditionEditor_EverVigilant",
        "X2AbilityConditionEditor_FuseTarget",
        "X2AbilityConditionEditor_GameplayTag",
        "X2AbilityConditionEditor_GameTime",
        "X2AbilityConditionEditor_HackingTarget",
        "X2AbilityConditionEditor_Interactive",
        "X2AbilityConditionEditor_Lootable",
        "X2AbilityConditionEditor_MapProperty",
        "X2AbilityConditionEditor_OnGroundTile",
        "X2AbilityConditionEditor_PanicOnPod",
        "X2AbilityConditionEditor_PlayerTurns",
        "X2AbilityConditionEditor_StasisLanceTarget",
        "X2AbilityConditionEditor_StasisTarget",
        "X2AbilityConditionEditor_Stealth",
        "X2AbilityConditionEditor_UnblockedNeighborTile",
        "X2AbilityConditionEditor_UnitActionPoints",
        "X2AbilityConditionEditor_UnitAlertStatus",
        "X2AbilityConditionEditor_UnitEffects",
        "X2AbilityConditionEditor_UnitImmunities",
        "X2AbilityConditionEditor_UnitInEvacZone",
        "X2AbilityConditionEditor_UnitInteractions",
        "X2AbilityConditionEditor_UnitInventory",
        "X2AbilityConditionEditor_UnitProperty",
        "X2AbilityConditionEditor_UnitStatCheck",
        "X2AbilityConditionEditor_UnitType",
        "X2AbilityConditionEditor_UnitValue",
        "X2AbilityConditionEditor_Visibility",
        "X2AbilityConditionEditor_Base"
      ],
      "intro": "Conditions can be edited in seven places: the template-level arrays (`ShooterConditions`, `TargetConditions`, `MultiTargetConditions` directly inside an `AbilityEdit`) and, inside an `Effects` entry, the effect's own `TargetConditions` plus the class-specific `ApplyDamageModConditions`, `LethalDamageConditions` and `ToHitConditions`. All take an array of `ConditionEdit` entries. Within the targeted array, the condition of class `Class` is edited **in place** if present; otherwise behaviour depends on `Mode`.",
      "editors": [
        {
          "class": "X2AbilityConditionEditor_UnitEffectsApplying",
          "extends": "X2AbilityConditionEditor_UnitEffects",
          "gameClass": "X2Condition_UnitEffectsApplying",
          "catchAll": false,
          "fields": [
            {
              "config": "ExcludeEffects",
              "type": "array<EffectReason>",
              "kind": "namearray",
              "gameField": "ExcludeEffects",
              "origin": "derived",
              "inheritedFrom": "X2AbilityConditionEditor_UnitEffects",
              "description": "Effects that reject the unit when present, each with the failure reason to return.",
              "modeField": "ExcludeEffectsMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "RequireEffects",
              "type": "array<EffectReason>",
              "kind": "namearray",
              "gameField": "RequireEffects",
              "origin": "derived",
              "inheritedFrom": "X2AbilityConditionEditor_UnitEffects",
              "description": "Effects that must all be present on the unit, each with the failure reason to return.",
              "modeField": "RequireEffectsMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_UnitEffectsOnSource",
          "extends": "X2AbilityConditionEditor_UnitEffects",
          "gameClass": "X2Condition_UnitEffectsOnSource",
          "catchAll": false,
          "fields": [
            {
              "config": "ExcludeEffects",
              "type": "array<EffectReason>",
              "kind": "namearray",
              "gameField": "ExcludeEffects",
              "origin": "derived",
              "inheritedFrom": "X2AbilityConditionEditor_UnitEffects",
              "description": "Effects that reject the unit when present, each with the failure reason to return.",
              "modeField": "ExcludeEffectsMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "RequireEffects",
              "type": "array<EffectReason>",
              "kind": "namearray",
              "gameField": "RequireEffects",
              "origin": "derived",
              "inheritedFrom": "X2AbilityConditionEditor_UnitEffects",
              "description": "Effects that must all be present on the unit, each with the failure reason to return.",
              "modeField": "RequireEffectsMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_UnitEffectsWithAbilitySource",
          "extends": "X2AbilityConditionEditor_UnitEffects",
          "gameClass": "X2Condition_UnitEffectsWithAbilitySource",
          "catchAll": false,
          "fields": [
            {
              "config": "ExcludeEffects",
              "type": "array<EffectReason>",
              "kind": "namearray",
              "gameField": "ExcludeEffects",
              "origin": "derived",
              "inheritedFrom": "X2AbilityConditionEditor_UnitEffects",
              "description": "Effects that reject the unit when present, each with the failure reason to return.",
              "modeField": "ExcludeEffectsMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "RequireEffects",
              "type": "array<EffectReason>",
              "kind": "namearray",
              "gameField": "RequireEffects",
              "origin": "derived",
              "inheritedFrom": "X2AbilityConditionEditor_UnitEffects",
              "description": "Effects that must all be present on the unit, each with the failure reason to return.",
              "modeField": "RequireEffectsMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_UnitEffectsWithAbilityTarget",
          "extends": "X2AbilityConditionEditor_UnitEffects",
          "gameClass": "X2Condition_UnitEffectsWithAbilityTarget",
          "catchAll": false,
          "fields": [
            {
              "config": "ExcludeEffects",
              "type": "array<EffectReason>",
              "kind": "namearray",
              "gameField": "ExcludeEffects",
              "origin": "derived",
              "inheritedFrom": "X2AbilityConditionEditor_UnitEffects",
              "description": "Effects that reject the unit when present, each with the failure reason to return.",
              "modeField": "ExcludeEffectsMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "RequireEffects",
              "type": "array<EffectReason>",
              "kind": "namearray",
              "gameField": "RequireEffects",
              "origin": "derived",
              "inheritedFrom": "X2AbilityConditionEditor_UnitEffects",
              "description": "Effects that must all be present on the unit, each with the failure reason to return.",
              "modeField": "RequireEffectsMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_AbilityProperty",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_AbilityProperty",
          "catchAll": false,
          "fields": [
            {
              "config": "TargetMustBeInValidTiles",
              "type": "bool",
              "kind": "scalar",
              "gameField": "TargetMustBeInValidTiles",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject targets standing outside the ability's valid tiles.",
              "guard": "SetTargetMustBeInValidTiles"
            },
            {
              "config": "OwnerHasSoldierAbilities",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "OwnerHasSoldierAbilities",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Soldier abilities the unit owning the ability must have.",
              "modeField": "OwnerHasSoldierAbilitiesMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_AbilitySourceWeapon",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_AbilitySourceWeapon",
          "catchAll": false,
          "fields": [
            {
              "config": "WantsReload",
              "type": "bool",
              "kind": "scalar",
              "gameField": "WantsReload",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Fail with AA_AmmoAlreadyFull when the source weapon's clip is already full.",
              "guard": "SetWantsReload"
            },
            {
              "config": "CheckAmmo",
              "type": "bool",
              "kind": "scalar",
              "gameField": "CheckAmmo",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Compare the source weapon's ammo against CheckAmmoData.",
              "guard": "SetCheckAmmo"
            },
            {
              "config": "CheckAmmoData",
              "type": "CheckConfig",
              "kind": "scalar",
              "gameField": "CheckAmmoData",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "The ammo check used when CheckAmmo is true: Value, CheckType, and ValueMin/ValueMax for range checks.",
              "guard": "SetCheckAmmoData"
            },
            {
              "config": "NotLoadedAmmoInSecondaryWeapon",
              "type": "bool",
              "kind": "scalar",
              "gameField": "NotLoadedAmmoInSecondaryWeapon",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Fail when the source weapon is currently loaded as ammo in the secondary weapon.",
              "guard": "SetNotLoadedAmmoInSecondaryWeapon"
            },
            {
              "config": "MatchGrenadeType",
              "type": "name",
              "kind": "scalar",
              "gameField": "MatchGrenadeType",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Grenade template the source weapon, or its loaded ammo, must be.",
              "guard": "SetMatchGrenadeType"
            },
            {
              "config": "CheckGrenadeFriendlyFire",
              "type": "bool",
              "kind": "scalar",
              "gameField": "CheckGrenadeFriendlyFire",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject friendly targets unless the grenade template allows friendly fire.",
              "guard": "SetCheckGrenadeFriendlyFire"
            },
            {
              "config": "CheckAmmoTechLevel",
              "type": "bool",
              "kind": "scalar",
              "gameField": "CheckAmmoTechLevel",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject the source ammo when it is not valid for the unit's primary weapon.",
              "guard": "SetCheckAmmoTechLevel"
            },
            {
              "config": "MatchWeaponTemplate",
              "type": "name",
              "kind": "scalar",
              "gameField": "MatchWeaponTemplate",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Weapon template the source weapon must be, exact match on its DataName.",
              "guard": "SetMatchWeaponTemplate"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_BattleState",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_BattleState",
          "catchAll": false,
          "fields": [
            {
              "config": "MissionAborted",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bMissionAborted",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require the mission to have been aborted.",
              "guard": "SetMissionAborted"
            },
            {
              "config": "MissionNotAborted",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bMissionNotAborted",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require the mission not to have been aborted.",
              "guard": "SetMissionNotAborted"
            },
            {
              "config": "CiviliansTargetedByAliens",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCiviliansTargetedByAliens",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require a mission where aliens target civilians.",
              "guard": "SetCiviliansTargetedByAliens"
            },
            {
              "config": "CiviliansNotTargetedByAliens",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCiviliansNotTargetedByAliens",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require a mission where aliens do not target civilians.",
              "guard": "SetCiviliansNotTargetedByAliens"
            },
            {
              "config": "IncludeTheLostInEngagedCount",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIncludeTheLostInEngagedCount",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Count the Lost among the engaged enemies.",
              "guard": "SetIncludeTheLostInEngagedCount"
            },
            {
              "config": "MinEngagedEnemies",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinEngagedEnemies",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Fewest engaged enemies required. -1 ignores it.",
              "guard": "SetMinEngagedEnemies"
            },
            {
              "config": "MaxEngagedEnemies",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxEngagedEnemies",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Most engaged enemies allowed. -1 ignores it.",
              "guard": "SetMaxEngagedEnemies"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_BerserkerDevastatingPunch",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_BerserkerDevastatingPunch",
          "catchAll": false,
          "fields": [
            {
              "config": "FailOnNonUnitTargets",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bFailOnNonUnitTargets",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Fail with AA_NotAUnit on non-unit targets instead of passing them through.",
              "guard": "SetFailOnNonUnitTargets"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_Bondmate",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_Bondmate",
          "catchAll": false,
          "fields": [
            {
              "config": "MinBondLevel",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinBondLevel",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Lowest bond level between the two units, inclusive.",
              "guard": "SetMinBondLevel"
            },
            {
              "config": "MaxBondLevel",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxBondLevel",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Highest bond level between the two units, inclusive.",
              "guard": "SetMaxBondLevel"
            },
            {
              "config": "RequiresAdjacency",
              "type": "AdjacencyRequirement",
              "kind": "scalar",
              "gameField": "RequiresAdjacency",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Whether the bondmates may, must not, or must be adjacent: EAR_AnyAdjacency, EAR_DisallowAdjacency or EAR_RequireAdjacency.",
              "guard": "SetRequiresAdjacency"
            },
            {
              "config": "SkipCheckWithSource",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSkipCheckWithSource",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Only check that the source has a bondmate on the mission, not that the target is that bondmate. For self-targeted bondmate abilities.",
              "guard": "SetSkipCheckWithSource"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_DarkEvent",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_DarkEvent",
          "catchAll": false,
          "fields": [
            {
              "config": "StilettoRounds",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bStilettoRounds",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Pass only while the Stiletto Rounds dark event is active.",
              "guard": "SetStilettoRounds"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_EverVigilant",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_EverVigilant",
          "catchAll": false,
          "fields": [],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_FuseTarget",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_FuseTarget",
          "catchAll": false,
          "fields": [],
          "abstract": false,
          "notEditable": [
            {
              "name": "FuseAbilities",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityConditionEditor_GameplayTag",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_GameplayTag",
          "catchAll": false,
          "fields": [
            {
              "config": "RequiredGameplayTag",
              "type": "name",
              "kind": "scalar",
              "gameField": "RequiredGameplayTag",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Tactical gameplay tag XCOM HQ must carry for the ability to be valid.",
              "guard": "SetRequiredGameplayTag"
            },
            {
              "config": "DisallowGameplayTag",
              "type": "name",
              "kind": "scalar",
              "gameField": "DisallowGameplayTag",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Tactical gameplay tag that makes the ability invalid while XCOM HQ carries it.",
              "guard": "SetDisallowGameplayTag"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_GameTime",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_GameTime",
          "catchAll": false,
          "fields": [
            {
              "config": "HourChecks",
              "type": "array<CheckConfig>",
              "kind": "namearray",
              "gameField": "HourChecks",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Checks against the current hour of the day; the condition passes when any one of them does. Merge adds checks not already present.",
              "modeField": "HourChecksMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_HackingTarget",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_HackingTarget",
          "catchAll": false,
          "fields": [
            {
              "config": "IntrusionProtocol",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIntrusionProtocol",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Hack objects at range: needs gameplay visibility of the object instead of an adjacent interaction point.",
              "guard": "SetIntrusionProtocol"
            },
            {
              "config": "HaywireProtocol",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHaywireProtocol",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Target units instead of objects: living, unhacked, robotic enemies the unit sees or has squadsight on.",
              "guard": "SetHaywireProtocol"
            },
            {
              "config": "RequiredAbilityName",
              "type": "name",
              "kind": "scalar",
              "gameField": "RequiredAbilityName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Ability the interactive object must expose. For hacking, empty accepts any object; for a normal interaction it must match exactly.",
              "guard": "SetRequiredAbilityName"
            },
            {
              "config": "MustBeDoor",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bMustBeDoor",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require the object to be a door.",
              "guard": "SetMustBeDoor"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_Interactive",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_Interactive",
          "catchAll": false,
          "fields": [
            {
              "config": "InteractionType",
              "type": "UnitInterationType",
              "kind": "scalar",
              "gameField": "InteractionType",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Kind of interaction point the unit must be next to: eInteractionType_Normal or eInteractionType_Hack.",
              "guard": "SetInteractionType"
            },
            {
              "config": "RequiredAbilityName",
              "type": "name",
              "kind": "scalar",
              "gameField": "RequiredAbilityName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Ability the interactive object must expose. For hacking, empty accepts any object; for a normal interaction it must match exactly.",
              "guard": "SetRequiredAbilityName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_Lootable",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_Lootable",
          "catchAll": false,
          "fields": [
            {
              "config": "RestrictRange",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRestrictRange",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require the loot to be within LootableRange of the source.",
              "guard": "SetRestrictRange"
            },
            {
              "config": "LootableRange",
              "type": "int",
              "kind": "scalar",
              "gameField": "LootableRange",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Maximum distance to the loot, in Unreal units, when RestrictRange is set. A tile is 96.",
              "guard": "SetLootableRange"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_MapProperty",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_MapProperty",
          "catchAll": false,
          "fields": [
            {
              "config": "AllowedBiomes",
              "type": "array<string>",
              "kind": "namearray",
              "gameField": "AllowedBiomes",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Map biomes the mission must be in, when non-empty.",
              "modeField": "AllowedBiomesMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_OnGroundTile",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_OnGroundTile",
          "catchAll": false,
          "fields": [
            {
              "config": "NotAFloorTileTag",
              "type": "name",
              "kind": "scalar",
              "gameField": "NotAFloorTileTag",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Tag of tiles that must not count as ground.",
              "guard": "SetNotAFloorTileTag"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_PanicOnPod",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_PanicOnPod",
          "catchAll": false,
          "fields": [
            {
              "config": "MaxPanicUnitsPerPod",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxPanicUnitsPerPod",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Most units of an AI pod that may be panicked at once. 0 removes the limit.",
              "guard": "SetMaxPanicUnitsPerPod"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_PlayerTurns",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_PlayerTurns",
          "catchAll": false,
          "fields": [
            {
              "config": "NumTurnsCheck",
              "type": "CheckConfig",
              "kind": "scalar",
              "gameField": "NumTurnsCheck",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Check against the number of turns the target's controlling player has taken.",
              "guard": "SetNumTurnsCheck"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_StasisLanceTarget",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_StasisLanceTarget",
          "catchAll": false,
          "fields": [
            {
              "config": "HackAbilityName",
              "type": "Name",
              "kind": "scalar",
              "gameField": "HackAbilityName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Hack ability whose rewards the target must offer, e.g. FinalizeSKULLJACK.",
              "guard": "SetHackAbilityName"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_StasisTarget",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_StasisTarget",
          "catchAll": false,
          "fields": [],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_Stealth",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_Stealth",
          "catchAll": false,
          "fields": [
            {
              "config": "CheckFlanking",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCheckFlanking",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Fail when any enemy flanks the unit.",
              "guard": "SetCheckFlanking"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_UnblockedNeighborTile",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_UnblockedNeighborTile",
          "catchAll": false,
          "fields": [
            {
              "config": "RequireVisible",
              "type": "bool",
              "kind": "scalar",
              "gameField": "RequireVisible",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require a free neighbouring tile the unit could be pulled to, rather than any free neighbouring tile.",
              "guard": "SetRequireVisible"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_UnitActionPoints",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_UnitActionPoints",
          "catchAll": false,
          "fields": [
            {
              "config": "ActionPointChecks",
              "type": "array<ActionPointCheck>",
              "kind": "namearray",
              "gameField": "m_aCheckValues",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Action point checks; passes when any one of them does. Each names an action point type, whether to count reserved points, and the value check.",
              "modeField": "ActionPointChecksMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_UnitAlertStatus",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_UnitAlertStatus",
          "catchAll": false,
          "fields": [
            {
              "config": "RequiredAlertStatusMaximum",
              "type": "int",
              "kind": "scalar",
              "gameField": "RequiredAlertStatusMaximum",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Highest alert level the unit may have. -1 ignores it; the condition fails when both limits are -1.",
              "guard": "SetRequiredAlertStatusMaximum"
            },
            {
              "config": "RequiredAlertStatusMinimum",
              "type": "int",
              "kind": "scalar",
              "gameField": "RequiredAlertStatusMinimum",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Lowest alert level the unit may have. -1 ignores it; the condition fails when both limits are -1.",
              "guard": "SetRequiredAlertStatusMinimum"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_UnitEffects",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_UnitEffects",
          "catchAll": false,
          "fields": [
            {
              "config": "ExcludeEffects",
              "type": "array<EffectReason>",
              "kind": "namearray",
              "gameField": "ExcludeEffects",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Effects that reject the unit when present, each with the failure reason to return.",
              "modeField": "ExcludeEffectsMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "RequireEffects",
              "type": "array<EffectReason>",
              "kind": "namearray",
              "gameField": "RequireEffects",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Effects that must all be present on the unit, each with the failure reason to return.",
              "modeField": "RequireEffectsMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_UnitImmunities",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_UnitImmunities",
          "catchAll": false,
          "fields": [
            {
              "config": "OnlyOnCharacterTemplate",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bOnlyOnCharacterTemplate",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Consider only the immunities of the unit's character template, not those granted by effects.",
              "guard": "SetOnlyOnCharacterTemplate"
            },
            {
              "config": "ExcludeDamageTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "ExcludeDamageTypes",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Damage types; a unit immune to any of them is rejected.",
              "modeField": "ExcludeDamageTypesMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_UnitInEvacZone",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_UnitInEvacZone",
          "catchAll": false,
          "fields": [],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_UnitInteractions",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_UnitInteractions",
          "catchAll": false,
          "fields": [
            {
              "config": "InteractionType",
              "type": "UnitInterationType",
              "kind": "scalar",
              "gameField": "InteractionType",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Kind of interaction point the unit must be next to: eInteractionType_Normal or eInteractionType_Hack.",
              "guard": "SetInteractionType"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_UnitInventory",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_UnitInventory",
          "catchAll": false,
          "fields": [
            {
              "config": "RelevantSlot",
              "type": "EInventorySlot",
              "kind": "scalar",
              "gameField": "RelevantSlot",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Inventory slot whose item is checked.",
              "guard": "SetRelevantSlot"
            },
            {
              "config": "ExcludeWeaponCategory",
              "type": "name",
              "kind": "scalar",
              "gameField": "ExcludeWeaponCategory",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Weapon category that rejects the unit when the item in RelevantSlot has it.",
              "guard": "SetExcludeWeaponCategory"
            },
            {
              "config": "RequireWeaponCategory",
              "type": "name",
              "kind": "scalar",
              "gameField": "RequireWeaponCategory",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Weapon category the item in RelevantSlot must have. Fails when the slot is empty.",
              "guard": "SetRequireWeaponCategory"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_UnitProperty",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_UnitProperty",
          "catchAll": false,
          "fields": [
            {
              "config": "ExcludeAlive",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeAlive",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject living units.",
              "guard": "SetExcludeAlive"
            },
            {
              "config": "ExcludeDead",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeDead",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject dead units.",
              "guard": "SetExcludeDead"
            },
            {
              "config": "ExcludeRobotic",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeRobotic",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject robotic units.",
              "guard": "SetExcludeRobotic"
            },
            {
              "config": "ExcludeOrganic",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeOrganic",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject organic units.",
              "guard": "SetExcludeOrganic"
            },
            {
              "config": "ExcludeCivilian",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeCivilian",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject units whose character template is civilian, whatever their team.",
              "guard": "SetExcludeCivilian"
            },
            {
              "config": "ExcludeNonCivilian",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeNonCivilian",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject units whose character template is not civilian, whatever their team.",
              "guard": "SetExcludeNonCivilian"
            },
            {
              "config": "ExcludeCosmetic",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeCosmetic",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject cosmetic units, such as Gremlins.",
              "guard": "SetExcludeCosmetic"
            },
            {
              "config": "ExcludeImpaired",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeImpaired",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject impaired units.",
              "guard": "SetExcludeImpaired"
            },
            {
              "config": "ExcludePanicked",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludePanicked",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject panicked units.",
              "guard": "SetExcludePanicked"
            },
            {
              "config": "ExcludeInStasis",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeInStasis",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject units in stasis.",
              "guard": "SetExcludeInStasis"
            },
            {
              "config": "ExcludeTurret",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeTurret",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject turrets.",
              "guard": "SetExcludeTurret"
            },
            {
              "config": "ExcludePsionic",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludePsionic",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject psionic units.",
              "guard": "SetExcludePsionic"
            },
            {
              "config": "ExcludeNonPsionic",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeNonPsionic",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject non-psionic units.",
              "guard": "SetExcludeNonPsionic"
            },
            {
              "config": "IsAdvent",
              "type": "bool",
              "kind": "scalar",
              "gameField": "IsAdvent",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require an ADVENT unit.",
              "guard": "SetIsAdvent"
            },
            {
              "config": "ExcludeAdvent",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeAdvent",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject ADVENT units.",
              "guard": "SetExcludeAdvent"
            },
            {
              "config": "ExcludeNoCover",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeNoCover",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject units that are not in cover.",
              "guard": "SetExcludeNoCover"
            },
            {
              "config": "ExcludeNoCoverToSource",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeNoCoverToSource",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject units with no cover between them and the source.",
              "guard": "SetExcludeNoCoverToSource"
            },
            {
              "config": "ExcludeFullHealth",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeFullHealth",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject units at full HP, unless a persistent damage effect listed in MedikitHealEffectTypes is on them.",
              "guard": "SetExcludeFullHealth"
            },
            {
              "config": "IsBleedingOut",
              "type": "bool",
              "kind": "scalar",
              "gameField": "IsBleedingOut",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require a unit that is bleeding out.",
              "guard": "SetIsBleedingOut"
            },
            {
              "config": "IsUnspotted",
              "type": "bool",
              "kind": "scalar",
              "gameField": "IsUnspotted",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require a unit that has not been spotted.",
              "guard": "SetIsUnspotted"
            },
            {
              "config": "CanBeCarried",
              "type": "bool",
              "kind": "scalar",
              "gameField": "CanBeCarried",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require a unit that can be carried.",
              "guard": "SetCanBeCarried"
            },
            {
              "config": "IsOutdoors",
              "type": "bool",
              "kind": "scalar",
              "gameField": "IsOutdoors",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require a unit standing outdoors.",
              "guard": "SetIsOutdoors"
            },
            {
              "config": "IsConcealed",
              "type": "bool",
              "kind": "scalar",
              "gameField": "IsConcealed",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require a concealed unit.",
              "guard": "SetIsConcealed"
            },
            {
              "config": "ExcludeConcealed",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeConcealed",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject concealed units. Only applies to the check without a source; visibility rules normally cover this.",
              "guard": "SetExcludeConcealed"
            },
            {
              "config": "IsSuperConcealed",
              "type": "bool",
              "kind": "scalar",
              "gameField": "IsSuperConcealed",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require a unit in super concealment.",
              "guard": "SetIsSuperConcealed"
            },
            {
              "config": "IsImpaired",
              "type": "bool",
              "kind": "scalar",
              "gameField": "IsImpaired",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require an impaired unit.",
              "guard": "SetIsImpaired"
            },
            {
              "config": "HasClearanceToMaxZ",
              "type": "bool",
              "kind": "scalar",
              "gameField": "HasClearanceToMaxZ",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require open space above the unit up to the map ceiling.",
              "guard": "SetHasClearanceToMaxZ"
            },
            {
              "config": "ExcludeAlien",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeAlien",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject alien units.",
              "guard": "SetExcludeAlien"
            },
            {
              "config": "ExcludeNonHumanoidAliens",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeNonHumanoidAliens",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject aliens that are not humanoid.",
              "guard": "SetExcludeNonHumanoidAliens"
            },
            {
              "config": "ExcludeStunned",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeStunned",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject stunned units.",
              "guard": "SetExcludeStunned"
            },
            {
              "config": "ExcludeDazed",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeDazed",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject dazed units.",
              "guard": "SetExcludeDazed"
            },
            {
              "config": "ExcludeUnableToAct",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeUnableToAct",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject units that are unable to act.",
              "guard": "SetExcludeUnableToAct"
            },
            {
              "config": "IsPlayerControlled",
              "type": "bool",
              "kind": "scalar",
              "gameField": "IsPlayerControlled",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require a player-controlled unit.",
              "guard": "SetIsPlayerControlled"
            },
            {
              "config": "ExcludeUnrevealedAI",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeUnrevealedAI",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject AI units that have not been revealed yet.",
              "guard": "SetExcludeUnrevealedAI"
            },
            {
              "config": "IncludeWeakAgainstTechLikeRobot",
              "type": "bool",
              "kind": "scalar",
              "gameField": "IncludeWeakAgainstTechLikeRobot",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Treat units flagged as weak against tech as robotic for the robotic checks.",
              "guard": "SetIncludeWeakAgainstTechLikeRobot"
            },
            {
              "config": "ImpairedIgnoresStuns",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ImpairedIgnoresStuns",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Do not count stuns when deciding whether a unit is impaired.",
              "guard": "SetImpairedIgnoresStuns"
            },
            {
              "config": "IsScampering",
              "type": "bool",
              "kind": "scalar",
              "gameField": "IsScampering",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require a unit that is currently scampering.",
              "guard": "SetIsScampering"
            },
            {
              "config": "ExcludeDeadFromSpecialDeath",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeDeadFromSpecialDeath",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject units killed by a special death.",
              "guard": "SetExcludeDeadFromSpecialDeath"
            },
            {
              "config": "ExcludeLargeUnits",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeLargeUnits",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject units larger than one tile.",
              "guard": "SetExcludeLargeUnits"
            },
            {
              "config": "ImpairedIgnoresImpairingMomentarily",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ImpairedIgnoresImpairingMomentarily",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Do not count momentary impairment when deciding whether a unit is impaired.",
              "guard": "SetImpairedIgnoresImpairingMomentarily"
            },
            {
              "config": "ExcludeHostileToSource",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeHostileToSource",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject units hostile to the source.",
              "guard": "SetExcludeHostileToSource"
            },
            {
              "config": "ExcludeFriendlyToSource",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeFriendlyToSource",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject units friendly to the source.",
              "guard": "SetExcludeFriendlyToSource"
            },
            {
              "config": "TreatMindControlledSquadmateAsHostile",
              "type": "bool",
              "kind": "scalar",
              "gameField": "TreatMindControlledSquadmateAsHostile",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Count a mind-controlled squadmate as hostile rather than friendly.",
              "guard": "SetTreatMindControlledSquadmateAsHostile"
            },
            {
              "config": "ExcludeSquadmates",
              "type": "bool",
              "kind": "scalar",
              "gameField": "ExcludeSquadmates",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Reject units on the same team as the source.",
              "guard": "SetExcludeSquadmates"
            },
            {
              "config": "RequireSquadmates",
              "type": "bool",
              "kind": "scalar",
              "gameField": "RequireSquadmates",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require the unit to be on the same team as the source.",
              "guard": "SetRequireSquadmates"
            },
            {
              "config": "RequireWithinRange",
              "type": "bool",
              "kind": "scalar",
              "gameField": "RequireWithinRange",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require the unit to be within WithinRange of the source.",
              "guard": "SetRequireWithinRange"
            },
            {
              "config": "RequireWithinMinRange",
              "type": "bool",
              "kind": "scalar",
              "gameField": "RequireWithinMinRange",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require the unit to be within WithinMinRange of the source.",
              "guard": "SetRequireWithinMinRange"
            },
            {
              "config": "BeingCarriedBySource",
              "type": "bool",
              "kind": "scalar",
              "gameField": "BeingCarriedBySource",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require a unit currently carried by the source.",
              "guard": "SetBeingCarriedBySource"
            },
            {
              "config": "RequireUnitSelectedFromHQ",
              "type": "bool",
              "kind": "scalar",
              "gameField": "RequireUnitSelectedFromHQ",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require a unit that was selected from Headquarters for the mission. XCOM only.",
              "guard": "SetRequireUnitSelectedFromHQ"
            },
            {
              "config": "FailOnNonUnits",
              "type": "bool",
              "kind": "scalar",
              "gameField": "FailOnNonUnits",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Fail with AA_NotAUnit on non-unit targets instead of passing them through.",
              "guard": "SetFailOnNonUnits"
            },
            {
              "config": "MinRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "MinRank",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Lowest soldier rank allowed.",
              "guard": "SetMinRank"
            },
            {
              "config": "MaxRank",
              "type": "int",
              "kind": "scalar",
              "gameField": "MaxRank",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Highest soldier rank allowed.",
              "guard": "SetMaxRank"
            },
            {
              "config": "WithinRange",
              "type": "float",
              "kind": "scalar",
              "gameField": "WithinRange",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Maximum distance between source and target, in Unreal units. A tile is 96.",
              "guard": "SetWithinRange"
            },
            {
              "config": "WithinMinRange",
              "type": "float",
              "kind": "scalar",
              "gameField": "WithinMinRange",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Distance for the minimum-range check, in Unreal units. A tile is 96.",
              "guard": "SetWithinMinRange"
            },
            {
              "config": "ExcludeSoldierClasses",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "ExcludeSoldierClasses",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Soldier classes that reject the unit. Non-soldiers always pass.",
              "modeField": "ExcludeSoldierClassesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "RequireSoldierClasses",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "RequireSoldierClasses",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Soldier classes the unit must be one of, when non-empty. Non-soldiers always fail.",
              "modeField": "RequireSoldierClassesMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_UnitStatCheck",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_UnitStatCheck",
          "catchAll": false,
          "fields": [
            {
              "config": "CheckStats",
              "type": "array<CheckStat>",
              "kind": "namearray",
              "gameField": "m_aCheckStats",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Stat checks that must all pass: the stat, the value check, and whether to compare as a percentage of the stat's maximum.",
              "modeField": "CheckStatsMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_UnitType",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_UnitType",
          "catchAll": false,
          "fields": [
            {
              "config": "IncludeTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "IncludeTypes",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Character groups the unit must belong to, when non-empty. Takes precedence over ExcludeTypes.",
              "modeField": "IncludeTypesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "ExcludeTypes",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "ExcludeTypes",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Character groups that reject the unit. Ignored while IncludeTypes is non-empty.",
              "modeField": "ExcludeTypesMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_UnitValue",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_UnitValue",
          "catchAll": false,
          "fields": [
            {
              "config": "CheckValues",
              "type": "array<CheckValue>",
              "kind": "namearray",
              "gameField": "m_aCheckValues",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Unit value checks that must all pass: the value name, the value check, and an optional failure code to return instead of the default.",
              "modeField": "CheckValuesMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_Visibility",
          "extends": "X2AbilityConditionEditor_Base",
          "gameClass": "X2Condition_Visibility",
          "catchAll": false,
          "fields": [
            {
              "config": "NoEnemyViewers",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bNoEnemyViewers",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Fail when any enemy can see the target.",
              "guard": "SetNoEnemyViewers"
            },
            {
              "config": "RequireMatchCoverType",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRequireMatchCoverType",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require the target to be in the cover type given by TargetCover.",
              "guard": "SetRequireMatchCoverType"
            },
            {
              "config": "RequireNotMatchCoverType",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRequireNotMatchCoverType",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require the target not to be in the cover type given by TargetCover.",
              "guard": "SetRequireNotMatchCoverType"
            },
            {
              "config": "TargetCover",
              "type": "ECoverType",
              "kind": "scalar",
              "gameField": "TargetCover",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Cover type used by RequireMatchCoverType and RequireNotMatchCoverType.",
              "guard": "SetTargetCover"
            },
            {
              "config": "CannotPeek",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bCannotPeek",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require the shooter to see the target from its own tile, without peeking.",
              "guard": "SetCannotPeek"
            },
            {
              "config": "RequireLOS",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRequireLOS",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require line of sight.",
              "guard": "SetRequireLOS"
            },
            {
              "config": "RequireBasicVisibility",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRequireBasicVisibility",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require line of sight and range.",
              "guard": "SetRequireBasicVisibility"
            },
            {
              "config": "RequireGameplayVisible",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRequireGameplayVisible",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Require line of sight, range and the situational gameplay-visibility rules.",
              "guard": "SetRequireGameplayVisible"
            },
            {
              "config": "AllowSquadsight",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowSquadsight",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Accept any squadmate's view of the target if the unit has Squadsight. Overrides RequireGameplayVisible.",
              "guard": "SetAllowSquadsight"
            },
            {
              "config": "ActAsSquadsight",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bActAsSquadsight",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Accept any squadmate's view of the target whether or not the unit has Squadsight. Overrides RequireGameplayVisible.",
              "guard": "SetActAsSquadsight"
            },
            {
              "config": "VisibleToAnyAlly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bVisibleToAnyAlly",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Accept the target when any squadmate can see it, without line of sight from the unit itself. Overrides RequireGameplayVisible.",
              "guard": "SetVisibleToAnyAlly"
            },
            {
              "config": "DisablePeeksOnMovement",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDisablePeeksOnMovement",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Forbid peeking once the target has moved.",
              "guard": "SetDisablePeeksOnMovement"
            },
            {
              "config": "ExcludeGameplayVisible",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bExcludeGameplayVisible",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Fail when the target has gameplay visibility of the source.",
              "guard": "SetExcludeGameplayVisible"
            },
            {
              "config": "RequireGameplayVisibleTags",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "RequireGameplayVisibleTags",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Visibility tags that must be present on the visibility info, such as concealed or stealthed.",
              "modeField": "RequireGameplayVisibleTagsMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityConditionEditor_Base",
          "extends": "X2AbilityConditionEditor",
          "gameClass": null,
          "catchAll": true,
          "fields": []
        }
      ]
    },
    {
      "name": "ToHitCalc",
      "configKey": "ToHitCalc",
      "editStruct": "ToHitCalcEdit",
      "wired": true,
      "dispatchOrder": [
        "X2AbilityToHitCalcEditor_StatCheck_UnitVsUnit",
        "X2AbilityToHitCalcEditor_PercentChancePlusFocus",
        "X2AbilityToHitCalcEditor_PercentChanceWithBuddyZone",
        "X2AbilityToHitCalcEditor_StandardAim",
        "X2AbilityToHitCalcEditor_PercentChance",
        "X2AbilityToHitCalcEditor_Hacking",
        "X2AbilityToHitCalcEditor_RollStat",
        "X2AbilityToHitCalcEditor_RollStatTiers",
        "X2AbilityToHitCalcEditor_StatCheck",
        "X2AbilityToHitCalcEditor_Base"
      ],
      "intro": "Edits the template's to-hit calculation. Two slots exist: `ToHitCalc` (`Template.AbilityToHitCalc`) and `ToHitOwnerOnMissCalc` (`Template.AbilityToHitOwnerOnMissCalc`), both taking a `ToHitCalcEdit` block. With `Class` **omitted**, the existing calc is edited **in place**; with `Class` set, the existing calc is edited in place when it is already exactly that class, otherwise it is **replaced** by a new instance (unset fields then take class defaults). Classes without a dedicated editor below (e.g. `X2AbilityToHitCalc_StandardMelee`, `X2AbilityToHitCalc_DeadEye`) are still valid `Class` values - they get the fields of their nearest listed ancestor.",
      "editors": [
        {
          "class": "X2AbilityToHitCalcEditor_StatCheck_UnitVsUnit",
          "extends": "X2AbilityToHitCalcEditor_StatCheck",
          "gameClass": "X2AbilityToHitCalc_StatCheck_UnitVsUnit",
          "catchAll": false,
          "fields": [
            {
              "config": "HitModifiers",
              "type": "array<ShotModifierInfo>",
              "kind": "namearray",
              "gameField": "HitModifiers",
              "origin": "base",
              "inheritedFrom": "X2AbilityToHitCalcEditor",
              "description": "Replace-only: when non-empty, replaces the calc's HitModifiers array entirely",
              "replaceOnly": true
            },
            {
              "config": "AttackerStat",
              "type": "ECharStatType",
              "kind": "scalar",
              "gameField": "AttackerStat",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Attacker's stat in a unit-versus-unit contest.",
              "guard": "SetAttackerStat"
            },
            {
              "config": "DefenderStat",
              "type": "ECharStatType",
              "kind": "scalar",
              "gameField": "DefenderStat",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Defender's stat in a unit-versus-unit contest.",
              "guard": "SetDefenderStat"
            },
            {
              "config": "BaseValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "BaseValue",
              "origin": "derived",
              "inheritedFrom": "X2AbilityToHitCalcEditor_StatCheck",
              "description": "Base value the stat contest is measured against.",
              "guard": "SetBaseValue"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityToHitCalcEditor_PercentChancePlusFocus",
          "extends": "X2AbilityToHitCalcEditor_PercentChance",
          "gameClass": "X2AbilityToHitCalc_PercentChancePlusFocus",
          "catchAll": false,
          "fields": [
            {
              "config": "HitModifiers",
              "type": "array<ShotModifierInfo>",
              "kind": "namearray",
              "gameField": "HitModifiers",
              "origin": "base",
              "inheritedFrom": "X2AbilityToHitCalcEditor",
              "description": "Replace-only: when non-empty, replaces the calc's HitModifiers array entirely",
              "replaceOnly": true
            },
            {
              "config": "FocusMultiplier",
              "type": "int",
              "kind": "scalar",
              "gameField": "FocusMultiplier",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Percentage points added to the hit chance per point of Templar focus.",
              "guard": "SetFocusMultiplier"
            },
            {
              "config": "PercentToHit",
              "type": "int",
              "kind": "scalar",
              "gameField": "PercentToHit",
              "origin": "derived",
              "inheritedFrom": "X2AbilityToHitCalcEditor_PercentChance",
              "description": "Flat percentage chance to hit, ignoring aim entirely. For abilities whose odds are fixed rather than calculated.",
              "guard": "SetPercentToHit"
            },
            {
              "config": "NoGameStateOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bNoGameStateOnMiss",
              "origin": "derived",
              "inheritedFrom": "X2AbilityToHitCalcEditor_PercentChance",
              "description": "Produces no game state at all on a miss, so nothing is recorded or visualised.",
              "guard": "SetNoGameStateOnMiss"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityToHitCalcEditor_PercentChanceWithBuddyZone",
          "extends": "X2AbilityToHitCalcEditor_PercentChance",
          "gameClass": "X2AbilityToHitCalc_PercentChanceWithBuddyZone",
          "catchAll": false,
          "fields": [
            {
              "config": "HitModifiers",
              "type": "array<ShotModifierInfo>",
              "kind": "namearray",
              "gameField": "HitModifiers",
              "origin": "base",
              "inheritedFrom": "X2AbilityToHitCalcEditor",
              "description": "Replace-only: when non-empty, replaces the calc's HitModifiers array entirely",
              "replaceOnly": true
            },
            {
              "config": "PercentToHitInBuddyZone",
              "type": "int",
              "kind": "scalar",
              "gameField": "PercentToHitInBuddyZone",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Replaces PercentToHit when the target is inside the buddy zone.",
              "guard": "SetPercentToHitInBuddyZone"
            },
            {
              "config": "PercentToHit",
              "type": "int",
              "kind": "scalar",
              "gameField": "PercentToHit",
              "origin": "derived",
              "inheritedFrom": "X2AbilityToHitCalcEditor_PercentChance",
              "description": "Flat percentage chance to hit, ignoring aim entirely. For abilities whose odds are fixed rather than calculated.",
              "guard": "SetPercentToHit"
            },
            {
              "config": "NoGameStateOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bNoGameStateOnMiss",
              "origin": "derived",
              "inheritedFrom": "X2AbilityToHitCalcEditor_PercentChance",
              "description": "Produces no game state at all on a miss, so nothing is recorded or visualised.",
              "guard": "SetNoGameStateOnMiss"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityToHitCalcEditor_StandardAim",
          "extends": "X2AbilityToHitCalcEditor_Base",
          "gameClass": "X2AbilityToHitCalc_StandardAim",
          "catchAll": false,
          "fields": [
            {
              "config": "HitModifiers",
              "type": "array<ShotModifierInfo>",
              "kind": "namearray",
              "gameField": "HitModifiers",
              "origin": "base",
              "inheritedFrom": "X2AbilityToHitCalcEditor",
              "description": "Replace-only: when non-empty, replaces the calc's HitModifiers array entirely",
              "replaceOnly": true
            },
            {
              "config": "IndirectFire",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIndirectFire",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Treats the attack as indirect, like a grenade: it always hits, though crit, dodge and armour mitigation still apply.",
              "guard": "SetIndirectFire"
            },
            {
              "config": "MeleeAttack",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bMeleeAttack",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Treats the attack as melee, which ignores cover and applies the intrinsic melee hit bonus.",
              "guard": "SetMeleeAttack"
            },
            {
              "config": "ReactionFire",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bReactionFire",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Treats the attack as reaction fire, which takes the reaction penalty and forgoes the flanking bonus.",
              "guard": "SetReactionFire"
            },
            {
              "config": "AllowCrit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowCrit",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Whether crits are built into the hit table at all. Turning it off makes the ability incapable of critting.",
              "guard": "SetAllowCrit"
            },
            {
              "config": "HitsAreCrits",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bHitsAreCrits",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Converts every successful hit into a crit after the roll is made.",
              "guard": "SetHitsAreCrits"
            },
            {
              "config": "MultiTargetOnly",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bMultiTargetOnly",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Guarantees success when the ability has no primary target, for abilities that only ever hit multi-targets.",
              "guard": "SetMultiTargetOnly"
            },
            {
              "config": "OnlyMultiHitWithSuccess",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bOnlyMultiHitWithSuccess",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Multi-target hits only land if the roll succeeded, as with Faceoff.",
              "guard": "SetOnlyMultiHitWithSuccess"
            },
            {
              "config": "GuaranteedHit",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bGuaranteedHit",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Always hits, skipping the normal hit modifiers. Armour mitigation still rolls.",
              "guard": "SetGuaranteedHit"
            },
            {
              "config": "IgnoreCoverBonus",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnoreCoverBonus",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Ignores the target's high and low cover bonuses.",
              "guard": "SetIgnoreCoverBonus"
            },
            {
              "config": "FinalMultiplier",
              "type": "float",
              "kind": "scalar",
              "gameField": "FinalMultiplier",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Scales the final hit chance after everything else. Appears in the shot breakdown attributed to the ability.",
              "guard": "SetFinalMultiplier"
            },
            {
              "config": "BuiltInHitMod",
              "type": "int",
              "kind": "scalar",
              "gameField": "BuiltInHitMod",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Flat aim modifier the ability always carries.",
              "guard": "SetBuiltInHitMod"
            },
            {
              "config": "BuiltInCritMod",
              "type": "int",
              "kind": "scalar",
              "gameField": "BuiltInCritMod",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Flat crit modifier the ability always carries.",
              "guard": "SetBuiltInCritMod"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "SHOULD_ENABLE_PENALTY_ON_ANGLE_TO_EXTENDED_HIGH_COVER",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "SHOULD_DISABLE_BONUS_ON_ANGLE_TO_EXTENDED_LOW_COVER",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "MAX_TILE_DISTANCE_TO_COVER",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "MIN_ANGLE_TO_COVER",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "MAX_ANGLE_TO_COVER",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "MIN_ANGLE_BONUS_MOD",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "MAX_ANGLE_BONUS_MOD",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "MIN_ANGLE_PENALTY",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "MAX_ANGLE_PENALTY",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "LOW_COVER_BONUS",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "HIGH_COVER_BONUS",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "MP_FLANKING_CRIT_BONUS",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "MELEE_HIT_BONUS",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "SQUADSIGHT_CRIT_MOD",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "SQUADSIGHT_DISTANCE_MOD",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "REACTION_FINALMOD",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "REACTION_DASHING_FINALMOD",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "NormalSquadSize",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "ReasonableShotMinimumToEnableAimAssist",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "MaxAimAssistScore",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "BaseXComHitChanceModifier",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "MissStreakChanceAdjustment",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "HitStreakChanceAdjustment",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "SoldiersLostXComHitChanceAdjustment",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "SoldiersLostAlienHitChanceAdjustment",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "AlienVsTheLostHitChanceAdjustment",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "TheLostVsAlienHitChanceAdjustment",
              "reason": "config &mdash; tune it in the game's own ini"
            },
            {
              "name": "CritUpgradesThatDontUseEffects",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityToHitCalcEditor_PercentChance",
          "extends": "X2AbilityToHitCalcEditor_Base",
          "gameClass": "X2AbilityToHitCalc_PercentChance",
          "catchAll": false,
          "fields": [
            {
              "config": "HitModifiers",
              "type": "array<ShotModifierInfo>",
              "kind": "namearray",
              "gameField": "HitModifiers",
              "origin": "base",
              "inheritedFrom": "X2AbilityToHitCalcEditor",
              "description": "Replace-only: when non-empty, replaces the calc's HitModifiers array entirely",
              "replaceOnly": true
            },
            {
              "config": "PercentToHit",
              "type": "int",
              "kind": "scalar",
              "gameField": "PercentToHit",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Flat percentage chance to hit, ignoring aim entirely. For abilities whose odds are fixed rather than calculated.",
              "guard": "SetPercentToHit"
            },
            {
              "config": "NoGameStateOnMiss",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bNoGameStateOnMiss",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Produces no game state at all on a miss, so nothing is recorded or visualised.",
              "guard": "SetNoGameStateOnMiss"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityToHitCalcEditor_Hacking",
          "extends": "X2AbilityToHitCalcEditor_Base",
          "gameClass": "X2AbilityToHitCalc_Hacking",
          "catchAll": false,
          "fields": [
            {
              "config": "HitModifiers",
              "type": "array<ShotModifierInfo>",
              "kind": "namearray",
              "gameField": "HitModifiers",
              "origin": "base",
              "inheritedFrom": "X2AbilityToHitCalcEditor",
              "description": "Replace-only: when non-empty, replaces the calc's HitModifiers array entirely",
              "replaceOnly": true
            },
            {
              "config": "AlwaysSucceed",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAlwaysSucceed",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Makes the hack always succeed.",
              "guard": "SetAlwaysSucceed"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "SKULLJACK_HACKING_BONUS",
              "reason": "config &mdash; tune it in the game's own ini"
            }
          ]
        },
        {
          "class": "X2AbilityToHitCalcEditor_RollStat",
          "extends": "X2AbilityToHitCalcEditor_Base",
          "gameClass": "X2AbilityToHitCalc_RollStat",
          "catchAll": false,
          "fields": [
            {
              "config": "HitModifiers",
              "type": "array<ShotModifierInfo>",
              "kind": "namearray",
              "gameField": "HitModifiers",
              "origin": "base",
              "inheritedFrom": "X2AbilityToHitCalcEditor",
              "description": "Replace-only: when non-empty, replaces the calc's HitModifiers array entirely",
              "replaceOnly": true
            },
            {
              "config": "StatToRoll",
              "type": "ECharStatType",
              "kind": "scalar",
              "gameField": "StatToRoll",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Which unit stat the roll is made against.",
              "guard": "SetStatToRoll"
            },
            {
              "config": "BaseChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "BaseChance",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Base percentage before the stat is taken into account.",
              "guard": "SetBaseChance"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityToHitCalcEditor_RollStatTiers",
          "extends": "X2AbilityToHitCalcEditor_Base",
          "gameClass": "X2AbilityToHitCalc_RollStatTiers",
          "catchAll": false,
          "fields": [
            {
              "config": "HitModifiers",
              "type": "array<ShotModifierInfo>",
              "kind": "namearray",
              "gameField": "HitModifiers",
              "origin": "base",
              "inheritedFrom": "X2AbilityToHitCalcEditor",
              "description": "Replace-only: when non-empty, replaces the calc's HitModifiers array entirely",
              "replaceOnly": true
            },
            {
              "config": "StatToRoll",
              "type": "ECharStatType",
              "kind": "scalar",
              "gameField": "StatToRoll",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Which unit stat the roll is made against.",
              "guard": "SetStatToRoll"
            }
          ],
          "abstract": false,
          "notEditable": [
            {
              "name": "StatContestTiers",
              "reason": "private/protected"
            }
          ]
        },
        {
          "class": "X2AbilityToHitCalcEditor_StatCheck",
          "extends": "X2AbilityToHitCalcEditor_Base",
          "gameClass": "X2AbilityToHitCalc_StatCheck",
          "catchAll": false,
          "fields": [
            {
              "config": "HitModifiers",
              "type": "array<ShotModifierInfo>",
              "kind": "namearray",
              "gameField": "HitModifiers",
              "origin": "base",
              "inheritedFrom": "X2AbilityToHitCalcEditor",
              "description": "Replace-only: when non-empty, replaces the calc's HitModifiers array entirely",
              "replaceOnly": true
            },
            {
              "config": "BaseValue",
              "type": "int",
              "kind": "scalar",
              "gameField": "BaseValue",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Base value the stat contest is measured against.",
              "guard": "SetBaseValue"
            }
          ],
          "abstract": true,
          "notEditable": []
        },
        {
          "class": "X2AbilityToHitCalcEditor_Base",
          "extends": "X2AbilityToHitCalcEditor",
          "gameClass": null,
          "catchAll": true,
          "fields": [
            {
              "config": "HitModifiers",
              "type": "array<ShotModifierInfo>",
              "kind": "namearray",
              "gameField": "HitModifiers",
              "origin": "base",
              "inheritedFrom": "X2AbilityToHitCalcEditor",
              "description": "Replace-only: when non-empty, replaces the calc's HitModifiers array entirely",
              "replaceOnly": true
            }
          ]
        }
      ]
    },
    {
      "name": "TargetStyle",
      "configKey": "TargetStyle",
      "editStruct": "TargetStyleEdit",
      "wired": true,
      "dispatchOrder": [
        "X2AbilityTargetStyleEditor_MovingMelee",
        "X2AbilityTargetStyleEditor_Single",
        "X2AbilityTargetStyleEditor_Cursor",
        "X2AbilityTargetStyleEditor_Base"
      ],
      "intro": "Edits `Template.AbilityTargetStyle` (how the ability picks its primary target). Same in-place/replace semantics as `ToHitCalc`. Field-less styles (`X2AbilityTarget_Self`, `X2AbilityTarget_Path`, ...) are valid `Class` values for swapping the style.",
      "editors": [
        {
          "class": "X2AbilityTargetStyleEditor_MovingMelee",
          "extends": "X2AbilityTargetStyleEditor_Single",
          "gameClass": "X2AbilityTarget_MovingMelee",
          "catchAll": false,
          "fields": [
            {
              "config": "MovementRangeAdjustment",
              "type": "int",
              "kind": "scalar",
              "gameField": "MovementRangeAdjustment",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Tiles added to or removed from how far the unit may move to reach a melee target.",
              "guard": "SetMovementRangeAdjustment"
            },
            {
              "config": "OnlyIncludeTargetsInsideWeaponRange",
              "type": "bool",
              "kind": "scalar",
              "gameField": "OnlyIncludeTargetsInsideWeaponRange",
              "origin": "derived",
              "inheritedFrom": "X2AbilityTargetStyleEditor_Single",
              "description": "Excludes targets beyond the weapon's range from selection.",
              "guard": "SetOnlyIncludeTargetsInsideWeaponRange"
            },
            {
              "config": "AllowInteractiveObjects",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowInteractiveObjects",
              "origin": "derived",
              "inheritedFrom": "X2AbilityTargetStyleEditor_Single",
              "description": "Lets the ability target interactive objects such as doors and consoles.",
              "guard": "SetAllowInteractiveObjects"
            },
            {
              "config": "AllowDestructibleObjects",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowDestructibleObjects",
              "origin": "derived",
              "inheritedFrom": "X2AbilityTargetStyleEditor_Single",
              "description": "Lets the ability target destructible scenery.",
              "guard": "SetAllowDestructibleObjects"
            },
            {
              "config": "IncludeSelf",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIncludeSelf",
              "origin": "derived",
              "inheritedFrom": "X2AbilityTargetStyleEditor_Single",
              "description": "Lets the user target itself.",
              "guard": "SetIncludeSelf"
            },
            {
              "config": "ShowAOE",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowAOE",
              "origin": "derived",
              "inheritedFrom": "X2AbilityTargetStyleEditor_Single",
              "description": "Draws the area-of-effect preview while aiming.",
              "guard": "SetShowAOE"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityTargetStyleEditor_Single",
          "extends": "X2AbilityTargetStyleEditor_Base",
          "gameClass": "X2AbilityTarget_Single",
          "catchAll": false,
          "fields": [
            {
              "config": "OnlyIncludeTargetsInsideWeaponRange",
              "type": "bool",
              "kind": "scalar",
              "gameField": "OnlyIncludeTargetsInsideWeaponRange",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Excludes targets beyond the weapon's range from selection.",
              "guard": "SetOnlyIncludeTargetsInsideWeaponRange"
            },
            {
              "config": "AllowInteractiveObjects",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowInteractiveObjects",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Lets the ability target interactive objects such as doors and consoles.",
              "guard": "SetAllowInteractiveObjects"
            },
            {
              "config": "AllowDestructibleObjects",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowDestructibleObjects",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Lets the ability target destructible scenery.",
              "guard": "SetAllowDestructibleObjects"
            },
            {
              "config": "IncludeSelf",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIncludeSelf",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Lets the user target itself.",
              "guard": "SetIncludeSelf"
            },
            {
              "config": "ShowAOE",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bShowAOE",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Draws the area-of-effect preview while aiming.",
              "guard": "SetShowAOE"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityTargetStyleEditor_Cursor",
          "extends": "X2AbilityTargetStyleEditor_Base",
          "gameClass": "X2AbilityTarget_Cursor",
          "catchAll": false,
          "fields": [
            {
              "config": "RestrictToWeaponRange",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRestrictToWeaponRange",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Limits the cursor to the weapon's range.",
              "guard": "SetRestrictToWeaponRange"
            },
            {
              "config": "IncreaseWeaponRange",
              "type": "int",
              "kind": "scalar",
              "gameField": "IncreaseWeaponRange",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Extra range in tiles beyond the weapon's own, when restricted to weapon range.",
              "guard": "SetIncreaseWeaponRange"
            },
            {
              "config": "RestrictToSquadsightRange",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRestrictToSquadsightRange",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Limits the cursor to squadsight range rather than the weapon's.",
              "guard": "SetRestrictToSquadsightRange"
            },
            {
              "config": "FixedAbilityRange",
              "type": "int",
              "kind": "scalar",
              "gameField": "FixedAbilityRange",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Fixed range in tiles, ignoring the weapon entirely.",
              "guard": "SetFixedAbilityRange"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityTargetStyleEditor_Base",
          "extends": "X2AbilityTargetStyleEditor",
          "gameClass": null,
          "catchAll": true,
          "fields": []
        }
      ]
    },
    {
      "name": "MultiTargetStyle",
      "configKey": "MultiTargetStyle",
      "editStruct": "MultiTargetStyleEdit",
      "wired": true,
      "dispatchOrder": [
        "X2AbilityMultiTargetStyleEditor_Cone",
        "X2AbilityMultiTargetStyleEditor_Cylinder",
        "X2AbilityMultiTargetStyleEditor_AllUnits",
        "X2AbilityMultiTargetStyleEditor_ClaymoreRadius",
        "X2AbilityMultiTargetStyleEditor_Radius",
        "X2AbilityMultiTargetStyleEditor_Line",
        "X2AbilityMultiTargetStyleEditor_BurstFire",
        "X2AbilityMultiTargetStyleEditor_Base"
      ],
      "intro": "Edits the template's multi-target styles. Two slots exist: `MultiTargetStyle` (`Template.AbilityMultiTargetStyle`) and `PassiveAOEStyle` (`Template.AbilityPassiveAOEStyle`), both taking a `MultiTargetStyleEdit` block. Same in-place/replace semantics as `ToHitCalc`.",
      "editors": [
        {
          "class": "X2AbilityMultiTargetStyleEditor_Cone",
          "extends": "X2AbilityMultiTargetStyleEditor_Radius",
          "gameClass": "X2AbilityMultiTarget_Cone",
          "catchAll": false,
          "fields": [
            {
              "config": "AllowSameTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowSameTarget",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Lets the primary target also be picked up as a multi-target.",
              "guard": "SetAllowSameTarget"
            },
            {
              "config": "UseSourceWeaponLocation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourceWeaponLocation",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Measures the area from the shooter's weapon rather than the unit.",
              "guard": "SetUseSourceWeaponLocation"
            },
            {
              "config": "NumTargetsRequired",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumTargetsRequired",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Minimum targets that must be in the area for the ability to be usable.",
              "guard": "SetNumTargetsRequired"
            },
            {
              "config": "ConeEndDiameter",
              "type": "float",
              "kind": "scalar",
              "gameField": "ConeEndDiameter",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Width of the cone at its far end, in metres.",
              "guard": "SetConeEndDiameter"
            },
            {
              "config": "ConeLength",
              "type": "float",
              "kind": "scalar",
              "gameField": "ConeLength",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "How far the cone reaches, in metres.",
              "guard": "SetConeLength"
            },
            {
              "config": "UseWeaponRangeForLength",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseWeaponRangeForLength",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Takes the cone's length from the weapon's range instead of ConeLength.",
              "guard": "SetUseWeaponRangeForLength"
            },
            {
              "config": "LockShooterZ",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bLockShooterZ",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Restricts the cone to tiles at the shooter's own height, so it does not spread up or down floors.",
              "guard": "SetLockShooterZ"
            },
            {
              "config": "AbilityBonusCones",
              "type": "array<AbilityGrantedBonusCone>",
              "kind": "namearray",
              "gameField": "AbilityBonusCones",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Extra cone length and width granted by a particular ability, merged by RequiredAbility.",
              "modeField": "AbilityBonusConesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "UseWeaponRadius",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseWeaponRadius",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Takes the radius from the weapon. TargetRadius is then added on top.",
              "guard": "SetUseWeaponRadius"
            },
            {
              "config": "UseWeaponBlockingCoverFlag",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseWeaponBlockingCoverFlag",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Takes the weapon's setting for whether cover blocks the area.",
              "guard": "SetUseWeaponBlockingCoverFlag"
            },
            {
              "config": "IgnoreBlockingCover",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnoreBlockingCover",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Lets the area pass through cover that would otherwise block it.",
              "guard": "SetIgnoreBlockingCover"
            },
            {
              "config": "TargetRadius",
              "type": "float",
              "kind": "scalar",
              "gameField": "fTargetRadius",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Radius of the area in metres. Added to the weapon's radius when UseWeaponRadius is set.",
              "guard": "SetTargetRadius"
            },
            {
              "config": "TargetCoveragePercentage",
              "type": "float",
              "kind": "scalar",
              "gameField": "fTargetCoveragePercentage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "How much of a tile the area must cover before that tile counts as affected.",
              "guard": "SetTargetCoveragePercentage"
            },
            {
              "config": "AddPrimaryTargetAsMultiTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAddPrimaryTargetAsMultiTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Moves the primary target into the multi-target list, so it is treated as part of the area rather than separately.",
              "guard": "SetAddPrimaryTargetAsMultiTarget"
            },
            {
              "config": "AllowDeadMultiTargetUnits",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowDeadMultiTargetUnits",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Includes already-dead units in the area.",
              "guard": "SetAllowDeadMultiTargetUnits"
            },
            {
              "config": "ExcludeSelfAsTargetIfWithinRadius",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bExcludeSelfAsTargetIfWithinRadius",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Leaves the user out of its own area of effect.",
              "guard": "SetExcludeSelfAsTargetIfWithinRadius"
            },
            {
              "config": "AbilityBonusRadii",
              "type": "array<AbilityGrantedBonusRadius>",
              "kind": "namearray",
              "gameField": "AbilityBonusRadii",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Extra radius granted when the unit has a particular ability, merged by RequiredAbility. Lets a perk widen the blast without a separate ability.",
              "modeField": "AbilityBonusRadiiMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityMultiTargetStyleEditor_Cylinder",
          "extends": "X2AbilityMultiTargetStyleEditor_Radius",
          "gameClass": "X2AbilityMultiTarget_Cylinder",
          "catchAll": false,
          "fields": [
            {
              "config": "AllowSameTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowSameTarget",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Lets the primary target also be picked up as a multi-target.",
              "guard": "SetAllowSameTarget"
            },
            {
              "config": "UseSourceWeaponLocation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourceWeaponLocation",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Measures the area from the shooter's weapon rather than the unit.",
              "guard": "SetUseSourceWeaponLocation"
            },
            {
              "config": "NumTargetsRequired",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumTargetsRequired",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Minimum targets that must be in the area for the ability to be usable.",
              "guard": "SetNumTargetsRequired"
            },
            {
              "config": "TargetHeight",
              "type": "float",
              "kind": "scalar",
              "gameField": "fTargetHeight",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Height of the cylinder in metres.",
              "guard": "SetTargetHeight"
            },
            {
              "config": "UseOnlyGroundTiles",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseOnlyGroundTiles",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Restricts the cylinder to ground-level tiles.",
              "guard": "SetUseOnlyGroundTiles"
            },
            {
              "config": "UseWeaponRadius",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseWeaponRadius",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Takes the radius from the weapon. TargetRadius is then added on top.",
              "guard": "SetUseWeaponRadius"
            },
            {
              "config": "UseWeaponBlockingCoverFlag",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseWeaponBlockingCoverFlag",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Takes the weapon's setting for whether cover blocks the area.",
              "guard": "SetUseWeaponBlockingCoverFlag"
            },
            {
              "config": "IgnoreBlockingCover",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnoreBlockingCover",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Lets the area pass through cover that would otherwise block it.",
              "guard": "SetIgnoreBlockingCover"
            },
            {
              "config": "TargetRadius",
              "type": "float",
              "kind": "scalar",
              "gameField": "fTargetRadius",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Radius of the area in metres. Added to the weapon's radius when UseWeaponRadius is set.",
              "guard": "SetTargetRadius"
            },
            {
              "config": "TargetCoveragePercentage",
              "type": "float",
              "kind": "scalar",
              "gameField": "fTargetCoveragePercentage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "How much of a tile the area must cover before that tile counts as affected.",
              "guard": "SetTargetCoveragePercentage"
            },
            {
              "config": "AddPrimaryTargetAsMultiTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAddPrimaryTargetAsMultiTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Moves the primary target into the multi-target list, so it is treated as part of the area rather than separately.",
              "guard": "SetAddPrimaryTargetAsMultiTarget"
            },
            {
              "config": "AllowDeadMultiTargetUnits",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowDeadMultiTargetUnits",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Includes already-dead units in the area.",
              "guard": "SetAllowDeadMultiTargetUnits"
            },
            {
              "config": "ExcludeSelfAsTargetIfWithinRadius",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bExcludeSelfAsTargetIfWithinRadius",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Leaves the user out of its own area of effect.",
              "guard": "SetExcludeSelfAsTargetIfWithinRadius"
            },
            {
              "config": "AbilityBonusRadii",
              "type": "array<AbilityGrantedBonusRadius>",
              "kind": "namearray",
              "gameField": "AbilityBonusRadii",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Extra radius granted when the unit has a particular ability, merged by RequiredAbility. Lets a perk widen the blast without a separate ability.",
              "modeField": "AbilityBonusRadiiMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityMultiTargetStyleEditor_AllUnits",
          "extends": "X2AbilityMultiTargetStyleEditor_Radius",
          "gameClass": "X2AbilityMultiTarget_AllUnits",
          "catchAll": false,
          "fields": [
            {
              "config": "AllowSameTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowSameTarget",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Lets the primary target also be picked up as a multi-target.",
              "guard": "SetAllowSameTarget"
            },
            {
              "config": "UseSourceWeaponLocation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourceWeaponLocation",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Measures the area from the shooter's weapon rather than the unit.",
              "guard": "SetUseSourceWeaponLocation"
            },
            {
              "config": "NumTargetsRequired",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumTargetsRequired",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Minimum targets that must be in the area for the ability to be usable.",
              "guard": "SetNumTargetsRequired"
            },
            {
              "config": "OnlyAllyOfType",
              "type": "name",
              "kind": "scalar",
              "gameField": "OnlyAllyOfType",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Restricts targeting to allies of this character type.",
              "guard": "SetOnlyAllyOfType"
            },
            {
              "config": "AcceptFriendlyUnits",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAcceptFriendlyUnits",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Includes friendly units.",
              "guard": "SetAcceptFriendlyUnits"
            },
            {
              "config": "AcceptEnemyUnits",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAcceptEnemyUnits",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Includes hostile units.",
              "guard": "SetAcceptEnemyUnits"
            },
            {
              "config": "OnlyAcceptRoboticUnits",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bOnlyAcceptRoboticUnits",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Restricts targeting to robotic units.",
              "guard": "SetOnlyAcceptRoboticUnits"
            },
            {
              "config": "OnlyAcceptAlienUnits",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bOnlyAcceptAlienUnits",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Restricts targeting to aliens.",
              "guard": "SetOnlyAcceptAlienUnits"
            },
            {
              "config": "OnlyAcceptAdventUnits",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bOnlyAcceptAdventUnits",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Restricts targeting to ADVENT units.",
              "guard": "SetOnlyAcceptAdventUnits"
            },
            {
              "config": "RandomlySelectOne",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bRandomlySelectOne",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Picks a single target at random from everything that qualified.",
              "guard": "SetRandomlySelectOne"
            },
            {
              "config": "DontAcceptNeutralUnits",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bDontAcceptNeutralUnits",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Leaves civilians and other neutrals out.",
              "guard": "SetDontAcceptNeutralUnits"
            },
            {
              "config": "RandomChance",
              "type": "int",
              "kind": "scalar",
              "gameField": "RandomChance",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Percentage chance each qualifying unit is actually included.",
              "guard": "SetRandomChance"
            },
            {
              "config": "UseAbilitySourceAsPrimaryTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseAbilitySourceAsPrimaryTarget",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Treats the ability's user as the primary target.",
              "guard": "SetUseAbilitySourceAsPrimaryTarget"
            },
            {
              "config": "UseWeaponRadius",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseWeaponRadius",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Takes the radius from the weapon. TargetRadius is then added on top.",
              "guard": "SetUseWeaponRadius"
            },
            {
              "config": "UseWeaponBlockingCoverFlag",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseWeaponBlockingCoverFlag",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Takes the weapon's setting for whether cover blocks the area.",
              "guard": "SetUseWeaponBlockingCoverFlag"
            },
            {
              "config": "IgnoreBlockingCover",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnoreBlockingCover",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Lets the area pass through cover that would otherwise block it.",
              "guard": "SetIgnoreBlockingCover"
            },
            {
              "config": "TargetRadius",
              "type": "float",
              "kind": "scalar",
              "gameField": "fTargetRadius",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Radius of the area in metres. Added to the weapon's radius when UseWeaponRadius is set.",
              "guard": "SetTargetRadius"
            },
            {
              "config": "TargetCoveragePercentage",
              "type": "float",
              "kind": "scalar",
              "gameField": "fTargetCoveragePercentage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "How much of a tile the area must cover before that tile counts as affected.",
              "guard": "SetTargetCoveragePercentage"
            },
            {
              "config": "AddPrimaryTargetAsMultiTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAddPrimaryTargetAsMultiTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Moves the primary target into the multi-target list, so it is treated as part of the area rather than separately.",
              "guard": "SetAddPrimaryTargetAsMultiTarget"
            },
            {
              "config": "AllowDeadMultiTargetUnits",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowDeadMultiTargetUnits",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Includes already-dead units in the area.",
              "guard": "SetAllowDeadMultiTargetUnits"
            },
            {
              "config": "ExcludeSelfAsTargetIfWithinRadius",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bExcludeSelfAsTargetIfWithinRadius",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Leaves the user out of its own area of effect.",
              "guard": "SetExcludeSelfAsTargetIfWithinRadius"
            },
            {
              "config": "AbilityBonusRadii",
              "type": "array<AbilityGrantedBonusRadius>",
              "kind": "namearray",
              "gameField": "AbilityBonusRadii",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Extra radius granted when the unit has a particular ability, merged by RequiredAbility. Lets a perk widen the blast without a separate ability.",
              "modeField": "AbilityBonusRadiiMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityMultiTargetStyleEditor_ClaymoreRadius",
          "extends": "X2AbilityMultiTargetStyleEditor_Radius",
          "gameClass": "X2AbilityMultiTarget_ClaymoreRadius",
          "catchAll": false,
          "fields": [
            {
              "config": "AllowSameTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowSameTarget",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Lets the primary target also be picked up as a multi-target.",
              "guard": "SetAllowSameTarget"
            },
            {
              "config": "UseSourceWeaponLocation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourceWeaponLocation",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Measures the area from the shooter's weapon rather than the unit.",
              "guard": "SetUseSourceWeaponLocation"
            },
            {
              "config": "NumTargetsRequired",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumTargetsRequired",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Minimum targets that must be in the area for the ability to be usable.",
              "guard": "SetNumTargetsRequired"
            },
            {
              "config": "ClaymoreEnvironmentalDamage",
              "type": "int",
              "kind": "scalar",
              "gameField": "ClaymoreEnvironmentalDamage",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Environmental damage the claymore blast does to scenery.",
              "guard": "SetClaymoreEnvironmentalDamage"
            },
            {
              "config": "UseWeaponRadius",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseWeaponRadius",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Takes the radius from the weapon. TargetRadius is then added on top.",
              "guard": "SetUseWeaponRadius"
            },
            {
              "config": "UseWeaponBlockingCoverFlag",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseWeaponBlockingCoverFlag",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Takes the weapon's setting for whether cover blocks the area.",
              "guard": "SetUseWeaponBlockingCoverFlag"
            },
            {
              "config": "IgnoreBlockingCover",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnoreBlockingCover",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Lets the area pass through cover that would otherwise block it.",
              "guard": "SetIgnoreBlockingCover"
            },
            {
              "config": "TargetRadius",
              "type": "float",
              "kind": "scalar",
              "gameField": "fTargetRadius",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Radius of the area in metres. Added to the weapon's radius when UseWeaponRadius is set.",
              "guard": "SetTargetRadius"
            },
            {
              "config": "TargetCoveragePercentage",
              "type": "float",
              "kind": "scalar",
              "gameField": "fTargetCoveragePercentage",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "How much of a tile the area must cover before that tile counts as affected.",
              "guard": "SetTargetCoveragePercentage"
            },
            {
              "config": "AddPrimaryTargetAsMultiTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAddPrimaryTargetAsMultiTarget",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Moves the primary target into the multi-target list, so it is treated as part of the area rather than separately.",
              "guard": "SetAddPrimaryTargetAsMultiTarget"
            },
            {
              "config": "AllowDeadMultiTargetUnits",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowDeadMultiTargetUnits",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Includes already-dead units in the area.",
              "guard": "SetAllowDeadMultiTargetUnits"
            },
            {
              "config": "ExcludeSelfAsTargetIfWithinRadius",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bExcludeSelfAsTargetIfWithinRadius",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Leaves the user out of its own area of effect.",
              "guard": "SetExcludeSelfAsTargetIfWithinRadius"
            },
            {
              "config": "AbilityBonusRadii",
              "type": "array<AbilityGrantedBonusRadius>",
              "kind": "namearray",
              "gameField": "AbilityBonusRadii",
              "origin": "derived",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor_Radius",
              "description": "Extra radius granted when the unit has a particular ability, merged by RequiredAbility. Lets a perk widen the blast without a separate ability.",
              "modeField": "AbilityBonusRadiiMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityMultiTargetStyleEditor_Radius",
          "extends": "X2AbilityMultiTargetStyleEditor_Base",
          "gameClass": "X2AbilityMultiTarget_Radius",
          "catchAll": false,
          "fields": [
            {
              "config": "AllowSameTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowSameTarget",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Lets the primary target also be picked up as a multi-target.",
              "guard": "SetAllowSameTarget"
            },
            {
              "config": "UseSourceWeaponLocation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourceWeaponLocation",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Measures the area from the shooter's weapon rather than the unit.",
              "guard": "SetUseSourceWeaponLocation"
            },
            {
              "config": "NumTargetsRequired",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumTargetsRequired",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Minimum targets that must be in the area for the ability to be usable.",
              "guard": "SetNumTargetsRequired"
            },
            {
              "config": "UseWeaponRadius",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseWeaponRadius",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Takes the radius from the weapon. TargetRadius is then added on top.",
              "guard": "SetUseWeaponRadius"
            },
            {
              "config": "UseWeaponBlockingCoverFlag",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseWeaponBlockingCoverFlag",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Takes the weapon's setting for whether cover blocks the area.",
              "guard": "SetUseWeaponBlockingCoverFlag"
            },
            {
              "config": "IgnoreBlockingCover",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bIgnoreBlockingCover",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Lets the area pass through cover that would otherwise block it.",
              "guard": "SetIgnoreBlockingCover"
            },
            {
              "config": "TargetRadius",
              "type": "float",
              "kind": "scalar",
              "gameField": "fTargetRadius",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Radius of the area in metres. Added to the weapon's radius when UseWeaponRadius is set.",
              "guard": "SetTargetRadius"
            },
            {
              "config": "TargetCoveragePercentage",
              "type": "float",
              "kind": "scalar",
              "gameField": "fTargetCoveragePercentage",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "How much of a tile the area must cover before that tile counts as affected.",
              "guard": "SetTargetCoveragePercentage"
            },
            {
              "config": "AddPrimaryTargetAsMultiTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAddPrimaryTargetAsMultiTarget",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Moves the primary target into the multi-target list, so it is treated as part of the area rather than separately.",
              "guard": "SetAddPrimaryTargetAsMultiTarget"
            },
            {
              "config": "AllowDeadMultiTargetUnits",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowDeadMultiTargetUnits",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Includes already-dead units in the area.",
              "guard": "SetAllowDeadMultiTargetUnits"
            },
            {
              "config": "ExcludeSelfAsTargetIfWithinRadius",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bExcludeSelfAsTargetIfWithinRadius",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Leaves the user out of its own area of effect.",
              "guard": "SetExcludeSelfAsTargetIfWithinRadius"
            },
            {
              "config": "AbilityBonusRadii",
              "type": "array<AbilityGrantedBonusRadius>",
              "kind": "namearray",
              "gameField": "AbilityBonusRadii",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Extra radius granted when the unit has a particular ability, merged by RequiredAbility. Lets a perk widen the blast without a separate ability.",
              "modeField": "AbilityBonusRadiiMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityMultiTargetStyleEditor_Line",
          "extends": "X2AbilityMultiTargetStyleEditor_Base",
          "gameClass": "X2AbilityMultiTarget_Line",
          "catchAll": false,
          "fields": [
            {
              "config": "AllowSameTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowSameTarget",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Lets the primary target also be picked up as a multi-target.",
              "guard": "SetAllowSameTarget"
            },
            {
              "config": "UseSourceWeaponLocation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourceWeaponLocation",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Measures the area from the shooter's weapon rather than the unit.",
              "guard": "SetUseSourceWeaponLocation"
            },
            {
              "config": "NumTargetsRequired",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumTargetsRequired",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Minimum targets that must be in the area for the ability to be usable.",
              "guard": "SetNumTargetsRequired"
            },
            {
              "config": "TileWidthExtension",
              "type": "int",
              "kind": "scalar",
              "gameField": "TileWidthExtension",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Extra tiles of width added to the line.",
              "guard": "SetTileWidthExtension"
            },
            {
              "config": "SightRangeLimited",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bSightRangeLimited",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Stops the line at the limit of sight.",
              "guard": "SetSightRangeLimited"
            },
            {
              "config": "AbilityBonusWidths",
              "type": "array<AbilityGrantedBonusWidth>",
              "kind": "namearray",
              "gameField": "AbilityBonusWidths",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Extra line width granted by a particular ability, merged by RequiredAbility.",
              "modeField": "AbilityBonusWidthsMode",
              "modeEnum": "ENameArrayEditMode"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityMultiTargetStyleEditor_BurstFire",
          "extends": "X2AbilityMultiTargetStyleEditor_Base",
          "gameClass": "X2AbilityMultiTarget_BurstFire",
          "catchAll": false,
          "fields": [
            {
              "config": "AllowSameTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowSameTarget",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Lets the primary target also be picked up as a multi-target.",
              "guard": "SetAllowSameTarget"
            },
            {
              "config": "UseSourceWeaponLocation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourceWeaponLocation",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Measures the area from the shooter's weapon rather than the unit.",
              "guard": "SetUseSourceWeaponLocation"
            },
            {
              "config": "NumTargetsRequired",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumTargetsRequired",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Minimum targets that must be in the area for the ability to be usable.",
              "guard": "SetNumTargetsRequired"
            },
            {
              "config": "NumExtraShots",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumExtraShots",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Additional shots fired at the same target beyond the first.",
              "guard": "SetNumExtraShots"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityMultiTargetStyleEditor_Base",
          "extends": "X2AbilityMultiTargetStyleEditor",
          "gameClass": null,
          "catchAll": true,
          "fields": [
            {
              "config": "AllowSameTarget",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bAllowSameTarget",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Lets the primary target also be picked up as a multi-target.",
              "guard": "SetAllowSameTarget"
            },
            {
              "config": "UseSourceWeaponLocation",
              "type": "bool",
              "kind": "scalar",
              "gameField": "bUseSourceWeaponLocation",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Measures the area from the shooter's weapon rather than the unit.",
              "guard": "SetUseSourceWeaponLocation"
            },
            {
              "config": "NumTargetsRequired",
              "type": "int",
              "kind": "scalar",
              "gameField": "NumTargetsRequired",
              "origin": "base",
              "inheritedFrom": "X2AbilityMultiTargetStyleEditor",
              "description": "Minimum targets that must be in the area for the ability to be usable.",
              "guard": "SetNumTargetsRequired"
            }
          ]
        }
      ]
    },
    {
      "name": "Triggers",
      "configKey": "Triggers",
      "editStruct": "TriggerEdit",
      "wired": true,
      "dispatchOrder": [
        "X2AbilityTriggerEditor_DLC_Day60OnAbilityActivated",
        "X2AbilityTriggerEditor_UnitPostBeginPlay",
        "X2AbilityTriggerEditor_EventListener",
        "X2AbilityTriggerEditor_Event",
        "X2AbilityTriggerEditor_Base"
      ],
      "intro": "Edits the `AbilityTriggers` array of the template. The trigger of class `Class` is edited **in place** if present; otherwise behaviour depends on `Mode`. **Caveat:** adding a *new* `X2AbilityTrigger_EventListener` from config is rarely useful - its `ListenerData.EventFn` delegate can only be assigned in code and stays `none`. Editing an existing listener trigger preserves its `EventFn`. `X2AbilityTrigger_OnAbilityActivated` is handled by the EventListener editor (its `MatchAbilityActivated` field is protected and cannot be set). See also `AbilityEventListenerEdits` in the template fields for the separate `Template.AbilityEventListeners` array.",
      "editors": [
        {
          "class": "X2AbilityTriggerEditor_UnitPostBeginPlay",
          "extends": "X2AbilityTriggerEditor_Base",
          "gameClass": "X2AbilityTrigger_UnitPostBeginPlay",
          "catchAll": false,
          "fields": [
            {
              "config": "Priority",
              "type": "int",
              "kind": "scalar",
              "gameField": "Priority",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Order this trigger runs in relative to others on the same event. Lower runs first.",
              "guard": "SetPriority"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityTriggerEditor_EventListener",
          "extends": "X2AbilityTriggerEditor_Base",
          "gameClass": "X2AbilityTrigger_EventListener",
          "catchAll": false,
          "fields": [
            {
              "config": "ListenerEventID",
              "type": "name",
              "kind": "scalar",
              "gameField": "ListenerData.EventID",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Event this listener waits for. The handling function can only be assigned in code, so a listener added purely from config never fires - editing an existing one does.",
              "guard": "SetListenerEventID"
            },
            {
              "config": "ListenerDeferral",
              "type": "EventListenerDeferral",
              "kind": "scalar",
              "gameField": "ListenerData.Deferral",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "When the listener runs relative to the event being processed.",
              "guard": "SetListenerDeferral"
            },
            {
              "config": "ListenerFilter",
              "type": "AbilityEventFilter",
              "kind": "scalar",
              "gameField": "ListenerData.Filter",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Which units the event is accepted from, such as only the source or only the target.",
              "guard": "SetListenerFilter"
            },
            {
              "config": "ListenerPriority",
              "type": "int",
              "kind": "scalar",
              "gameField": "ListenerData.Priority",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Order among listeners for the same event.",
              "guard": "SetListenerPriority"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityTriggerEditor_Event",
          "extends": "X2AbilityTriggerEditor_Base",
          "gameClass": "X2AbilityTrigger_Event",
          "catchAll": false,
          "fields": [
            {
              "config": "MethodName",
              "type": "name",
              "kind": "scalar",
              "gameField": "MethodName",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Method on the observer class that the trigger calls.",
              "guard": "SetMethodName"
            },
            {
              "config": "EventObserverClass",
              "type": "string",
              "kind": "scalar",
              "gameField": "EventObserverClass",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Class that observes the event. Loaded by name at runtime.",
              "guard": "SetEventObserverClass"
            }
          ],
          "abstract": false,
          "notEditable": []
        },
        {
          "class": "X2AbilityTriggerEditor_Base",
          "extends": "X2AbilityTriggerEditor",
          "gameClass": null,
          "catchAll": true,
          "fields": []
        },
        {
          "class": "X2AbilityTriggerEditor_DLC_Day60OnAbilityActivated",
          "extends": "X2AbilityTriggerEditor_EventListener",
          "gameClass": "X2AbilityTrigger_DLC_Day60OnAbilityActivated",
          "catchAll": false,
          "fields": [
            {
              "config": "RulerActionExclusions_XComEffects",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "RulerActionExclusions_XComEffects",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Effects on the acting XCOM unit that stop the ruler from reacting.",
              "modeField": "RulerActionExclusions_XComEffectsMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "RulerActionExclusions_AbilityNames",
              "type": "array<name>",
              "kind": "namearray",
              "gameField": "RulerActionExclusions_AbilityNames",
              "origin": "derived",
              "inheritedFrom": null,
              "description": "Abilities whose activation never triggers a ruler reaction.",
              "modeField": "RulerActionExclusions_AbilityNamesMode",
              "modeEnum": "ENameArrayEditMode"
            },
            {
              "config": "ListenerEventID",
              "type": "name",
              "kind": "scalar",
              "gameField": "ListenerData.EventID",
              "origin": "derived",
              "inheritedFrom": "X2AbilityTriggerEditor_EventListener",
              "description": "Event this listener waits for. The handling function can only be assigned in code, so a listener added purely from config never fires - editing an existing one does.",
              "guard": "SetListenerEventID"
            },
            {
              "config": "ListenerDeferral",
              "type": "EventListenerDeferral",
              "kind": "scalar",
              "gameField": "ListenerData.Deferral",
              "origin": "derived",
              "inheritedFrom": "X2AbilityTriggerEditor_EventListener",
              "description": "When the listener runs relative to the event being processed.",
              "guard": "SetListenerDeferral"
            },
            {
              "config": "ListenerFilter",
              "type": "AbilityEventFilter",
              "kind": "scalar",
              "gameField": "ListenerData.Filter",
              "origin": "derived",
              "inheritedFrom": "X2AbilityTriggerEditor_EventListener",
              "description": "Which units the event is accepted from, such as only the source or only the target.",
              "guard": "SetListenerFilter"
            },
            {
              "config": "ListenerPriority",
              "type": "int",
              "kind": "scalar",
              "gameField": "ListenerData.Priority",
              "origin": "derived",
              "inheritedFrom": "X2AbilityTriggerEditor_EventListener",
              "description": "Order among listeners for the same event.",
              "guard": "SetListenerPriority"
            }
          ],
          "bridge": "AbilityEditorAlienHunters",
          "package": "DLC_2",
          "priority": 10,
          "registration": "ExtraTriggerEditors",
          "abstract": false,
          "notEditable": []
        }
      ]
    }
  ],
  "warnings": []
}
