Template:SpellRankDef: Difference between revisions

From Heroes of Might and Magic: Olden Era Official Wiki
obelisk-bot: Pushing translation table rework
obelisk-bot: Pushing translation table rework
 
Line 2: Line 2:
This template defines and stores rows for the '''SpellRank''' Cargo table. Per-mastery-level structural data for a [[Template:SpellDef|Spell]]. Always 4 rows per spell — levels 1=no skill, 2=basic, 3=advanced, 4=expert.
This template defines and stores rows for the '''SpellRank''' Cargo table. Per-mastery-level structural data for a [[Template:SpellDef|Spell]]. Always 4 rows per spell — levels 1=no skill, 2=basic, 3=advanced, 4=expert.


SpellRank carries only the '''mechanical, language-independent''' fields. All localizable text — the rank's name, description, and bonus unlock blurb, in every language including English — lives in the shared [[Template:TranslationDef|Translation]] table, keyed by <code>type=spell_rank</code>, <code>target_id=<spell_id></code>, <code>variant=<level></code>.
SpellRank carries only the '''mechanical, language-independent''' fields. The rank's localizable text — its description and bonus unlock blurb, in every language including English — lives in the shared [[Template:TranslationDef|Translation]] table, keyed by <code>type=spell_rank</code>, <code>target_id=<spell_id></code>, <code>variant=<level></code>. The spell's '''name''' is '''not''' a per-rank value — it is static across all four ranks — so it is stored once, in [[Template:SpellDef|Spell]]'s <code>type=spell</code> Translation rows, and never duplicated here.


The bot emits these inline on the parent <code>Data:Spell/<id></code> page, each <code><nowiki>{{SpellRankDef}}</nowiki></code> row followed by its per-language <code><nowiki>{{TranslationDef}}</nowiki></code> rows.
The bot emits these inline on the parent <code>Data:Spell/<id></code> page, each <code><nowiki>{{SpellRankDef}}</nowiki></code> row followed by its per-language <code><nowiki>{{TranslationDef}}</nowiki></code> rows.
Line 10: Line 10:
| spell_id = String
| spell_id = String
| level = Integer
| level = Integer
| name_sid = String
| description_sid = String
| description_sid = String
| bonus_description_sid = String
| bonus_description_sid = String
Line 21: Line 20:
| spell_id = String
| spell_id = String
| level = Integer                  <!-- 1=no skill, 2=basic, 3=advanced, 4=expert -->
| level = Integer                  <!-- 1=no skill, 2=basic, 3=advanced, 4=expert -->
| name_sid = String                <!-- same across all four ranks; per-row for clean labelled queries -->
| description_sid = String
| description_sid = String
| bonus_description_sid = String    <!-- null at level 1 -->
| bonus_description_sid = String    <!-- null at level 1 -->
Line 31: Line 29:
== Field notes ==
== Field notes ==
* Primary key is <code>(spell_id, level)</code>.
* Primary key is <code>(spell_id, level)</code>.
* <code>name_sid</code> carries the spell's name SID — same across all four ranks; duplicated per-row for clean labelled per-rank queries. Traceability only; not the translation join path.
* '''No <code>name_sid</code> here.''' The spell's name is static across all four ranks — it is not a per-rank value. It lives on [[Template:SpellDef|Spell]] (<code>name_sid</code>) and its resolved text in the Translation table under <code>type='spell'</code>. There is no "rank name" concept in the source data.
* <code>description_sid</code> / <code>bonus_description_sid</code> point at the L10n entries the rank's text was sourced from. <code>bonus_description_sid</code> is null at level 1.
* <code>description_sid</code> / <code>bonus_description_sid</code> point at the L10n entries the rank's text was sourced from. <code>bonus_description_sid</code> is null at level 1. Traceability only; not the translation join path.
* Resolved text for every language (including English) lives in [[Template:TranslationDef|Translation]]: <code>name</code>, <code>description</code>, and <code>bonus_description</code> columns, <code>WHERE type='spell_rank' AND target_id=<spell_id> AND variant=<level></code>. Hero-dependent placeholders (<code>{N}</code> for spell-power-scaled values) stay unsubstituted in the stored text.
* Resolved text for every language (including English) lives in [[Template:TranslationDef|Translation]]: the <code>description</code> and <code>bonus_description</code> columns, <code>WHERE type='spell_rank' AND target_id=<spell_id> AND variant=<level></code>. The <code>name</code> column on those rows is left empty — see the note above. Hero-dependent placeholders (<code>{N}</code> for spell-power-scaled values) stay unsubstituted in the stored text.
* <code>mana_cost</code> / <code>upgrade_cost</code> are the per-rank mechanical costs.
* <code>mana_cost</code> / <code>upgrade_cost</code> are the per-rank mechanical costs.


Line 44: Line 42:
| spell_id = {{{spell_id|}}}
| spell_id = {{{spell_id|}}}
| level = {{{level|}}}
| level = {{{level|}}}
| name_sid = {{{name_sid|}}}
| description_sid = {{{description_sid|}}}
| description_sid = {{{description_sid|}}}
| bonus_description_sid = {{{bonus_description_sid|}}}
| bonus_description_sid = {{{bonus_description_sid|}}}

Latest revision as of 00:34, 15 May 2026

This template defines and stores rows for the SpellRank Cargo table. Per-mastery-level structural data for a Spell. Always 4 rows per spell — levels 1=no skill, 2=basic, 3=advanced, 4=expert.

SpellRank carries only the mechanical, language-independent fields. The rank's localizable text — its description and bonus unlock blurb, in every language including English — lives in the shared Translation table, keyed by type=spell_rank, target_id=<spell_id>, variant=<level>. The spell's name is not a per-rank value — it is static across all four ranks — so it is stored once, in Spell's type=spell Translation rows, and never duplicated here.

The bot emits these inline on the parent Data:Spell/<id> page, each {{SpellRankDef}} row followed by its per-language {{TranslationDef}} rows.

Schema

This template defines the table "SpellRank". View table.

{{SpellRankDef
| spell_id = String
| level = Integer                  <!-- 1=no skill, 2=basic, 3=advanced, 4=expert -->
| description_sid = String
| bonus_description_sid = String    <!-- null at level 1 -->
| mana_cost = Integer
| upgrade_cost = Integer
}}

Field notes

  • Primary key is (spell_id, level).
  • No name_sid here. The spell's name is static across all four ranks — it is not a per-rank value. It lives on Spell (name_sid) and its resolved text in the Translation table under type='spell'. There is no "rank name" concept in the source data.
  • description_sid / bonus_description_sid point at the L10n entries the rank's text was sourced from. bonus_description_sid is null at level 1. Traceability only; not the translation join path.
  • Resolved text for every language (including English) lives in Translation: the description and bonus_description columns, WHERE type='spell_rank' AND target_id=<spell_id> AND variant=<level>. The name column on those rows is left empty — see the note above. Hero-dependent placeholders ({N} for spell-power-scaled values) stay unsubstituted in the stored text.
  • mana_cost / upgrade_cost are the per-rank mechanical costs.

Related tables

  • Spell — joined on SpellRank.spell_id = Spell.id (N:1).
  • Translation — joined on SpellRank.spell_id = Translation.target_id AND SpellRank.level = Translation.variant, WHERE Translation.type='spell_rank' (1:N, one row per language).