Module:Blight/sandbox: Difference between revisions

From Path of Exile Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
 
(One intermediate revision by the same user not shown)
Line 184: Line 184:
                 ]], tpl_args.q_where or 1),
                 ]], tpl_args.q_where or 1),
                 limit=tpl_args.q_limit or 5000,
                 limit=tpl_args.q_limit or 5000,
                orderBy = 'blight_crafting_recipes_items.ordinal ASC',
             }
             }
         ),
         ),

Latest revision as of 14:20, 10 September 2023

This is the module sandbox page for Module:Blight (diff).

Module documentation[view] [edit] [history] [purge]


Lua logo

This module depends on the following other modules:

Module for handling blight related data.

Templates

Subpages

No results


--
-- Module for bestiary templates
--

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

local m_passive_skill = require('Module:Passive skill')

local f_item_link = require('Module:Item link').item_link

local p = {}

-- ----------------------------------------------------------------------------
-- Strings
-- ----------------------------------------------------------------------------

local i18n = {
    headers = {
        id = 'Recipe ID',
        type = 'Recipe Type',
        oil1 = 'Oil #1',
        oil2 = 'Oil #2',
        oil3 = 'Oil #3',
        outcome = 'Outcome',
    },
    cells = {
        -- directly map data type to string
        InfectedMap = 'Infected map',
        UniqueOrAmulet = 'Amulet<br>Blight unique',
        Ring = 'Ring',
    },
}

-- ----------------------------------------------------------------------------
-- Helper functions and globals
-- ----------------------------------------------------------------------------

-- ----------------------------------------------------------------------------
-- Cargo tables
-- ----------------------------------------------------------------------------
local tables = {}

tables.blight_towers = {
    table = 'blight_towers',
    order = {'id'},
    fields = {
        id = {
            field = 'id',
            type = 'String',
        },
        name = {
            field = 'name',
            type = 'String',
        },
        description = {
            field = 'description',
            type = 'String',
        },
        tier = {
            field = 'tier',
            type = 'String',
        },
        icon = {
            field = 'icon',
            type = 'File',
        },
        cost = {
            field = 'cost',
            type = 'Integer'
        },
        radius = {
            field = 'radius',
            type = 'Integer',
        },
    },
}

-- next two tables are a composite of the following files
--  BlightCraftingItems.dat
--  BlightCraftingRecipes.dat
--  BlightCraftingResults.dat
--  BlightCraftingTypes.dat
tables.blight_crafting_recipes = {
    table = 'blight_crafting_recipes',
    order = {'id', 'modifier_id', 'passive_id', 'type'},
    fields = {
        id = {
            field = 'id',
            type = 'String',
        },
        modifier_id = {
            field = 'modifier_id',
            type = 'String',
        },
        passive_id = {
            field = 'passive_id',
            type = 'String',
        },
        type = {
            field = 'type',
            type = 'String',
        },
    },
}

tables.blight_crafting_recipes_items = {
    table = 'blight_crafting_recipes_items',
    order = {'ordinal', 'recipe_id', 'item_id'},
    fields = {
        ordinal = {
            field = 'ordinal',
            type = 'Integer',
        },
        recipe_id = {
            field = 'recipe_id',
            type = 'String',
        },
        item_id = {
            field = 'item_id',
            type = 'String',
        },
    },
}
-- ----------------------------------------------------------------------------
-- Page functions
-- ----------------------------------------------------------------------------

local p = {}

p.table_blight_towers = m_cargo.declare_factory{data=tables.blight_towers}
p.table_blight_crafting_recipes = m_cargo.declare_factory{data=tables.blight_crafting_recipes}
p.table_blight_crafting_recipes_items = m_cargo.declare_factory{data=tables.blight_crafting_recipes_items}

p.store_data = m_cargo.store_from_lua{tables=tables, module='Blight'}

