Module:RaceData: Difference between revisions

From MB Wiki
Jump to navigation Jump to search
mNo edit summary
mNo edit summary
Line 1: Line 1:
local p = {}
-- Function to get race info with hover infobox - SIMPLER VERSION
 
local categoryColors = {
    ["Standard"] = "#4CAF50",     
    ["Elven"] = "#9C27B0",       
    ["Minx"] = "#FF9800",         
    ["Feline"] = "#795548",       
    ["Dwarven"] = "#607D8B",     
    ["Banished"] = "#F44336",     
    ["Demonic"] = "#9C27B0",     
    ["Aquatic"] = "#2196F3",     
    ["Hybrid"] = "#FF5722",       
}
 
local raceData = {
    ["Banished (Frog)"] = {
        displayName = "Banished (Frog)",
        category = "Banished",
        subrace = "Frog",
        color = "#F44336",
        description = "Frog-like banished creatures with amphibious abilities."
    },
   
    ["Human"] = {
        displayName = "Human",
        category = "Standard",
        color = "#4CAF50",
        description = "Standard human race with versatile capabilities."
    },
   
    ["Banished (Armor Spirit)"] = {
        displayName = "Banished (Armor Spirit)",
        category = "Banished",
        subrace = "Armor Spirit",
        color = "#F44336",
        description = "Spiritual beings bound to armor, cast out from their realm."
    },
   
    ["Minx (Dragon-kin)"] = {
        displayName = "Minx (Dragon-kin)",
        category = "Minx",
        subrace = "Dragon-kin",
        color = "#FF9800",
        description = "Dragon-blooded minx with draconic features."
    },
   
    ["Mortal"] = {
        displayName = "Mortal",
        category = "Standard",
        color = "#4CAF50",
        description = "Mortal beings with finite lifespans and diverse backgrounds."
    },
   
    ["Minx"] = {
        displayName = "Minx",
        category = "Minx",
        subrace = "Base",
        color = "#FF9800",
        description = "Base minx race with feline characteristics."
    },
   
    ["Elf"] = {
        displayName = "Elf",
        category = "Elven",
        color = "#9C27B0",
        description = "Elegant, long-lived beings with affinity for nature and magic."
    },
   
    ["Banished (Giant)"] = {
        displayName = "Banished (Giant)",
        category = "Banished",
        subrace = "Giant",
        color = "#F44336",
        description = "Gigantic banished beings with immense strength."
    },
   
    ["Minx (Tiger)"] = {
        displayName = "Minx (Tiger)",
        category = "Minx",
        subrace = "Tiger",
        color = "#FF9800",
        description = "Tiger-striped minx with predatory instincts."
    },
   
    ["Minx (Moon Cat)"] = {
        displayName = "Minx (Moon Cat)",
        category = "Minx",
        subrace = "Moon Cat",
        color = "#FF9800",
        description = "Lunar-aligned minx with mystical abilities."
    },
   
    ["Minx-Giant"] = {
        displayName = "Minx-Giant",
        category = "Hybrid",
        subrace = "Minx-Giant",
        color = "#FF5722",
        description = "Hybrid of Minx and Giant characteristics."
    },
   
    ["Mortal/Vampire"] = {
        displayName = "Mortal/Vampire",
        category = "Hybrid",
        subrace = "Mortal-Vampire",
        color = "#FF5722",
        description = "Hybrid beings with both mortal and vampiric traits."
    },
   
    ["Fox Minx"] = {
        displayName = "Fox Minx",
        category = "Minx",
        subrace = "Fox",
        color = "#FF9800",
        description = "Fox-like minx with cunning and agility."
    },
   
    ["Gothic Demon"] = {
        displayName = "Gothic Demon",
        category = "Demonic",
        subrace = "Gothic",
        color = "#9C27B0",
        description = "Dark, gothic-themed demonic beings."
    },
   
    ["Felinyan"] = {
        displayName = "Felinyan",
        category = "Feline",
        color = "#795548",
        description = "Feline humanoids with graceful movements."
    },
   
    ["Dwarf"] = {
        displayName = "Dwarf",
        category = "Dwarven",
        color = "#607D8B",
        description = "Stout, sturdy beings skilled in craftsmanship."
    },
   
    ["Banished"] = {
        displayName = "Banished",
        category = "Banished",
        color = "#F44336",
        description = "Beings cast out from their original realms."
    },
   
    ["Demonkind"] = {
        displayName = "Demonkind",
        category = "Demonic",
        color = "#9C27B0",
        description = "Demonic beings with infernal powers."
    },
   
    ["Siren"] = {
        displayName = "Siren",
        category = "Aquatic",
        subrace = "Moon Priestess",
        color = "#2196F3",
        description = "Aquatic beings with enchanting voices and lunar connections."
    }
}
 
