Module:SkillSynergies: Difference between revisions
From Heroes of Might and Magic: Olden Era Official Wiki
Created page with "-- Usage: {{#invoke:SkillSynergies|display|lang=en|skill=skill_assault}} local p = {} ------------------------------------------------------------------------------------------------------------------------ -- Main public function ------------------------------------------------------------------------------------------------------------------------ function p.display(frame) return '' end return p" |
No edit summary |
||
| Line 1: | Line 1: | ||
-- Usage: {{#invoke:SkillSynergies|display|lang=en|skill=skill_assault}} | -- Usage: {{#invoke:SkillSynergies|display|lang=en|skill=skill_assault}} | ||
local p = {} | local p = {} | ||
local SkillsOverview = require("Module: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 | |||
------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | ||
| Line 6: | Line 107: | ||
------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | ||
function p.display(frame) | function p.display(frame) | ||
return '' | --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) | |||
if #synergies == 0 then return '' end | |||
-- Output | |||
local markup = renderSynergies(synergies, lang) | |||
return markup | |||
end | end | ||
return p | return p | ||
Revision as of 10:18, 9 June 2026
Documentation for this module may be created at Module:SkillSynergies/doc
-- Usage: {{#invoke:SkillSynergies|display|lang=en|skill=skill_assault}}
local p = {}
local SkillsOverview = require("Module: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)
if #synergies == 0 then return '' end
-- Output
local markup = renderSynergies(synergies, lang)
return markup
end
return p


