GODFALL EXALTEDbuild 5.1.23-prod-stable
Home › Mechanics › Glossary

Glossary

Game terms in plain English: what you see in game, and what it means. Each entry quotes the game's own words. Open “How we know” for the detail and the files behind it.

Gear

Gold (yellow) trait lines Datamined

In game: Trait lines drawn in gold on a gear tooltip

A gold line is a trait that's stronger than a normal roll. It's gold for one of two reasons: an upgrade at the Forge improved it, or it's the item's Masterwork trait. An improved trait is worked out as if the item were 100 levels higher on the game's item scale, which is why gold numbers sit well above the usual range.

The Forge allows you to upgrade and enchant your equipment. Equipment can be upgraded up to five ranks, increasing its strength and adding new abilities. Enchant any item to promote its rarity, up to Legendary. Augments and Common items cannot be enchanted. The masterwork weapons wielded by the Valorian knights cannot be made through mundane processes. Only a special Forge can accommodate a Godsmith's Sacred Flame, but there aren’t many left capable of harnessing that power. Fortunately, the forge within the Seventh Sanctum is capable of upgrading and enchanting any equipment. Even the greatest creation of a Godsmith at any other forge can be improved upon in the Seventh's forge, provided the right resources.Codex: The ForgeAperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → localization → Codex.Resources.Forge.description
How we know

In more detail: Gold marks a trait that is stronger than a normal roll: either it was improved when the item was upgraded, or it is the item's Masterwork trait. Improved traits roll as if the item were many tiers higher (rule U1), which is why they sit well above the normal range.

Rules from the game's code: Gold (yellow) trait lines Datamined · Upgrade-improved traits Datamined · Masterwork trait Datamined

In the files:

trait field masterworkBonusTier (sent by the game with each item) (UI code, see C1)

craftingUpgrade.improvedTraitTierOffset: 100 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → craftingUpgrade)

Upgrade rank (the pips on gear) Datamined

In game: Hexagon pips at the top of a gear tooltip; upgrades are done at the Forge

Each pip is one upgrade at the Forge. Every upgrade makes the item's attribute number (the big Might, Spirit or Vitality number) a little bigger, as if the item were one level higher per upgrade. Upgrades also improve some traits, which then show in gold, and at rank 5 the item gains its Masterwork trait. Ranks 3 to 5 need a Rare or better item.

The Forge allows you to upgrade and enchant your equipment. Equipment can be upgraded up to five ranks, increasing its strength and adding new abilities. Enchant any item to promote its rarity, up to Legendary. Augments and Common items cannot be enchanted. The masterwork weapons wielded by the Valorian knights cannot be made through mundane processes. Only a special Forge can accommodate a Godsmith's Sacred Flame, but there aren’t many left capable of harnessing that power. Fortunately, the forge within the Seventh Sanctum is capable of upgrading and enchanting any equipment. Even the greatest creation of a Godsmith at any other forge can be improved upon in the Seventh's forge, provided the right resources.Codex: The ForgeAperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → localization → Codex.Resources.Forge.description
How we know

In more detail: Each upgrade rank raises the item's Primary Attribute as if the item were one tier higher per rank (rule U2), and improves traits (rule U1). At the top rank the item gains its Masterwork trait (rule U3). Higher ranks need a minimum rarity.

Rules from the game's code: Upgrade rank and the Primary Attribute Datamined · Upgrade-improved traits Datamined · Masterwork trait Datamined

In the files:

craftingUpgrade ranks: rank 1 · coreAttributeTierOffset 1 · minRarity 1
rank 2 · coreAttributeTierOffset 2 · minRarity 1
rank 3 · coreAttributeTierOffset 3 · minRarity 3
rank 4 · coreAttributeTierOffset 4 · minRarity 3
rank 5 · coreAttributeTierOffset 5 · minRarity 3 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → craftingUpgrade)

Masterwork trait Datamined

In game: An extra secondary line, always in gold, on fully upgraded gear

An extra trait, always drawn in gold, that an item gains when it reaches upgrade rank 5. Each item has its own list of possible Masterwork traits, shown on its page.

How we know

In more detail: Items have a Masterwork trait slot with its own pool (shown on each item page). The trait is chosen when the item reaches the upgrade rank in rule U3.

Rules from the game's code: Masterwork trait Datamined · Gold (yellow) trait lines Datamined

In the files:

traitSlot type 'Masterwork Trait' and its trait pool (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → traitSlot)

Awakened Datamined

In game: "Awakened Legendary …" on the tooltip; star-shaped trait bullets

What a Cursed item becomes once all of its objectives are done; the game announces it as “<item> AWAKENED”. An Awakened item keeps a stronger Primary Trait: × 2 for most numbers.

Cursed Items have negative traits instead of positive traits until they are Awakened. To Awaken a Cursed Item at the Forge, complete all of its objectives. Rarer items have more objectives to complete before they can be Awakened. Completing a Cursed Item objective will allow you to change a negative trait into a positive trait. Once you start a mission with a Cursed Item equipped you must wield it for the entire mission. Awakening will also reward you with a powerful consumable that can increase future loot rewards from Dark Tears.Codex: Cursed ItemsAperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → localization → Codex.Mechanics.CursedItems.description
{itemname} AWAKENEDTutorial textAperion/Content/Localization/Game/en/Game.locres → ST_Mission_Tutorial → Loot.Awakened
How we know

In more detail: An item mutation. A Cursed item becomes Awakened at the Forge once all its objectives are done. The mutation improves the primary trait through its own scaling multiplier.

In the files:

mutations → Mutation.Item.Awakened: numImprovedTraitSlotIndexes 1 · whitelistImprovedTraitSlotIndexes Primary Trait · canUpgrade true · canEnchant true · canSalvage true · canEquipInActivity true (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → mutations → Mutation.Item.Awakened)

itemScalingMultipliers → Item.Mutation.Awakened.PrimaryTrait.1 (sample columns): coreAttribute 2, 2 · coreAttributePercent 2, 2 · playerPower 2, 2 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → itemScalingMultipliers → Item.Mutation.Awakened.PrimaryTrait.1)

Cursed Datamined

In game: Cursed items with negative traits and objectives ("To lift curse")

A Cursed item drops with curses: one on a Rare item, two on an Epic, three on a Legendary. Each curse turns one Secondary Trait negative (drawn in purple) and weakens the Primary Trait a little, and each curse comes with an objective. Finish an objective and that curse lifts; finish them all and the item is Awakened. Cursed items can only be equipped in the Sanctum. The full rules are on the Cursed items page.

Cursed Items have negative traits instead of positive traits until they are Awakened. To Awaken a Cursed Item at the Forge, complete all of its objectives. Rarer items have more objectives to complete before they can be Awakened. Completing a Cursed Item objective will allow you to change a negative trait into a positive trait. Once you start a mission with a Cursed Item equipped you must wield it for the entire mission. Awakening will also reward you with a powerful consumable that can increase future loot rewards from Dark Tears.Codex: Cursed ItemsAperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → localization → Codex.Mechanics.CursedItems.description
CursedOn-screen labelAperion/Content/Localization/Game/en/Game.locres → ST_HUD → Cursed
Cursed Items can only be equipped while inside the SanctumTutorial textAperion/Content/Localization/Game/en/Game.locres → ST_Mission_Tutorial → Lesson.CursedItems.Tip2
You cannot weapon swap if your other weapon is not CursedTutorial textAperion/Content/Localization/Game/en/Game.locres → ST_Mission_Tutorial → Lesson.CursedItems.Tip4
Awakening or Salvaging Cursed Items will also reward you with Curses. Curses are powerful consumables that can increase the difficulty of your Lightbringer runs for greater rewards.Tutorial textAperion/Content/Localization/Game/en/Game.locres → ST_Mission_Tutorial → Lesson.CursedItems.Dialog4
How we know

