Module:Prayer: Difference between revisions

From Melvor Idle
(Try this again without using overloads)
(Add Unholy Prayer Table function)
Line 132: Line 132:
function p.getPrayerTable(frame)
function p.getPrayerTable(frame)
return p.getPrayerTableFiltered(frame, function(prayer) return true end)
return p.getPrayerTableFiltered(frame, function(prayer) return true end)
end
function p.getUnholyPrayerTable(frame)
return p.getPrayerTableFiltered(frame, function(prayer) return prayer.isUnholy end)
end
end



Revision as of 08:32, 10 October 2023

Documentation for this module may be created at Module:Prayer/doc

local p = {}

local Shared = require('Module:Shared')
local Constants = require('Module:Constants')
local GameData = require('Module:GameData')
local Icons = require('Module:Icons')
local Items = require('Module:Items')
local ItemSources = require('Module:Items/SourceTables')

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 chr = asList and '* ' or ''
	local bonusLines = {}

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

	if type(prayer.enemyModifiers) == 'table' then
		for bonusKey, bonusVal in Shared.skpairs(prayer.enemyModifiers) do
			table.insert(bonusLines, chr .. 'Gives the enemy: ' .. Constants._getModifierText(bonusKey, bonusVal, false))
		end
	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 .. "+" .. Shared.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

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 Icons._SkillReq('Prayer', prayer.level)
	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

function p.getPrayerTable(frame)
	return p.getPrayerTableFiltered(frame, function(prayer) return true end)
end

function p.getUnholyPrayerTable(frame)
	return p.getPrayerTableFiltered(frame, function(prayer) return prayer.isUnholy end)
end

function p.getPrayerTableFiltered(frame, prayerPredicate)
	local result = '{| class="wikitable sortable stickyHeader"'
	result = result..'\r\n|-class=headerRow-0'
	result = result..'\r\n!colspan="2"|Prayer!!'..Icons.Icon({"Prayer", type="skill", notext=true})..' Level'
	result = result..'!!Effects!!Point Cost'

	local prayerList = p.getPrayers(prayerPredicate)
	table.sort(prayerList, function(a, b)
		if a.level == b.level then
			return a.name < b.name
		else
			return a.level < b.level
		end
	end)

	for i, prayer in ipairs(prayerList) do
		result = result..'\r\n|-'
		result = result..'\r\n|'..Icons.Icon({prayer.name, type='prayer', notext=true, size='50'})
		result = result..'||' .. Icons.getExpansionIcon(prayer.id) .. Icons.Icon({prayer.name, type='prayer', noicon=true})
		result = result..'||style="text-align:right;"| '..prayer.level
		result = result..'||'..p._getPrayerEffect(prayer)
		result = result..'||'..p.getPrayerCost(prayer)
	end

	result = result..'\r\n|}'
	return result
end

function p.getBonesTable(frame)
	local result = '{| class="wikitable sortable stickyHeader"'
	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)
	table.sort(itemArray, function(a, b) return a.prayerPoints < b.prayerPoints end)
	for i, item in ipairs(itemArray) do
		result = result..'\r\n|-'
		result = result..'\r\n|'..Icons.Icon({item.name, type='item', notext=true, size='50'})
		result = result..'||' .. Icons.getExpansionIcon(item.id) .. Icons.Icon({item.name, type='item', noicon=true})
		result = result..'||style="text-align:right;"|'..Shared.formatnum(item.prayerPoints)
		result = result..'||'..ItemSources._getItemSources(item, false, false)
	end

	result = result..'\r\n|}'

	return result
end

return p