Module:Sandbox/Aurelain/SkillSynergies: Difference between revisions
From Heroes of Might and Magic: Olden Era Official Wiki
No edit summary |
No edit summary |
||
| (12 intermediate revisions by the same user not shown) | |||
| Line 47: | Line 47: | ||
-- | -- | ||
------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | ||
local function findSynergies( | local function findSynergies(skillsHub, skillId, pattern, skipHighlight) | ||
local synergies = {} | local synergies = {} | ||
for _, group in | for _, group in pairs(skillsHub) do | ||
if group.id ~= | if group.id ~= skillId then | ||
for _, rank in ipairs(group.ranks) do | for _, rank in ipairs(group.ranks) do | ||
for _, subSkill in pairs(rank.subSkills) do | for _, subSkill in pairs(rank.subSkills) do | ||
| Line 56: | Line 56: | ||
if descriptionEn:match(pattern) then | if descriptionEn:match(pattern) then | ||
-- We found a subskill that mentions our target skill by name | -- We found a subskill that mentions our target skill by name | ||
local d = subSkill.description | |||
d = skipHighlight and d or highlightLastSentence(d) | |||
table.insert(synergies, { | table.insert(synergies, { | ||
groupNameEn = group.nameEn, | groupNameEn = group.nameEn, | ||
| Line 62: | Line 64: | ||
subName = subSkill.name, | subName = subSkill.name, | ||
subIcon = subSkill.icon, | subIcon = subSkill.icon, | ||
description = | description = d, | ||
}) | }) | ||
end | end | ||
| Line 79: | Line 81: | ||
for _, synergy in ipairs(synergies) do | for _, synergy in ipairs(synergies) do | ||
-- Header | -- Header | ||
local rankIcon = '[[File:' .. synergy.rankIcon .. '.png| | local url = getUrl(synergy.groupNameEn, lang) | ||
local rankLink = '[[' .. | local rankIcon = '[[File:' .. synergy.rankIcon .. '.png|64px|link=' .. url .. ']]' | ||
local rankLink = '[[' .. url .. '|' .. synergy.rankName .. ']]' | |||
root:tag('div'):wikitext(rankIcon .. ' ' .. rankLink) | root:tag('div'):wikitext(rankIcon .. ' ' .. rankLink) | ||
-- | -- Sub container | ||
local | local container = root:tag('div'):css('display', 'flex'):css('margin', '-4px 0 8px 96px') | ||
local | |||
-- Left | |||
local icon = '[[File:' .. synergy.subIcon .. '.png|32px|link=]]' | |||
container:tag('div'):css('flex-shrink', 0):wikitext(icon) | |||
-- Right | |||
local content = "'''" .. synergy.subName .. "'''<br>" .. synergy.description | |||
container:tag('div'):css('flex-grow', 1):css('padding-left', '8px'):wikitext(content) | |||
end | end | ||
return tostring(root) | return tostring(root) | ||
| Line 95: | Line 103: | ||
-- | -- | ||
------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | ||
local function | local function merge(a, b) | ||
for _, | local output = {} | ||
for _, value in ipairs(a) do | |||
table.insert(output, value) | |||
end | |||
for _, value in ipairs(b) do | |||
table.insert(output, value) | |||
end | end | ||
return output | |||
end | end | ||
| Line 112: | Line 123: | ||
local args = frame.args | local args = frame.args | ||
local lang = args.lang or 'en' | local lang = args.lang or 'en' | ||
local | local skillId = args.skill or '' | ||
local pattern = args.pattern or '' | |||
--lang = 'fr' | |||
--skillId = 'skill_sorcery' | |||
--pattern = 'Heroic Strike' | |||
-- Cargo | -- Cargo | ||
local | local skillsHub = SkillsOverview.getSkillsFromCargo(lang) | ||
-- Main computation | -- Main computation | ||
local synergies = findSynergies( | local synergies = {} | ||
if skillId ~= '' then | |||
local entry = skillsHub[skillId] or {} | |||
local nameEn = entry.nameEn | |||
if not nameEn then return 'Cannot find name for skill "' .. skillId .. '"' end | |||
synergies = merge(synergies, findSynergies(skillsHub, skillId, '“' .. nameEn .. '”')) | |||
-- Manual hack to synergize each Magic School with its brethren | -- Manual hack to synergize each Magic School with its brethren | ||
if skillId:match('magic') then | |||
synergies = merge(synergies, findSynergies(skillsHub, skillId, 'other Magic School')) | |||
end | end | ||
end | end | ||
if #synergies == 0 then return '' end | if pattern ~= '' then | ||
synergies = merge(synergies, findSynergies(skillsHub, skillId, pattern, true)) | |||
end | |||
if #synergies == 0 then return "''No results''" end | |||
-- Output | -- Output | ||
Latest revision as of 09:06, 15 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(skillsHub, skillId, pattern, skipHighlight)
local synergies = {}
for _, group in pairs(skillsHub) do
if group.id ~= skillId then
for _, rank in ipairs(group.ranks) do
for _, subSkill in pairs(rank.subSkills) do
local descriptionEn = repairEnglishPunctuation(subSkill.descriptionEn)
if descriptionEn:match(pattern) then
-- We found a subskill that mentions our target skill by name
local d = subSkill.description
d = skipHighlight and d or highlightLastSentence(d)
table.insert(synergies, {
groupNameEn = group.nameEn,
rankName = rank.name,
rankIcon = rank.icon,
subName = subSkill.name,
subIcon = subSkill.icon,
description = d,
})
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 url = getUrl(synergy.groupNameEn, lang)
local rankIcon = '[[File:' .. synergy.rankIcon .. '.png|64px|link=' .. url .. ']]'
local rankLink = '[[' .. url .. '|' .. synergy.rankName .. ']]'
root:tag('div'):wikitext(rankIcon .. ' ' .. rankLink)
-- Sub container
local container = root:tag('div'):css('display', 'flex'):css('margin', '-4px 0 8px 96px')
-- Left
local icon = '[[File:' .. synergy.subIcon .. '.png|32px|link=]]'
container:tag('div'):css('flex-shrink', 0):wikitext(icon)
-- Right
local content = "'''" .. synergy.subName .. "'''<br>" .. synergy.description
container:tag('div'):css('flex-grow', 1):css('padding-left', '8px'):wikitext(content)
end
return tostring(root)
end
------------------------------------------------------------------------------------------------------------------------
--
------------------------------------------------------------------------------------------------------------------------
local function merge(a, b)
local output = {}
for _, value in ipairs(a) do
table.insert(output, value)
end
for _, value in ipairs(b) do
table.insert(output, value)
end
return output
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 skillId = args.skill or ''
local pattern = args.pattern or ''
--lang = 'fr'
--skillId = 'skill_sorcery'
--pattern = 'Heroic Strike'
-- Cargo
local skillsHub = SkillsOverview.getSkillsFromCargo(lang)
-- Main computation
local synergies = {}
if skillId ~= '' then
local entry = skillsHub[skillId] or {}
local nameEn = entry.nameEn
if not nameEn then return 'Cannot find name for skill "' .. skillId .. '"' end
synergies = merge(synergies, findSynergies(skillsHub, skillId, '“' .. nameEn .. '”'))
-- Manual hack to synergize each Magic School with its brethren
if skillId:match('magic') then
synergies = merge(synergies, findSynergies(skillsHub, skillId, 'other Magic School'))
end
end
if pattern ~= '' then
synergies = merge(synergies, findSynergies(skillsHub, skillId, pattern, true))
end
if #synergies == 0 then return "''No results''" end
-- Output
local markup = renderSynergies(synergies, lang)
return markup
end
return p


