Module:EnemyStats2/Table/Test
Jump to navigation
Jump to search
Documentation
[purge]
This module is only used for testing changes to Module:EnemyStats2/Table. It should not be used in production!
Example
Enemy | Region | Types | Tiers | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Arbalist | The Tangle | Cadaver | 15 | 1 | 0 | 30% | 30% | 10% | 10% | 10% | 10% | |
Foot Soldier | The Tangle | Cadaver | 17 | 1 | 1 | 30% | 30% | 10% | 50% | 10% | 10% | |
Drummer | The Tangle | Cadaver | 19 | 5 | 0 | 30% | 30% | 10% | 30% | 10% | 20% | |
Bishop | The Tangle | Cadaver | 22 | 2 | 0 | 30% | 30% | 20% | 20% | 20% | 30% | |
Knight | The Tangle | Cadaver | 36 | 0 | 3 | 40% | 20% | 10% | 40% | 40% | 30% | |
Bullseye Barrett | The Tangle | Cadaver | Champion | 20 | 1 | 1 | 40% | 40% | 10% | 10% | 20% | 10% |
Fallen Templar | The Tangle | Cadaver | Champion | 41 | 2 | 3 | 50% | 30% | 10% | 40% | 40% | 30% |
Tap Root | The Tangle | None | Boss, Minion | Invulnerable | 10 | 0 | Immune | Immune | Immune | Immune | Immune | Immune |
Dreaming General | The Tangle | Cadaver | Boss | 185 | 3 | 2 | 50% | 30% | 20% | Immune | Immune | 40% |
Example
Enemy | Region | Types | Tiers | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Cherub | Any | Cosmic, Cultist | 14 | 8 | 0 | 20% | 20% | 20% | 10% | 10% | 20% | |
Herald | Any | Cosmic, Cultist | 18 | 4 | 0 | 30% | 10% | 40% | 20% | 20% | 10% | |
Altar | Any | Cosmic, Cultist | 20 | 7 | 0 | 40% | 30% | 20% | 10% | 10% | 10% | |
Evangelist | Any | Cosmic, Cultist | 28 | 3 | 1 | 20% | 20% | 20% | 40% | 40% | 20% | |
Deacon | Any | Cosmic, Cultist | Boss | 41 | 2 | 2 | 20% | 20% | 20% | 40% | 40% | 40% |
Cardinal | Any | Cosmic, Cultist | Boss | 46 | 4 | 2 | 30% | 30% | 30% | 20% | 20% | 30% |
Exemplar | Any | Cosmic, Cultist | Boss | 101 | 4 | 2 | 40% | 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,
}