Module:EnemyStats2/Table/Test

From Darkest Dungeon Wiki
Jump to navigation Jump to search
Template-info.svg Documentation

This module is only used for testing changes to Module:EnemyStats2/Table. It should not be used in production!

Example

EnemyRegionTypesTiersHPSpeedDeath ArmorBleedBlightBurnStunMoveDebuff
Combat turnorder enemy lost battalion arbalist.png
Arbalist
The TangleCadaver151030%30%10%10%10%10%
Combat turnorder enemy lost battalion foot soldier.png
Foot Soldier
The TangleCadaver171130%30%10%50%10%10%
Combat turnorder enemy lost battalion drummer.png
Drummer
The TangleCadaver195030%30%10%30%10%20%
Combat turnorder enemy lost battalion bishop.png
Bishop
The TangleCadaver222030%30%20%20%20%30%
Combat turnorder enemy lost battalion knight.png
Knight
The TangleCadaver360340%20%10%40%40%30%
Combat turnorder enemy lost battalion arbalist b.png
Bullseye Barrett
The TangleCadaverChampion201140%40%10%10%20%10%
Combat turnorder enemy lost battalion knight b.png
Fallen Templar
The TangleCadaverChampion412350%30%10%40%40%30%
Tap RootThe TangleNoneBoss,
Minion
Invulnerable100ImmuneImmuneImmuneImmuneImmuneImmune
Combat turnorder enemy lost battalion dreaming general.png
Dreaming General
The TangleCadaverBoss1853250%30%20%ImmuneImmune40%

Example

EnemyRegionTypesTiersHPSpeedDeath ArmorBleedBlightBurnStunMoveDebuff
Combat turnorder enemy cultist cherub.png
Cherub
AnyCosmic,
Cultist
148020%20%20%10%10%20%
Combat turnorder enemy cultist herald.png
Herald
AnyCosmic,
Cultist
184030%10%40%20%20%10%
Combat turnorder enemy cultist altar.png
Altar
AnyCosmic,
Cultist
207040%30%20%10%10%10%
Combat turnorder enemy cultist evangelist.png
Evangelist
AnyCosmic,
Cultist
283120%20%20%40%40%20%
Combat turnorder enemy cultist deacon.png
Deacon
AnyCosmic,
Cultist
Boss412220%20%20%40%40%40%
Combat turnorder enemy cultist cardinal.png
Cardinal
AnyCosmic,
Cultist
Boss464230%30%30%20%20%30%
Combat turnorder enemy cultist exemplar.png
Exemplar
AnyCosmic,
Cultist
Boss1014240%40%40%60%50%40%

local Cargo = mw.ext.cargo
local getArgs = require("Module:Arguments").getArgs

local Histogram = require("Module:Histogram")
local Utils = require("Module:EnemyStats2/Utils")

local LINK_LABEL = '[[%s|%s]]<i id="%s"></i>'

local REGIONS = {
	valley={article="The Valley", sort_key="0"},
	sprawl={article="The Sprawl", sort_key="10"},
	tangle={article="The Tangle", sort_key="11"},
	foetor={article="The Foetor", sort_key="12"},
	shroud={article="The Shroud", sort_key="13"},
	sluice={article="The Sluice", sort_key="20"},
	mountain={article="The Mountain", sort_key="30"}
}

local function text_cell(label, sort_key)
	return mw.html.create("td")
		:attr("data-sort-value", sort_key)
		:addClass("ctr")
		:wikitext(label)
end

local function name_cell(enemy)
	local label = LINK_LABEL:format(enemy.article, enemy.name, enemy.name)
	if enemy.icon ~= nil then
		label = ("[[File:%s|40px]]<br>"):format(enemy.icon) .. label
	end
	return text_cell(label, enemy.name)
end

local function region_cell(enemy)
	if enemy.region == nil then
		return text_cell("''Any''", -1)
	end
	return text_cell(
		("[[%s]]"):format(REGIONS[enemy.region].article),
		REGIONS[enemy.region].sort_key
	)
end

local function types_cell(enemy)
	local type_links = Utils._type_links(enemy)
	return text_cell(table.concat(type_links, ",<br>"))
end

local function tiers_cell(enemy)
	local tiers = {}
	if enemy.boss == 1 then
		table.insert(tiers, "[[Bosses (Darkest Dungeon II)|Boss]]")
	end
	if enemy.champion_of ~= nil then
		table.insert(tiers, "Champion")
	end
	if enemy.minion_of ~= nil then
		table.insert(tiers, "Minion")
	end
	return text_cell(table.concat(tiers, ",<br>"), enemy.tier_key)
end

local function fetch_data(where)
	local tables = {
		"EnemyStats2",
		"EnemyStats2Types",
		"EnemyStats2CategoryInfo",
	}

	local fields = {
		"EnemyStats2.name=name",
		"icon",
		"article",
		"boss",
		"champion_of",
		"minion_of",
		-- Cargo doesn't support CASE statements?
		[[IF(boss=1, 4,
		IF(champion_of IS NOT NULL, 2,
		IF(minion_of IS NOT NULL, 3,
		1
		)))=tier_key]],
		"region",
		"GROUP_CONCAT(type ORDER BY type SEPARATOR ' ')=types"
	}
	for _, stat in ipairs(Utils.STATS) do
		table.insert(fields, stat.name)
	end

	local join_keys = {
		"EnemyStats2.name=EnemyStats2Types.name",
		"EnemyStats2.category=EnemyStats2CategoryInfo.category"
	}
	local order_keys = {
		"sort_key",
		"tier_key",
		"hp",
		"name",
	}

	local enemies = Cargo.query(
		table.concat(tables, ","),
		table.concat(fields, ","),
		{
			groupBy="name",
			join=table.concat(join_keys, ","),
			orderBy=table.concat(order_keys, ","),
			where=where
		}
	)

	local hs = Histogram._load_table("EnemyStats2Histograms")
	for i, enemy in ipairs(enemies) do
		Utils._parse_enemy(enemy)
		for _, stat in ipairs(Utils.STATS) do
			enemy[stat.name .. "_cdf"] = Histogram._interpolate_cdf(
				hs[stat.name], enemy[stat.name])
		end
	end

	return enemies
end

local function _query(args)
	local where = nil
	if args.category ~= nil then
		where = ("EnemyStats2.category='%s'"):format(args.category)
	elseif args.type ~= nil then
		where = ("EnemyStats2Types.type='%s'"):format(args.type)
	elseif args.region ~= nil then
		where = ("region IS NULL OR region='%s'"):format(args.region)
	end
	local enemies = fetch_data(where)

	local result = mw.html.create("table")
		:addClass("tablebgdd2")
		:addClass("sortable")

	local header = result:tag("tr")
	header:tag("th")
		:wikitext("Enemy")
	header:tag("th")
		:wikitext("[[Regions|Region]]")
	header:tag("th")
		:wikitext("[[Enemy Type (Darkest Dungeon II)|Types]]")
	header:tag("th")
		:wikitext("Tiers")
	for _, stat in ipairs(Utils.STATS) do
		header:tag("th")
			:wikitext(stat:short_label())
	end

	for _, enemy in ipairs(enemies) do
		local row = result:tag("tr")
		row:node(name_cell(enemy))
		row:node(region_cell(enemy))
		row:node(types_cell(enemy))
		row:node(tiers_cell(enemy))
		for _, stat in ipairs(Utils.STATS) do
			row:node(stat:create_cell(enemy))
		end
	end

	return result
end

local function query(frame)
	return _query(getArgs(frame))
end

return {
	_query=_query,
	query=query,
}