in some more detail (a LOT more detail for potions).
Where to add this for crawlrc?
Also, while I appreciate being listed as author of trapwalk.lua, I'd rather not have my email address shown.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1881 c06c8d41-db1a-0410-9941-cceddc491573
KX23OEQBBLMQHTFCA4TYYEGLHCETXVZCXALYR5U5RELKJMMB66SAC
SSCG2FLJMUTTIRXBFSPLAUUBUIN375ZGL5UOAF3SC62ZIILSMMKAC
5RRCORYDFW2N2YPUM4PDYZGI6RY7YWVMGWTY5ZIDVO6JRD5R5GAQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
UL7XFKMUX3WIU4O2LZANK4ECJ654UZPDBFGNXUEYZYOLKBYBCG6AC
RREJL4WZKWFEMA62AC5G5UDTOXMW4UULIQXVA5RPFASPODMHQZ7AC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
547JREUJXTZNYVGHNNAET5F5O5JYYGNTDQB6ABZNT7YX5EY64OHAC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
RVST2QHYJ757ZHK4AUJ5NGPDZ44AD6RVFVXYPKQIBJXZBDNUCHXQC
UF4ODJOCV3ZL7DXRLLOFVWHUKKJX34FO4ZM6VJAWEJ3QVP3XZ2AAC
---------------------------------------------------------------------------
-- pickup.lua:
-- Smarter autopickup handling that takes into account the item type
-- in combination with your character's race, religion, knowledge,
-- and eating habits.
--
-- To use this, add this line to your init.txt:
-- lua_file = lua/pickup.lua
--
-- Notes:
-- * This script only handles items of classes with autopickup on.
-- * Any result can still be overridden using autopickup_exceptions.
---------------------------------------------------------------------------
function make_hash(ls)
local h = { }
for _, i in ipairs(ls) do
h[i] = true
end
return h
end
function you_undead()
return you.race() == "Mummy" or you.race() == "Ghoul"
end
-- not identified
function unknown_potion(type)
return type == 0
end
function good_potion(type)
return type == 1
end
function bad_potion(it)
return type == 2
end
-- special cases
function spec_potion(it)
return type == 3
end
function ch_autopickup(it)
local spells = make_hash( you.spells() )
if item.class(it) == "Potions" then
local type = item.potion_type(it)
-- "bad" potions only for Evaporate
if spells["Evaporate"] and bad_potion(type) then
return true
end
-- no potions for Mummies, also: no bad potions for anyone else
if you.race() == "Mummy" or bad_potion(type) then
return false
end
-- pickup "good" and unID'd potions
if good_potion(type) or unknown_potion(type) then
return true
end
-- special handling
if spec_potion(type) then
-- undead cannot use berserk
if item.subtype(it) == "berserk" then
if you_undead() then
return false
else
return true
end
end
-- special cases for water and porridge
if item.subtype(it) == "water" or item.subtype(it) == "porridge" then
return food.can_eat(it, false)
end
end
-- anything not handled until here can be picked up
return true
end
if item.class(it) == "Comestibles" then
return food.can_eat(it, false)
end
if item.class(it) == "Books" and you.god() == "Trog" then
return false
end
if item.class(it) == "Jewellery" then
if item.subtype == "hunger" or item.subtype == "inaccuracy" then
return false
end
if you_undead() and
(item.subtype(it) == "regeneration" or item.subtype(it) == "rage") then
return false
end
end
-- we only get here if class autopickup ON
return true
end
static int l_item_potion_type(lua_State *ls)
{
LUA_ITEM(item, 1);
int val = 99;
if (item && item->base_type == OBJ_POTIONS)
{
if (!item_type_known(*item))
val = 0;
else
{
switch(item->sub_type)
{
// good potions:
case POT_HEALING:
case POT_HEAL_WOUNDS:
case POT_SPEED:
case POT_MIGHT:
case POT_GAIN_STRENGTH:
case POT_GAIN_DEXTERITY:
case POT_GAIN_INTELLIGENCE:
case POT_LEVITATION:
case POT_INVISIBILITY:
case POT_EXPERIENCE:
case POT_MAGIC:
case POT_RESTORE_ABILITIES:
case POT_CURE_MUTATION:
val = 1;
break;
// bad potions:
case POT_POISON:
case POT_STRONG_POISON:
case POT_SLOWING:
case POT_PARALYSIS:
case POT_CONFUSION:
case POT_DEGENERATION:
case POT_DECAY:
case POT_MUTATION:
val = 2;
break;
// need more refined handling:
case POT_BERSERK_RAGE:
case POT_WATER:
case POT_PORRIDGE:
default:
val = 3;
}
}
}
lua_pushnumber(ls, val);
return (1);
}