In more detail: An item mutation. The game's text: a Cursed item has negative traits until it is Awakened, and completing each of its objectives changes a negative trait into a positive one. A Cursed item drops with one curse per rarity step (Rare 1, Epic 2, Legendary 3) plus Awakened. Each curse turns one Secondary Trait negative (x -2 for most columns, drawn purple) and scales the Primary Trait by 0.85 on top of Awakened's x 2 (rules O3, C2); it also opens one Cursed Objective slot, shown one at a time, and completing that objective removes the curse (rule O2). T-0006 checked 7 Cursed items: every number fits.

Rules from the game's code: What a curse does to an item's traits Datamined · Primal and Cursed trait colours Datamined · How Cursed items get and lose objectives Datamined

In the files:

mutations → Mutation.Item.Cursed: numImprovedTraitSlotIndexes 1 · whitelistImprovedTraitSlotIndexes Primary Trait · canUpgrade false · canEnchant false · canSalvage true · canEquipInActivity false (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → mutations → Mutation.Item.Cursed)

itemScalingMultipliers → Item.Mutation.Cursed.PrimaryTrait.1 (sample columns): coreAttribute 0.85, 0.85 · coreAttributePercent 0.85, 0.85 · playerPower 0.85, 0.85 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → itemScalingMultipliers → Item.Mutation.Cursed.PrimaryTrait.1)

Corrected 2026-09-26: this entry used to say purple marks a trait that was turned positive. The menu code gives purple to the '|2' (negative) secondary, so purple marks the cursed line.

Cursed Objective Datamined

In game: A Cursed item's objective line, e.g. "Defeat a Level 50+ Moirax in a Dreamstone (0/3)"

The task on a Cursed item, such as “Defeat a Level 50+ Moirax in a Dreamstone (0/3)”. Each curse has one, and only one shows at a time. Completing it lifts that curse and pays out Curses (the consumables). Some objectives in the files are never picked for new items.

Complete item objectives to remove its CursesKeyword: Cursed ItemsAperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → localization → Keyword.CursedItem.Objective.description
To Awaken a Cursed Item at the Forge, complete all of its objectives Rarer items have more objectives to complete before they can be AwakenedTutorial textAperion/Content/Localization/Game/en/Game.locres → ST_Mission_Tutorial → Lesson.CursedItems.Dialog2
Completing a Cursed Item objective will allow you to change a negative trait into a positive trait Once you start a mission with a Cursed Item equipped you must wield it for the entire missionTutorial textAperion/Content/Localization/Game/en/Game.locres → ST_Mission_Tutorial → Lesson.CursedItems.Dialog3
How we know

In more detail: The trait slot a Cursed item gets for each curse. Its line is the objective's own text with its numbers filled in from the objective's conditions (rule O1). Objectives come from three pools (Rare, Epic, Legendary, opened in that order as stacks are added), each worth Curse consumables when completed. Objectives with weight 0 are never picked for a new item (rule WP1).

Rules from the game's code: Cursed objective text Datamined · How Cursed items get and lose objectives Datamined · Weighted picks Datamined

Full list with every objective's text, reward and weight: Mechanics > Cursed items.

Primal Datamined

In game: Primal items; primary traits drawn in pale yellow

Another kind of item boost that makes the Primary Trait stronger (× 1.5 for most numbers). Its boosted lines are pale yellow, not the gold of upgraded traits.

PrimalOn-screen labelAperion/Content/Localization/Game/en/Game.locres → ST_HUD → Primal
How we know

In more detail: An item mutation that improves the primary trait through its own scaling multiplier. Its improved lines are pale yellow in the menus (rule C2), not the gold of upgraded traits.

Rules from the game's code: Primal and Cursed trait colours Datamined

In the files:

mutations → Mutation.Item.Primal: numImprovedTraitSlotIndexes 2 · whitelistImprovedTraitSlotIndexes Primary Trait · canUpgrade true · canEnchant true · canSalvage true · canEquipInActivity true · improvedTraitTextColor #800080 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → mutations → Mutation.Item.Primal)

itemScalingMultipliers → Item.Mutation.Primal.PrimaryTrait.1 (sample columns): coreAttribute 1.5, 1.5 · coreAttributePercent 1.5, 1.5 · playerPower 1.5, 1.5 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → itemScalingMultipliers → Item.Mutation.Primal.PrimaryTrait.1)

Rings, Charms and Amulets Datamined

In game: Separate Armory tabs

Rings, charms and amulets have separate Armory tabs, but the game keeps all three in one list. The wiki's Trinkets section covers all three.

How we know

In more detail: The files keep all three in one trinkets table; each row's class says which it is. The wiki's Trinkets section covers all three.

In the files:

trinkets table: rows 192 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → trinkets)

item classes named in craftingUpgrade: Amulet, Augment, Banner, Bomb, Charm, Consumable, Potion, Ring, Talisman, Weapon (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → craftingUpgrade)

Valorplates

Shards (Valorplate Shards) Datamined

In game: Valorplate > Shards tab; Armory > Shards

Each Valorplate has four Shards that give it new abilities. You unlock a Shard with special objectives while using its Valorplate, equip it on the Valorplate's Shards tab, and can upgrade it up to 5 times at the Forge. The game calls them Shards; the files call them runes.

Shards grant new abilities to each of your ValorplatesTutorial textAperion/Content/Localization/Game/en/Game.locres → ST_Mission_Tutorial → Runes.SystemUnlocked.TutorialPlate.Description.1
Unlock up to 4 unique Shards for each Valorplate by completing special objectives Use the Armory to see their unique traits and unlock requirementsTutorial textAperion/Content/Localization/Game/en/Game.locres → ST_Mission_Tutorial → Runes.SystemUnlocked.TutorialPlate.Description.3
Shards can be upgraded in the Forge up to 5 times Acquire Shards across all Valorplates to unlock Higher-level upgradesTutorial textAperion/Content/Localization/Game/en/Game.locres → ST_Mission_Tutorial → Runes.SystemUnlocked.TutorialPlate.Description.4
Valorplate Shards are items that grant powerful abilities. They can be equipped on the Shards tab of the Valorplate screen, where each Valorplate has 4 unique Shards to choose from. You can save a different Shard configuration in each Loadout to better coordinate your Gear and Skills. Shards can be unlocked by completing special objectives while using the Valorplate that the Shard belongs to. You can view each Shard in the Armory to see their unique traits, as well as the objectives required to unlock them. Once unlocked, each Shard can be upgraded up to 5 times in the Forge, increasing the strength of the Shard's traits. Higher level upgrades require you to first collect a minimum number of total Shards. Collecting all 4 Shards for a Valorplate will cause the Valorplate to become Ascendant, providing the Valorplate with an additional passive ability. Fully upgrading all 4 Shards for a Valorplate will cause the Valorplate to become Exalted, providing the Valorplate with yet another passive ability.Codex: Valorplate ShardsAperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → localization → Codex.Valorplates.Shards.description
How we know

In more detail: Each Valorplate has four Shards. The files call them runes. A Shard's pips are its upgrade rank: rune mutations 1 to 6, which scale its effects through the Rune.Upgrade multipliers.

In the files:

runes table: rows 48 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → runes)

