You are viewing a potentially older version of this package. View all versions.
Ezomic-Rist-1.8.0 icon

Rist

A character level beside the skills, carved into runestones you choose and deepen.

Date uploaded 15 hours ago
Version 1.8.0
Download link Ezomic-Rist-1.8.0.zip
Downloads 55
Dependency string Ezomic-Rist-1.8.0

This mod requires the following mods to function

denikson-BepInExPack_Valheim-5.4.2350 icon
denikson-BepInExPack_Valheim

BepInEx pack for Valheim. Preconfigured with the correct entry point for mods and preferred defaults for the community.

Preferred version: 5.4.2350

README

Rist

Rist adds a character level beside Valheim's skills. Every level gives you a pick, and a pick carves one more rank into a runestone you choose. Vanilla skills are read and never written, rescaled or reskinned.

Built against Valheim 1.0.7, Unity 6000.0.75, BepInEx 5.4.23.5, Harmony 2.9. One DLL plus one text file, no asset bundle.

Features

  • A character level with its own curve, fed by skill level-ups.
  • One pick per level. Picks bank; nothing expires.
  • Runestones raise a stat by a fixed amount per rank, to rank 5 by default. Every fifth rank grants a capstone, a second and different effect.
  • No runestone carries a drawback.
  • A panel on the compendium bar showing every runestone, what it is worth now, what the next rank adds, and which character level bought each rank.
  • A row of tabs on that panel to read another character's stones, read only. The host can turn it off.
  • An experience bar on the HUD, cloned from one of the game's own bars, that flashes while a pick is unspent.
  • A line above other players' heads: level, total XP, days since their last death.
  • Dying no longer costs skill progress. On by default, and switchable.
  • The catalogue is a plain text file. Adding a runestone is one line and no rebuild.
  • On a server, progress is kept in the server's own ledger rather than in the character file.

How it works

XP and levels

XP comes from skill level-ups and from nothing else. Almost everything in Valheim raises some skill, so building, sneaking, sailing, cooking and fishing all pay in without Rist keeping a list of what counts.

A level-up is worth the skill level it reached, not a flat amount, multiplied by that skill's weight. Vanilla's own skill cost curve is pow(level+1, 1.5), so early levels are nearly free; a flat rate would hand out runestones in the first hours and dry up when the deep ranks start to matter.

The weight is what stops one activity carrying the level. On the live server, a character at Rist level 12 held 1346 XP of which WoodCutting alone was 666, against 293 for everything earned in a fight. Default weights:

Weight Skills
1 Swords, Knives, Clubs, Polearms, Spears, Axes, Bows, Crossbows, Unarmed, Blocking, ElementalMagic, BloodMagic
0.5 Dodge, Sneak, Swim
0.25 WoodCutting, Pickaxes, Crafting, Farming, Cooking, Fishing, Run, Jump, Ride

Full price for a skill raised by something that can kill you, a fraction for repetition that cannot. The same character comes out at level 6 under this table, with over half of it earned fighting. SkillWeights is meant to be edited, and on a server the host's table applies to everyone.

Cumulative XP for level N is LevelBaseXp * N^LevelExponent, which is 40 * N^1.4 by default.

Changing the weights affects new XP only. To re-price characters that already exist, change WeightGeneration to any different text: every character is then recomputed once, on its next login, from the skill levels the server has watched it reach. Runestones already taken are kept, so a character re-priced from level 12 to level 6 still holds all twelve ranks and earns no new pick until it passes level 12 again.

Spending picks

The panel is a fifth tab on the compendium bar, beside the raven and the trophy. There is no keybind; the tab is the only way in.

With a controller the panel has a pointer of its own, because the game's own windows are walked by focus and this one has none to walk. Push the left stick and a gold cross appears; A carves the stone under it and B closes the page. Moving the mouse or a trackpad hands the page straight back to the cursor.

Each runestone carries its own outline, rock and runes, seeded off its id, so it looks the same in every session and on every machine. A rank cuts one more rune into the rim. The column beside the field follows the cursor and says what the stone is worth now, what the next rank would make it, what sits at the bottom of its track, and the character level that bought each rank.

The stones stand in five ættir, Combat, Survival, Endurance, Stealth and Utility: towers two stones wide and up to four tall, each under its name and a count of how many in it are carved. A new theme adds a tower to the right rather than a row at the bottom, so the panel grows into the width a wide screen has spare. It used to be one field a fixed number of columns across, and at twenty-one runestones it ran off the bottom of a short window.

Around each stone is a ring of five segments, one per rank, filled gold as the ranks are carved. The header on your own page also shows your total XP, which the nameplate shows to everyone else but not to you.

Other characters

When someone else is on the server, a row of tabs sits above the panel: yours, then one for every other character, online ones first with a green dot and then the rest greyed. Picking one shows that character's stones with their rank after each name, their level, and how many stones and marks they have. It is read only. There is nothing to carve, and the page never sends anything that could change another character's ledger.

The list is asked for when the page opens and answered once. The server sends one line for each character in the same text its ledger already keeps, so there is no new storage and nothing is broadcast. The ledger holds no names, and the server only knows the name of a player who is connected, so a character who is not online is shown as "Char" and the last four digits of their character id. The host's ShareRanks setting turns it off for everyone, since the answer is the server's to give.

The panel works out from the screen how to fit. On a wide or 1920x1080 screen the towers stand with full-size stones and every tile shows its value. On a smaller one it tries smaller stones, then lays each ætt down four wide, and only after that drops the value line from the tiles (it stays in the column beside). It never scrolls. If a taskbar covers the bottom of the game window, PanelBottomInset keeps that strip clear, and it stays your own setting on a server.

Death

RemoveDeathSkillLoss skips Skills.OnDeath entirely. Valheim's own world modifier is not the same thing: Skills.OnDeath calls LowerAllSkills(m_DeathLowerFactor * Game.m_skillReductionRate), and inside that method only the level loss is scaled by the factor.

m_level -= m_level * factor;   // scaled: a zero factor means no loss
m_accumulator = 0f;            // not scaled: always wiped
// ...and "$msg_skills_lowered" is shown regardless

So setting the world's skill reduction to zero still discards partial progress toward the next level in every skill, and still announces that skills were lowered. Skipping the method removes all three.

The bar and the plate

The experience bar is a clone of one of the game's own upright bars, so it carries the real frame, track and fill sprites at whatever HUD scale you run. It drains rather than snapping to empty on a level-up, and flashes while a pick is waiting. If the clone ever fails against a game update it falls back to a plain drawn bar.

The plate writes level, total XP and days since the last death into the game's own nameplate, so it inherits the plate's font, fade and distance rules. Each client publishes its own three numbers onto its own character's network object; the server cannot write them, because a write to a network object you do not own is discarded. A player without Rist shows a plain name.

Days alive counts from the day the plate first saw the character, not from the day it was created. The game keeps no creation date, so every existing character reads 0 when this first runs and grows from there. It resets on death and is counted in world days.

PlateFormat is the whole of the presentation: the fields, their order, their colours and whether it wraps to a second line. It is a TextMeshPro label, so rich text works.

Installation

  1. Install BepInEx 5.4.2350. Rist uses the BepInEx 5 API and does not run on BepInEx 6.
  2. Install Rist from Thunderstore or with a mod manager, or drop Rist.dll and cards.txt into BepInEx\plugins\Rist.

cards.txt must sit beside the DLL. It ships with the mod and is not optional: without it no runestone can be taken, and the startup log says NOT READY rather than ready.

Install it on the client and on the server. The server decides every number, the client reports skill-ups and applies the effects, and neither half does anything useful alone.

Longhouse Core is an optional soft dependency. See Multiplayer for what Rist gives up without it.

The catalogue

cards.txt is read once at load. Edit it and restart the game; there is no reload.

One runestone per line, eight pipe-separated fields:

id | Name | flavour text | effect | value-per-rank | capstone effect | capstone value | sigil

The last three are optional. A line with five fields is still a valid runestone.

  • id is the key the ledger stores. It is permanent: change it and every rank anyone bought in that runestone is a rank in a runestone that no longer exists.
  • effect is the literal name of a public float field on the game's own SE_Stats, or one of the specials below. Valheim already sums about forty-five of these across active status effects (carry weight, armour, the six stamina costs, stealth, fall damage, regen rates, skill gain), so naming one turns it into a runestone with no code change.
  • value-per-rank accumulates: rank 3 of a 15-per-rank line gives 45.
  • capstone effect and capstone value are granted once per BonusEvery ranks, which at the default MaxRank 5 means once, on the final rank. A capstone can name anything an effect can, including a special.
  • sigil is the rune cut into the middle of the stone, written as a Latin letter. The game's rune font is a Latin-mapped decorative face, so a real runic code point renders as an empty box. Omit it and the first letter of the id is used.

Specials are effects with no SE_Stats field behind them, handled in code:

