Module:Skills/Cartography: Difference between revisions

m
Added note that overlapping features must go in Skills/Archaeology
(Digsites now get linked from the table)
m (Added note that overlapping features must go in Skills/Archaeology)
 
(12 intermediate revisions by 4 users not shown)
Line 1: Line 1:
--New module for Cartography-related tables
--Unavoidably has some overlap with Module:Skills/Archaeology
--Crucially, stuff that involves both MUST go in Module:Skills/Archaeology
--Because otherwise we get circular references, which are Not Fun.
local p = {}
local p = {}


Line 8: Line 12:
local Common = require('Module:Common')
local Common = require('Module:Common')
local Icons = require('Module:Icons')
local Icons = require('Module:Icons')
p.MelvorMap = GameData.getEntityByID(SkillData.Cartography.worldMaps, 'melvorAoD:Melvor')


function p.getPointOfInterestByID(id)
function p.getPointOfInterestByID(id)
for i, POI in pairs(SkillData.Cartography.worldMaps[1].pointsOfInterest) do
for i, POI in pairs(p.MelvorMap.pointsOfInterest) do
if POI.id == id then
if POI.id == id then
return POI
end
end
return nil
end
function p.getPointOfInterestByXY(X, Y)
local hex = p.getHexByXY(X, Y)
if hex == nil then
return nil
end
for i, POI in pairs(p.MelvorMap.pointsOfInterest) do
if (POI.coords.q == hex.coordinates.q and
    POI.coords.r == hex.coordinates.r) then
return POI
return POI
end
end
Line 19: Line 40:


function p.getPointOfInterestForDigSite(digSiteID)
function p.getPointOfInterestForDigSite(digSiteID)
for i, POI in pairs(SkillData.Cartography.worldMaps[1].pointsOfInterest) do
for i, POI in pairs(p.MelvorMap.pointsOfInterest) do
if POI.digSiteID ~= nil and POI.digSiteID == digSiteID then
if POI.digSiteID ~= nil and POI.digSiteID == digSiteID then
return POI
return POI
Line 30: Line 51:
name = string.gsub(name, "%%27", "'")
name = string.gsub(name, "%%27", "'")
name = string.gsub(name, "'", "'")
name = string.gsub(name, "'", "'")
for i, POI in pairs(SkillData.Cartography.worldMaps[1].pointsOfInterest) do
for i, POI in pairs(p.MelvorMap.pointsOfInterest) do
if POI.name == name then
if POI.name == name then
return POI
return POI
Line 40: Line 61:
function p.getPointsOfInterest(checkFunc)
function p.getPointsOfInterest(checkFunc)
local result = {}
local result = {}
for i, POI in pairs(SkillData.Cartography.worldMaps[1].pointsOfInterest) do
for i, POI in pairs(p.MelvorMap.pointsOfInterest) do
if checkFunc(POI) then
if checkFunc(POI) then
table.insert(result, POI)
table.insert(result, POI)
end
end
return result
end
function p.getMasteryBonuses(checkFunc)
local result = {}
for i, bonus in pairs(p.MelvorMap.masteryBonuses) do
if checkFunc(bonus) then
table.insert(result, bonus)
end
end
end
end
Line 55: Line 86:
end
end
for i, hex in pairs(SkillData.Cartography.worldMaps[1].hexes) do
for i, hex in pairs(p.MelvorMap.hexes) do
local coords = hex.coordinates
local coords = hex.coordinates
if coords.q == Q and coords.r == R then
if coords.q == Q and coords.r == R then
Line 105: Line 136:
end
end
return reqTable
return reqTable
end
function p._getDiscoveryRewards(POI)
local rewardTable = {}
if POI.discoveryRewards ~= nil then
if POI.discoveryRewards.gp ~= nil then
table.insert(rewardTable, Icons.GP(POI.discoveryRewards.gp))
end
if POI.discoveryRewards.sc ~= nil then
table.insert(rewardTable, Icons.SC(POI.discoveryRewards.sc))
end
if POI.discoveryRewards.items ~= nil then
for j, reward in pairs(POI.discoveryRewards.items) do
local item = Items.getItemByID(reward.id)
local qty = reward.quantity
table.insert(rewardTable, Icons.Icon({item.name, type='item', qty = qty}))
end
end
end
return rewardTable
end
function p.sortPOIByCoords(array)
table.sort(array, function(a, b)
local aX, aY = p.convertAxialToXY(a.coords)
local bX, bY = p.convertAxialToXY(b.coords)
if aX ~= bX then
return aX < bX
else
return aY < bY
end
end)
end
function p.getHexMasteryBonusTable(frame)
-- Build table header
local resultTable = mw.html.create('table')
resultTable:addClass('wikitable stickyHeaders')
resultTable:tag('tr'):addClass('headerRow-0')
:tag('th'):wikitext('Hexes Mastered')
:tag('th'):wikitext('Passive Bonuses')
:tag('th'):wikitext('Rewards')
local masteryBonuses = Shared.shallowClone(p.MelvorMap.masteryBonuses)
table.sort(masteryBonuses, function(a, b) return a.masteredHexes < b.masteredHexes end)
for i, bonus in ipairs(masteryBonuses) do
-- Populate passive bonuses & rewards cell text
local modText, rewardTextPart = nil, {}
if bonus.modifiers ~= nil and not Shared.tableIsEmpty(bonus.modifiers) then
modText = Constants.getModifiersText(bonus.modifiers, true, false)
end
if bonus.items ~= nil then
for k, itemDef in ipairs(bonus.items) do
local item = Items.getItemByID(itemDef.id)
if item ~= nil then
local expIcon = Icons.getExpansionIcon(itemDef.id)
table.insert(rewardTextPart, expIcon .. Icons.Icon({item.name, type='item', qty = itemDef.quantity}))
end
end
end
if bonus.pets ~= nil then
for k, petID in ipairs(bonus.pets) do
local pet = GameData.getEntityByID('pets', petID)
if pet ~= nil then
local expIcon = Icons.getExpansionIcon(petID)
table.insert(rewardTextPart, expIcon .. Icons.Icon({pet.name, type='pet'}))
end
end
end
local row = mw.html.create('tr')
row:tag('td'):wikitext(Shared.formatnum(bonus.masteredHexes))
if modText == nil then
row:tag('td')
:addClass('table-na')
:wikitext('None')
else
row:tag('td'):wikitext(modText)
end
if Shared.tableIsEmpty(rewardTextPart) then
row:tag('td')
:addClass('table-na')
:wikitext('None')
else
row:tag('td'):wikitext(table.concat(rewardTextPart, '\n'))
end
resultTable:node(row)
end
return tostring(resultTable)
end
end


