Module:Sandbox/Aurelain/SkillSynergies: Difference between revisions

From Heroes of Might and Magic: Olden Era Official Wiki
No edit summary
No edit summary
Line 17: Line 17:
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
local function getUrl(nameEn, lang)
local function getUrl(nameEn, lang)
     local safeNameEn = PATCH_NAME[nameEn] or nameEn
     local url = PATCH_NAME[nameEn] or nameEn
     if lang == 'en' and safeNameEn == nameEn then
     if lang ~= 'en' then
         return ''
         url = url .. '/' .. lang
     end
     end
     return safeNameEn .. '/' .. lang .. '|'
     return url
end
end


Line 47: Line 47:
--
--
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
local function findSynergies(allSkills, skill, nameEn, lang)
local function findSynergies(allSkills, skill, nameEn)
     local synergies = {}
     local synergies = {}
     for _, group in ipairs(allSkills) do
     for _, group in ipairs(allSkills) do
Line 80: Line 80:
         -- Header
         -- Header
         local rankIcon = '[[File:' .. synergy.rankIcon .. '.png|48px|link=]]'
         local rankIcon = '[[File:' .. synergy.rankIcon .. '.png|48px|link=]]'
         local rankLink = '[[' .. getUrl(synergy.groupNameEn, lang) .. synergy.rankName .. ']]'
         local rankLink = '[[' .. getUrl(synergy.groupNameEn, lang) .. '|' .. synergy.rankName .. ']]'
         root:tag('div'):wikitext(rankIcon .. ' ' .. rankLink)
         root:tag('div'):wikitext(rankIcon .. ' ' .. rankLink)


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


     -- Args
     -- Args
Line 118: Line 117:
     --skill = 'skill_formation'
     --skill = 'skill_formation'


    -- Cargo
     local allSkills = SkillsOverview.getSkillsFromCargo(lang)
     local allSkills = SkillsOverview.getSkillsFromCargo(lang)
     local nameEn = findEnglishName(allSkills, skill)
     local nameEn = findEnglishName(allSkills, skill)
     if not nameEn then return 'Cannot find name for skill "' .. skill .. '"' end
     if not nameEn then return 'Cannot find name for skill "' .. skill .. '"' end
    -- Main computation
     local synergies = findSynergies(allSkills, skill, nameEn, lang)
     local synergies = findSynergies(allSkills, skill, nameEn, lang)
     if #synergies == 0 then return '' end
     if #synergies == 0 then return '' end
Line 126: Line 128:
     -- Output
     -- Output
     local markup = renderSynergies(synergies, lang)
     local markup = renderSynergies(synergies, lang)
    --if 1 then return dump(markup) end
    --local styleTag = frame:extensionTag('templatestyles', '', { src = 'Module:SkillsOverview/styles.css' })
     return markup
     return markup
end
end


return p
return p

Revision as of 09:52, 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 url = PATCH_NAME[nameEn] or nameEn
    if lang ~= 'en' then
        url = url .. '/' .. lang
    end
    return url
end

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

------------------------------------------------------------------------------------------------------------------------
--
------------------------------------------------------------------------------------------------------------------------
local function highlightLastSentence(text)
    local spanBegin = '<span style="color:peru">'
    local output = mw.ustring.gsub(text, '%(', spanBegin .. '(', 1)
    if output == text then
        output = mw.ustring.gsub(text, '([%.。])', '%1' .. spanBegin, 1)
    end
    output = output .. '</span>'
    return output
end

------------------------------------------------------------------------------------------------------------------------
--
------------------------------------------------------------------------------------------------------------------------
local function findSynergies(allSkills, skill, nameEn)
    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, {
                            groupNameEn = group.nameEn,
                            rankName = rank.name,
                            rankIcon = rank.icon,
                            subName = subSkill.name,
                            subIcon = subSkill.icon,
                            description = highlightLastSentence(subSkill.description),
                        })
                    end
                end
            end
        end
    end
    return synergies
end

------------------------------------------------------------------------------------------------------------------------
--
------------------------------------------------------------------------------------------------------------------------
local function renderSynergies(synergies, lang)
    local root = mw.html.create()
    for _, synergy in ipairs(synergies) do
        -- Header
        local rankIcon = '[[File:' .. synergy.rankIcon .. '.png|48px|link=]]'
        local rankLink = '[[' .. getUrl(synergy.groupNameEn, lang) .. '|' .. synergy.rankName .. ']]'
        root:tag('div'):wikitext(rankIcon .. ' ' .. rankLink)

        -- Description
        local subIcon = '[[File:' .. synergy.subIcon .. '.png|24px|link=]]'
        local subName = "'''" .. synergy.subName .. "'''"
        root:tag('div'):css('margin-left', '64px'):wikitext(subIcon .. ' ' .. subName)
        root:tag('div'):css('margin', '0 0 8px 93px'):wikitext(synergy.description)
    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)
    --if 1 then return dump(frame) 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 = 'en'
    --skill = 'skill_formation'

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

    -- Main computation
    local synergies = findSynergies(allSkills, skill, nameEn, lang)
    if #synergies == 0 then return '' end

    -- Output
    local markup = renderSynergies(synergies, lang)
    return markup
end

return p