Module:Skills/Summoning

From Melvor Idle
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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

local p = {}

local Constants = require('Module:Constants')
local Shared = require('Module:Shared')
local GameData = require('Module:GameData')
local SkillData = GameData.skillData
local Items = require('Module:Items')
local Icons = require('Module:Icons')

function p.getMarkTable(frame)
	local result = ''
	result = result..'{| class="wikitable sortable stickyHeader"'
	result = result..'\r\n|- class="headerRow-0"'
	result = result..'\r\n!colspan="2"|Mark!!'..Icons.Icon({'Summoning', type='skill', notext=true})..' Level'
	result = result..'!!Discovered in'

	local Familiars = GameData.getEntities(SkillData.Summoning.recipes, function(recipe) return true end)
	table.sort(Familiars, function(a, b) return a.level < b.level end)

	local rowArray = {}
	for i, Fam in ipairs(Familiars) do
		local item = Items.getItemByID(Fam.productID)
		if item ~= nil then
			local rowText = '|-'
			rowText = rowText..'\r\n|data-sort-value="'..item.name..'"|'..Icons.Icon({item.name, type='mark', notext=true, size='50'})
			rowText = rowText..'||' .. Icons.getExpansionIcon(Fam.id) .. Icons.Icon({item.name, 'Mark of the ' .. item.name, type='mark', noicon=true})
			rowText = rowText..'||style="text-align:right"|'..Fam.level
			local discoveredArray = {}
			for j, SkillID in ipairs(Fam.skillIDs) do
				table.insert(discoveredArray, Icons.Icon({Constants.getSkillName(SkillID), type='skill'}))
			end
			rowText = rowText..'||'..table.concat(discoveredArray, '<br/>')
			table.insert(rowArray, rowText)
		end
	end

	result = result..'\r\n'..table.concat(rowArray, '\r\n')
	result = result..'\r\n|}'
	return result
end

function p.getTabletTable(frame)
	local result = ''
	result = result..'{| class="wikitable sortable stickyHeader"'
	result = result..'\r\n|- class="headerRow-0"'
	result = result..'\r\n!colspan="2"|Name!!'..Icons.Icon({'Summoning', type='skill', notext=true})..' Level'
	result = result..'!!Tier!!Effect!!' .. Icons.Icon({'Melee', notext=true, nolink=true}) .. ' Max Hit!!Shard Cost!!Secondary!!Creation XP'

	local Familiars = GameData.getEntities(SkillData.Summoning.recipes, function(recipe) return true end)
	table.sort(Familiars, function(a, b) return a.level < b.level end)

	local rowArray = {}
	for i, Fam in ipairs(Familiars) do
		local item = Items.getItemByID(Fam.productID)
		if item ~= nil then
			local maxHit, maxHitText = Items._getItemStat(item, 'summoningMaxhit'), ''
			if maxHit == nil then
				maxHitText = 'class="table-na" data-sort-value="-1"| N/A'
			else
				maxHit = maxHit * 10
				maxHitText = 'style="text-align:right;" data-sort-value="' .. maxHit .. '"|' .. Shared.formatnum(maxHit)
			end
			local effectDesc = Constants.getModifiersText(item.modifiers, false)
			local rowText = '|-'
			rowText = rowText..'\r\n|data-sort-value="'..item.name..'"|'..Icons.Icon({item.name, type='item', notext=true, size='50'})
			rowText = rowText..'||' .. Icons.getExpansionIcon(Fam.id) .. Icons.Icon({item.name, type='item', noicon=true})
			rowText = rowText..'||style="text-align:right"|'..Fam.level
			rowText = rowText..'||style="text-align:right"|'..Fam.tier
			rowText = rowText..'||'..effectDesc..'||'..maxHitText

			-- Create item requirements text
			local ShardCostArray, OtherCostArray = {}, {}
			-- Shards
			for j, cost in ipairs(Fam.itemCosts) do
				local shard = Items.getItemByID(cost.id)
				if shard ~= nil then
					table.insert(ShardCostArray, Icons.Icon({shard.name, type='item', notext=true, qty=cost.quantity}))
				end
			end
			rowText = rowText..'||style="text-align:right"|'..table.concat(ShardCostArray, ', ')..'&nbsp;'

			-- Other costs
			local recipeGPCost = SkillData.Summoning.recipeGPCost
			if Fam.gpCost > 0 then
				table.insert(OtherCostArray, Icons.GP(Fam.gpCost))
			end
			if Fam.scCost > 0 then
				table.insert(OtherCostArray, Icons.SC(Fam.scCost))
			end
			for j, nonShardID in ipairs(Fam.nonShardItemCosts) do
				local nonShard = Items.getItemByID(nonShardID)
				if nonShard ~= nil then
					local itemValue = math.max(nonShard.sellsFor, 20)
					local nonShardQty = math.max(1, math.floor(recipeGPCost / itemValue))
					table.insert(OtherCostArray, Icons.Icon({nonShard.name, type='item', notext=true, qty=nonShardQty}))
				end
			end
			rowText = rowText..'||style="text-align:right"|'..table.concat(OtherCostArray, "<br/>'''OR''' ")
			rowText = rowText..'||style="text-align:right"|'..Fam.baseExperience
			table.insert(rowArray, rowText)
		end
	end

	result = result..'\r\n'..table.concat(rowArray, '\r\n')

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