-- Helper function to get light color variant
function p.getLightColor(hexColor)
    if not hexColor or hexColor:len() ~= 7 then
        return "#F8F9FA"
    end
   
    -- Convert hex to RGB
    local r = tonumber(hexColor:sub(2, 3), 16)
    local g = tonumber(hexColor:sub(4, 5), 16)
    local b = tonumber(hexColor:sub(6, 7), 16)
   
    if not r or not g or not b then
        return "#F8F9FA"
    end
   
    -- Lighten by mixing with white (80% white, 20% original)
    r = math.floor(r * 0.2 + 255 * 0.8)
    g = math.floor(g * 0.2 + 255 * 0.8)
    b = math.floor(b * 0.2 + 255 * 0.8)
   
    return string.format("#%02X%02X%02X", r, g, b)
end
 
-- Helper function to darken color
function p.darkenColor(hexColor, percent)
    percent = percent or 20
   
    if not hexColor or hexColor:len() ~= 7 then
        return "#333333"
    end
   
    local r = tonumber(hexColor:sub(2, 3), 16)
    local g = tonumber(hexColor:sub(4, 5), 16)
    local b = tonumber(hexColor:sub(6, 7), 16)
   
    if not r or not g or not b then
        return "#333333"
    end
   
    r = math.floor(r * (100 - percent) / 100)
    g = math.floor(g * (100 - percent) / 100)
    b = math.floor(b * (100 - percent) / 100)
   
    return string.format("#%02X%02X%02X", r, g, b)
end
 
-- Function to get race data
function p.getRace(frame)
    local raceName = frame.args[1] or mw.text.trim(frame:getParent().args[1] or "")
   
    if raceName == "" then
        return "Error: No race name provided"
    end
   
    local race = raceData[raceName]
   
    if not race then
        return "Error: Race '" .. raceName .. "' not found in database"
    end
   
    return race
end
 
-- Function to get race info with hover infobox (for Template:RaceInfo) - UPDATED
function p.getRaceInfo(frame)
function p.getRaceInfo(frame)
     local raceName = frame.args[1] or mw.text.trim(frame:getParent().args[1] or "")
     local raceName = frame.args[1] or mw.text.trim(frame:getParent().args[1] or "")
      
      
     if raceName == "" then
     if raceName == "" then
         return "<span class='race-error'>Unknown Race</span>[[Category:Unknown Race]]"
         return '<span class="race-error">Unknown Race</span>[[Category:Unknown Race]]'
     end
     end
      
      
Line 234: Line 10:
      
      
     if not race then
     if not race then
         return "<span class='race-error'>Race Not Found</span>[[Category:Unknown Race]]"
         return '<span class="race-error">Race Not Found</span>[[Category:Unknown Race]]'
     end
     end
      
      
Line 241: Line 17:
     local darkColor = p.darkenColor(color, 20)
     local darkColor = p.darkenColor(color, 20)
      
      
     local output = ""
     local output = {}
   
    -- Create hover container
    output = output .. '<div class="race-hover-container">\n'
   
    -- The clickable race link - goes to race page
    output = output .. '<span class="race-hover-trigger">\n'
    output = output .. '<a href="/wiki/' .. mw.uri.encode(race.displayName) .. ' (Race)" class="race-link-inline" style="color: ' .. color .. ';">\n'
    output = output .. race.displayName .. '\n'
    output = output .. '</a>\n'
    output = output .. '</span>\n'
   
    -- The hidden infobox that appears on hover
    output = output .. '<div class="race-hover-infobox" style="border-color: ' .. color .. ';">\n'
    output = output .. '<div class="race-hover-header" style="background: linear-gradient(135deg, ' .. color .. ' 0%, ' .. darkColor .. ' 100%);">\n'
    output = output .. '<h4>' .. race.displayName .. '</h4>\n'
    output = output .. '</div>\n'
    output = output .. '<div class="race-hover-content" style="background-color: ' .. lightColor .. ';">\n'
    output = output .. '<table class="race-hover-table">\n'
    output = output .. '<tr><td><strong>Category:</strong></td><td><span class="category-badge-small" style="background-color: ' .. color .. ';">' .. race.category .. '</span></td></tr>\n'
   
    if race.subrace then
        output = output .. '<tr><td><strong>Subrace:</strong></td><td>' .. race.subrace .. '</td></tr>\n'
    end
   
    if race.description then
        output = output .. '<tr><td colspan="2" style="padding-top: 10px; font-size: 0.9em; line-height: 1.4; color: #555;">' .. race.description .. '</td></tr>\n'
    end
   
    output = output .. '</table>\n'
    output = output .. '<div class="race-hover-footer">\n'
    output = output .. '<a href="/wiki/' .. mw.uri.encode(race.displayName) .. ' (Race)" class="view-full-link" style="background-color: ' .. color .. ';">View Full Race Page</a>\n'
    output = output .. '</div>\n'
    output = output .. '</div>\n'
    output = output .. '</div>\n'
    output = output .. '</div>\n'
      
      
     -- Add category for character
     table.insert(output, '<div class="race-hover-container">')
    output = output .. "\n[[Category:" .. race.category .. " Characters]]"
    output = output .. "\n[[Category:" .. race.displayName .. " Characters]]"
      
      
     return output
     -- The clickable race link
