<?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/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=76561198256426587</id>
	<title>Heroes of Might and Magic: Olden Era Official Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=76561198256426587"/>
	<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/Special:Contributions/76561198256426587"/>
	<updated>2026-10-19T23:39:08Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.44.5</generator>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:UnitLinker&amp;diff=22622</id>
		<title>Module:UnitLinker</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:UnitLinker&amp;diff=22622"/>
		<updated>2026-06-13T15:44:46Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Charge la table de correspondance en mémoire avec filtrage strict&lt;br /&gt;
local function getUnitRegistry(lang)&lt;br /&gt;
    local registry = {}&lt;br /&gt;
    &lt;br /&gt;
    -- On ajoute bien &#039;type = &amp;quot;unit&amp;quot;&#039; pour garantir l&#039;unicité du contexte&lt;br /&gt;
    local query = &amp;quot;type = &#039;unit&#039; AND (language = &#039;en&#039; OR language = &#039;&amp;quot; .. lang .. &amp;quot;&#039;)&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- On récupère target_id et name&lt;br /&gt;
    local results = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id, name&amp;quot;, { &lt;br /&gt;
        where = query,&lt;br /&gt;
        -- On définit un orderBy pour que les traductions écrasent éventuellement &lt;br /&gt;
        -- les entrées en double si nécessaire, bien que le type &#039;unit&#039; devrait suffire&lt;br /&gt;
        orderBy = &amp;quot;language DESC&amp;quot; &lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    for _, row in ipairs(results) do&lt;br /&gt;
        -- row.name est le nom détectable (ex: &amp;quot;Swordsman&amp;quot; ou &amp;quot;Épéiste&amp;quot;)&lt;br /&gt;
        -- row.target_id est la référence unique (ex: &amp;quot;Swordsman&amp;quot;)&lt;br /&gt;
        if row.name and row.target_id then&lt;br /&gt;
            registry[row.name] = row.target_id&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return registry&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.link(frame)&lt;br /&gt;
    local text = frame.args[1] or &amp;quot;&amp;quot;&lt;br /&gt;
    if not text or text == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    local title = mw.title.getCurrentTitle().text&lt;br /&gt;
    local lang = mw.ustring.match(title, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local registry = getUnitRegistry(lang)&lt;br /&gt;
    &lt;br /&gt;
    -- Trier par longueur décroissante pour traiter &amp;quot;Temple Swordsman&amp;quot; avant &amp;quot;Swordsman&amp;quot;&lt;br /&gt;
    local keys = {}&lt;br /&gt;
    for k in pairs(registry) do table.insert(keys, k) end&lt;br /&gt;
    table.sort(keys, function(a, b) return #a &amp;gt; #b end)&lt;br /&gt;
    &lt;br /&gt;
    -- Remplacement&lt;br /&gt;
    for _, unitName in ipairs(keys) do&lt;br /&gt;
        local engName = registry[unitName]&lt;br /&gt;
        &lt;br /&gt;
        -- Construction du lien&lt;br /&gt;
        local target = (lang == &amp;quot;en&amp;quot;) and engName or (engName .. &amp;quot;/&amp;quot; .. lang)&lt;br /&gt;
        local link = &amp;quot;[[&amp;quot; .. target .. &amp;quot;|&amp;quot; .. unitName .. &amp;quot;]]&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        -- Pattern pour éviter de casser des liens existants&lt;br /&gt;
        -- On cherche le nom de l&#039;unité avec des frontières de mot&lt;br /&gt;
        local escapedName = mw.ustring.gsub(unitName, &amp;quot;([%(%)%.%%%+%-%*%?%[%^%$])&amp;quot;, &amp;quot;%%%1&amp;quot;)&lt;br /&gt;
        local pattern = &amp;quot;(%f[%a])&amp;quot; .. escapedName .. &amp;quot;(%f[%A])&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        text = mw.ustring.gsub(text, pattern, function(prefix, suffix)&lt;br /&gt;
            -- Si le texte contient déjà [[ devant, on ne touche à rien&lt;br /&gt;
            if mw.ustring.find(text, &amp;quot;%[%[&amp;quot; .. escapedName) then return prefix .. unitName .. suffix end&lt;br /&gt;
            return prefix .. link .. suffix&lt;br /&gt;
        end)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:UnitLinker&amp;diff=22621</id>
		<title>Module:UnitLinker</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:UnitLinker&amp;diff=22621"/>
		<updated>2026-06-13T15:40:18Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Charge la table de correspondance en mémoire&lt;br /&gt;
local function getUnitRegistry(lang)&lt;br /&gt;
    local registry = {}&lt;br /&gt;
    -- On récupère tout pour la langue en cours + l&#039;anglais comme sécurité&lt;br /&gt;
    local query = &amp;quot;type = &#039;unit&#039; AND (language = &#039;en&#039; OR language = &#039;&amp;quot; .. lang .. &amp;quot;&#039;)&amp;quot;&lt;br /&gt;
    local results = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id, name&amp;quot;, { where = query })&lt;br /&gt;
    &lt;br /&gt;
    for _, row in ipairs(results) do&lt;br /&gt;
        -- On stocke le nom trouvé (qu&#039;il soit anglais ou traduit) &lt;br /&gt;
        -- associé à son identifiant unique (target_id)&lt;br /&gt;
        registry[row.name] = row.target_id&lt;br /&gt;
    end&lt;br /&gt;
    return registry&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.link(frame)&lt;br /&gt;
    local text = frame.args[1] or &amp;quot;&amp;quot;&lt;br /&gt;
    local title = mw.title.getCurrentTitle().text&lt;br /&gt;
    -- Détecte le suffixe de langue (ex: /fr, /de, /es), sinon par défaut &#039;en&#039;&lt;br /&gt;
    local lang = mw.ustring.match(title, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local registry = getUnitRegistry(lang)&lt;br /&gt;
    &lt;br /&gt;
    -- Trier par longueur pour remplacer les noms composés avant les noms simples&lt;br /&gt;
    local keys = {}&lt;br /&gt;
    for k in pairs(registry) do table.insert(keys, k) end&lt;br /&gt;
    table.sort(keys, function(a, b) return #a &amp;gt; #b end)&lt;br /&gt;
    &lt;br /&gt;
    for _, unitName in ipairs(keys) do&lt;br /&gt;
        local engName = registry[unitName]&lt;br /&gt;
        &lt;br /&gt;
        -- Définir la cible du lien&lt;br /&gt;
        local target = (lang == &amp;quot;en&amp;quot;) and engName or (engName .. &amp;quot;/&amp;quot; .. lang)&lt;br /&gt;
        local link = &amp;quot;[[&amp;quot; .. target .. &amp;quot;|&amp;quot; .. unitName .. &amp;quot;]]&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        -- Pattern complexe : &lt;br /&gt;
        -- %f[%a] : frontière de mot&lt;br /&gt;
        -- [%[%]|\n] : on vérifie que le mot n&#039;est pas déjà à l&#039;intérieur d&#039;un lien [[ ]]&lt;br /&gt;
        local escapedName = mw.ustring.gsub(unitName, &amp;quot;([%(%)%.%%%+%-%*%?%[%^%$])&amp;quot;, &amp;quot;%%%1&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        -- On remplace uniquement si le mot n&#039;est pas déjà dans un lien&lt;br /&gt;
        -- Cette logique cherche à éviter de casser les liens déjà présents&lt;br /&gt;
        local pattern = &amp;quot;(%f[%a])&amp;quot; .. escapedName .. &amp;quot;(%f[%A])&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        text = mw.ustring.gsub(text, pattern, function(prefix, suffix)&lt;br /&gt;
            -- On vérifie si on est déjà dans un bloc de lien (simplifié)&lt;br /&gt;
            if mw.ustring.find(text, &amp;quot;%[%[&amp;quot; .. escapedName) then return prefix .. unitName .. suffix end&lt;br /&gt;
            return prefix .. link .. suffix&lt;br /&gt;
        end)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:UnitLinker&amp;diff=22620</id>
		<title>Module:UnitLinker</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:UnitLinker&amp;diff=22620"/>
		<updated>2026-06-13T15:36:08Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction pour charger toutes les unités en mémoire (Mise en cache interne)&lt;br /&gt;
local function getUnitRegistry(lang)&lt;br /&gt;
    local registry = {}&lt;br /&gt;
    local cargoQuery = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id, name&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;type = &#039;unit&#039; AND (language = &#039;en&#039; OR language = &#039;&amp;quot; .. lang .. &amp;quot;&#039;)&amp;quot;,&lt;br /&gt;
        orderBy = &amp;quot;target_id&amp;quot;&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    -- On organise les données pour un accès rapide : registry[nom_traduit] = nom_anglais&lt;br /&gt;
    for _, row in ipairs(cargoQuery) do&lt;br /&gt;
        registry[row.name] = row.target_id&lt;br /&gt;
    end&lt;br /&gt;
    return registry&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fonction principale : replace les noms d&#039;unités dans un texte&lt;br /&gt;
function p.link(frame)&lt;br /&gt;
    local text = frame.args[1] or &amp;quot;&amp;quot;&lt;br /&gt;
    local title = mw.title.getCurrentTitle().text&lt;br /&gt;
    local lang = mw.ustring.match(title, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- Si la langue est &amp;quot;en&amp;quot;, on ne traite que les noms anglais, sinon on charge les deux&lt;br /&gt;
    local registry = getUnitRegistry(lang)&lt;br /&gt;
    &lt;br /&gt;
    -- On trie les clés par longueur décroissante pour éviter de remplacer &amp;quot;Swordsman&amp;quot; &lt;br /&gt;
    -- dans &amp;quot;Temple Swordsman&amp;quot; avant de traiter le nom complet.&lt;br /&gt;
    local keys = {}&lt;br /&gt;
    for k in pairs(registry) do table.insert(keys, k) end&lt;br /&gt;
    table.sort(keys, function(a, b) return #a &amp;gt; #b end)&lt;br /&gt;
    &lt;br /&gt;
    -- Remplacement&lt;br /&gt;
    for _, unitName in ipairs(keys) do&lt;br /&gt;
        local engName = registry[unitName]&lt;br /&gt;
        local link&lt;br /&gt;
        &lt;br /&gt;
        -- Construction du lien selon la langue&lt;br /&gt;
        if lang == &amp;quot;en&amp;quot; then&lt;br /&gt;
            link = &amp;quot;[[&amp;quot; .. engName .. &amp;quot;]]&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            link = &amp;quot;[[&amp;quot; .. engName .. &amp;quot;/&amp;quot; .. lang .. &amp;quot;|&amp;quot; .. unitName .. &amp;quot;]]&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        -- Échappement des caractères spéciaux pour le pattern (si nécessaire)&lt;br /&gt;
        -- On utilise une frontière de mot (%f[%a]) pour éviter de couper des mots.&lt;br /&gt;
        local pattern = &amp;quot;%f[%a]&amp;quot; .. mw.ustring.gsub(unitName, &amp;quot;([%(%)%.%%%+%-%*%?%[%^%$])&amp;quot;, &amp;quot;%%%1&amp;quot;) .. &amp;quot;%f[%A]&amp;quot;&lt;br /&gt;
        text = mw.ustring.gsub(text, pattern, link)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:UnitLinker&amp;diff=22619</id>
		<title>Module:UnitLinker</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:UnitLinker&amp;diff=22619"/>
		<updated>2026-06-13T15:31:26Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: Created page with &amp;quot;local p = {}  -- Fonction pour déterminer la langue à partir du titre de la page local function getLanguage()     local title = mw.title.getCurrentTitle().text     local lang = mw.ustring.match(title, &amp;quot;/([a-z_]+)$&amp;quot;)     if not lang or lang == &amp;quot;en&amp;quot; then return &amp;quot;en&amp;quot; end     return lang end  -- Fonction pour vérifier si un nom d&amp;#039;unité est valide et obtenir son nom anglais de base local function resolveUnit(name)     -- Recherche dans la table Translation pour trouver le...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction pour déterminer la langue à partir du titre de la page&lt;br /&gt;
local function getLanguage()&lt;br /&gt;
    local title = mw.title.getCurrentTitle().text&lt;br /&gt;
    local lang = mw.ustring.match(title, &amp;quot;/([a-z_]+)$&amp;quot;)&lt;br /&gt;
    if not lang or lang == &amp;quot;en&amp;quot; then return &amp;quot;en&amp;quot; end&lt;br /&gt;
    return lang&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fonction pour vérifier si un nom d&#039;unité est valide et obtenir son nom anglais de base&lt;br /&gt;
local function resolveUnit(name)&lt;br /&gt;
    -- Recherche dans la table Translation pour trouver le nom anglais (target_id)&lt;br /&gt;
    -- si le nom fourni est déjà une traduction&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;type = &#039;unit&#039; AND name = &#039;&amp;quot; .. name .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if res and #res &amp;gt; 0 then return res[1].target_id end&lt;br /&gt;
    &lt;br /&gt;
    -- Sinon, vérifier si le nom est déjà un nom anglais valide dans la table Unit&lt;br /&gt;
    local unitCheck = mw.ext.cargo.query(&amp;quot;Unit&amp;quot;, &amp;quot;id&amp;quot;, { where = &amp;quot;id = &#039;&amp;quot; .. name .. &amp;quot;&#039;&amp;quot;, limit = 1 })&lt;br /&gt;
    if unitCheck and #unitCheck &amp;gt; 0 then return name end&lt;br /&gt;
    &lt;br /&gt;
    return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fonction principale appelée par {{#invoke:UnitLinker|link|Ton texte ici}}&lt;br /&gt;
function p.link(frame)&lt;br /&gt;
    local text = frame.args[1] or &amp;quot;&amp;quot;&lt;br /&gt;
    local lang = getLanguage()&lt;br /&gt;
    &lt;br /&gt;
    -- On utilise une fonction de remplacement globale&lt;br /&gt;
    local processedText = mw.ustring.gsub(text, &amp;quot;([%a%s]+)&amp;quot;, function(match)&lt;br /&gt;
        local unitName = mw.text.trim(match)&lt;br /&gt;
        local baseName = resolveUnit(unitName)&lt;br /&gt;
        &lt;br /&gt;
        if baseName then&lt;br /&gt;
            -- Si anglais, lien simple&lt;br /&gt;
            if lang == &amp;quot;en&amp;quot; then&lt;br /&gt;
                return &amp;quot;[[&amp;quot; .. baseName .. &amp;quot;]]&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                -- Si autre langue, on cherche le nom traduit pour le display&lt;br /&gt;
                local trans = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;name&amp;quot;, {&lt;br /&gt;
                    where = &amp;quot;type = &#039;unit&#039; AND target_id = &#039;&amp;quot; .. baseName .. &amp;quot;&#039; AND language = &#039;&amp;quot; .. lang .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
                    limit = 1&lt;br /&gt;
                })&lt;br /&gt;
                local displayName = (trans and #trans &amp;gt; 0) and trans[1].name or unitName&lt;br /&gt;
                return &amp;quot;[[&amp;quot; .. baseName .. &amp;quot;/&amp;quot; .. lang .. &amp;quot;|&amp;quot; .. displayName .. &amp;quot;]]&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        return match&lt;br /&gt;
    end)&lt;br /&gt;
    &lt;br /&gt;
    return processedText&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:BuildingsData/doc&amp;diff=22618</id>
		<title>Module:BuildingsData/doc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:BuildingsData/doc&amp;diff=22618"/>
		<updated>2026-06-13T15:17:43Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:BuildingsData/doc&amp;diff=22617</id>
		<title>Module:BuildingsData/doc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:BuildingsData/doc&amp;diff=22617"/>
		<updated>2026-06-13T15:16:35Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: 76561198256426587 moved page Module:BuildingsData/doc to Module:MapObjectsData/doc&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Module:MapObjectsData/doc]]&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData/doc&amp;diff=22616</id>
		<title>Module:MapObjectsData/doc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData/doc&amp;diff=22616"/>
		<updated>2026-06-13T15:16:35Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: 76561198256426587 moved page Module:BuildingsData/doc to Module:MapObjectsData/doc&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
The &#039;&#039;&#039;BuildingsData&#039;&#039;&#039; module provides a centralized interface to retrieve adventure map object data from the &amp;lt;code&amp;gt;MapObject&amp;lt;/code&amp;gt; Cargo table and their localized strings from the &amp;lt;code&amp;gt;Translation&amp;lt;/code&amp;gt; Cargo table. &lt;br /&gt;
&lt;br /&gt;
It is designed to be &amp;quot;page-aware,&amp;quot; meaning it can automatically identify the correct object ID and language based on the current page title (e.g., handling subpages and language suffixes).&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;pre&amp;gt;{{#invoke:BuildingsData|get|id=|field=|language=}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; (optional): The unique object ID (e.g., &amp;lt;code&amp;gt;barracks_unfrozen_6&amp;lt;/code&amp;gt;) or english building name (e.g., &amp;lt;code&amp;gt;Bloated Mansion&amp;lt;/code&amp;gt;). If omitted, the module attempts to detect it from the current page title.&lt;br /&gt;
* &amp;lt;code&amp;gt;field&amp;lt;/code&amp;gt; (required): The specific data field to retrieve.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional): The language code (e.g., &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;de&amp;lt;/code&amp;gt;). If omitted, the module attempts to detect it from the page title suffix (e.g., &amp;lt;code&amp;gt;/fr&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Available Fields ==&lt;br /&gt;
=== Localization (from Translation table) ===&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt; (using type &amp;lt;code&amp;gt;map_object&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;narrative&amp;lt;/code&amp;gt; (using type &amp;lt;code&amp;gt;map_object_narrative&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Technical (from MapObject table) ===&lt;br /&gt;
* &amp;lt;code&amp;gt;category&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;goods_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ai_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;custom_guard_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;view_radius&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;guard_units&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fraction&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;resource_name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;resource_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;source_path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
=== Automatic Mode ===&lt;br /&gt;
If you are currently viewing the page &amp;lt;code&amp;gt;Bloated Mansion/fr&amp;lt;/code&amp;gt;, the module automatically identifies the object and the language:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;{{#invoke:BuildingsData|get|field=name}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Result: {{#invoke:BuildingsData|get|id=barracks_unfrozen_6|field=name|language=fr}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;{{#invoke:BuildingsData|get|field=narrative}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Result: {{#invoke:BuildingsData|get|id=barracks_unfrozen_6|field=narrative|language=fr}}&lt;br /&gt;
&lt;br /&gt;
=== Manual Mode ===&lt;br /&gt;
To fetch specific data regardless of the current page:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;{{#invoke:BuildingsData|get|id=barracks_unfrozen_6|field=tier}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Result: {{#invoke:BuildingsData|get|id=barracks_unfrozen_6|field=tier}}&lt;br /&gt;
&lt;br /&gt;
== Technical Notes ==&lt;br /&gt;
* &#039;&#039;&#039;ID Detection:&#039;&#039;&#039; The module cleans the page title by removing subpages (text after &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) and parenthetical text to match the entity name in the database.&lt;br /&gt;
* &#039;&#039;&#039;Fallback:&#039;&#039;&#039; If a &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; request returns no data, the system relies on the object&#039;s &amp;lt;code&amp;gt;category&amp;lt;/code&amp;gt; field for identification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
[[Category:Lua modules]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:BuildingsData&amp;diff=22615</id>
		<title>Module:BuildingsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:BuildingsData&amp;diff=22615"/>
		<updated>2026-06-13T15:16:35Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: 76561198256426587 moved page Module:BuildingsData to Module:MapObjectsData&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;return require [[Module:MapObjectsData]]&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22614</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22614"/>
		<updated>2026-06-13T15:16:35Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: 76561198256426587 moved page Module:BuildingsData to Module:MapObjectsData&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour interroger Cargo&lt;br /&gt;
local function queryCargo(table, fields, where)&lt;br /&gt;
    local res = mw.ext.cargo.query(table, fields, { where = where, limit = 1 })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fonction pour chercher l&#039;ID (par ID ou nom anglais)&lt;br /&gt;
local function resolveId(input)&lt;br /&gt;
    if not input then return nil end&lt;br /&gt;
    local checkId = queryCargo(&amp;quot;MapObject&amp;quot;, &amp;quot;id&amp;quot;, &amp;quot;id = &#039;&amp;quot; .. input .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
    if checkId then return input end&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. input .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1].target_id or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour nettoyer le nom de la page&lt;br /&gt;
local function getObjId(pagename)&lt;br /&gt;
    local cleanName = mw.text.trim(mw.ustring.gsub(mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;), &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. cleanName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1].target_id or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.get(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    local rawId = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local id = resolveId(rawId) or getObjId(pagename)&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    -- On récupère le champ, et si c&#039;est &amp;quot;faction&amp;quot;, on le transforme en &amp;quot;fraction&amp;quot; pour la suite&lt;br /&gt;
    local field = args[&amp;quot;field&amp;quot;] or args[2]&lt;br /&gt;
    local queryField = (field == &amp;quot;faction&amp;quot;) and &amp;quot;fraction&amp;quot; or field&lt;br /&gt;
    &lt;br /&gt;
    if not id then return &amp;quot;Erreur : ID introuvable.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Cas : Nom et Description&lt;br /&gt;
    if queryField == &amp;quot;name&amp;quot; or queryField == &amp;quot;description&amp;quot; then&lt;br /&gt;
        local res = queryCargo(&amp;quot;Translation&amp;quot;, queryField, string.format(&amp;quot;target_id=&#039;%s&#039; AND type=&#039;map_object&#039; AND language=&#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return res and res[queryField] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Cas : Narration&lt;br /&gt;
    if queryField == &amp;quot;narrative&amp;quot; then&lt;br /&gt;
        local res = queryCargo(&amp;quot;Translation&amp;quot;, &amp;quot;description&amp;quot;, string.format(&amp;quot;target_id=&#039;%s&#039; AND type=&#039;map_object_narrative&#039; AND language=&#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return res and res.description or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Cas : Traduction spéciale pour Faction (si field était &amp;quot;faction&amp;quot;)&lt;br /&gt;
    if field == &amp;quot;faction&amp;quot; then&lt;br /&gt;
        local data = queryCargo(&amp;quot;MapObject&amp;quot;, &amp;quot;fraction&amp;quot;, &amp;quot;id=&#039;&amp;quot; .. id .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
        if not data then return &amp;quot;&amp;quot; end&lt;br /&gt;
        local res = queryCargo(&amp;quot;Translation&amp;quot;, &amp;quot;name&amp;quot;, string.format(&amp;quot;target_id=&#039;%s&#039; AND type=&#039;faction&#039; AND language=&#039;%s&#039;&amp;quot;, data.fraction, lang))&lt;br /&gt;
        return res and res.name or data.fraction&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 4. Cas : Données techniques (on utilise queryField qui est soit le field normal, soit &amp;quot;fraction&amp;quot;)&lt;br /&gt;
    local tech_fields = &amp;quot;category,goods_value,ai_value,custom_guard_value,view_radius,guard_units,fraction,tier,resource_name,resource_value,source_path&amp;quot;&lt;br /&gt;
    if string.find(tech_fields, queryField) then&lt;br /&gt;
        local res = queryCargo(&amp;quot;MapObject&amp;quot;, queryField, &amp;quot;id=&#039;&amp;quot; .. id .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
        return res and res[queryField] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return &amp;quot;Erreur : Champ &#039;&amp;quot; .. field .. &amp;quot;&#039; invalide.&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData/doc&amp;diff=22613</id>
		<title>Module:MapObjectsData/doc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData/doc&amp;diff=22613"/>
		<updated>2026-06-13T14:52:46Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: /* Parameters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
The &#039;&#039;&#039;BuildingsData&#039;&#039;&#039; module provides a centralized interface to retrieve adventure map object data from the &amp;lt;code&amp;gt;MapObject&amp;lt;/code&amp;gt; Cargo table and their localized strings from the &amp;lt;code&amp;gt;Translation&amp;lt;/code&amp;gt; Cargo table. &lt;br /&gt;
&lt;br /&gt;
It is designed to be &amp;quot;page-aware,&amp;quot; meaning it can automatically identify the correct object ID and language based on the current page title (e.g., handling subpages and language suffixes).&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;pre&amp;gt;{{#invoke:BuildingsData|get|id=|field=|language=}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; (optional): The unique object ID (e.g., &amp;lt;code&amp;gt;barracks_unfrozen_6&amp;lt;/code&amp;gt;) or english building name (e.g., &amp;lt;code&amp;gt;Bloated Mansion&amp;lt;/code&amp;gt;). If omitted, the module attempts to detect it from the current page title.&lt;br /&gt;
* &amp;lt;code&amp;gt;field&amp;lt;/code&amp;gt; (required): The specific data field to retrieve.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional): The language code (e.g., &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;de&amp;lt;/code&amp;gt;). If omitted, the module attempts to detect it from the page title suffix (e.g., &amp;lt;code&amp;gt;/fr&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Available Fields ==&lt;br /&gt;
=== Localization (from Translation table) ===&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt; (using type &amp;lt;code&amp;gt;map_object&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;narrative&amp;lt;/code&amp;gt; (using type &amp;lt;code&amp;gt;map_object_narrative&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Technical (from MapObject table) ===&lt;br /&gt;
* &amp;lt;code&amp;gt;category&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;goods_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ai_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;custom_guard_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;view_radius&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;guard_units&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fraction&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;resource_name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;resource_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;source_path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
=== Automatic Mode ===&lt;br /&gt;
If you are currently viewing the page &amp;lt;code&amp;gt;Bloated Mansion/fr&amp;lt;/code&amp;gt;, the module automatically identifies the object and the language:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;{{#invoke:BuildingsData|get|field=name}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Result: {{#invoke:BuildingsData|get|id=barracks_unfrozen_6|field=name|language=fr}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;{{#invoke:BuildingsData|get|field=narrative}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Result: {{#invoke:BuildingsData|get|id=barracks_unfrozen_6|field=narrative|language=fr}}&lt;br /&gt;
&lt;br /&gt;
=== Manual Mode ===&lt;br /&gt;
To fetch specific data regardless of the current page:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;{{#invoke:BuildingsData|get|id=barracks_unfrozen_6|field=tier}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Result: {{#invoke:BuildingsData|get|id=barracks_unfrozen_6|field=tier}}&lt;br /&gt;
&lt;br /&gt;
== Technical Notes ==&lt;br /&gt;
* &#039;&#039;&#039;ID Detection:&#039;&#039;&#039; The module cleans the page title by removing subpages (text after &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) and parenthetical text to match the entity name in the database.&lt;br /&gt;
* &#039;&#039;&#039;Fallback:&#039;&#039;&#039; If a &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; request returns no data, the system relies on the object&#039;s &amp;lt;code&amp;gt;category&amp;lt;/code&amp;gt; field for identification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
[[Category:Lua modules]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Necropolis_Units/ru&amp;diff=22612</id>
		<title>Necropolis Units/ru</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Necropolis_Units/ru&amp;diff=22612"/>
		<updated>2026-06-13T14:39:19Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{loc}}&lt;br /&gt;
{{#invoke:LocUnitData|unitTabs|Skeleton|Wight|Undead Pet|Graverobber|Lich|Dread Knight|Vampire|lang=ru}}&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Necropolis_Units&amp;diff=22611</id>
		<title>Necropolis Units</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Necropolis_Units&amp;diff=22611"/>
		<updated>2026-06-13T14:38:56Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{loc}}&lt;br /&gt;
Unit list belonging to [[Necropolis]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-|Skeletons=&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Skeleton&lt;br /&gt;
|screenshot=Necropolis_Skeleton_Battlefield.png&lt;br /&gt;
|tier=1&lt;br /&gt;
|health=6&lt;br /&gt;
|attack=4&lt;br /&gt;
|defence=1&lt;br /&gt;
|damage=1-3&lt;br /&gt;
|speed=3&lt;br /&gt;
|initiative=4&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Ground&lt;br /&gt;
|gold=40&lt;br /&gt;
|mercury=&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Melee&lt;br /&gt;
|growth=30&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=Skeletons are the simplest product of necromancy, raised without elaborate rituals – just magic binding bones into a crude frame capable of basic movement and obedience.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Upgrade Cost&amp;lt;/span&amp;gt;: 10 [[File:Icon Resource Gold.png|32px]]&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Skeleton Warrior&lt;br /&gt;
|screenshot=Necropolis_SkeletonWarrior_Battlefield.png&lt;br /&gt;
|tier=1&lt;br /&gt;
|health=6&lt;br /&gt;
|attack=6 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|defence=3 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|damage=2-3 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|speed=3&lt;br /&gt;
|initiative=6 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Ground&lt;br /&gt;
|gold=50&lt;br /&gt;
|mercury=&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Melee&lt;br /&gt;
|growth=30&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=Skeletons are the simplest product of necromancy, raised without elaborate rituals – just magic binding bones into a crude frame capable of basic movement and obedience. &lt;br /&gt;
&lt;br /&gt;
With little care, skeletons can retain memories of their lives as soldiers or fighters; stripped of personality but still skilled.&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Skeleton Archer&lt;br /&gt;
|screenshot=Necropolis_SkeletonArcher_Battlefield.png&lt;br /&gt;
|tier=1&lt;br /&gt;
|health=6&lt;br /&gt;
|attack=4&lt;br /&gt;
|defence=2 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|damage=1-3&lt;br /&gt;
|speed=3&lt;br /&gt;
|initiative=4&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Ground&lt;br /&gt;
|gold=50&lt;br /&gt;
|mercury=&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Ranged&lt;br /&gt;
|growth=30&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=Skeletal archers are rather uncommon among necromancers. However, vampires especially value them as castle guards. After all, it is always easier to repel the would-be assailers from afar.&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-|Wights=&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Wight&lt;br /&gt;
|screenshot=Necropolis_Wight_Battlefield.png&lt;br /&gt;
|tier=2&lt;br /&gt;
|health=9&lt;br /&gt;
|attack=2&lt;br /&gt;
|defence=0 &lt;br /&gt;
|damage=2-4&lt;br /&gt;
|speed=3&lt;br /&gt;
|initiative=6&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Flying&lt;br /&gt;
|gold=85&lt;br /&gt;
|mercury=&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Melee&lt;br /&gt;
|growth=16&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=A person once deeply cherished, forced back to life against their will. Wights, dissolving and lost, claw at each others’ memories in desperation, hoping to recover or steal their names and identities.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Upgrade Cost&amp;lt;/span&amp;gt;: 25 [[File:Icon Resource Gold.png|32px]]&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Memory Devourer I: &amp;lt;/span&amp;gt;Converts 20% of the damage dealt into additional HP. This can create temporary units in this unit’s stack.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Wraith&lt;br /&gt;
|screenshot=Necropolis_Wraith_Battlefield.png&lt;br /&gt;
|tier=2&lt;br /&gt;
|health=9&lt;br /&gt;
|attack=6 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|defence=0 &lt;br /&gt;
|damage=2-4&lt;br /&gt;
|speed=4 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|initiative=7 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Flying&lt;br /&gt;
|gold=110&lt;br /&gt;
|mercury=&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Melee&lt;br /&gt;
|growth=16&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=Sometimes a soul is brought back with enough clarity to grasp its eternal entrapment in the living world. This harrowing realization of rage and despair gives rise to a wraith.&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Memory Devourer II: &amp;lt;/span&amp;gt;Converts 40% of the damage dealt into additional HP. This can create temporary units in this unit’s stack.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Howl of the Banshee: &amp;lt;/span&amp;gt;Forces the target enemy creature to move to a random adjacent hex, if possible. Does not end turn. Ability tier 2.&lt;br /&gt;
&amp;lt;br&amp;gt;Ability Cost: [[File:Focus_Charge.png|23px]]&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Phantasm&lt;br /&gt;
|screenshot=Necropolis_Phantasm_Battlefield.png&lt;br /&gt;
|tier=2&lt;br /&gt;
|health=9&lt;br /&gt;
|attack=6 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|defence=3 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|damage=2-4&lt;br /&gt;
|speed=4 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|initiative=7 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Flying&lt;br /&gt;
|gold=110&lt;br /&gt;
|mercury=&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Melee&lt;br /&gt;
|growth=16&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=Souls severed from their bodies succumb to entropy, flickering and fading as they desperately cling to fragments of identity while oblivion slowly consumes them.&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Memory Devourer I: &amp;lt;/span&amp;gt;Converts 20% of the damage dealt into additional HP. This can create temporary units in this unit’s stack.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Nightmares: &amp;lt;/span&amp;gt;Upon attacking, curses the target. Cursed targets take 1 pure damage at the start of its turn. This effect is stackable. Lasts 2 rounds.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-|Undead Pets=&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Undead Pet&lt;br /&gt;
|screenshot=Necropolis_UndeadPet_Battlefield.png&lt;br /&gt;
|tier=3&lt;br /&gt;
|health=14&lt;br /&gt;
|attack=4&lt;br /&gt;
|defence=6 &lt;br /&gt;
|damage=3-5&lt;br /&gt;
|speed=5&lt;br /&gt;
|initiative=5&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Ground&lt;br /&gt;
|gold=120&lt;br /&gt;
|mercury=&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Melee&lt;br /&gt;
|growth=13&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=Some necromancers reanimate elves and humans. Others choose companions truly dear to them, like loyal hounds. Dogs feel no torment in undeath – is there a greater fate than to remain by their master’s side for eternity?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Upgrade Cost&amp;lt;/span&amp;gt;: 40 [[File:Icon Resource Gold.png|32px|link=Resources#Gold|Gold]]&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Melee Defense I: &amp;lt;/span&amp;gt;Takes -30% melee damage.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Barghest&lt;br /&gt;
|screenshot=Necropolis_Barghest_Battlefield.png&lt;br /&gt;
|tier=3&lt;br /&gt;
|health=14&lt;br /&gt;
|attack=8 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|defence=6 &lt;br /&gt;
|damage=3-5&lt;br /&gt;
|speed=6 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|initiative=8 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Ground&lt;br /&gt;
|gold=160&lt;br /&gt;
|mercury=&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Melee&lt;br /&gt;
|growth=13&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=Among the simple folk, it is believed that the barghests abduct children who refuse to heed their parents, delivering them to vampiric lords who curse them with vampirism. Of course, it’s just a folk legend…isn’t it?&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Melee Defense I: &amp;lt;/span&amp;gt;Takes -30% melee damage.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Bone Crusher: &amp;lt;/span&amp;gt;Reduces the target’s defense by 1 with each strike and gains an equal amount until the end of battle. This effect cannot be dispelled.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Call of the Pack: &amp;lt;/span&amp;gt;This creature can summon 20% of its current amount as temporary units. Ability tier 4.&amp;lt;br&amp;gt;Ability Cost: [[File:Focus_Charge.png|23px]][[File:Focus_Charge.png|23px]]&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Armored Hound&lt;br /&gt;
|screenshot=Necropolis_ArmoredHound_Battlefield.png&lt;br /&gt;
|tier=3&lt;br /&gt;
|health=18 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|attack=4&lt;br /&gt;
|defence=8 [[File:Battleframe_buff.png|17px]] &lt;br /&gt;
|damage=3-5&lt;br /&gt;
|speed=5&lt;br /&gt;
|initiative=5&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Ground&lt;br /&gt;
|gold=160&lt;br /&gt;
|mercury=&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Melee&lt;br /&gt;
|growth=13&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=Risen hounds are more precious than gold to certain vampires, treasured as armoured guards and hunting companions. These pets remain as loyal and loving in undeath as they were in life.&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Melee Defense I: &amp;lt;/span&amp;gt;Takes -30% melee damage.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Protect the Fallen: &amp;lt;/span&amp;gt;Whenever a friendly creature dies, this creature gains +3 defense until the end of battle.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Lacerated Wounds: &amp;lt;/span&amp;gt;Wounds the target. Wounded target takes 2 normal damage per unit in this stack at the start of its turn. This effect is stackable. Lasts 2 rounds. Does not affect undead, embodiments, or constructs.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-|Graverobbers=&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Graverobber&lt;br /&gt;
|screenshot=Necropolis_Graverobber_Battlefield.png&lt;br /&gt;
|tier=4&lt;br /&gt;
|health=30&lt;br /&gt;
|attack=13&lt;br /&gt;
|defence=9&lt;br /&gt;
|damage=7-9&lt;br /&gt;
|speed=3&lt;br /&gt;
|initiative=2&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Ground&lt;br /&gt;
|gold=250&lt;br /&gt;
|mercury=&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Long Reach&lt;br /&gt;
|growth=10&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=Graverobbers trail necromancers, assisting in acquiring skeletons and bodies for reanimation by any means; whether by exhuming the dead or creating new ones. This constant exposure to deathly energies leaves them almost indistinguishable from the dead.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Upgrade Cost&amp;lt;/span&amp;gt;: 90 [[File:Icon Resource Gold.png|32px]]&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Dig Up Bones: &amp;lt;/span&amp;gt;Summons 2 skeletons per graverobber on adjacent hex. Ability tier 2. &amp;lt;br&amp;gt;Ability Cost: [[File:Focus_Charge.png|23px]][[File:Focus_Charge.png|23px]]&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Merchant of Death&lt;br /&gt;
|screenshot=Necropolis_MerchantofDeath_Battlefield.png&lt;br /&gt;
|tier=4&lt;br /&gt;
|health=30&lt;br /&gt;
|attack=13&lt;br /&gt;
|defence=9&lt;br /&gt;
|damage=7-9&lt;br /&gt;
|speed=4 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|initiative=5 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Ground&lt;br /&gt;
|gold=340&lt;br /&gt;
|mercury=&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Long Reach&lt;br /&gt;
|growth=10&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=Procuring bodies for necromancers is a lucrative business but souls are even more valuable. Merchants of death mastered the alchemical arts needed to capture only the most prized and love-stricken assets.&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Blighted Corpses: &amp;lt;/span&amp;gt;Long reach attacks poisons the enemy. Poisoned enemies take 3 magic damage per Merchant of Death, per turn. Effect is stackable. Lasts 2 rounds. Does not affect undead, dragons, embodiments, or constructs.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Dig Up Bones: &amp;lt;/span&amp;gt;Summons 2 skeletons per merchant of death on adjacent hex. Ability tier 2. &amp;lt;br&amp;gt;Ability Cost: [[File:Focus_Charge.png|23px]][[File:Focus_Charge.png|23px]]&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Ensnare Memories: &amp;lt;/span&amp;gt; Summons 1 wight per merchant of death on an adjacent hex. Ability tier 2. &amp;lt;br&amp;gt;Ability Cost: [[File:Focus_Charge.png|23px]][[File:Focus_Charge.png|23px]]&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Kennelmaster&lt;br /&gt;
|screenshot=Necropolis_Kennelmaster_Battlefield.png&lt;br /&gt;
|tier=4&lt;br /&gt;
|health=30&lt;br /&gt;
|attack=13&lt;br /&gt;
|defence=9&lt;br /&gt;
|damage=8-10 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|speed=4 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|initiative=4 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Ground&lt;br /&gt;
|gold=340&lt;br /&gt;
|mercury=&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Long Reach&lt;br /&gt;
|growth=10&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=Vampires can be quite eccentric. Their refusal to accept the flow of time leads to hiring resurrectionists. These kennelmasters ensure their employers always have a steady pack of dogs to hunt and play with.&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Smell of the Hunt: &amp;lt;/span&amp;gt;Generates 1 focus point when a friendly creature dies.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Dig Up Bones: &amp;lt;/span&amp;gt;Summons 2 skeletons per kennelmaster on adjacent hex. Ability tier 2. &amp;lt;br&amp;gt;Ability Cost: [[File:Focus_Charge.png|23px]][[File:Focus_Charge.png|23px]]&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Fetch: &amp;lt;/span&amp;gt;Summons 1 undead pet for every 2 kennelmasters. Ability tier 2.&amp;lt;br&amp;gt;Ability Cost: [[File:Focus_Charge.png|23px]][[File:Focus_Charge.png|23px]]&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Hail!: &amp;lt;/span&amp;gt;Marks an enemy, causing them to always take max damage. Ability tier 3.&amp;lt;br&amp;gt;Ability Cost: [[File:Focus_Charge.png|23px]][[File:Focus_Charge.png|23px]]&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
|-|Liches=&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Lich&lt;br /&gt;
|screenshot=Necropolis_Lich_Battlefield.png&lt;br /&gt;
|tier=5&lt;br /&gt;
|health=50&lt;br /&gt;
|attack=12&lt;br /&gt;
|defence=12&lt;br /&gt;
|damage=11-16&lt;br /&gt;
|speed=2&lt;br /&gt;
|initiative=4&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Ground&lt;br /&gt;
|gold=340&lt;br /&gt;
|mercury=&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Ranged&lt;br /&gt;
|growth=5&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=A self-risen undead bound to the materium through a phylactery and a rite prepared before death. Liches seek immortality and power in the living world. On Jadame, they also delve into time-turning magic. Necromancy is not the only way to persist in the world, after all.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Upgrade Cost&amp;lt;/span&amp;gt;: 140 [[File:Icon Resource Gold.png|32px]]&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Rewind Death: &amp;lt;/span&amp;gt;Restores 20 HP per lich to a friendly unit. Revives fallen units. Ability tier 4. &amp;lt;br&amp;gt;Ability Cost: [[File:Focus_Charge.png|23px]][[File:Focus_Charge.png|23px]]&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Pestilent Lich&lt;br /&gt;
|screenshot=Necropolis_PestilentLich_Battlefield.png&lt;br /&gt;
|tier=5&lt;br /&gt;
|health=50&lt;br /&gt;
|attack=17 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|defence=12&lt;br /&gt;
|damage=16 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|speed=3 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|initiative=5 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Ground&lt;br /&gt;
|gold=480&lt;br /&gt;
|mercury=&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Ranged&lt;br /&gt;
|growth=5&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=Miasma is another form of eternal life; constantly shifting and changing, yet enduring. It’s no coincidence that deadly poisons and miraculous cures are often the same substance, administered in different amounts. Perhaps life and death are not opposites but foils of one card.&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Area Strike: &amp;lt;/span&amp;gt;Deals damage to the target and all hexes around it.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Death’s Embrace: &amp;lt;/span&amp;gt;Triggers all effects applied on the target, instantly using their full remaining duration. These effects are then removed. Ability tier 4. &amp;lt;br&amp;gt;Ability Cost: [[File:Focus_Charge.png|23px]]&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Sanguine Lich&lt;br /&gt;
|screenshot=Necropolis_SanguineLich_Battlefield.png&lt;br /&gt;
|tier=5&lt;br /&gt;
|health=50&lt;br /&gt;
|attack=12&lt;br /&gt;
|defence=17 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|damage=11-16&lt;br /&gt;
|speed=3 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|initiative=4&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Ground&lt;br /&gt;
|gold=480&lt;br /&gt;
|mercury=&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Ranged&lt;br /&gt;
|growth=5&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=Necromancers are the finest healers, for the force of life is simply the power of death rewound. Yet there must be an agenda behind their studies of time. Could it be that everything we know about the liches of the past and everything we know about them is merely the deception of the present? Time will tell.&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Unlife, Undeath: &amp;lt;/span&amp;gt;Restores 20% damage dealt as HP to all friendly units. Does not revive.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Knowledge of Death: &amp;lt;/span&amp;gt;Increases the amount of XP gained by 10%. Does not stack.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Rewind Death: &amp;lt;/span&amp;gt;Restores 30 HP per lich to a friendly unit. Revives fallen units. Ability tier 4. &amp;lt;br&amp;gt;Ability Cost: [[File:Focus_Charge.png|23px]][[File:Focus_Charge.png|23px]]&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-|Dread Knights=&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Dread Knight&lt;br /&gt;
|screenshot=Necropolis_DreadKnight_Battlefield.png&lt;br /&gt;
|tier=6&lt;br /&gt;
|health=100&lt;br /&gt;
|attack=19&lt;br /&gt;
|defence=18&lt;br /&gt;
|damage=12-14&lt;br /&gt;
|speed=6&lt;br /&gt;
|initiative=9&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Ground&lt;br /&gt;
|gold=700&lt;br /&gt;
|mercury=&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Melee&lt;br /&gt;
|growth=3&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=A soul fused with their armour, dread knights exist by a single rule: to fight is to live and to live is to fight.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Upgrade Cost&amp;lt;/span&amp;gt;: 400 [[File:Icon Resource Gold.png|32px]]&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Double Strike: &amp;lt;/span&amp;gt;Strikes twice.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Dreadful Presence I: &amp;lt;/span&amp;gt;Reduces all enemies’ morale by 1. This effect does not stack. Only the strongest one is active.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Avatar of War&lt;br /&gt;
|screenshot=Necropolis_AvatarofWar_Battlefield.png&lt;br /&gt;
|tier=6&lt;br /&gt;
|health=100&lt;br /&gt;
|attack=19&lt;br /&gt;
|defence=18&lt;br /&gt;
|damage=18-20 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|speed=7 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|initiative=11 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Ground&lt;br /&gt;
|gold=1100&lt;br /&gt;
|mercury=&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Melee&lt;br /&gt;
|growth=3&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=“There went out another mount that was emerald; and power was given to them that sat thereon to take peace from the earth, and that they should kill one another; and there was given unto them a great scythe.”&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Double Strike: &amp;lt;/span&amp;gt;Strikes twice.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Dreadful Presence II: &amp;lt;/span&amp;gt;Reduces all enemies’ morale by 2. This effect does not stack. Only the strongest one is active.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;War Incarnate: &amp;lt;/span&amp;gt;Reduces target’s attack by 1 with each strike and gains an equal amount until the end of battle. This effect cannot be dispelled.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Hollow Reaper&lt;br /&gt;
|screenshot=Necropolis_HollowReaper_Battlefield.png&lt;br /&gt;
|tier=6&lt;br /&gt;
|health=100&lt;br /&gt;
|attack=24 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|defence=18&lt;br /&gt;
|damage=22-24 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|speed=6&lt;br /&gt;
|initiative=10 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Ground&lt;br /&gt;
|gold=1100&lt;br /&gt;
|mercury=&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Melee&lt;br /&gt;
|growth=3&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=As carnage mounts, certain knights grow even more powerful; each soul cleaved from their enemies and added onto their scythes. They inspire such terror that common folk liken them to death itself.&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Dreadful Presence II: &amp;lt;/span&amp;gt;Reduces all enemies’ morale by 2. This effect does not stack. Only the strongest one is active.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Hungering Hollow: &amp;lt;/span&amp;gt;Whenever a friendly unit dies, this unit gains +3 attack until the end of battle.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Death Stare: &amp;lt;/span&amp;gt;Kills +1 enemy units with each attack. Works on units up to tier 7.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-|Vampires=&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Vampire&lt;br /&gt;
|screenshot=Necropolis_Vampire_Battlefield.png&lt;br /&gt;
|tier=7&lt;br /&gt;
|health=150&lt;br /&gt;
|attack=25&lt;br /&gt;
|defence=22&lt;br /&gt;
|damage=25&lt;br /&gt;
|speed=5&lt;br /&gt;
|initiative=11&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Flying&lt;br /&gt;
|gold=1200&lt;br /&gt;
|mercury=1&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Melee&lt;br /&gt;
|growth=2&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=The origin of vampires remains a mystery to most. Powerful and vain, they see themselves as the pinnacle of creation. The draconic society of Garrote Gorge, however, dismisses such lofty notions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Upgrade Cost&amp;lt;/span&amp;gt;: 800 [[File:Icon Resource Gold.png|32px|link=Resources#Gold|Gold]] 1 [[File:Icon Resource Mercury.png|32px|link=Resources#Mercury|Mercury]]&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Vampirism: &amp;lt;/span&amp;gt;Restores 40% of damage dealt as HP. Revives fallen units. Does not affect undead, embodiments, or constructs.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Vampire Lord&lt;br /&gt;
|screenshot=Necropolis_VampireLord_Battlefield.png&lt;br /&gt;
|tier=7&lt;br /&gt;
|health=175 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|attack=25&lt;br /&gt;
|defence=29 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|damage=30 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|speed=7 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|initiative=13 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Flying&lt;br /&gt;
|gold=2000&lt;br /&gt;
|mercury=2&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Melee&lt;br /&gt;
|growth=2&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=Vampires tend to thrive in aristocratic circles rather than among commoners. It seems only logical – eternal life surrounded by opulence is far more spectacular. The decadence of nobles fuels their midnight ascension into darkness.&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Vampirism: &amp;lt;/span&amp;gt;Restores 40% of damage dealt as HP. Revives fallen units. Does not affect undead, embodiments, or constructs.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Swift Strike: &amp;lt;/span&amp;gt;Enemies do not counterattack.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Units Overview&lt;br /&gt;
|name=Vampire Scholar&lt;br /&gt;
|screenshot=Necropolis_VampireScholar_Battlefield.png&lt;br /&gt;
|tier=7&lt;br /&gt;
|health=150&lt;br /&gt;
|attack=27 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|defence=22&lt;br /&gt;
|damage=30 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|speed=5&lt;br /&gt;
|initiative=12 [[File:Battleframe_buff.png|17px]]&lt;br /&gt;
|morale=0&lt;br /&gt;
|moralerange=0&lt;br /&gt;
|luck=0&lt;br /&gt;
|luckrange=-5~5&lt;br /&gt;
|type=[[Undead]]&lt;br /&gt;
|movement=Flying&lt;br /&gt;
|gold=2000&lt;br /&gt;
|mercury=2&lt;br /&gt;
|gem=&lt;br /&gt;
|crystal=&lt;br /&gt;
|attackstyle=Long Reach&lt;br /&gt;
|growth=2&lt;br /&gt;
|exp=&lt;br /&gt;
|squadvalue=&lt;br /&gt;
|lore=Some vampires view their condition as an opportunity, delving into the powers hidden within blood. Their experiments make them dangerously unpredictable.&lt;br /&gt;
&lt;br /&gt;
|passives=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Vampirism: &amp;lt;/span&amp;gt;Restores 40% of damage dealt as HP. Revives fallen units. Does not affect undead, embodiments, or constructs.&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|abilities=&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Blood Transfusion: &amp;lt;/span&amp;gt;Connects an enemy to target friendly unit. The enemy takes 30 magic damage per vampire. The friendly unit restores 50% of the damage dealt as HP. Revives fallen HP. Does not affect embodiments or constructs. Ability tier 1. &amp;lt;br&amp;gt;Ability Cost: [[File:Focus_Charge.png|23px]][[File:Focus_Charge.png|23px]][[File:Focus_Charge.png|23px]]&amp;lt;/span&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;span style=&amp;quot;color:peru;&amp;quot;&amp;gt;Corpse Explosion: &amp;lt;/span&amp;gt;Blows up chosen corpse. All adjacent enemies take 20 damage and all adjacent friendly units restore 10% This does not revive fallen units. Does not affect embodiments or constructs. Ability tier 1. &amp;lt;br&amp;gt;Ability Cost: [[File:Focus_Charge.png|23px]][[File:Focus_Charge.png|23px]][[File:Focus_Charge.png|23px]]&amp;lt;/span&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/tabber&amp;gt;&lt;br /&gt;
{{UnitsNavbox}}&lt;br /&gt;
[[Category:Necropolis Units|*]]&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Unnatural_Calm&amp;diff=22610</id>
		<title>Unnatural Calm</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Unnatural_Calm&amp;diff=22610"/>
		<updated>2026-06-13T14:38:16Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{loc}}&lt;br /&gt;
&amp;lt;!-- Nightshade Spell Page: Unnatural Calm --&amp;gt;&lt;br /&gt;
{{#invoke:SpellTableUtil|spellBoxV|name=Unnatural Calm}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Spells]]&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22609</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22609"/>
		<updated>2026-06-13T13:58:07Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour interroger Cargo&lt;br /&gt;
local function queryCargo(table, fields, where)&lt;br /&gt;
    local res = mw.ext.cargo.query(table, fields, { where = where, limit = 1 })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fonction pour chercher l&#039;ID (par ID ou nom anglais)&lt;br /&gt;
local function resolveId(input)&lt;br /&gt;
    if not input then return nil end&lt;br /&gt;
    local checkId = queryCargo(&amp;quot;MapObject&amp;quot;, &amp;quot;id&amp;quot;, &amp;quot;id = &#039;&amp;quot; .. input .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
    if checkId then return input end&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. input .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1].target_id or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour nettoyer le nom de la page&lt;br /&gt;
local function getObjId(pagename)&lt;br /&gt;
    local cleanName = mw.text.trim(mw.ustring.gsub(mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;), &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. cleanName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1].target_id or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.get(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    local rawId = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local id = resolveId(rawId) or getObjId(pagename)&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    -- On récupère le champ, et si c&#039;est &amp;quot;faction&amp;quot;, on le transforme en &amp;quot;fraction&amp;quot; pour la suite&lt;br /&gt;
    local field = args[&amp;quot;field&amp;quot;] or args[2]&lt;br /&gt;
    local queryField = (field == &amp;quot;faction&amp;quot;) and &amp;quot;fraction&amp;quot; or field&lt;br /&gt;
    &lt;br /&gt;
    if not id then return &amp;quot;Erreur : ID introuvable.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Cas : Nom et Description&lt;br /&gt;
    if queryField == &amp;quot;name&amp;quot; or queryField == &amp;quot;description&amp;quot; then&lt;br /&gt;
        local res = queryCargo(&amp;quot;Translation&amp;quot;, queryField, string.format(&amp;quot;target_id=&#039;%s&#039; AND type=&#039;map_object&#039; AND language=&#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return res and res[queryField] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Cas : Narration&lt;br /&gt;
    if queryField == &amp;quot;narrative&amp;quot; then&lt;br /&gt;
        local res = queryCargo(&amp;quot;Translation&amp;quot;, &amp;quot;description&amp;quot;, string.format(&amp;quot;target_id=&#039;%s&#039; AND type=&#039;map_object_narrative&#039; AND language=&#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return res and res.description or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Cas : Traduction spéciale pour Faction (si field était &amp;quot;faction&amp;quot;)&lt;br /&gt;
    if field == &amp;quot;faction&amp;quot; then&lt;br /&gt;
        local data = queryCargo(&amp;quot;MapObject&amp;quot;, &amp;quot;fraction&amp;quot;, &amp;quot;id=&#039;&amp;quot; .. id .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
        if not data then return &amp;quot;&amp;quot; end&lt;br /&gt;
        local res = queryCargo(&amp;quot;Translation&amp;quot;, &amp;quot;name&amp;quot;, string.format(&amp;quot;target_id=&#039;%s&#039; AND type=&#039;faction&#039; AND language=&#039;%s&#039;&amp;quot;, data.fraction, lang))&lt;br /&gt;
        return res and res.name or data.fraction&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 4. Cas : Données techniques (on utilise queryField qui est soit le field normal, soit &amp;quot;fraction&amp;quot;)&lt;br /&gt;
    local tech_fields = &amp;quot;category,goods_value,ai_value,custom_guard_value,view_radius,guard_units,fraction,tier,resource_name,resource_value,source_path&amp;quot;&lt;br /&gt;
    if string.find(tech_fields, queryField) then&lt;br /&gt;
        local res = queryCargo(&amp;quot;MapObject&amp;quot;, queryField, &amp;quot;id=&#039;&amp;quot; .. id .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
        return res and res[queryField] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return &amp;quot;Erreur : Champ &#039;&amp;quot; .. field .. &amp;quot;&#039; invalide.&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22608</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22608"/>
		<updated>2026-06-13T13:35:11Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour interroger Cargo&lt;br /&gt;
local function queryCargo(table, fields, where)&lt;br /&gt;
    local res = mw.ext.cargo.query(table, fields, { where = where, limit = 1 })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fonction pour chercher l&#039;ID, soit par ID direct, soit par nom anglais&lt;br /&gt;
local function resolveId(input)&lt;br /&gt;
    if not input then return nil end&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Est-ce que l&#039;input est déjà un ID existant ?&lt;br /&gt;
    local checkId = queryCargo(&amp;quot;MapObject&amp;quot;, &amp;quot;id&amp;quot;, &amp;quot;id = &#039;&amp;quot; .. input .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
    if checkId then return input end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Sinon, on cherche si c&#039;est un nom anglais&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. input .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1].target_id or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour nettoyer le nom de la page (fallback automatique)&lt;br /&gt;
local function getObjId(pagename)&lt;br /&gt;
    local cleanName = mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    cleanName = mw.text.trim(mw.ustring.gsub(cleanName, &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. cleanName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1].target_id or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.get(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Tentative d&#039;ID (via argument, puis via nom anglais, puis via nom de page)&lt;br /&gt;
    local rawId = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local id = resolveId(rawId) or getObjId(pagename)&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Détection langue et champ&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    local field = args[&amp;quot;field&amp;quot;] or args[2]&lt;br /&gt;
    &lt;br /&gt;
    if not id then return &amp;quot;Erreur : ID ou nom &#039;&amp;quot; .. (rawId or pagename) .. &amp;quot;&#039; introuvable.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- ... (reste du code identique)&lt;br /&gt;
    if field == &amp;quot;name&amp;quot; or field == &amp;quot;description&amp;quot; then&lt;br /&gt;
        local res = queryCargo(&amp;quot;Translation&amp;quot;, field, string.format(&amp;quot;target_id=&#039;%s&#039; AND type=&#039;map_object&#039; AND language=&#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return res and res[field] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if field == &amp;quot;narrative&amp;quot; then&lt;br /&gt;
        local res = queryCargo(&amp;quot;Translation&amp;quot;, &amp;quot;description&amp;quot;, string.format(&amp;quot;target_id=&#039;%s&#039; AND type=&#039;map_object_narrative&#039; AND language=&#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return res and res.description or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local tech_fields = &amp;quot;category,goods_value,ai_value,custom_guard_value,view_radius,guard_units,fraction,tier,resource_name,resource_value,source_path&amp;quot;&lt;br /&gt;
    if string.find(tech_fields, field) then&lt;br /&gt;
        local res = queryCargo(&amp;quot;MapObject&amp;quot;, field, &amp;quot;id=&#039;&amp;quot; .. id .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
        return res and res[field] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return &amp;quot;Erreur : Champ &#039;&amp;quot; .. field .. &amp;quot;&#039; invalide.&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData/doc&amp;diff=22603</id>
		<title>Module:MapObjectsData/doc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData/doc&amp;diff=22603"/>
		<updated>2026-06-12T09:48:18Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
The &#039;&#039;&#039;BuildingsData&#039;&#039;&#039; module provides a centralized interface to retrieve adventure map object data from the &amp;lt;code&amp;gt;MapObject&amp;lt;/code&amp;gt; Cargo table and their localized strings from the &amp;lt;code&amp;gt;Translation&amp;lt;/code&amp;gt; Cargo table. &lt;br /&gt;
&lt;br /&gt;
It is designed to be &amp;quot;page-aware,&amp;quot; meaning it can automatically identify the correct object ID and language based on the current page title (e.g., handling subpages and language suffixes).&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;pre&amp;gt;{{#invoke:BuildingsData|get|id=|field=|language=}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; (optional): The unique object ID (e.g., &amp;lt;code&amp;gt;barracks_unfrozen_6&amp;lt;/code&amp;gt;). If omitted, the module attempts to detect it from the current page title.&lt;br /&gt;
* &amp;lt;code&amp;gt;field&amp;lt;/code&amp;gt; (required): The specific data field to retrieve.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional): The language code (e.g., &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;de&amp;lt;/code&amp;gt;). If omitted, the module attempts to detect it from the page title suffix (e.g., &amp;lt;code&amp;gt;/fr&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Available Fields ==&lt;br /&gt;
=== Localization (from Translation table) ===&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt; (using type &amp;lt;code&amp;gt;map_object&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;narrative&amp;lt;/code&amp;gt; (using type &amp;lt;code&amp;gt;map_object_narrative&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Technical (from MapObject table) ===&lt;br /&gt;
* &amp;lt;code&amp;gt;category&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;goods_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ai_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;custom_guard_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;view_radius&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;guard_units&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fraction&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;resource_name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;resource_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;source_path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
=== Automatic Mode ===&lt;br /&gt;
If you are currently viewing the page &amp;lt;code&amp;gt;Bloated Mansion/fr&amp;lt;/code&amp;gt;, the module automatically identifies the object and the language:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;{{#invoke:BuildingsData|get|field=name}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Result: {{#invoke:BuildingsData|get|id=barracks_unfrozen_6|field=name|language=fr}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;{{#invoke:BuildingsData|get|field=narrative}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Result: {{#invoke:BuildingsData|get|id=barracks_unfrozen_6|field=narrative|language=fr}}&lt;br /&gt;
&lt;br /&gt;
=== Manual Mode ===&lt;br /&gt;
To fetch specific data regardless of the current page:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;{{#invoke:BuildingsData|get|id=barracks_unfrozen_6|field=tier}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Result: {{#invoke:BuildingsData|get|id=barracks_unfrozen_6|field=tier}}&lt;br /&gt;
&lt;br /&gt;
== Technical Notes ==&lt;br /&gt;
* &#039;&#039;&#039;ID Detection:&#039;&#039;&#039; The module cleans the page title by removing subpages (text after &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) and parenthetical text to match the entity name in the database.&lt;br /&gt;
* &#039;&#039;&#039;Fallback:&#039;&#039;&#039; If a &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; request returns no data, the system relies on the object&#039;s &amp;lt;code&amp;gt;category&amp;lt;/code&amp;gt; field for identification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
[[Category:Lua modules]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData/doc&amp;diff=22602</id>
		<title>Module:MapObjectsData/doc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData/doc&amp;diff=22602"/>
		<updated>2026-06-12T09:47:22Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: Created page with &amp;quot;&amp;lt;noinclude&amp;gt; {{Documentation subpage}} &amp;lt;/noinclude&amp;gt;  == Description == The &amp;#039;&amp;#039;&amp;#039;BuildingsData&amp;#039;&amp;#039;&amp;#039; module provides a centralized interface to retrieve adventure map object data from the &amp;lt;code&amp;gt;MapObject&amp;lt;/code&amp;gt; Cargo table and their localized strings from the &amp;lt;code&amp;gt;Translation&amp;lt;/code&amp;gt; Cargo table.   It is designed to be &amp;quot;page-aware,&amp;quot; meaning it can automatically identify the correct object ID and language based on the current page title (e.g., handling subpages and language suff...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation subpage}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
The &#039;&#039;&#039;BuildingsData&#039;&#039;&#039; module provides a centralized interface to retrieve adventure map object data from the &amp;lt;code&amp;gt;MapObject&amp;lt;/code&amp;gt; Cargo table and their localized strings from the &amp;lt;code&amp;gt;Translation&amp;lt;/code&amp;gt; Cargo table. &lt;br /&gt;
&lt;br /&gt;
It is designed to be &amp;quot;page-aware,&amp;quot; meaning it can automatically identify the correct object ID and language based on the current page title (e.g., handling subpages and language suffixes).&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;pre&amp;gt;{{#invoke:BuildingsData|get|id=|field=|language=}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; (optional): The unique object ID (e.g., &amp;lt;code&amp;gt;barracks_unfrozen_6&amp;lt;/code&amp;gt;). If omitted, the module attempts to detect it from the current page title.&lt;br /&gt;
* &amp;lt;code&amp;gt;field&amp;lt;/code&amp;gt; (required): The specific data field to retrieve.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; (optional): The language code (e.g., &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;de&amp;lt;/code&amp;gt;). If omitted, the module attempts to detect it from the page title suffix (e.g., &amp;lt;code&amp;gt;/fr&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Available Fields ==&lt;br /&gt;
=== Localization (from Translation table) ===&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt; (using type &amp;lt;code&amp;gt;map_object&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;narrative&amp;lt;/code&amp;gt; (using type &amp;lt;code&amp;gt;map_object_narrative&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Technical (from MapObject table) ===&lt;br /&gt;
* &amp;lt;code&amp;gt;category&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;goods_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ai_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;custom_guard_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;view_radius&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;guard_units&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fraction&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;resource_name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;resource_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;source_path&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
=== Automatic Mode ===&lt;br /&gt;
If you are currently viewing the page &amp;lt;code&amp;gt;Bloated Mansion/fr&amp;lt;/code&amp;gt;, the module automatically identifies the object and the language:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;{{#invoke:BuildingsData|get|field=name}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Result: {{#invoke:BuildingsData|get|id=barracks_unfrozen_6|field=name|language=fr}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;{{#invoke:BuildingsData|get|field=narrative}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Result: {{#invoke:BuildingsData|get|id=barracks_unfrozen_6|field=narrative|language=fr}}&lt;br /&gt;
&lt;br /&gt;
=== Manual Mode ===&lt;br /&gt;
To fetch specific data regardless of the current page:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;{{#invoke:BuildingsData|get|id=barracks_unfrozen_6|field=tier}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Result: {{#invoke:BuildingsData|get|id=barracks_unfrozen_6|field=tier}}&lt;br /&gt;
&lt;br /&gt;
== Technical Notes ==&lt;br /&gt;
* &#039;&#039;&#039;ID Detection:&#039;&#039;&#039; The module cleans the page title by removing subpages (text after &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) and parenthetical text to match the entity name in the database.&lt;br /&gt;
* &#039;&#039;&#039;Fallback:&#039;&#039;&#039; If a &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; request returns no data, the system relies on the object&#039;s &amp;lt;code&amp;gt;category&amp;lt;/code&amp;gt; field for identification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
[[Category:Lua modules]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:Akeshatest&amp;diff=22601</id>
		<title>Module:Akeshatest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:Akeshatest&amp;diff=22601"/>
		<updated>2026-06-12T09:38:18Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: 76561198256426587 moved page Module:Akeshatest to Module:BuildingsData&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;return require [[Module:BuildingsData]]&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22600</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22600"/>
		<updated>2026-06-12T09:38:18Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: 76561198256426587 moved page Module:Akeshatest to Module:BuildingsData&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour interroger Cargo (Ajoutée ici !)&lt;br /&gt;
local function queryCargo(table, fields, where)&lt;br /&gt;
    local res = mw.ext.cargo.query(table, fields, { where = where, limit = 1 })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour nettoyer le nom de la page et chercher l&#039;ID&lt;br /&gt;
local function getObjId(pagename)&lt;br /&gt;
    local cleanName = mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    cleanName = mw.text.trim(mw.ustring.gsub(cleanName, &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
    &lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. cleanName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1].target_id or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.get(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Tentative d&#039;ID&lt;br /&gt;
    local id = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    if not id then&lt;br /&gt;
        id = getObjId(pagename)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Détection langue et champ&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    local field = args[&amp;quot;field&amp;quot;] or args[2]&lt;br /&gt;
    &lt;br /&gt;
    if not id then return &amp;quot;Erreur : ID introuvable pour la page &#039;&amp;quot; .. pagename .. &amp;quot;&#039;.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Cas : Nom et Description (Translation)&lt;br /&gt;
    if field == &amp;quot;name&amp;quot; or field == &amp;quot;description&amp;quot; then&lt;br /&gt;
        local res = queryCargo(&amp;quot;Translation&amp;quot;, field, string.format(&amp;quot;target_id=&#039;%s&#039; AND type=&#039;map_object&#039; AND language=&#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return res and res[field] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 4. Cas : Narration (Translation)&lt;br /&gt;
    if field == &amp;quot;narrative&amp;quot; then&lt;br /&gt;
        local res = queryCargo(&amp;quot;Translation&amp;quot;, &amp;quot;description&amp;quot;, string.format(&amp;quot;target_id=&#039;%s&#039; AND type=&#039;map_object_narrative&#039; AND language=&#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return res and res.description or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 5. Cas : Données techniques (MapObject)&lt;br /&gt;
    local tech_fields = &amp;quot;category,goods_value,ai_value,custom_guard_value,view_radius,guard_units,fraction,tier,resource_name,resource_value,source_path&amp;quot;&lt;br /&gt;
    if string.find(tech_fields, field) then&lt;br /&gt;
        local res = queryCargo(&amp;quot;MapObject&amp;quot;, field, &amp;quot;id=&#039;&amp;quot; .. id .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
        return res and res[field] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return &amp;quot;Erreur : Champ &#039;&amp;quot; .. field .. &amp;quot;&#039; invalide.&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22599</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22599"/>
		<updated>2026-06-12T09:32:25Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour interroger Cargo (Ajoutée ici !)&lt;br /&gt;
local function queryCargo(table, fields, where)&lt;br /&gt;
    local res = mw.ext.cargo.query(table, fields, { where = where, limit = 1 })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour nettoyer le nom de la page et chercher l&#039;ID&lt;br /&gt;
local function getObjId(pagename)&lt;br /&gt;
    local cleanName = mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    cleanName = mw.text.trim(mw.ustring.gsub(cleanName, &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
    &lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. cleanName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1].target_id or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.get(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Tentative d&#039;ID&lt;br /&gt;
    local id = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    if not id then&lt;br /&gt;
        id = getObjId(pagename)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Détection langue et champ&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    local field = args[&amp;quot;field&amp;quot;] or args[2]&lt;br /&gt;
    &lt;br /&gt;
    if not id then return &amp;quot;Erreur : ID introuvable pour la page &#039;&amp;quot; .. pagename .. &amp;quot;&#039;.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Cas : Nom et Description (Translation)&lt;br /&gt;
    if field == &amp;quot;name&amp;quot; or field == &amp;quot;description&amp;quot; then&lt;br /&gt;
        local res = queryCargo(&amp;quot;Translation&amp;quot;, field, string.format(&amp;quot;target_id=&#039;%s&#039; AND type=&#039;map_object&#039; AND language=&#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return res and res[field] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 4. Cas : Narration (Translation)&lt;br /&gt;
    if field == &amp;quot;narrative&amp;quot; then&lt;br /&gt;
        local res = queryCargo(&amp;quot;Translation&amp;quot;, &amp;quot;description&amp;quot;, string.format(&amp;quot;target_id=&#039;%s&#039; AND type=&#039;map_object_narrative&#039; AND language=&#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return res and res.description or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 5. Cas : Données techniques (MapObject)&lt;br /&gt;
    local tech_fields = &amp;quot;category,goods_value,ai_value,custom_guard_value,view_radius,guard_units,fraction,tier,resource_name,resource_value,source_path&amp;quot;&lt;br /&gt;
    if string.find(tech_fields, field) then&lt;br /&gt;
        local res = queryCargo(&amp;quot;MapObject&amp;quot;, field, &amp;quot;id=&#039;&amp;quot; .. id .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
        return res and res[field] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return &amp;quot;Erreur : Champ &#039;&amp;quot; .. field .. &amp;quot;&#039; invalide.&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22598</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22598"/>
		<updated>2026-06-12T09:31:47Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour nettoyer le nom de la page et chercher l&#039;ID&lt;br /&gt;
local function getObjId(pagename)&lt;br /&gt;
    -- On coupe la chaîne au niveau du &#039;/&#039; s&#039;il existe&lt;br /&gt;
    local cleanName = mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    -- On enlève aussi les parenthèses éventuelles (ex: &amp;quot;Mine (Gold)&amp;quot;)&lt;br /&gt;
    cleanName = mw.text.trim(mw.ustring.gsub(cleanName, &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
    &lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. cleanName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1].target_id or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.get(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Tentative d&#039;ID via argument ou détection automatique&lt;br /&gt;
    local id = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    if not id then&lt;br /&gt;
        id = getObjId(pagename)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Détection de la langue via le suffixe ou l&#039;argument&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    local field = args[&amp;quot;field&amp;quot;] or args[2]&lt;br /&gt;
    &lt;br /&gt;
    if not id then return &amp;quot;Erreur : ID introuvable pour la page &#039;&amp;quot; .. pagename .. &amp;quot;&#039;.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    -- 1. Cas : Nom et Description (Table Translation, type &#039;map_object&#039;)&lt;br /&gt;
    if field == &amp;quot;name&amp;quot; or field == &amp;quot;description&amp;quot; then&lt;br /&gt;
        local res = queryCargo(&amp;quot;Translation&amp;quot;, field, string.format(&amp;quot;target_id=&#039;%s&#039; AND type=&#039;map_object&#039; AND language=&#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return res and res[field] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Cas : Narration (Table Translation, type &#039;map_object_narrative&#039;)&lt;br /&gt;
    if field == &amp;quot;narrative&amp;quot; then&lt;br /&gt;
        local res = queryCargo(&amp;quot;Translation&amp;quot;, &amp;quot;description&amp;quot;, string.format(&amp;quot;target_id=&#039;%s&#039; AND type=&#039;map_object_narrative&#039; AND language=&#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return res and res.description or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Cas : Données techniques (Table MapObject)&lt;br /&gt;
    -- On autorise tous les champs définis dans ton schéma&lt;br /&gt;
    local tech_fields = &amp;quot;category,goods_value,ai_value,custom_guard_value,view_radius,guard_units,fraction,tier,resource_name,resource_value,source_path&amp;quot;&lt;br /&gt;
    if string.find(tech_fields, field) then&lt;br /&gt;
        local res = queryCargo(&amp;quot;MapObject&amp;quot;, field, &amp;quot;id=&#039;&amp;quot; .. id .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
        return res and res[field] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return &amp;quot;Erreur : Champ &#039;&amp;quot; .. field .. &amp;quot;&#039; invalide.&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22597</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22597"/>
		<updated>2026-06-12T09:29:29Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire interne&lt;br /&gt;
local function queryCargo(table, fields, where)&lt;br /&gt;
    local res = mw.ext.cargo.query(table, fields, { where = where, limit = 1 })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Remplace cette fonction getObjId par celle-ci dans ton script :&lt;br /&gt;
&lt;br /&gt;
local function getObjId(pagename, lang)&lt;br /&gt;
    -- On cherche dans Translation l&#039;ID qui correspond au nom de la page (en anglais)&lt;br /&gt;
    -- Note: Pour que cela fonctionne, pagename doit correspondre au &#039;name&#039; dans la table&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. pagename .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1].target_id or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.get(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Détection automatique de l&#039;ID&lt;br /&gt;
    -- Si &#039;id&#039; n&#039;est pas fourni, on utilise le nom de la page pour le chercher&lt;br /&gt;
    local id = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    if not id then&lt;br /&gt;
        id = getObjId(pagename, &amp;quot;en&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local field = args[&amp;quot;field&amp;quot;] or args[2]&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    if not id then return &amp;quot;Erreur : ID introuvable (nom de page &#039;&amp;quot; .. pagename .. &amp;quot;&#039; inconnu).&amp;quot; end&lt;br /&gt;
    -- ... (reste du script inchangé)&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Cas : Nom et Description (Table Translation, type &#039;map_object&#039;)&lt;br /&gt;
    if field == &amp;quot;name&amp;quot; or field == &amp;quot;description&amp;quot; then&lt;br /&gt;
        local res = queryCargo(&amp;quot;Translation&amp;quot;, field, string.format(&amp;quot;target_id=&#039;%s&#039; AND type=&#039;map_object&#039; AND language=&#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return res and res[field] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Cas : Narration (Table Translation, type &#039;map_object_narrative&#039;)&lt;br /&gt;
    if field == &amp;quot;narrative&amp;quot; then&lt;br /&gt;
        local res = queryCargo(&amp;quot;Translation&amp;quot;, &amp;quot;description&amp;quot;, string.format(&amp;quot;target_id=&#039;%s&#039; AND type=&#039;map_object_narrative&#039; AND language=&#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return res and res.description or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Cas : Données techniques (Table MapObject)&lt;br /&gt;
    -- On autorise tous les champs définis dans ton schéma&lt;br /&gt;
    local tech_fields = &amp;quot;category,goods_value,ai_value,custom_guard_value,view_radius,guard_units,fraction,tier,resource_name,resource_value,source_path&amp;quot;&lt;br /&gt;
    if string.find(tech_fields, field) then&lt;br /&gt;
        local res = queryCargo(&amp;quot;MapObject&amp;quot;, field, &amp;quot;id=&#039;&amp;quot; .. id .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
        return res and res[field] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return &amp;quot;Erreur : Champ &#039;&amp;quot; .. field .. &amp;quot;&#039; invalide.&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22596</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22596"/>
		<updated>2026-06-12T09:21:25Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire interne&lt;br /&gt;
local function queryCargo(table, fields, where)&lt;br /&gt;
    local res = mw.ext.cargo.query(table, fields, { where = where, limit = 1 })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.get(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local id = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local field = args[&amp;quot;field&amp;quot;] or args[2]&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- Si pas d&#039;ID, on tente de le deviner via le nom de la page (si la page est &#039;Bloated Mansion&#039;)&lt;br /&gt;
    if not id then&lt;br /&gt;
        local name_res = queryCargo(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, &amp;quot;type=&#039;map_object&#039; AND language=&#039;&amp;quot; .. lang .. &amp;quot;&#039; AND name=&#039;&amp;quot; .. pagename .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
        if name_res then id = name_res.target_id end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not id then return &amp;quot;Erreur : ID introuvable.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Cas : Nom et Description (Table Translation, type &#039;map_object&#039;)&lt;br /&gt;
    if field == &amp;quot;name&amp;quot; or field == &amp;quot;description&amp;quot; then&lt;br /&gt;
        local res = queryCargo(&amp;quot;Translation&amp;quot;, field, string.format(&amp;quot;target_id=&#039;%s&#039; AND type=&#039;map_object&#039; AND language=&#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return res and res[field] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Cas : Narration (Table Translation, type &#039;map_object_narrative&#039;)&lt;br /&gt;
    if field == &amp;quot;narrative&amp;quot; then&lt;br /&gt;
        local res = queryCargo(&amp;quot;Translation&amp;quot;, &amp;quot;description&amp;quot;, string.format(&amp;quot;target_id=&#039;%s&#039; AND type=&#039;map_object_narrative&#039; AND language=&#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return res and res.description or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Cas : Données techniques (Table MapObject)&lt;br /&gt;
    -- On autorise tous les champs définis dans ton schéma&lt;br /&gt;
    local tech_fields = &amp;quot;category,goods_value,ai_value,custom_guard_value,view_radius,guard_units,fraction,tier,resource_name,resource_value,source_path&amp;quot;&lt;br /&gt;
    if string.find(tech_fields, field) then&lt;br /&gt;
        local res = queryCargo(&amp;quot;MapObject&amp;quot;, field, &amp;quot;id=&#039;&amp;quot; .. id .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
        return res and res[field] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return &amp;quot;Erreur : Champ &#039;&amp;quot; .. field .. &amp;quot;&#039; invalide.&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22595</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22595"/>
		<updated>2026-06-12T09:20:17Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.test(frame)&lt;br /&gt;
    local id = &amp;quot;barracks_unfrozen_6&amp;quot;&lt;br /&gt;
    -- Requête ultra simple pour tester la table Translation&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;name&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;target_id = &#039;&amp;quot; .. id .. &amp;quot;&#039; AND type = &#039;map_object&#039; AND language = &#039;en&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if not res then return &amp;quot;Erreur : La fonction cargo.query a échoué (problème de connexion/table).&amp;quot; end&lt;br /&gt;
    if #res == 0 then return &amp;quot;Erreur : La requête a retourné 0 résultat. L&#039;objet ou la traduction est introuvable.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    return &amp;quot;Succès ! Le nom trouvé est : &amp;quot; .. (res[1].name or &amp;quot;Champ &#039;name&#039; vide&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22594</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22594"/>
		<updated>2026-06-12T09:19:07Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour interroger Cargo&lt;br /&gt;
local function getCargo(table, fields, where)&lt;br /&gt;
    local res = mw.ext.cargo.query(table, fields, { where = where, limit = 1 })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.get(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    -- Détection ID auto (titre de la page) ou manuel&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    local id = args[&amp;quot;id&amp;quot;] or args[1] or getCargo(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. pagename .. &amp;quot;&#039;&amp;quot;) and pagename or nil&lt;br /&gt;
    local field = args[&amp;quot;field&amp;quot;] or args[2]&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    if not id then return &amp;quot;Erreur : ID introuvable.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Cas : Nom (avec repli sur la catégorie si introuvable)&lt;br /&gt;
    if field == &amp;quot;name&amp;quot; then&lt;br /&gt;
        local data = getCargo(&amp;quot;Translation&amp;quot;, &amp;quot;name&amp;quot;, string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;map_object&#039; AND language = &#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        if data and data.name then return data.name end&lt;br /&gt;
        -- Fallback : si name introuvable, on prend la catégorie&lt;br /&gt;
        local cat = getCargo(&amp;quot;MapObject&amp;quot;, &amp;quot;category&amp;quot;, &amp;quot;id = &#039;&amp;quot; .. id .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
        return cat and cat.category or &amp;quot;Nom inconnu&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Cas : Description standard&lt;br /&gt;
    if field == &amp;quot;description&amp;quot; then&lt;br /&gt;
        local data = getCargo(&amp;quot;Translation&amp;quot;, &amp;quot;description&amp;quot;, string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;map_object&#039; AND language = &#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return data and data.description or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Cas : Narrative&lt;br /&gt;
    if field == &amp;quot;narrative&amp;quot; then&lt;br /&gt;
        local data = getCargo(&amp;quot;Translation&amp;quot;, &amp;quot;description&amp;quot;, string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;map_object_narrative&#039; AND language = &#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return data and data.description or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 4. Cas : Données techniques (MapObject)&lt;br /&gt;
    local tech_fields = &amp;quot;category,goods_value,ai_value,custom_guard_value,view_radius,guard_units,fraction,tier,resource_name,resource_value,source_path&amp;quot;&lt;br /&gt;
    if string.find(tech_fields, field) then&lt;br /&gt;
        local data = getCargo(&amp;quot;MapObject&amp;quot;, field, &amp;quot;id = &#039;&amp;quot; .. id .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
        return data and data[field] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return &amp;quot;Erreur : Champ &#039;&amp;quot; .. field .. &amp;quot;&#039; invalide.&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22593</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22593"/>
		<updated>2026-06-12T09:15:36Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour trouver l&#039;ID à partir du titre de la page&lt;br /&gt;
local function getObjId(pagename)&lt;br /&gt;
    local baseName = mw.text.trim(mw.ustring.gsub(mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;), &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. baseName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1].target_id or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour interroger Cargo avec gestion de type&lt;br /&gt;
local function getTrans(target_id, type, lang, field)&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, field, {&lt;br /&gt;
        where = string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;%s&#039; AND language = &#039;%s&#039;&amp;quot;, target_id, type, lang),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1][field] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.get(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local id = args[&amp;quot;id&amp;quot;] or args[1] or getObjId(mw.title.getCurrentTitle().text)&lt;br /&gt;
    local field = args[&amp;quot;field&amp;quot;] or args[2]&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    if not id then return &amp;quot;Erreur : ID introuvable.&amp;quot; end&lt;br /&gt;
    if not field then return &amp;quot;Erreur : Paramètre &#039;field&#039; requis.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Données techniques (Table MapObject)&lt;br /&gt;
    local tech_fields = &amp;quot;category,goods_value,ai_value,custom_guard_value,view_radius,guard_units,fraction,tier,resource_name,resource_value,source_path&amp;quot;&lt;br /&gt;
    if string.find(tech_fields, field) then&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;MapObject&amp;quot;, field, { where = &amp;quot;id = &#039;&amp;quot; .. id .. &amp;quot;&#039;&amp;quot;, limit = 1 })&lt;br /&gt;
        return (res and #res &amp;gt; 0) and res[1][field] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Traductions (Table Translation)&lt;br /&gt;
    -- Le &#039;name&#039; et &#039;description&#039; sont dans le type &#039;map_object&#039;&lt;br /&gt;
    if field == &amp;quot;name&amp;quot; or field == &amp;quot;description&amp;quot; then&lt;br /&gt;
        return getTrans(id, &amp;quot;map_object&amp;quot;, lang, field) or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- La &#039;narrative&#039; est dans le type &#039;map_object_narrative&#039; (colonne &#039;description&#039;)&lt;br /&gt;
    if field == &amp;quot;narrative&amp;quot; then&lt;br /&gt;
        return getTrans(id, &amp;quot;map_object_narrative&amp;quot;, lang, &amp;quot;description&amp;quot;) or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return &amp;quot;Champ &#039;&amp;quot; .. field .. &amp;quot;&#039; inconnu.&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22592</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22592"/>
		<updated>2026-06-12T09:13:26Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour trouver l&#039;ID à partir du titre de la page&lt;br /&gt;
local function getObjId(pagename)&lt;br /&gt;
    local baseName = mw.text.trim(mw.ustring.gsub(mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;), &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. baseName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1].target_id or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour interroger Cargo&lt;br /&gt;
local function getCargo(table, fields, where)&lt;br /&gt;
    local res = mw.ext.cargo.query(table, fields, { where = where, limit = 1 })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.get(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    -- Priorité à l&#039;ID passé en argument, sinon détection auto&lt;br /&gt;
    local id = args[&amp;quot;id&amp;quot;] or args[1] or getObjId(mw.title.getCurrentTitle().text)&lt;br /&gt;
    local field = args[&amp;quot;field&amp;quot;] or args[2]&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    if not id then return &amp;quot;Erreur : Impossible de déterminer l&#039;ID de l&#039;objet.&amp;quot; end&lt;br /&gt;
    if not field then return &amp;quot;Erreur : Paramètre &#039;field&#039; requis.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Données techniques (MapObject)&lt;br /&gt;
    local tech_fields = &amp;quot;category,goods_value,ai_value,custom_guard_value,view_radius,guard_units,fraction,tier,resource_name,resource_value,source_path&amp;quot;&lt;br /&gt;
    if string.find(tech_fields, field) then&lt;br /&gt;
        local data = getCargo(&amp;quot;MapObject&amp;quot;, field, &amp;quot;id = &#039;&amp;quot; .. id .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
        return data and data[field] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Traductions standard (Nom, Description)&lt;br /&gt;
    if field == &amp;quot;name&amp;quot; or field == &amp;quot;description&amp;quot; then&lt;br /&gt;
        local data = getCargo(&amp;quot;Translation&amp;quot;, field, string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;map_object&#039; AND language = &#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return data and data[field] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Narration&lt;br /&gt;
    if field == &amp;quot;narrative&amp;quot; then&lt;br /&gt;
        local data = getCargo(&amp;quot;Translation&amp;quot;, &amp;quot;description&amp;quot;, string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;map_object_narrative&#039; AND language = &#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return data and data.description or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return &amp;quot;Champ &#039;&amp;quot; .. field .. &amp;quot;&#039; non trouvé.&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22591</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22591"/>
		<updated>2026-06-12T09:11:28Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour interroger Cargo&lt;br /&gt;
local function getCargo(table, fields, where, limit)&lt;br /&gt;
    local res = mw.ext.cargo.query(table, fields, { where = where, limit = limit or 1 })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.get(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local id = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local field = args[&amp;quot;field&amp;quot;] or args[2]&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    if not id or not field then return &amp;quot;Erreur : Paramètres &#039;id&#039; et &#039;field&#039; requis.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Cas : Demande une donnée technique (colonnes de la table MapObject)&lt;br /&gt;
    local tech_fields = &amp;quot;category,goods_value,ai_value,custom_guard_value,view_radius,guard_units,fraction,tier,resource_name,resource_value,source_path&amp;quot;&lt;br /&gt;
    if string.find(tech_fields, field) then&lt;br /&gt;
        local data = getCargo(&amp;quot;MapObject&amp;quot;, field, &amp;quot;id = &#039;&amp;quot; .. id .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
        return data and data[field] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Cas : Demande une traduction (Nom, Description, Narrative)&lt;br /&gt;
    if field == &amp;quot;name&amp;quot; or field == &amp;quot;description&amp;quot; then&lt;br /&gt;
        local data = getCargo(&amp;quot;Translation&amp;quot;, field, string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;map_object&#039; AND language = &#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return data and data[field] or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if field == &amp;quot;narrative&amp;quot; then&lt;br /&gt;
        local data = getCargo(&amp;quot;Translation&amp;quot;, &amp;quot;description&amp;quot;, string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;map_object_narrative&#039; AND language = &#039;%s&#039;&amp;quot;, id, lang))&lt;br /&gt;
        return data and data.description or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return &amp;quot;Erreur : Champ &#039;&amp;quot; .. field .. &amp;quot;&#039; inconnu.&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Temple&amp;diff=22590</id>
		<title>Temple</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Temple&amp;diff=22590"/>
		<updated>2026-06-12T09:01:53Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{loc}}&lt;br /&gt;
[[File:FactionTempleCropped.png|none]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
==Army==&lt;br /&gt;
Temple is a good starting faction with a straightforward approach to combat. With 3 ranged creatures in their faction and 4 melee creatures, they have a strong, balanced army with passive and activated abilities that often serve to complement other units in battle. Their upgrades tend to either make them more effective individually or allow them to better support unit stacks near them.&lt;br /&gt;
&lt;br /&gt;
[[Swordsmen]], for example, are tier-I units that start out with a passive trait that allows them to take -30% damage from ranged attacks. When upgraded, they can either opt to strike twice in combat as a [[Guard Captain]], or become a [[Sun&#039;s Aegis]] and share their 30% ranged damage reduction with an adjacent troops.&lt;br /&gt;
&lt;br /&gt;
[[Griffins]] are a tier-III unit that can retaliate twice per combat round. When upgraded, they can have unlimited counterattacks as a [[Temple Griffin]], or counterattack any adjacent enemy unit stack that attacks one of their allies as a [[Guardian Griffin]].&lt;br /&gt;
&lt;br /&gt;
Temple units synergize quite well with Daylight magic, a spell school that concentrates on beneficial spells that buff allies and remove negative effects from them.&lt;br /&gt;
&lt;br /&gt;
==Heroes==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Early Town Priorities==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Law Priorities==&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22589</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22589"/>
		<updated>2026-06-12T08:59:36Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction pour récupérer les traductions&lt;br /&gt;
local function getTrans(target_id, type, lang, field)&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, field, {&lt;br /&gt;
        where = string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;%s&#039; AND language = &#039;%s&#039;&amp;quot;, target_id, type, lang),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1][field] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.display(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local input = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local obj_id = input&lt;br /&gt;
    if not obj_id then&lt;br /&gt;
        local baseName = mw.text.trim(mw.ustring.gsub(mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;), &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
        -- On cherche l&#039;ID via le nom dans la table Translation (type &#039;map_object&#039;)&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. baseName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then obj_id = res[1].target_id end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not obj_id then return &amp;quot;Erreur : Objet introuvable.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- Requête sur MapObject&lt;br /&gt;
    local fields = &amp;quot;id,category,name_sid,desc_sid,narrative_desc_sid,goods_value,ai_value,custom_guard_value,view_radius,guard_units,fraction,tier,resource_name,resource_value,source_path&amp;quot;&lt;br /&gt;
    local data = mw.ext.cargo.query(&amp;quot;MapObject&amp;quot;, fields, {&lt;br /&gt;
        where = &amp;quot;id = &#039;&amp;quot; .. obj_id .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if not data or #data == 0 then return &amp;quot;Erreur : Aucune donnée trouvée pour &amp;quot; .. obj_id end&lt;br /&gt;
    local obj = data[1]&lt;br /&gt;
    &lt;br /&gt;
    local result = {}&lt;br /&gt;
    -- Traductions standard (type &#039;map_object&#039;)&lt;br /&gt;
    table.insert(result, &amp;quot;Nom = &amp;quot; .. (getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;name&amp;quot;) or &amp;quot;N/A&amp;quot;))&lt;br /&gt;
    table.insert(result, &amp;quot;Description = &amp;quot; .. (getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;description&amp;quot;) or &amp;quot;N/A&amp;quot;))&lt;br /&gt;
    &lt;br /&gt;
    -- Narration spécifique (type &#039;map_object_narrative&#039;)&lt;br /&gt;
    -- La doc indique que le champ traduit s&#039;appelle &#039;description&#039; dans cette table&lt;br /&gt;
    table.insert(result, &amp;quot;Narrative = &amp;quot; .. (getTrans(obj_id, &amp;quot;map_object_narrative&amp;quot;, lang, &amp;quot;description&amp;quot;) or &amp;quot;N/A&amp;quot;))&lt;br /&gt;
    &lt;br /&gt;
    -- Boucle sur les données techniques de MapObject&lt;br /&gt;
    for key, value in pairs(obj) do&lt;br /&gt;
        if key ~= &amp;quot;id&amp;quot; and key ~= &amp;quot;name_sid&amp;quot; and key ~= &amp;quot;desc_sid&amp;quot; and key ~= &amp;quot;narrative_desc_sid&amp;quot; then&lt;br /&gt;
            table.insert(result, key .. &amp;quot; = &amp;quot; .. (value or &amp;quot;N/A&amp;quot;))&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(result, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22588</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22588"/>
		<updated>2026-06-12T08:46:56Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function getTrans(target_id, type, lang, field)&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, field, {&lt;br /&gt;
        where = string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;%s&#039; AND language = &#039;%s&#039;&amp;quot;, target_id, type, lang),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1][field] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.display(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local input = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local obj_id = input&lt;br /&gt;
    if not obj_id then&lt;br /&gt;
        local baseName = mw.text.trim(mw.ustring.gsub(mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;), &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. baseName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then obj_id = res[1].target_id end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not obj_id then return &amp;quot;Erreur : Objet introuvable.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    local fields = &amp;quot;id,category,name_sid,desc_sid,narrative_desc_sid,goods_value,ai_value,custom_guard_value,view_radius,guard_units,fraction,tier,source_path&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local data = mw.ext.cargo.query(&amp;quot;MapObject&amp;quot;, fields, {&lt;br /&gt;
        where = &amp;quot;id = &#039;&amp;quot; .. obj_id .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if not data or #data == 0 then return &amp;quot;Erreur : Aucune donnée technique trouvée pour &amp;quot; .. obj_id end&lt;br /&gt;
    local obj = data[1]&lt;br /&gt;
    &lt;br /&gt;
    local result = {}&lt;br /&gt;
    table.insert(result, &amp;quot;Nom = &amp;quot; .. (getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;name&amp;quot;) or &amp;quot;N/A&amp;quot;))&lt;br /&gt;
    table.insert(result, &amp;quot;Description = &amp;quot; .. (getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;description&amp;quot;) or &amp;quot;N/A&amp;quot;))&lt;br /&gt;
    -- Récupération du texte narratif&lt;br /&gt;
    table.insert(result, &amp;quot;Narrative = &amp;quot; .. (getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;narrative_description&amp;quot;) or &amp;quot;N/A&amp;quot;))&lt;br /&gt;
    &lt;br /&gt;
    for key, value in pairs(obj) do&lt;br /&gt;
        if key ~= &amp;quot;id&amp;quot; then&lt;br /&gt;
            table.insert(result, key .. &amp;quot; = &amp;quot; .. (value or &amp;quot;N/A&amp;quot;))&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(result, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22587</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22587"/>
		<updated>2026-06-12T08:42:37Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function getTrans(target_id, type, lang, field)&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, field, {&lt;br /&gt;
        where = string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;%s&#039; AND language = &#039;%s&#039;&amp;quot;, target_id, type, lang),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1][field] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.display(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local input = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local obj_id = input&lt;br /&gt;
    if not obj_id then&lt;br /&gt;
        local baseName = mw.text.trim(mw.ustring.gsub(mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;), &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. baseName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then obj_id = res[1].target_id end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not obj_id then return &amp;quot;Erreur : Objet introuvable.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- Liste explicite des champs pour éviter l&#039;erreur sur le &amp;quot;*&amp;quot;&lt;br /&gt;
    local fields = &amp;quot;id,category,name_sid,desc_sid,narrative_desc_sid,goods_value,ai_value,custom_guard_value,view_radius,guard_units,fraction,tier,source_path&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local data = mw.ext.cargo.query(&amp;quot;MapObject&amp;quot;, fields, {&lt;br /&gt;
        where = &amp;quot;id = &#039;&amp;quot; .. obj_id .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if not data or #data == 0 then return &amp;quot;Erreur : Aucune donnée technique trouvée pour &amp;quot; .. obj_id end&lt;br /&gt;
    local obj = data[1]&lt;br /&gt;
    &lt;br /&gt;
    local result = {}&lt;br /&gt;
    table.insert(result, &amp;quot;Nom = &amp;quot; .. (getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;name&amp;quot;) or &amp;quot;N/A&amp;quot;))&lt;br /&gt;
    table.insert(result, &amp;quot;Description = &amp;quot; .. (getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;description&amp;quot;) or &amp;quot;N/A&amp;quot;))&lt;br /&gt;
    &lt;br /&gt;
    -- Boucle sécurisée sur les champs récupérés&lt;br /&gt;
    for key, value in pairs(obj) do&lt;br /&gt;
        if key ~= &amp;quot;id&amp;quot; then&lt;br /&gt;
            table.insert(result, key .. &amp;quot; = &amp;quot; .. (value or &amp;quot;N/A&amp;quot;))&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(result, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22586</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22586"/>
		<updated>2026-06-12T08:41:59Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction pour récupérer les traductions&lt;br /&gt;
local function getTrans(target_id, type, lang, field)&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, field, {&lt;br /&gt;
        where = string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;%s&#039; AND language = &#039;%s&#039;&amp;quot;, target_id, type, lang),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1][field] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.display(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local input = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Identification&lt;br /&gt;
    local obj_id = input&lt;br /&gt;
    if not obj_id then&lt;br /&gt;
        local baseName = mw.text.trim(mw.ustring.gsub(mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;), &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. baseName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then obj_id = res[1].target_id end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not obj_id then return &amp;quot;Erreur : Objet introuvable.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Récupération dynamique de TOUS les champs de MapObject&lt;br /&gt;
    -- On demande * (tous les champs) car on sait maintenant que ça fonctionne&lt;br /&gt;
    local data = mw.ext.cargo.query(&amp;quot;MapObject&amp;quot;, &amp;quot;*&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;id = &#039;&amp;quot; .. obj_id .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if not data or #data == 0 then return &amp;quot;Erreur : Aucune donnée technique trouvée.&amp;quot; end&lt;br /&gt;
    local obj = data[1]&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Construction de la liste&lt;br /&gt;
    local result = {}&lt;br /&gt;
    &lt;br /&gt;
    -- Ajout manuel des traductions&lt;br /&gt;
    table.insert(result, &amp;quot;Nom = &amp;quot; .. (getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;name&amp;quot;) or &amp;quot;N/A&amp;quot;))&lt;br /&gt;
    table.insert(result, &amp;quot;Description = &amp;quot; .. (getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;description&amp;quot;) or &amp;quot;N/A&amp;quot;))&lt;br /&gt;
    &lt;br /&gt;
    -- Ajout dynamique des données de MapObject&lt;br /&gt;
    for key, value in pairs(obj) do&lt;br /&gt;
        -- On évite de dupliquer l&#039;ID si déjà présent, sinon on ajoute tout&lt;br /&gt;
        if key ~= &amp;quot;id&amp;quot; then&lt;br /&gt;
            table.insert(result, key .. &amp;quot; = &amp;quot; .. (value or &amp;quot;N/A&amp;quot;))&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(result, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22585</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22585"/>
		<updated>2026-06-12T08:38:44Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction pour récupérer les traductions&lt;br /&gt;
local function getTrans(target_id, type, lang, field)&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, field, {&lt;br /&gt;
        where = string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;%s&#039; AND language = &#039;%s&#039;&amp;quot;, target_id, type, lang),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1][field] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.display(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local input = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Identification (Nom de page ou paramètre)&lt;br /&gt;
    local obj_id = input&lt;br /&gt;
    if not obj_id then&lt;br /&gt;
        local baseName = mw.text.trim(mw.ustring.gsub(mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;), &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. baseName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then obj_id = res[1].target_id end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not obj_id then return &amp;quot;Erreur : Objet introuvable.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Récupération des données (MapObject)&lt;br /&gt;
    local data = mw.ext.cargo.query(&amp;quot;MapObject&amp;quot;, &amp;quot;goods_value, guard_units, fraction, tier&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;id = &#039;&amp;quot; .. obj_id .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if not data or #data == 0 then return &amp;quot;Erreur : Données introuvables pour l&#039;ID &amp;quot; .. obj_id end&lt;br /&gt;
    local obj = data[1]&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Récupération des traductions&lt;br /&gt;
    local name = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;name&amp;quot;) or &amp;quot;N/A&amp;quot;&lt;br /&gt;
    local desc = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;description&amp;quot;) or &amp;quot;N/A&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- 4. Affichage simple&lt;br /&gt;
    local result = {}&lt;br /&gt;
    table.insert(result, &amp;quot;Nom = &amp;quot; .. name)&lt;br /&gt;
    table.insert(result, &amp;quot;Description = &amp;quot; .. desc)&lt;br /&gt;
    table.insert(result, &amp;quot;Tier = &amp;quot; .. (obj.tier or &amp;quot;N/A&amp;quot;))&lt;br /&gt;
    table.insert(result, &amp;quot;Fraction = &amp;quot; .. (obj.fraction or &amp;quot;N/A&amp;quot;))&lt;br /&gt;
    table.insert(result, &amp;quot;Guard Units = &amp;quot; .. (obj.guard_units or &amp;quot;N/A&amp;quot;))&lt;br /&gt;
    table.insert(result, &amp;quot;Value = &amp;quot; .. (obj.goods_value or &amp;quot;N/A&amp;quot;))&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(result, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22584</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22584"/>
		<updated>2026-06-12T07:06:47Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour récupérer les traductions&lt;br /&gt;
local function getTrans(target_id, type, lang, field)&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, field, {&lt;br /&gt;
        where = string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;%s&#039; AND language = &#039;%s&#039;&amp;quot;, target_id, type, lang),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1][field] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.display(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local input = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Identification de l&#039;objet (via nom ou ID)&lt;br /&gt;
    local obj_id = nil&lt;br /&gt;
    if input then&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. input .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then obj_id = res[1].target_id else obj_id = input end&lt;br /&gt;
    else&lt;br /&gt;
        local baseName = mw.text.trim(mw.ustring.gsub(mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;), &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. baseName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then obj_id = res[1].target_id end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not obj_id then return &amp;quot;Objet introuvable.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Requête avec les champs exacts identifiés&lt;br /&gt;
    local data = mw.ext.cargo.query(&amp;quot;MapObject&amp;quot;, &amp;quot;goods_value, guard_units, fraction, category, id, tier&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;id = &#039;&amp;quot; .. obj_id .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if not data or #data == 0 then return &amp;quot;Données techniques manquantes pour : &amp;quot; .. obj_id end&lt;br /&gt;
    local obj = data[1]&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Construction&lt;br /&gt;
    local name = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;name&amp;quot;) or &amp;quot;Nom manquant&amp;quot;&lt;br /&gt;
    local desc = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;description&amp;quot;) or &amp;quot;Description manquante&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local html = {&#039;{| class=&amp;quot;wikitable&amp;quot;&#039;}&lt;br /&gt;
    table.insert(html, &#039;! colspan=2 | &#039; .. name)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Description\&#039;\&#039;\&#039; || &#039; .. desc)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Tier\&#039;\&#039;\&#039; || &#039; .. (obj.tier or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Fraction\&#039;\&#039;\&#039; || &#039; .. (obj.fraction or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Guard Units\&#039;\&#039;\&#039; || &#039; .. (obj.guard_units or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Value\&#039;\&#039;\&#039; || &#039; .. (obj.goods_value or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &amp;quot;|}&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(html, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22583</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22583"/>
		<updated>2026-06-12T07:06:04Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.display(frame)&lt;br /&gt;
    local obj_id = &amp;quot;barracks_unfrozen_6&amp;quot; -- On force l&#039;ID pour tester si ça marche&lt;br /&gt;
    &lt;br /&gt;
    -- On interroge Cargo sans filtrer les champs (en demandant tout)&lt;br /&gt;
    -- Si ça ne marche pas, on essaiera avec des noms de colonnes différents&lt;br /&gt;
    local data = mw.ext.cargo.query(&amp;quot;MapObject&amp;quot;, &amp;quot;id, category, tier, fraction, guard_units, goods_value&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;id = &#039;&amp;quot; .. obj_id .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if not data or #data == 0 then&lt;br /&gt;
        return &amp;quot;Erreur : Aucune donnée trouvée pour l&#039;ID &amp;quot; .. obj_id .. &amp;quot;. La table MapObject est peut-être vide ou l&#039;ID est incorrect.&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- On affiche le contenu brut reçu de Cargo pour voir la structure&lt;br /&gt;
    local output = &amp;quot;Contenu reçu : &amp;lt;pre&amp;gt;&amp;quot;&lt;br /&gt;
    for key, value in pairs(data[1]) do&lt;br /&gt;
        output = output .. key .. &amp;quot; = &amp;quot; .. tostring(value) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    output = output .. &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    return output&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22582</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22582"/>
		<updated>2026-06-12T07:04:16Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour récupérer les traductions&lt;br /&gt;
local function getTrans(target_id, type, lang, field)&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, field, {&lt;br /&gt;
        where = string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;%s&#039; AND language = &#039;%s&#039;&amp;quot;, target_id, type, lang),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1][field] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.display(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local input = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Identification de l&#039;objet&lt;br /&gt;
    local obj_id = nil&lt;br /&gt;
    if input then&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. input .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then obj_id = res[1].target_id else obj_id = input end&lt;br /&gt;
    else&lt;br /&gt;
        local baseName = mw.text.trim(mw.ustring.gsub(mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;), &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. baseName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then obj_id = res[1].target_id end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not obj_id then return &amp;quot;ID introuvable.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Requête avec les noms exacts fournis dans ton template&lt;br /&gt;
    local fields = &amp;quot;id,category,goods_value,guard_units,fraction,tier&amp;quot;&lt;br /&gt;
    local data = mw.ext.cargo.query(&amp;quot;MapObject&amp;quot;, fields, {&lt;br /&gt;
        where = string.format(&amp;quot;id = &#039;%s&#039;&amp;quot;, obj_id),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if not data or #data == 0 then return &amp;quot;Données introuvables pour : &amp;quot; .. obj_id end&lt;br /&gt;
    local obj = data[1]&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Construction du tableau&lt;br /&gt;
    local name = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;name&amp;quot;) or &amp;quot;Nom manquant&amp;quot;&lt;br /&gt;
    local desc = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;description&amp;quot;) or &amp;quot;Description manquante&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local html = {&#039;{| class=&amp;quot;wikitable&amp;quot;&#039;}&lt;br /&gt;
    table.insert(html, &#039;! colspan=2 | &#039; .. name)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Description\&#039;\&#039;\&#039; || &#039; .. desc)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Tier\&#039;\&#039;\&#039; || &#039; .. (obj.tier or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Fraction\&#039;\&#039;\&#039; || &#039; .. (obj.fraction or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Guard Units\&#039;\&#039;\&#039; || &#039; .. (obj.guard_units or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Value\&#039;\&#039;\&#039; || &#039; .. (obj.goods_value or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &amp;quot;|}&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(html, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22581</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22581"/>
		<updated>2026-06-12T07:02:28Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function getTrans(target_id, type, lang, field)&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, field, {&lt;br /&gt;
        where = string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;%s&#039; AND language = &#039;%s&#039;&amp;quot;, target_id, type, lang),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1][field] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.display(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local input = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Identification&lt;br /&gt;
    local obj_id = nil&lt;br /&gt;
    if input then&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. input .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then obj_id = res[1].target_id else obj_id = input end&lt;br /&gt;
    else&lt;br /&gt;
        local baseName = mw.text.trim(mw.ustring.gsub(mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;), &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. baseName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then obj_id = res[1].target_id end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not obj_id then return &#039;&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;Erreur : Objet introuvable pour ce titre de page.&amp;lt;/span&amp;gt;&#039; end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Récupération&lt;br /&gt;
    local fields = &amp;quot;id,category,tier,fraction,guard_units,goods_value&amp;quot;&lt;br /&gt;
    local data = mw.ext.cargo.query(&amp;quot;MapObject&amp;quot;, fields, {&lt;br /&gt;
        where = string.format(&amp;quot;id = &#039;%s&#039;&amp;quot;, obj_id),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if not data or #data == 0 then &lt;br /&gt;
        return &#039;&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;Erreur : Pas de ligne dans MapObject pour l\&#039;ID : &#039; .. obj_id .. &#039;&amp;lt;/span&amp;gt;&#039; &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local obj = data[1]&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Fonction locale pour valider les données&lt;br /&gt;
    local function val(field_value, label)&lt;br /&gt;
        if field_value == nil or field_value == &amp;quot;&amp;quot; then&lt;br /&gt;
            return &#039;&amp;lt;span style=&amp;quot;color:orange;&amp;quot;&amp;gt;&#039; .. label .. &#039; manquant&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
        end&lt;br /&gt;
        return field_value&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Construction&lt;br /&gt;
    local name = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;name&amp;quot;) or &#039;&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;Nom manquant&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
    local desc = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;description&amp;quot;) or &#039;&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;Description manquante&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
    &lt;br /&gt;
    local html = {&#039;{| class=&amp;quot;wikitable&amp;quot;&#039;}&lt;br /&gt;
    table.insert(html, &#039;! colspan=2 | &#039; .. name)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Description\&#039;\&#039;\&#039; || &#039; .. desc)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Tier\&#039;\&#039;\&#039; || &#039; .. val(obj.tier, &amp;quot;Tier&amp;quot;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Fraction\&#039;\&#039;\&#039; || &#039; .. val(obj.fraction, &amp;quot;Fraction&amp;quot;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Guard Units\&#039;\&#039;\&#039; || &#039; .. val(obj.guard_units, &amp;quot;Guard Units&amp;quot;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Value\&#039;\&#039;\&#039; || &#039; .. val(obj.goods_value, &amp;quot;Value&amp;quot;))&lt;br /&gt;
    table.insert(html, &amp;quot;|}&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(html, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22580</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22580"/>
		<updated>2026-06-12T07:00:55Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function getTrans(target_id, type, lang, field)&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, field, {&lt;br /&gt;
        where = string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;%s&#039; AND language = &#039;%s&#039;&amp;quot;, target_id, type, lang),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1][field] or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.display(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local input = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- Identification de l&#039;objet&lt;br /&gt;
    local obj_id = nil&lt;br /&gt;
    if input then&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. input .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then obj_id = res[1].target_id else obj_id = input end&lt;br /&gt;
    else&lt;br /&gt;
        local baseName = mw.text.trim(mw.ustring.gsub(mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;), &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. baseName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then obj_id = res[1].target_id end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not obj_id then return &amp;quot;Objet introuvable (ID ou Nom invalide).&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- REQUÊTE SANS LE &amp;quot;*&amp;quot; : Liste explicite des champs connus&lt;br /&gt;
    local fields = &amp;quot;id,category,name_sid,desc_sid,narrative_desc_sid,goods_value,ai_value,custom_guard_value,view_radius,guard_units,fraction,tier,source_path&amp;quot;&lt;br /&gt;
    local data = mw.ext.cargo.query(&amp;quot;MapObject&amp;quot;, fields, {&lt;br /&gt;
        where = string.format(&amp;quot;id = &#039;%s&#039;&amp;quot;, obj_id),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    -- DEBUG : Si la table ne renvoie rien&lt;br /&gt;
    if not data or #data == 0 then &lt;br /&gt;
        return &amp;quot;Erreur Cargo : Aucune donnée trouvée dans la table MapObject pour l&#039;ID : &amp;quot; .. obj_id .. &amp;quot;. Vérifiez que cet ID existe bien dans MapObject.&amp;quot; &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local obj = data[1]&lt;br /&gt;
    &lt;br /&gt;
    -- Construction&lt;br /&gt;
    local name = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;name&amp;quot;)&lt;br /&gt;
    local desc = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;description&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    local html = {&#039;{| class=&amp;quot;wikitable&amp;quot;&#039;}&lt;br /&gt;
    table.insert(html, &#039;! colspan=2 | &#039; .. name)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Description\&#039;\&#039;\&#039; || &#039; .. desc)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Tier\&#039;\&#039;\&#039; || &#039; .. (obj.tier or &#039;Non défini&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Fraction\&#039;\&#039;\&#039; || &#039; .. (obj.fraction or &#039;Non défini&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Guard Units\&#039;\&#039;\&#039; || &#039; .. (obj.guard_units or &#039;Aucune&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Value\&#039;\&#039;\&#039; || &#039; .. (obj.goods_value or &#039;0&#039;))&lt;br /&gt;
    table.insert(html, &amp;quot;|}&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(html, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22579</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22579"/>
		<updated>2026-06-12T06:59:03Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour récupérer les traductions&lt;br /&gt;
local function getTrans(target_id, type, lang, field)&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, field, {&lt;br /&gt;
        where = string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;%s&#039; AND language = &#039;%s&#039;&amp;quot;, target_id, type, lang),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1][field] or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.display(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local input = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Identification de l&#039;objet&lt;br /&gt;
    local obj_id = nil&lt;br /&gt;
    if input then&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. input .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then obj_id = res[1].target_id else obj_id = input end&lt;br /&gt;
    else&lt;br /&gt;
        local baseName = mw.ustring.gsub(mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;), &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. mw.text.trim(baseName) .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then obj_id = res[1].target_id end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not obj_id then return &amp;quot;Objet introuvable.&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Requête Cargo avec tous les champs possibles de la table MapObject&lt;br /&gt;
    local data = mw.ext.cargo.query(&amp;quot;MapObject&amp;quot;, &amp;quot;id, category, name_sid, desc_sid, narrative_desc_sid, goods_value, ai_value, custom_guard_value, view_radius, guard_units, fraction, tier, source_path&amp;quot;, {&lt;br /&gt;
        where = string.format(&amp;quot;id = &#039;%s&#039;&amp;quot;, obj_id),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if not data or #data == 0 then return &amp;quot;Pas de données techniques pour : &amp;quot; .. obj_id end&lt;br /&gt;
    local obj = data[1]&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Construction du tableau avec affichage de débogage&lt;br /&gt;
    local name = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;name&amp;quot;)&lt;br /&gt;
    local desc = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;description&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    local html = {&#039;{| class=&amp;quot;wikitable&amp;quot;&#039;}&lt;br /&gt;
    table.insert(html, &#039;! colspan=2 | &#039; .. name)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Description\&#039;\&#039;\&#039; || &#039; .. desc)&lt;br /&gt;
    &lt;br /&gt;
    -- BOUCLE DYNAMIQUE : Affiche tout ce que Cargo a renvoyé&lt;br /&gt;
    for k, v in pairs(obj) do&lt;br /&gt;
        if k ~= &amp;quot;id&amp;quot; then -- on saute l&#039;ID&lt;br /&gt;
            table.insert(html, &#039;|- | \&#039;\&#039;\&#039; &#039; .. k .. &#039; \&#039;\&#039;\&#039; || &#039; .. (v or &#039;N/A&#039;))&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    table.insert(html, &amp;quot;|}&amp;quot;)&lt;br /&gt;
    return table.concat(html, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22578</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22578"/>
		<updated>2026-06-12T06:58:04Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour récupérer les traductions&lt;br /&gt;
local function getTrans(target_id, type, lang, field)&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, field, {&lt;br /&gt;
        where = string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;%s&#039; AND language = &#039;%s&#039;&amp;quot;, target_id, type, lang),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1][field] or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.display(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local input = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Détection langue&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Identification de l&#039;objet&lt;br /&gt;
    local obj_id = nil&lt;br /&gt;
    &lt;br /&gt;
    -- Si input est fourni, on cherche si c&#039;est un nom ou un ID&lt;br /&gt;
    if input then&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. input .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then&lt;br /&gt;
            obj_id = res[1].target_id&lt;br /&gt;
        else&lt;br /&gt;
            obj_id = input -- On suppose que c&#039;est l&#039;ID direct&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        -- Sinon via titre de page&lt;br /&gt;
        local baseName = mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        baseName = mw.ustring.gsub(baseName, &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        baseName = mw.text.trim(baseName)&lt;br /&gt;
        &lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. baseName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then&lt;br /&gt;
            obj_id = res[1].target_id&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not obj_id then return &amp;quot;Objet introuvable pour : &amp;quot; .. (input or pagename) end&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Requête Cargo (Récupération de tous les champs sans en oublier)&lt;br /&gt;
    -- On utilise NULL pour forcer Cargo à retourner les champs existants&lt;br /&gt;
    local data = mw.ext.cargo.query(&amp;quot;MapObject&amp;quot;, &amp;quot;id, category, name_sid, desc_sid, goods_value, ai_value, custom_guard_value, view_radius, guard_units, fraction, tier, source_path&amp;quot;, {&lt;br /&gt;
        where = string.format(&amp;quot;id = &#039;%s&#039;&amp;quot;, obj_id),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if not data or #data == 0 then return &amp;quot;Données techniques manquantes pour l&#039;ID : &amp;quot; .. obj_id end&lt;br /&gt;
    local obj = data[1]&lt;br /&gt;
    &lt;br /&gt;
    -- 4. Construction du tableau&lt;br /&gt;
    local name = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;name&amp;quot;)&lt;br /&gt;
    local desc = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;description&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    local html = {&#039;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&#039;}&lt;br /&gt;
    table.insert(html, &#039;! colspan=2 | &#039; .. name)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Description\&#039;\&#039;\&#039; || &#039; .. desc)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Tier\&#039;\&#039;\&#039; || &#039; .. (obj.tier or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Fraction\&#039;\&#039;\&#039; || &#039; .. (obj.fraction or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Guard Units\&#039;\&#039;\&#039; || &#039; .. (obj.guard_units or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Value\&#039;\&#039;\&#039; || &#039; .. (obj.goods_value or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &amp;quot;|}&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(html, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22577</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22577"/>
		<updated>2026-06-12T06:56:04Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour récupérer les traductions&lt;br /&gt;
local function getTrans(target_id, type, lang, field)&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, field, {&lt;br /&gt;
        where = string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;%s&#039; AND language = &#039;%s&#039;&amp;quot;, target_id, type, lang),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1][field] or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.display(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    -- On tente de récupérer un argument (id ou nom) en premier, sinon le titre de la page&lt;br /&gt;
    local input_identifier = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Détection de la langue&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Détermination de l&#039;ID technique&lt;br /&gt;
    local obj_id = nil&lt;br /&gt;
    &lt;br /&gt;
    if input_identifier then&lt;br /&gt;
        -- Si un argument est passé, on vérifie s&#039;il s&#039;agit d&#039;un ID technique ou d&#039;un nom anglais&lt;br /&gt;
        -- On tente d&#039;abord de chercher par nom anglais&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. input_identifier .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then&lt;br /&gt;
            obj_id = res[1].target_id&lt;br /&gt;
        else&lt;br /&gt;
            -- Sinon, on considère que c&#039;est déjà un ID technique&lt;br /&gt;
            obj_id = input_identifier&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        -- Sinon, détection automatique via le titre de la page&lt;br /&gt;
        local baseName = mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        baseName = mw.ustring.gsub(baseName, &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        baseName = mw.text.trim(baseName)&lt;br /&gt;
        &lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. baseName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then&lt;br /&gt;
            obj_id = res[1].target_id&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not obj_id then return &amp;quot;Objet non trouvé (vérifiez le nom ou l&#039;ID).&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Récupération des données techniques&lt;br /&gt;
    local data = mw.ext.cargo.query(&amp;quot;MapObject&amp;quot;, &amp;quot;id, tier, fraction, guard_units, goods_value&amp;quot;, {&lt;br /&gt;
        where = string.format(&amp;quot;id = &#039;%s&#039;&amp;quot;, obj_id),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    -- DÉBOGAGE : Si pas de données, on affiche l&#039;ID cherché&lt;br /&gt;
    if not data or #data == 0 then &lt;br /&gt;
        return &amp;quot;Erreur : Aucune donnée trouvée dans la table MapObject pour l&#039;ID : &amp;quot; .. obj_id &lt;br /&gt;
    end&lt;br /&gt;
    local obj = data[1]&lt;br /&gt;
    &lt;br /&gt;
    -- 4. Construction du tableau (DIAGNOSTIC)&lt;br /&gt;
    local keys = {}&lt;br /&gt;
    for k, v in pairs(obj) do table.insert(keys, k) end&lt;br /&gt;
    local debug_keys = &amp;quot;Colonnes trouvées : &amp;quot; .. table.concat(keys, &amp;quot;, &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    local name = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;name&amp;quot;)&lt;br /&gt;
    local desc = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;description&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    local html = {&#039;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&#039;}&lt;br /&gt;
    table.insert(html, &#039;! colspan=2 | &#039; .. name)&lt;br /&gt;
    table.insert(html, &#039;|- | colspan=2 | &amp;lt;small&amp;gt;&#039; .. debug_keys .. &#039;&amp;lt;/small&amp;gt;&#039;) -- Affiche les clés ici&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Tier\&#039;\&#039;\&#039; || &#039; .. (obj.tier or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Faction\&#039;\&#039;\&#039; || &#039; .. (obj.fraction or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Guard Units\&#039;\&#039;\&#039; || &#039; .. (obj.guard_units or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Value\&#039;\&#039;\&#039; || &#039; .. (obj.goods_value or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &amp;quot;|}&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(html, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22576</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22576"/>
		<updated>2026-06-12T06:54:10Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour récupérer les traductions&lt;br /&gt;
local function getTrans(target_id, type, lang, field)&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, field, {&lt;br /&gt;
        where = string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;%s&#039; AND language = &#039;%s&#039;&amp;quot;, target_id, type, lang),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1][field] or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.display(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    -- On tente de récupérer un argument (id ou nom) en premier, sinon le titre de la page&lt;br /&gt;
    local input_identifier = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Détection de la langue&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Détermination de l&#039;ID technique&lt;br /&gt;
    local obj_id = nil&lt;br /&gt;
    &lt;br /&gt;
    if input_identifier then&lt;br /&gt;
        -- Si un argument est passé, on vérifie s&#039;il s&#039;agit d&#039;un ID technique ou d&#039;un nom anglais&lt;br /&gt;
        -- On tente d&#039;abord de chercher par nom anglais&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. input_identifier .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then&lt;br /&gt;
            obj_id = res[1].target_id&lt;br /&gt;
        else&lt;br /&gt;
            -- Sinon, on considère que c&#039;est déjà un ID technique&lt;br /&gt;
            obj_id = input_identifier&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        -- Sinon, détection automatique via le titre de la page&lt;br /&gt;
        local baseName = mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        baseName = mw.ustring.gsub(baseName, &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        baseName = mw.text.trim(baseName)&lt;br /&gt;
        &lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. baseName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then&lt;br /&gt;
            obj_id = res[1].target_id&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not obj_id then return &amp;quot;Objet non trouvé (vérifiez le nom ou l&#039;ID).&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Récupération des données techniques&lt;br /&gt;
    local data = mw.ext.cargo.query(&amp;quot;MapObject&amp;quot;, &amp;quot;id, tier, fraction, guard_units, goods_value&amp;quot;, {&lt;br /&gt;
        where = string.format(&amp;quot;id = &#039;%s&#039;&amp;quot;, obj_id),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    -- DÉBOGAGE : Si pas de données, on affiche l&#039;ID cherché&lt;br /&gt;
    if not data or #data == 0 then &lt;br /&gt;
        return &amp;quot;Erreur : Aucune donnée trouvée dans la table MapObject pour l&#039;ID : &amp;quot; .. obj_id &lt;br /&gt;
    end&lt;br /&gt;
    local obj = data[1]&lt;br /&gt;
    &lt;br /&gt;
    -- 4. Construction du tableau&lt;br /&gt;
    local name = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;name&amp;quot;)&lt;br /&gt;
    local desc = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;description&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    local html = {&#039;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&#039;}&lt;br /&gt;
    table.insert(html, &#039;! colspan=2 | &#039; .. name)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Description\&#039;\&#039;\&#039; || &#039; .. desc)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Tier\&#039;\&#039;\&#039; || &#039; .. (obj.tier or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Fraction\&#039;\&#039;\&#039; || &#039; .. (obj.fraction or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Guard Units\&#039;\&#039;\&#039; || &#039; .. (obj.guard_units or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Value\&#039;\&#039;\&#039; || &#039; .. (obj.goods_value or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &amp;quot;|}&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(html, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22575</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22575"/>
		<updated>2026-06-12T06:50:56Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour récupérer les traductions&lt;br /&gt;
local function getTrans(target_id, type, lang, field)&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, field, {&lt;br /&gt;
        where = string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;%s&#039; AND language = &#039;%s&#039;&amp;quot;, target_id, type, lang),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1][field] or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.display(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    -- On tente de récupérer un argument (id ou nom) en premier, sinon le titre de la page&lt;br /&gt;
    local input_identifier = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Détection de la langue&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Détermination de l&#039;ID technique&lt;br /&gt;
    local obj_id = nil&lt;br /&gt;
    &lt;br /&gt;
    if input_identifier then&lt;br /&gt;
        -- Si un argument est passé, on vérifie s&#039;il s&#039;agit d&#039;un ID technique ou d&#039;un nom anglais&lt;br /&gt;
        -- On tente d&#039;abord de chercher par nom anglais&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. input_identifier .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then&lt;br /&gt;
            obj_id = res[1].target_id&lt;br /&gt;
        else&lt;br /&gt;
            -- Sinon, on considère que c&#039;est déjà un ID technique&lt;br /&gt;
            obj_id = input_identifier&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        -- Sinon, détection automatique via le titre de la page&lt;br /&gt;
        local baseName = mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        baseName = mw.ustring.gsub(baseName, &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        baseName = mw.text.trim(baseName)&lt;br /&gt;
        &lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. baseName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then&lt;br /&gt;
            obj_id = res[1].target_id&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not obj_id then return &amp;quot;Objet non trouvé (vérifiez le nom ou l&#039;ID).&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Récupération des données techniques de l&#039;objet&lt;br /&gt;
    -- Remplace &amp;quot;*&amp;quot; par les colonnes réelles de ta table MapObject&lt;br /&gt;
    local data = mw.ext.cargo.query(&amp;quot;MapObject&amp;quot;, &amp;quot;id, tier, fraction, guard_units, goods_value&amp;quot;, {&lt;br /&gt;
        where = string.format(&amp;quot;id = &#039;%s&#039;&amp;quot;, obj_id),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if not data or #data == 0 then return &amp;quot;Données techniques introuvables pour l&#039;ID : &amp;quot; .. obj_id end&lt;br /&gt;
    local obj = data[1]&lt;br /&gt;
    &lt;br /&gt;
    -- 4. Construction du tableau&lt;br /&gt;
    local name = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;name&amp;quot;)&lt;br /&gt;
    local desc = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;description&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    local html = {&#039;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&#039;}&lt;br /&gt;
    table.insert(html, &#039;! colspan=2 | &#039; .. name)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Description\&#039;\&#039;\&#039; || &#039; .. desc)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Tier\&#039;\&#039;\&#039; || &#039; .. (obj.tier or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Fraction\&#039;\&#039;\&#039; || &#039; .. (obj.fraction or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Guard Units\&#039;\&#039;\&#039; || &#039; .. (obj.guard_units or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Value\&#039;\&#039;\&#039; || &#039; .. (obj.goods_value or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &amp;quot;|}&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(html, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22574</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22574"/>
		<updated>2026-06-12T06:49:23Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour récupérer les traductions&lt;br /&gt;
local function getTrans(target_id, type, lang, field)&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, field, {&lt;br /&gt;
        where = string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;%s&#039; AND language = &#039;%s&#039;&amp;quot;, target_id, type, lang),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1][field] or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.display(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    -- On tente de récupérer un argument (id ou nom) en premier, sinon le titre de la page&lt;br /&gt;
    local input_identifier = args[&amp;quot;id&amp;quot;] or args[1]&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Détection de la langue&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Détermination de l&#039;ID technique&lt;br /&gt;
    local obj_id = nil&lt;br /&gt;
    &lt;br /&gt;
    if input_identifier then&lt;br /&gt;
        -- Si un argument est passé, on vérifie s&#039;il s&#039;agit d&#039;un ID technique ou d&#039;un nom anglais&lt;br /&gt;
        -- On tente d&#039;abord de chercher par nom anglais&lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. input_identifier .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then&lt;br /&gt;
            obj_id = res[1].target_id&lt;br /&gt;
        else&lt;br /&gt;
            -- Sinon, on considère que c&#039;est déjà un ID technique&lt;br /&gt;
            obj_id = input_identifier&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        -- Sinon, détection automatique via le titre de la page&lt;br /&gt;
        local baseName = mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        baseName = mw.ustring.gsub(baseName, &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        baseName = mw.text.trim(baseName)&lt;br /&gt;
        &lt;br /&gt;
        local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
            where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. baseName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
            limit = 1&lt;br /&gt;
        })&lt;br /&gt;
        if res and #res &amp;gt; 0 then&lt;br /&gt;
            obj_id = res[1].target_id&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not obj_id then return &amp;quot;Objet non trouvé (vérifiez le nom ou l&#039;ID).&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Récupération des données techniques&lt;br /&gt;
    local data = mw.ext.cargo.query(&amp;quot;MapObject&amp;quot;, &amp;quot;*&amp;quot;, {&lt;br /&gt;
        where = string.format(&amp;quot;id = &#039;%s&#039;&amp;quot;, obj_id),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if not data or #data == 0 then return &amp;quot;Données techniques introuvables pour l&#039;ID : &amp;quot; .. obj_id end&lt;br /&gt;
    local obj = data[1]&lt;br /&gt;
    &lt;br /&gt;
    -- 4. Construction du tableau&lt;br /&gt;
    local name = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;name&amp;quot;)&lt;br /&gt;
    local desc = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;description&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    local html = {&#039;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&#039;}&lt;br /&gt;
    table.insert(html, &#039;! colspan=2 | &#039; .. name)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Description\&#039;\&#039;\&#039; || &#039; .. desc)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Tier\&#039;\&#039;\&#039; || &#039; .. (obj.tier or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Fraction\&#039;\&#039;\&#039; || &#039; .. (obj.fraction or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Guard Units\&#039;\&#039;\&#039; || &#039; .. (obj.guard_units or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Value\&#039;\&#039;\&#039; || &#039; .. (obj.goods_value or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &amp;quot;|}&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(html, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22573</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22573"/>
		<updated>2026-06-12T06:44:37Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilitaire pour récupérer les traductions&lt;br /&gt;
local function getTrans(target_id, type, lang, field)&lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, field, {&lt;br /&gt;
        where = string.format(&amp;quot;target_id = &#039;%s&#039; AND type = &#039;%s&#039; AND language = &#039;%s&#039;&amp;quot;, target_id, type, lang),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    return (res and #res &amp;gt; 0) and res[1][field] or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.display(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local pagename = mw.title.getCurrentTitle().text&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Détection de la langue&lt;br /&gt;
    local lang = args[&amp;quot;language&amp;quot;] or mw.ustring.match(pagename, &amp;quot;/([a-z_]+)$&amp;quot;) or &amp;quot;en&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- 2. Détection de l&#039;ID via le nom anglais&lt;br /&gt;
    local baseName = mw.ustring.gsub(pagename, &amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    baseName = mw.ustring.gsub(baseName, &amp;quot;%s*%([^%)]*%)&amp;quot;, &amp;quot;&amp;quot;) -- Nettoyage des parenthèses&lt;br /&gt;
    &lt;br /&gt;
    local res = mw.ext.cargo.query(&amp;quot;Translation&amp;quot;, &amp;quot;target_id&amp;quot;, {&lt;br /&gt;
        where = &amp;quot;type = &#039;map_object&#039; AND language = &#039;en&#039; AND name = &#039;&amp;quot; .. baseName .. &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if not res or #res == 0 then&lt;br /&gt;
        return &amp;quot;Objet non trouvé pour le nom : &amp;quot; .. baseName&lt;br /&gt;
    end&lt;br /&gt;
    local obj_id = res[1].target_id&lt;br /&gt;
    &lt;br /&gt;
    -- 3. Récupération des données techniques de l&#039;objet&lt;br /&gt;
    local data = mw.ext.cargo.query(&amp;quot;MapObject&amp;quot;, &amp;quot;*&amp;quot;, {&lt;br /&gt;
        where = string.format(&amp;quot;id = &#039;%s&#039;&amp;quot;, obj_id),&lt;br /&gt;
        limit = 1&lt;br /&gt;
    })&lt;br /&gt;
    &lt;br /&gt;
    if not data or #data == 0 then return &amp;quot;Données techniques introuvables.&amp;quot; end&lt;br /&gt;
    local obj = data[1]&lt;br /&gt;
    &lt;br /&gt;
    -- 4. Construction du tableau&lt;br /&gt;
    local name = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;name&amp;quot;)&lt;br /&gt;
    local desc = getTrans(obj_id, &amp;quot;map_object&amp;quot;, lang, &amp;quot;description&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    local html = {&#039;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&#039;}&lt;br /&gt;
    table.insert(html, &#039;! colspan=2 | &#039; .. name)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Description\&#039;\&#039;\&#039; || &#039; .. desc)&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Tier\&#039;\&#039;\&#039; || &#039; .. (obj.tier or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Fraction\&#039;\&#039;\&#039; || &#039; .. (obj.fraction or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Guard Units\&#039;\&#039;\&#039; || &#039; .. (obj.guard_units or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &#039;|- | \&#039;\&#039;\&#039;Value\&#039;\&#039;\&#039; || &#039; .. (obj.goods_value or &#039;-&#039;))&lt;br /&gt;
    table.insert(html, &amp;quot;|}&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(html, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22523</id>
		<title>Module:MapObjectsData</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:MapObjectsData&amp;diff=22523"/>
		<updated>2026-06-09T17:25:31Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: Replaced content with &amp;quot;local p = {}  function p.listCategories(frame)     -- On interroge Cargo pour récupérer toutes les catégories distinctes     local results = mw.ext.cargo.query(         &amp;#039;MapObject&amp;#039;,          &amp;#039;category&amp;#039;,          {              groupBy = &amp;#039;category&amp;#039;,             orderBy = &amp;#039;category ASC&amp;#039;         }     )          -- Préparation du résultat     local output = {&amp;quot;=== Liste des catégories MapObject ===&amp;quot;}     for _, row in ipairs(results) do         if row.category and...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.listCategories(frame)&lt;br /&gt;
    -- On interroge Cargo pour récupérer toutes les catégories distinctes&lt;br /&gt;
    local results = mw.ext.cargo.query(&lt;br /&gt;
        &#039;MapObject&#039;, &lt;br /&gt;
        &#039;category&#039;, &lt;br /&gt;
        { &lt;br /&gt;
            groupBy = &#039;category&#039;,&lt;br /&gt;
            orderBy = &#039;category ASC&#039;&lt;br /&gt;
        }&lt;br /&gt;
    )&lt;br /&gt;
    &lt;br /&gt;
    -- Préparation du résultat&lt;br /&gt;
    local output = {&amp;quot;=== Liste des catégories MapObject ===&amp;quot;}&lt;br /&gt;
    for _, row in ipairs(results) do&lt;br /&gt;
        if row.category and row.category ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            table.insert(output, &amp;quot;* &amp;quot; .. row.category)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(output, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Summon_Swarm/ja&amp;diff=22151</id>
		<title>Summon Swarm/ja</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Summon_Swarm/ja&amp;diff=22151"/>
		<updated>2026-06-07T13:57:59Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: Created page with &amp;quot;{{loc}}  {{#invoke:SubSkillsTable|display}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{loc}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:SubSkillsTable|display}}&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Summon_Swarm/fr&amp;diff=22150</id>
		<title>Summon Swarm/fr</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Summon_Swarm/fr&amp;diff=22150"/>
		<updated>2026-06-07T13:57:53Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{loc|Invocation d&#039;essaim}}&lt;br /&gt;
L&#039;&#039;&#039;&#039;Invocation d&#039;essaim&#039;&#039;&#039; est la [[Skills/fr|compétence de faction]] unique de la faction de la {{F|Hive|fr}}, connue par défaut par tous les [[Enforcer/fr|Exécuteurs]] et [[Herald/fr|Hérauts]], et indisponible pour les autres classes de héros.&lt;br /&gt;
&lt;br /&gt;
À chaque tour, elle permet au héros de pondre des œufs qui éclosent au tour suivant pour donner naissance à des [[Fire Larva/fr|Larves de feu]] temporaires qui s&#039;autodétruisent, servant ainsi de renforts, distrayant les ennemis et absorbant les dégâts.&lt;br /&gt;
&lt;br /&gt;
{{#invoke:SubSkillsTable|display}}&lt;br /&gt;
&lt;br /&gt;
=== Effets d&#039;artéfact ===&lt;br /&gt;
* [[File:Holy sigil of roph artifact.png|60px]] Le [[Holy Sigil of Roph/fr|Sceau sacré de Roph]] octroie toutes les compétences secondaires d&#039;Invocation d&#039;essaim non apprises, ainsi que celles de la [[Righteousness/fr|Droiture]], de la [[Necromancy/fr|Nécromancie]], des [[Murmuring/fr|Murmures]], de la [[Abyssal_Communion/fr|Communion abyssale]] et de la [[Triumvirate&#039;s_Strength/fr|Force du Triumvirat]].&lt;br /&gt;
&lt;br /&gt;
{{SkillsNavbox/fr}}&lt;br /&gt;
[[Category:Compétences]]&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Murmuring/ja&amp;diff=22149</id>
		<title>Murmuring/ja</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Murmuring/ja&amp;diff=22149"/>
		<updated>2026-06-07T13:57:31Z</updated>

		<summary type="html">&lt;p&gt;76561198256426587: Created page with &amp;quot;{{loc}}  {{#invoke:SubSkillsTable|display}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{loc}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:SubSkillsTable|display}}&lt;/div&gt;</summary>
		<author><name>76561198256426587</name></author>
	</entry>
</feed>