Special Effect
*stamina:move Run, jump, dodge, swim and sneak all cost less
*stamina:fight Attacking and blocking both cost less
*attackspeed:melee Faster swings with a weapon
*attackspeed:tools Faster swings with a pickaxe, axe, hammer, hoe or cultivator (Sure hand writes 0.05 a rank, so 25% at rank five)
*attackspeed:ranged A bow reaches full draw sooner, a crossbow reloads sooner, and both fire faster
*attackspeed:magic A staff casts faster. A staff firing several projectiles per cast has its burst timing sped to match; a looping staff that pays eitr once per hold stays at vanilla speed
*damage:ranged More damage from bows and crossbows only. A fraction: 0.05 is 5%
*unbroken A hit cannot stagger you out of a staff cast before the spell fires. A flag: write 1
*answer A perfect dodge arms your next hit on an enemy within 4 seconds. A fraction of that hit's damage
*answer:stagger Chance that the answering blow staggers anything a parry would, never a boss. A fraction: 0.30 is 30%
*lowdraw Seconds of a bow draw from a crouch that still count as sneaking, and the shot that ends such a draw. The character still rises to draw
*lowdraw:silent Arrows loosed from a crouch make no noise where they land, so a miss does not alert the animals around it. A creature the arrow hits is still alerted by the hit. A flag: write 1
*sneakattack Raises a weapon's own sneak attack multiplier. A fraction: 0.10 is 10% more. Weapons with no sneak attack gain none
*sneakattack:stagger A sneak attack on an unalerted, non-boss creature staggers it, at most once per creature per 300 seconds. A flag: write 1
*mead:duration Buff meads last longer. A fraction. Every mead except the ones that restore health, stamina or eitr, so the Lingering meads, Tonic of Ratatosk and Lightfoot Mead are included
*mead:fullcask Chance a buff mead is not used up when drunk, rolled per drink. A fraction: 0.25 is 25%
*power:cooldown Shortens the forsaken power's cooldown. Negative is shorter, and it cannot go below half
*power:duration Seconds added to the forsaken power for every player it reaches when you cast it. A power cast by someone without it lasts the normal time for everyone. Applies to every forsaken power
*staminadelay Seconds off the pause before stamina starts coming back after you spend it. The game's pause is 1 second, and it never goes below 0.25: at zero, stamina would refill while you sprint
*overloaded Stamina walking costs while you are over your carry limit. Negative like the stamina fields: -0.50 is half. Vanilla drains 10 a second; it never goes below a quarter of that
*landing:roll A dodge pressed in the last 0.3 seconds before touchdown makes a fall count 8 metres shorter, before fall damage is worked out, so it stacks with a m_fallDamageModifier on the same card. Only a fall that would hurt (over 4 metres) uses it, and only a dodge you could make: a press made while dead, attacking, staggered, mid-roll or overloaded is ignored, and so is one you lack the stamina for. Only for the character's own fall. A flag: write 1
*exploreradius The map reveals a wider circle as you walk. A fraction: 0.10 is 10% further, which is Far sight's rank
*windcone Narrows the sailing dead zone and turns the sail's push toward the bow inside the arc it opens, so you can sail closer to the wind. Sailing dead upwind still stalls. A fraction of the zone, capped at 0.8. Only applies to a ship you are steering, and the wind ring's dead zone narrows to match
*rowspeed Rows faster, forward and back. A fraction of top rowing speed: 0.20 is 20% faster. Only applies to a ship you are steering. Not used by the default catalogue since Weatherly's capstone became *sail:waves
*parry:returnblow A good parry (a block inside the first quarter second, with a shield or weapon that has a timed block bonus, that stamina and stagger did not break through) makes your next melee swing cost no stamina, if you start it within ReturnBlowSeconds (5) of the parry. One swing spends it; a swing the game refuses keeps it. The price of that swing reads as nothing from the start of the swing, so it works at an empty bar, and Last blow refunds nothing for it. Melee means swords, knives, clubs, polearms, spears, fists and axes. A flag: write 1. A companion rides along: -8% block stamina
*kill:refund The swing that kills gives half its stamina back (the LastBlowShare setting, 0.50), once per swing, whatever it killed. The price is the one the game charged, after every discount. A kill is read from the creature's own health a moment after your hit, for 1.5 seconds, so it holds when another client owns the creature; a creature killed by someone else in that window refunds too. A weapon that charges nothing for the shot refunds nothing. A flag: write 1
*combo:hold A weapon combo chains from a swing up to 0.6 seconds after the last one ended, where the game drops it back to the first hit after 0.2. Melee weapons only, by the swing-speed cards' own split, so an axe counts as a tool. A flag: write 1
*draw:second The next bow draw you begin within 1.5 seconds of loosing a shot starts 15% full (the SecondNockShare setting), worked out from the bow's own draw time at your Bows skill, and it composes with *attackspeed:ranged. Spent once, by the draw it helps. Bows only: a crossbow's wait is a reload and is not touched, and a lone first shot is drawn as before. A flag: write 1
*hit:cap No single hit can take more than a share of your maximum health, 0.50 by default (the BruiseCapShare setting). Judged where the game subtracts the hit from the health, so it is the final damage after armour, resistances and the world's damage-taken setting, and the whole hit is scaled down, which shrinks the stagger with it. Damage over time is not a hit and is not capped: burning, poison, smoke, cold, drowning, lava and ocean-heat ticks, the edge of the world and your own health costs are skipped by hit type, and fire, poison and spirit damage arrive as damage over time anyway. A fall is one hit and is capped. A ceiling only: below it a hit lands in full, and a character already under the cap still dies to a hit under it. Only your own character. A flag: write 1
*stagger:guard For 3 seconds after you recover from a stagger, nothing staggers you again. Recovery is seen on the frame the stagger ends, and the guard is a clock from there. The stagger bar still fills and flashes on a hit and a stagger already under way runs its course; only a new stagger is refused. Only your own character. A flag: write 1
*mend:patchup Ten seconds after your last swing or hit taken, a quarter of the health you lost since then comes back over five seconds. What was lost is counted from your health falling, and shrinks by any other healing, so a mead mid-fight takes its share off what is owed. A new hit or swing cancels what is left of a mend. Only damage you took is ever owed, so it cannot be farmed. A flag: write 1
*stamina:secondwind The first time a spend leaves your stamina bar empty, a quarter of the bar comes back at once, and it cannot happen again for 90 seconds. Sprinting counts, since it spends every frame. Only your own character. A flag: write 1
*stealth:losethem A creature that has lost you gives up the hunt after 12 seconds, where the game waits 30. It is the game's own drop (not alerted, no target, a five second wait before it looks again), done earlier. Not bosses, and not creatures that hunt players. Creatures see you as lost only once they have neither seen nor heard you for the 12 seconds. A creature's AI runs on the machine that owns it, so the stone is read from a flag you publish on your own character. A flag: write 1
*noise:silent While you are crouching and no faster than a crouch-walk (the crouch speed with ten percent of slack), or standing, the noise you make is dropped before the game records it, both for your own sounds and for the ones another machine reports for you. Faster, or standing up, it is the game's own noise, shrunk by the stone's ranks. The SilentStep setting switches it off. A flag: write 1
*run:momentum After MomentumSeconds (5) of running in a straight line you run MomentumBonus (0.05, so 5%) faster, grown in over MomentumRamp (1) seconds, until you stop or turn sharply. Running is the sprint: sneaking, swimming, a ship's helm or deck, riding and rolling never count, the speed must stay above walking pace, and a jump does not end it. A sharp turn is the direction you travel coming 40 degrees from the line you were on; a gradual curve is not. Applied as a multiplier on the game's run speed factor, so it sits on top of the stone's own +2% a rank. A flag: write 1
*sight:spyglass Hold SpyglassKey (Z by default) to zoom the view to SpyglassZoom (0.25) of its normal field of view, eased in and out, like binoculars. The mouse look is slowed by the same factor (SpyglassSlowTurn) while zoomed. Refused while chat, the console, a text field or any window is up, while placing a building piece and in a cutscene. The key, the zoom and the slow turn are your own settings even on a server. A flag: write 1
*swim:gasp After your stamina runs out while swimming, drowning damage waits twelve seconds (the GaspSeconds setting) before its first tick instead of one, and swimming costs 25% less stamina (GaspSwimStamina), shown as a second line on the stone. The ticks after the first are the game's own. The wait restarts whenever stamina is back or you leave the water. A flag: write 1
*sail:waves Slams into waves do no hull damage to a ship while you hold its helm, and collisions with rocks, ice and the shore cost the hull half as much (the RidesTheWavesCollision setting, 0.50): the share comes off the hit the ship is handed inside its own collision handler, so an enemy's blow on the hull is untouched. Only the water impact damage is set to nothing: upside-down damage and the Ashlands' stay. The ship's physics run on whichever machine owns the ship, so the stone is read from a flag the helmsman publishes on their own character. A passenger's stone does nothing. A flag: write 1
*tool:whetted Axes and pickaxes lose 40% less durability. Whatever a swing wears off the tool is read around the attack and 40% of it is put back, never more than was spent. By skill (axes, pickaxes, woodcutting), so an axe swung in a fight wears less as well, and the hammer and hoe are not covered. A flag: write 1
*inventoryrow Adds rows to the player inventory grid. Not used by the default catalogue, since Valheim 1.0 sells rows from the trader, but still recognised for custom ones

The header comment in cards.txt carries the sign conventions, which are the game's rather than Rist's. The stamina-use modifiers are fractions where negative means cheaper, so -0.05 is a 5% discount per rank. Four fields count from 1 rather than 0 (the three regen multipliers and m_damageModifier); write the plain fraction and Rist adds the 1. Which fields those are is read off a fresh SE_Stats at load rather than hardcoded, and any disagreement with the four Rist was written against is logged.

An unknown field name or unknown special is logged and the line skipped, so a typo costs one runestone rather than the catalogue. A blank id, a duplicate id or an unparseable number is skipped the same way. An effect with no readable display name still works, and is named in the log at load so it can be added to the label table.

Configuration

BepInEx\config\ezomic.valheim.rist.cfg

BepInEx writes every entry to disk on first run and the saved value beats a new default in code. If a change appears to do nothing, check the file.

General