Line 112: Line 232:
local tableStr = {}
local tableStr = {}
table.insert(tableStr, '{| class="wikitable sortable lighttable"')
table.insert(tableStr, '{| class="wikitable sortable lighttable"')
table.insert(tableStr, '\r\n|-\r\n!colspan="2"|Name!!Type!!X!!Y!!Requirements!!Discovery Rewards!!Active Effect')
table.insert(tableStr, '\r\n|-\r\n!colspan="2"|Name!!Type!!X!!Y!!Requirements!!Discovery Rewards!!Discovery Modifiers!!Active Effect')
for i, POI in pairs(SkillData.Cartography.worldMaps[1].pointsOfInterest) do
for i, POI in pairs(p.MelvorMap.pointsOfInterest) do
table.insert(POIs, POI)
table.insert(POIs, POI)
end
end
p.sortPOIByCoords(POIs)
table.sort(POIs, function(a, b)
local aX, aY = p.convertAxialToXY(a.coords)
local bX, bY = p.convertAxialToXY(b.coords)
if aX ~= bX then
return aX < bX
else
return aY < bY
end
end)
for i, POI in pairs(POIs) do
for i, POI in pairs(POIs) do
Line 162: Line 273:
--Add Discovery Rewards
--Add Discovery Rewards
table.insert(tableStr, '\r\n|')
table.insert(tableStr, '\r\n|')
if POI.discoveryRewards ~= nil then
local rewardTable = p._getDiscoveryRewards(POI)
local rewardTable = {}
table.insert(tableStr, table.concat(rewardTable,'<br/>'))
if POI.discoveryRewards.gp ~= nil then
table.insert(rewardTable, Icons.GP(POI.discoveryRewards.gp))
--Add Discovery Modifiers
end
table.insert(tableStr, '\r\n|')
if POI.discoveryRewards.sc ~= nil then
if POI.discoveryModifiers ~= nil then
table.insert(rewardTable, Icons.SC(POI.discoveryRewards.sc))
table.insert(tableStr, Constants.getModifiersText(POI.discoveryModifiers.modifiers)..' (for '..POI.discoveryModifiers.moves..' travels)')
end
if POI.discoveryRewards.items ~= nil then
for j, reward in pairs(POI.discoveryRewards.items) do
local item = Items.getItemByID(reward.id)
local qty = reward.quantity
table.insert(rewardTable, Icons.Icon({item.name, type='item', qty = qty}))
end
end
table.insert(tableStr, table.concat(rewardTable,'<br/>'))
end
end
--TODO: Add Active Modifiers
--Add Active Modifiers
table.insert(tableStr, '\r\n|')
table.insert(tableStr, '\r\n|')
if POI.activeModifiers ~= nil then
if POI.activeModifiers ~= nil then
Line 190: Line 292:
return table.concat(tableStr, '')
return table.concat(tableStr, '')
end
function p._getDiscoveryRewardsTable(items)
local POIs = {}
for i, POI in ipairs(p.MelvorMap.pointsOfInterest) do
if POI.discoveryRewards ~= nil and POI.discoveryRewards.items ~= nil then
for i, reward in ipairs(POI.discoveryRewards.items) do
for j, item in ipairs(items) do
if reward.id == item.id then
table.insert(POIs, POI)
break
end
end
end
end
end
if Shared.tableIsEmpty(POIs) then
return ''
end
p.sortPOIByCoords(POIs)
-- Build the table
local resultTable = mw.html.create('table')
resultTable:addClass('wikitable sortable')
resultTable:tag('tr'):addClass('headerRow-0')
:tag('th'):wikitext('Point of Interest')
:tag('th'):wikitext('X')
:tag('th'):wikitext('Y')
:tag('th'):wikitext('Requirements')
:tag('th'):wikitext('Discovery Rewards')
for _, POI in ipairs(POIs) do
local X, Y = p.convertAxialToXY(POI.coords)
local tr = mw.html.create('tr')
tr:tag('td'):wikitext(Icons.Icon({POI.name, type='poi'}))
tr:tag('td'):wikitext(X)
tr:tag('td'):wikitext(Y)
tr:tag('td'):wikitext(table.concat(p._getPOIRequirements(POI), '<br/>'))
tr:tag('td'):wikitext(table.concat(p._getDiscoveryRewards(POI), '<br/>'))
resultTable:node(tr)
end
return tostring(resultTable)
end
function p.getDiscoveryRewardsTable(frame)
local itemNames = frame.args ~= nil and frame.args[1] or frame
local items = {}
for itemName in string.gmatch(itemNames, "[^,]*") do
item = Items.getItem(itemName)
if item ~= nil then
table.insert(items, item)
end
end
if #items == nil then
return Shared.printError('No items found in game data for: "' .. itemNames .. '"')
end
local resultTable = p._getDiscoveryRewardsTable(items)
if resultTable == '' then
return ''
else
return '==POI Discovery Rewards==\n' .. resultTable
end
end
function p.hex(frame)
-- Default behavior, when no coords supplied
if (frame == nil or frame.args['x'] == nil or frame.args['y'] == nil) then
return 'Hex'
end
local X = tonumber(frame.args['x'])
local Y = tonumber(frame.args['y'])
if X == nil or Y == nil then
return '<invalid XY format>'
elseif X < 0 or Y < 0 or X > 31 or Y > 29 or (Y == 29 and X % 2 == 0) then
return '<out of range (' .. X .. ',' .. Y .. ')>'
end
--
local noicon = frame.args['noicon'] or false
local coords = '<span>(' .. X .. ',' .. Y .. ')</span>'
local hex = p.getPointOfInterestByXY(X, Y)
-- nil means just a normal hex
if hex == nil or hex['id'] == nil or noicon then
return coords
end
-- Valid POI so consider decorations
local notext = frame.args['notext'] or false
local nolink = frame.args['nolink'] or false
local poi_icon = Icons.Icon({hex['name'], type='poi', notext=notext or nil, nolink=nolink or nil, size='25'})
return '<span>' .. poi_icon .. ' ' .. coords .. '</span>'
end
function p.testDiscoveryRewards()
local testTable = {}
for i, POI in pairs(p.MelvorMap.pointsOfInterest) do
if POI.discoveryRewards ~= nil and POI.discoveryRewards.items ~= nil then
local item = Items.getItemByID(POI.discoveryRewards.items[1].id)
table.insert(testTable, p._getDiscoveryRewardsTable({item}))
end
end
return table.concat(testTable)
end
function p.testHex()
local testTable = {}
for x = 0, 31 do
for y = 0, 29 do
    if y == 29 and x % 2 == 1 then
    -- no tile here
    else
item = p.hex({args={x=x, y=y}})
table.insert(testTable, item)
    end
end
end
return table.concat(testTable)
end
end


570

edits