File map
Path of Exile 2#
Patch 0.5.5.442 files and folders69 links61 resolve for every value
Item
Wicked Warpick of the Bear · magic One Hand Mace · example rolls 8, 72, 14- Wicked Warpick of the Bear
- One Hand Mace
- Physical Damage: 31-41
- Critical Hit Chance: 7.00%
- Attacks per Second: 1.45
- Requires: Level 22, 41 Str
- +8% to Critical Damage Bonus
- 72% increased Physical Damage
- +14 to Strength
mods[prefix].name · base_items[id].name · mods[suffix].name"Wicked" · "Warpick" · "of the Bear"A magic item’s name is prefix name, base name, suffix name.
41item_classes["One Hand Mace"].category"[Mace|One Hand Mace]"Markup: show the text after the bar.
2base_items[id].properties.physical_damage_min / _max18 / 24Scaled by the 72% roll, then rounded: 18 × 1.72 = 31, 24 × 1.72 = 41. The roll changes this line because
15stats["local_physical_damage_+%"].is_localis true.base_items[id].properties.critical_strike_chance700Hundredths of a percent.
1base_items[id].properties.attack_time690Milliseconds per attack: 1000 ÷ 690.
1base_items[id].requirements{ level: 22, strength: 41 }1base_items[id].implicits[0]"MaceImplicitCriticalMultiplier1"Its stat
1467local_critical_strike_multiplier_+rolls 5 to 10. The text entry gives"{0}% to [CriticalDamageBonus|Critical Damage Bonus]"with format"+#".mods["LocalIncreasedPhysicalDamagePercent3"]prefix · 65–84 · level 16Its stat
346local_physical_damage_+%rolls 65 to 84. The text entry has 5 variants; the one whose condition fits the roll gives"{0}% increased [Physical] Damage".mods["Strength3"]suffix · 13–16 · level 22Its stat
346additional_strengthrolls 13 to 16. The text entry gives"{0} to [Strength|Strength]"with format"+#".
Join order
- 1
base_items[id]Look up the base by item path, here
Metadata/Items/Weapons/OneHandWeapons/OneHandMaces/FourOneHandMace5. It holds the name, class, properties, requirements, tags and implicit mod ids. - 2
item_classes[base.item_class]Gives the class line and the plural name, “One Hand Maces”, which step 3 needs.
- 3
mods_by_base[class.name][base.tags.join(",")]The mod pool for this base, grouped by generation type and mod type. Each value is the mod’s required level. All 5,496 bases resolve this way.
- 4
mods[id]For the implicit and each rolled mod: affix name, generation type, required level and
stats[]with min and max. - 5
stats[stat.id]Flags such as
is_local. A local stat changes the item’s own lines instead of the character. - 6
stat_translations/stat_descriptionsFind the entry whose
ids[]holds the stat. Pick theEnglish[]variant whoseconditionfits the value, then applyformatandindex_handlersfromstat_value_handlers. - 7
keywords[Id]Text like
[Strength|Strength]shows the part after the bar. The id before it gives the hover definition.
const base = base_items[id];
const cls = item_classes[base.item_class];
const pool = mods_by_base[cls.name][base.tags.join(",")];
const mod = mods["Strength3"];
const entry = stat_descriptions.find(e => e.ids.includes(mod.stats[0].id));
// then pick entry.English[] by condition and fill {0}Skill gem
Spark · level 1- Spark
- Spell, Projectile, Lightning, Duration, Repeatable
- Level: 1
- Cost: 5 Mana
- Cast Time: 0.70 sec
- Critical Hit Chance: 9.00%
- Requires: Level 1, 4 Int
- Launch a spray of sparking Projectiles that travel erratically along the ground until they hit an enemy or expire. Consumes a Cold Infusion if possible to fire many sparks in a circle.
- Fires 4 Projectiles Deals 1 to 10 Lightning Damage
- Projectile duration is 2 seconds Projectiles fired at the same time can Hit the same target no more than once every 0.66 seconds
skill_gems[id].base_item.display_name"Spark"1skill_gems[id].tags[] → gem_tags[tag]"[Spell]", "[Projectile]", "[Lightning]", …
13intelligenceandgrants_active_skillhave nogem_tagsentry, so they stay hidden.skill_gems[id].requirementskeys "1" to "20"One entry per gem level.
1max_levelis 20.skills["SparkPlayer"].per_level["1"].costs{ Mana: 5 }
45cost_types["Mana"].format_textis"{0} Mana".skills["SparkPlayer"].cast_time700Milliseconds.
4skills["SparkPlayer"].stat_sets[0].static.crit_chance900Hundredths of a percent.
4skill_gems[id].requirements["1"]{ intelligence: 4, level: 1 }1skills["SparkPlayer"].active_skill.descriptionHolds markup such as
48[Projectile|…].skills["SparkPlayer"].stat_sets[0].per_level["1"].stat_textAlready rendered for each level. The raw values are in
47stats[]; the text rules are instat_translations/specific_skill_stat_descriptions/spark/statset_0.json.skills["SparkPlayer"].stat_sets[0].static.stat_textLines that do not change with level.
4
Join order
- 1
skill_gems[…]Keyed by item path. Holds tags, requirements per level and
grants_skills. - 2
base_items[gem.base_item.id]Gives the item class, “Active Skill Gem”, and the socket limit.
- 3
gem_tags[tag]Display text for each tag. A tag with no entry is hidden.
- 4
skills[gem.grants_skills[0]]"SparkPlayer": name, description, skill types, cast time, costs per level and stat sets. - 5
cost_types[key]Format text and the stat behind each cost. Per-minute costs divide by
divisor. - 6
active_skill_typesThe skill’s
types[]. A support fits when itssupport_gem.allowed_typesmatch them. - 7
stat_translations/{translation_file}Each stat set names its own text file. 558 different files are used.
- 8
keywords[Id]Hover text for the markup in the description.
Passive
Heavy Buffer · notable in the Default tree- Heavy Buffer
- 40% increased maximum Energy Shield
- 5% of Damage taken bypasses Energy Shield
- Group 705 · orbit 4 · slot 24 of 72
- Linked to Energy Shield Mastery, 2 Energy Shield nodes
- Gathering Winds Deadeye ascendancy · Ranger
passive_skill_trees/Default.json → passives["27491"].nameis_notable: true1passives["27491"].stats{ "maximum_energy_shield_+%": 40 }13passives["27491"].stats{ "base_all_damage_bypass_energy_shield_%": 5 }
13stat_textholds these lines pre-rendered.groups[705]x -1909, y -6476 · radius 4 · position_clockwise 24The group whose
2passives[]holds hash 27491.orbit_radii[4]is 493 andskills_per_orbit[4]is 72.groups[705].passives[].connections[3471]Each link is stored on one end only. 2 of these nodes list 27491 in its own
2connections.passives["30"].ascendancy"Ranger1"A second node, for the ascendancy chain:
4ascendancies["Ranger1"].nameis Deadeye, and itscharacter,Metadata/Characters/Dex/DexFour, is the Ranger incharacters.
Join order
- 1
passive_skill_trees/Default.json → passives[hash]Name, icon, flags such as
is_notableandis_keystone,statsandstat_text. The folder holds 5 trees. - 2
groups[] in the same fileThe group that lists the hash gives its x and y, the orbit (
radius), the slot (position_clockwise) and the node’s outgoing connections. - 3
stats + stat_translationsIn the Default tree, 5,549 of 5,957 stat references find their text in
stat_descriptionsand 408 inpassive_skill_stat_descriptions. - 4
ascendancies[passive.ascendancy] → characters669 nodes belong to an ascendancy.
charactermatchescharacters[].metadata_id. - 5
skill_gems, buffs, jewel_slots54 nodes grant a skill through
granted_skill, an item path inskill_gems. 3 carrybuff_definitions.jewel_slotsnames socket nodes by id.
Monster
The Riverbank and its boss- The Riverbank
- Act 1 · area level 1
- Leads to Clearfell Encampment
- The Bloated Miller
- Life 15 × 105% · Damage 9.16 × 190%
- Uses Shield Charge, Basic Attack, Table Charge
- Packs: Drowned (1–2), Porcupine Crab (1–2), Drowned (2–5)
world_areas["G1_1"]name, act, area_level1world_areas["G1_1"].area_level1Also the key into
13default_monster_stats, “1”.world_areas["G1_1"].connections["G1_town"]Each id is another
1world_areaskey.world_areas["G1_1"].bosses[0] → monsters[path].name"Metadata/Monsters/SwollenMiller/SwollenMillerBoss"12default_monster_stats["1"] × monsters[path].life_multiplier, damage_multiplierlife 15, physical_damage 9.16 · 105, 190The level baseline, picked by
23area_level, scaled by the monster’s multipliers. Rarity and boss scaling come on top.monsters[path].granted_effects[] → skills[id]19 skillsOnly 3 have a
4display_name. The others are helper skills.world_areas["G1_1"].packs[].monsters.*.monster_varietyweights 45, 25, 20, 10 in the first packEach pack has
12min_count,max_countand weighted monster paths.
Join order
- 1
world_areas[id]Name, act, level, waypoint,
connections,bosses,packsandarea_mods. - 2
monsters[path]Name, tags, multipliers, resistances, weapon class and
granted_effects. - 3
default_monster_stats[String(area_level)]A value join: the key is the monster level, “1” to “100”.
- 4
skills[id]The same
skillsfile that player gems use. - 5
mods[id]monsters.modsandspecial_mods. This boss has none; 774 monsters do. - 6
endgame_maps[id]Map areas share the
world_areaskey.native_packsmatchpacks[].idinworld_areas.
What does not join
- Uniques have no mods or base type
uniquesandunique_detailsgive the name, class, art and flavour text of 449 uniques. No file says which base or which mods a unique has. 10,447 mods havegeneration_type: "unique", andmods_by_baselists them per class and tag set, not per unique.- inherits_from points at files that are not exported
- 5,495 bases and 761 monsters name an abstract parent such as
…/AbstractOneHandMace. Use it as a group label. - Two spellings of item class
- Most files use the class id, such as “One Hand Mace”.
mods_by_baseuses the plural name, such as “One Hand Maces”. 50 of 449 uniques use loose names such as Focii or Mace. - Two gem path spellings
- Gem ids start with
Metadata/Items/Gem/(595) orMetadata/Items/Gems/(594). Match the exact string. Do not normalise it. - Hidden stats
- 3,976 of 26,082 stat references in
modshave no text in anystat_translationsfile, for examplelocal_weapon_implicit_hidden_%_base_damage_is_fire. The game does not show them. - mods_by_base values are levels
- Each number is the mod’s
required_level(86,660 of 86,660 agree).spawn_weightsare only 0 or 1 in this game: a tag allows a mod or blocks it. - Some jewel slots point nowhere
- 12 of 31
jewel_slotsname a passive that is in no exported tree. - Text is often already rendered
mods.text,base_items.implicit_text, skillstat_textand passivestat_texthold finished lines with ranges. You needstat_translationsonly to render a rolled value.
Path of Exile 1#
Patch 3.29.3.342 files and folders71 links63 resolve for every value
Item
Wicked War Hammer of the Bear · magic One Hand Mace · example rolls 10, 72, 20- Wicked War Hammer of the Bear
- One Hand Mace
- Physical Damage: 22-53
- Critical Strike Chance: 5.00%
- Attacks per Second: 1.45
- Weapon Range: 1.1 metres
- Requires Level 20, 71 Str
- 10% reduced Enemy Stun Threshold
- 72% increased Physical Damage
- +20 to Strength
mods[prefix].name · base_items[id].name · mods[suffix].name"Wicked" · "War Hammer" · "of the Bear"A magic item’s name is prefix name, base name, suffix name.
41item_classes["One Hand Mace"].category"One Hand Mace"2base_items[id].properties.physical_damage_min / _max13 / 31Scaled by the 72% roll, then rounded: 13 × 1.72 = 22, 31 × 1.72 = 53. The roll changes this line because
15stats["local_physical_damage_+%"].is_localis true.base_items[id].properties.critical_strike_chance500Hundredths of a percent.
1base_items[id].properties.attack_time690Milliseconds per attack: 1000 ÷ 690.
1base_items[id].properties.range11Tenths of a metre.
1base_items[id].requirements{ level: 20, strength: 71 }1base_items[id].implicits[0]"StunThresholdReductionImplicitMace1"Its stat
146base_stun_threshold_reduction_+%is always 10. The text entry has 2 variants; the one whose condition fits the roll gives"{0}% reduced Enemy Stun Threshold".mods["LocalIncreasedPhysicalDamagePercent3"]prefix · 65–84 · level 23Its stat
346local_physical_damage_+%rolls 65 to 84. The text entry has 5 variants; the one whose condition fits the roll gives"{0}% increased Physical Damage".mods["Strength3"]suffix · 18–22 · level 22Its stat
346additional_strengthrolls 18 to 22. The text entry gives"{0} to Strength"with format"+#".
Join order
- 1
base_items[id]Look up the base by item path, here
Metadata/Items/Weapons/OneHandWeapons/OneHandMaces/OneHandMace5. It holds the name, class, properties, requirements, tags and implicit mod ids. - 2
item_classes[base.item_class]Gives the class line and the plural name, “One Hand Maces”, which step 3 needs.
- 3
mods_by_base[class.name][base.tags.join(",")]The mod pool for this base, grouped by generation type and mod type. Each value is the mod’s required level. All 5,461 bases resolve this way.
- 4
mods[id]For the implicit and each rolled mod: affix name, generation type, required level and
stats[]with min and max. - 5
stats[stat.id]Flags such as
is_local. A local stat changes the item’s own lines instead of the character. - 6
stat_translations/stat_descriptionsFind the entry whose
ids[]holds the stat. Pick theEnglish[]variant whoseconditionfits the value, then applyformatandindex_handlersfromstat_value_handlers.
const base = base_items[id];
const cls = item_classes[base.item_class];
const pool = mods_by_base[cls.name][base.tags.join(",")];
const mod = mods["Strength3"];
const entry = stat_descriptions.find(e => e.ids.includes(mod.stats[0].id));
// then pick entry.English[] by condition and fill {0}Skill gem
Fireball · level 1- Fireball
- Projectile, Spell, AoE, Fire
- Level: 1
- Cost: 5 Mana
- Cast Time: 0.75 sec
- Critical Strike Chance: 5.00%
- Effectiveness of Added Damage: 300%
- Requires Level 1
- Unleashes a ball of fire towards a target which explodes, damaging nearby foes.
- Base radius is 1 metre Deals 9 to 14 Fire Damage
- 25% chance to Ignite enemies
skill_gems[id].base_item.display_name"Fireball"1skill_gems[id].tags[] → gem_tags[tag]"Projectile", "Spell", "AoE", …
13intelligenceandgrants_active_skillhave nogem_tagsentry, so they stay hidden.skill_gems[id].requirementskeys "1" to "20"One entry per gem level.
1max_levelis 20.skills["Fireball"].per_level["1"].costs{ Mana: 5 }
45cost_types["Mana"].format_textis"{0} Mana".skills["Fireball"].cast_time750Milliseconds.
4skills["Fireball"].stat_sets[0].static.crit_chance500Hundredths of a percent.
4skills["Fireball"].stat_sets[0].per_level["1"].damage_effectiveness3004skill_gems[id].requirements["1"]{ level: 1 }Only the level is stored. The game works out attribute requirements from
1requirement_weights, and no file holds that formula.skills["Fireball"].active_skill.description4skills["Fireball"].stat_sets[0].per_level["1"].stat_textAlready rendered for each level. The raw values are in
47stats[]; the text rules are instat_translations/skill_stat_descriptions.json.skills["Fireball"].stat_sets[0].static.stat_textLines that do not change with level.
4
Join order
- 1
skill_gems[…]Keyed by gem id, here
"Fireball"; join onbase_item.id. Holds tags, requirements per level andgrants_skills. - 2
base_items[gem.base_item.id]Gives the item class, “Active Skill Gem”, and the socket limit.
- 3
gem_tags[tag]Display text for each tag. A tag with no entry is hidden.
- 4
skills[gem.grants_skills[0]]"Fireball": name, description, skill types, cast time, costs per level and stat sets. - 5
cost_types[key]Format text and the stat behind each cost. Per-minute costs divide by
divisor. - 6
active_skill_typesThe skill’s
types[]. A support fits when itssupport_gem.allowed_typesmatch them. - 7
stat_translations/{translation_file}Each stat set names its own text file. 17 different files are used.
Passive
Golem's Blood · notable in the Default tree- Golem's Blood
- 10% increased maximum Life
- Regenerate 1.6% of Life per second
- Group 398 · orbit 2 · slot 12 of 16
- Linked to 2 Life nodes, Life Mastery
- Focal Point Deadeye ascendancy · Ranger
passive_skill_trees/Default.json → passives["1325"].nameis_notable: true1passives["1325"].stats{ "maximum_life_+%": 10 }13passives["1325"].stats{ "life_regeneration_rate_per_minute_%": 96 }Handler
13per_minute_to_per_second_2dp_if_requiredturns 96 into the shown number.stat_textholds these lines pre-rendered.groups[398]x -1059, y 6702 · radius 2 · position_clockwise 12The group whose
2passives[]holds hash 1325.orbit_radii[2]is 162 andskills_per_orbit[2]is 16.groups[398].passives[].connections[31471,62588]Each link is stored on one end only. One of these nodes lists 1325 in its own
2connections.passives["5443"].ascendancy"Deadeye"A second node, for the ascendancy chain:
4ascendancies["Deadeye"].nameis Deadeye, and itscharacter,Metadata/Characters/Dex/Dex, is the Ranger incharacters.
Join order
- 1
passive_skill_trees/Default.json → passives[hash]Name, icon, flags such as
is_notableandis_keystone,statsandstat_text. The folder holds 7 trees. - 2
groups[] in the same fileThe group that lists the hash gives its x and y, the orbit (
radius), the slot (position_clockwise) and the node’s outgoing connections. - 3
stats + stat_translationsIn the Default tree, 3,679 of 4,187 stat references find their text in
stat_descriptionsand 508 inpassive_skill_stat_descriptions. - 4
ascendancies[passive.ascendancy] → characters792 nodes belong to an ascendancy.
charactermatchescharacters[].metadata_id. - 5
skills, buffs, jewel_slots58 nodes grant a skill through
granted_effect.id, askillskey. 44 carrybuff_definitions.jewel_slotsnames socket nodes by id.
Monster
The Twilight Strand and its boss- The Twilight Strand
- Act 1 · area level 1
- Leads to Lioneye's Watch
- Hillock
- Life 22 × 180% · Damage 4.99 × 101%
- Uses Default Attack
- Packs: Drowned (1–3), Sand Spitter (1–3)
world_areas["1_1_1"]name, act, area_level1world_areas["1_1_1"].area_level1Also the key into
13default_monster_stats, “1”.world_areas["1_1_1"].connections["1_1_town"]Each id is another
1world_areaskey.world_areas["1_1_1"].bosses[0] → monsters[path].name"Metadata/Monsters/ZombieBoss/ZombieBossHillockNormal"12default_monster_stats["1"] × monsters[path].life_multiplier, damage_multiplierlife 22, physical_damage 4.99 · 180, 101The level baseline, picked by
23area_level, scaled by the monster’s multipliers. Rarity and boss scaling come on top.monsters[path].granted_effects[] → skills[id]2 skillsOnly one has a
4display_name. The others are helper skills.world_areas["1_1_1"].packs[].monsters.*.monster_varietyweights 20, 20, 20, 15, 15, 15 in the first packEach pack has
12min_count,max_countand weighted monster paths.
Join order
- 1
world_areas[id]Name, act, level, waypoint,
connections,bosses,packsandarea_mods. - 2
monsters[path]Name, tags, multipliers, resistances, weapon class and
granted_effects. - 3
default_monster_stats[String(area_level)]A value join: the key is the monster level, “1” to “100”.
- 4
skills[id]The same
skillsfile that player gems use. - 5
mods[id]monsters.modsandspecial_mods. This boss has none; 6,606 monsters do.
What does not join
- Uniques have no mods or base type
uniquesandunique_detailsgive the name, class, art and flavour text of 1,556 uniques. No file says which base or which mods a unique has. 15,886 mods havegeneration_type: "unique", andmods_by_baselists them per class and tag set, not per unique.- inherits_from points at files that are not exported
- 5,459 bases name an abstract parent such as
…/AbstractOneHandMace. Use it as a group label. - Two spellings of item class
- Most files use the class id, such as “One Hand Mace”.
mods_by_baseuses the plural name, such as “One Hand Maces”. 244 of 1,556 uniques use loose names such as Axe or Sword. - skill_gems is keyed by gem id
- Its keys are gem ids such as
Fireball, not item paths. Join it tobase_itemsthroughbase_item.id.vaal_variantholds item paths too. - Gem attribute requirements are not stored
requirementsholds only the level for each gem level. The game derives Strength, Dexterity and Intelligence fromrequirement_weights, and no file holds that formula.- Some skill references use the inner id
stats.active_skillsandenchantments.skillshold ids such asfireball. They matchskills[].active_skill.id, not theskillskeyFireball.- Hidden stats
- 6,626 of 60,695 stat references in
modshave no text in anystat_translationsfile, for examplebuff_impl_stat. The game does not show them. - mods_by_base values are levels
- Each number is the mod’s
required_level(314,800 of 314,800 agree). The real odds are in each mod’sspawn_weights, matched against the base’s tags in order. - Text is often already rendered
mods.text,base_items.implicit_text, skillstat_textand passivestat_texthold finished lines with ranges. You needstat_translationsonly to render a rolled value.
Raw units#
| Field | Unit | Example |
|---|---|---|
properties.attack_time | Milliseconds per attack | 690 → 1.45 attacks per second |
properties.critical_strike_chance, static.crit_chance | Hundredths of a percent | 700 → 7.00% |
properties.range | Tenths of a metre | 11 → 1.1 metres |
skills.cast_time | Milliseconds | 700 → 0.70 sec |
per_level.costs with a per-minute cost type | Per minute | Divide by cost_types[key].divisor, 60 |
monsters.life_multiplier, damage_multiplier | Percent of the level baseline | 105 → 105% of default_monster_stats[level].life |