mutations Mutation.Item.Rune.1 … Rune.6 → itemScalingMultipliersType: Mutation.Item.Rune.1 Rune.Upgrade · Mutation.Item.Rune.2 Rune.Upgrade · Mutation.Item.Rune.3 Rune.Upgrade · Mutation.Item.Rune.4 Rune.Upgrade · Mutation.Item.Rune.5 Rune.Upgrade · Mutation.Item.Rune.6 Rune.Upgrade (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → mutations)

Ascendant and Exalted Valorplates Datamined

In game: [ASCENDANT] and [EXALTED] passive lines on the Abilities tab

Unlock all four of a Valorplate's Shards and it becomes Ascendant, which adds a second passive ability. Fully upgrade all four and it becomes Exalted, which adds a third.

A Valorplate becomes Ascendant once you have unlocked all 4 Shards Ascendant Valorplates gain an second passive abilityTutorial textAperion/Content/Localization/Game/en/Game.locres → ST_Mission_Tutorial → Runes.SystemUnlocked.TutorialPlate.Description.5
Fully upgrading all 4 Shards allows a Valorplate to become Exalted Exalted Valorplates gain a third passive abilityTutorial textAperion/Content/Localization/Game/en/Game.locres → ST_Mission_Tutorial → Runes.SystemUnlocked.TutorialPlate.Description.6
How we know

In more detail: Unlocking all four of a Valorplate's Shards makes it Ascendant (a second passive); fully upgrading all four makes it Exalted (a third passive). The passives are traits named Trait.Passive.<Valorplate>.Ascended / .Exalted.

In the files:

passive traits: Trait.Passive.Aegishorn.Ascended, Trait.Passive.Aegishorn.Exalted, Trait.Passive.Armistice.Ascended, Trait.Passive.Armistice.Exalted, Trait.Passive.Bulwark.Ascended, Trait.Passive.Bulwark.Exalted, Trait.Passive.Greyhawk.Ascended, Trait.Passive.Greyhawk.Exalted, Trait.Passive.Hinterclaw.Ascended, Trait.Passive.Hinterclaw.Exalted, Trait.Passive.Illumina.Ascended, Trait.Passive.Illumina.Exalted, Trait.Passive.Mesa.Ascended, Trait.Passive.Mesa.Exalted, Trait.Passive.Moebius.Ascended, Trait.Passive.Moebius.Exalted, Trait.Passive.Phoenix.Ascended, Trait.Passive.Phoenix.Exalted, Trait.Passive.Silvermane.Ascended, Trait.Passive.Silvermane.Exalted, Trait.Passive.Typhon.Ascended, Trait.Passive.Typhon.Exalted, Trait.Passive.Vertigo.Ascended, Trait.Passive.Vertigo.Exalted (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → trait)

Might, Spirit and Vitality sockets Datamined

In game: Red, blue and green socket symbols in the augment constellation

Augment sockets come in three colours: red is Might, blue is Spirit and green is Vitality, matching the attribute bar. The files only call them Red, Green and Blue.

Defeated enemies and treasure chests may drop Souls in the Spirit Realm. Each Soul will have one of three affinities: Might (red), Spirit (blue), and Vitality (green). You can carry up to 6 Souls at a time, as long as they're of the same affinity. You can use Souls to power artifacts such as the Spirit Gates, Shards of Macros, and Soul Altars. Activating powered artifacts will unlock new paths, challenges, and information.Codex: SoulsAperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → localization → Codex.FreeRoam.Souls.description
How we know

In more detail: The files name augment affinities by colour. In game, red is Might, blue is Spirit and green is Vitality, matching the attribute bar.

In the files:

augmentAffinities: id 0 · name Neutral
id 1 · name Red
id 2 · name Green
id 3 · name Blue (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → augmentAffinities)

Stats

Resistance cap Corroborated

In game: Resistance lines in Detailed Stats; "+X% cap to all resistances" on gear, skills and Ascension

No resistance can go above 50% at first. Items, the Resistance skill, Ascension and boons raise that cap, and the raises add up. Wyatt: past 50% there's a second ceiling at 75% that only large cap raises reach. The files also hold a 70% and a 90% limit whose purpose isn't known yet (test T-0005).

Reduces damage taken of a specific damage type. Capped at 50%.Keyword: ResistanceAperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → localization → Keyword.Resistance.description
Maximum amount of resistance allowed for each damage typeKeyword: Resistance CapAperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → localization → Keyword.Resistance.Cap.description
For each of the six damage types, you can increase your resistance to that type of damage. Increasing your resistances decreases the amount of damage you take from enemies that deal damage of each type. Each resistance cannot exceed 50% unless the resistance cap is increased by an item or ability.Codex: ResistancesAperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → localization → Codex.Mechanics.Resistances.description
“the game does start at a base of 50% resistance cap for each element”Wyatt · Navigation demo narration, 2026-09-26 Corroborateddata/observations/wyatt_2026-09-26.json
“they are bumped up additively by gear such as this necklace that has plus 3% cap to all resistances”Wyatt · Navigation demo narration, 2026-09-26 Corroborateddata/observations/wyatt_2026-09-26.json
“when we hit five, we get the cap to all resistances. So instead of 50, this goes to 55, plus any items you might be wearing that bolster the ceiling”Wyatt · Navigation demo narration, 2026-09-26 Corroborateddata/observations/wyatt_2026-09-26.json
“we've got 0.4 capped all resistances for five points, roughly two points of all resist cap raised”Wyatt · Navigation demo narration, 2026-09-26 Corroborateddata/observations/wyatt_2026-09-26.json
“Currently still lists the 0.75 "maximum" when that is a secondary ceiling requiring large amounts of raising the cap from 50% in game.”Wyatt · Chat message with the next wiki requests, 2026-09-27 Corroborateddata/observations/wyatt_2026-09-27.json
How we know

In more detail: Each resistance starts capped at 50%, and items, the Resistance skill and Ascension raise the cap; the raises add together. The cap can be raised past 50% only up to a second, higher ceiling (Wyatt), which the files hold as a 75% limit for each damage type. Reaching it takes large cap raises. Two more limits are in the files and their roles are UNKNOWN: a 70% limit on the player's attribute curve and a 90% post-modifier limit. Test T-0005 checks them.

In the files:

the player's starting caps and final limit (attribute curve table): Character.Player.ResistancePhysicalMax 0.5 · Character.Player.ResistanceElementalFireMax 0.5 · Character.Player.ResistanceElementalColdMax 0.5 · Character.Player.ResistanceElementalAirMax 0.5 · Character.Player.ResistanceElementalEarthMax 0.5 · Character.Player.ResistanceElementalShadowMax 0.5 · Character.Player.ResistanceFinalMax 0.7 (Aperion/Content/Aperion/Data/Gameplay/Attributes/CT_Attributes_Character_Player (curve table, FModel JSON export))

traits that raise the cap (MaxAllResistance scalars): SkillGridResistance5 0.05 · Trait.Ascension.Stat.AllResistCaps.1 0.004 · Trait.Bane.Nightfall.MaxResist.1 -0.05 · Trait.Bane.Nightfall.MaxResist.2 -0.2 · MaxResistSecondary 0.03 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → trait)

the higher ceiling for each damage type (globalParameters; role from Wyatt): physicalResistanceMax 0.75 · fireResistanceMax 0.75 · waterResistanceMax 0.75 · airResistanceMax 0.75 · earthResistanceMax 0.75 · voidResistanceMax 0.75 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → globalParameters)

post-modifier limits (globalParameters; role UNKNOWN): physicalResistancePostModifierMax 0.9 · fireResistancePostModifierMax 0.9 · waterResistancePostModifierMax 0.9 · airResistancePostModifierMax 0.9 · earthResistancePostModifierMax 0.9 · voidResistancePostModifierMax 0.9 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → globalParameters)