function p._getSynergyTable(familiarID)
	local result = ''
	result = result..'{| class="wikitable sortable stickyHeader"'
	result = result..'\r\n|- class="headerRow-0"'
	result = result..'\r\n!colspan="2"|Familiar 1!!colspan="2"|Familiar 2!!Effect!!Requirements'

	local synergyList = GameData.getEntities(SkillData.Summoning.synergies,
		function(synergy)
			return familiarID == nil or Shared.contains(synergy.summonIDs, familiarID)
		end)
	table.sort(synergyList, function (a, b) return (a.summonIDs[1] == b.summonIDs[1] and a.summonIDs[2] < b.summonIDs[2]) or a.summonIDs[1] < b.summonIDs[1] end)

	local recipesByID, famNames = {}, {}
	for i, recipe in ipairs(SkillData.Summoning.recipes) do
		recipesByID[recipe.id] = recipe
		local item = Items.getItemByID(recipe.productID)
		if item ~= nil then
			famNames[recipe.id] = item.name
		end
	end

	local rowArray = {}
	for i, syn in ipairs(synergyList) do
		local Fam1 = recipesByID[syn.summonIDs[1]]
		local Fam2 = recipesByID[syn.summonIDs[2]]
		if Fam1 ~= nil and Fam2 ~= nil then
			local FamName1 = famNames[Fam1.id] or 'Unknown'
			local FamName2 = famNames[Fam2.id] or 'Unknown'
			local synDesc = syn.customDescription
			if synDesc == nil then
				-- Generate description from modifiers
				synDesc = Constants.getModifiersText(syn.modifiers, false) or ''
			end
			local rowText = '|-'
			rowText = rowText..'\r\n|data-sort-value="'..FamName1..'"|'..Icons.Icon({FamName1, type='item', notext=true, size='30'})
			rowText = rowText..'||' .. Icons.getExpansionIcon(Fam1.id) .. Icons.Icon({FamName1, type='item', noicon=true})
			rowText = rowText..'||data-sort-value="'..FamName2..'"|'..Icons.Icon({FamName2, type='item', notext=true, size='30'})
			rowText = rowText..'||' .. Icons.getExpansionIcon(Fam2.id) .. Icons.Icon({FamName2, type='item', noicon=true})
			rowText = rowText..'||'..synDesc

			local reqArray = {}
			local reqLvl = math.max(Fam1.level, Fam2.level)
			table.insert(reqArray, Icons._SkillReq('Summoning', reqLvl))
			table.insert(reqArray, FamName1..' Mark Level '..(Fam2.tier + 1))
			table.insert(reqArray, FamName2..' Mark Level '..(Fam1.tier + 1))

			rowText = rowText..'||data-sort-value="'..reqLvl..'"|'..table.concat(reqArray, '<br/>')

			table.insert(rowArray, rowText)
		end
	end

	result = result..'\r\n'..table.concat(rowArray, '\r\n')

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