end
    table.insert(output, '<span class="race-hover-trigger">')
 
     table.insert(output, '<a href="/wiki/' .. mw.uri.encode(race.displayName) .. ' (Race)" class="race-link-inline" style="color: ' .. color .. ';">')
-- Function to get race infobox for race pages
    table.insert(output, race.displayName)
function p.getRaceInfobox(frame)
    table.insert(output, '</a>')
     local raceName = frame.args[1] or mw.text.trim(frame:getParent().args[1] or "")
    table.insert(output, '</span>')
      
      
     if raceName == "" then
     -- The hidden infobox
        return "Error: No race name provided"
    table.insert(output, '<div class="race-hover-infobox" style="border-color: ' .. color .. ';">')
    end
   
    local race = raceData[raceName]
   
    if not race then
        return "Error: Race '" .. raceName .. "' not found"
    end
      
      
     local color = race.color or categoryColors[race.category] or "#666666"
     -- Header
     local lightColor = p.getLightColor(color)
    table.insert(output, '<div class="race-hover-header" style="background: linear-gradient(135deg, ' .. color .. ' 0%, ' .. darkColor .. ' 100%);">')
     local darkColor = p.darkenColor(color, 20)
     table.insert(output, '<h4>' .. race.displayName .. '</h4>')
     table.insert(output, '</div>')
      
      
     local output = ""
     -- Content
    table.insert(output, '<div class="race-hover-content" style="background-color: ' .. lightColor .. ';">')
    table.insert(output, '<table class="race-hover-table">')
      
      
     output = output .. '<div class="race-full-infobox" style="border-color: ' .. color .. ';">\n'
     -- Category row
     output = output .. '<div class="race-full-header" style="background: linear-gradient(135deg, ' .. color .. ' 0%, ' .. darkColor .. ' 100%);">\n'
     table.insert(output, '<tr><td><strong>Category:</strong></td><td><span class="category-badge-small" style="background-color: ' .. color .. ';">' .. race.category .. '</span></td></tr>')
    output = output .. '<h2>Race Information</h2>\n'
    output = output .. '</div>\n'
    output = output .. '<div class="race-full-content" style="background-color: ' .. lightColor .. ';">\n'
    output = output .. '<div class="race-badge-large" style="background-color: ' .. color .. ';">' .. race.category .. '</div>\n'
    output = output .. '<table class="race-full-table">\n'
    output = output .. '<tr><td><strong>Race Name:</strong></td><td>' .. race.displayName .. '</td></tr>\n'
    output = output .. '<tr><td><strong>Category:</strong></td><td><span class="category-tag-large" style="background-color: ' .. color .. ';">' .. race.category .. '</span></td></tr>\n'
      
      
    -- Subrace row (if exists)
     if race.subrace then
     if race.subrace then
         output = output .. '<tr><td><strong>Subrace:</strong></td><td>' .. race.subrace .. '</td></tr>\n'
         table.insert(output, '<tr><td><strong>Subrace:</strong></td><td>' .. race.subrace .. '</td></tr>')
     end
     end
      
      
    -- Description row (if exists)
     if race.description then
     if race.description then
         output = output .. '<tr><td><strong>Description:</strong></td><td>' .. race.description .. '</td></tr>\n'
         table.insert(output, '<tr><td colspan="2" style="padding-top: 10px; font-size: 0.9em; line-height: 1.4; color: #555;">' .. race.description .. '</td></tr>')
     end
     end
      
      
     output = output .. '</table>\n'
     table.insert(output, '</table>')
    output = output .. '<div class="race-characters-section">\n'
    output = output .. '<h3>Characters of this Race</h3>\n'
    output = output .. '<div class="category-list">\n'
    output = output .. '{{#categorytree:' .. race.displayName .. ' Characters|depth=1|mode=pages}}\n'
    output = output .. '</div>\n'
    output = output .. '</div>\n'
    output = output .. '</div>\n'
    output = output .. '</div>\n'
      
      
     return output
     -- Footer
