Module:Bestiary: Difference between revisions

From Path of Exile Wiki
Jump to navigation Jump to search
>OmegaK2
(Switched to the new function from cargo module)
No edit summary
 
(6 intermediate revisions by 3 users not shown)
Line 1: Line 1:
--
-------------------------------------------------------------------------------
-- Module for bestiary templates
--  
--
--                                Module:Bestiary
--
-- This module implements Template:Bestiary and Template:Beastcrafting recipes.
-------------------------------------------------------------------------------


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


local p = {}
-- 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
-- Strings
-- 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 = {
local i18n = cfg.i18n
    errors = {
        invalid_table = 'Table supplied is invalid',
    },
}
 
--mw.loadData('Module:QuestReward/vendor_reward_data')


-- ----------------------------------------------------------------------------
-- ----------------------------------------------------------------------------
-- Helper functions and globals
-- Cargo tables
-- ----------------------------------------------------------------------------
 
-- ----------------------------------------------------------------------------
-- Cargo
-- ----------------------------------------------------------------------------
-- ----------------------------------------------------------------------------


Line 49: Line 43:
             field = 'notes',
             field = 'notes',
             type = 'Text',
             type = 'Text',
        },
        game_mode = {
            field = 'game_mode',
            type = 'Integer',
         },
         },
     },
     },
Line 62: Line 60:
         min_level = {
         min_level = {
             field = 'min_level',
             field = 'min_level',
             type = 'Intenger',
             type = 'Integer',
         },
         },
         rarity = {
         rarity = {
Line 111: Line 109:


-- ----------------------------------------------------------------------------
-- ----------------------------------------------------------------------------
-- Page functions
-- Main functions
-- ----------------------------------------------------------------------------
-- ----------------------------------------------------------------------------


local p = {}
local function _recipe_table(args)
 
    args.game_mode = args.game_mode or 'normal'
p.table_bestiary_recipes = m_cargo.declare_factory{data=tables.recipes}
    if cfg.game_modes[args.game_mode] == nil then
p.table_bestiary_components = m_cargo.declare_factory{data=tables.components}
        error(i18n.errors.invalid_game_mode)
p.table_bestiary_recipe_components = m_cargo.declare_factory{data=tables.recipe_components}
    end
 
    local tables = {'bestiary_recipes', 'bestiary_recipe_components', 'bestiary_components', 'mods'}
p.store_data = m_cargo.store_from_lua{tables=tables, module='Bestiary'}
    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)


function p.recipe_table(frame)
     local order = m_cargo.query(
    -- Get args
    tpl_args = getArgs(frame, {
        parentFirst = true
    })
    frame = m_util.misc.get_frame(frame)
   
    local results = m_util.cargo.query(
        {'bestiary_recipes', 'bestiary_recipe_components', 'bestiary_components', 'mods'},
        {
            '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',
        },
        {
            join='bestiary_recipes.id=bestiary_recipe_components.recipe_id, bestiary_recipe_components.component_id=bestiary_components.id, bestiary_components.mod_id=mods.id',
            limit=9999,
        }
    )
   
     local order = m_util.cargo.query(
         {'bestiary_recipes'},
         {'bestiary_recipes'},
         {'bestiary_recipes.id'},
         {'bestiary_recipes.id'},
Line 160: Line 155:
     )
     )
      
      
     results = m_util.cargo.map_results_to_id{results=results, field='bestiary_recipes.id'}
     results = m_cargo.map_results_to_id{results=results, field='bestiary_recipes.id'}
      
      
     local tbl = mw.html.create('table')
     local tbl = mw.html.create('table')
     tbl
     tbl
         :attr('class', 'wikitable sortable')
         :addClass('wikitable sortable')
         :tag('tr')
         :tag('tr')
             :tag('th')
             :tag('th')
                 :wikitext('Header')
                 :wikitext(i18n.recipe_table.category)
                 :done()
                 :done()
             :tag('th')
             :tag('th')
                 :wikitext('Subheader')
                 :wikitext(i18n.recipe_table.description)
                 :done()
                 :done()
             :tag('th')
             :tag('th')
                 :wikitext('Notes')
                 :wikitext(i18n.recipe_table.notes)
                 :done()
                 :done()
             :tag('th')
             :tag('th')
                 :wikitext('Components')
                 :wikitext(i18n.recipe_table.components)
                 :done()
                 :done()
                  
                  
     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'] 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
           
               
            for _, key in ipairs({'bestiary_components.rarity',
                if component['bestiary_components.family'] ~= 'Any Creature' then
                                  'bestiary_components.family',
                    components[#components] = components[#components] .. '[['
                                  'bestiary_components.beast_group',
                end
                                  'bestiary_components.genus',
               
                                  'bestiary_components.monster'}) do
                for _, key in ipairs({'bestiary_components.rarity',
                 if component[key] then
                                      'bestiary_components.family',
                     components[#components] = components[#components] .. component[key] .. ' '
                                      '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
             end
             end
              
       
            if component['mods.name'] then
             tbl
                components[#components] = components[#components] .. string.format('with modifier "%s"', component['mods.name'])
                :tag('tr')
            end
                    :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
       
        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
      
      
Line 225: Line 229:


-- ----------------------------------------------------------------------------
-- ----------------------------------------------------------------------------
-- 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
return p

Latest revision as of 01:15, 25 March 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
                
                for _, key in ipairs({'bestiary_components.rarity',
                                      '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