From Official Arms of God Wiki

bot: per-category shim over Module:Core (render-time)
Tag: Replaced
No edit summary
 
(One intermediate revision by one other user not shown)
Line 1: Line 1:
-- Module:Enemies — per-category shim (Arms of God).
-- All computation lives in Module:Core (render-time derivation from the
-- source Data:Enemies.json); this module only binds the category name.
local Core = require('Module:Core')
local Core = require('Module:Core')
local p = {}
local p = {}
local CAT = 'Enemies'
local CAT = 'Enemies'


-- {{#invoke:Enemies|infobox|id=<slug-or-id>}}
function p.infobox(frame)
function p.infobox(frame) return Core.infoboxEntry(CAT, frame) end
    return Core.infoboxEntry(CAT, frame)
end


-- {{#invoke:Enemies|body|id=<slug-or-id>[|section=<name>]}}
function p.body(frame)
function p.body(frame) return Core.bodyEntry(CAT, frame) end
    return Core.bodyEntry(CAT, frame)
end


-- {{#invoke:Enemies|crossRefs|id=<slug-or-id>}}
function p.crossRefs(frame)
function p.crossRefs(frame)
  return require('Module:CrossRef').entry(CAT, frame)
    return require('Module:CrossRef').entry(CAT, frame)
end
 
function p.index(frame)
    return Core.indexEntry(CAT, frame)
end
 
function p.render(frame)
    return Core.renderEntry(CAT, frame)
end
end


-- {{#invoke:Enemies|index}} — the category index table
local function plain(value)
function p.index(frame) return Core.indexEntry(CAT, frame) end
    return mw.text.nowiki(tostring(value or ''))
end


-- {{#invoke:Enemies|render|id=<slug-or-id>}} — combined fallback
local function number(value)
function p.render(frame) return Core.renderEntry(CAT, frame) end
    if value == nil then return '—' end
 
    local n = tonumber(value)
    if not n then return plain(value) end
 
    local s = string.format('%.2f', n)
    s = s:gsub('0+$', ''):gsub('%.$', '')
    return s
end
 
local function findRecord(key)
    for _, rec in ipairs(Core.load(CAT)) do
        if rec.id == key or rec.slug == key or rec.name == key then
            return rec
        end
    end
end
 
function p.profile(frame)
    local key = mw.text.trim(frame.args.id or frame.args[1] or '')
    local rec = findRecord(key)
 
    if not rec then
        return tostring(
            mw.html.create('strong')
                :addClass('error')
                :wikitext('Enemy not found: ' .. plain(key))
        )
    end
 
    local root = mw.html.create('div')
        :addClass('aog-enemy-profile')
 
    local main = root:tag('div')
        :addClass('aog-enemy-main')
 
    if rec.icon and rec.icon ~= '' then
        local art = '[[File:' .. rec.icon
            .. '|frameless|600x600px|alt='
            .. rec.name .. ']]'
 
        main:tag('div')
            :addClass('aog-enemy-art')
            :wikitext(frame:preprocess(art))
    end
 
    if rec.description and rec.description ~= '' then
        main:tag('p')
            :addClass('aog-enemy-lore')
            :wikitext(plain(rec.description))
    end
 
    if rec.tactics and rec.tactics ~= '' then
        main:tag('p')
            :addClass('aog-enemy-label')
            :wikitext('Combat tips')
 
        main:tag('p')
            :wikitext(plain(rec.tactics))
    end
 
    if rec.notes and #rec.notes > 0 then
        local list = main:tag('ul')
            :addClass('aog-enemy-notes')
 
        for _, note in ipairs(rec.notes) do
            list:tag('li'):wikitext(plain(note))
        end
    end
 
    local aside = root:tag('div')
        :addClass('aog-enemy-aside')
 
    local stats = aside:tag('table')
        :addClass('wikitable aog-enemy-stats')
 
    stats:tag('caption'):wikitext(plain(rec.name))
 
    local function row(label, value)
        local tr = stats:tag('tr')
 
        tr:tag('th')
            :attr('scope', 'row')
            :wikitext(label)
 
        tr:tag('td'):wikitext(value)
    end
 
    local classes = {}
    local labels = {
        Melee = 'Melee',
        Range = 'Ranged',
        Big = 'Big',
        Boss = 'Boss'
    }
 
    for _, tag in ipairs(rec.tags or {}) do
        classes[#classes + 1] = plain(labels[tag] or tag)
    end
 
    if #classes > 0 then
        row('Classification', table.concat(classes, ', '))
    end
 
    local st = rec.stats or {}
 
    row('Base health', number(st.Health))
    row('Health per wave', number(st['HP per Wave']))
    row('Base damage', number(st.Damage))
    row('Damage per wave', number(st['Damage per Wave']))
    row('Speed', number(st.Speed))
    row('Resources', number(st.Resources))
 
    aside:tag('p')
        :addClass('aog-enemy-stat-note')
        :wikitext(
            'Base parameters. Actual combat values depend on wave, '
            .. 'difficulty and other modifiers.'
        )
 
    return tostring(root)
end


return p
return p

Latest revision as of 12:39, 3 November 2026

Renders Enemies records from Data:Enemies.json on index and detail pages.

  • infobox — infobox for one record (used via Template:Enemies infobox)
  • index — sortable index table on Enemies
  • body / crossRefs — per-section renderers invoked from detail pages

Bot-published: the module and its Data: page are regenerated on re-publish. Restyle via the per-section templates rather than editing page wikitext.


local Core = require('Module:Core')
local p = {}
local CAT = 'Enemies'

function p.infobox(frame)
    return Core.infoboxEntry(CAT, frame)
end

function p.body(frame)
    return Core.bodyEntry(CAT, frame)
end

function p.crossRefs(frame)
    return require('Module:CrossRef').entry(CAT, frame)
end

function p.index(frame)
    return Core.indexEntry(CAT, frame)
end

function p.render(frame)
    return Core.renderEntry(CAT, frame)
end

local function plain(value)
    return mw.text.nowiki(tostring(value or ''))
end

local function number(value)
    if value == nil then return '—' end

    local n = tonumber(value)
    if not n then return plain(value) end

    local s = string.format('%.2f', n)
    s = s:gsub('0+$', ''):gsub('%.$', '')
    return s
end

local function findRecord(key)
    for _, rec in ipairs(Core.load(CAT)) do
        if rec.id == key or rec.slug == key or rec.name == key then
            return rec
        end
    end
end

function p.profile(frame)
    local key = mw.text.trim(frame.args.id or frame.args[1] or '')
    local rec = findRecord(key)

    if not rec then
        return tostring(
            mw.html.create('strong')
                :addClass('error')
                :wikitext('Enemy not found: ' .. plain(key))
        )
    end

    local root = mw.html.create('div')
        :addClass('aog-enemy-profile')

    local main = root:tag('div')
        :addClass('aog-enemy-main')

    if rec.icon and rec.icon ~= '' then
        local art = '[[File:' .. rec.icon
            .. '|frameless|600x600px|alt='
            .. rec.name .. ']]'

        main:tag('div')
            :addClass('aog-enemy-art')
            :wikitext(frame:preprocess(art))
    end

    if rec.description and rec.description ~= '' then
        main:tag('p')
            :addClass('aog-enemy-lore')
            :wikitext(plain(rec.description))
    end

    if rec.tactics and rec.tactics ~= '' then
        main:tag('p')
            :addClass('aog-enemy-label')
            :wikitext('Combat tips')

        main:tag('p')
            :wikitext(plain(rec.tactics))
    end

    if rec.notes and #rec.notes > 0 then
        local list = main:tag('ul')
            :addClass('aog-enemy-notes')

        for _, note in ipairs(rec.notes) do
            list:tag('li'):wikitext(plain(note))
        end
    end

    local aside = root:tag('div')
        :addClass('aog-enemy-aside')

    local stats = aside:tag('table')
        :addClass('wikitable aog-enemy-stats')

    stats:tag('caption'):wikitext(plain(rec.name))

    local function row(label, value)
        local tr = stats:tag('tr')

        tr:tag('th')
            :attr('scope', 'row')
            :wikitext(label)

        tr:tag('td'):wikitext(value)
    end

    local classes = {}
    local labels = {
        Melee = 'Melee',
        Range = 'Ranged',
        Big = 'Big',
        Boss = 'Boss'
    }

    for _, tag in ipairs(rec.tags or {}) do
        classes[#classes + 1] = plain(labels[tag] or tag)
    end

    if #classes > 0 then
        row('Classification', table.concat(classes, ', '))
    end

    local st = rec.stats or {}

    row('Base health', number(st.Health))
    row('Health per wave', number(st['HP per Wave']))
    row('Base damage', number(st.Damage))
    row('Damage per wave', number(st['Damage per Wave']))
    row('Speed', number(st.Speed))
    row('Resources', number(st.Resources))

    aside:tag('p')
        :addClass('aog-enemy-stat-note')
        :wikitext(
            'Base parameters. Actual combat values depend on wave, '
            .. 'difficulty and other modifiers.'
        )

    return tostring(root)
end

return p