end
    table.insert(output, '<div class="race-hover-footer">')
 
     table.insert(output, '<a href="/wiki/' .. mw.uri.encode(race.displayName) .. ' (Race)" class="view-full-link" style="background-color: ' .. color .. ';">View Full Race Page</a>')
-- Function to get all races in a category
    table.insert(output, '</div>')
function p.getRaceCategory(frame)
     local category = frame.args[1] or mw.text.trim(frame:getParent().args[1] or "")
      
      
     if category == "" then
     table.insert(output, '</div>') -- Close content
        return "Error: No category specified"
    table.insert(output, '</div>') -- Close infobox
     end
     table.insert(output, '</div>') -- Close container
      
      
     local output = "== " .. category .. " Races ==\n\n"
     -- Add categories
     local found = false
     table.insert(output, '\n[[Category:' .. race.category .. ' Characters]]')
   
    table.insert(output, '\n[[Category:' .. race.displayName .. ' Characters]]')
    for raceName, race in pairs(raceData) do
        if race.category == category then
            found = true
            local color = race.color or categoryColors[race.category] or "#666666"
            output = output .. '=== <span style="color: ' .. color .. ';">' .. race.displayName .. '</span> ===\n'
            output = output .. '* [[' .. race.displayName .. ' (Race)|View Race Page]]\n'
            output = output .. '* [[:Category:' .. race.displayName .. ' Characters|View ' .. race.displayName .. ' Characters]]\n\n'
        end
    end
   
    if not found then
        return "Error: Category '" .. category .. "' not found or has no races"
    end
      
      
     return output
     return table.concat(output, '')
end
end
return p

Revision as of 09:40, 21 January 2026

Documentation for this module may be created at Module:RaceData/doc

-- Function to get race info with hover infobox - SIMPLER VERSION
function p.getRaceInfo(frame)
    local raceName = frame.args[1] or mw.text.trim(frame:getParent().args[1] or "")
    
    if raceName == "" then
        return '<span class="race-error">Unknown Race</span>[[Category:Unknown Race]]'
    end
    
    local race = raceData[raceName]
    
    if not race then
        return '<span class="race-error">Race Not Found</span>[[Category:Unknown Race]]'
    end
    
    local color = race.color or categoryColors[race.category] or "#666666"
    local lightColor = p.getLightColor(color)
    local darkColor = p.darkenColor(color, 20)
    
    local output = {}
    
    table.insert(output, '<div class="race-hover-container">')
    
    -- The clickable race link
    table.insert(output, '<span class="race-hover-trigger">')
    table.insert(output, '<a href="/wiki/' .. mw.uri.encode(race.displayName) .. ' (Race)" class="race-link-inline" style="color: ' .. color .. ';">')
    table.insert(output, race.displayName)
    table.insert(output, '</a>')
    table.insert(output, '</span>')
    
    -- The hidden infobox
    table.insert(output, '<div class="race-hover-infobox" style="border-color: ' .. color .. ';">')
    
    -- Header
    table.insert(output, '<div class="race-hover-header" style="background: linear-gradient(135deg, ' .. color .. ' 0%, ' .. darkColor .. ' 100%);">')
    table.insert(output, '<h4>' .. race.displayName .. '</h4>')
    table.insert(output, '</div>')
    
    -- Content
    table.insert(output, '<div class="race-hover-content" style="background-color: ' .. lightColor .. ';">')
    table.insert(output, '<table class="race-hover-table">')
    
    -- Category row
    table.insert(output, '<tr><td><strong>Category:</strong></td><td><span class="category-badge-small" style="background-color: ' .. color .. ';">' .. race.category .. '</span></td></tr>')
    
    -- Subrace row (if exists)
    if race.subrace then
        table.insert(output, '<tr><td><strong>Subrace:</strong></td><td>' .. race.subrace .. '</td></tr>')
    end
    
    -- Description row (if exists)
    if race.description then
        table.insert(output, '<tr><td colspan="2" style="padding-top: 10px; font-size: 0.9em; line-height: 1.4; color: #555;">' .. race.description .. '</td></tr>')
    end
    
    table.insert(output, '</table>')
    
    -- Footer
    table.insert(output, '<div class="race-hover-footer">')
    table.insert(output, '<a href="/wiki/' .. mw.uri.encode(race.displayName) .. ' (Race)" class="view-full-link" style="background-color: ' .. color .. ';">View Full Race Page</a>')
    table.insert(output, '</div>')
    
    table.insert(output, '</div>') -- Close content
    table.insert(output, '</div>') -- Close infobox
    table.insert(output, '</div>') -- Close container
    
    -- Add categories
    table.insert(output, '\n[[Category:' .. race.category .. ' Characters]]')
    table.insert(output, '\n[[Category:' .. race.displayName .. ' Characters]]')
    
    return table.concat(output, '')
end