Secret Sauce LootGen
ARPG progression generator by Charles Torris.
This tool:
- Generates configurable XP and DPS curves up to your maximum level
- Generates all loot required for that progression
- Generates monsters consistent with that progression
- Simulates a level-by-level run in one click
Presets
Show formulas
This notice explains the configuration parameters (state) needed to reproduce the loot compute logic outside of JavaScript, plus the core mathematical steps for level-based item generation.
Parameters
state.levels: total simulated levels (normalization denominator).state.flat_damage_min/max: floor/ceiling for flat damage growth.state.flat_damage_power_progression: exponent controlling curve shape.state.flat_damage_equipement_slots_auto: divisor based on flat-damage-capable slots.state.attack_speed_min/max: APS range used for bonuses.state.attack_speed_power_progression: attack speed curve exponent.state.attack_speed_slots_auto: slots that contribute attack speed.state.mod_damage_min/max: percent damage modifier range.state.mod_damage_power_progression&state.mod_damage_slots_auto: curve exponent and slot divisor for mods.state.resistance_affix_min/max: resist value range per affix.state.resistance_curve: exponent shaping resistance growth.state.generate_percent: loot generation scale.state.rarity_base_weights&state.rarity_weight_growth: base/level weights for rarities.state.damage_types: metadata linking damage to attributes and colors.state.equipment_slots: slot permissions (flat damage, mods, AS, resist) that determine distribution.
Core formulas
normalizedProgress(L) = clamp(((L − 1) / max(1, levels − 1)), 0, 1).
flatDamage(L) = (flat_damage_min + (flat_damage_max − flat_damage_min) * normalizedProgress(L)flat_damage_power_progression) / flat_damage_equipement_slots_auto.
damageMod(L) = (mod_damage_min + (mod_damage_max − mod_damage_min) * normalizedProgress(L)mod_damage_power_progression) / mod_damage_slots_auto.
targetAPS(L) = attack_speed_min + (attack_speed_max − attack_speed_min) * normalizedProgress(L)attack_speed_power_progression.
attackSpeedBonus(L) = ((targetAPS(L) − attack_speed_min) / attack_speed_min * 100) / attack_speed_slots_auto.
resistance(L) = resistance_affix_min + (resistance_affix_max − resistance_affix_min) * normalizedProgress(L)resistance_curve.
applyJitter(value, seed) = value * (1 + offset), offset ∈ [−flat_damage_jitter_pct, +flat_damage_jitter_pct], pseudo-random per level.
rarityWeight(rarity) = (baseWeight + rarity_weight_growth * level) * rarity_power_multiplier.
Final loot roll sums flatDamage, damageMod, attackSpeedBonus, resistance per affix, and rarityWeight filtered by slot/category permissions.
Translate these steps into your engine of choice by feeding the same state values (from presets/lootgen_default.js) into matching curve evaluators and slot filters.