Module:Atlas

From Path of Exile Wiki
Jump to navigation Jump to search

--
-- Module for atlas tables and functions
--
-- Certain properties are tied to maps more closely and are handeled in Module:Item2

local m_cargo = require('Module:Cargo')
local m_util = require('Module:Util')
local getArgs = require('Module:Arguments').getArgs
local f_item_link = require('Module:Item link').item_link

local p = {}

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

local i18n = {
    headers = {
        region = 'Atlas Region',
        white = 'White maps (T1-T5)',
        yellow = 'Yellow maps (T6-T10)',
        red = 'Red maps (T11+)',
    },
}

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

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

tables.atlas_regions = {
    table = 'atlas_regions',
    order = {'id', 'name'},
    fields = {
        id = {
            field = 'id',
            type = 'String',
        },
        name = {
            field = 'name',
            type = 'String',
        },
    },
}

tables.atlas_base_item_types = {
    table = 'atlas_base_item_types',
    order = {'region_id', 'tier_min', 'tier_max', 'tag', 'weight'},
    fields = {
        region_id = {
            field = 'region_id',
            type = 'String',
        },
        tier_min = {
            field = 'tier_min',
            type = 'Integer',
        },
        tier_max = {
            field = 'tier_max',
            type = 'Integer',
        },
        tag = {
            field = 'tag',
            type = 'String',
        },
        weight = {
            field = 'weight',
            type = 'Integer',
        },
        
    },
}
-- ----------------------------------------------------------------------------
-- Page functions
-- ----------------------------------------------------------------------------

local p = {}

p.table_atlas_regions = m_cargo.declare_factory{data=tables.atlas_regions}
p.table_atlas_base_item_types = m_cargo.declare_factory{data=tables.atlas_base_item_types}

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

function p.atlas_base_item_types_per_region(frame)
    -- Get args
    local tpl_args = getArgs(frame, {
        parentFirst = true
    })
    local frame = m_util.misc.get_frame(frame)
    
    local query = {
        join='items._ID=items__tags._rowID, items__tags._value=atlas_base_item_types.tag, atlas_base_item_types.region_id=atlas_regions.id',
        where='atlas_regions.id IS NOT NULL AND items.rarity_id="normal"',
        orderBy='atlas_regions.name ASC, atlas_base_item_types.tier_min ASC, items.name ASC',
    }
    
    if tpl_args.where then
        query.where = string.format('%s AND (%s)', query.where, tpl_args.where)
    end
    
    local results=m_cargo.query(
        {
            'items',
            'items__tags',
            'atlas_base_item_types', 
            'atlas_regions', 
        },
        {
            'atlas_regions.name',
            'atlas_base_item_types.tier_min',
            'atlas_base_item_types.tier_max',
            'items.name',
            'items._pageName',
            'items.inventory_icon',
            'items.html',
        },
        query
    )
    
    local tbl = mw.html.create('table')
    tbl
        :attr('class', 'wikitable sortable')
        :tag('tr')
            :tag('th')
                :wikitext(i18n.headers.region)
                :done()
            :tag('th')
                :wikitext(i18n.headers.white)
                :done()
            :tag('th')
                :wikitext(i18n.headers.yellow)
                :done()
            :tag('th')
                :wikitext(i18n.headers.red)
                :done()
    
    local lastrow
    
    local regions_order = {}
    local regions = {}
    local tiers = {
        [1] = 5,
        [6] = 10,
        [11] = 16,
    }
    
    for _, row in ipairs(results) do
        local region = regions[row['atlas_regions.name']]
        if region == nil then
            table.insert(regions_order, row['atlas_regions.name'])
            regions[row['atlas_regions.name']] = {
                [1] = {},
                [6] = {},
                [11] = {},
            }
            region = regions[row['atlas_regions.name']]
        end
        
        for tier, items in pairs(region) do
            if tonumber(row['atlas_base_item_types.tier_min']) <= tier and tonumber(row['atlas_base_item_types.tier_max']) >= tiers[tier] then
                -- I use pageName here because I think it makes it easier to tell which boots are which as opposed to hovering over them or the tiny icons
                table.insert(items, f_item_link{page=row['items._pageName'], name=row['items._pageName'], inventory_icon=row['items.inventory_icon'] or '', html=row['items.html'] or '', skip_query=true})
            end
        end
    end
    
    for _, region_name in ipairs(regions_order) do
        local region = regions[region_name]
        local tr = tbl:tag('tr')
        tr
            :tag('td')
                :wikitext(string.format('[[%s]]', region_name))
                :done()
        for _, tier in ipairs({1, 6, 11}) do
            tr
                :tag('td')
                    :wikitext(table.concat(region[tier], '<br>') or '&nbsp;')
                    :done()
        end
    end
    
    return tostring(tbl)
end

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

return p