Module:Sandbox/Aurelain/SkillSynergies: Difference between revisions

From Heroes of Might and Magic: Olden Era Official Wiki
No edit summary
No edit summary
Line 2: Line 2:
local p = {}
local p = {}
local SkillsOverview = require("Module:Sandbox/Aurelain/SkillsOverview")
local SkillsOverview = require("Module:Sandbox/Aurelain/SkillsOverview")
local PATCH_NAME = {
    ['Summon Avatar'] = 'Summon Avatar (Skill)',
}


------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
Line 8: Line 11:
local function dump(target)
local function dump(target)
     return '<pre>' .. mw.dumpObject(target) .. '</pre>'
     return '<pre>' .. mw.dumpObject(target) .. '</pre>'
end
------------------------------------------------------------------------------------------------------------------------
-- Spawns a safe robotic url from an English name, fit for adding it before the visible name
------------------------------------------------------------------------------------------------------------------------
local function getUrl(nameEn, lang)
    local safeNameEn = PATCH_NAME[nameEn] or nameEn
    if lang == 'en' and safeNameEn == nameEn then
        return ''
    end
    return safeNameEn .. '/' .. lang .. '|'
end
end


Line 49: Line 63:
--
--
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
local function renderSynergies(synergies)
local function renderSynergies(synergies, lang)
     local root = mw.html.create()
     local root = mw.html.create()
     for _, synergy in ipairs(synergies) do
     for _, synergy in ipairs(synergies) do
         root:tag('div'):css('color:red'):wikitext(synergy.rankName)
         local rankIcon = '[[File:' .. synergy.rankIcon .. '.png|48px|link=]]'
        local rankLink = '[[' .. getUrl(synergy.rankNameEn, lang) .. synergy.rankNameEn .. ']]'
        local subIcon = '[[File:' .. synergy.subIcon .. '.png|24px|link=]]'
 
        root:tag('div'):wikitext(rankIcon .. rankLink .. subIcon .. synergy.subName)
     end
     end
     return tostring(root)
     return tostring(root)

Revision as of 08:58, 9 June 2026

Documentation for this module may be created at Module:Sandbox/Aurelain/SkillSynergies/doc

-- Usage: {{#invoke:SkillSynergies|display|lang=en|skill=skill_assault}}
local p = {}
local SkillsOverview = require("Module:Sandbox/Aurelain/SkillsOverview")
local PATCH_NAME = {
    ['Summon Avatar'] = 'Summon Avatar (Skill)',
}

------------------------------------------------------------------------------------------------------------------------
-- Debugs a variable
------------------------------------------------------------------------------------------------------------------------
local function dump(target)
    return '<pre>' .. mw.dumpObject(target) .. '</pre>'
end

------------------------------------------------------------------------------------------------------------------------
-- Spawns a safe robotic url from an English name, fit for adding it before the visible name
------------------------------------------------------------------------------------------------------------------------
local function getUrl(nameEn, lang)
    local safeNameEn = PATCH_NAME[nameEn] or nameEn
    if lang == 'en' and safeNameEn == nameEn then
        return ''
    end
    return safeNameEn .. '/' .. lang .. '|'
end

------------------------------------------------------------------------------------------------------------------------
-- Ejects punctuation from inside quotes. Example:  `foo “Bar.”` into `foo “Bar”.`
------------------------------------------------------------------------------------------------------------------------
local function repairEnglishPunctuation(text)
    return text:gsub("([%,%.%!%?])”", "”%1")
end

------------------------------------------------------------------------------------------------------------------------
--
------------------------------------------------------------------------------------------------------------------------
local function findSynergies(allSkills, skill, nameEn, lang)
    local synergies = {}
    for _, group in ipairs(allSkills) do
        if group.id ~= skill then
            for _, rank in ipairs(group.ranks) do
                for _, subSkill in pairs(rank.subSkills) do
                    local descriptionEn = repairEnglishPunctuation(subSkill.descriptionEn)
                    if descriptionEn:match('“' .. nameEn .. '”') then
                        -- We found a subskill that mentions our target skill by name
                        table.insert(synergies, {
                            rankName = rank.name,
                            rankNameEn = rank.nameEn,
                            rankIcon = rank.icon,
                            subName = subSkill.name,
                            subIcon = subSkill.icon,
                            description = SkillsOverview.linkifyDescription(subSkill.description, descriptionEn, lang),
                            descriptionEn = descriptionEn,
                        })
                    end
                end
            end
        end
    end
    return synergies
end

------------------------------------------------------------------------------------------------------------------------
--
------------------------------------------------------------------------------------------------------------------------
local function renderSynergies(synergies, lang)
    local root = mw.html.create()
    for _, synergy in ipairs(synergies) do
        local rankIcon = '[[File:' .. synergy.rankIcon .. '.png|48px|link=]]'
        local rankLink = '[[' .. getUrl(synergy.rankNameEn, lang) .. synergy.rankNameEn .. ']]'
        local subIcon = '[[File:' .. synergy.subIcon .. '.png|24px|link=]]'

        root:tag('div'):wikitext(rankIcon .. rankLink .. subIcon .. synergy.subName)
    end
    return tostring(root)
end

------------------------------------------------------------------------------------------------------------------------
--
------------------------------------------------------------------------------------------------------------------------
local function findEnglishName(allSkills, skill)
    for _, group in ipairs(allSkills) do
        if group.id == skill then
            return group.nameEn
        end
    end
end

------------------------------------------------------------------------------------------------------------------------
-- Main public function
------------------------------------------------------------------------------------------------------------------------
function p.display(frame)
    --local d = repairEnglishPunctuation('foo “Bar.”')
    --if 1 then return dump(d) end

    -- Args
    local args = frame.args
    local lang = args.lang or 'en'
    local skill = args.skill
    if not skill or skill == '' then return 'You must provide a skill id' end
    lang = 'fr'
    --skill = 'skill_formation'

    local allSkills = SkillsOverview.getSkillsFromCargo(lang)
    local nameEn = findEnglishName(allSkills, skill)
    if not nameEn then return 'Cannot find name for skill "' .. skill .. '"' end
    local synergies = findSynergies(allSkills, skill, nameEn, lang)
    if #synergies == 0 then return '' end

    -- Output
    local markup = renderSynergies(synergies, lang)
    if 1 then return dump(markup) end
    --local styleTag = frame:extensionTag('templatestyles', '', { src = 'Module:SkillsOverview/styles.css' })
    --return styleTag .. markup
end

return p