Module:Bestiary: Difference between revisions

From Path of Exile Wiki
Jump to navigation Jump to search
>Wonderfl
(add links to beasts (only if the beast is not 'Any Beast'))
(If rarity equals "Unique", don't output the rarity in front of the monster's name)
 
(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')
-- ----------------------------------------------------------------------------
-- Strings
-- ----------------------------------------------------------------------------
 
local i18n = {
    errors = {
        invalid_table = 'Table supplied is invalid',
    },
}


--mw.loadData('Module:QuestReward/vendor_reward_data')
-- 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
-- Helper functions and globals
-- ----------------------------------------------------------------------------


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


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'
    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)


p.table_bestiary_recipes = m_cargo.declare_factory{data=tables.recipes}
     local order = m_cargo.query(
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'}
 
function p.recipe_table(frame)
    -- 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'] 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
      
      
Line 233: Line 232:


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