<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mbwiki.stairwaygames.work/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AInfoboxMonster</id>
	<title>Module:InfoboxMonster - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mbwiki.stairwaygames.work/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AInfoboxMonster"/>
	<link rel="alternate" type="text/html" href="https://mbwiki.stairwaygames.work/w/index.php?title=Module:InfoboxMonster&amp;action=history"/>
	<updated>2026-04-10T10:45:03Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://mbwiki.stairwaygames.work/w/index.php?title=Module:InfoboxMonster&amp;diff=27911&amp;oldid=prev</id>
		<title>Ais at 11:22, 6 January 2026</title>
		<link rel="alternate" type="text/html" href="https://mbwiki.stairwaygames.work/w/index.php?title=Module:InfoboxMonster&amp;diff=27911&amp;oldid=prev"/>
		<updated>2026-01-06T11:22:13Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://mbwiki.stairwaygames.work/w/index.php?title=Module:InfoboxMonster&amp;amp;diff=27911&amp;amp;oldid=27900&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Ais</name></author>
	</entry>
	<entry>
		<id>https://mbwiki.stairwaygames.work/w/index.php?title=Module:InfoboxMonster&amp;diff=27900&amp;oldid=prev</id>
		<title>Ais: Created page with &quot;-- Module:InfoboxMonster local p = {}  -- Define CSS styles (matching weapon infobox for consistency) local STYLE_FLOATING = &#039;float: right !important; clear: right !important; max-width: 350px !important; margin: 0 0 16px 16px !important; border: 1px solid #7a1a1a !important; border-radius: 10px !important; background-color: #FFFFFF !important; font-size: .9em !important;&#039; local STYLE_HEADER = &#039;background: #7a1a1a !important; color: white !important; padding: 8px 10px !i...&quot;</title>
		<link rel="alternate" type="text/html" href="https://mbwiki.stairwaygames.work/w/index.php?title=Module:InfoboxMonster&amp;diff=27900&amp;oldid=prev"/>
		<updated>2026-01-06T10:59:38Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- Module:InfoboxMonster local p = {}  -- Define CSS styles (matching weapon infobox for consistency) local STYLE_FLOATING = &amp;#039;float: right !important; clear: right !important; max-width: 350px !important; margin: 0 0 16px 16px !important; border: 1px solid #7a1a1a !important; border-radius: 10px !important; background-color: #FFFFFF !important; font-size: .9em !important;&amp;#039; local STYLE_HEADER = &amp;#039;background: #7a1a1a !important; color: white !important; padding: 8px 10px !i...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Module:InfoboxMonster&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Define CSS styles (matching weapon infobox for consistency)&lt;br /&gt;
