Jump to content

Module:GetEffect: Difference between revisions

From Untitled Monster Game
imported>Ziebster
No edit summary
imported>Ziebster
No edit summary
Line 21: Line 21:
     -- Normalize statName for case-insensitive matching
     -- Normalize statName for case-insensitive matching
     local normalizedStat = statName:lower()
     local normalizedStat = statName:lower()
   
    local debugOutput = 'Debug Info:\n'
    debugOutput = debugOutput .. 'Extracted effect: ' .. effect .. '\n'
    debugOutput = debugOutput .. 'Normalized stat: ' .. normalizedStat .. '\n'
      
      
     -- Split the effect into comma-separated parts
     -- Split the effect into comma-separated parts
Line 30: Line 26:
     for _, part in ipairs(parts) do
     for _, part in ipairs(parts) do
         part = mw.text.trim(part)
         part = mw.text.trim(part)
        debugOutput = debugOutput .. 'Part: ' .. part .. '\n'
         -- First, try range pattern: +number stat to <number (optional (paren))
       
         -- Standard pattern debug
        local num, percent, key = part:match('^([+-]?[%d%.]+)(%%?)%s+(.*)$')
        if num and key then
            debugOutput = debugOutput .. 'Standard match: num=' .. num .. ', percent=' .. (percent or '') .. ', key=' .. key .. '\n'
        else
            debugOutput = debugOutput .. 'Standard match: no match\n'
        end
       
        -- Range pattern debug
         local num1, stat, less_than, num2, paren = part:match('^([+-]?[%d%.]+)%s+([%w%.]+)%s+to%s*(<)?([%d%.]+)%s*(%b())?$')
         local num1, stat, less_than, num2, paren = part:match('^([+-]?[%d%.]+)%s+([%w%.]+)%s+to%s*(<)?([%d%.]+)%s*(%b())?$')
         if num1 and stat and num2 then
         if num1 and stat and num2 then
             debugOutput = debugOutput .. 'Range match: num1=' .. num1 .. ', stat=' .. stat .. ', less_than=' .. (less_than or '') .. ', num2=' .. num2 .. ', paren=' .. (paren or '') .. '\n'
             local normStat = stat:lower()
        else
            if normStat == normalizedStat then
             debugOutput = debugOutput .. 'Range match: no match\n'
                -- Strip leading '+' from num1 if present
                if num1:sub(1,1) == '+' then
                    num1 = num1:sub(2)
                end
                -- Reconstruct the range: "num1 to <num2" (less_than is optional)
                local range = num1 .. ' to ' .. (less_than or '') .. num2
                return mw.text.trim(range)
             end
         end
         end
    end
         -- If not, try standard pattern: +number%? stat (e.g., +15 W.PWR, +15% CRIT, +1.5 Speed)
   
    -- Split the effect into comma-separated parts
    local parts = mw.text.split(effect, ',')
    for _, part in ipairs(parts) do
        part = mw.text.trim(part)
         -- First, try standard pattern: +number%? stat (e.g., +15 W.PWR, +15% CRIT, +1.5 Speed)
         local num, percent, key = part:match('^([+-]?[%d%.]+)(%%?)%s+(.*)$')
         local num, percent, key = part:match('^([+-]?[%d%.]+)(%%?)%s+(.*)$')
         if num and key then
         if num and key then
Line 63: Line 50:
                 end
                 end
                 return num
                 return num
            end
        end
        -- If not, try range pattern: +number stat to <number (optional (paren))
        local num1, stat, less_than, num2, paren = part:match('^([+-]?[%d%.]+)%s+([%w%.]+)%s+to%s*(<)?([%d%.]+)%s*(%b())?$')
        if num1 and stat and num2 then
            local normStat = stat:lower()
            if normStat == normalizedStat then
                -- Strip leading '+' from num1 if present
                if num1:sub(1,1) == '+' then
                    num1 = num1:sub(2)
                end
                -- Reconstruct the range: "num1 to <num2" (less_than is optional)
                local range = num1 .. ' to ' .. (less_than or '') .. num2
                return mw.text.trim(range)
             end
             end
         end
         end
     end
     end
      
      
     -- If not found, return debug output instead of empty string
     -- If not found, return empty string
     return debugOutput
     return ''
end
end


return p
return p

Revision as of 20:19, 9 February 2026

Example usage here:


local p = {}

function p.getEffect(frame)
    local pageName = frame.args[1] or mw.title.getCurrentTitle().text
    local statName = frame.args[2]
    
    local page = mw.title.new(pageName)
    if not page then
        return 'Page not found'
    end
    
    local content = page:getContent()
    local effect = content:match('|%s*effects%s*=%s*(.-)\n%s*|') or content:match('|%s*effects%s*=%s*(.-)%s*}}') or ''
    effect = mw.text.trim(effect)
    
    if not statName or statName == '' then
        -- Return full effect if no stat specified
        return effect
    end
    
    -- Normalize statName for case-insensitive matching
    local normalizedStat = statName:lower()
    
    -- Split the effect into comma-separated parts
    local parts = mw.text.split(effect, ',')
    for _, part in ipairs(parts) do
        part = mw.text.trim(part)
        -- First, try range pattern: +number stat to <number (optional (paren))
        local num1, stat, less_than, num2, paren = part:match('^([+-]?[%d%.]+)%s+([%w%.]+)%s+to%s*(<)?([%d%.]+)%s*(%b())?$')
        if num1 and stat and num2 then
            local normStat = stat:lower()
            if normStat == normalizedStat then
                -- Strip leading '+' from num1 if present
                if num1:sub(1,1) == '+' then
                    num1 = num1:sub(2)
                end
                -- Reconstruct the range: "num1 to <num2" (less_than is optional)
                local range = num1 .. ' to ' .. (less_than or '') .. num2
                return mw.text.trim(range)
            end
        end
        -- If not, try standard pattern: +number%? stat (e.g., +15 W.PWR, +15% CRIT, +1.5 Speed)
        local num, percent, key = part:match('^([+-]?[%d%.]+)(%%?)%s+(.*)$')
        if num and key then
            local normKey = mw.text.trim(key):lower()
            if normKey == normalizedStat then
                -- Strip leading '+' if present
                if num:sub(1,1) == '+' then
                    num = num:sub(2)
                end
                return num
            end
        end
    end
    
    -- If not found, return empty string
    return ''
end

return p