diff options
Diffstat (limited to 'crawl-ref/source/lua/kills.lua')
-rw-r--r-- | crawl-ref/source/lua/kills.lua | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/crawl-ref/source/lua/kills.lua b/crawl-ref/source/lua/kills.lua new file mode 100644 index 0000000000..b84b1f93c0 --- /dev/null +++ b/crawl-ref/source/lua/kills.lua @@ -0,0 +1,240 @@ +------------------------------------------------------------------ +-- kills.lua: +-- Generates fancier vanquished creatures lists. +-- +-- List ideas courtesy Jukka Kuusisto and Erik Piper. +-- +-- To use this, add this line to your init.txt: +-- lua_file = lua/kills.lua +-- +-- Take a look at the c_kill_list function - that's where to start if you +-- want to customize things. +------------------------------------------------------------------ + +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) + -- Create a list of monster characters and sort it + 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 + +----------------------------------------------------------------------------- +-- This is the function that Crawl calls when it wants to dump the kill list +-- The parameter "a" is the list (Lua table) of kills, initially sorted in +-- descending order of experience. Kill entries must be inspected using +-- kills.foo(ke). +-- +-- NOTE: Comment out the kill lists that you don't like! +-- +-- As of 20060224, the kill list is divided into three: +-- * Direct player kills +-- * Monsters killed by friendlies +-- * Monsters killed by other things (traps, etc.) +-- +-- For each category, the game calls c_kill_list, with a table of killed +-- monsters, and the killer (who). The killer will be nil for direct player +-- kills, and a string ("collateral kills", "others") otherwise. +-- +-- c_kill_list will not be called for a category if the category contains no +-- kills. +-- +-- After all categories, c_kill_list will be called with no arguments to +-- indicate the end of the kill listing. + +function c_kill_list(a, who, needsep) + -- If there aren't any kills yet, bail out + if not a or table.getn(a) == 0 then + if not a and who and who ~= "" then + -- This is the grand total + 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) + + -- Group kills by monster symbol + symbol_list(a) + newline() + + -- Group by holiness + holiness_list(a) + newline() + + -- Sort by kill count (ascending). + count_list(a, true) + newline() + + -- Classic list without zombies and skeletons + -- Commented-out - this is a boring list. + --[[ + -- First re-sort into descending order of exp, since + -- count_list has re-sorted the array. + table.sort(a, function (x, y) + return kills.exp(x) > kills.exp(y) + end); + + -- Filter out zombies and skeletons and display the rest + classic_list( + " Kills minus zombies and skeletons", + kill_filter(a, + function (k) + return kills.modifier(k) ~= "zombie" and + kills.modifier(k) ~= "skeleton" + end + )) + + separator() + --]] + + -- Show only monsters with 3 digit kill count + classic_list( + " The 3-digit Club", + kill_filter(a, + function (k) + return kills.nkills(k) > 99 + end + ), + "") + +end |