Module:Prayer: Difference between revisions
From Melvor Idle
(_getPrayerEffect: Correct XP per damage value following 1.0 changes) |
(Removed functions in favour of manual tables) |
||
(22 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 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) | ||
return GameData.getEntityByID('prayers', id) | |||
end | end | ||
function p.getPrayer(name) | function p.getPrayer(name) | ||
return GameData.getEntityByName('prayers', name) | |||
end | end | ||
function p.getPrayers(checkFunc) | function p.getPrayers(checkFunc) | ||
local | 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 | end | ||
return | |||
return Icons.getExpansionIcon(prayer.id) | |||
end | end | ||
function p.getPrayerCost(prayer) | 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 | end | ||
function p._getPrayerEffect(prayer, asList) | 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 | end | ||
function p.getPrayerEffect(frame) | 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 | end | ||
function p._getPrayerStat(prayer, statName) | 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 | end | ||
function p.getPrayerStat(frame) | 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 | end | ||
function p._getPrayerCategories(prayer) | function p._getPrayerCategories(prayer) | ||
return '[[Category:Prayers]]' | |||
end | end | ||
function p.getPrayerCategories(frame) | 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 | end | ||
-- Returns only the regular prayers. | |||
function p.getPrayerTable(frame) | 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 | end | ||
function p. | -- 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 | 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