Join our new Discord server!

Module:StatsTable

From Etrian Odyssey Wiki

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

local p = {}

-- Builds the table on the /Stats subpage
function p.stats_table(frame)
	-- Name input for convenience
	local in_args = frame:getParent().args
	local int_wis = frame.args.int_wis
	local max_lv = frame.args.max_lv or 99
	
	-- Set up variables for building the table
	local tbl_width = "60%"
	local col_width = "13%"
	local stats = {"HP", "TP", "STR", "TEC", "VIT", "AGI", "LUC"}
	-- If the game has the INT/WIS split (EO5 on), adjust for that
	if int_wis ~= nil then
		tbl_width = "70%"
		col_width = "11.375%"
		stats = {"HP", "TP", "STR", "INT", "VIT", "WIS", "AGI", "LUC"}
	end

	-- Start building the output table
    out_table = mw.html.create("table")
    	:addClass("wikitable"):css("width", tbl_width)
    	:tag("tr")
    		:tag("th"):css("width", "9%"):wikitext("Lv."):done()
    for i = 1, #stats do
    	out_table:tag("th"):css("width", col_width):wikitext(stats[i]):done()
    end
    out_table:done()
    
    -- Loop for each level to add the stats to the table
    for i = 1, max_lv do
    	local tr = out_table:tag("tr")
    		:tag("th"):wikitext(i):done()
    	for s = 1, #stats do
    		tr:tag("td"):wikitext(in_args[s + (#stats * (i - 1))]):done()
    	end
    	tr:done()
    	
    	-- Show the headings again after every 10 levels, makes it easier to read
    	if i % 10 == 0 then
	    	tr = out_table:tag("tr")
	    		:tag("th"):css("width", "9%"):wikitext("Lv."):done()
	    	for i = 1, #stats do
		    	tr:tag("th"):css("width", col_width):wikitext(stats[i]):done()
		    end
	    	tr:done()
	    end
    end
    
    return out_table:done()
end

-- Builds the shorter (every 10 levels) table used on class pages
function p.short(frame)
	-- Name input for convenience
	local in_args = frame:getParent().args
	local game = in_args.game or in_args[1]
	local class = in_args.class or in_args[2]
	local max_lv = in_args.max_level or in_args[3] or 99
	local min_lv = in_args.min_level or in_args[4] or 1
	local cargo = mw.ext.cargo
	
	-- Set up variables for building the table
	local tbl_width = "60%"
	local col_width = "13%"
	local stats = {"HP", "TP", "STR", "TEC", "VIT", "AGI", "LUC"}
	local cq_fields = {"level", "hp", "tp", "strength", "technique", "vitality", "agility", "luck"}
	-- If the game has the INT/WIS split (EO5 on), adjust for that
	if game == "EO5" or game == "EON" then
		tbl_width = "70%"
		col_width = "11.375%"
		stats = {"HP", "TP", "STR", "INT", "VIT", "WIS", "AGI", "LUC"}
		cq_fields = {"level", "hp", "tp", "strength", "intellect", "vitality", "wisdom", "agility", "luck"}
	end

	-- In EO5 legendary titles' stats are modifiers;
	-- this appends a + sign to the value if the class being called is a legendary title
	local add_plus = ""	
	if game == "EO5" and not (class == "Earthlain" or class == "Celestrian" or class == "Therian" or class == "Brouni" or class == "Hawk" or class == "Hound" or class == "Wraith") then
		add_plus = "+"
	end
	
	-- Cargo query arguments:
	-- limit: cut off at the specified max level
	-- offset: start at the specified min level (only relevant for EO5 legendary titles)
	local cq_args = {
		where = "class_name = '" .. class .. "' and (level = 1 or (level % 10 = 0) or level = " .. max_lv .. ")",
		limit = 1 + math.ceil(tonumber(max_lv) / 10),
		offset = math.floor(tonumber(min_lv) / 10)
	}
	
	local cq_result = cargo.query("ClassStats_" .. game, table.concat(cq_fields, ","), cq_args)
	
	-- Start building the output table
    out_table = mw.html.create("table")
    	:addClass("wikitable"):css("width", tbl_width)
    	:tag("tr")
    		:tag("th"):css("width", "9%"):wikitext("Lv."):done()
    for i = 1, #stats do
    	out_table:tag("th"):css("width", col_width):wikitext(stats[i]):done()
    end
    out_table:done()
	
	-- Loop through the returned values to build the table
	for i, v in ipairs(cq_result) do
		local tr = out_table:tag("tr")
    		:tag("th"):wikitext(v.level):done()
    	-- Start at 2 because 1 is level, which is already done
    	for s = 2, #cq_fields do
    		tr:tag("td"):wikitext(add_plus .. v[cq_fields[s]]):done()
    	end
    	tr:done()
	end
	
	return out_table:done()
end

function p.short_eo5(frame)
	-- Name input for convenience
	local in_args = frame:getParent().args
	local title = in_args.class or in_args[2]
	local race = frame.args.race
	local cargo = mw.ext.cargo
	
	-- Set up variables for building the table
	tbl_width = "70%"
	col_width = "11.375%"
	stats = {"HP", "TP", "STR", "INT", "VIT", "WIS", "AGI", "LUC"}
	cq_fields = {"level", "hp", "tp", "strength", "intellect", "vitality", "wisdom", "agility", "luck"}
	
	-- Cargo query arguments
	local title_args = {
		where = "class_name = '" .. title .. "' and (level = 1 or (level % 10 = 0) or level = 99)",
		offset = 2
	}
	local race_args = {
		where = "class_name = '" .. race .. "' and (level = 1 or (level % 10 = 0) or level = 99)",
		offset = 2
	}
	
	local title_result = cargo.query("ClassStats_EO5", table.concat(cq_fields, ","), title_args)
	local race_result = cargo.query("ClassStats_EO5", table.concat(cq_fields, ","), race_args)
	
	-- Start building the output table
    out_table = mw.html.create("table")
    	:addClass("wikitable"):css("width", tbl_width)
    	:tag("tr")
    		:tag("th"):css("width", "9%"):wikitext("Lv."):done()
    for i = 1, #stats do
    	out_table:tag("th"):css("width", col_width):wikitext(stats[i]):done()
    end
    out_table:done()
	
	-- Loop through the returned values to build the table
	for i, v in ipairs(title_result) do
		local tr = out_table:tag("tr")
    		:tag("th"):wikitext(v.level):done()
    	-- Start at 2 because 1 is level, which is already done
    	for s = 2, #cq_fields do
    		tr:tag("td"):wikitext(tonumber(race_result[i][cq_fields[s]]) + tonumber(v[cq_fields[s]])):done()
    	end
    	tr:done()
	end
	
	return out_table:done()
end

return p