summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/lua/gearset.lua
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/lua/gearset.lua')
-rw-r--r--crawl-ref/source/lua/gearset.lua206
1 files changed, 206 insertions, 0 deletions
diff --git a/crawl-ref/source/lua/gearset.lua b/crawl-ref/source/lua/gearset.lua
new file mode 100644
index 0000000000..494ebd65ff
--- /dev/null
+++ b/crawl-ref/source/lua/gearset.lua
@@ -0,0 +1,206 @@
+------------------------------------------------------------------------
+-- gearset.lua: (requires base.lua)
+-- Allows for quick switching between two sets of equipment.
+--
+-- IMPORTANT
+-- This Lua script remembers only the *inventory slots* of the gear you're
+-- wearing (it could remember item names, but they're prone to change based on
+-- identification, enchantment and curse status). If you swap around items in
+-- your inventory, the script may attempt to wear odd items (this will not kill
+-- the game, but it can be disconcerting if you're not expecting it).
+--
+-- To use this, source this file in your init.txt:
+-- lua_file = lua/gearset.lua
+--
+-- Then start Crawl and create two macros:
+-- 1. Any macro input key (say F2), set macro action to "===rememberkit"
+-- 2. Any macro input key (say F3), set macro action to "===swapkit"
+-- It helps to save your macros at this point. :-)
+--
+-- You can now hit F2 to remember the equipment you're wearing. Once you've
+-- defined two sets of equipment, hit F3 to swap between them.
+--
+-- You can also just define one set of equipment; in this case, every time
+-- you hit F3 (swapkit), the macro makes sure you're wearing all the items in
+-- that set (and only the items in that set). This is handy for transmuters who
+-- need to kit up after a transform ends.
+------------------------------------------------------------------------
+function scan_kit()
+ local kit = { }
+ for i = 9, 0, -1 do
+ local it = item.equipped_at(i)
+ if it then
+ table.insert(kit, item.slot(it))
+ end
+ end
+ return kit
+end
+
+function kit_items(kit)
+ local items = { }
+ local inv = item.inventory()
+
+ for _, slot in ipairs(kit) do
+ for _, it in ipairs(inv) do
+ if slot == item.slot(it) then
+ table.insert(items, it)
+ end
+ end
+ end
+ return items
+end
+
+function getkey(vkeys)
+ local key
+
+ while true do
+ key = crawl.getch()
+ if key == 27 then return "escape" end
+
+ if key > 31 and key < 127 then
+ local c = string.lower(string.char(key))
+ if string.find(vkeys, c) then
+ return c
+ end
+ end
+ end
+end
+
+-- Macroable
+function rememberkit()
+ local kit = scan_kit()
+ crawl.mpr("Is this (T)ravel or (B)attle kit? ", "prompt")
+ local answer = getkey("tb")
+ crawl.mesclr()
+ if answer == "escape" then
+ return false
+ end
+
+ if answer == 't' then
+ g_kit_travel = kit
+ else
+ g_kit_battle = kit
+ end
+
+ return false
+end
+
+function write_array(f, arr, aname)
+ file.write(f, aname .. " = { ")
+ for i, v in ipairs(arr) do
+ file.write(f, v .. ", ")
+ end
+ file.write(f, "}\n")
+end
+
+function gearset_save(file)
+ if g_kit_travel then
+ write_array(file, g_kit_travel, "g_kit_travel")
+ end
+ if g_kit_battle then
+ write_array(file, g_kit_battle, "g_kit_battle")
+ end
+end
+
+function matchkit(kit1, kit2)
+ local matches = 0
+ if not kit2 then
+ -- Return a positive match for an empty gearset so that swapkit
+ -- switches to the *other* gearset. :-)
+ return 500
+ end
+ for _, v1 in ipairs(kit1) do
+ for _, v2 in ipairs(kit2) do
+ if v1 == v2 then
+ matches = matches + 1
+ end
+ end
+ end
+ return matches
+end
+
+function wear(it)
+ local _, eqt = item.equip_type(it)
+ if eqt == "Weapon" then
+ return item.wield(it)
+ elseif eqt == "Amulet" or eqt == "Ring" then
+ return item.puton(it)
+ elseif eqt ~= "" then
+ return item.wear(it)
+ else
+ return false
+ end
+end
+
+function wearkit(kit)
+ -- Remove all items not in the kit, then wear all items in the kit
+ local currkit = scan_kit()
+ local toremove = { }
+ local noop = true
+
+ for _, v in ipairs(currkit) do
+ local found = false
+ for _, v1 in ipairs(kit) do
+ if v == v1 then
+ found = true
+ break
+ end
+ end
+ if not found then
+ table.insert(toremove, v)
+ end
+ end
+
+ local remitems = kit_items(toremove)
+ for _, it in ipairs(remitems) do
+ noop = false
+ if not item.remove(it) then
+ coroutine.yield(false)
+ end
+ coroutine.yield(true)
+ end
+
+ local kitems = kit_items(kit)
+
+ for _, it in ipairs(kitems) do
+ if not item.worn(it) then
+ noop = false
+ if not wear(it) then
+ coroutine.yield(false)
+ end
+ coroutine.yield(true)
+ end
+ end
+
+ if noop then
+ crawl.mpr("Nothing to do.")
+ end
+end
+
+-- Macroable
+function swapkit()
+ if not g_kit_battle and not g_kit_travel then
+ crawl.mpr("You need to define a gear set first")
+ return false
+ end
+
+ local kit = scan_kit()
+ if matchkit(kit, g_kit_travel) < matchkit(kit, g_kit_battle) then
+ crawl.mpr("Switching to travel kit")
+ wearkit(g_kit_travel)
+ else
+ crawl.mpr("Switching to battle kit")
+ wearkit(g_kit_battle)
+ end
+end
+
+function swapkit_interrupt_macro(interrupt_name)
+ return interrupt_name == "hp_loss" or interrupt_name == "stat" or
+ interrupt_name == "monster" or interrupt_name == "force"
+end
+
+-- Add a macro interrupt hook so that we don't get stopped by any old interrupt
+chk_interrupt_macro.swapkit = swapkit_interrupt_macro
+
+-- Add ourselves in the Lua save chain
+table.insert(chk_lua_save, gearset_save)