Module:Skills/Cartography: Difference between revisions

From Melvor Idle
(Added discovery rewards & unlock requirements)
(Added 'Active' and "Port' types to the table)
Line 93: Line 93:
table.insert(tableStr, Icons.Icon({POI.name, type='poi', notext='true', nolink='true'}))
table.insert(tableStr, Icons.Icon({POI.name, type='poi', notext='true', nolink='true'}))
table.insert(tableStr, '||'..POI.name)
table.insert(tableStr, '||'..POI.name)
table.insert(tableStr, '||'..POI.type)
local POIType = POI.type
if POIType == 'DigSite' then
POIType = 'Dig Site'
else
if POI.activeModifiers ~= nil then
POIType = 'Active'
elseif POI.fastTravel ~= nil then
POIType = 'Port'
end
end
table.insert(tableStr, '||'..POIType)
table.insert(tableStr, '||'..X)
table.insert(tableStr, '||'..X)
table.insert(tableStr, '||'..Y)
table.insert(tableStr, '||'..Y)

Revision as of 15:36, 13 September 2023

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

local p = {}

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

function p.getPointOfInterest(name)
	for i, POI in pairs(SkillData.Cartography.worldMaps[1].pointsOfInterest) do
		if POI.name == name then
			return POI
		end
	end
	return nil
end

function p.getHexByAxial(Q, R)
	--Assume if R is nil that a pair was sent in
	if R == nil then
		R = Q.r
		Q = Q.q
	end
	
	for i, hex in pairs(SkillData.Cartography.worldMaps[1].hexes) do
		local coords = hex.coordinates
		if coords.q == Q and coords.r == R then
			return hex
		end
	end
	return nil
end

function p.getHexByXY(X, Y)
	local Q, R = p.convertXYToAxial(X, Y)
	return p.getHexByAxial(Q, R)
end

function p.convertXYToAxial(X, Y)
	--Assume that if Y is nil that a pair was sent in
	if Y == nil then
		Y = X.y
		X = X.x
	end
	local Q = X
	local R = Y - (X - (X % 2)) / 2
	return Q, R
end

function p.convertAxialToXY(Q, R)
	--Assume if r is nil that a pair was sent in
	if R == nil then
		R = Q.r
		Q = Q.q
	end
	local Y = R + (Q - (Q % 2)) / 2
	local X = Q
	return X, Y
end

function p.test()
	--WIP for building table of Points of Interest
	--TODO:
	-- Handle discoveryRewards
	local POIs = {}
	local POI_Strings = {}
	local tableStr = {}
	table.insert(tableStr, '{| class="wikitable sortable"')
	table.insert(tableStr, '\r\n|-\r\n!colspan="2"|Name!!Type!!X!!Y!!Requirements!!Discovery Rewards!!Active Effect')
	
	for i, POI in pairs(SkillData.Cartography.worldMaps[1].pointsOfInterest) do
		table.insert(POIs, POI)
	end
	
	table.sort(POIs, function(a, b)
						local aX, aY = p.convertAxialToXY(a.coords)
						local bX, bY = p.convertAxialToXY(b.coords)
						if aX ~= bX then
							return aX < bX
						else
							return aY < bY
						end
					 end)
	
	for i, POI in pairs(POIs) do
		local X, Y = p.convertAxialToXY(POI.coords)
		local Hex = p.getHexByAxial(POI.coords)
		table.insert(POI_Strings, POI.name..' ('..X..', '..Y..')')
		
		table.insert(tableStr,'\r\n|-\r\n|')
		table.insert(tableStr, Icons.Icon({POI.name, type='poi', notext='true', nolink='true'}))
		table.insert(tableStr, '||'..POI.name)
		local POIType = POI.type
		if POIType == 'DigSite' then
			POIType = 'Dig Site'
		else
			if POI.activeModifiers ~= nil then
				POIType = 'Active'
			elseif POI.fastTravel ~= nil then
				POIType = 'Port'
			end
		end
		table.insert(tableStr, '||'..POIType)
		table.insert(tableStr, '||'..X)
		table.insert(tableStr, '||'..Y)
		
		--Add Requirements
		table.insert(tableStr, '\r\n|')
		local reqTable = {}
		local HexReqs = Common.getRequirementString(Hex.requirements, '')
		if HexReqs ~= '' then
			table.insert(reqTable, HexReqs)
		end
		if POI.hidden ~= nil then
			local POIReqs = Common.getRequirementString(POI.hidden.requirements, '')
			if POIReqs ~= '' then
				table.insert(reqTable, POIReqs)
			end
		end
		table.insert(tableStr, table.concat(reqTable, '<br/>'))
		
		--Add Discovery Rewards
		table.insert(tableStr, '\r\n|')
		if POI.discoveryRewards ~= nil then
			local rewardTable = {}
			if POI.discoveryRewards.gp ~= nil then
				table.insert(rewardTable, Icons.GP(POI.discoveryRewards.gp))
			end
			if POI.discoveryRewards.sc ~= nil then
				table.insert(rewardTable, Icons.SC(POI.discoveryRewards.sc))
			end
			if POI.discoveryRewards.items ~= nil then
				for j, reward in pairs(POI.discoveryRewards.items) do
					local item = Items.getItemByID(reward.id)
					local qty = reward.quantity
					table.insert(rewardTable, Icons.Icon({item.name, type='item', qty = qty}))
				end
			end
			table.insert(tableStr, table.concat(rewardTable,'<br/>'))
		end
		
		--TODO: Add Active Modifiers
		table.insert(tableStr, '\r\n|')
	end
	
	table.insert(tableStr, '\r\n|}')
	
	local keyset={}
	local n=0
	
	for k,v in pairs(SkillData.Cartography.worldMaps[1]) do
	  n=n+1
	  keyset[n]=k
	end
	--mw.log(mw.text.jsonEncode(SkillData.Cartography.worldMaps[1].hexes))
	
	return table.concat(tableStr, '')
end

return p