Module:Prayer: Difference between revisions

From Melvor Idle
(Update for v1.1)
(Removed functions in favour of manual tables)
 
(19 intermediate revisions by 4 users not shown)
Line 1: Line 1:
local p = {}
local p = {}
local SkillData = mw.loadData('Module:Skills/data')


local Shared = require('Module:Shared')
local Shared = require('Module:Shared')
local Constants = require('Module:Constants')
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 19: Line 19:


function p.getPrayers(checkFunc)
function p.getPrayers(checkFunc)
return GameData.getEntities('prayer', 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


if type(prayer.modifiers) == 'table' then
table.insert(bonusLines, Modifiers.getModifiersText(prayer.modifiers, false, false, 10, formatLine, lineSep))
for bonusKey, bonusVal in Shared.skpairs(prayer.modifiers) do
table.insert(bonusLines, chr .. Constants._getModifierText(bonusKey, bonusVal, false))
end
end
end


if type(prayer.enemyModifiers) == 'table' then
if type(prayer.enemyModifiers) == 'table' then
for bonusKey, bonusVal in Shared.skpairs(prayer.enemyModifiers) do
local formatLine = function(text) return chr .. 'Gives the enemy: ' .. text end
table.insert(bonusLines, chr .. 'Gives the enemy: ' .. Constants._getModifierText(bonusKey, bonusVal, false))
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 .. "+" .. Shared.round(val, 3, 3) .. " Prayer XP per damage done")
table.insert(bonusLines, chr .. "+" .. Num.round(val, 3, 3) .. " Prayer XP per damage done")
end
if asList then
return table.concat(bonusLines, '\r\n')
else
return table.concat(bonusLines, '<br/>')
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 "ERROR: Could not find a prayer named "..prayerName
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 Icons._SkillReq('Prayer', prayer['prayerLevel'])
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 "ERROR: Could not find a prayer named "..prayerName
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 "ERROR: Could not find a prayer named "..prayerName
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 result = '{| class="wikitable sortable stickyHeader"'
local func = function(prayer)
result = result..'\r\n|-class=headerRow-0'
return not prayer.isUnholy and not prayer.isAbyssal
result = result..'\r\n!colspan="2"|Prayer!!'..Icons.Icon({"Prayer", type="skill", notext=true})..' Lvl'
end
result = result..'!!Effects!!Point Cost'
return p.getPrayerTableFiltered(frame, func)
end


local prayerList = p.getPrayers(function(prayer) return true end)
function p.getUnholyPrayerTable(frame)
table.sort(prayerList, function(a, b)
return p.getPrayerTableFiltered(frame, function(prayer) return prayer.isUnholy end)
if a.level == b.level then
end
return a.name < b.name
else
return a.level < b.level
end
end)


for i, prayer in ipairs(prayerList) do
function p.getAbyssalPrayerTable(frame)
result = result..'\r\n|-'
return p.getPrayerTableFiltered(frame, function(prayer) return prayer.isAbyssal end, 'Abyssal Realm')
result = result..'\r\n|'..Icons.Icon({prayer.name, type='prayer', notext=true, size='50'})
end
result = result..'||'..Icons.Icon({prayer.name, type='prayer', noicon=true})..'||'..prayer.prayerLevel
 
result = result..'||'..p._getPrayerEffect(prayer)
-- Realm is defined "manually" here to define custom styling
result = result..'||'..p.getPrayerCost(prayer)
function p.getPrayerTableFiltered(frame, prayerPredicate, realm)
end
local skillID = 'Prayer'
local realm = realm or 'Melvor Realm'
local html = mw.html.create('table')
:addClass('wikitable sortable stickyHeader')


result = result..'\r\n|}'
html:tag('tr'):addClass('headerRow-0')
return result
:tag('th'):attr('colspan', 2)
end
  :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')


function p.getBonesTable(frame)
local prayerList = p.getPrayers(prayerPredicate)
local result = '{| class="wikitable sortable stickyHeader"'
table.sort(prayerList, function(a, b) return Skills.standardRecipeSort(skillID, a, b) end)
result = result..'\r\n|- class="headerRow-0"'
result = result..'\r\n!colspan="2"|Bone!!Prayer Points!!Sources'


local itemArray = Items.getItems(function(item) return item.prayerPoints ~= nil and item.prayerPoints > 0 end)
for i, prayer in ipairs(prayerList) do
table.sort(itemArray, function(a, b) return a.prayerPoints < b.prayerPoints end)
local level = Skills.getRecipeLevel(skillID, prayer)
for i, item in ipairs(itemArray) do
local reqText = Skills.getRecipeRequirementText(skillID, prayer)
result = result..'\r\n|-'
result = result..'\r\n|'..Icons.Icon({item.name, type='item', notext=true, size='50'})
html:tag('tr')
result = result..'||'..Icons.Icon({item.name, type='item', noicon=true})
:tag('td'):wikitext(Icons.Icon({prayer.name, type='prayer', notext=true}))
result = result..'||style="text-align:right;"|'..Shared.formatnum(item.prayerPoints)
:tag('td'):wikitext('[[' .. prayer.name .. ']]')
result = result..'||'..ItemSources._getItemSources(item, false, false)
: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


result = result..'\r\n|}'
return tostring(html)
 
return result
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