Module:Prayer: Difference between revisions
From Melvor Idle
(Amend non-existent property references) |
(Removed functions in favour of manual tables) |
||
(17 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local Shared = require('Module:Shared') | local Shared = require('Module:Shared') | ||
local GameData = require('Module:GameData') | local GameData = require('Module:GameData') | ||
local Modifiers = require('Module:Modifiers') | |||
local Skills = require('Module:Skills') | |||
local Icons = require('Module:Icons') | local Icons = require('Module:Icons') | ||
local Items = require('Module:Items') | local Items = require('Module:Items') | ||
local ItemSources = require('Module:Items/SourceTables') | local ItemSources = require('Module:Items/SourceTables') | ||
local Num = require('Module:Number') | |||
function p.getPrayerByID(id) | function p.getPrayerByID(id) | ||
Line 20: | Line 20: | ||
function p.getPrayers(checkFunc) | function p.getPrayers(checkFunc) | ||
return GameData.getEntities('prayers', checkFunc) | return GameData.getEntities('prayers', checkFunc) | ||
end | |||
--Returns the expansion icon for the prayer if it has one | |||
function p.getExpansionIcon(frame) | |||
local prayerName = frame.args ~= nil and frame.args[1] or frame | |||
local prayer = p.getPrayer(prayerName) | |||
if prayer == nil then | |||
return Shared.printError('No prayer named "' .. prayerName .. '" exists in the data module') | |||
end | |||
return Icons.getExpansionIcon(prayer.id) | |||
end | end | ||
Line 41: | Line 52: | ||
function p._getPrayerEffect(prayer, asList) | function p._getPrayerEffect(prayer, asList) | ||
if asList == nil then asList = false end | if asList == nil then asList = false end | ||
local chr = asList and '* ' or '' | |||
local lineSep = (asList and '\n' or '<br>') | |||
local chr = (asList and '* ' or '') | |||
local bonusLines = {} | local bonusLines = {} | ||
if prayer.isUnholy then | |||
table.insert(bonusLines, "For each Unholy Mark stack on the enemy:") | |||
end | |||
if type(prayer.modifiers) == 'table' then | |||
local formatLine = function(text) return chr .. text end | |||
table.insert(bonusLines, Modifiers.getModifiersText(prayer.modifiers, false, false, 10, formatLine, lineSep)) | |||
end | end | ||
if type(prayer.enemyModifiers) == 'table' then | if type(prayer.enemyModifiers) == 'table' then | ||
local formatLine = function(text) return chr .. 'Gives the enemy: ' .. text end | |||
table.insert(bonusLines, Modifiers.getModifiersText(prayer.enemyModifiers, false, false, 10, formatLine, lineSep)) | |||
end | end | ||
Line 61: | Line 78: | ||
local xpRatio = 1 / 30 | local xpRatio = 1 / 30 | ||
local val = xpRatio * prayer.pointsPerPlayer | local val = xpRatio * prayer.pointsPerPlayer | ||
table.insert(bonusLines, chr .. "+" .. | table.insert(bonusLines, chr .. "+" .. Num.round(val, 3, 3) .. " Prayer XP per damage done") | ||
end | end | ||
return table.concat(bonusLines, lineSep) | |||
end | end | ||
Line 76: | Line 89: | ||
local prayer = p.getPrayer(prayerName) | local prayer = p.getPrayer(prayerName) | ||
if prayer == nil then | if prayer == nil then | ||
return | return Shared.printError('No prayer named "' .. prayerName .. '" exists in the data module') | ||
end | end | ||
Line 90: | Line 103: | ||
return p.getPrayerEffect(prayer) | return p.getPrayerEffect(prayer) | ||
elseif statName == 'prayerLevel' then | elseif statName == 'prayerLevel' then | ||
return | return Skills.getRecipeRequirementText('Prayer', prayer) | ||
else | else | ||
return prayer[statName] | return prayer[statName] | ||
Line 101: | Line 114: | ||
local prayer = p.getPrayer(prayerName) | local prayer = p.getPrayer(prayerName) | ||
if prayer == nil then | if prayer == nil then | ||
return | return Shared.printError('No prayer named "' .. prayerName .. '" exists in the data module') | ||
end | end | ||
Line 115: | Line 128: | ||
local prayer = p.getPrayer(prayerName) | local prayer = p.getPrayer(prayerName) | ||
if prayer == nil then | if prayer == nil then | ||
return | return Shared.printError('No prayer named "' .. prayerName .. '" exists in the data module') | ||
end | end | ||
Line 121: | Line 134: | ||
end | end | ||
-- Returns only the regular prayers. | |||
function p.getPrayerTable(frame) | function p.getPrayerTable(frame) | ||
local | local func = function(prayer) | ||
return not prayer.isUnholy and not prayer.isAbyssal | |||
end | |||
return p.getPrayerTableFiltered(frame, func) | |||
end | |||
function p.getUnholyPrayerTable(frame) | |||
return p.getPrayerTableFiltered(frame, function(prayer) return prayer.isUnholy end) | |||
end | |||
function p.getAbyssalPrayerTable(frame) | |||
return p.getPrayerTableFiltered(frame, function(prayer) return prayer.isAbyssal end, 'Abyssal Realm') | |||
end | |||
-- Realm is defined "manually" here to define custom styling | |||
function p.getPrayerTableFiltered(frame, prayerPredicate, realm) | |||
local skillID = 'Prayer' | |||
local realm = realm or 'Melvor Realm' | |||
local html = mw.html.create('table') | |||
:addClass('wikitable sortable stickyHeader') | |||
html:tag('tr'):addClass('headerRow-0') | |||
:tag('th'):attr('colspan', 2) | |||
:wikitext('Prayer') | |||
:tag('th'):wikitext('DLC') | |||
:tag('th'):wikitext(Icons.Icon({'Prayer', type='skill', notext=true}) .. '<br>Level') | |||
:tag('th'):wikitext('Effects') | |||
:tag('th'):wikitext('Point Cost') | |||
local prayerList = p.getPrayers(prayerPredicate) | |||
table.sort(prayerList, function(a, b) return Skills.standardRecipeSort(skillID, a, b) end) | |||
local | for i, prayer in ipairs(prayerList) do | ||
local level = Skills.getRecipeLevel(skillID, prayer) | |||
local reqText = Skills.getRecipeRequirementText(skillID, prayer) | |||
html:tag('tr') | |||
:tag('td'):wikitext(Icons.Icon({prayer.name, type='prayer', notext=true})) | |||
:tag('td'):wikitext('[[' .. prayer.name .. ']]') | |||
:tag('td'):wikitext(Icons.getDLCColumnIcon(prayer.id)) | |||
:css('text-align', 'center') | |||
:attr('data-sort-value', Icons.getExpansionID(prayer.id)) | |||
:tag('td'):wikitext(level) | |||
:css('text-align', 'center') | |||
:tag('td'):wikitext(p._getPrayerEffect(prayer)) | |||
:tag('td'):wikitext(p.getPrayerCost(prayer)) | |||
end | end | ||
return tostring(html) | |||
return | |||
end | end | ||
return p | return p |
Latest revision as of 13:02, 8 July 2024
Documentation for this module may be created at Module:Prayer/doc
local p = {}
local Shared = require('Module:Shared')
local GameData = require('Module:GameData')
local Modifiers = require('Module:Modifiers')
local Skills = require('Module:Skills')
local Icons = require('Module:Icons')
local Items = require('Module:Items')
local ItemSources = require('Module:Items/SourceTables')
local Num = require('Module:Number')
function p.getPrayerByID(id)
return GameData.getEntityByID('prayers', id)
end
function p.getPrayer(name)
return GameData.getEntityByName('prayers', name)
end
function p.getPrayers(checkFunc)
return GameData.getEntities('prayers', checkFunc)
end
--Returns the expansion icon for the prayer if it has one
function p.getExpansionIcon(frame)
local prayerName = frame.args ~= nil and frame.args[1] or frame
local prayer = p.getPrayer(prayerName)
if prayer == nil then
return Shared.printError('No prayer named "' .. prayerName .. '" exists in the data module')
end
return Icons.getExpansionIcon(prayer.id)
end
function p.getPrayerCost(prayer)
local costLines = {}
if prayer.pointsPerPlayer > 0 then
local pluralString = prayer.pointsPerPlayer > 1 and 's' or ''
table.insert(costLines, prayer.pointsPerPlayer..' Prayer Point'..pluralString..' per player attack')
end
if prayer.pointsPerEnemy > 0 then
local pluralString = prayer.pointsPerEnemy > 1 and 's' or ''
table.insert(costLines, prayer.pointsPerEnemy..' Prayer Point'..pluralString..' per enemy attack')
end
if prayer.pointsPerRegen > 0 then
local pluralString = prayer.pointsPerRegen > 1 and 's' or ''
table.insert(costLines, prayer.pointsPerRegen..' Prayer Point'..pluralString..' when health regenerates')
end
return table.concat(costLines, '<br/>')
end
function p._getPrayerEffect(prayer, asList)
if asList == nil then asList = false end
local lineSep = (asList and '\n' or '<br>')
local chr = (asList and '* ' or '')
local bonusLines = {}
if prayer.isUnholy then
table.insert(bonusLines, "For each Unholy Mark stack on the enemy:")
end
if type(prayer.modifiers) == 'table' then
local formatLine = function(text) return chr .. text end
table.insert(bonusLines, Modifiers.getModifiersText(prayer.modifiers, false, false, 10, formatLine, lineSep))
end
if type(prayer.enemyModifiers) == 'table' then
local formatLine = function(text) return chr .. 'Gives the enemy: ' .. text end
table.insert(bonusLines, Modifiers.getModifiersText(prayer.enemyModifiers, false, false, 10, formatLine, lineSep))
end
if prayer.pointsPerPlayer > 0 then
-- Prayer XP ratio is 1/3 in game but is divided by 10 here as HP/damage values
-- displayed to the player are multiplied by 10 in the standard game mode
local xpRatio = 1 / 30
local val = xpRatio * prayer.pointsPerPlayer
table.insert(bonusLines, chr .. "+" .. Num.round(val, 3, 3) .. " Prayer XP per damage done")
end
return table.concat(bonusLines, lineSep)
end
function p.getPrayerEffect(frame)
local prayerName = frame.args ~= nil and frame.args[1] or frame[1]
local asListTxt = frame.args ~= nil and frame.args[2] or frame[2]
local asList = asListTxt ~= nil and asListTxt ~= 'false' and asListTxt ~= 'no'
local prayer = p.getPrayer(prayerName)
if prayer == nil then
return Shared.printError('No prayer named "' .. prayerName .. '" exists in the data module')
end
return p._getPrayerEffect(prayer, asList)
end
function p._getPrayerStat(prayer, statName)
if statName == "prayerCost" then
return p.getPrayerCost(prayer)
elseif statName == "prayerEffect" then
return p._getPrayerEffect(prayer)
elseif statName == "prayerEffectList" then
return p.getPrayerEffect(prayer)
elseif statName == 'prayerLevel' then
return Skills.getRecipeRequirementText('Prayer', prayer)
else
return prayer[statName]
end
end
function p.getPrayerStat(frame)
local prayerName = frame.args ~= nil and frame.args[1] or frame[1]
local statName = frame.args ~= nil and frame.args[2] or frame[2]
local prayer = p.getPrayer(prayerName)
if prayer == nil then
return Shared.printError('No prayer named "' .. prayerName .. '" exists in the data module')
end
return p._getPrayerStat(prayer, statName)
end
function p._getPrayerCategories(prayer)
return '[[Category:Prayers]]'
end
function p.getPrayerCategories(frame)
local prayerName = frame.args ~= nil and frame.args[1] or frame[1]
local prayer = p.getPrayer(prayerName)
if prayer == nil then
return Shared.printError('No prayer named "' .. prayerName .. '" exists in the data module')
end
return p._getPrayerCategories(prayer)
end
-- Returns only the regular prayers.
function p.getPrayerTable(frame)
local func = function(prayer)
return not prayer.isUnholy and not prayer.isAbyssal
end
return p.getPrayerTableFiltered(frame, func)
end
function p.getUnholyPrayerTable(frame)
return p.getPrayerTableFiltered(frame, function(prayer) return prayer.isUnholy end)
end
function p.getAbyssalPrayerTable(frame)
return p.getPrayerTableFiltered(frame, function(prayer) return prayer.isAbyssal end, 'Abyssal Realm')
end
-- Realm is defined "manually" here to define custom styling
function p.getPrayerTableFiltered(frame, prayerPredicate, realm)
local skillID = 'Prayer'
local realm = realm or 'Melvor Realm'
local html = mw.html.create('table')
:addClass('wikitable sortable stickyHeader')
html:tag('tr'):addClass('headerRow-0')
:tag('th'):attr('colspan', 2)
:wikitext('Prayer')
:tag('th'):wikitext('DLC')
:tag('th'):wikitext(Icons.Icon({'Prayer', type='skill', notext=true}) .. '<br>Level')
:tag('th'):wikitext('Effects')
:tag('th'):wikitext('Point Cost')
local prayerList = p.getPrayers(prayerPredicate)
table.sort(prayerList, function(a, b) return Skills.standardRecipeSort(skillID, a, b) end)
for i, prayer in ipairs(prayerList) do
local level = Skills.getRecipeLevel(skillID, prayer)
local reqText = Skills.getRecipeRequirementText(skillID, prayer)
html:tag('tr')
:tag('td'):wikitext(Icons.Icon({prayer.name, type='prayer', notext=true}))
:tag('td'):wikitext('[[' .. prayer.name .. ']]')
:tag('td'):wikitext(Icons.getDLCColumnIcon(prayer.id))
:css('text-align', 'center')
:attr('data-sort-value', Icons.getExpansionID(prayer.id))
:tag('td'):wikitext(level)
:css('text-align', 'center')
:tag('td'):wikitext(p._getPrayerEffect(prayer))
:tag('td'):wikitext(p.getPrayerCost(prayer))
end
return tostring(html)
end
return p