Key Default Effect
Enabled true Off leaves levels and runestones recorded but stops granting and applying them
Verbose false Log every XP grant, rejection and runestone applied, plus a dump of the vanilla UI this mod clones
ShowInfoTab true Add the runestone tab to the compendium bar. There is no keybind, so off means no way in

Levelling

Key Default Effect
XpPerSkillLevel 1 XP per skill level-up, multiplied by the level reached and the skill's weight
LevelBaseXp 40 Cumulative XP for character level 1
LevelExponent 1.4 Cumulative XP for level N is LevelBaseXp * N^LevelExponent
SkillWeights see table above Skill=multiplier pairs, comma separated. Names are Skills.SkillType names and are case-insensitive; a raw type number also works. Negatives are clamped to zero
DefaultSkillWeight 1 What a skill not named in SkillWeights is worth
WeightGeneration 1 Change to any different text to recompute every character once, on its next login

Cards

Key Default Effect
MaxRank 5 How deep one runestone goes, and how many slots its track shows
BonusEvery 5 Ranks between capstones
PanelBottomInset 0 Pixels at the bottom of the screen the panel keeps clear, for a taskbar over the game window. About 48 clears a Windows taskbar. Stays local on a server
AttackSpeedMax 1 Ceiling on the attack-speed specials, as a fraction. 1 means a swing or cast can at most run at double speed, and a bow draw or crossbow reload can at most take half its time
MinRunStaminaCost 0.2 The least sprinting can cost, as a fraction of its cost with no discounts. The game adds run discounts together and stops at zero, so without this a full hand of cards plus Eikthyr's power made running free. 0 turns the floor off
ReconcileMaxLoss 0.34 How much of the ledger's runestone history may vanish from cards.txt in one go before the server refuses to reconcile at all, as a fraction of the distinct ids players hold. Server-side only

ReconcileMaxLoss is worth understanding before you edit the catalogue. Removing a runestone from cards.txt hands its picks back and drops the ranks bought in it, which is correct when it was meant and is a permanent wipe when the catalogue merely failed to load. Over the threshold, nothing is returned and nothing is removed; the server logs why on every login and leaves every record alone until you fix the catalogue or raise this and restart. A catalogue that is missing, unreadable or empty is refused whatever this is set to.

Death

Key Default Effect
RemoveDeathSkillLoss true Skip Skills.OnDeath, which removes the level loss, the accumulator wipe and the message together

Gate

These bound what a client's skill-up report can be worth. Skills live on the client, so a report cannot be verified, only bounded. None of them detects a cheat, none disconnects anyone, and nothing is ever taken away. They are inert in single player.

Key Default Effect
CheckSkillBaseline true On login, take the character's skill list as the baseline this server pays from. Off also turns off MaxSkillLevelJump
CreditExistingSkills true Pay a joining character for the skills it already has, so it arrives at the level those skills are worth with the picks to spend. Off counts only level-ups watched on this server
MaxSkillUpsPerMinute 30 Ceiling on accepted skill-up reports per player
MaxSkillLevelJump 1 Levels above the baseline a single report may claim. Raise it only if you run a mod that grants skill levels in bulk
MaxXpPerMinute 600 XP paid per player per minute of connected time. 0 or less turns it off
XpBurst 1800 How much unspent allowance banks, so an honest burst is still paid in full
CappedMessage see cfg Shown once per session, centre screen, when the earning cap withholds XP

Crediting a joining character has a cost: a maxed vanilla character walks in at Rist level 219 with the picks to take most of the catalogue. If that matters on your server, restrict who can join rather than withholding XP. Dyrr does that.

Plate

Key Default Effect
ShowPlate true The Rist line above other players' heads. Off also stops this character publishing its own numbers
ShareRanks true Let players read each other's runestones on the rists page. Off, the server answers with an empty list. A host rule
PlateFormat see cfg Tokens {lvl} {xp} {days} {name}, rich text, \n for a second line. Drop a token to drop that field

Bar

Key Default Effect
ShowXpBar true Show the experience bar. It hides with the rest of the interface
VanillaBar true Clone one of the game's own bars. Off draws a plain rectangle, which is also the automatic fallback if the clone fails
BarUpright false Stand the bar on end like stamina and eitr. Off lays it flat, which is what a long bar needs
BarFollowStamina true Place the bar relative to the stamina bar. Off falls back to BarPosX / BarPosY, as does a stamina bar that cannot be found
BarOffsetX / BarOffsetY 0 / 70 Pixels right of and below the stamina bar's centre, when following it
BarPosX / BarPosY 172 / 105 Pixels from the left edge and the bottom to the bar's centre, when not following
BarSize 240 Length in canvas units, the units vanilla sizes its own bars in. 64 is a starting stamina bar. Thickness comes from the borrowed sprite and is not settable
BarBuildRaise 155 Pixels to lift the bar while the build or ship panel is open
BarColour 4FB3A5 RRGGBB. The trailing fill is the same hue held back. E4DCC4 for bone. An unparseable value falls back to gold
BarFlashSeconds 4 How often the cloned bar pulses while a pick is waiting
BarNoteGap 6 Gap between the top of the bar and the "rist waiting" note above it
BarX / BarBottom / BarThickness / BarLength 168 / 75 / 10 / 60 Place the fallback bar only

Every pixel number in the [Bar] block is multiplied by your HUD's canvas scale, so one value is the same visual position on every screen. BarSize is in canvas units and is already scaled by the game.

Multiplayer

Progress is kept on the server, in BepInEx\config\rist-ledger.txt, keyed by the platform identity of the connection and the character being played. Valheim character files live on the player's own disk, so nothing that decides rewards can be stored there. The client reports only that a skill went up; every number is derived server-side.

Single player takes the same path with no special casing, and the throttles are inert there.

With Longhouse Core

Core is a soft dependency. With it installed on both ends:

  • Client mod versions and build ids are checked on connect, and mismatches are rejected.
  • A hash of cards.txt travels with that check, so two ends running the same build over different catalogues are reported.
  • The host's Rist config is applied on connected clients, in memory only. Your own config file is not modified, and your values come back when you disconnect.
  • Inventory row claims are arbitrated, so Rist and any other row-granting mod stack instead of overwriting each other.

Without Core

Rist installs and runs on its own, and solo you give up nothing. On a server you give up three things:

The catalogue is no longer checked. cards.txt names what every rank is worth, effects are applied client-side from it, and the server only ever verifies the rank. A client that edits its own catalogue gets whatever it wrote.

The host's curve is not applied. A client with a different LevelBaseXp reads a different level out of the same XP, and every number on its screen disagrees with the server deciding them. The .cfg files have to be matched by hand.

Inventory rows are claimed without an arbiter. Inventory.m_height is a single private int with no owner, so two mods that both want rows each write it and the last writer wins. Rist's standalone owner is correct on its own and conflicts with any other mod that grants rows, with the winner decided by frame ordering. Install Core if you run one.

Rist logs a warning at startup when it starts without Core, naming all three.

Compatibility

  • Requires BepInEx 5. Not compatible with BepInEx 6.
  • 1.2.0 and later require Valheim 1.0. Earlier versions do not run on 1.0, and this one does not run on pre-1.0 Valheim.
  • Conflicts with other mods that add player inventory rows unless Longhouse Core is installed. With Core, they stack.
  • Vanilla skills are read and never written, so mods that change skill gain, add skills or rebalance the skill curve work alongside this. A mod that grants skill levels in bulk will trip MaxSkillLevelJump on a server; raise it.
  • The three attack-speed specials patch Attack.Start and set the animator speed through CharacterAnimEvent.Speed. Another mod driving the same number will fight over it.

Updating a server

The ledger format is v4 as of Rist 1.1.0. A v4 line does not parse on 1.0.1 or earlier and is dropped rather than erroring, so copy rist-ledger.txt aside before updating a server you care about. v1 to v3 lines are still read and come back as never re-priced.

Troubleshooting

A config change did nothing. BepInEx writes the whole file on first run and the saved value wins over a new default. Edit BepInEx\config\ezomic.valheim.rist.cfg. On a server with Core installed, the host's values are applied over yours while you are connected.

An edit to cards.txt did nothing. It is read once at load. Restart the game.

The startup log says NOT READY. cards.txt is missing, unreadable, or every line was rejected. The warnings above that line name each rejected line. Reinstall if the file is gone: it ships with the mod.

There is no tab on the compendium bar. Check ShowInfoTab, then look for "No compendium tab to clone" in the log. There is no keybind, so that message means the panel has no way in and is a bug worth reporting.

Level is 0 on a server. Check Rist is installed on the server as well as the client, and check CreditExistingSkills.

"You are earning faster than this world will pay for." The server's earning cap is withholding XP. MaxXpPerMinute and XpBurst control it.

The server log says it is refusing to reconcile. More of the runestone history than ReconcileMaxLoss allows is missing from cards.txt. Nothing has been lost; fix the catalogue or raise the setting and restart.

Known limitations

  • Nothing in the runestone catalogue has been tuned against anything but reasoning and a small amount of live play. The curve has been retuned twice off real ledger data; the per-rank values have not.
  • With a free choice the strongest runestone is always available, so balance rests on the per-rank values and on MaxRank.
  • The plate is published by each client onto its own character, so a modded client can put whatever it likes there. The server's ledger is still the only thing that grants a pick.
  • A character who is not online has no name on the other-players page, since the ledger stores none, and is shown by the last four digits of the character id. Ranks are shown as the server holds them, so a character's page can be a few seconds stale until the page is opened again.
  • Ranks taken before ledger v3 have no recorded level and show a dash permanently. Everything taken since is exact.
  • SE_Stats has no max health, stamina or eitr field, since those come from food in Valheim, so no max-pool runestone is possible without a different mechanism.