function p.getSynergyTable(frame)
	return p._getSynergyTable()
end

function p.getFamiliarSynergyTable(frame)
	local famName = frame.args ~= nil and frame.args[1] or frame
	local familiarID = nil
	local familiarItem = Items.getItem(famName)
	if familiarItem == nil then
		return Shared.printError('Not a valid familiar')
	else
		for i, recipe in ipairs(SkillData.Summoning.recipes) do
			if recipe.productID == familiarItem.id then
				familiarID = recipe.id
				break
			end
		end
		if familiarID == nil then
			return Shared.printError('Not a valid familiar')
		else
			return p._getSynergyTable(familiarID)
		end
	end
end

function p._getSkillSummoningBonusTable(skill)
	local rowArray = {}
	local famNames = {}

	-- Familiars
	for i, recipe in ipairs(SkillData.Summoning.recipes) do
		local item = Items.getItemByID(recipe.productID)
		if item ~= nil then
			famNames[recipe.id] = item.name
			if item.modifiers ~= nil and not Shared.tableIsEmpty(item.modifiers) then
				local famSkills = Constants.getModifierSkills(item.modifiers)
				if Shared.contains(famSkills, skill) then
					table.insert(rowArray, {Fam1 = item.name, FamID1 = item.id, Fam2 = nil, FamID2 = nil, Descrip = Constants.getModifiersText(item.modifiers, false)})
				end
			end
		end
	end

	-- Synergies
	for i, syn in ipairs(SkillData.Summoning.synergies) do
		local synSkills = Constants.getModifierSkills(syn.modifiers)
		if Shared.contains(synSkills, skill) then
			local FamName1 = famNames[syn.summonIDs[1]] or 'Unknown'
			local FamName2 = famNames[syn.summonIDs[2]] or 'Unknown'
			local synDesc = syn.customDescription
			if synDesc == nil then
				-- Generate description from modifiers
				synDesc = Constants.getModifiersText(syn.modifiers, false) or ''
			end
			table.insert(rowArray, {Fam1 = FamName1, FamID1 = syn.summonIDs[1], Fam2 = FamName2, FamID2 = syn.summonIDs[2], Descrip = synDesc})
		end
	end

	if Shared.tableIsEmpty(rowArray) then
		return ''
	end

	local resultPart = {}
	table.insert(resultPart, '{| class="wikitable sortable stickyHeader"')
  	table.insert(resultPart, '\r\n|- class="headerRow-0"')
	table.insert(resultPart, '\r\n!colspan="2"|Familiar 1!!colspan="2"|Familiar 2!!Effect')

	for i, rowItem in ipairs(rowArray) do
		table.insert(resultPart, '\r\n|-')
	    table.insert(resultPart, '\r\n|data-sort-value="'..rowItem.Fam1..'"|'..Icons.Icon({rowItem.Fam1, type='item', notext=true, size='30'}))
		table.insert(resultPart, '||' .. Icons.getExpansionIcon(rowItem.FamID1) .. Icons.Icon({rowItem.Fam1, type='item', noicon=true}))
		if rowItem.Fam2 ~= nil then
			table.insert(resultPart, '||data-sort-value="'..rowItem.Fam2..'"|'..Icons.Icon({rowItem.Fam2, type='item', notext=true, size='30'}))
			table.insert(resultPart, '||' .. Icons.getExpansionIcon(rowItem.FamID2) .. Icons.Icon({rowItem.Fam2, type='item', noicon=true}))
		else
			table.insert(resultPart, '|| || ')
		end
		table.insert(resultPart, '||'..(rowItem.Descrip or ' '))
	end

	table.insert(resultPart, '\r\n|}')
	return table.concat(resultPart)
end

function p.getSkillSummoningBonusTable(frame)
	local skillName = frame.args ~= nil and frame.args[1] or frame
	return p._getSkillSummoningBonusTable(skillName)
end

return p