function kill_filter(a, condition)
local t = { }
for i, k in ipairs(a) do
if condition(k) then
table.insert(t, k)
end
end
return t
end
function show_sorted_list(list, baseindent, sortfn)
baseindent = baseindent or " "
sortfn = sortfn or
function (x, y)
return kills.exp(x) > kills.exp(y) or
(kills.exp(x) == kills.exp(y) and
kills.base_name(x) < kills.base_name(y))
end
table.sort(list, sortfn)
for i, k in ipairs(list) do
kills.rawwrite(baseindent .. " " .. kills.desc(k))
end
kills.rawwrite(baseindent .. kills.summary(list))
end
function group_kills(a, namemap, keys, selector)
local count = 0
for i, key in ipairs(keys) do
local selected = kill_filter(a,
function (k)
return selector(key, k)
end
)
if table.getn(selected) > 0 then
if count > 0 then
kills.rawwrite("")
end
count = count + 1
kills.rawwrite(" " .. namemap[key])
show_sorted_list(selected)
end
end
end
function holiness_list(a)
local holies = {
strange = "Strange Monsters",
unique = "Uniques",
holy = "Holy Monsters",
natural = "Natural Monsters",
undead = "Undead Monsters",
demonic = "Demonic Monsters",
nonliving = "Non-Living Monsters",
plant = "Plants",
}
local holysort = { "strange", "unique",
"natural", "nonliving",
"undead", "demonic", "plant" }
kills.rawwrite(" Monster Nature")
group_kills( a, holies, holysort,
function ( key, kill )
return (kills.holiness(kill) == key and not kills.isunique(kill))
or
(key == "unique" and kills.isunique(kill))
end
)
kills.rawwrite(" " .. kills.summary(a))
end
function count_list(a, ascending)
kills.rawwrite(" Ascending Order")
show_sorted_list(a,
" ",
function (x, y)
if ascending then
return kills.nkills(x) < kills.nkills(y)
or (kills.nkills(x) == kills.nkills(y) and
kills.exp(x) > kills.exp(y))
else
return kills.nkill(x) > kills.nkills(y)
or (kills.nkills(x) == kills.nkills(y) and
kills.exp(x) > kills.exp(y))
end
end
)
end
function symbol_list(a)
local allsyms = { }
for i, k in ipairs(a) do
local ksym = kills.symbol(k)
allsyms[ kills.symbol(k) ] = true
end
local sortedsyms = { }
for sym, dud in pairs(allsyms) do table.insert(sortedsyms, sym) end
table.sort(sortedsyms)
kills.rawwrite(" Monster Symbol")
for i, sym in ipairs(sortedsyms) do
if i > 1 then
kills.rawwrite("")
end
local symlist = kill_filter(a,
function (k)
return kills.symbol(k) == sym
end
)
kills.rawwrite(" All '" .. sym .. "'")
show_sorted_list(symlist)
end
kills.rawwrite(" " .. kills.summary(a))
end
function classic_list(title, a, suffix)
if table.getn(a) == 0 then return end
kills.rawwrite(title)
for i, k in ipairs(a) do
kills.rawwrite(" " .. kills.desc(k))
end
kills.rawwrite(" " .. kills.summary(a))
if suffix then
kills.rawwrite(suffix)
end
end
function separator()
kills.rawwrite("----------------------------------------\n")
end
function newline()
kills.rawwrite("")
end
function c_kill_list(a, who, needsep)
if not a or table.getn(a) == 0 then
if not a and who and who ~= "" then
separator()
kills.rawwrite(who)
end
return
end
if needsep then
separator()
end
local title = "Vanquished Creatures"
if who then
title = title .. " (" .. who .. ")"
end
kills.rawwrite(title)
symbol_list(a)
newline()
holiness_list(a)
newline()
count_list(a, true)
newline()
classic_list(
" The 3-digit Club",
kill_filter(a,
function (k)
return kills.nkills(k) > 99
end
),
"")
end