Design notes

Why picks are chosen rather than dealt, why a capstone sits at the end of a track, how the bar is built out of a vanilla one, and why the ledger lives where it does: DESIGN.md.

Bug reports

The Discord is the fastest route, and the right one if you are not sure whether what you are seeing is a bug. Issues on the repo suit anything long.

Attach BepInEx\LogOutput.log, and say whether you were on a server or in single player. For a runestone behaving wrongly, include the line from cards.txt. If a vanilla mechanic broke, AppData\LocalLow\IronGate\Valheim\Player.log is where gameplay exceptions land, and it is a different file from the one BepInEx writes.

Bugs and ideas

Both go to the site. longhouse.thijssensoftware.nl/bugs is for anything broken, and longhouse.thijssensoftware.nl/ideas is for what a mod should do next. You can vote on other people's ideas there as well.

Signing in takes a Steam or Discord account. I work from that list, so the votes decide what I pick up next.

Discord

discord.gg/hJzAVaZ5wb is where mod information, updates, support and bug reports go.

Server

There is a small EU server running the pack if you want somewhere to play: hard combat difficulty, resources at 1x, everything else vanilla, no application and no activity requirements. Connection details are in the Discord.

Part of Longhouse

Rist is part of Longhouse, a pinned set of the Ezomic mods that installs in one click. You do not need the pack to use Rist, and it behaves the same on its own.

Credits

Rist is an original mod by Robbin Thijssen (Thijssen Software). Copyright (c) 2026 Robbin Thijssen. MIT licensed. See LICENSE.

CHANGELOG

Changelog

Notable changes to Rist. Format follows Keep a Changelog, and the mod uses semantic versioning.

[1.8.0] - 2026-10-08

Built, not yet played: none of this has been run in game, and the scenarios have not been run on this build.

Added

  • Other players' runestones (LHM-65). When anyone else is on the server, a row of tabs sits above the rists page: yours first, then one per character, each with its level and a dot that is green when they are online and grey when they are not. Online characters come first, then every character the server has a record for, highest level first, up to 40. Picking a tab shows that character's stones with the rank after each name, their level, how many stones they have carved and how many marks, and the column beside the field still follows the cursor. It is read only: there is nothing to carve, the next-rank line is gone and the foot of the column says so. Nothing is sent until the page opens. It then asks the server once, and the server answers with one line per character in the same text its ledger already uses, so there is no new storage and nothing is broadcast. A character who is not online has no name to show, because the ledger keeps none and the server only knows the names of the players connected, so they are shown as "Char" and the last four digits of their character id, and the page says so. The host can turn the whole thing off with ShareRanks in the Plate section of the cfg (on by default); off, the server answers with an empty list and the page looks as it did. Every player and the server need this build, as the request is new.
  • rist others prints what the page was told, one line per character, and rist others ask sends the request the page sends. Used by the new scenarios, rist-others-solo and the pair paired-rist-others-viewer and paired-rist-others-peer.
  • The other-players list and the character state are accepted only from the server (or from yourself when you host), so another player on the server cannot send your client a forged list or a forged level. The list is also dropped if it is longer than 64 KB. The list no longer carries each character's exact XP, which nothing read, so a line is id|online|name|level|cards; the feature is new in this update, so no released version speaks the old form. Two unnamed characters whose ids end in the same four digits are told apart by longer tails. The note under another character's page now has room of its own below the stones instead of being drawn over them, and the tab strip is measured again when your own level gains a digit.

Changed

