Mudanças entre as edições de "Módulo:Quest"
Ir para navegação
Ir para pesquisar
m |
|||
| (Uma revisão intermediária pelo mesmo usuário não está sendo mostrada) | |||
| Linha 1: | Linha 1: | ||
local p = {} | local p = {} | ||
local | local Item = require("Módulo:Item") | ||
local function formatNumber(num) | local function formatNumber(num) | ||
| Linha 16: | Linha 16: | ||
end | end | ||
local function | local function parseItemEntry(entry) | ||
entry = mw.text.trim(entry) | |||
if entry == "" then return nil, nil end | |||
local ident, qtdStr | |||
if entry:find(";") then | |||
ident, qtdStr = entry:match("^(.-)%s*;%s*(%d+)$") | |||
else | |||
ident, qtdStr = entry:match("^(.-)%s*:%s*(%d+)$") | |||
end | end | ||
return nil | |||
if not ident or not qtdStr then return nil, nil end | |||
return mw.text.trim(ident), tonumber(qtdStr) | |||
end | end | ||
local function parseItens(raw) | local function parseItens(raw, ilha) | ||
local resultado = {} | local resultado = {} | ||
for | |||
local | for entry in mw.text.gsplit(raw or "", ",", true) do | ||
if | local ident, qtd = parseItemEntry(entry) | ||
local | if ident and qtd then | ||
local item = Item.resolve(ident) | |||
resultado[ | if not item then | ||
item = { | |||
id = 0, | |||
image = ident:match("%.%w+$") and ident or (ident .. ".png"), | |||
names = { pt = ident, en = ident }, | |||
category = "unknown" | |||
} | |||
end | |||
local key = tostring(item.id or (Item.getImage(item) or ident):lower()) | |||
if not resultado[key] then | |||
resultado[key] = { item = item, qtd = 0, ilha = nil } | |||
end | |||
resultado[key].qtd = resultado[key].qtd + qtd | |||
if ilha and ilha ~= "" and not resultado[key].ilha then | |||
resultado[key].ilha = ilha | |||
end | |||
end | end | ||
end | end | ||
return resultado | return resultado | ||
end | end | ||
| Linha 46: | Linha 64: | ||
local function mergeRecompensas(lista) | local function mergeRecompensas(lista) | ||
local total = {} | local total = {} | ||
for _, | for _, item in ipairs(lista) do | ||
local dados = parseItens( | local dados = parseItens(item.itens, item.ilha) | ||
for | for key, info in pairs(dados) do | ||
total[ | if not total[key] then | ||
total[key] = { item = info.item, qtd = 0, ilha = nil } | |||
end | |||
total[key].qtd = total[key].qtd + info.qtd | |||
if info.ilha and info.ilha ~= "" and not total[key].ilha then | |||
total[key].ilha = info.ilha | |||
end | |||
end | end | ||
end | end | ||
| Linha 55: | Linha 79: | ||
end | end | ||
local function extrairRecompensasValidas(content) | local function extrairRecompensasValidas(content) | ||
local recompensas = {} | local recompensas = {} | ||
| Linha 62: | Linha 85: | ||
local itens = bloco:match("itens%s*=%s*([^|}]+)") | local itens = bloco:match("itens%s*=%s*([^|}]+)") | ||
if itens then | if itens then | ||
table.insert(recompensas, itens) | local ilha = bloco:match("ilha%s*=%s*([^|}]+)") | ||
table.insert(recompensas, { itens = itens, ilha = ilha }) | |||
end | end | ||
end | end | ||
| Linha 70: | Linha 94: | ||
function p.hasRewards(frame) | function p.hasRewards(frame) | ||
local args = frame:getParent().args or {} | local args = frame.args or {} | ||
if not next(args) and frame:getParent() then | |||
args = frame:getParent().args or {} | |||
end | |||
local bonus = args.bonus or "" | local bonus = args.bonus or "" | ||
local content = mw.title.getCurrentTitle():getContent() | local content = mw.title.getCurrentTitle():getContent() | ||
| Linha 76: | Linha 103: | ||
local rewardCalls = extrairRecompensasValidas(content) | local rewardCalls = extrairRecompensasValidas(content) | ||
if bonus and bonus ~= "" then | if bonus and bonus ~= "" then | ||
table.insert(rewardCalls, bonus) | table.insert(rewardCalls, { itens = bonus }) | ||
end | end | ||
| Linha 84: | Linha 111: | ||
function p.total(frame) | function p.total(frame) | ||
local args = frame:getParent().args or {} | local args = frame.args or {} | ||
if not next(args) and frame:getParent() then | |||
args = frame:getParent().args or {} | |||
end | |||
local bonus = args.bonus or "" | local bonus = args.bonus or "" | ||
local lang = args.lang or "pt" | |||
local content = mw.title.getCurrentTitle():getContent() | local content = mw.title.getCurrentTitle():getContent() | ||
local rewardCalls = extrairRecompensasValidas(content) | local rewardCalls = extrairRecompensasValidas(content) | ||
if bonus and bonus ~= "" then | if bonus and bonus ~= "" then | ||
table.insert(rewardCalls, bonus) | table.insert(rewardCalls, { itens = bonus }) | ||
end | end | ||
| Linha 102: | Linha 133: | ||
local berries = {} | local berries = {} | ||
for | for _, info in pairs(total) do | ||
local | local qtd = info.qtd | ||
local | local ilha = info.ilha or "" | ||
local | local item = info.item | ||
local | local image = (Item.getImage(item) or ""):lower() | ||
if | |||
if image == "pose.png" and ilha ~= "" then | |||
local newNames = {} | |||
if item.names then | |||
for k, v in pairs(item.names) do newNames[k] = v end | |||
end | |||
newNames.pt = "Eternal Pose - " .. ilha | |||
newNames.en = "Eternal Pose - " .. ilha | |||
local cloned = {} | |||
for k, v in pairs(item) do cloned[k] = v end | |||
cloned.names = newNames | |||
cloned.desc = nil | |||
item = cloned | |||
end | end | ||
local bloco = { | local bloco = { | ||
item = item, | |||
qtd = formatNumber(qtd), | qtd = formatNumber(qtd), | ||
isBerries = info.item and info.item.category == "currency" | |||
and image:find("berries") | |||
} | } | ||
if | if bloco.isBerries then | ||
table.insert(berries, bloco) | table.insert(berries, bloco) | ||
else | else | ||
| Linha 125: | Linha 168: | ||
local function addBloco(bloco) | local function addBloco(bloco) | ||
html:wikitext(Item.renderOne(bloco.item, bloco.qtd, lang, { | |||
showTooltip = true, | |||
showCount = true | |||
})) | |||
end | end | ||
| Linha 145: | Linha 181: | ||
function p.requisitos(frame) | function p.requisitos(frame) | ||
local args = frame:getParent().args or | local args = frame.args or {} | ||
if not next(args) and frame:getParent() then | |||
args = frame:getParent().args or {} | |||
end | |||
local raw = args.requisitos or "" | local raw = args.requisitos or "" | ||
if mw.text.trim(raw) == "" then return "" end | if mw.text.trim(raw) == "" then return "" end | ||
Edição atual tal como às 02h43min de 17 de março de 2026
A documentação para este módulo pode ser criada em Módulo:Quest/doc
local p = {}
local Item = require("Módulo:Item")
local function formatNumber(num)
num = tonumber(num) or 0
if num >= 1e9 then
return string.format("%.0f", num / 1e6) .. "KKK"
elseif num >= 1e6 then
return string.format("%.0f", num / 1e6) .. "KK"
elseif num >= 1e4 then
return string.format("%.0f", num / 1e3) .. "K"
else
local s = tostring(num)
return s:reverse():gsub("(%d%d%d)", "%1,"):reverse():gsub("^,", "")
end
end
local function parseItemEntry(entry)
entry = mw.text.trim(entry)
if entry == "" then return nil, nil end
local ident, qtdStr
if entry:find(";") then
ident, qtdStr = entry:match("^(.-)%s*;%s*(%d+)$")
else
ident, qtdStr = entry:match("^(.-)%s*:%s*(%d+)$")
end
if not ident or not qtdStr then return nil, nil end
return mw.text.trim(ident), tonumber(qtdStr)
end
local function parseItens(raw, ilha)
local resultado = {}
for entry in mw.text.gsplit(raw or "", ",", true) do
local ident, qtd = parseItemEntry(entry)
if ident and qtd then
local item = Item.resolve(ident)
if not item then
item = {
id = 0,
image = ident:match("%.%w+$") and ident or (ident .. ".png"),
names = { pt = ident, en = ident },
category = "unknown"
}
end
local key = tostring(item.id or (Item.getImage(item) or ident):lower())
if not resultado[key] then
resultado[key] = { item = item, qtd = 0, ilha = nil }
end
resultado[key].qtd = resultado[key].qtd + qtd
if ilha and ilha ~= "" and not resultado[key].ilha then
resultado[key].ilha = ilha
end
end
end
return resultado
end
local function mergeRecompensas(lista)
local total = {}
for _, item in ipairs(lista) do
local dados = parseItens(item.itens, item.ilha)
for key, info in pairs(dados) do
if not total[key] then
total[key] = { item = info.item, qtd = 0, ilha = nil }
end
total[key].qtd = total[key].qtd + info.qtd
if info.ilha and info.ilha ~= "" and not total[key].ilha then
total[key].ilha = info.ilha
end
end
end
return total
end
local function extrairRecompensasValidas(content)
local recompensas = {}
for bloco in content:gmatch("{{%s*[Rr]eward.-}}") do
if not bloco:match("ignore%s*=") then
local itens = bloco:match("itens%s*=%s*([^|}]+)")
if itens then
local ilha = bloco:match("ilha%s*=%s*([^|}]+)")
table.insert(recompensas, { itens = itens, ilha = ilha })
end
end
end
return recompensas
end
function p.hasRewards(frame)
local args = frame.args or {}
if not next(args) and frame:getParent() then
args = frame:getParent().args or {}
end
local bonus = args.bonus or ""
local content = mw.title.getCurrentTitle():getContent()
local rewardCalls = extrairRecompensasValidas(content)
if bonus and bonus ~= "" then
table.insert(rewardCalls, { itens = bonus })
end
local total = mergeRecompensas(rewardCalls)
return next(total) and "1" or ""
end
function p.total(frame)
local args = frame.args or {}
if not next(args) and frame:getParent() then
args = frame:getParent().args or {}
end
local bonus = args.bonus or ""
local lang = args.lang or "pt"
local content = mw.title.getCurrentTitle():getContent()
local rewardCalls = extrairRecompensasValidas(content)
if bonus and bonus ~= "" then
table.insert(rewardCalls, { itens = bonus })
end
local total = mergeRecompensas(rewardCalls)
if next(total) == nil then return "" end
local html = mw.html.create("div")
html:addClass("introquest-items")
local outros = {}
local berries = {}
for _, info in pairs(total) do
local qtd = info.qtd
local ilha = info.ilha or ""
local item = info.item
local image = (Item.getImage(item) or ""):lower()
if image == "pose.png" and ilha ~= "" then
local newNames = {}
if item.names then
for k, v in pairs(item.names) do newNames[k] = v end
end
newNames.pt = "Eternal Pose - " .. ilha
newNames.en = "Eternal Pose - " .. ilha
local cloned = {}
for k, v in pairs(item) do cloned[k] = v end
cloned.names = newNames
cloned.desc = nil
item = cloned
end
local bloco = {
item = item,
qtd = formatNumber(qtd),
isBerries = info.item and info.item.category == "currency"
and image:find("berries")
}
if bloco.isBerries then
table.insert(berries, bloco)
else
table.insert(outros, bloco)
end
end
local function addBloco(bloco)
html:wikitext(Item.renderOne(bloco.item, bloco.qtd, lang, {
showTooltip = true,
showCount = true
}))
end
for _, b in ipairs(outros) do addBloco(b) end
for _, b in ipairs(berries) do addBloco(b) end
return tostring(html)
end
function p.requisitos(frame)
local args = frame.args or {}
if not next(args) and frame:getParent() then
args = frame:getParent().args or {}
end
local raw = args.requisitos or ""
if mw.text.trim(raw) == "" then return "" end
local output = {}
for item in mw.text.gsplit(raw, ",", true) do
local clean = mw.text.trim(item)
if clean ~= "" then table.insert(output, "* " .. clean) end
end
return table.concat(output, "\n")
end
return p