Use-Based Progression

There is no experience bar and no level up. Using a stat rolls once for a chance to raise it, and a soft cap bends that chance instead of capping the number

Use-Based Progression There is no experience bar and no level up. Using a stat rolls once for a chance to raise it, and a soft cap bends that chance instead of capping the number 01 / The stat loop 02 / Outcomes and the brake 03 / The skill loop In play · a swing, a dodge, a haggle · The stat loop · any action 01 In play a swing, a dodge, a haggle any action OnStatUse · TrackStatUse bumps one counter · The stat loop · every use 02 OnStatUse TrackStatUse bumps one counter every use Virtual rank · use count divided by 25 · The stat loop · sets the odds 03 Virtual rank use count divided by 25 sets the odds Stat roll · CheckStatProgression · The stat loop · probabilistic 04 Stat roll CheckStatProgression probabilistic Stat plus one · Training +1, then Validate · The stat loop · no ceiling 05 Stat plus one Training +1, then Validate no ceiling Raw stat above cap · rank pinned to raw stat · Outcomes and the brake · brake Raw stat above cap rank pinned to raw stat brake Nothing happens · the ordinary result of a use · Outcomes and the brake · most rolls Nothing happens the ordinary result of a use most rolls OnSkillUse · TrackSkillUse, then roll · The skill loop · 10 skills OnSkillUse TrackSkillUse, then roll 10 skills Skill roll · CheckSkillProgression · The skill loop · probabilistic Skill roll CheckSkillProgression probabilistic Skill plus one · IncreaseSkill, tier banner · The skill loop · no ceiling Skill plus one IncreaseSkill, tier banner no ceiling still rolls, far rarer draw >= threshold: no change keep playing stronger, and still uncapped governing stat rolls too Legend start active state decision terminal success failure / exit neutral

The only way a stat grows through play

  • • In normal play a stat rises only when it is used; quest StatInfo rewards are the one authored exception
  • • OnStatUse increments one counter and then immediately rolls for advancement
  • • The roll happens on every single use, not once every 25 uses
  • • On a hit, IncreaseStat adds one to that stat's Training field and revalidates
  • • There is no experience value, no level, and no point buy anywhere on this path

The curve, in real numbers

  • • Virtual rank is the stat's use count divided by UsesPerRank, which ships at 25
  • • chance = BaseProgressionChance * exp(-3 * rank / softCap), base ships at 0.12
  • • Stat rolls are then scaled by StatProgressionRate, which ships at 2.25
  • • So a fresh stat sits near 27 percent per use, and near 1.3 percent at the soft cap
  • • The draw is integer: threshold = chance * 10000, compared against util.Rand(10000)

The soft cap is a brake, not a wall

  • • StatProgressionSoftCap ships at 150 and is a virtual rank, never a limit on the value
  • • Above it the curve keeps decaying by ProgressionDecayAboveCap rather than stopping
  • • It also acts as an anti exploit floor: a raw stat above 150 pins the virtual rank to it
  • • IncreaseStat has no bound to check, and stats.Recalculate copies Value to ValueAdj raw
  • • The only real ceiling in this function is MobStatCap, and it applies to mobs alone

Skills ride the same machinery

  • • OnSkillUse tracks the use, rolls, then fires OnStatUse for the skill's governing stat
  • • Same CalculateProgressionChance, with SkillSoftCap at 50 in place of 150
  • • Per skill multipliers normalise fast firing combat skills against rare utility skills
  • • A crit or a critical failure each grant an extra progression check; the crit's runs at double the normal chance
  • • IncreaseSkill has no cap either, so the soft cap only bends the odds here too

Traced from source

  • • github.com/pruuk/DOGMud at 8847e15537f4b3289775aa3bb2d681302b46f3c8
  • • internal/characters/progression.go lines 44 to 62, the exponential chance curve
  • • internal/characters/progression.go lines 149 to 193, the stat roll and the soft cap floor
  • • internal/characters/progression.go lines 68 to 144 and 214 to 266, the skill loop
  • • internal/characters/skills.go lines 191 to 222, internal/stats/stats.go line 46
  • • _datafiles/config.yaml lines 718 to 727, the shipped balance knobs