<?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%3ASkillRollWeightDef</id>
	<title>Template:SkillRollWeightDef - 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%3ASkillRollWeightDef"/>
	<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Template:SkillRollWeightDef&amp;action=history"/>
	<updated>2026-10-10T11:18:57Z</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:SkillRollWeightDef&amp;diff=18181&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:SkillRollWeightDef&amp;diff=18181&amp;oldid=prev"/>
		<updated>2026-05-19T01:14:12Z</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;
One row per (table, band_kind, skill). The substance of the skill-roll system — every individual weight a hero might encounter when their class&amp;#039;s roll table fires.&lt;br /&gt;
&lt;br /&gt;
Per-table row counts are uniform across the 12 standard tables (the level-grid structure is class-invariant; only the weights and the signature-skill SID swap):&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;24 rows&amp;#039;&amp;#039;&amp;#039; in the &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; band (the full skill pool).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;4 rows&amp;#039;&amp;#039;&amp;#039; in the &amp;lt;code&amp;gt;magic_levels&amp;lt;/code&amp;gt; band (the four magic-element schools).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;6 rows&amp;#039;&amp;#039;&amp;#039; in the &amp;lt;code&amp;gt;level_20_mega&amp;lt;/code&amp;gt; band (those four schools plus faction + class-signature).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;2 rows&amp;#039;&amp;#039;&amp;#039; in the &amp;lt;code&amp;gt;signature_levels&amp;lt;/code&amp;gt; band (faction + class-signature).&lt;br /&gt;
&lt;br /&gt;
Total: &amp;#039;&amp;#039;&amp;#039;36 rows per standard table&amp;#039;&amp;#039;&amp;#039; × 12 = ~432 rows for standard. Arena tables share the same shape with slightly smaller pools.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bands are additive.&amp;#039;&amp;#039;&amp;#039; The effective weight for skill &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; at level &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; is the SUM of weights across every band whose &amp;lt;code&amp;gt;SkillRollBand.levels&amp;lt;/code&amp;gt; list contains &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt;. The query pattern is documented under &amp;quot;Display-layer query patterns&amp;quot; below.&lt;br /&gt;
&lt;br /&gt;
== Schema ==&lt;br /&gt;
{{#cargo_declare:_table=SkillRollWeight&lt;br /&gt;
| table_id = String&lt;br /&gt;
| band_kind = String (allowed values=default,magic_levels,signature_levels,level_20_mega)&lt;br /&gt;
| skill_id = String&lt;br /&gt;
| weight = Integer&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
{{SkillRollWeightDef&lt;br /&gt;
| table_id = String           &amp;lt;!-- matches SkillRollTable.id --&amp;gt;&lt;br /&gt;
| band_kind = String (allowed values=default,magic_levels,signature_levels,level_20_mega)&lt;br /&gt;
| skill_id = String           &amp;lt;!-- matches Skill.id, or a pseudo / faction skill SID --&amp;gt;&lt;br /&gt;
| weight = Integer            &amp;lt;!-- raw weight (not a percentage). Lower bound 1 (omitted = not in this band). --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Field notes ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;weight&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; is the raw &amp;lt;code&amp;gt;chance&amp;lt;/code&amp;gt; integer from source JSON. It is &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; a percentage — to get a per-roll probability, divide by the sum of all active weights at the queried level. Empirical range: 20 (magic_night, weakest) to 200 (own faction skill, strongest) in standard tables; up to 1000 in arena per-hero overrides.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;band_kind&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; enumerates the four roll bands. All four exist in every standard table; arena tables share the same band kinds. The grid of which levels each band covers is class-invariant and lives in &amp;lt;code&amp;gt;SkillRollBandDef&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;skill_id&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; is the skill SID (joins to [[Template:SkillDef|&amp;lt;code&amp;gt;SkillDef.id&amp;lt;/code&amp;gt;]]). The &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; band always includes the table&amp;#039;s own-faction skill (e.g. &amp;lt;code&amp;gt;skill_faction_humans&amp;lt;/code&amp;gt; in humans tables) and its class-signature skill (&amp;lt;code&amp;gt;skill_battle_artistry&amp;lt;/code&amp;gt; for might, &amp;lt;code&amp;gt;skill_wisdom&amp;lt;/code&amp;gt; for magic). The other three bands hold only the magic-element / faction / signature subset relevant to the milestone.&lt;br /&gt;
&lt;br /&gt;
== Class-signature exclusivity ==&lt;br /&gt;
&amp;lt;code&amp;gt;skill_battle_artistry&amp;lt;/code&amp;gt; appears in &amp;#039;&amp;#039;&amp;#039;only&amp;#039;&amp;#039;&amp;#039; the 6 might tables; &amp;lt;code&amp;gt;skill_wisdom&amp;lt;/code&amp;gt; appears in &amp;#039;&amp;#039;&amp;#039;only&amp;#039;&amp;#039;&amp;#039; the 6 magic tables. This exclusivity is encoded in the data — there is no engine-side filter to enforce it. A magic class cannot roll battle_artistry; a might class cannot roll wisdom.&lt;br /&gt;
&lt;br /&gt;
The same skills also appear in the per-table &amp;lt;code&amp;gt;level_20_mega&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;signature_levels&amp;lt;/code&amp;gt; overlays (with overlay weights, additive on top of the default).&lt;br /&gt;
&lt;br /&gt;
== Display-layer query patterns ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Base weights for a class (no level filter):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
  tables=SkillRollWeight&lt;br /&gt;
  | fields=skill_id, weight&lt;br /&gt;
  | where=table_id=&amp;quot;humans_might_skills_table&amp;quot; AND band_kind=&amp;quot;default&amp;quot;&lt;br /&gt;
  | order by=weight DESC, skill_id&lt;br /&gt;
  | format=table&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Effective weights at a specific level&amp;#039;&amp;#039;&amp;#039; (sums all bands containing that level):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
  tables=SkillRollWeight=W, SkillRollBand=B&lt;br /&gt;
  | join on=W.band_kind=B.id&lt;br /&gt;
  | fields=W.skill_id=Skill, SUM(W.weight)=EffectiveWeight&lt;br /&gt;
  | where=W.table_id=&amp;quot;humans_might_skills_table&amp;quot;&lt;br /&gt;
          AND B.levels HOLDS &amp;quot;20&amp;quot;&lt;br /&gt;
  | group by=W.skill_id&lt;br /&gt;
  | order by=EffectiveWeight DESC&lt;br /&gt;
  | format=table&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For non-milestone levels (1, 2, 3, 6, 7, 9, …), only the &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; band matches, so this query returns the same result as the base-weights query. For levels matching one or more overlay bands (4, 5, 8, 10, 20, …), the overlay weights add to the default.&lt;br /&gt;
&lt;br /&gt;
To get a true per-roll probability: divide &amp;lt;code&amp;gt;EffectiveWeight&amp;lt;/code&amp;gt; by the SUM of &amp;lt;code&amp;gt;EffectiveWeight&amp;lt;/code&amp;gt; across all skills returned by the same query.&lt;br /&gt;
&lt;br /&gt;
== Caveats for player-facing presentation ==&lt;br /&gt;
The raw weight does &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; translate to &amp;quot;% chance to see this skill on level-up&amp;quot; without several caveats:&lt;br /&gt;
* The game presents 3 offerings per level. Slot 1 is reserved as a guaranteed upgrade of an existing non-Expert skill (if any exist); only slots 2-3 are drawn from this weighted urn. Per-skill &amp;quot;chance to appear in slots 2-3&amp;quot; is approximately &amp;lt;code&amp;gt;1 − (1 − p)²&amp;lt;/code&amp;gt; where &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; is the single-roll probability.&lt;br /&gt;
* The engine does not appear to filter the urn by hero state before drawing — if the roll lands on a skill the hero already has at Basic, the game displays it as the Advanced upgrade option. So the same data row can manifest as a Basic offering for one hero and an Advanced offering for another.&lt;br /&gt;
* When the hero has fewer than 3 valid &amp;quot;unexpert and learnable&amp;quot; slots available, leftover offering slots are filled from the [[Template:StatBonusRollDef|StatBonusRoll]] table instead — these are not drawn from &amp;lt;code&amp;gt;SkillRollWeight&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Related tables ==&lt;br /&gt;
* [[Template:SkillRollTableDef|SkillRollTable]] — the header row (1:N).&lt;br /&gt;
* [[Template:SkillRollBandDef|SkillRollBand]] — the levels each &amp;lt;code&amp;gt;band_kind&amp;lt;/code&amp;gt; covers (1:N from band side).&lt;br /&gt;
* [[Template:SkillDef|Skill]] — joined on &amp;lt;code&amp;gt;skill_id = Skill.id&amp;lt;/code&amp;gt; for full skill metadata (name, description, mastery levels).&lt;br /&gt;
* [[Template:StatBonusRollDef|StatBonusRoll]] — the fallback pool when the main pool can&amp;#039;t fill all 3 offering slots.&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=SkillRollWeight&lt;br /&gt;
| table_id = {{{table_id|}}}&lt;br /&gt;
| band_kind = {{{band_kind|}}}&lt;br /&gt;
| skill_id = {{{skill_id|}}}&lt;br /&gt;
| weight = {{{weight|}}}&lt;br /&gt;
}}&lt;br /&gt;
Created &amp;lt;code&amp;gt;SkillRollWeight&amp;lt;/code&amp;gt; entry: &amp;lt;code&amp;gt;{{{table_id|}}}/{{{band_kind|}}}/{{{skill_id|}}}&amp;lt;/code&amp;gt;&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>76561198026315966</name></author>
	</entry>
</feed>