summaryrefslogtreecommitdiffstats
path: root/stone_soup/crawl-ref/source/lua/gourmand.lua
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2006-09-18 15:08:25 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2006-09-18 15:08:25 +0000
commita4d4f3ecccb29c3f5fc1ce55579119106c399911 (patch)
tree5677ea04b4dfdadd961c01ba3baf7502f8d6e0d0 /stone_soup/crawl-ref/source/lua/gourmand.lua
parent571501e1135989d3b9dc44e3d332562a7cf78b35 (diff)
downloadcrawl-ref-a4d4f3ecccb29c3f5fc1ce55579119106c399911.tar.gz
crawl-ref-a4d4f3ecccb29c3f5fc1ce55579119106c399911.zip
Updated stone_soup-0.1b1 tag to include fix for Poison Arrow of Doom.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/tags/stone_soup-0.1b1@49 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'stone_soup/crawl-ref/source/lua/gourmand.lua')
-rw-r--r--stone_soup/crawl-ref/source/lua/gourmand.lua145
1 files changed, 145 insertions, 0 deletions
diff --git a/stone_soup/crawl-ref/source/lua/gourmand.lua b/stone_soup/crawl-ref/source/lua/gourmand.lua
new file mode 100644
index 0000000000..a730438419
--- /dev/null
+++ b/stone_soup/crawl-ref/source/lua/gourmand.lua
@@ -0,0 +1,145 @@
+-- SPOILER WARNING
+--
+-- This file contains spoiler information. Do not read or use this file if you
+-- don't want to be spoiled. Further, the Lua code in this file may use this
+-- spoily information to take actions on your behalf. If you don't want
+-- automatic exploitation of spoilers, don't use this.
+--
+---------------------------------------------------------------------------
+-- gourmand.lua: (requires eat.lua, chnkdata.lua, and safechunk.lua)
+--
+-- Eats all available chunks on current square and inventory, swapping to an
+-- identified amulet of the gourmand if necessary, with no prompts. Note that
+-- it relies on spoiler information to identify chunks it can eat without
+-- prompting the user.
+--
+-- This is a Lua macro, so the action will be interrupted by the hp/stat loss,
+-- or monsters.
+--
+-- To use this, add these line to your init.txt:
+-- lua_file = lua/gourmand.lua
+--
+-- And macro the "eat_gourmand" function to a key.
+---------------------------------------------------------------------------
+-- Macroable
+function eat_gourmand()
+ local race = you.race()
+ local all = { }
+ for _, it in ipairs(you.floor_items()) do table.insert(all, it) end
+ for _, it in ipairs(item.inventory()) do table.insert(all, it) end
+
+ local chunks = { }
+ local needgourmand = false
+ local oneedible = false
+
+ for _, itym in ipairs(all) do
+ if food.ischunk(itym) then
+ table.insert(chunks, itym)
+ end
+ end
+
+ for _, itym in ipairs(chunks) do
+ local rot = food.rotting(itym)
+ local mon = chunkmon(itym)
+
+ if food.can_eat(itym) and sc_safechunk and
+ sc_safechunk(rot, race, mon) then
+ oneedible = true
+ end
+
+ -- If we can't eat it now, but we could eat it if hungry, a gourmand
+ -- switch would be nice.
+ if not food.can_eat(itym) and food.can_eat(itym, false) then
+ needgourmand = true
+ end
+
+ if sc_safechunk and not sc_safechunk(rot, race, mon)
+ and sc_safechunk(false, race, mon)
+ then
+ needgourmand = true
+ end
+ end
+
+ if table.getn(chunks) == 0 then
+ crawl.mpr("No chunks to eat.")
+ return
+ end
+
+ local amuremoved
+ if needgourmand and not oneedible then
+ amuremoved = switch_amulet("gourmand")
+ end
+
+ for _, ch in ipairs(chunks) do
+ if food.can_eat(ch) and is_chunk_safe(ch) then
+ while item.quantity(ch) > 0 do
+ if food.eat(ch) then
+ coroutine.yield(true)
+ else
+ break
+ end
+ end
+ end
+ end
+
+ if amuremoved then
+ switch_amulet(amuremoved)
+ end
+end
+
+function chunkmon(chunk)
+ local cname = item.name(chunk)
+ local mon
+ _, _, mon = string.find(cname, "chunk of (.+) flesh")
+ return mon
+end
+
+function switch_amulet(amu)
+ local towear
+ if type(amu) == "string" then
+ for _, it in ipairs(item.inventory()) do
+ if item.class(it, true) == "jewelry"
+ and item.subtype(it) == amu
+ and not item.cursed(it) then
+ towear = item.slot(it)
+ break
+ end
+ end
+
+ if not towear then
+ crawl.mpr("Can't find suitable amulet: " .. amu)
+ coroutine.yield(false)
+ end
+ else
+ towear = amu
+ end
+
+ local curramu = item.equipped_at("amulet")
+ if curramu and item.cursed(curramu) then
+ crawl.mpr("Can't swap out cursed amulet!")
+ coroutine.yield(false)
+ end
+
+ local wearitem = item.inslot(towear)
+
+ if curramu then
+ if not item.remove(curramu) then
+ coroutine.yield(false)
+ end
+
+ -- Yield, so that a turn can pass and we can take another action.
+ coroutine.yield(true)
+ end
+
+ if not item.puton(wearitem) then
+ coroutine.yield(false)
+ end
+
+ coroutine.yield(true)
+ return curramu and item.slot(curramu)
+end
+
+function c_interrupt_macro(interrupt_name)
+ return interrupt_name == "hp_loss" or interrupt_name == "stat" or
+ interrupt_name == "monster" or interrupt_name == "force"
+end