Detailed Stats Datamined

In game: The Detailed Stats screen (Space on the Gear tab)

The character screen's full list of stats. The game works out every number itself; the menu only rounds it for display (whole numbers normally, percentages cut to one decimal). The files swap the labels for Critical Hit Chance and Critical Hit Damage; the wiki follows what the screen says.

How we know

In more detail: The game engine computes every line and the menu only formats it: whole numbers rounded normally, percentages cut to one decimal (rules S2 to S4). Label text comes from the statScreen strings. Two of their keys are swapped in the files: the key ending 'Damage' holds the Critical Hit Chance label and vice versa, so the wiki follows the label, not the key.

Rules from the game's code: Detailed Stats: whole numbers Datamined · Detailed Stats: percentages Datamined · Where Detailed Stats come from Datamined

In the files:

statScreen label strings: count 109 · swapped_crit_keys key StatScreen.Crit.Damage · label Critical Hit Chance
key StatScreen.Crit.Chance · label Critical Hit Damage (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → localization → statScreen)

Numbers

How tooltip numbers are rounded Datamined

In game: The bold numbers inside trait text

Tooltips round down: a roll of 45.9% shows as 45%, not 46%. The + or − comes from the text around the number.

How we know

In more detail: A roll is stored to a few decimals, then shown without its sign (the text carries the + or −) and rounded down. For example, a roll of 45.9% shows as 45%, not 46%.

Rules from the game's code: Roll range Datamined · Stored rounding Datamined · Tooltip numbers Datamined

Weapon DPS (tooltip) Datamined

In game: The big number on a weapon tooltip, e.g. "EARTH DPS"

The big DPS number on a weapon tooltip is double the weapon's attack power (times a display scale), rounded down. Detailed Stats rounds Base DPS normally, so the two can be one apart.

How we know

In more detail: The tooltip shows twice the weapon's attack power (times a DPS scale), rounded down. Detailed Stats shows Base DPS rounded normally, which is why the two can differ by one.

Rules from the game's code: Weapon DPS on the tooltip Datamined · Tooltip headline number Datamined · Detailed Stats: whole numbers Datamined

Banner Overhealth Datamined

In game: The big number on a banner tooltip vs. Base Overhealth in Detailed Stats

The Overhealth number on a banner tooltip is far bigger than Base Overhealth on Detailed Stats because the tooltip multiplies it by 30. Both describe the same banner.

How we know

In more detail: The stat sheet shows the banner's overshield value. The tooltip multiplies it by the display multiplier in rule B2, which is why the tooltip number is far larger.

Rules from the game's code: Banner Overhealth on the tooltip Datamined · Tooltip headline number Datamined

In the files:

statScreen labels: Base Overhealth, Banner Overhealth (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → localization → statScreen)

Life Stone Health Recovery Datamined

In game: The big number on a life stone tooltip; Base Health Recovery in Detailed Stats

The big number on a life stone tooltip is its Health Recovery, rounded normally. Detailed Stats shows the same value as Base Health Recovery.

How we know

In more detail: The tooltip shows the life stone's healing power rounded normally (display multiplier 1).

Rules from the game's code: Tooltip headline number Datamined

In the files:

potions (life stones) and potionBase* parameters: potionBaseHealAmount 50 · potionBaseCharges 3 · potionBaseHealDuration 2 · potionBaseSecondaryTraitDuration 10 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → globalParameters)

What an Ascension level costs Corroborated

In game: Ascension tab: the XP bar under the level dial

Every Ascension Level costs a bit more than the one before, by a fixed percentage, and the rate steps up once partway along. The bar under the level dial is counting toward your next level, not the one you are on. Getting all the way to 450 takes hundreds of millions of XP.

How we know

In more detail: Each level costs a fixed percentage more than the one before, and the rate changes once. The bar measures progress toward the next level, not the one you are on. Reaching level 450 takes 334,566,698 XP in all.

In the files:

the formula: expression cost(n) = round(50,000 x 1.009162^(n-1)) for n < 376; cost(376) = 1,520,000; cost(n) = round(1,520,000 x 1.01065^(n-376)) for n > 376 (tools/extract_ascension.py, asserted against every row)

the level table: rows 450 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → ascensionLevel)

the XP bar in a running game, which the formula reproduces exactly (Wyatt's in-game capture, (W-2026-10-03c-6))

Confirmed against a running game, not only against the table it was fitted to.

Mechanics

Skills (the skill grid) Datamined

In game: Valorplate > Skills: a grid of skills, each with five levels

The Valorplate's grid of skills, each with five levels. A skill level's text can be worded differently from the effect behind it (for example “cap to all resistances” vs “maximum All resistances”), because the two come from different places in the files.

How we know

In more detail: Skill effects are traits named SkillGrid… in the trait table. The level text shown in game comes from the masteryEntitlements strings, which is why it can read differently from the trait text (for example 'cap to all resistances' vs 'maximum All resistances'). The points that buy them are a different pool from Ascension's — see Skill points, and Ascension points below.

In the files:

SkillGrid traits: count 94 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → trait)

masteryEntitlements strings: count 259 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → localization → masteryEntitlements)

Skill points Corroborated

In game: Valorplate > Skills: the Available Points counter

The points that buy skill-grid levels come from two places and nowhere else. Levelling your character to 50 pays 49 of them, and a fixed list of 22 story missions, campaign bosses and Dreamstones pays one each the first time you finish it, for 23 more. That is 72 in total, and the grid has room for 125 — so you cannot have everything, and choosing what to skip is the real decision. Ascension Levels do not pay skill points.

“There are some extra skill points to be earned after level 50 from particular missions in the campaign (base game and DLC) and by completing particular dreamstones.”Wyatt · chat message, 2026-10-03 Corroborateddata/observations/wyatt_2026-10-03b.json
“You never get extra skill points for ascension levels, only from the arbitrary objectives after hitting level 50.”Wyatt · chat message, 2026-10-03 Corroborateddata/observations/wyatt_2026-10-03b.json
How we know

In more detail: Two sources and no others: character levels pay 49, and a fixed set of 22 story missions, campaign bosses and Dreamstones pay one each the first time you finish them, for 23 more. That is 72 in all, against a grid that holds 125 — so the grid cannot be filled, and what you leave out is the real decision. Ascension levels pay none of it.

In the files:

points per character level: total 49 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → playerTier)

first-completion awards: activities 22 · points 23 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → activities → firstCompletionGrantedSkillPoints)

The files invite two wrong answers here, and the skill points page names both.

Ascension Bonuses and Powers Corroborated

In game: Ascension tab: Bonuses (a numbered row of three, five ranks each) and Powers (two, pick one)

Once you hit level 50 you start earning Ascension Levels instead, and they never reset. Each one pays a point to spend on the Bonuses tab, which is a long list of numbered rows, three bonuses to a row, five ranks each. The number next to a bonus is what one rank gives you, not what all five give. Rows unlock on how many points you have already spent. The Powers tab is a different thing: every 25 Ascension Levels it offers you two powers, you pick one, and it costs you nothing.

Once you've reached level 50, you can earn Ascension Levels. Each Ascension Level takes you beyond 50 and unlocks powerful new traits that apply across all of your Valorplates. Gain a point for each new Ascension Level that you can spend on permanent Ascension Bonuses. Every 25 Ascension levels grants you a new Ascension Power. Each time, you can pick from one of two Ascension Powers. You may change your selection at any time.Codex: Ascension LevelsAperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → localization → Codex.Mechanics.AscensionLevel.description
“Ascension levels are activated after the character achieves level 50.”Wyatt · chat message, 2026-10-03 Corroborateddata/observations/wyatt_2026-10-03.json
How we know

