Module:LevelUpTable/Data

From Melvor Idle
< Module:LevelUpTable
Revision as of 13:21, 5 July 2024 by Ricewind (talk | contribs) (Add farming plot data)

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

-- SkillData object that acts as an interface for data shared between skills.
local p = {}

local Debug = require('Module:Debug') --  < Remove when module is finished.
local GameData = require('Module:GameData')
local SkillData = GameData.skillData
local Skills = require('Module:Skills')
local Items = require('Module:Items')
local Shared = require('Module:Shared')

local UnlockData = {}
UnlockData.__index = UnlockData

function UnlockData.new(id, name, level, skill)
    local self = setmetatable({}, UnlockData)
    self.name = name
    self.level = level
    self.skill = skill
    self.id = id
    return self
end

--==== Helper functions ====--
-- Mimicks the C# Select method.
function Select(list, selector)
    local result = {}
    for _, item in ipairs(list) do
        table.insert(result, selector(item))
    end
    return result
end

function Concat(...)
    local args = {...}
    local result = {}
    for _, tbl in ipairs(args) do
        for _, value in ipairs(tbl) do
            table.insert(result, value)
        end
    end
    return result
end

function getRealmFromID(obj)
	local ns, _ = Shared.getLocalID(obj.id)
	if ns == 'melvorItA' then
		return 'melvorItA:Abyssal'
	else
		return 'melvorD:Melvor'
	end
end

function getDataSet(skillData, realm)
	return GameData.getEntities(skillData, function(x) return Skills.getRecipeRealm(x) == realm.id end)
end

function getDataSetId(skillData, realm)
	return GameData.getEntities(skillData, function(x) return getRealmFromID(x) == realm.id end)
end

--==== Skill Data Collection ====--
function getWoodcuttingData(realm)
	local skillID = 'Woodcutting'
	local data = getDataSet(SkillData.Woodcutting.trees, realm)
	
	return Select(data, function(x) 
		return UnlockData.new(x.id, x.name, Skills.getRecipeLevel(skillID, x), skillID)
	end)
end

function getMiningData(realm)
	local skillID = 'Mining'
	local data = getDataSet(SkillData.Mining.rockData, realm)
	
	return Select(data, function(x) 
		return UnlockData.new(x.id, x.name, Skills.getRecipeLevel(skillID, x), skillID)
	end)
end

function getFishingData(realm)
	local skillID = 'Fishing'
	local data = getDataSet(SkillData.Fishing.fish, realm)
	
	return Select(data, function(x) 
		return UnlockData.new(x.id, x.name, Skills.getRecipeLevel(skillID, x), skillID)
	end)
end

function getThievingData(realm)
	local skillID = 'Thieving'
	local data = getDataSet(SkillData.Thieving.npcs, realm)
	
	return Select(data, function(x) 
		return UnlockData.new(x.id, x.name, Skills.getRecipeLevel(skillID, x), skillID)
	end)
end

function getFarmingData(realm)
	local skillID = 'Farming'
	local data = getDataSet(SkillData.Farming.recipes, realm)
	-- Create lookup for plot category name.
	local plotLookup = {}
	for _, plot in ipairs(SkillData.Farming.categories) do
        plotLookup[plot.id] = plot.name
    end

	local seeds = Select(data, function(x) 
		local productItem = Items.getItemByID(x.productId)
		return UnlockData.new(productItem.id, productItem.name, Skills.getRecipeLevel(skillID, x), skillID)
	end)
	
	local plotData = getDataSetId(SkillData.Farming.plots, realm)
	local plots = Select(plotData, function(x)
		return UnlockData.new(x.id, plotLookup[x.categoryID], Skills.getRecipeLevel(skillID, x), "Farming Plot")
	end)

	return Concat(seeds, plots)
end

function p.test()
	--local realmName = 'Abyssal Realm'
	local realm = Skills.getRealmFromName(realmName)
	Debug.log(getFarmingData(realm))
end

p.UnlockData = UnlockData
return p