Module:Bestiary: Difference between revisions

From Path of Exile Wiki
Jump to navigation Jump to search
(Added option to specify game mode)
(If rarity equals "Unique", don't output the rarity in front of the monster's name)
 
(One intermediate revision by the same user not shown)
Line 176: Line 176:
     for _, order_row in ipairs(order) do
     for _, order_row in ipairs(order) do
         local row = results[order_row['bestiary_recipes.id']]
         local row = results[order_row['bestiary_recipes.id']]
          
         if row then
        local components = {}
            local components = {}
        for _, component in ipairs(row) do
            for _, component in ipairs(row) do
            components[#components+1] = string.format('%sx ', component['bestiary_recipe_components.amount'])
                components[#components+1] = string.format('%sx ', component['bestiary_recipe_components.amount'])
           
               
            if component['bestiary_components.min_level'] and component['bestiary_components.min_level'] ~= '0' then
                if component['bestiary_components.min_level'] and component['bestiary_components.min_level'] ~= '0' then
                components[#components] = components[#components] .. string.format('level %s+ ', component['bestiary_components.min_level'])
                    components[#components] = components[#components] .. string.format('level %s+ ', component['bestiary_components.min_level'])
            end
                end
           
               
            if component['bestiary_components.family'] ~= 'Any Creature' then
                if component['bestiary_components.family'] ~= 'Any Creature' then
                components[#components] = components[#components] .. '[['
                    components[#components] = components[#components] .. '[['
            end
                end
           
 
            for _, key in ipairs({'bestiary_components.rarity',
                if component['bestiary_components.rarity'] and component['bestiary_components.rarity'] ~= 'Unique' then
                                  'bestiary_components.family',
                    components[#components] = components[#components] .. component['bestiary_components.rarity'] .. ' '
                                  'bestiary_components.beast_group',
                end
                                  'bestiary_components.genus',
               
                                  'bestiary_components.monster'}) do
                for _, key in ipairs({'bestiary_components.family',
                 if component[key] then
                                      'bestiary_components.beast_group',
                     components[#components] = components[#components] .. component[key] .. ' '
                                      'bestiary_components.genus',
                                      'bestiary_components.monster'}) do
                    if component[key] then
                        components[#components] = components[#components] .. component[key] .. ' '
                    end
                end
               
                 if component['bestiary_components.family'] ~= 'Any Creature' then
                     components[#components] = components[#components] .. ']]'
                end
               
                if component['mods.name'] then
                    components[#components] = components[#components] .. string.format('with modifier "%s"', component['mods.name'])
                 end
                 end
             end
             end
              
       
            if component['bestiary_components.family'] ~= 'Any Creature' then
             tbl
                components[#components] = components[#components] .. ']]'
                :tag('tr')
            end
                    :tag('td')
           
                        :wikitext(row[1]['bestiary_recipes.header'] or '')
            if component['mods.name'] then
                        :done()
                components[#components] = components[#components] .. string.format('with modifier "%s"', component['mods.name'])
                    :tag('td')
            end
                        :wikitext(row[1]['bestiary_recipes.subheader'] or '')
                        :done()
                    :tag('td')
                        :wikitext(row[1]['bestiary_recipes.notes'] or '')
                        :done()
                    :tag('td')
                        :wikitext(table.concat(components, '<br>'))
                        :done()
         end
         end
       
        tbl
            :tag('tr')
                :tag('td')
                    :wikitext(row[1]['bestiary_recipes.header'] or '')
                    :done()
                :tag('td')
                    :wikitext(row[1]['bestiary_recipes.subheader'] or '')
                    :done()
                :tag('td')
                    :wikitext(row[1]['bestiary_recipes.notes'] or '')
                    :done()
                :tag('td')
                    :wikitext(table.concat(components, '<br>'))
                    :done()
     end
     end
      
      

Latest revision as of 14:30, 26 May 2024

-------------------------------------------------------------------------------
-- 
--                                Module:Bestiary
-- 
-- This module implements Template:Bestiary and Template:Beastcrafting recipes.
-------------------------------------------------------------------------------

require('Module:No globals')
local m_util = require('Module:Util')
local m_cargo = require('Module:Cargo')

-- Should we use the sandbox version of our submodules?
local use_sandbox = m_util.misc.maybe_sandbox('Bestiary')

-- The cfg table contains all localisable strings and configuration, to make it
-- easier to port this module to another wiki.
local cfg = use_sandbox and mw.loadData('Module:Bestiary/config/sandbox') or mw.loadData('Module:Bestiary/config')

local i18n = cfg.i18n

-- ----------------------------------------------------------------------------
-- Cargo tables
-- ----------------------------------------------------------------------------

local tables = {}

tables.recipes = {
    table = 'bestiary_recipes',
    fields = {
        id = {
            field = 'id',
            type = 'String',
        },
        header = {
            field = 'header',
            type = 'Text',
        },
        subheader = {
            field = 'subheader',
            type = 'Text',
        },
        notes = {
            field = 'notes',
            type = 'Text',
        },
        game_mode = {
            field = 'game_mode',
            type = 'Integer',
        },
    },
}

tables.components = {
    table = 'bestiary_components',
    fields = {
        id = {
            field = 'id',
            type = 'String',
        },
        min_level = {
            field = 'min_level',
            type = 'Integer',
        },
        rarity = {
            field = 'rarity',
            type = 'String',
        },
        family = {
            field = 'family',
            type = 'String',
        },
        -- cargo is complaining. Rename to group when able
        beast_group = {
            field = 'beast_group',
            type = 'String',
        },
        genus = {
            field = 'genus',
            type = 'String',
        },
        mod_id = {
            field = 'mod_id',
            type = 'String',
        },
        monster = {
            field = 'monster',
            type = 'String',
        },
    },
}

tables.recipe_components = {
    table = 'bestiary_recipe_components',
    fields = {
        recipe_id = {
            field = 'recipe_id',
            type = 'String',
        },
        component_id = {
            field = 'component_id',
            type = 'String',
        },
        amount = {
            field = 'amount',
            type = 'Integer',
        },
    },
}

-- ----------------------------------------------------------------------------
-- Main functions
-- ----------------------------------------------------------------------------

local function _recipe_table(args)
    args.game_mode = args.game_mode or 'normal'
    if cfg.game_modes[args.game_mode] == nil then
        error(i18n.errors.invalid_game_mode)
    end
    local tables = {'bestiary_recipes', 'bestiary_recipe_components', 'bestiary_components', 'mods'}
    local fields = {
        'bestiary_recipes.id',
        'bestiary_recipes.header',
        'bestiary_recipes.subheader',
        'bestiary_recipes.notes',
        'bestiary_recipe_components.amount',
        'bestiary_components.min_level',
        'bestiary_components.rarity',
        'bestiary_components.family',
        'bestiary_components.beast_group',
        'bestiary_components.genus',
        'bestiary_components.monster',
        'mods.name',
    }
    local query = {
        join = table.concat({
            'bestiary_recipes.id = bestiary_recipe_components.recipe_id',
            'bestiary_recipe_components.component_id = bestiary_components.id',
            'bestiary_components.mod_id = mods.id',
        }, ', '),
        where = string.format(
            'bestiary_recipes.game_mode = %s',
            cfg.game_modes[args.game_mode]
        ),
        limit = 9999,
    }
    local results = m_cargo.query(tables, fields, query)

    local order = m_cargo.query(
        {'bestiary_recipes'},
        {'bestiary_recipes.id'},
        {
            limit=9999,
            orderBy='bestiary_recipes.header, bestiary_recipes.subheader',
        }
    )
    
    results = m_cargo.map_results_to_id{results=results, field='bestiary_recipes.id'}
    
    local tbl = mw.html.create('table')
    tbl
        :addClass('wikitable sortable')
        :tag('tr')
            :tag('th')
                :wikitext(i18n.recipe_table.category)
                :done()
            :tag('th')
                :wikitext(i18n.recipe_table.description)
                :done()
            :tag('th')
                :wikitext(i18n.recipe_table.notes)
                :done()
            :tag('th')
                :wikitext(i18n.recipe_table.components)
                :done()
                
    for _, order_row in ipairs(order) do
        local row = results[order_row['bestiary_recipes.id']]
        if row then
            local components = {}
            for _, component in ipairs(row) do
                components[#components+1] = string.format('%sx ', component['bestiary_recipe_components.amount'])
                
                if component['bestiary_components.min_level'] and component['bestiary_components.min_level'] ~= '0' then
                    components[#components] = components[#components] .. string.format('level %s+ ', component['bestiary_components.min_level'])
                end
                
                if component['bestiary_components.family'] ~= 'Any Creature' then
                    components[#components] = components[#components] .. '[['
                end

                if component['bestiary_components.rarity'] and component['bestiary_components.rarity'] ~= 'Unique' then
                    components[#components] = components[#components] .. component['bestiary_components.rarity'] .. ' '
                end
                
                for _, key in ipairs({'bestiary_components.family',
                                      'bestiary_components.beast_group',
                                      'bestiary_components.genus',
                                      'bestiary_components.monster'}) do
                    if component[key] then
                        components[#components] = components[#components] .. component[key] .. ' '
                    end
                end
                
                if component['bestiary_components.family'] ~= 'Any Creature' then
                    components[#components] = components[#components] .. ']]'
                end
                
                if component['mods.name'] then
                    components[#components] = components[#components] .. string.format('with modifier "%s"', component['mods.name'])
                end
            end
        
            tbl
                :tag('tr')
                    :tag('td')
                        :wikitext(row[1]['bestiary_recipes.header'] or '')
                        :done()
                    :tag('td')
                        :wikitext(row[1]['bestiary_recipes.subheader'] or '')
                        :done()
                    :tag('td')
                        :wikitext(row[1]['bestiary_recipes.notes'] or '')
                        :done()
                    :tag('td')
                        :wikitext(table.concat(components, '<br>'))
                        :done()
        end
    end
    
    return tostring(tbl)
end

-- ----------------------------------------------------------------------------
-- Exported functions
-- ----------------------------------------------------------------------------

local p = {}

p.table_bestiary_recipes = m_cargo.declare_factory{data=tables.recipes}
p.table_bestiary_components = m_cargo.declare_factory{data=tables.components}
p.table_bestiary_recipe_components = m_cargo.declare_factory{data=tables.recipe_components}
p.store_data = m_cargo.store_from_lua{tables=tables, module='Bestiary'}

-- 
-- Template:Beastcrafting recipes
-- 
p.recipe_table = m_util.misc.invoker_factory(_recipe_table, {
    wrappers = cfg.wrappers.recipe_table,
})

return p