<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?action=history&amp;feed=atom&amp;title=Template%3AStatBonusRollDef</id>
	<title>Template:StatBonusRollDef - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?action=history&amp;feed=atom&amp;title=Template%3AStatBonusRollDef"/>
	<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Template:StatBonusRollDef&amp;action=history"/>
	<updated>2026-10-10T11:19:05Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.5</generator>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Template:StatBonusRollDef&amp;diff=18182&amp;oldid=prev</id>
		<title>76561198026315966: obelisk-bot: Adding new tables for hero skill rolls</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Template:StatBonusRollDef&amp;diff=18182&amp;oldid=prev"/>
		<updated>2026-05-19T01:14:13Z</updated>

		<summary type="html">&lt;p&gt;obelisk-bot: Adding new tables for hero skill rolls&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
The endgame stat-bonus fallback pool — &amp;#039;&amp;#039;&amp;#039;12 rows&amp;#039;&amp;#039;&amp;#039;, class- and faction-invariant. When the hero&amp;#039;s main skill-roll pool can&amp;#039;t supply 3 valid offerings on a level-up (because they have no learnable new skills available &amp;#039;&amp;#039;&amp;#039;and&amp;#039;&amp;#039;&amp;#039; fewer than 3 non-Expert skills they could rank up), the engine fills the empty offering slots from this table instead.&lt;br /&gt;
&lt;br /&gt;
Each row is a &amp;quot;pseudo skill&amp;quot; granting a flat permanent bonus to one primary stat. There are 4 stats × 3 magnitude tiers = 12 entries. Empirically extracted from &amp;lt;code&amp;gt;Core/DB/heroes_skills/skills/pseudo_skills.json&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;[-2]&amp;lt;/code&amp;gt; band of any &amp;lt;code&amp;gt;skills_by_level_tables&amp;lt;/code&amp;gt; file (the band content is byte-identical across all 24 standard + arena files, confirming the universal-pool reading).&lt;br /&gt;
&lt;br /&gt;
== Schema ==&lt;br /&gt;
{{#cargo_declare:_table=StatBonusRoll&lt;br /&gt;
| id = String&lt;br /&gt;
| stat = String (allowed values=offence,defence,spellPower,intelligence)&lt;br /&gt;
| magnitude = Integer&lt;br /&gt;
| weight = Integer&lt;br /&gt;
| name_sid = String&lt;br /&gt;
| desc_sid = String&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
{{StatBonusRollDef&lt;br /&gt;
| id = String                      &amp;lt;!-- skill_pseudo_1 through skill_pseudo_12 --&amp;gt;&lt;br /&gt;
| stat = String (allowed values=offence,defence,spellPower,intelligence)&lt;br /&gt;
| magnitude = Integer              &amp;lt;!-- the +N value added to the stat --&amp;gt;&lt;br /&gt;
| weight = Integer                 &amp;lt;!-- raw weight in the fallback urn --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Localization references — display text lives in the Translation table, type=&amp;#039;stat_bonus_roll&amp;#039; --&amp;gt;&lt;br /&gt;
| name_sid = String                &amp;lt;!-- always &amp;#039;skill_pseudo_name&amp;#039; (shared across all 12) --&amp;gt;&lt;br /&gt;
| desc_sid = String                &amp;lt;!-- per-row, e.g. &amp;#039;skill_pseudo_1_desc&amp;#039; --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Canonical row contents ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; !! &amp;lt;code&amp;gt;stat&amp;lt;/code&amp;gt; !! &amp;lt;code&amp;gt;magnitude&amp;lt;/code&amp;gt; !! &amp;lt;code&amp;gt;weight&amp;lt;/code&amp;gt; !! within-tier share (4-way uniform) !! tier share of all fallback rolls&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skill_pseudo_1&amp;lt;/code&amp;gt; || offence || 1 || 50000 || 25% || rowspan=&amp;quot;4&amp;quot; style=&amp;quot;text-align:right&amp;quot; | &amp;#039;&amp;#039;&amp;#039;Tier 1 (+1):&amp;#039;&amp;#039;&amp;#039; 99.0%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skill_pseudo_2&amp;lt;/code&amp;gt; || defence || 1 || 50000 || 25%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skill_pseudo_3&amp;lt;/code&amp;gt; || spellPower || 1 || 50000 || 25%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skill_pseudo_4&amp;lt;/code&amp;gt; || intelligence || 1 || 50000 || 25%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skill_pseudo_5&amp;lt;/code&amp;gt; || offence || 2 || 500 || 25% || rowspan=&amp;quot;4&amp;quot; style=&amp;quot;text-align:right&amp;quot; | &amp;#039;&amp;#039;&amp;#039;Tier 2 (+2):&amp;#039;&amp;#039;&amp;#039; 0.99%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skill_pseudo_6&amp;lt;/code&amp;gt; || defence || 2 || 500 || 25%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skill_pseudo_7&amp;lt;/code&amp;gt; || spellPower || 2 || 500 || 25%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skill_pseudo_8&amp;lt;/code&amp;gt; || intelligence || 2 || 500 || 25%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skill_pseudo_9&amp;lt;/code&amp;gt; || offence || 3 || 5 || 25% || rowspan=&amp;quot;4&amp;quot; style=&amp;quot;text-align:right&amp;quot; | &amp;#039;&amp;#039;&amp;#039;Tier 3 (+3):&amp;#039;&amp;#039;&amp;#039; 0.0025% (≈1 in 40,000)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skill_pseudo_10&amp;lt;/code&amp;gt; || defence || 3 || 5 || 25%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skill_pseudo_11&amp;lt;/code&amp;gt; || spellPower || 3 || 5 || 25%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skill_pseudo_12&amp;lt;/code&amp;gt; || intelligence || 3 || 5 || 25%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Total fallback-pool weight: &amp;#039;&amp;#039;&amp;#039;202,020&amp;#039;&amp;#039;&amp;#039; = 4×50,000 + 4×500 + 4×5.&lt;br /&gt;
&lt;br /&gt;
== When does this fire ==&lt;br /&gt;
Player-observed behavior: the fallback only appears in late-game runs. Specifically, an offering slot gets filled from this table when the engine&amp;#039;s main roll cannot produce a valid offering — i.e. when every weighted draw from &amp;lt;code&amp;gt;SkillRollWeight&amp;lt;/code&amp;gt; resolves to either &amp;quot;skill the hero doesn&amp;#039;t have a slot for&amp;quot; (8 slots full and the rolled skill isn&amp;#039;t already learned) &amp;#039;&amp;#039;&amp;#039;or&amp;#039;&amp;#039;&amp;#039; &amp;quot;skill the hero already has at Expert&amp;quot; (so it can&amp;#039;t be ranked up further).&lt;br /&gt;
&lt;br /&gt;
Concretely:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Early game&amp;#039;&amp;#039;&amp;#039; (1-2 skills, plenty of empty slots): zero fallback rolls per level. All 3 offerings come from the main pool.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Mid game&amp;#039;&amp;#039;&amp;#039; (slots full, some upgrade paths remaining): zero fallback rolls — the upgrade slot mechanic absorbs the &amp;quot;I already have this&amp;quot; rolls.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Endgame&amp;#039;&amp;#039;&amp;#039; (most skills at Expert): increasing number of fallback rolls until eventually all 3 offering slots come from here.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;The +3 bonus tier is statistically near-mythical&amp;#039;&amp;#039;&amp;#039; under current mechanics. With a per-fallback-roll probability of 1 in ~40,000 and the fallback firing only in endgame, a typical player will never see a +3 stat option. Could be design-space padding for a future high-level mode, intentional easter-egg, or vestigial test scaffolding — JSON alone can&amp;#039;t disambiguate.&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
The 12 rows &amp;#039;&amp;#039;&amp;#039;share a single &amp;lt;code&amp;gt;name_sid&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;skill_pseudo_name&amp;lt;/code&amp;gt;) — the player-facing name is the same generic label for all twelve. &amp;lt;code&amp;gt;desc_sid&amp;lt;/code&amp;gt; differs per row (&amp;lt;code&amp;gt;skill_pseudo_1_desc&amp;lt;/code&amp;gt; through &amp;lt;code&amp;gt;skill_pseudo_12_desc&amp;lt;/code&amp;gt;), with each describing the specific stat and magnitude granted.&lt;br /&gt;
&lt;br /&gt;
Translation rows live in the [[Template:TranslationDef|Translation]] table under &amp;lt;code&amp;gt;type=&amp;#039;stat_bonus_roll&amp;#039;&amp;lt;/code&amp;gt;, one row per (language, target_id) for the desc; the shared name gets one Translation row keyed on &amp;lt;code&amp;gt;skill_pseudo_name&amp;lt;/code&amp;gt; with a free-floating target.&lt;br /&gt;
&lt;br /&gt;
== Related tables ==&lt;br /&gt;
* [[Template:SkillRollWeightDef|SkillRollWeight]] — the main pool; this table is the engine&amp;#039;s fallback when the main pool runs out of valid offerings.&lt;br /&gt;
* [[Template:TranslationDef|Translation]] — display text in every language, joined on &amp;lt;code&amp;gt;id = Translation.target_id WHERE Translation.type=&amp;#039;stat_bonus_roll&amp;#039;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Category:Cargo Definitions]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{#cargo_store:_table=StatBonusRoll&lt;br /&gt;
| id = {{{id|}}}&lt;br /&gt;
| stat = {{{stat|}}}&lt;br /&gt;
| magnitude = {{{magnitude|}}}&lt;br /&gt;
| weight = {{{weight|}}}&lt;br /&gt;
| name_sid = {{{name_sid|}}}&lt;br /&gt;
| desc_sid = {{{desc_sid|}}}&lt;br /&gt;
}}&lt;br /&gt;
Created &amp;lt;code&amp;gt;StatBonusRoll&amp;lt;/code&amp;gt; entry: &amp;lt;code&amp;gt;{{{id|}}}&amp;lt;/code&amp;gt;&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>76561198026315966</name></author>
	</entry>
</feed>