local STYLE_FLOATING = &amp;#039;float: right !important; clear: right !important; max-width: 350px !important; margin: 0 0 16px 16px !important; border: 1px solid #7a1a1a !important; border-radius: 10px !important; background-color: #FFFFFF !important; font-size: .9em !important;&amp;#039;&lt;br /&gt;
local STYLE_HEADER = &amp;#039;background: #7a1a1a !important; color: white !important; padding: 8px 10px !important; text-align: center !important; font-weight: bold !important; font-size: 1.5em !important; border-top-left-radius: 10px !important; border-top-right-radius: 10px !important;&amp;#039;&lt;br /&gt;
local STYLE_SECTION_TITLE = &amp;#039;padding: 5px 10px !important; color: #4A5568 !important; font-weight: bold !important; border-bottom: 1px solid #A2A9B1 !important; margin: 10px 0 5px 0 !important;&amp;#039;&lt;br /&gt;
local STYLE_DATAROW = &amp;#039;display: flex !important; justify-content: space-between !important; padding: 5px 10px !important; border-bottom: 1px dotted #A2A9B1 !important;&amp;#039;&lt;br /&gt;
local STYLE_DATALABEL = &amp;#039;font-weight: 500 !important; color: #4A5568 !important; width: 40% !important; text-align: left !important;&amp;#039;&lt;br /&gt;
local STYLE_DATAVALUE = &amp;#039;color: #4A5568 !important; text-align: right !important; width: 60% !important;&amp;#039;&lt;br /&gt;
local STYLE_PHASE_HEADER = &amp;#039;background: #f0f0f0 !important; padding: 8px 10px !important; font-weight: bold !important; color: #7a1a1a !important; border-left: 3px solid #7a1a1a !important; margin: 10px 0 5px 0 !important;&amp;#039;&lt;br /&gt;
local STYLE_PHASE_DESC = &amp;#039;padding: 5px 10px 10px 10px !important; color: #4A5568 !important; line-height: 1.4 !important;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- Function to generate a single data row&lt;br /&gt;
local function make_data_row(label, value)&lt;br /&gt;
    if value and value ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        return string.format(&lt;br /&gt;
            &amp;#039;&amp;lt;div style=&amp;quot;%s&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;%s&amp;quot;&amp;gt;%s:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;,&lt;br /&gt;
            STYLE_DATAROW,&lt;br /&gt;
            STYLE_DATALABEL,&lt;br /&gt;
            label,&lt;br /&gt;
            STYLE_DATAVALUE,&lt;br /&gt;
            value&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function to generate phase sections&lt;br /&gt;
local function make_phase_section(phase_num, description)&lt;br /&gt;
    if description and description ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        local html = {}&lt;br /&gt;
        table.insert(html, string.format(&amp;#039;&amp;lt;div style=&amp;quot;%s&amp;quot;&amp;gt;Phase %s&amp;lt;/div&amp;gt;&amp;#039;, STYLE_PHASE_HEADER, phase_num))&lt;br /&gt;
        table.insert(html, string.format(&amp;#039;&amp;lt;div style=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;&amp;#039;, STYLE_PHASE_DESC, description))&lt;br /&gt;
        return table.concat(html, &amp;#039;\n&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function to create category links&lt;br /&gt;
local function make_category_links(args)&lt;br /&gt;
    local categories = {}&lt;br /&gt;
    &lt;br /&gt;
    -- Element category&lt;br /&gt;
    if args.element and args.element ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        table.insert(categories, string.format(&amp;#039;[[Category:%s monsters]]&amp;#039;, args.element))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Type category&lt;br /&gt;
    if args.type and args.type ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        table.insert(categories, string.format(&amp;#039;[[Category:%s type monsters]]&amp;#039;, args.type))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Difficulty category&lt;br /&gt;
    if args.difficulty and args.difficulty ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        table.insert(categories, string.format(&amp;#039;[[Category:%s difficulty monsters]]&amp;#039;, args.difficulty))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Zone category&lt;br /&gt;
    if args.zone and args.zone ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        table.insert(categories, string.format(&amp;#039;[[Category:%s monsters]]&amp;#039;, args.zone))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Size category&lt;br /&gt;
    if args.size and args.size ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        table.insert(categories, string.format(&amp;#039;[[Category:%s monsters]]&amp;#039;, args.size))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Behavior category&lt;br /&gt;
    if args.behavior and args.behavior ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        table.insert(categories, string.format(&amp;#039;[[Category:%s monsters]]&amp;#039;, args.behavior))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(categories, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function to format list items (for drops, weaknesses, etc.)&lt;br /&gt;
local function format_list(value, delimiter)&lt;br /&gt;
    if not value or value == &amp;#039;&amp;#039; then return &amp;#039;&amp;#039; end&lt;br /&gt;
    &lt;br /&gt;
    local items = {}&lt;br /&gt;
    for item in string.gmatch(value, &amp;#039;([^&amp;#039;..delimiter..&amp;#039;]+)&amp;#039;) do&lt;br /&gt;
        item = item:gsub(&amp;#039;^%s*(.-)%s*$&amp;#039;, &amp;#039;%1&amp;#039;) -- trim whitespace&lt;br /&gt;
        if item ~= &amp;#039;&amp;#039; then&lt;br /&gt;
            table.insert(items, string.format(&amp;#039;&amp;lt;li&amp;gt;%s&amp;lt;/li&amp;gt;&amp;#039;, item))&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if #items &amp;gt; 0 then&lt;br /&gt;
        return string.format(&amp;#039;&amp;lt;ul style=&amp;quot;margin: 0 !important; padding-left: 20px !important;&amp;quot;&amp;gt;%s&amp;lt;/ul&amp;gt;&amp;#039;, table.concat(items, &amp;#039;&amp;#039;))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Main function&lt;br /&gt;
function p.infobox(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    &lt;br /&gt;
    -- Use title parameter or page name as default&lt;br /&gt;
    local name = args.title or args.name or frame:getParent().title.text&lt;br /&gt;
    &lt;br /&gt;
    local html = {}&lt;br /&gt;
    &lt;br /&gt;
    -- Start the main infobox container&lt;br /&gt;
    table.insert(html, string.format(&amp;#039;&amp;lt;div class=&amp;quot;monster-infobox&amp;quot; style=&amp;quot;%s&amp;quot;&amp;gt;&amp;#039;, STYLE_FLOATING))&lt;br /&gt;
    &lt;br /&gt;
    -- Header/Title&lt;br /&gt;
    table.insert(html, string.format(&amp;#039;&amp;lt;div class=&amp;quot;monster-header&amp;quot; style=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;&amp;#039;, STYLE_HEADER, name))&lt;br /&gt;
    &lt;br /&gt;
    -- Image Section&lt;br /&gt;
    if args.image and args.image ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        local image_link = string.format(&amp;#039;[[File:%s|300px|alt=%s]]&amp;#039;, args.image, name)&lt;br /&gt;
        table.insert(html, string.format(&amp;#039;&amp;lt;div class=&amp;quot;monster-image&amp;quot; style=&amp;quot;padding: 10px !important; text-align: center !important;&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;&amp;#039;, image_link))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Start Basic Information Section&lt;br /&gt;
    table.insert(html, &amp;#039;&amp;lt;div class=&amp;quot;monster-section&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
    table.insert(html, string.format(&amp;#039;&amp;lt;div class=&amp;quot;section-title&amp;quot; style=&amp;quot;%s&amp;quot;&amp;gt;Basic Information&amp;lt;/div&amp;gt;&amp;#039;, STYLE_SECTION_TITLE))&lt;br /&gt;
    &lt;br /&gt;
    -- Data Rows&lt;br /&gt;
    table.insert(html, make_data_row(&amp;#039;Element&amp;#039;, args.element))&lt;br /&gt;
    table.insert(html, make_data_row(&amp;#039;Type&amp;#039;, args.type))&lt;br /&gt;
    table.insert(html, make_data_row(&amp;#039;Size&amp;#039;, args.size))&lt;br /&gt;
    table.insert(html, make_data_row(&amp;#039;Zone&amp;#039;, args.zone))&lt;br /&gt;
    table.insert(html, make_data_row(&amp;#039;Habitat&amp;#039;, args.habitat))&lt;br /&gt;
    table.insert(html, make_data_row(&amp;#039;Difficulty&amp;#039;, args.difficulty))&lt;br /&gt;
    table.insert(html, make_data_row(&amp;#039;Behavior&amp;#039;, args.behavior))&lt;br /&gt;
    table.insert(html, make_data_row(&amp;#039;HP&amp;#039;, args.hp))&lt;br /&gt;
    table.insert(html, make_data_row(&amp;#039;Attack&amp;#039;, args.attack))&lt;br /&gt;
    table.insert(html, make_data_row(&amp;#039;Defense&amp;#039;, args.defense))&lt;br /&gt;
    table.insert(html, make_data_row(&amp;#039;Magic&amp;#039;, args.magic))&lt;br /&gt;
    table.insert(html, make_data_row(&amp;#039;Speed&amp;#039;, args.speed))&lt;br /&gt;
    table.insert(html, make_data_row(&amp;#039;EXP&amp;#039;, args.exp))&lt;br /&gt;
    table.insert(html, make_data_row(&amp;#039;Gold&amp;#039;, args.gold))&lt;br /&gt;
    &lt;br /&gt;
    table.insert(html, &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;) -- End basic info section&lt;br /&gt;
    &lt;br /&gt;
    -- Weaknesses Section&lt;br /&gt;
    if args.weaknesses and args.weaknesses ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        table.insert(html, &amp;#039;&amp;lt;div class=&amp;quot;monster-section&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
        table.insert(html, string.format(&amp;#039;&amp;lt;div class=&amp;quot;section-title&amp;quot; style=&amp;quot;%s&amp;quot;&amp;gt;Weaknesses&amp;lt;/div&amp;gt;&amp;#039;, STYLE_SECTION_TITLE))&lt;br /&gt;
        table.insert(html, format_list(args.weaknesses, &amp;#039;,&amp;#039;))&lt;br /&gt;
        table.insert(html, &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Resistances Section&lt;br /&gt;
    if args.resistances and args.resistances ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        table.insert(html, &amp;#039;&amp;lt;div class=&amp;quot;monster-section&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
        table.insert(html, string.format(&amp;#039;&amp;lt;div class=&amp;quot;section-title&amp;quot; style=&amp;quot;%s&amp;quot;&amp;gt;Resistances&amp;lt;/div&amp;gt;&amp;#039;, STYLE_SECTION_TITLE))&lt;br /&gt;
        table.insert(html, format_list(args.resistances, &amp;#039;,&amp;#039;))&lt;br /&gt;
        table.insert(html, &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Drops Section&lt;br /&gt;
    if args.drops and args.drops ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        table.insert(html, &amp;#039;&amp;lt;div class=&amp;quot;monster-section&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
        table.insert(html, string.format(&amp;#039;&amp;lt;div class=&amp;quot;section-title&amp;quot; style=&amp;quot;%s&amp;quot;&amp;gt;Drops&amp;lt;/div&amp;gt;&amp;#039;, STYLE_SECTION_TITLE))&lt;br /&gt;
        table.insert(html, format_list(args.drops, &amp;#039;,&amp;#039;))&lt;br /&gt;
        table.insert(html, &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Phases Section&lt;br /&gt;
    if args.phase1 or args.phase2 or args.phase3 or args.phase4 then&lt;br /&gt;
        table.insert(html, &amp;#039;&amp;lt;div class=&amp;quot;monster-section&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
        table.insert(html, string.format(&amp;#039;&amp;lt;div class=&amp;quot;section-title&amp;quot; style=&amp;quot;%s&amp;quot;&amp;gt;Battle Phases&amp;lt;/div&amp;gt;&amp;#039;, STYLE_SECTION_TITLE))&lt;br /&gt;
        &lt;br /&gt;
        table.insert(html, make_phase_section(&amp;#039;1&amp;#039;, args.phase1))&lt;br /&gt;
        table.insert(html, make_phase_section(&amp;#039;2&amp;#039;, args.phase2))&lt;br /&gt;
        table.insert(html, make_phase_section(&amp;#039;3&amp;#039;, args.phase3))&lt;br /&gt;
        table.insert(html, make_phase_section(&amp;#039;4&amp;#039;, args.phase4))&lt;br /&gt;
        &lt;br /&gt;
        table.insert(html, &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Description/Behavior Section&lt;br /&gt;
    if args.description and args.description ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        table.insert(html, &amp;#039;&amp;lt;div class=&amp;quot;monster-section&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
        table.insert(html, string.format(&amp;#039;&amp;lt;div class=&amp;quot;section-title&amp;quot; style=&amp;quot;%s&amp;quot;&amp;gt;Description &amp;amp; Behavior&amp;lt;/div&amp;gt;&amp;#039;, STYLE_SECTION_TITLE))&lt;br /&gt;
        table.insert(html, string.format(&amp;#039;&amp;lt;div style=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;&amp;#039;, STYLE_PHASE_DESC, args.description))&lt;br /&gt;
        table.insert(html, &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Tactics Section&lt;br /&gt;
    if args.tactics and args.tactics ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        table.insert(html, &amp;#039;&amp;lt;div class=&amp;quot;monster-section&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
        table.insert(html, string.format(&amp;#039;&amp;lt;div class=&amp;quot;section-title&amp;quot; style=&amp;quot;%s&amp;quot;&amp;gt;Combat Tactics&amp;lt;/div&amp;gt;&amp;#039;, STYLE_SECTION_TITLE))&lt;br /&gt;
        table.insert(html, string.format(&amp;#039;&amp;lt;div style=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;&amp;#039;, STYLE_PHASE_DESC, args.tactics))&lt;br /&gt;
        table.insert(html, &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- End container&lt;br /&gt;
    table.insert(html, &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;) -- End monster-infobox&lt;br /&gt;
    &lt;br /&gt;
    -- Add categories (hidden from display, for wiki organization)&lt;br /&gt;
    table.insert(html, &amp;#039;\n&amp;lt;!-- Categories --&amp;gt;\n&amp;#039; .. make_category_links(args))&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(html, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Ais</name></author>
	</entry>
</feed>