function p.crafting_table(frame)
    -- Get args
    local tpl_args = getArgs(frame, {
        parentFirst = true
    })
    frame = m_util.misc.get_frame(frame)
    
    for _, bool in ipairs({'id', 'type', 'no_html'}) do
        tpl_args[bool] = m_util.cast.boolean(tpl_args[bool])
    end
    
    local results = m_cargo.map_results_to_id{
        results=m_cargo.query(
            {
                'blight_crafting_recipes', 
                'blight_crafting_recipes_items', 
                'mods', 
                'passive_skills'
            },
            {
                'blight_crafting_recipes.id',
                'blight_crafting_recipes.type',
                'blight_crafting_recipes_items.item_id',
                'mods._pageName',
                'mods.id',
                'mods.name',
                'mods.stat_text',
                'passive_skills._pageName', 
                'passive_skills.id',
                'passive_skills.stat_text',
                'passive_skills.main_page',
                'passive_skills.name',
                'passive_skills.icon',
                'passive_skills.is_keystone',
                'passive_skills.is_notable',
                'passive_skills.ascendancy_class',
            },
            {
                join=[[
                    blight_crafting_recipes_items.recipe_id = blight_crafting_recipes.id,
                    blight_crafting_recipes.modifier_id = mods.id,
                    blight_crafting_recipes.passive_id = passive_skills.id
                ]],
                where=string.format([[
                    blight_crafting_recipes_items.item_id IS NOT NULL
                    AND (%s)
                ]], tpl_args.q_where or 1),
                limit=tpl_args.q_limit or 5000,
                orderBy = 'blight_crafting_recipes_items.ordinal ASC',
            }
        ),
        field='blight_crafting_recipes.id',
        keep_id_field=true,
    }
    local item_ids_assoc = {}
    for _, rows in pairs(results) do
        for _, row in ipairs(rows) do
            item_ids_assoc[row['blight_crafting_recipes_items.item_id']] = true
        end
    end
    
    local item_ids = {}
    for metadata_id, _ in pairs(item_ids_assoc) do
        item_ids[#item_ids+1] = metadata_id
    end
        
    local items = m_cargo.map_results_to_id{
            results=m_cargo.query(
            {'items', 'blight_items',},
            {
                'items._pageName',
                'items.name',
                'items.inventory_icon',
                'items.html',
                'items.metadata_id',
                'blight_items.tier',
            },
            {
                join='items._pageID=blight_items._pageID',
                where=string.format('items.metadata_id IN ("%s")', table.concat(item_ids, '", "')), 
            }
        ),
        field='items.metadata_id',
        keep_id_field=true,
    }
    
    local tbl = mw.html.create('table')
    
    tbl
        :attr('class', 'wikitable sortable')
    
    local tr = tbl:tag('tr')
    for _, bool in ipairs({'id', 'type'}) do
        if tpl_args[bool] then
            tr
                :tag('th')
                    :wikitext(i18n.headers[bool])
                    :done()
        end
     end
     tr
        :tag('th')
            :wikitext(i18n.headers.oil1)
            :done()
        :tag('th')
            :wikitext(i18n.headers.oil2)
            :done()
        :tag('th')
            :wikitext(i18n.headers.oil3)
            :done()
        :tag('th')
            :wikitext(i18n.headers.outcome)
            :attr('colspan', 2)
            :done()
        :done()
    
    for recipe_id, rows in pairs(results) do
        local row1 = rows[1] 
        local tr = tbl:tag('tr')
        
        if tpl_args.id then
            tr
                :tag('td')
                    :wikitext(recipe_id)
                    :done()
        end
        
        if tpl_args.type then
            tr
                :tag('td')
                    :wikitext(i18n.cells[row1['blight_crafting_recipes.type']])
                    :done()
        end
                
        for i=1,3 do
            local row = rows[i]
            if row then
                local item = items[row['blight_crafting_recipes_items.item_id']][1]
                local html
                if tpl_args.no_html == false then
                    html = item['items.html']
                end
                tr
                    :tag('td')
                        :attr('data-sort-value', item['blight_items.tier'])
                        :wikitext(f_item_link{page=item['items._pageName'], name=item['items.name'], inventory_icon=item['items.inventory_icon'], html=html or '', skip_query=true})
                        :done()
            else
                tr
                    :tag('td')
                        :attr('data-sort-value', -1)
                        :wikitext('&nbsp;')
                        :done()
            end
        end
        
        if row1['mods.id'] then
            tr
                :tag('td')
                    --:wikitext(string.format('[[%s|%s]]<br>%s', row1['mods._pageName'], row1['mods.id'] or row1['mods.name'], row1['mods.stat_text']))
                    :wikitext(row1['mods.stat_text'])
                    :attr('colspan', 2)
                    :done()
        elseif row1['passive_skills.id'] then
            tr
                :tag('td')
                    :attr('style', 'text-align: center;')
                    :attr('data-sort-value', '_' .. row1['passive_skills.name'])
                    :wikitext(string.format('[[%s|%s]]<br>%s', row1['passive_skills.main_page'] or row1['passive_skills.name'], row1['passive_skills.name'], m_passive_skill.h.format_passive_icon(row1, m_passive_skill.h.get_type(row1))))
                    :done()
                :tag('td')
                    :wikitext(row1['passive_skills.stat_text'])
                    :done()
                :done()
        end
    end
    
    
    --
    return tostring(tbl)
end

-- ----------------------------------------------------------------------------
-- End
-- ----------------------------------------------------------------------------

return p