Module:Sandbox/SkillTree

From Melvor Idle
Revision as of 11:16, 5 September 2024 by Toadmilk (talk | contribs) (Undo revision 82395 by Toadmilk (talk))

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

local p = {}

local GameData = require('Module:GameData')

function p.getSkillTreeNodes(checkFunc)
    local nodes = {}
    
    for skillName, skillData in pairs(GameData.skillData) do
        local skillTrees = skillData.skillTrees
        if skillTrees then
            for _, skillTree in ipairs(skillTrees) do
                for _, node in ipairs(GameData.getEntities(skillTree.nodes, checkFunc)) do
                    local nodeCopy = {}
                    for k, v in pairs(node) do
                        nodeCopy[k] = v
                    end

                    nodeCopy.skillName = skillName

                    table.insert(nodes, nodeCopy)
                end
            end
        end
    end
    return nodes
end

function p.getSkillTreeNodesFromSkillName(skillName)
	mw.log(GameData.skillData)
	
    local skillData = GameData.skillData[skillName]
    if not skillData then return nil end

    local nodes = {}
    for _, node in ipairs(skillData.skillTrees[1].nodes) do
        table.insert(nodes, node)
    end
    return nodes
end

function p.generateSkillTree(frame)
    local args = frame.args ~= nil and frame.args or frame
    local skillName = args[1]
    
    if not skillName then
        return "Invalid skillName"
    end
    
    local skillNodes = p.getSkillTreeNodesFromSkillName(skillName)

    if not skillNodes then
        return "No skill tree found for: " .. skillName
    end

    local html = mw.html.create('div')

    for _, node in ipairs(skillNodes) do
	    local nodeDiv = html:tag('div')
	        :tag('h4'):wikitext(node.name):done()
	        :tag('p'):wikitext('Points: ' .. node.costs.points):done()
	
	    if node.modifiers then
	        local modifierText = ""
	        for modifier, data in pairs(node.modifiers) do
	            if type(data) == "table" then
	                modifierText = modifierText .. modifier .. ": Skill: " .. (data.skillID or "N/A") .. ", Value: " .. (data.value or "N/A") .. "<br>"
	            else
	                modifierText = modifierText .. modifier .. ": " .. tostring(data) .. "<br>"
	            end
	        end
	        nodeDiv:tag('p'):wikitext(modifierText):done()
	    end
	
	    if node.combatEffects then
	        local combatEffectText = ""
	        for _, effect in pairs(node.combatEffects) do
	            combatEffectText = combatEffectText .. "Effect ID: " .. (effect.effectID or "N/A") .. ", Chance: " .. (effect.chance or "N/A") .. "%<br>"
	            if effect.condition then
	                combatEffectText = combatEffectText .. "Condition Type: " .. (effect.condition.type or "N/A") .. "<br>"
	            end
	        end
	        nodeDiv:tag('p'):wikitext(combatEffectText):done()
	    end
	
	    html:done()
	end


    return tostring(html)
end




return p