diff options
author | dshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573> | 2006-09-18 15:08:25 +0000 |
---|---|---|
committer | dshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573> | 2006-09-18 15:08:25 +0000 |
commit | a4d4f3ecccb29c3f5fc1ce55579119106c399911 (patch) | |
tree | 5677ea04b4dfdadd961c01ba3baf7502f8d6e0d0 /stone_soup/crawl-ref/source/lua/gourmand.lua | |
parent | 571501e1135989d3b9dc44e3d332562a7cf78b35 (diff) | |
download | crawl-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.lua | 145 |
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 |