Fifteen capstones were replaced so that each is a new behaviour in its own stone's theme, and none is a bigger number on the stone's own stat or another stone's effect (LHM-44). Ranks are untouched, so everything anyone has carved stays exactly as it was, and no pick is refunded: anyone who carved a stone to rank five has the new capstone from this version, and loses the old one. Stone ids, ledgers and the per-rank effects are unchanged. Sure-footed's landing roll came in 1.7.1 and is not touched here.

  • Steady arm: the capstone is now Last blow. The swing that kills gives half its stamina back (it was all of it in the first draft; LastBlowShare in the cfg). It used to be +20% parry bonus, which the stone has nothing to do with. The price is read where the game works it out, after every discount, and the kill is read from the creature's health a moment after the hit rather than from its death, so it works the same when another player's machine owns the creature. One refund per swing: a sweep that kills three gives it back once. A weapon that charges nothing for the shot refunds nothing.

  • Keen hand: the capstone is now Combo holds. A weapon combo chains from a swing up to 0.6 seconds late, where the game drops it back to the first hit after 0.2. It forgives your rhythm instead of adding speed to a stone that is already about speed. It used to be +5% damage on every weapon, close to Keen edge's own effect, so melee damage no longer comes from this stone at all. Melee weapons only, and the axe counts as a tool, the same split the swing-speed cards use.

  • Turned blade: the capstone is now Return blow. A good parry, a block in the first quarter second with a shield or weapon that has a timed block bonus, makes your next melee swing cost no stamina, if you take it within five seconds (ReturnBlowSeconds). One swing spends it, and a swing the game refuses keeps it. It works at an empty bar, since the price is read as nothing from the moment the swing starts. Melee only: swords, knives, clubs, polearms, spears, fists and axes; pickaxes and the other tools, bows and staffs do not count. A block that stamina or stagger broke through is not a good parry and arms nothing. It replaces Riposte, the first draft, which threw a quarter of the blocked damage back at the attacker; that code is gone. The -8% block stamina the capstone always gave stays, as a companion, so nobody who carved the stone loses it.

  • rist parry pretends a good parry just happened and rist swing starts a swing with what is in hand, so Return blow has a scenario. rist show prints what the last swing was priced and what it paid.

  • Quick draw: the capstone is now Second nock. Loose a shot and the next draw you begin within a second and a half starts 15% full, so the follow-up arrow comes quicker and a lone shot is drawn as it always was. It used to be +5% damage from bows and crossbows, a number on a stat the stone does not own. It is still a draw-speed effect on a draw-speed stone, so it is the closest of these capstones to its stone's own stat; what is new is that it rewards the second arrow and not the first. Bows only; the crossbow keeps the reload speed from the ranks. The head start is 15% of the bow's real draw time at your skill and composes with the ranks' faster draw. It started at 30% in the first draft and the capstone review cut it to 15%; the share is SecondNockShare in the cfg.

  • Thick-hided: the capstone is now Bruise cap. No single hit can take more than half of your maximum health, so a character at full health cannot be killed by one blow, and a boss still wears you down over a fight. It replaces Shrug (a hit under 4% of your health does nothing), the first draft of this capstone, and it used to be another 5% armour before that. The cap is applied to the final damage of one hit, after armour, resistances and the world's damage-taken setting, and the whole hit is scaled down, so its stagger shrinks with it. Damage over time is not capped: burning, poison, smoke, cold, drowning, lava and ocean heat tick as hits of their own types and are left alone, as are the edge of the world and your own health costs. A fall is capped, as any other single hit: the fall system only decides how much damage there is, so nothing breaks, and a drop that would have killed a full-health character now leaves them at half. The share is BruiseCapShare in the cfg (0.50). Thick-hided's armour from the ranks is unchanged.

  • rist hurt <n> [enemy] [full] takes a plain hit through the game's own damage path and prints what it took off the health bar and as a share of maximum health, as a creature's hit with enemy, after topping the health up with full. It exists so Bruise cap and the other health-reading capstones have a scenario.

  • Steady footing: the capstone is now Footing back. For three seconds after you recover from a stagger, nothing staggers you again, so a stagger can no longer be chained into the next and the next. It used to be another 5% armour, which is Thick-hided's stat. The first stagger is exactly as dangerous as before; the guard only ends the chain behind it. This is the alternative offered for Rooted, on purpose. Rooted as proposed, no knockback from a creature's hits, is too strong a capstone: a Troll or a Lox that cannot shove you is a lot more than a stagger bar, it would have made the stone the obvious pick, and knockback is how a fight is escaped as well as how it is lost. Steady footing's ranks are unchanged.

  • rist stagger staggers the character the way a creature's blow does, for the scenarios that need one.

  • Swift-mending: the capstone is now Patch-up. Ten seconds after your last swing or hit taken, you recover a quarter of the health you lost in that fight, over five seconds. It is regen that arrives when the fight ends, so it saves potions and not lives, and it does nothing to soften a death in the middle of one. It used to be +2 flat armour, which is another stone's job. What was lost is counted from your health falling and shrinks by any other healing, so a mead drunk mid-fight does not get healed a second time, and a hit or a swing while it is mending cancels the rest. The 8% health regen from the ranks is unchanged.

  • Long wind: the capstone is now Second wind. The first time your stamina runs out, a quarter of the bar comes back at once, and it cannot happen again for 90 seconds. It is the gasp that buys one more roll or swing, and it is not regen speed, so it no longer doubles the stone's own stat. It used to be another 10% stamina regen on top of 8% a rank. Running dry on a sprint triggers it as well.

  • rist spend <n> spends stamina the way swinging does, and a large number empties the bar. For the Second wind scenario.

  • Soft step: the capstone is now Lose them. A creature that has lost you gives up the hunt after 12 seconds instead of 30, where "lost" means it has neither seen nor heard you for that long. Bosses and creatures that hunt players are left alone. It used to be -10% noise, which is exactly Quiet wake's effect, so the two stones were each other's capstones. A creature's AI runs on whichever machine owns the creature and that machine holds only its own player's stones, so the stone is published as a flag on your character that every client reads; that flag is the shared plumbing for Soft step, Weatherly, and it is written only when it changes. Soft step's ranks, -8% detection each, are unchanged.

  • Quiet wake: the capstone is now Silent step. Crouched and moving no faster than a crouch-walk, or standing still, you make no noise at all. The stone's ranks already make every noise 8% smaller each (the game's own noise modifier); this drops the noise before it is recorded. The exact rule: the local character is crouching, and its flat speed is at most the crouch-walk speed with ten percent of slack; then the game's two noise entry points, Character.AddNoise for your own sounds and Character.RPC_AddNoise for the ones another machine reports for you (a tree you hit), are skipped. A vanilla crouch-walk is already silent on foot, so what this removes is everything else a creeper does at that pace: a swing, a plank, a rock struck, a roll. Standing up or moving faster than a creep leaves the game's own noise, ranks included. A bow drawn from a crouch stands you up for the animation, so a shot is not silenced; Low draw is that stone's job. SilentStep in the cfg switches the capstone off. It replaces Sleepers sleep on, the first draft, which kept sleeping creatures asleep and mattered only where creatures sleep; that code and its flag are gone, and the shared flag Soft step and Weatherly use no longer carries a Quiet wake bit. It used to be -10% detection, Soft step's own effect. Quiet wake's -8% noise a rank is unchanged.

  • rist crouch [off] crouches or stands the character and rist noise makes a noise of range 30 from a cleared slate and prints what the game recorded, so Silent step has a scenario.

  • Long stride: the capstone is now Momentum. After five seconds of running in a straight line you run 5% faster, until you stop or turn sharply. The bonus grows in over one second so it does not pop. Running means the stamina-draining sprint, so sneaking never counts; swimming, a ship's helm, a ship's deck, riding and rolling do not count either, and the speed must stay above walking pace, so running into a wall ends it. A jump does not end it. A sharp turn does, which means the direction you travel comes 40 degrees away from the line you were on, and a gradual curve does not. It replaces Steep ground, the first draft, which raised the slide angle from 38 to 46 degrees; that patch is gone. The stone's old 15% jump height (*jumpheight) and the landing guard that measured a raised jump are gone with it, since nothing else used them; this takes the jump height away from anyone who carved Long stride to rank five. The landing roll that shares the code is untouched. A catalogue line naming *jumpheight is skipped with the usual warning. Momentum is a second speed source, on purpose. Long stride's ranks are +2% a rank and stay the cap's 10%, and Momentum is 5% on top of that while the streak lasts, so a full run at rank five is 15% over a jog. The reason the cap exists, a bonus that is always on and never noticed, does not apply to a bonus that is earned and lost; the numbers are MomentumSeconds, MomentumBonus and MomentumRamp in the cfg. rist show no longer prints a jump height or a slide angle.

  • rist momentum [s] pretends the run has lasted that long and reads the game's own run speed factor with and without Momentum, and rist run [s] runs straight ahead in place of input and keeps the speeds before and after the streak.

  • Far sight: the capstone is now Spyglass, and the stone's own radius is 10% a rank instead of 5%. Hold a key (Z by default, SpyglassKey in the cfg) and the view zooms far ahead like binoculars: the field of view eases down to a quarter of its normal value (SpyglassZoom, 0.25) and eases back when you let go. The mouse look slows by the same factor while you are zoomed so the view can still be aimed (SpyglassSlowTurn). It works in first and third person, on foot, on a ship or on a mount, and not while chat, the console, a text field or any window is up, not while you are placing a building piece, and not in a cutscene. The key, the zoom and the slow turn are your own settings even on a server, and Z was checked against the vanilla bindings and every other mod here. It composes with the game's own field of view changes instead of replacing them. It replaces Lookahead, the first draft, which uncovered a second map circle ahead of you; that code is gone, and so is the radius-prefix guard it needed. The ranks are now +10% explore radius each, 50% at rank five (it was 5% a rank, 25%), and the stone's line reads "Each rank: the map reveals 10% further." Anyone with ranks keeps them and gets the larger circle.

  • rist spyglass [off] holds the spyglass as its key does, and rist show prints the zoom, the target field of view and the camera's own.

  • Tide-borne: the capstone is now Gasp. After your stamina runs out in water, drowning damage waits twelve seconds before its first tick instead of one, which is time to reach a boat or the shore. The ticks after the first are the game's own. The capstone review doubled the wait from six seconds to twelve (GaspSeconds) and added a second bite: swimming costs 25% less stamina at rank five (GaspSwimStamina), so a swimmer also lasts longer. The +6% swim speed a rank is unchanged.

  • Weatherly: the capstone is now Rides the waves. Slams into waves do no hull damage while you hold the helm, and collisions with rocks, ice and the shore cost the hull half as much (RidesTheWavesCollision, added by the capstone review), which is the other half of staying afloat in weather: the ranks bend the sail to windward and this keeps the hull. Only the water impact is spared; a ship that is upside down and the Ashlands still hurt it. The ship's physics run on whichever machine owns the ship, so the stone is read from the flag the helmsman publishes, and a passenger's stone does nothing. It used to be 20% rowing speed, a second kind of speed on the stone's own job. *rowspeed is still a supported special for a catalogue that names it.

  • Sure hand: the capstone is now Whetted. Axes and pickaxes lose 40% less durability, so a tool outlasts the vein. It used to be +12% stamina regen, which is Long wind's job. What a swing wears off the tool is read around the attack and 40% of it is put back, never more than was spent, so it cannot mend a tool. It is by skill, so an axe swung in a fight wears less too, and the hammer and the hoe are not covered. The tool swing speed is now +5% a rank, 25% at rank five, up from +3% (the capstone review). Balance note for the capstones (LHM-44), written before anyone has played them. Judged against the capstones that were already behaviours (Quick chant, Answering blow, Unseen blow, about a 3 out of 5), and meant to leave no capstone the obvious pick. None of this has been tested in play.

  • The ones to watch, after the review. Thick-hided's Bruise cap is the new strongest: half of the maximum health as a ceiling on one hit makes a full-health character unkillable by any single blow, which is most of what a boss fight is, and the share is BruiseCapShare if it proves too much (0.6 or 0.7 still stops a one-shot from a bad trade). Long stride's Momentum is the first second speed source, past the 10% cap by 5 points while a run lasts; MomentumBonus is the knob, and the cap's note in cards.txt says why this one is allowed. Turned blade's Return blow is a parry build's, and the stone keeps its block stamina as a companion; dropping that is one line in Card.Companions. Tide-borne's Gasp is stronger than its first draft, a 12 second wait and 25% cheaper swimming, and Rides the waves now also halves rock and ice damage to the hull.

  • Level, around a 3. Footing back (it ends stagger chains, and nothing else about a stagger), Second wind, Lose them, Second nock (halved to a 15% head start). The 90 seconds of Second wind is SecondWind.Cooldown.

  • Around a 2. Last blow (halved to a 50% refund), Combo holds, Patch-up (it saves potions and not lives), Whetted (with Sure hand's swing speed now 5% a rank), Silent step.

  • The weakest, on purpose and by nature. Spyglass is a view, not power, and the radius of the stone is now 10% a rank, so it is the only Utility capstone that is felt every time the key is held. The Utility stones were already the weakest picks and still are. Raising them was not attempted: a capstone that is only ever felt in one place is the right size for a stone that is felt in one place.

  • One was not built. Rooted for Steady footing was replaced by its alternative, Footing back, as set out above.

[1.7.2] - 2026-10-06

Fixed

  • The mouse stuck to the middle of the screen on the runestone page, for real this time (LHM-64). The 1.7.1 fix aimed at the wrong thing. With the inventory hidden, the game locked the cursor every frame and Rist unlocked it every frame. On Windows you never see that. On Linux a lock puts the pointer back in the middle of the window, so on a Steam Deck it was re-centred sixty times a second. Rist now takes over that one check while the page is open and frees the cursor the way the game's own windows do, so nothing gets locked. Found by reading the code. It is not reproducible on Windows and has not been confirmed on a Deck.

Added

  • The runestone page works with a controller. The game has no cursor for a pad on PC, and this page has no buttons for it to walk focus between. The left stick now moves a pointer of the page's own, A carves the stone under it and B closes the page. The mouse or a trackpad takes the page back as soon as it moves.
  • The first time the page opens in a session, the log names the input device the game thinks is active and what the cursor was doing. With Verbose on it does this on every open.

[1.7.1] - 2026-10-05

Changed

  • Sure-footed no longer makes you immune to falling (LHM-59). This takes something away from anyone who carved it to rank five. The ranks stay and keep what they gave, -10% fall damage each, so -50% at rank five. The capstone was a second -50%, which added up to -100% and turned a fall from any height into nothing. It is now a landing roll: a dodge pressed in the last 0.3 seconds before you touch down makes the fall count 8 metres shorter, before the percentage is taken. A fall of 20 metres, which kills in vanilla, counts as 12 and costs a quarter of your health at rank five where it used to cost nothing. A fall from the top of a mountain still hurts, roll or no roll.

    The dodge has to be one you could make. It does not count with an empty stamina bar, over your carry limit, or while you are attacking, staggered, rolling or dead, and it spends the stamina a roll always does. A roll pressed earlier than that, or after you land, does nothing, and a dodge cannot be saved for a later drop. Switching Rist off switches the roll off too. Nothing is refunded, since the ranks keep what they gave. The capstone is a different thing at the same rank. With Long stride, the roll is applied after its landing correction, so both hold.

  • New *landing:roll special for cards.txt. rist fall <metres> [roll] stages a landing for testing and rist show prints the last one. The scenario rist-landing-roll runs it.

Fixed

  • The mouse could stick to the middle of the screen on the runestone page (LHM-64). While the page is open Rist keeps the cursor free, and it did that by writing the unlocked and visible state every frame. On Windows that changes nothing, but on SteamOS a player's pointer stayed pinned to the centre on this page and no other. The state is now written only when the cursor is not already free, which on the compendium is almost never. Reported on Discord and not reproduced on Windows, so it stays unconfirmed until that player tries it.

[1.7.0] - 2026-09-24

Fixed

  • Sprinting could be free. The game adds run-stamina discounts together and stops at zero. Tireless, Long wind and Long stride at rank 5 came to -51%, Eikthyr's power is -60%, and the two together hit zero. MinRunStaminaCost puts a floor under it: at the default of 0.2, sprinting always costs at least a fifth of its normal rate. Either source on its own stays above the floor and is unchanged. Reported by AllHailPidgey.

Changed

  • No capstone touches running any more. All three movement stones finished on run stamina, which is how the stack got that deep.
    • Tireless: stamina starts coming back 0.6s sooner after you stop spending it, out of the game's 1 second pause.
    • Long wind: +10% stamina regen on top of the +8% a rank, the same shape as Brimming.
    • Long stride: you jump 15% higher. The landing is measured from the height a normal jump would have reached, so your own jumps never hurt more than they did before. Jumping off a ledge still hurts for the drop below where you left the ground.
  • A full hand of all three now takes 25% off running rather than 51%.
  • Steady footing takes 5% off stagger a rank instead of 6%, 25% at rank 5.
  • Ox-backed's last rank no longer touches stagger. Walking while over your carry limit costs half the stamina instead, 5 a second rather than 10, so you can shuffle twice as far before you have to drop something. You are still slow and still cannot run or recover stamina.
  • Together with Fader's power, which is -50% stagger on its own, the old Steady footing and Ox-backed made each hit fill the stagger bar at a twentieth of its rate. It is a quarter now.

Added

  • Three specials for cards.txt: *staminadelay, *jumpheight and *overloaded. *jumpheight is a share of how high you jump, not of jump force; 15% more height takes about 7% more push. The delay never drops below 0.25s, because at zero stamina would refill during a sprint.
  • rist show prints the run-stamina multiplier the game is actually charging, the stamina delay and the jump height, which is what the new scenarios check.

[1.6.0] - 2026-09-22

Added

  • A rist console command, for singleplayer and for whoever is hosting. rist show prints this character's level, xp, ranks and the armour the game is actually using; rist rank <card> <n> forces a card to that rank. It needs devcommands, and the game's own cheat gate is ZNet.IsServer(), so a client cannot point it at a dedicated server's records. Ranks were otherwise only reachable by clicking the panel, which put five ranks nine skill levels away from anyone balancing a stone.

Changed

  • Thick-hided is a percentage now: +3% armour a rank instead of a flat +2, and another 5% at rank 5 in place of the stagger capstone, so a fully carved stone is +20% armour. The game takes dmg * dmg / (4 * armour) once your armour is at least half the hit, so damage taken is inversely proportional to armour and the old flat +10 cut about a third of a hit at 20 armour and under a tenth of it at 100. It stopped mattering around the Plains, which is where Rattennest raised it on the ideas board. A character with ranks in Thick-hided keeps them and those ranks buy the percentage.
  • Steady footing's capstone is +5% armour instead of +2. Its capstone has always been a dose of whatever Thick-hided gives per rank, so it follows the change above, and no card grants flat armour now. The one place a flat number was better is the other branch of the curve, a hit bigger than twice your armour, where the game subtracts rather than divides: +2 saves 2 damage there and +5% saves 5% of your armour, so the old value only won below 40 armour.

[1.5.1] - 2026-09-20

Fixed

  • The runestones sometimes showed plain letters instead of runes. Logging out to the main menu unloads the part of the game that holds the rune font, and the panel kept drawing with the font that was gone until the game was restarted. Rist now uses the game's permanent copy of its fonts, which is never unloaded, and rebuilds the panel if a font it uses disappears anyway.
  • Long capstone text was cut off on the right. The lines beside a stone (now, next and capstone) wrap onto a second line instead.

[1.5.0] - 2026-09-15

Added

  • Quick chant, in Combat: staffs cast 3% faster a rank, both Elemental and Blood magic. Its capstone means a hit cannot stagger you out of a cast until the spell has left the staff, every projectile of it for a staff that fires several. Staffs that fire several projectiles per cast fire all of them at the faster speed. A looping staff that pays its eitr once per hold is not sped up, since that would be free projectiles rather than a faster cast.
  • Answering blow, in Combat: a perfect dodge with an enemy nearby arms your next hit on an enemy for 4 seconds, 10% more damage a rank. At rank 5 that hit has a 30% chance to stagger anything a parry would, never a boss.
  • Low draw, in Stealth: drawing a bow from a crouch still counts as sneaking for the first second of the draw a rank, along with the shot itself. The game stands you up to draw and used to stop counting you as sneaking; the character still rises. At rank 5 arrows loosed from a crouch make no noise where they land, so a miss does not alert the animals around it.
  • Unseen blow, in Stealth: sneak attacks hit 10% harder a rank, with weapons that have a sneak attack. At rank 5 a sneak attack staggers the creature, once per creature every five minutes.
  • Deep draught, in Endurance: buff meads last 10% longer a rank. At rank 5 each buff mead has a 25% chance not to be used up when you drink it. It covers Fire Resistance Barley Wine, Frost and Poison Resistance Mead, Berserkir Mead, Mead of Troll Endurance, Draught of Vananidir, Brew of Animal Whispers, Tasty Mead, Anti-Sting Concoction, Love Potion, the Lingering Healing, Stamina and Eitr Meads, Tonic of Ratatosk and Lightfoot Mead. It does not cover the Minor, Medium and Major Healing Meads, the Minor and Medium Stamina Meads or the Minor Eitr Mead, which restore. A longer Lingering mead also keeps its matching potions locked out for longer.
  • Oath-bound, in Utility: the forsaken power's cooldown is 5% shorter a rank. At rank 5 the blessing lasts a minute longer for everyone it reaches when you cast it, for every power. Cast by someone without it, it lasts the normal time for everyone.
  • Soft step's tile reads "detection" and Tireless's reads "move stamina", and the panel's cells and towers sit a little closer. The longest value line was widening every cell, which on a 1920x1080 screen pushed five towers off their full-size layout onto small lying stones.

Changed

  • Quick draw now reloads a crossbow faster too, at the same 3% a rank it draws a bow. The crossbow's reload is most of its firing cycle, and the card used to leave it alone.
  • Quick draw's capstone is bow and crossbow damage. It was 5% damage to every weapon, the same as Keen edge. A fully carved Quick draw no longer adds 5% to melee.
  • AttackSpeedMax now also caps how much Quick draw shortens a crossbow's reload and how fast Quick chant runs a cast, and its description in the cfg says so.

[1.4.1] - 2026-09-14

Changed

  • The rists panel sits at the top of the screen instead of in the middle, so a short field no longer floats with empty space above it.

[1.4.0] - 2026-09-14

Six runestones did not do what their tile said. Tireless, Long wind, Long stride and Quick draw each had a part that did nothing, and Soft step and Quiet wake made you easier to see. Your ranks are kept and now take effect.

Fixed

  • Soft step made you easier to see. Stealth in Valheim is a multiplier on how far away a creature spots you while you crouch, so lower is better, and Soft step added to it. A fully carved Soft step could have you seen from up to 40% further away while crouching in the dark or at a higher Sneak skill, and it never helped. It now takes 8% off that distance per rank, as the tile always claimed. Quiet wake's capstone had the same mistake and is fixed the same way. The tile now reads "sneak visibility", since "-40% stealth" would read as a loss.
  • Three running discounts did nothing. Tireless's per-rank running discount, Long wind's capstone and Long stride's capstone all changed a stat the game never reads. Sprinting is charged through a different one, and all three now use it. Tireless's capstone was already on the right stat, so it now stacks with a working 5% a rank.
  • Quick draw did not speed up drawing a bow. It sped up the release, because swing speed is the animation and a bow's draw is a timer the animation never touches. A bow now reaches full draw 3% faster per rank, and damage, arrow speed, the reticle and the bow's bend all follow. On a crossbow it still speeds up firing, not reloading.

Changed

  • The rists panel stands the runestones in ættir. Combat, Survival, Endurance, Stealth and Utility: towers two stones wide under a heading and a carved count, side by side. It fits the screen it is on instead of being a fixed width, so it no longer runs off the bottom of a short window, and a new ætt adds a tower to the right instead of a row. On smaller screens it tries smaller stones, then lays the ættir down, and only then drops the value line from the tiles; it never scrolls. The stone the column beside is describing now has its name in gold, and that column names its ætt.
  • PanelColumns is gone, since the panel works out its own layout. PanelBottomInset is new: set it if a taskbar covers the bottom of the game window. It stays your own setting on a server. An old cfg keeps the PanelColumns line, which does nothing.
  • The labels in the column beside the stones are 12px, up from 11.
  • cards.txt is regrouped under ætt headings, so client and server need the same build. No runestone's id changed, so every rank is kept.
  • Weatherly's tile reads "-6% dead zone" rather than "+6% sailing into the wind", naming the black arc on the wind ring that it actually narrows.

Added

  • Rist warns at load if a runestone names a stat the game never reads, or gives a stat where lower is better a positive value. Both mistakes load cleanly and show a believable number on the tile, which is how these shipped.
  • AttackSpeedMax now also caps how much Quick draw shortens a bow's draw, and its description in the cfg says so.

[1.3.1] - 2026-09-12

Far sight and Weatherly did nothing in 1.3.0. They work now. Update if you carved either one; your ranks are kept and take effect.

Changed

  • Weatherly now makes you faster to windward. Each rank narrows the dead zone and points the sail's push toward the bow inside the arc it opens, so a fully carved card moves your best upwind heading from 52 degrees off the wind to about 36, roughly 71% faster. Dead upwind still stalls, so tacking is shallower rather than gone. It used to only narrow the zone, which did nothing you could feel: the game aims the sail's force sideways near the wind, so every heading the card opened was slower to windward than vanilla's own best.
  • Weatherly's capstone makes you row faster rather than tack faster. Rowing is a separate force from the sail, and it is what you are left doing when you still cannot point high enough. It applies forward and back.
  • Weatherly and its rowing capstone apply only to a ship you are steering, read from the helm itself, so a passenger cannot sail someone else's boat on their own runestones.
  • With Weatherly carved, the wind ring's black dead zone narrows to match. It used to keep showing vanilla's, so the boat sailed with the wind pointer sitting in the black. The black now ends where the sail is half drawn, on both sides of the bow. Without the card the ring is untouched.

Fixed

  • Far sight and Weatherly did nothing in 1.3.0. Their patches were written but never registered, so no map widened, no dead zone narrowed and no boat rowed faster, and a fully carved Weatherly sailed exactly like none. Nothing failed and nothing was logged. Both work now, and Rist checks at startup for any patch that was written but never applied, and logs an error naming it. If you spent picks on either in 1.3.0, those ranks are kept and now take effect.
  • Several runestone values showed as raw numbers. Far sight and Weatherly read "+0.1 map sight" where they meant +5%, and Tireless's capstone read "-0.2 m_runStaminaDrainModifier", with no name and the value rounded to the wrong number. They read as percentages now, and Rist warns at load if a card's value would be shown as a raw fraction, so the next one is caught before it ships.

[1.3.0] - 2026-09-12

Added

  • Far sight and Weatherly, two runestones that widen what the world gives back rather than what you do to it. Far sight multiplies Minimap.m_exploreRadius by 5% a rank, so the map uncovers further as you walk, with the capstone worth another 10%. Weatherly is the sailing one: Ship.GetWindAngleFactor kills the sail inside a hard cone around dead upwind, and that cone is the only reason tacking exists, so the card puts a floor under it and lets you point nearer the wind before the sail dies. Its capstone is 20% more speed while beating upwind.

    Deliberately not more move speed. That card is capped at 10% from a single source because a permanent speed buff is always on, never noticed while you have it, and a player told us Rist had made his unmodded playthroughs feel worse. Neither of these follows you home: a bigger map radius is felt only on ground you have not walked, and the wind cone only at sea with a sail up. Weatherly leaves the across-the-wind term alone and is clamped so upwind can never beat a beam reach, since raising that term would just be a flat speed bonus in a hat.

  • A Rist line above other players' heads - level, total XP, and days since their last death - written into the game's own nameplate rather than drawn beside it, so it inherits the plate's font, fade and distance rules. ShowPlate turns it off, PlateFormat is the whole of the presentation: fields, order, colours, and whether it wraps to a second line.

    The HUD half was one postfix. The data half is why this is more than that: nothing about another player's Rist state is on the wire, since the server pushes a record to the peer it belongs to and to nobody else. Each client now publishes its own level, XP and last-death day onto its own character's network object, which every client in range already replicates. The server cannot publish them instead - a write to a network object you do not own is discarded in silence - so a modded client can lie about its own plate. Accepted knowingly: the plate is decoration and the server's ledger still decides every pick.

    Days alive counts from the day the plate first saw a character, not from its creation. The game keeps no birthday, so every existing character reads 0 on the day this ships.

[1.2.2] - 2026-09-10

Fixed

  • Quick study's capstone read "+2 m_skillLevelModifier at rank 5". The panel builds each card's green line from a table of readable names and falls back to the game's own field name when there is no entry, and m_skillLevelModifier had none. It is "skill levels" now, and correctly not a percentage - the game adds it to the skill's level rather than scaling it.

    The card itself was always working. This was the label only.

    Checked against the whole catalogue rather than the one card that was reported: 25 effects are in use and this was the only one missing a name.

Changed

  • An effect with no readable name now says so at load, naming the card. The fallback to the raw field name is right - a card with an unnamed effect still works and still says how much it gives - but it was silent, so this sat on a player's screen for a release and was found by somebody sending a screenshot. Cards.Load cross-checks every card's effect and capstone against the label table and warns once.

[1.2.1] - 2026-09-10

Fixed

  • The experience bar disappeared and never came back. It went the first time it was hidden - which on a dedicated server was immediately, before anyone saw it, and in singleplayer was the first time you died or pressed the hide-HUD key.

    The bar is a clone of the eitr panel, and the eitr panel spends its life switched off for a character with no eitr: vanilla's hide clip does not fade it, it deactivates its parts by name through AnimationObjectToggle. Everything the clone showed - frame, track, both fills, text - came from one SetBool("Visible", true) written once when it was built. The bar was then hidden and shown with SetActive, and disabling a GameObject disables its Animator; Unity's keepAnimatorStateOnDisable defaults to false, so re-enabling rebinds it and resets every parameter to its authored default. Visible went back to false, the show clip never played again, the parts stayed inactive, and nothing re-asserted it.

    It is hidden by a CanvasGroup alpha now, so nothing is ever disabled and nothing rebinds. The clone is also detached from the borrowed animator entirely at build time and brought up by hand instead - handing a permanently visible bar's visibility to a controller whose whole job is hiding the eitr panel was the mistake underneath. The flash on a waiting pick is driven here now rather than through the donor's trigger.

    Both GuiBar components are destroyed at build time as well, with what they point at cached first. That was the next failure waiting: this file already drives both fills by hand because GuiBar caches m_barImage in Awake and re-reads m_width on the first SetValue, and its comment noted that LateUpdate "never runs, because the donor's parts are inactive". Activating those parts made it run, and it would have squashed every width to m_width * value with an m_width captured from a donor whose fills are zero wide.

    Reported from the live server by a player and reproduced on two machines.

  • The "rist waiting" note is above the bar, and follows it. It was drawn at BarPosX and BarPosY, which are only where the bar is when BarFollowStamina is off - and that has defaulted to on since the bar started following the stamina bar, so the note sat at a point the bar had long since left. It is measured off the bar's real top edge now, taken from the union of its child rects rather than the root's own, which is a thin strip that runs through the middle of what you can see.

  • The bar no longer re-pins itself during a cutscene, when Hud has parked its whole root off screen at x=10000.

Changed

  • Every position in the [Bar] block is now measured against your HUD's canvas scale instead of in raw screen pixels. The bar's placement is a server setting - the host decides where it sits so that everyone on a server sees the same layout - and a raw pixel offset could not deliver that: 70 pixels below the stamina bar is a different place on a 1080p screen, a 1440p screen, and for a player running the HUD at 1.4. Multiplying by the scale factor Valheim's own CanvasScaler applies turns one imposed number into the same visual position on every screen. The IMGUI text scales with it too, with 12px as a floor rather than a fixed size.

    BarSize is deliberately untouched: it is set in canvas units and the scaler is already applying the same factor to it.

    On a screen at scale 0.93 this moves the bar about five pixels; the defaults are kept as round numbers rather than retuned to cancel that out on one particular monitor.

Added

  • BarNoteGap, the gap between the top of the bar and the note above it.

[1.2.0] - 2026-09-09

Rebuilt for Valheim 1.0. This version does not run on pre-1.0 Valheim, and the previous one does not run on 1.0.

Changed

  • Which stat fields count from 1 is now read off the game rather than from a list in the mod. A fresh SE_Stats carries its declared defaults, and a = 1f initialiser is exactly what "the neutral value is one" means, so the set can be asked for instead of remembered. It reproduces the same four fields today; the difference is a balance pass that makes another modifier multiplicative, which would otherwise have this writing 0.03 into a damage multiplier and cutting damage to 3% instead of raising it by 3%. Any disagreement with the four it was written against is logged.

[1.1.1] - 2026-08-29

Fixed

  • The plugin announced the wrong version of itself. 1.1.0 moved the csproj, the manifest and the toml and missed the BepInPlugin constant, which is the version the plugin actually reports and half of what Core's gate compares - so the package read 1.1.0 on Thunderstore and introduced itself as 1.0.1 on every connection. Harmless while everyone runs identical builds, and not harmless the moment they do not.

[1.1.0] - 2026-08-18

XP is now weighted by which skill it came from, not only by how far that skill got.

Why

The live server's ledger asked for this rather than a hunch. A character sitting at Rist level 12 held 1346 XP, of which WoodCutting alone was 666 - half the character was felled trees, and everything earned in a fight came to 293, under a quarter of the whole. The level had stopped describing the character and started describing how long they had stood in the Meadows with an axe.

The existing weighting compounded the wrong way. XP being the level reached is right on its own, but the safest repeatable activity in the game is also the one that climbs highest, so it was collecting the most level-ups and the most XP per level-up.

Raising LevelBaseXp or LevelExponent cannot fix that, and it is the obvious reach, so it is worth saying why not: both scale the whole curve, so the ratio survives untouched and the late game pays for a problem that lives in the first hour. That is exactly what happened when the pair was 60 and 1.5, and it had to be walked back.

Added

  • SkillWeights - a multiplier per skill, as Skill=multiplier pairs. The default table is built on risk: full price for a skill raised by something that can kill you, half for one that is situational, a quarter for repetition that cannot hurt you. Synced from the host, so a server sets it for everyone on it.
  • DefaultSkillWeight - what a skill not named in the table is worth. 1, so a skill added by a game update or another mod is paid normally rather than silently going unpaid.
  • WeightGeneration - bump it to any different text and every character is re-priced once, on its next login, from the skill levels this server watched it reach.

Changed

  • Existing characters are re-priced on their next login. The bundled generation is 1 and no existing ledger line carries a stamp, so this happens once, automatically. The character above goes from level 12 to level 6, with 53% of it now earned fighting.
  • Runestones already taken are kept. A character re-priced from 12 to 6 holds all twelve and earns no new pick until it passes twelve again. Refunding them would turn a re-pricing into a free rebuild of the whole character.
  • The join-time credit is weighted by the same function as the re-pricing, deliberately shared so the two can never drift apart.

Ledger format

The ledger is now v4, carrying the generation each record was last re-priced at. v1-v3 are still read and come back as never re-priced, which is what they are.

This is a one-way door. A v4 line does not parse on 1.0.1 or earlier, which drops the record rather than erroring, so copy rist-ledger.txt aside before updating a server you care about.

[1.0.1] - 2026-08-18

Documentation and the text players read, with no change to what the mod does.

Threshold is Dyrr

The companion mod that decides who may join a world was renamed, and Rist pointed at the old name in two places that matter: the config descriptions, which are read by anyone who opens rist.cfg, and the notes on what Rist deliberately does not do. Both now say Dyrr.

The README is shorter

The design argument and the technical notes moved to DESIGN.md, leaving the README as what someone reads before installing. The reasoning is all still there, one link away, rather than in front of a reader who only wanted to know what the mod is.

Its two links are absolute now. Thunderstore builds the package page from the README alone, so a sibling-folder path pointed at nothing there and DESIGN.md is not in the zip at all - both would have rendered as dead links on the store page and nowhere else, which is the kind of fault you only see after publishing.

Em-dashes are gone from the docs throughout.

[1.0.0] - 2026-08-16

First release. There is no 0.1.0 entry below it because 0.1.0 was never published. It was this same work under a version that had not yet been judged ready, and folding it in beats inventing a release nobody could have installed.

The line this sits on

It adds a level beside the skills. It never reads, writes, rescales or reskins a vanilla skill.

Valheim has skills but no character level. Rist adds one that runs alongside them. Vanilla skills are read and never written.

Levels and picks

  • Every character level earns one pick, spent on any runestone in the catalogue to raise it a rank, up to five.
  • Picks bank. Nothing expires and the panel waits.
  • No drawbacks. A runestone is a reward or it is nothing. A cost attached to a reward makes a pick something you can regret, and regretting a permanent choice is a reason to stop playing rather than a reason to think harder.

Free choice, not a dealt hand

An earlier version dealt three runestones per level, seeded so that quitting on a bad offer and returning re-offered the same three, since otherwise the pick is theatre, since anyone can reroll until they get what they want.

Choosing freely deletes that problem rather than defending against it: no roll to reroll, no offer to store in the ledger or on the wire, no second window with its own visibility rules. What it costs is the tension of a hand you are dealt. A free choice means the strongest runestone is always available, so balance now lives in the runestones themselves and in MaxRank.

The panel carries the weight for this: choosing between nineteen runestones is only a real choice if each stone says both what it is worth now and what the pick would make it.

Every fifth rank is a capstone

Taking a runestone the whole way grants something the earlier ranks did not hint at, rather than one more slice of the same number. It is what makes depth a decision against breadth instead of a rounding error: five ranks of the same small bonus is the same reward as five different small bonuses, so without this there was no reason to ever finish anything.

Capacity is a capstone, not a runestone of its own

This began as an inventory problem: late-biome kit eats the grid and leaves nothing for what you went out to fetch. The cheap fix is more rows, and that is exactly what Hoard argues against.

It was a runestone once, called Deep pack, and it was the strongest thing in the catalogue: taken first, every time, which is not a choice. A row now sits at the bottom of Ox-backed and of Sure hand, so capacity is the reward for taking a hauling runestone all the way rather than a purchase anyone makes on their first pick.

The panel

A fifth tab on the compendium bar, beside the raven and the trophy, opens a full screen of runestones, one per rist, each with its own outline, rock and marks, all seeded off the card id so a rist looks the same in every session and on every machine. A rank cuts one more mark into the rim, and the mark holds the level that bought it.

Three designs came before it: a draft window dealing three at random, a board of tiles, and that same board dressed in the game's own wooden sprites. The last is why this one exists. Borrowing a window frame is imitation, and it read as a different game no matter how close the sprites got. A runestone imitates nothing.

The bar

A fifth bar under stamina, cloned from one of the game's own so it carries the same frame, fill and trailing fill. It follows the stamina bar rather than sitting at fixed pixels, so "below stamina" stays true at any resolution and HUD scale, and it flashes while a pick is waiting.

Verdigris, because the HUD already spends red, yellow, blue and orange between its four bars and a fifth in any of those reads as one of them.

What the server decides

The ledger is held by the server and keyed to the platform identity plus the character, never to the character file. A character file sits on the player's own disk, so nothing that decides rewards may live there. The client reports only that a skill went up; every number is derived server-side.

Three ceilings bound what a report can be worth, because skills live on the client and a report is therefore a claim that cannot be verified, only bounded:

  • Reports per minute, which caps how many claims are accepted.
  • A one-level step, which caps how much a single claim may say. Skills level one at a time and fire one callback each, so a report naming a level far above the baseline this server watched that skill reach did not come from playing. This also protects the baseline, which would otherwise adopt the forged level and give every later claim an alibi.
  • XP per minute of connected time, which is the only cap that does not depend on believing the client at all. It banks three minutes so an honest burst, clearing a crypt levels four skills at once, is paid in full.

Nobody is disconnected and nothing is ever taken away. Rist used to refuse the connection, and a levelling mod deciding who may play means a bug in an XP system locks people out of a server. Refusing at the door moved to Dyrr, where it is the whole job and is done openly.

Cloning vanilla UI, and what it does not hand over

Both the bar and the compendium tab are clones of things the game already draws, which is what makes them match. What a clone does not bring is its own lifecycle: it has never run Awake, OnEnable or LateUpdate, because the donors sit inactive.

GuiBar puts something essential in each of those, so the bar failed three times over - the tint reached nothing, the width was discarded and re-derived from the donor's, and setting a value stored a number without drawing it. All three are ways of not reaching one line. The fill is written directly now, and the trailing bar lagged by hand.

The tab had the same shape of problem read from the other end: its gold is not in any sprite or any Image.color but in the Button's normalColor, applied to whichever graphic is its targetGraphic. Building a layer alongside it could never match; swapping the sprite on the graphic already being tinted inherits size, shadow, gold, hover and press at once.

The rule both arrive at: clone for geometry and sprites, drive the state yourself.

Core is optional

Rist installs and runs on its own. Core is a soft dependency; installing Rist no longer installs Core with it, and manifest.json no longer lists it.

Solo, nothing is given up, including the extra inventory rows, which now have a Rist-owned implementation used only when Core is absent. On a server, three things are lost, and the README section "Core is optional, and here is exactly what that costs" sets them out: the cards.txt hash check, the host-authoritative curve, and the arbitration of Inventory.m_height between mods. Rist logs a warning at startup naming all three.

The row fallback deliberately copies Core's Player.Load widening rather than simplifying it. That is not a nicety: without it every item in a granted row is destroyed by loading the game, silently, because AddItem drops any saved position outside the current grid and the rows are not applied until after the load. It is patched in only when Core is absent, so the two owners can never both write the field or both widen the grid.

Mechanically, as elsewhere in the suite: every Ezomic.Core call now sits in its own [MethodImpl(MethodImplOptions.NoInlining)] method behind a Chainloader.PluginInfos check, because the JIT resolves a method's assemblies when it first compiles that method, and an inline call would drag Core in before the check could prevent it. Verified by decompiling the built DLL: Suite.* and InventoryRows.* appear only inside those isolated methods.

A character arrives worth what its skills are worth

CreditExistingSkills, on by default, pays a joining character for the skills it already holds: turn up carrying skills worth twenty levels and you arrive at twenty levels with the picks to spend. XP is the skill level reached, so a skill at N has already produced N(N+1)/2; summing that over every skill is exactly what the character would hold had all of it happened here, which also makes it safe to re-run on every login and impossible to double-pay.

Off, only XP gained on this server counts and every character starts at level 0. Config syncs from the host, so a server picks one rule for everyone on it.

There is no untrusted state. A character above the baseline was briefly marked untrusted and paid nothing "until they line up again", which it could never do, because the withholding returned before the baseline was updated, and the login check only adopted a new baseline when it had found nothing wrong, so the baseline froze while the player's real skills climbed away from it.

Keeping a well-travelled character out of a world altogether is a door policy, and the door is Dyrr's.

Known limits

  • Never played at the shipping curve. The pick path was exercised against a deliberately cheapened one so it could be reached without grinding. LevelBaseXp and LevelExponent are back at 60 and 1.5, and how often a stone lights up at those numbers is still a guess.
  • Runestone balance is untested by definition. With free choice the strongest runestone is always available, and nothing has been played hard enough to find out which one that is.
  • Multiplayer has never had a second player. The version gate, config sync and catalogue hash all work host-side and against a dev server, but no remote client has connected.