In more detail: A second layer of levelling that opens at character level 50 and never resets. Each Ascension level pays one point, spent on the Bonuses tab. There are 450 levels and the tree holds 450 points, so filling it takes every level there is. A group opens on points already spent, and the number beside a bonus is what one rank gives, not the total of five. The Powers tab is separate: every 25 levels it offers two powers and you take one, spending nothing.

In the files:

ascensionStatGroups (Bonuses): groups 30 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → ascensionStatGroups)

ascensionPerkGroups (Powers): groups 15 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → ascensionPerkGroups)

the level table: levels 450 · total_xp 334566698 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → ascensionLevel)

the Bonuses screen, checked row by row against the files (Wyatt's in-game capture, (W-2026-10-03c-1))

the Powers screen, checked row by row against the files (Wyatt's in-game capture, (W-2026-10-04-1))

Ascension points are not skill points Corroborated

In game: Two counters that look alike: Available Points on the Skills screen, and on Ascension

Two different counters that both say Available Points. Skill points come from character levels and from finishing certain missions and Dreamstones, and they buy skill-grid levels. Ascension points come one per Ascension Level and buy Ascension bonuses. Neither one can be spent on the other, and Ascension never gives you skill points, however it may look.

“You never get extra skill points for ascension levels, only from the arbitrary objectives after hitting level 50.”Wyatt · chat message, 2026-10-03 Corroborateddata/observations/wyatt_2026-10-03b.json
“Ascension points are an entirely separate system from the Skill points + Skill grid system”Wyatt · chat message, 2026-10-03 Corroborateddata/observations/wyatt_2026-10-03b.json
How we know

In more detail: Two pools, and nothing crosses between them. Skill points come from character levels and from finishing certain activities, and buy skill-grid ranks. Ascension points come one per Ascension level and buy Ascension bonuses. Ascension grants no skill points at all. The files encourage the mistake — one menu function reads weapon-mastery XP into a point total, and another is named for granting skill points on Ascension — and neither is what the game runs on.

Both traps are named on the skill points page so the next reader does not fall into them.

Weapon mastery (cut content) Corroborated

In game: Nowhere. There is no interface for it in the game.

A second skill system that is in the game's files but was never finished and never switched on. There is no screen for it, nothing to spend on it and no benefit from it. Two of the 5 weapon trees were written out in full, names and descriptions and all, which is the only reason there is anything to read.

“The weapon masteries do not exist in game for any class of weapon.”Wyatt · chat message, 2026-10-03 Corroborateddata/observations/wyatt_2026-10-03d.json
“mastery is not a mechanic the players gets to interact with, or benefit from and there's no portion of the UI that even indicates mastery is a real thing to the player”Wyatt · chat message, 2026-10-03 Corroborateddata/observations/wyatt_2026-10-03d.json
How we know

In more detail: The files describe a second skill system — a nested tree per weapon, bought with the same points — that never shipped. 2 of the 5 trees were written in full, names and wording and all; the other 3 are one unfinished tree copied. No player can reach any of it.

In the files:

mastery trees: trees 5 (main.27a82b73.chunk.js -> @counterplay/ap-data combat_skillpoint_grid)

XP thresholds: ladders 4 (Aperion/Content/Aperion/Data/Gameplay/SourceData/source_data.json → weaponMastery)

Whether it was ever meant for a later update is UNKNOWN; the files say nothing about intent.

Curses (consumables) Datamined

In game: Resources > Curses: Lesser, regular and Greater curses

Consumables you get by awakening or salvaging Cursed items. Spend them to make Lightbringer runs harder in exchange for better rewards.

Awakening or Salvaging Cursed Items will also reward you with Curses. Curses are powerful consumables that can increase the difficulty of your Lightbringer runs for greater rewards.Tutorial textAperion/Content/Localization/Game/en/Game.locres → ST_Mission_Tutorial → Lesson.CursedItems.Dialog4
“they will not be important for the purposes of the build planner or anything like that. It'll just be pages on the wiki that relate to their functions in the light bearer activity”Wyatt · Navigation demo narration, 2026-09-26 Corroborateddata/observations/wyatt_2026-09-26.json
How we know

In more detail: Consumables earned by awakening or salvaging Cursed items. They raise the difficulty of Lightbringer runs for better rewards. Wiki pages only; not part of the planner.

Wyatt's transcript says 'light bearer'; the game's text says 'Lightbringer'.

For the curious: rules from the game's code

The game's menus are built from code that ships inside the game files, and that code still carries its original, readable source. Each rule below quotes the lines it rests on. Other pages link here when a number follows one of these rules.

Show the 31 rules

R1 · Roll range Datamined

A trait's value is min + (max − min) × roll, with the roll between 0 and 0.999. min and max are itemScaling[tier, rarity][paramType] × the trait's scalar (× a mutation multiplier for Awakened, Primal and Cursed traits).

Agrees with T-0001: all 4 logged augment cards fit at tier 50 (data/checks/T-0001_roll_check_game.json).

The game's code (3 lines)
seededValue = Math.min(Math.max(seededValue, 0), 0.999); // fail-safe to force valid range
../../src/loot.ts:1246 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
const rawMagnitude = (max - min) * seededValue + min;
../../src/loot.ts:1248 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
traitStaticMagnitude.scalar *
../../src/loot.ts:1290 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

S1 · Stored rounding Datamined

The rolled value is stored rounded (half-up) to the loot effect's magnitudeRoundedDecimals.

Agrees with T-0001: all 4 logged augment cards fit at tier 50 (data/checks/T-0001_roll_check_game.json).

The game's code (1 line)
return Math.round(preroundedMagnitude) / decimalMultiplier;
../../src/loot.ts:1254 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

D1 · Tooltip numbers Datamined

A trait's number is shown without its sign (the text carries it). Percentages are × 100, trimmed to 5 significant digits and rounded DOWN (45.9 shows as 45). Other numbers are printed by the text's own format: %d keeps the whole part, %f prints the stored number (so a 2-decimal value shows as 6.14).

Replaces D1 (2026-09-25): 'rounded half-up'. That guess was wrong for tooltips. D1 (2026-09-26 morning) rounded every number down; %f numbers keep their decimals (T-0006: 6.14).

Agrees with T-0001: all 4 logged augment cards fit at tier 50 (data/checks/T-0001_roll_check_game.json).

The game's code (4 lines)
return Math.floor(parseFloat(num.toPrecision(5)))
components/GearTrait.js:25 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
let displayMagnitude = Math.abs(magnitude) // sign is included in the description
components/GearTrait.js:27 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
displayMagnitude = round(displayMagnitude * 100)
components/GearTrait.js:34 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
label = sprintf(highlightedLabel, params)
components/GearTrait.js:349 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

TX1 · Where a trait's words come from Datamined

The tooltip text is the localized string for the trait (localization sheet 'trait', id = the trait's name), not the trait table's own description, which is the developers' copy and differs for about 220 traits. Traits marked showSign get their + or - from the value (a Cursed secondary shows '-').

Agrees with T-0006: Cat Talisman's line reads 'Rampage expiration time' (the localized text); the trait table says 'Rampage reset timer'.

The game's code (3 lines)
id: `${data.traitName}.description`
components/GearTrait.js:117 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
if (this.getStaticData().showSign) {
components/GearTrait.js:268 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
magnitude < 0
components/GearTrait.js:270 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

TC1 · Thresholds in trait text (trigger conditions) Datamined

Text like 'If you have 68% or more Water resistance' reads its number from the trait's trigger condition (triggerConditions table): itemScaling[tier, rarity][column].min × scalar, with no roll, times any mutation multiplier, then stored and shown like other numbers (S1, D1).

Agrees with T-0006: Mistveil 68%, Fearless Wolf 45%, Cat Talisman 32567 (with the Cursed multipliers).

The game's code (3 lines)
* %(FireResistance.TriggerCondition[0].exampleTriggerConditionId.magnitude)d
components/GearTrait.js:179 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
(itemScaleMultiplier[itemScalingType]?.min || 0) * scalar
components/GearTrait.js:209 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
acc[condition.id.replace(/\./g, '')] = params
components/GearTrait.js:232 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

U1 · Upgrade-improved traits Datamined

A trait improved by an upgrade is evaluated at tier + improvedTraitTierOffset (craftingUpgrade), i.e. as if the item were that many tiers higher. Which traits get improved is decided when the item is upgraded (server side): UNKNOWN.

Values from the files: improvedTraitTierOffset 100 (source_data.json → craftingUpgrade)

Replaces H1 (2026-09-24): 'rank 3 multiplies secondaries by Item.Upgrade.Rank.3.SecondaryTrait.1'. It matched at tier 50 only by coincidence.

Agrees with T-0001: all 4 logged augment cards fit at tier 50 (data/checks/T-0001_roll_check_game.json).

The game's code (2 lines)
tierIdentifier: item.tierIdentifier + traitMasterWorkTier * masterworkTraitTierOffset
../../src/loot.ts:1369 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
return tableRow ? tableRow.improvedTraitTierOffset : 0;
../../src/loot.ts:1534 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

U2 · Upgrade rank and the Primary Attribute Datamined

An item's Primary Attribute (the big number on trinkets) is evaluated at tier + coreAttributeTierOffset for its upgrade rank.

Values from the files: ranks rank 1 · coreAttributeTierOffset 1 · improvedTraitTierOffset 100 · minRarity 1
rank 2 · coreAttributeTierOffset 2 · improvedTraitTierOffset 100 · minRarity 1
rank 3 · coreAttributeTierOffset 3 · improvedTraitTierOffset 100 · minRarity 3
rank 4 · coreAttributeTierOffset 4 · improvedTraitTierOffset 100 · minRarity 3
rank 5 · coreAttributeTierOffset 5 · improvedTraitTierOffset 100 · minRarity 3 (source_data.json → craftingUpgrade)

Replaces H2 (2026-09-24), same rule, now read from the code.

Agrees with T-0001: all 4 logged augment cards fit at tier 50 (data/checks/T-0001_roll_check_game.json).

The game's code (2 lines)
masterworkTraitTierOffset = exports.masterworkUpgradeAttributeTierOffset(item);
../../src/loot.ts:1360 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
return tableRow ? tableRow.coreAttributeTierOffset : 0;
../../src/loot.ts:1545 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

U3 · Masterwork trait Datamined

The Masterwork trait is chosen when an item reaches the upgrade rank below.

Values from the files: rank 5

The game's code (2 lines)
exports.upgradeRankForMasterworkTraitChoice = () => {
../../src/crafting.ts:139 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
return 5;
../../src/crafting.ts:140 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

C1 · Gold (yellow) trait lines Datamined

A trait line is drawn 'enhanced' in gold when it was improved by an upgrade (masterworkBonusTier > 0) or is the Masterwork trait (also Cursed-item objectives).

The game's code (4 lines)
const isUpgradedTrait = trait.masterworkBonusTier > 0
components/GearPopover.tsx:748 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
isEnhanced: true
components/GearPopover.tsx:799 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
&.enhanced {
GearTrait.scss:103 · in Aperion/Content/uiresources/static/css/main.cbecd126.chunk.css.map
color: gold !important;
GearTrait.scss:105 · in Aperion/Content/uiresources/static/css/main.cbecd126.chunk.css.map

C2 · Primal and Cursed trait colours Datamined

Primal traits are drawn pale yellow. On a Cursed item, the Secondary Trait(s) the curse turned negative (mutation 'Mutation.Item.Cursed|2', rule O3) are drawn purple with the Cursed bullet.

mutations.improvedTraitTextColor in source_data.json says #800080 for Primal; the menus use the SCSS colour instead.

Replaces C2 (2026-09-26 morning): 'transformed Cursed traits purple'. The class mutation-item-cursed-2 comes from the '|2' (negative secondary) mutation, so purple marks the cursed line, not a lifted one.

The game's code (3 lines)
return mutationName.replace(/\./g, '-').replace(/\|/g, '-').toLowerCase()
components/GearTrait.js:467 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
color: #f8fc84 !important;
GearTrait.scss:84 · in Aperion/Content/uiresources/static/css/main.cbecd126.chunk.css.map
color: #c17cdb !important;
GearTrait.scss:65 · in Aperion/Content/uiresources/static/css/main.cbecd126.chunk.css.map

T1 · Tooltip headline number Datamined

The big number on a gear tooltip is round(primary value × display multiplier).

The game's code (2 lines)
gear.primaryAttributeValue * gear.primaryAttributeValueDisplayMultiplier
components/GearPopover.tsx:274 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
const displayValue = Math.round(
components/GearPopover.tsx:273 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

W2 · Weapon DPS on the tooltip Datamined

A weapon's tooltip DPS is floor(attackPower × 2 × DPS scale).

The game's code (1 line)
return Math.floor(this.stats.attackPower * 2 * dpsScale)
model/weapon_model.js:54 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

B2 · Banner Overhealth on the tooltip Datamined

A banner's tooltip Overhealth is its overshield × bannerOvershieldDisplayMultiplier (globalParameters). The stat sheet shows the overshield itself.

Values from the files: bannerOvershieldDisplayMultiplier 30 (source_data.json → globalParameters)

The game's code (2 lines)
return this.stats.BannerOvershield
model/gear_banner_model.ts:26 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
return globalParameters.bannerOvershieldDisplayMultiplier || 30
model/gear_banner_model.ts:30 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

S2 · Detailed Stats: whole numbers Datamined

Whole-number lines in Detailed Stats are rounded half-up.

Agrees with T-0001 D2 (Detailed Stats rounds half-up).

The game's code (1 line)
return Math.round(Math.abs(numberFloat)) * sign
containers/Loadout/components/LoadoutAttributesCategory.js:29 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

S3 · Detailed Stats: percentages Datamined

Percent lines: cut to hundredths, snap to the whole number if within 0.09 of it, then cut to tenths.

The game's code (3 lines)
let result = Math.floor(Math.abs(numberFloat) * 100) / 100
containers/Loadout/components/LoadoutAttributesCategory.js:15 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
const tolerance = 0.09
containers/Loadout/components/LoadoutAttributesCategory.js:16 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
const resultPrecise = (Math.floor(Math.abs(result) * 10) / 10) * sign
containers/Loadout/components/LoadoutAttributesCategory.js:24 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

S4 · Where Detailed Stats come from Datamined

The menu only formats Detailed Stats; the game engine computes the values and sends them to the UI. The formulas are not in the UI code.

The game's code (1 line)
UE_OUT_REQUEST_HANDLERS[ActionTypes.UE_LOADOUT_ATTRIBUTES_UPDATED] = async (
lib/data-bridge.ts:394 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

LD1 · Drop chance by level Datamined

When a loot event fires, each of its lootQuantity groups keeps only the rows whose minTier–maxTier and minThreat–maxThreat contain the event's level and threat. Each roll of a kept row succeeds when a random number is below the row's chance.

The game's code (3 lines)
return (tier >= row.minTier &&
../../src/loot.ts:945 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
lodash_1.default.remove(validLootQuantityGroupsForGroup, (lqg) => !exports.rowMeetsTierAndThreatReqs(lqg, baseTier, threat));
../../src/loot.ts:418 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
rngLib.next() < lootQuantityGroup.chance;
../../src/loot.ts:435 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

LD2 · Rolls per loot event (loot bonus, co-op) Datamined

Rolls = (1 + player loot bonus × playerLootBonusScalar) × (1 + target loot bonus × targetLootBonusScalar) × (1 + (players − 1) × extraLootBonusPerPlayer) ÷ players. The whole part is the number of rolls; the fraction is the chance of one extra roll. Loot bonus adds rolls; it does not change the chance per roll.

Where the player loot bonus comes from is set by the game engine, not the menu code. The trait effect named LootQuantityBonus (Ascension, Banes) is the likely source: UNKNOWN.

The game's code (3 lines)
const rollsPerLootQuantityRaw = ((1 + playerLootBonus * lootQuantityGroup.playerLootBonusScalar) *
../../src/loot.ts:421 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
(1 + (numLootEligiblePlayers - 1) * extraLootBonusPerPlayer)) /
../../src/loot.ts:423 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
(rngLib.next() < rollsPerLootQuantityRemainder ? 1 : 0);
../../src/loot.ts:428 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

LD3 · Level of a dropped item Datamined

A dropped item's level is the event's level (plus the loot category's tierOffset, with chance tierOffsetChance), clamped to the category's minTier–maxTier.

The game's code (2 lines)
let calculatedTier = baseTier + (tierOffsetSuccess ? tierOffset : 0);
../../src/loot.ts:358 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
calculatedTier = Math.min(maxTier, calculatedTier);
../../src/loot.ts:363 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

LD4 · Mission level Datamined

The menus show a mission's level as: your level + tierOffset[difficulty], kept within minTier[difficulty]–maxTier[difficulty] (the activity's difficulty arrays).

This is the level the menu shows. That the kill's loot rolls at the same level is the natural reading but is set by the engine: not confirmed.

The game's code (2 lines)
const selectedDifficulty = this.attributes.difficultyIdentifier - 1 // 1-based vs 0-based
model/activity_model.js:159 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
Math.min(this.attributes.playerTier + offset, maxTier),
model/activity_model.js:164 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

LD5 · Dreamstone level Datamined

A standard Dreamstone's activities use the dreamstone's activityOverride.minTier; a Volatile Dreamstone uses its own level. Each 'Increase Tier' boss action adds its parameter (1) on top.

The game's code (3 lines)
? tierIdentifier
../../src/dreamstoneActivities.ts:117 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
copiedActivityOverride.minTier += activityTierOffset;
../../src/dreamstoneActivities.ts:119 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
tier: parameter1
../../src/dreamstoneActivities.ts:437 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

AS1 · Ascension numbers Datamined

The Ascension screen has its own copy of the tooltip number code. There, percentages are × 100 with no rounding down, so a 0.004 bonus shows as 0.4% (item tooltips would show 0).

The game's code (3 lines)
// Rounding is removed
containers/Ascension/components/Trait.tsx:31 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
displayMagnitude = displayMagnitude * 100
containers/Ascension/components/Trait.tsx:32 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
return sprintf(label, value)
containers/Ascension/components/Trait.tsx:76 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

RN1 · Shard (rune) values Datamined

A Valorplate Shard (a 'rune' in the files) is evaluated at your level, not at the level it dropped at, and at its own rarity. Its rank (1 to 6: the menu says it can be upgraded up to 5 times) multiplies its Primary Trait values by the Rune.Upgrade row for that rank.

The rank's multiplier row comes from the mutation Mutation.Item.Rune.<rank> (itemScalingMultipliersType Rune.Upgrade, rank offset = rank), which marks up to 3 Primary Traits. Shards are Legendary in every lootItem row.

The game's code (6 lines)
// Runes scale with player tier
../../src/loadoutToUE4JSON.ts:392 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
itemTraits = Loot.materializeItemTraits(Object.assign(Object.assign({}, item), { tierIdentifier: playerTier }));
../../src/loadoutToUE4JSON.ts:393 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
tierIdentifier: playerTier
containers/RuneDetails/RuneDetails.tsx:710 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
exports.RUNE_MAX_UPGRADE_RANK = 6;
../../src/valorplateRunes.ts:16 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
type: itemScalingMultipliersType,
../../src/loot.ts:1323 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
defaultMessage="Upgrade the power of this Shard up to 5 times."
components/localized_labels/index.js:888 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

DS1 · Dreamstone boss actions Datamined

Each round the boss rolls its 'Next Boss Actions' (count set by the server). For each pick, only BossAction rows whose tags match the Dreamstone, whose round window contains the current round, and whose exclusion group hasn't been used yet are valid; of those, only the highest-priority rows are kept, then one is picked by weight. Every pick in a round uses the same seed (Dreamstone id + round), so a repeat pick from an unchanged list gives the same row. A picked row's exclusion group then blocks it for the rest of the Dreamstone.

How many actions each round gets (nextNumBossActions) comes from the server. The Dreamstone row's numBossActions list and initialBossActionIndex suggest a list index that moves each round, but how it moves is not in the menu code: UNKNOWN.

The game's code (7 lines)
(!row.minRound || row.minRound <= currentRound) &&
../../src/dreamstoneActivities.ts:390 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
const prioritizedActions = lodash_1.default.filter(sortedActions, (action) => action.priority === sortedActions[0].priority);
../../src/dreamstoneActivities.ts:397 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
let selectedAction = missionActivities_1.sampleItemByWeightWithSeed(prioritizedActions, seed);
../../src/dreamstoneActivities.ts:398 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
modificationExclusionGroups.push(...selectedAction.exclusionGroups);
../../src/dreamstoneActivities.ts:410 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
const rng = random_seed_1.default.create(seed);
../../src/missionActivities.js:141 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
const seed = `${dreamstoneId}${currentRound}`
containers/WorldMap/WorldMap.js:1696 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
nextNumBossActions,
containers/WorldMap/WorldMap.js:1699 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

DS2 · Dreamstone level from boss actions Datamined

An 'Increase Tier' boss action is shown as '+1 Dreamstone Level'. The Dreamstone's level offset is the sum of every applied modification's tier, and it is added to the boss fight and to every round activity (rule LD5).

The game's code (4 lines)
return (mod.effects && mod.effects.tier) || 0;
../../src/dreamstoneActivities.ts:23 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
case 'Dreamstone.Boss.Action.Increase.Tier': {
../../src/dreamstoneActivities.ts:435 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
<LocalizedLabels.IncreaseLevelLabel
containers/DreamstoneRoundSummary/BossActionsList/BossActionsList.js:30 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
defaultMessage="+{amount} Dreamstone Level"
components/localized_labels/index.js:1922 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

AD1 · Adjacent augments Datamined

Two augments are adjacent when their sockets are joined by a line (an edge) in the Valorplate's constellation graph. A trait that depends on adjacent augments looks only at the augments in the sockets joined to its own augment's socket.

The graph itself (sockets, their positions, the lines) is a data file compiled into the menu bundle (@counterplay/ap-data 'constellations'), read by tools/extract_constellations.py. Sockets are matched to augmentGraphs rows by node id (augment_configuration_model.js).

The game's code (4 lines)
const { graph } = ap_data_1.constellations[valorplateBaseGameplayTag];
../../src/augmentConstellation.ts:101 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
return edge.vertex1 === nodeId || edge.vertex2 === nodeId;
../../src/augmentConstellation.ts:104 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
const connectedAugments = exports.getConnectedAugments({
../../src/augmentConstellation.ts:149 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
return edge.vertex1 === id ? edge.vertex2 : edge.vertex1
model/augment_constellation_model.js:109 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

SK1 · Which augments fit a socket Datamined

The augment picker offers an augment for a socket when the socket's affinity is White (0), when the augment's affinity is White, or when the two match.

No augment in the files has the White affinity, so in practice a White socket takes any augment and a coloured socket takes only its own colour.

Agrees with the Codex entry Augments (Codex.Tutorials.Augments), which says augments slot into neutral or matching nodes.

The game's code (3 lines)
(slot.affinityRequirement === 0 ||
containers/Loadout/components/AugmentSelectModal.js:22 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
augment.affinityIdentifier === 0 ||
containers/Loadout/components/AugmentSelectModal.js:23 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
augment.affinityIdentifier === slot.affinityRequirement)
containers/Loadout/components/AugmentSelectModal.js:24 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

WP1 · Weighted picks Datamined

Loot categories, items and the trait inside a category are picked by weight: a random number up to the total weight walks down the list. A row with weight 0 is never picked (unless every row has weight 0).

The game's code (3 lines)
const totalWeight = lodash_1.default.sumBy(items, 'weight');
../../src/loot.ts:712 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
if (r <= items[i].weight)
../../src/loot.ts:715 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
}, exports.sampleItemByWeight(validTraits));
../../src/loot.ts:896 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

O3 · What a curse does to an item's traits Datamined

Each Cursed stack marks the item's last Primary Trait (it can be marked more than once) and one Secondary Trait not yet marked ('Cursed|2'). A marked trait's value is multiplied by the Cursed itemScalingMultipliers row for its paramType column: the Primary row is 0.85 for most columns, the Secondary row −2 for most columns (the negative trait).

Values from the files: Item.Mutation.Cursed.PrimaryTrait.1 minWeaponDamage 0.85 · maxWeaponDamage 0.85 · minPotionHeal 0.85 · maxPotionHeal 0.85 · minBannerOvershield 0.85 · maxBannerOvershield 0.85 · powerDrain 0.85 · itemStrengthIndex 0.85 · coreAttribute 0.85 · coreAttributePercent 0.85 · defensePercent 0.85 · reverseScaling 0.85 · nonScaling 1 · playerPower 0.85 · playerPowerNoMutation 1 · playerPowerNoMutationNoVariance 1 · playerHealth 0.85 · attributeNoVariance 0.85 · healthToDamage 0.85 · nonScalingVariance 1 · noVarianceCoreAttribute 0.85 · coreAttributeNoVarianceNoMutation 1 · noVarianceCoreAttributePercent 0.85 · noVarianceDefensePercent 0.85 · noVariancePlayerPower 0.85 · noVariancePlayerHealth 0.85 · noVarianceHealthToDamage 0.85 · mutationScalingOnly 0.85 · mutationScalingOnlyVariance 0.85 · mutationScalingOnlyInverse 1.1764705882352942 · resistanceThresholdOnly 1.065 · Item.Mutation.Cursed.SecondaryTrait.1 minWeaponDamage -2 · maxWeaponDamage -2 · minPotionHeal -2 · maxPotionHeal -2 · minBannerOvershield -2 · maxBannerOvershield -2 · powerDrain -2 · itemStrengthIndex -2 · coreAttribute -2 · coreAttributePercent -2 · defensePercent -2 · reverseScaling -2 · nonScaling 1 · playerPower -2 · playerPowerNoMutation 1 · playerPowerNoMutationNoVariance 1 · playerHealth -2 · attributeNoVariance -2 · healthToDamage -2 · nonScalingVariance 1 · noVarianceCoreAttribute -2 · coreAttributeNoVarianceNoMutation 1 · noVarianceCoreAttributePercent -2 · noVarianceDefensePercent -2 · noVariancePlayerPower -2 · noVariancePlayerHealth -2 · noVarianceHealthToDamage -2 · mutationScalingOnly -2 · mutationScalingOnlyVariance -2 · mutationScalingOnlyInverse 2 · resistanceThresholdOnly 1.065 (source_data.json → itemScalingMultipliers → Item.Mutation.Cursed.*)

A dropped Cursed item also carries Awakened (x 2 on the Primary Trait for most columns), so its primary is x 2 x 0.85 per curse. The negative lines show with a minus sign and purple bullets (T-0006).

Agrees with the game's tutorial text ('Cursed Items have negative traits instead of positive traits until they are Awakened') and T-0006: 7 Cursed items, every number fits at tier 50 (18 negative secondaries at x -2; primaries at Awakened x Cursed per stack).

The game's code (4 lines)
return (trait.slotType === mutation.whitelistImprovedTraitSlotIndexes &&
../../src/loot.ts:1095 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
trait.mutationNames.push(mutationName + '|2'); // see: mutation2Re
../../src/loot.ts:1117 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
const { itemScalingMultipliersType2, itemScalingMultiplierRankOffset2 } = mutation2;
../../src/loot.ts:1336 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
? traitItemScalingMultiplierRow[itemScalingType].min
../../src/loot.ts:289 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

O1 · Cursed objective text Datamined

An objective trait's text is the objective's localized string (stringTableKey). {Suffix} becomes ' (progress/needed)', and every {Name} becomes that value from the objective's conditions (for example {MinTier} → 50).

The game's code (4 lines)
const { stringTableKey, conditions } = objectiveStaticData
components/GearTrait.js:96 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
const reg = /\{Suffix\}/g
components/GearTrait.js:100 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
const regex = new RegExp('{' + k + '}', 'g')
components/GearTrait.js:108 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
return ` (${this.props.trait.progressNumerator || 0}/${
components/GearTrait.js:473 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map

O2 · How Cursed items get and lose objectives Datamined

The Cursed mutation opens Cursed Objective slots (their base chance is 0; the mutation adds increasedTraitChanceOffset). Completing an objective removes one Cursed stack and the objective trait, and the objective's lootQuantityGroups pay out.

Values from the files: numIncreasedTraitChanceTraitSlotIndexes 1 · whitelistIncreasedTraitChanceTraitSlotTypes Trait.Objective · increasedTraitChanceOffset 1 · transformationTraitSlotTypesTraitsRemoved Trait.Objective · transformationMutationRemoved Mutation.Item.Cursed (source_data.json → mutations → Mutation.Item.Cursed)

Cursed items drop with one Cursed stack per the loot category's whitelist (Rare 1, Epic 2, Legendary 3) plus Awakened. Each stack opens one objective slot, in the traitSlot table's order (Rare, Epic, Legendary pools), but the item lists only the first objective at a time (lodash take). T-0006: all 7 captured items show one objective, from the Rare pool.

The game's code (6 lines)
ts.traitChance + increasedTraitChanceOffset > Math.random() &&
../../src/loot.ts:1203 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
selectedMutationTraitSlots.push(...lodash_1.default.take(validMutationTraitSlots, numIncreasedTraitChanceTraitSlotIndexes));
../../src/loot.ts:1208 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
const mutationIndexToRemove = gear.mutationNames.indexOf(mutation.transformationMutationRemoved);
../../src/loot.ts:1135 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
return lodash_1.default.includes(mutation.transformationTraitSlotTypesTraitsRemoved, trait.slotType);
../../src/loot.ts:1141 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
const { lootQuantityGroups } = objectiveStaticData;
../../src/loot.ts:1157 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map
return lodash_1.default.take(lodash_1.default.reduce(identifiedGear.traits, (acc, trait) => {
../../src/loot.ts:1061 · in Aperion/Content/uiresources/static/js/main.27a82b73.chunk.js.map