Mudanças entre as edições de "Módulo:Item"
Ir para navegação
Ir para pesquisar
m |
m |
||
| Linha 6: | Linha 6: | ||
local DEFAULT_FRAME_SIZE = 32 | local DEFAULT_FRAME_SIZE = 32 | ||
-- Categorias alinhadas ao jogo (ItemDB / editor). Sem duplicata coin/currency nem gem_currency. | |||
local CATEGORY_LABELS = { | local CATEGORY_LABELS = { | ||
general_item = { en = "General Item", pt = "Item | general_item = { en = "General Item", pt = "Item geral" }, | ||
special_item = { en = "Special Item", pt = "Item | special_item = { en = "Special Item", pt = "Item especial" }, | ||
currency = { en = "Currency", pt = "Moeda | currency = { en = "Currency", pt = "Moeda" }, | ||
cosmetic = { en = "Cosmetic", pt = "Cosmético" }, | cosmetic = { en = "Cosmetic", pt = "Cosmético" }, | ||
weapon = { en = "Weapon", pt = "Arma" }, | |||
head = { en = "Head", pt = "Cabeça" }, | head = { en = "Head", pt = "Cabeça" }, | ||
body = { en = "Body", pt = "Corpo" }, | body = { en = "Body", pt = "Corpo" }, | ||
legs = { en = "Legs", pt = "Perna" }, | legs = { en = "Legs", pt = "Perna" }, | ||
accessory = { en = "Accessory", pt = "Acessório" }, | accessory = { en = "Accessory", pt = "Acessório" }, | ||
emblem = { en = "Emblem", pt = "Emblema" }, | emblem = { en = "Emblem", pt = "Emblema" }, | ||
ship_style = { en = "Ship Style", pt = "Estilo de | ship_style = { en = "Ship Style", pt = "Estilo de navio" }, | ||
costume = { en = "Costume", pt = "Traje" }, | costume = { en = "Costume", pt = "Traje" }, | ||
navigation = { en = "Navigation", pt = "Navegação" }, | navigation = { en = "Navigation", pt = "Navegação" }, | ||
consumable = { en = "Consumable", pt = "Consumível" }, | consumable = { en = "Consumable", pt = "Consumível" }, | ||
gem = { en = "Gem", pt = "Gema" }, | gem = { en = "Gem", pt = "Gema" }, | ||
crystal = { en = "Crystal", pt = "Cristal" }, | crystal = { en = "Crystal", pt = "Cristal" }, | ||
awakening_stone = { en = "Awakening Stone", pt = "Pedra do Despertar" }, | awakening_stone = { en = "Awakening Stone", pt = "Pedra do Despertar" }, | ||
headstone = { en = "Headstone", pt = "Lápide" }, | headstone = { en = "Headstone", pt = "Lápide" }, | ||
den_den_mushi = { en = "Den Den Mushi", pt = "Den Den Mushi" }, | |||
} | } | ||
| Linha 104: | Linha 91: | ||
lang = lang or DEFAULT_LANG | lang = lang or DEFAULT_LANG | ||
return entry[lang] or entry[DEFAULT_LANG] or entry[FALLBACK_LANG] or nil | return entry[lang] or entry[DEFAULT_LANG] or entry[FALLBACK_LANG] or nil | ||
end | |||
local function getPassiveLine(item, key, lang) | |||
if not item or not item[key] or type(item[key]) ~= "table" then return nil end | |||
local p = item[key] | |||
lang = lang or DEFAULT_LANG | |||
local function pick(lg) | |||
local t = p[lg] | |||
if t and mw.text.trim(tostring(t)) ~= "" then return mw.text.trim(tostring(t)) end | |||
return nil | |||
end | |||
return pick(lang) or pick(DEFAULT_LANG) or pick(FALLBACK_LANG) | |||
end | end | ||
| Linha 117: | Linha 116: | ||
local value = Item.getValue(item) | local value = Item.getValue(item) | ||
local level = Item.getLevel(item) | local level = Item.getLevel(item) | ||
local w, h = Item.getSpriteSize(item) | local w, h = Item.getSpriteSize(item) | ||
local wrapper = mw.html.create("div") | local wrapper = mw.html.create("div") | ||
:addClass("item-wrapper") | :addClass("item-wrapper") | ||
:css("width", w .. "px") | :css("width", w .. "px") | ||
| Linha 130: | Linha 128: | ||
end | end | ||
wrapper:tag("span") | if image and mw.text.trim(image) ~= "" then | ||
wrapper:tag("span") | |||
:wikitext(string.format("[[Arquivo:%s|%dx%dpx|link=]]", image, w, h)) | |||
else | |||
wrapper:tag("span") | |||
:addClass("item-icon-placeholder") | |||
:attr("title", nome) | |||
:wikitext("") | |||
end | |||
if qty and options.showCount ~= false then | if qty and options.showCount ~= false then | ||
local countSpan = wrapper:tag("span"):addClass("item-count") | local countSpan = wrapper:tag("span"):addClass("item-count") | ||
local isBerries = item.category == " | local isBerries = item.category == "currency" and image | ||
and image:lower():find("berries") | |||
if not isBerries then | if not isBerries then | ||
countSpan:tag("span"):addClass("item-count-x"):wikitext("x") | countSpan:tag("span"):addClass("item-count-x"):wikitext("x") | ||
| Linha 154: | Linha 160: | ||
end | end | ||
local | local passive1 = getPassiveLine(item, "passive1", lang) | ||
if | local passive2 = getPassiveLine(item, "passive2", lang) | ||
local showPassives = item.equipment_special == true and (passive1 or passive2) | |||
local hasDetails = level or showPassives or (desc and not showPassives) or value | |||
if hasDetails then | |||
body:tag("div"):addClass("item-tooltip-sep") | body:tag("div"):addClass("item-tooltip-sep") | ||
end | end | ||
if desc then | if level then | ||
local lvlFull = (lang == "pt") and ("Nível: " .. tostring(level)) | |||
or ("Level: " .. tostring(level)) | |||
body:tag("div"):addClass("item-tooltip-level"):wikitext(lvlFull) | |||
end | |||
if showPassives then | |||
local passWrap = body:tag("div"):addClass("item-tooltip-passives") | |||
if passive1 then | |||
local row = passWrap:tag("div"):addClass("item-tooltip-passive-row") | |||
row:tag("span"):addClass("item-tooltip-passive-badge"):wikitext("1") | |||
row:tag("span"):addClass("item-tooltip-passive-text"):wikitext(passive1) | |||
end | |||
if passive2 then | |||
local row = passWrap:tag("div"):addClass("item-tooltip-passive-row") | |||
row:tag("span"):addClass("item-tooltip-passive-badge"):wikitext("2") | |||
row:tag("span"):addClass("item-tooltip-passive-text"):wikitext(passive2) | |||
end | |||
elseif desc then | |||
body:tag("div"):addClass("item-tooltip-desc"):wikitext(desc) | body:tag("div"):addClass("item-tooltip-desc"):wikitext(desc) | ||
end | end | ||
if value | if value then | ||
local footer = body:tag("div"):addClass("item-tooltip-footer") | local footer = body:tag("div"):addClass("item-tooltip-footer") | ||
local valLabel = (lang == "pt") and "Valor: " or "Value: " | |||
footer:tag("span"):addClass("item-tooltip-val") | |||
:wikitext(valLabel .. formatDots(value)) | |||
end | end | ||
Edição atual tal como às 15h47min de 8 de abril de 2026
A documentação para este módulo pode ser criada em Módulo:Item/doc
local Item = {}
local ItemDB = require("Módulo:ItemDB")
local DEFAULT_LANG = "en"
local FALLBACK_LANG = "pt"
local DEFAULT_FRAME_SIZE = 32
-- Categorias alinhadas ao jogo (ItemDB / editor). Sem duplicata coin/currency nem gem_currency.
local CATEGORY_LABELS = {
general_item = { en = "General Item", pt = "Item geral" },
special_item = { en = "Special Item", pt = "Item especial" },
currency = { en = "Currency", pt = "Moeda" },
cosmetic = { en = "Cosmetic", pt = "Cosmético" },
weapon = { en = "Weapon", pt = "Arma" },
head = { en = "Head", pt = "Cabeça" },
body = { en = "Body", pt = "Corpo" },
legs = { en = "Legs", pt = "Perna" },
accessory = { en = "Accessory", pt = "Acessório" },
emblem = { en = "Emblem", pt = "Emblema" },
ship_style = { en = "Ship Style", pt = "Estilo de navio" },
costume = { en = "Costume", pt = "Traje" },
navigation = { en = "Navigation", pt = "Navegação" },
consumable = { en = "Consumable", pt = "Consumível" },
gem = { en = "Gem", pt = "Gema" },
crystal = { en = "Crystal", pt = "Cristal" },
awakening_stone = { en = "Awakening Stone", pt = "Pedra do Despertar" },
headstone = { en = "Headstone", pt = "Lápide" },
den_den_mushi = { en = "Den Den Mushi", pt = "Den Den Mushi" },
}
local function formatDots(n)
local s = tostring(n)
local pos = #s % 3
if pos == 0 then pos = 3 end
local parts = { s:sub(1, pos) }
for i = pos + 1, #s, 3 do
parts[#parts + 1] = s:sub(i, i + 2)
end
return table.concat(parts, ".")
end
function Item.resolve(query)
if not query or query == "" then return nil end
return ItemDB.get(query)
end
function Item.getName(item, lang)
if not item or not item.names then return "" end
lang = lang or DEFAULT_LANG
return item.names[lang]
or item.names[DEFAULT_LANG]
or item.names[FALLBACK_LANG]
or item.image or ""
end
function Item.getDesc(item, lang)
if not item or not item.desc then return nil end
lang = lang or DEFAULT_LANG
return item.desc[lang]
or item.desc[DEFAULT_LANG]
or item.desc[FALLBACK_LANG]
end
function Item.getValue(item)
if not item then return nil end
return item.value
end
function Item.getLevel(item)
if not item then return nil end
return item.level
end
function Item.getImage(item)
if not item then return nil end
return item.image
end
function Item.getSpriteSize(item)
if item and item.sprite then
return item.sprite.frameWidth or DEFAULT_FRAME_SIZE,
item.sprite.frameHeight or DEFAULT_FRAME_SIZE
end
return DEFAULT_FRAME_SIZE, DEFAULT_FRAME_SIZE
end
function Item.getCategoryLabel(item, lang)
if not item or not item.category then return nil end
local entry = CATEGORY_LABELS[item.category]
if not entry then return nil end
lang = lang or DEFAULT_LANG
return entry[lang] or entry[DEFAULT_LANG] or entry[FALLBACK_LANG] or nil
end
local function getPassiveLine(item, key, lang)
if not item or not item[key] or type(item[key]) ~= "table" then return nil end
local p = item[key]
lang = lang or DEFAULT_LANG
local function pick(lg)
local t = p[lg]
if t and mw.text.trim(tostring(t)) ~= "" then return mw.text.trim(tostring(t)) end
return nil
end
return pick(lang) or pick(DEFAULT_LANG) or pick(FALLBACK_LANG)
end
function Item.renderOne(item, qty, lang, options)
options = options or {}
lang = lang or DEFAULT_LANG
if not item then return "" end
local nome = Item.getName(item, lang)
local desc = Item.getDesc(item, lang)
local image = Item.getImage(item)
local catLabel = Item.getCategoryLabel(item, lang)
local value = Item.getValue(item)
local level = Item.getLevel(item)
local w, h = Item.getSpriteSize(item)
local wrapper = mw.html.create("div")
:addClass("item-wrapper")
:css("width", w .. "px")
:css("height", h .. "px")
if item.category == "special_item" then
wrapper:addClass("item-wrapper-special")
end
if image and mw.text.trim(image) ~= "" then
wrapper:tag("span")
:wikitext(string.format("[[Arquivo:%s|%dx%dpx|link=]]", image, w, h))
else
wrapper:tag("span")
:addClass("item-icon-placeholder")
:attr("title", nome)
:wikitext("")
end
if qty and options.showCount ~= false then
local countSpan = wrapper:tag("span"):addClass("item-count")
local isBerries = item.category == "currency" and image
and image:lower():find("berries")
if not isBerries then
countSpan:tag("span"):addClass("item-count-x"):wikitext("x")
end
countSpan:wikitext(tostring(qty))
end
if options.showTooltip ~= false then
-- div (não span): descrições em wikitext podem virar <p>/blocos; span+bloco
-- quebra o DOM e os próximos .item-wrapper acabam dentro do tooltip.
local tip = wrapper:tag("div"):addClass("item-tooltip")
local body = tip:tag("div"):addClass("item-tooltip-body")
body:tag("div"):addClass("item-tooltip-name"):wikitext(nome)
if catLabel then
body:tag("div"):addClass("item-tooltip-cat"):wikitext(catLabel)
end
local passive1 = getPassiveLine(item, "passive1", lang)
local passive2 = getPassiveLine(item, "passive2", lang)
local showPassives = item.equipment_special == true and (passive1 or passive2)
local hasDetails = level or showPassives or (desc and not showPassives) or value
if hasDetails then
body:tag("div"):addClass("item-tooltip-sep")
end
if level then
local lvlFull = (lang == "pt") and ("Nível: " .. tostring(level))
or ("Level: " .. tostring(level))
body:tag("div"):addClass("item-tooltip-level"):wikitext(lvlFull)
end
if showPassives then
local passWrap = body:tag("div"):addClass("item-tooltip-passives")
if passive1 then
local row = passWrap:tag("div"):addClass("item-tooltip-passive-row")
row:tag("span"):addClass("item-tooltip-passive-badge"):wikitext("1")
row:tag("span"):addClass("item-tooltip-passive-text"):wikitext(passive1)
end
if passive2 then
local row = passWrap:tag("div"):addClass("item-tooltip-passive-row")
row:tag("span"):addClass("item-tooltip-passive-badge"):wikitext("2")
row:tag("span"):addClass("item-tooltip-passive-text"):wikitext(passive2)
end
elseif desc then
body:tag("div"):addClass("item-tooltip-desc"):wikitext(desc)
end
if value then
local footer = body:tag("div"):addClass("item-tooltip-footer")
local valLabel = (lang == "pt") and "Valor: " or "Value: "
footer:tag("span"):addClass("item-tooltip-val")
:wikitext(valLabel .. formatDots(value))
end
tip:tag("div"):addClass("item-tooltip-arrow")
end
return tostring(wrapper)
end
function Item.renderLine(itemList, lang, options)
options = options or {}
lang = lang or DEFAULT_LANG
if not itemList or #itemList == 0 then return "" end
local container = mw.html.create("div")
:addClass("reward-items")
for _, entry in ipairs(itemList) do
container:wikitext(Item.renderOne(entry.item, entry.qty, lang, options))
end
return tostring(container)
end
return Item