4,581
edits
m (Remove temporary functions) |
(Fixed currencies not showing up in task list) |
||
(23 intermediate revisions by 4 users not shown) | |||
Line 2: | Line 2: | ||
local Icons = require('Module:Icons') | local Icons = require('Module:Icons') | ||
local Items = require('Module:Items') | local Items = require('Module:Items') | ||
local Monsters = require('Module:Monsters') | |||
local Shop = require('Module:Shop') | local Shop = require('Module:Shop') | ||
local GameData = require('Module:GameData') | local GameData = require('Module:GameData') | ||
local | local Modifiers = require('Module:Modifiers') | ||
local Num = require('Module:Number') | |||
local p = {} | local p = {} | ||
Line 160: | Line 162: | ||
education = 'Education', | education = 'Education', | ||
storage = 'Storage', | storage = 'Storage', | ||
worship = 'Worship' | worship = 'Worship', | ||
fortification = 'Fortification' | |||
} | } | ||
local resourceText = function(resName, resType, quantity) | local resourceText = function(resName, resType, quantity) | ||
local elemClass = (quantity < 0 and 'text-negative') or 'text-positive' | local elemClass = (quantity < 0 and 'text-negative') or 'text-positive' | ||
local resIcon = Icons.Icon({resName, type=resType, notext=true}) | local resIcon = Icons.Icon({resName, type=resType, notext=true}) | ||
return resIcon .. ' <span class="' .. elemClass .. '">' .. | return resIcon .. ' <span class="' .. elemClass .. '">' .. Num.numStrWithSign(quantity) .. '</span>' | ||
end | end | ||
Line 184: | Line 187: | ||
table.insert(resultPart, resourceText(stat, 'township', quantity)) | table.insert(resultPart, resourceText(stat, 'township', quantity)) | ||
end | end | ||
end | |||
-- Modifiers | |||
if includeMods and building.modifiers ~= nil then | |||
table.insert(resultPart, Modifiers.getModifiersText(building.modifiers)) | |||
end | end | ||
Line 250: | Line 258: | ||
end | end | ||
-- Gets the Township level and | -- Gets the Township level or abyssalLevel, population and fortification requirements for a tier | ||
-- Returns {population=X, level=X} | -- Returns {population=X, level=X} for non-abyssal tiers | ||
function p._getTierRequirements(tier) | -- Returns {population=X, abyssalLevel=X, fortification=X} for abyssal tiers | ||
function p._getTierRequirements(tier, abyssalTier) | |||
local tierData = Township.populationForTier[tier] | |||
if abyssalTier ~= nil then | |||
local abyssalTierData = Shared.clone(Township.abyssalTierRequirements[abyssalTier + 1]) | |||
abyssalTierData.population = tierData.population | |||
return abyssalTierData | |||
else | |||
return tierData | |||
end | |||
end | end | ||
-- Returns a string containing the Township level and population requirements for a tier | -- Returns a string containing the Township level and population requirements for a tier | ||
function p._getTierText(tier) | function p._getTierText(tier, abyssalTier) | ||
local tierData = p._getTierRequirements(tier) | local realmID = (abyssalTier ~= nil and 'melvorItA:Abyssal' or 'melvorD:Melvor') | ||
local tierData = p._getTierRequirements(tier, abyssalTier) | |||
if tierData ~= nil then | if tierData ~= nil then | ||
local tierText = Icons._SkillReq('Township', tierData.level, false) | local tierText = Icons._SkillReq('Township', tierData.abyssalLevel or tierData.level, false, realmID) | ||
if tierData.population > 0 then | if tierData.population ~= nil and tierData.population > 0 then | ||
tierText = tierText .. '<br/>' .. Icons.Icon({'Population', type='township', notext=true}) .. ' ' .. | tierText = tierText .. '<br/>' .. Icons.Icon({'Population', type='township', notext=true}) .. ' ' .. Num.formatnum(tierData.population) | ||
end | |||
if tierData.fortification ~= nil and tierData.fortification > 0 then | |||
tierText = tierText .. '<br/>' .. Icons.Icon({'Fortification', type='township', notext=true}) .. ' ' .. Num.formatnum(tierData.fortification) .. '%' | |||
end | end | ||
return tierText | return tierText | ||
Line 273: | Line 293: | ||
local seasonReqs = { | local seasonReqs = { | ||
["Nightfall"] = Icons.Icon({'Township%23Worship', 'Bane Worship', img='Statue of Bane', type='building'}), | ["Nightfall"] = Icons.Icon({'Township%23Worship', 'Bane Worship', img='Statue of Bane', type='building'}), | ||
["SolarEclipse"] = Icons.Icon({'Township%23Worship', 'The Herald Worship', img='Statue of The Herald', type='building'}) | ["SolarEclipse"] = Icons.Icon({'Township%23Worship', 'The Herald Worship', img='Statue of The Herald', type='building'}), | ||
["Lemon"] = Icons.Icon({'Ancient_Relics', 'Ancient Relics', img='Ancient Relics'}), | |||
["EternalDarkness"] = Icons.Icon({'Township%23Worship', 'Xon Worship', img='Statue of Xon', type='building'}), | |||
} | } | ||
Line 294: | Line 316: | ||
table.insert(resultPart, '<br/>Requires ' .. reqs) | table.insert(resultPart, '<br/>Requires ' .. reqs) | ||
end | end | ||
table.insert(resultPart, '\n| ' .. | table.insert(resultPart, '\n| ' .. Modifiers.getModifiersText(season.modifiers)) | ||
end | end | ||
table.insert(resultPart, '\n|}') | table.insert(resultPart, '\n|}') | ||
Line 306: | Line 328: | ||
table.insert(resultPart, '{| class="wikitable sortable stickyHeader"') | table.insert(resultPart, '{| class="wikitable sortable stickyHeader"') | ||
table.insert(resultPart, '\n|- class="headerRow-0"') | table.insert(resultPart, '\n|- class="headerRow-0"') | ||
table.insert(resultPart, '\n!rowspan="2" colspan="2"| Biome\n!colspan=" | table.insert(resultPart, '\n!rowspan="2" colspan="2"| Biome\n!colspan="3"| Requirements') | ||
table.insert(resultPart, '\n|- class="headerRow-1"') | table.insert(resultPart, '\n|- class="headerRow-1"') | ||
table.insert(resultPart, '\n! ' .. Icons.Icon({'Township', 'Level', type='skill', nolink=true})) | table.insert(resultPart, '\n! ' .. Icons.Icon({'Township', 'Level', type='skill', nolink=true})) | ||
table.insert(resultPart, '\n! ' .. Icons.Icon({'Township | table.insert(resultPart, '\n! ' .. Icons.Icon({'Township', 'Population', img='Population', type='township', section='Population' })) | ||
table.insert(resultPart, '\n! ' .. Icons.Icon({'Township', 'Forification', img='Fortification', type='township', section='Fortification' })) | |||
for i, biome in ipairs(Township.biomes) do | for i, biome in ipairs(Township.biomes) do | ||
local reqs = p._getTierRequirements(biome.tier) | local reqs = p._getTierRequirements(biome.tier, biome.abyssalTier) | ||
local fortification = reqs.fortification or 0 | |||
table.insert(resultPart, '\n|-\n|class="table-img"| ' .. Icons.Icon({biome.name, type='biome', size=50, nolink=true, notext=true})) | table.insert(resultPart, '\n|-\n|class="table-img"| ' .. Icons.Icon({biome.name, type='biome', size=50, nolink=true, notext=true})) | ||
table.insert(resultPart, '\n| ' .. biome.name) | table.insert(resultPart, '\n| ' .. biome.name) | ||
table.insert(resultPart, '\n|style="text-align:right"| ' .. reqs.level) | table.insert(resultPart, '\n|style="text-align:right"| ' .. (reqs.abyssalLevel or reqs.level)) | ||
table.insert(resultPart, '\n|style="text-align:right" data-sort-value="' .. reqs.population .. '"| ' .. | table.insert(resultPart, '\n|style="text-align:right" data-sort-value="' .. reqs.population .. '"| ' .. Num.formatnum(reqs.population)) | ||
table.insert(resultPart, '\n|style="text-align:right" data-sort-value="' .. fortification .. '"| ' .. Num.formatnum(fortification)) | |||
end | end | ||
table.insert(resultPart, '\n|}') | table.insert(resultPart, '\n|}') | ||
Line 326: | Line 351: | ||
-- Skips upgraded buildings | -- Skips upgraded buildings | ||
function p.getBuildingBiomeTable(frame) | function p.getBuildingBiomeTable(frame) | ||
local tbl = mw.html.create('table') | |||
local | :addClass('wikitable sortable stickyHeader') | ||
:css('text-align', 'center') | |||
local header = mw.html.create('tr'):addClass('headerRow-0') | |||
local level = mw.html.create('tr'):addClass('sorttop') | |||
local pop = mw.html.create('tr'):addClass('sorttop') | |||
local fort = mw.html.create('tr'):addClass('sorttop') | |||
- | header:tag('th') | ||
:css('z-index', '2') | |||
:wikitext('Building') | |||
level:tag('th') | |||
:wikitext(Icons.Icon({'Township', 'Level', type='skill', nolink=true})) | |||
pop:tag('th') | |||
:wikitext(Icons.Icon({'Township', 'Population', img='Population', type='township', section='Population' })) | |||
fort:tag('th') | |||
:wikitext(Icons.Icon({'Township', 'Fortification', img='Fortification', type='township', section='Fortification' })) | |||
for _, biome in ipairs(Township.biomes) do | for _, biome in ipairs(Township.biomes) do | ||
local reqs = p._getTierRequirements(biome.tier, biome.abyssalTier) | |||
header:tag('th') | |||
:wikitext(Icons.Icon({biome.name, type='biome', notext=true, nolink=true}).. '<br/>' .. biome.name) | |||
level:tag('td') | |||
:wikitext(Num.formatnum((reqs.abyssalLevel or reqs.level))) | |||
pop:tag('td') | |||
:wikitext(Num.formatnum(reqs.population)) | |||
fort:tag('td') | |||
:wikitext(Num.formatnum((reqs.fortification or 0))) | |||
end | end | ||
tbl:node(header) | |||
tbl:node(level) | |||
tbl:node(pop) | |||
tbl:node(fort) | |||
for _, _building in ipairs(p._sortedBuildings(false)) do | for _, _building in ipairs(p._sortedBuildings(false)) do | ||
Line 349: | Line 399: | ||
end | end | ||
local trow = tbl:tag('tr') | |||
trow:tag('th') | |||
:css('text-align', 'left') | |||
:attr('data-sort-value', building.name) | |||
:wikitext(Icons.Icon({building.name, type='building'})) | |||
for _, biome in ipairs(Township.biomes) do | for _, biome in ipairs(Township.biomes) do | ||
if buildingBiomes[biome.id] then | if buildingBiomes[biome.id] then | ||
trow:tag('td') | |||
:addClass('table-positive') | |||
:wikitext('✓') | |||
else | else | ||
trow:tag('td') | |||
end | end | ||
end | end | ||
end | end | ||
end | end | ||
return | return tostring(tbl) | ||
end | end | ||
Line 381: | Line 433: | ||
table.insert(resultPart, '{| class="wikitable sortable stickyHeader"') | table.insert(resultPart, '{| class="wikitable sortable stickyHeader"') | ||
table.insert(resultPart, '\n|- class="headerRow-0"') | table.insert(resultPart, '\n|- class="headerRow-0"') | ||
table.insert(resultPart, '\n!colspan="2"|Building\n!Requirements | table.insert(resultPart, '\n!colspan="2"|Building\n!Requirements\n!Max Built') | ||
table.insert(resultPart, '\n!Biomes\n!Cost\n!Provides') | table.insert(resultPart, '\n!Biomes\n!Cost\n!Provides') | ||
Line 399: | Line 451: | ||
table.insert(resultPart, '\n|class="table-img"' .. rowSpan .. '| ' .. Icons.Icon({buildingName, type='building', notext=true, size=50})) | table.insert(resultPart, '\n|class="table-img"' .. rowSpan .. '| ' .. Icons.Icon({buildingName, type='building', notext=true, size=50})) | ||
table.insert(resultPart, '\n' .. rowSpanOnly .. '| ' .. Icons.getExpansionIcon(building.id) .. Icons.Icon({buildingName, type='building', noicon=true})) | table.insert(resultPart, '\n' .. rowSpanOnly .. '| ' .. Icons.getExpansionIcon(building.id) .. Icons.Icon({buildingName, type='building', noicon=true})) | ||
table.insert(resultPart, '\n|' .. 'data-sort-value="' .. building.tier .. '"' .. rowSpan .. '| ' .. (p._getTierText(building.tier) or '') | table.insert(resultPart, '\n|' .. 'data-sort-value="' .. building.tier .. '"' .. rowSpan .. '| ' .. (p._getTierText(building.tier, building.abyssalTier) or '')) | ||
table.insert(resultPart, '\n|style="text-align:right"' .. rowSpan .. '| ' .. building.maxUpgrades) | table.insert(resultPart, '\n|style="text-align:right"' .. rowSpan .. '| ' .. building.maxUpgrades) | ||
firstRow = false | firstRow = false | ||
Line 411: | Line 462: | ||
local providesText = p._getBuildingBenefitText(building, biomeID) | local providesText = p._getBuildingBenefitText(building, biomeID) | ||
if building.modifiers ~= nil then | if building.modifiers ~= nil then | ||
local modText = | local modText = Modifiers.getModifiersText(building.modifiers) | ||
if providesText == nil then | if providesText == nil then | ||
providesText = modText | providesText = modText | ||
Line 442: | Line 493: | ||
if itemDesc == nil then | if itemDesc == nil then | ||
if item.modifiers ~= nil then | if item.modifiers ~= nil then | ||
itemDesc = | itemDesc = Modifiers.getModifiersText(item.modifiers, false, true) | ||
else | else | ||
itemDesc = '' | itemDesc = '' | ||
Line 451: | Line 502: | ||
table.insert(resultPart, '\n|-\n| ' .. Icons.Icon({item.name, type='item', size=50, notext=true})) | table.insert(resultPart, '\n|-\n| ' .. Icons.Icon({item.name, type='item', size=50, notext=true})) | ||
table.insert(resultPart, '\n| ' .. Icons.Icon({item.name, type='item', noicon=true})) | table.insert(resultPart, '\n| ' .. Icons.getExpansionIcon(item.id) .. Icons.Icon({item.name, type='item', noicon=true})) | ||
table.insert(resultPart, '\n| ' .. itemDesc) | table.insert(resultPart, '\n| ' .. itemDesc) | ||
table.insert(resultPart, '\n|data-sort-value="' .. costSort ..'" style="text-align:right"| ' .. Icons.Icon({res.name, type='resource', qty=resQty, notext=true})) | table.insert(resultPart, '\n|data-sort-value="' .. costSort ..'" style="text-align:right"| ' .. Icons.Icon({res.name, type='resource', qty=resQty, notext=true})) | ||
Line 465: | Line 516: | ||
function p.getWorshipTable() | function p.getWorshipTable() | ||
local function getCheckpointCell(checkpoint) | local function getCheckpointCell(checkpoint) | ||
return '\n|-\n!' .. checkpoint .. '%<br/>' .. | return '\n|-\n!' .. checkpoint .. '%<br/>' .. Num.formatnum(checkpoint * Township.maxWorship / 100) .. '/' .. Num.formatnum(Township.maxWorship) | ||
end | end | ||
Line 505: | Line 556: | ||
table.insert(ret, getCheckpointCell(0)) | table.insert(ret, getCheckpointCell(0)) | ||
for _, worship in ipairs(worships) do | for _, worship in ipairs(worships) do | ||
table.insert(ret, '\n| ' .. | table.insert(ret, '\n| ' .. Modifiers.getModifiersText(worship.modifiers)) | ||
end | end | ||
Line 512: | Line 563: | ||
table.insert(ret, getCheckpointCell(checkpoint)) | table.insert(ret, getCheckpointCell(checkpoint)) | ||
for _, worship in ipairs(worships) do | for _, worship in ipairs(worships) do | ||
table.insert(ret, '\n| ' .. | table.insert(ret, '\n| ' .. Modifiers.getModifiersText(worship.checkpoints[i])) | ||
end | end | ||
end | end | ||
-- Total sum | -- Total sum | ||
-- TODO Needs fixing, no function currently for aggregating modifiers | |||
--[==[ | |||
table.insert(ret, '\n|-\n!Total') | table.insert(ret, '\n|-\n!Total') | ||
for _, worship in ipairs(worships) do | for _, worship in ipairs(worships) do | ||
Line 535: | Line 588: | ||
end | end | ||
end | end | ||
table.insert(ret, '\n|' .. | table.insert(ret, '\n|' .. Modifiers.getModifiersText(modifiers)) | ||
end | end | ||
--]==] | |||
table.insert(ret, '\n|}') | table.insert(ret, '\n|}') | ||
Line 554: | Line 608: | ||
table.insert(ret, '{| class="wikitable infobox"') | table.insert(ret, '{| class="wikitable infobox"') | ||
-- Name | -- Name | ||
table.insert(ret, '\n|-\n! ' .. building.name) | table.insert(ret, '\n|-\n! ' .. Icons.getExpansionIcon(building.id) .. building.name) | ||
-- Icon | -- Icon | ||
table.insert(ret, '\n|-\n|style="text-align:center"| ' .. Icons.Icon({building.name, type='building', size='250', notext=true})) | table.insert(ret, '\n|-\n|style="text-align:center"| ' .. Icons.Icon({building.name, type='building', size='250', notext=true})) | ||
-- ID | -- ID | ||
table.insert(ret, '\n|-\n| <b>Building ID:</b> ' .. building.id) | table.insert(ret, '\n|-\n| <b>Building ID:</b> ' .. building.id) | ||
-- Tier | -- Tier | ||
local tier = p._getTierText(building.tier) | local tier = p._getTierText(building.tier, building.abyssalTier) | ||
table.insert(ret, '\n|-\n| <b>Requirements:</b><br/>' .. tier) | table.insert(ret, '\n|-\n| <b>Requirements:</b><br/>' .. tier) | ||
Line 606: | Line 658: | ||
end | end | ||
-- Maximum built | |||
local biomeCount = Shared.tableCount(building.biomes) | |||
local maxText = Num.formatnum(building.maxUpgrades) | |||
if biomeCount > 1 then | |||
maxText = maxText .. ' per biome, ' .. Num.formatnum(biomeCount * building.maxUpgrades) .. ' total' | |||
end | |||
table.insert(ret, '\n|-\n| <b>Maximum Built:</b><br/>' .. maxText) | |||
-- Benefits | -- Benefits | ||
local benefits = p._getBuildingGroupedBenefitText(building) | local benefits = p._getBuildingGroupedBenefitText(building) | ||
Line 665: | Line 725: | ||
table.insert(ret, '\n|-\n!colspan="2"| Name') | table.insert(ret, '\n|-\n!colspan="2"| Name') | ||
for _, building in ipairs(buildingList) do | for _, building in ipairs(buildingList) do | ||
table.insert(ret, '\n!' .. Icons.Icon({building.name, type='building'})) | table.insert(ret, '\n!' .. Icons.getExpansionIcon(building.id) .. Icons.Icon({building.name, type='building'})) | ||
end | end | ||
Line 671: | Line 731: | ||
table.insert(ret, '\n|-\n!colspan="2"| Requirements') | table.insert(ret, '\n|-\n!colspan="2"| Requirements') | ||
for _, building in ipairs(buildingList) do | for _, building in ipairs(buildingList) do | ||
table.insert(ret, '\n|' .. p._getTierText(building.tier)) | table.insert(ret, '\n|' .. p._getTierText(building.tier, building.abyssalTier)) | ||
end | end | ||
Line 717: | Line 777: | ||
-- Returns a row containing a task given a title and a task table | -- Returns a row containing a task given a title and a task table | ||
function p._getTaskRow(title, task) | function p._getTaskRow(title, task, isDailyTask) | ||
local ret = {} | local ret = {} | ||
Line 729: | Line 789: | ||
-- Title | -- Title | ||
table.insert(ret, '\n|-') | table.insert(ret, '\n|-') | ||
table.insert(ret, '\n!'..titlespan..title) | table.insert(ret, '\n!' .. titlespan .. title) | ||
-- Description | -- Description | ||
if hasDescription then | if hasDescription then | ||
table.insert(ret, '\n|colspan="2"|'..task.description) | table.insert(ret, '\n|colspan="2"|' .. task.description) | ||
table.insert(ret, '\n|-') | table.insert(ret, '\n|-') | ||
end | end | ||
-- Requirements | -- Requirements | ||
table.insert(ret, '\n|') | table.insert(ret, '\n|') | ||
local | -- Determines order of requirements output | ||
local reqOrder = { | |||
local | ["items"] = 10, | ||
["monsters"] = 20, | |||
["monsterWithItems"] = 30, | |||
["skillXP"] = 40, | |||
["buildings"] = 50, | |||
["numPOIs"] = 60, | |||
["numRefinements"] = 70 | |||
} | |||
local reqTextPart = {} | |||
local function getItemText(itemID) | |||
local item = Items.getItemByID(itemID) | |||
if item == nil then | |||
return Shared.printError('Unknown item: ' .. (itemID or 'nil')) | |||
else | |||
return Icons.Icon({item.name, type='item'}) | |||
end | |||
end | end | ||
local function getMonsterText(monsterID) | |||
local | local monster = Monsters.getMonsterByID(monsterID) | ||
if monster == nil then | |||
return Shared.printError('Unknown monster: ' .. (monsterID or 'nil')) | |||
else | |||
return Icons.Icon({Monsters.getMonsterName(monster), type='monster'}) | |||
end | |||
end | end | ||
for | |||
for goalType, goalData in pairs(task.goals) do | |||
local typeOrder = reqOrder[goalType] or 0 | |||
local goalText = nil | |||
if type(goalData) == 'table' then | |||
-- Goal data is a table | |||
for goalIdx, goalObj in ipairs(goalData) do | |||
if goalType == 'items' then | |||
goalText = Num.formatnum(goalObj.quantity) .. ' ' .. getItemText(goalObj.id) | |||
elseif goalType == 'monsters' then | |||
goalText = Num.formatnum(goalObj.quantity) .. ' ' .. getMonsterText(goalObj.id) | |||
elseif goalType == 'monsterWithItems' then | |||
local itemsText = {} | |||
for i, itemID in ipairs(goalObj.itemIDs) do | |||
table.insert(itemsText, getItemText(itemID)) | |||
end | |||
goalText = Num.formatnum(goalObj.quantity) .. ' ' .. getMonsterText(goalObj.monsterID) .. ' with ' .. table.concat(itemsText, ', ') .. ' equipped' | |||
elseif goalType == 'skillXP' then | |||
local skillName = GameData.getSkillData(goalObj.id).name | |||
goalText = Num.formatnum(goalObj.quantity) .. ' ' .. Icons.Icon({skillName, type='skill'}) .. ' XP' | |||
elseif goalType == 'buildings' then | |||
local buildingName = p._GetBuildingByID(goalObj.id).name | |||
goalText = Num.formatnum(goalObj.quantity) .. ' ' .. Icons.Icon({buildingName, type='building'}) | |||
elseif goalType == 'numPOIs' then | |||
local mapName = GameData.getEntityByID(GameData.skillData.Cartography.worldMaps, goalObj.worldMapID).name | |||
goalText = 'Discover ' .. Num.formatnum(goalObj.quantity) .. ' Points of Interest in ' .. Icons.Icon({'Cartography', type='skill'}) .. ' world map of ' .. mapName | |||
else | |||
goalText = Shared.printError('Unknown goal type: ' .. (goalType or 'nil')) | |||
end | |||
table.insert(reqTextPart, { | |||
["goalOrder"] = typeOrder, | |||
["subOrder"] = goalIdx, | |||
["text"] = goalText | |||
}) | |||
end | |||
else | |||
-- Goal data is another value of some type | |||
if goalType == 'numRefinements' then | |||
goalText = 'Refine dig site maps in ' .. Icons.Icon({'Cartography', type='skill'}) .. ' ' .. Num.formatnum(goalData) .. ' times' | |||
else | |||
goalText = Shared.printError('Unknown goal type: ' .. (goalType or 'nil')) | |||
end | |||
table.insert(reqTextPart, { | |||
["goalOrder"] = typeOrder, | |||
["subOrder"] = 0, | |||
["text"] = goalText | |||
}) | |||
end | |||
end | end | ||
table.sort(reqTextPart, | |||
table.insert(requirements, | function(a, b) | ||
if a.goalOrder == b.goalOrder then | |||
return a.subOrder < b.subOrder | |||
else | |||
return a.goalOrder < b.goalOrder | |||
end | |||
end | |||
) | |||
local requirements = {} | |||
for i, req in ipairs(reqTextPart) do | |||
table.insert(requirements, req.text) | |||
end | end | ||
-- We don't check tasks.requirements (so far it's only used to enumerate the Tutorial tasks so you only see 1 at a time) | -- We don't check tasks.requirements (so far it's only used to enumerate the Tutorial tasks so you only see 1 at a time) | ||
Line 759: | Line 894: | ||
table.insert(ret, '\n|') | table.insert(ret, '\n|') | ||
local rewards = {} | local rewards = {} | ||
if task.rewards. | local rewardsVariableQty = {} | ||
table.insert( | if task.rewards.currencies ~= nil then | ||
for _, currReward in ipairs(task.rewards.currencies) do | |||
if isDailyTask and currReward.id ~= 'melvorD:GP' then | |||
table.insert(rewardsVariableQty, Icons._Currency(currReward.id)) | |||
elseif not isDailyTask then | |||
table.insert(rewards, Icons._Currency(currReward.id, currReward.quantity)) | |||
end | |||
end | |||
end | end | ||
for _, item in ipairs(task.rewards.items) do | for _, item in ipairs(task.rewards.items) do | ||
local itemname = GameData.getEntityByID('items', item.id).name | local itemname = GameData.getEntityByID('items', item.id).name | ||
table.insert(rewards, | table.insert(rewards, Num.formatnum(item.quantity)..' '..Icons.Icon({itemname, type='item'})) | ||
end | end | ||
for _, skill in ipairs(task.rewards.skillXP) do | for _, skill in ipairs(task.rewards.skillXP) do | ||
local skillname = GameData.getSkillData(skill.id).name | if not (isDailyTask and skill.id == 'melvorD:Township') then | ||
local skillname = GameData.getSkillData(skill.id).name | |||
table.insert(rewards, Num.formatnum(skill.quantity)..' '..Icons.Icon({skillname, type='skill'})..' XP') | |||
end | |||
end | end | ||
for _, townshipResource in ipairs(task.rewards.townshipResources) do | for _, townshipResource in ipairs(task.rewards.townshipResources) do | ||
local resourcename = p._getResourceByID(townshipResource.id).name | local resourcename = p._getResourceByID(townshipResource.id).name | ||
table.insert(rewards, | table.insert(rewards, Num.formatnum(townshipResource.quantity)..' '..Icons.Icon({resourcename, type='resource'})) | ||
end | |||
if not Shared.tableIsEmpty(rewardsVariableQty) then | |||
table.insert(ret, '[[Township#Casual Tasks|Variable]] ' .. table.concat(rewardsVariableQty, ', ') .. '<br/>') | |||
end | end | ||
table.insert(ret, table.concat(rewards, '<br/>')) | table.insert(ret, table.concat(rewards, '<br/>')) | ||
-- Unlock requirements, daily task specific | |||
if isDailyTask then | |||
table.insert(ret, '\n|' .. Shop.getRequirementString(task.requirements)) | |||
end | |||
return table.concat(ret) | return table.concat(ret) | ||
end | end | ||
Line 785: | Line 934: | ||
function p.getTaskTable(frame) | function p.getTaskTable(frame) | ||
local category = frame.args ~= nil and frame.args[1] or frame | local category = frame.args ~= nil and frame.args[1] or frame | ||
local categoryData = GameData. | local categoryData = GameData.getEntityByName(Township.taskCategories, category) | ||
if categoryData | local taskData, categoryName, isDailyTask = nil, nil, false | ||
if category == 'Daily' then | |||
isDailyTask = true | |||
taskData = Township.casualTasks | |||
categoryName = 'Casual' | |||
elseif categoryData ~= nil then | |||
taskData = Township.tasks | |||
categoryName = categoryData.name | |||
else | |||
return Shared.printError('Invalid task category specified: ' .. (tostring(category) or 'nil')) | return Shared.printError('Invalid task category specified: ' .. (tostring(category) or 'nil')) | ||
end | end | ||
local taskcount = 0 | local taskcount = 0 | ||
local ret = {} | local ret = {} | ||
table.insert(ret, '{| class="wikitable lighttable" style="text-align:left"') | table.insert(ret, '{| class="wikitable lighttable stickyHeader" style="text-align:left"') | ||
table.insert(ret, '\n|- class="headerRow-0"') | |||
table.insert(ret, '\n!Task') | table.insert(ret, '\n!Task') | ||
table.insert(ret, '\n!Requirements') | table.insert(ret, '\n!Requirements') | ||
table.insert(ret, '\n!Rewards') | table.insert(ret, '\n!Rewards') | ||
if isDailyTask then | |||
table.insert(ret, '<br/>(In addition to [[Township#Casual Tasks|Variable]] ' .. Icons._Currency('melvorD:GP') .. ' & ' .. Icons.Icon({'Township', type='skill', notext=true}) .. ' XP)') | |||
end | |||
if isDailyTask then | |||
table.insert(ret, '\n!Unlock Requirements') | |||
end | |||
for _, task in ipairs( | for _, task in ipairs(taskData) do | ||
-- Filter out other categories | -- Filter out other categories | ||
if task.category == category then | local categoryID, categoryNS, categoryLocalID = '', '', '' | ||
if categoryData ~= nil then | |||
categoryID = categoryData.id | |||
categoryNS, categoryLocalID = Shared.getLocalID(categoryID) | |||
end | |||
if isDailyTask or task.category == categoryID or task.category == categoryLocalID then | |||
taskcount = taskcount + 1 | taskcount = taskcount + 1 | ||
local title = | local title = categoryName .. ' ' .. taskcount | ||
table.insert(ret, p._getTaskRow(title, task)) | table.insert(ret, p._getTaskRow(title, task, isDailyTask)) | ||
end | end | ||
end | end | ||
Line 820: | Line 988: | ||
if referenceType == 'dungeon' then | if referenceType == 'dungeon' then | ||
-- We get the tasks associated with all monsters in the dungeon | -- We get the tasks associated with all monsters in the dungeon | ||
local | local area = nil | ||
local areaTypes = {'dungeons', 'abyssDepths'} | |||
for _, areaType in ipairs(areaTypes) do | |||
area = GameData.getEntityByName(areaType, referenceName) | |||
if area ~= nil then | |||
break | |||
end | |||
end | |||
local monsters = area.monsterIDs | |||
for _, monster in ipairs(monsters) do | for _, monster in ipairs(monsters) do | ||
IDs[monster] = true | IDs[monster] = true | ||
Line 829: | Line 1,005: | ||
end | end | ||
if referenceType == 'monster' then | if referenceType == 'monster' then | ||
IDs[ | IDs[Monsters.getMonster(referenceName).id] = true | ||
end | end | ||
return IDs | return IDs | ||
Line 856: | Line 1,032: | ||
return referenceIDs[entry.id] ~= nil | return referenceIDs[entry.id] ~= nil | ||
end | end | ||
for _, searchTable in | for _, searchTable in pairs(GetSearchTables(task)) do -- ipairs won't work if first table is nil | ||
-- Check to see if the table contains any of the IDs in referenceIDs | -- Check to see if the table contains any of the IDs in referenceIDs | ||
if searchTable[1] ~= nil then -- Make sure table is not empty | if searchTable[1] ~= nil then -- Make sure table is not empty | ||
Line 880: | Line 1,056: | ||
table.insert(ret, '\n!Rewards') | table.insert(ret, '\n!Rewards') | ||
for _, task in ipairs(tasks) do | for _, task in ipairs(tasks) do | ||
local categoryname = GameData.getEntityByID(Township.taskCategories, | -- Some categories have a local ID, resolve this before looking up the task category | ||
local taskNS, taskLocalID = Shared.getLocalID(task.id) | |||
local catID = Shared.getNamespacedID(taskNS, task.category) | |||
local categoryname = GameData.getEntityByID(Township.taskCategories, catID).name | |||
local title = '[[Township/Tasks#'..categoryname..'|'..categoryname..']]' | local title = '[[Township/Tasks#'..categoryname..'|'..categoryname..']]' | ||
table.insert(ret, p._getTaskRow(title, task)) | table.insert(ret, p._getTaskRow(title, task, false)) | ||
end | end | ||
table.insert(ret, '\n|}') | table.insert(ret, '\n|}') |