summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/invent.cc
diff options
context:
space:
mode:
authorj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2008-06-30 15:44:43 +0000
committerj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2008-06-30 15:44:43 +0000
commit29c92e989d47c6e35366e01f9e1e0bd09755d056 (patch)
tree1d1bf4711ff943f95a7c3407bb18b8fd7110e4bd /crawl-ref/source/invent.cc
parent97fcdb95c6bd42341a089e69745d67a943d3e8db (diff)
downloadcrawl-ref-29c92e989d47c6e35366e01f9e1e0bd09755d056.tar.gz
crawl-ref-29c92e989d47c6e35366e01f9e1e0bd09755d056.zip
When reading a "modification scroll" (prompt: Use on which item?)
don't list the scroll you just read as one to use it on. This fixes the ugly issue where the player, forgetting the slot of the scroll just read, uses identify on itself, thereby wasting the scroll. For enchant armour and recharging it's a moot point as they don't work on scrolls anyway, but this way you can't figure out the subtype. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6251 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/invent.cc')
-rw-r--r--crawl-ref/source/invent.cc50
1 files changed, 27 insertions, 23 deletions
diff --git a/crawl-ref/source/invent.cc b/crawl-ref/source/invent.cc
index 7bc3b3732b..93458657bc 100644
--- a/crawl-ref/source/invent.cc
+++ b/crawl-ref/source/invent.cc
@@ -52,8 +52,8 @@
///////////////////////////////////////////////////////////////////////////////
// Inventory menu shenanigans
-static void _get_inv_items_to_show(
- std::vector<const item_def*> &v, int selector);
+static void _get_inv_items_to_show( std::vector<const item_def*> &v,
+ int selector, int excluded_slot = -1);
InvTitle::InvTitle( Menu *mn, const std::string &title,
invtitle_annotator tfn )
@@ -364,21 +364,18 @@ static std::string _no_selectables_message(int item_selector)
return("You aren't carrying any such object.");
}
-void InvMenu::load_inv_items(int item_selector,
+void InvMenu::load_inv_items(int item_selector, int excluded_slot,
MenuEntry *(*procfn)(MenuEntry *me))
{
std::vector<const item_def *> tobeshown;
- _get_inv_items_to_show(tobeshown, item_selector);
+ _get_inv_items_to_show(tobeshown, item_selector, excluded_slot);
load_items(tobeshown, procfn);
+
if (!item_count())
- {
set_title(_no_selectables_message(item_selector));
- }
else
- {
set_title("");
- }
}
void InvMenu::draw_stock_item(int index, const MenuEntry *me) const
@@ -714,15 +711,17 @@ unsigned char get_invent( int invent_type )
while (true)
{
- select = invent_select(NULL, MT_INVLIST, invent_type,
- MF_SINGLESELECT);
- if ( isalpha(select) )
+ select = invent_select(NULL, MT_INVLIST, invent_type, -1,
+ MF_SINGLESELECT);
+
+ if (isalpha(select))
{
const int invidx = letter_to_index(select);
if ( is_valid_item(you.inv[invidx]) )
describe_item( you.inv[invidx], true );
}
- else break;
+ else
+ break;
}
redraw_screen();
return select;
@@ -879,11 +878,13 @@ static bool _is_item_selected(const item_def &i, int selector)
|| _userdef_item_selected(i, selector));
}
-static void _get_inv_items_to_show(std::vector<const item_def*> &v, int selector)
+static void _get_inv_items_to_show(std::vector<const item_def*> &v,
+ int selector, int excluded_slot)
{
for (int i = 0; i < ENDOFPACK; i++)
{
if (is_valid_item(you.inv[i])
+ && you.inv[i].slot != excluded_slot
&& _is_item_selected(you.inv[i], selector))
{
v.push_back( &you.inv[i] );
@@ -907,6 +908,7 @@ static bool _any_items_to_select(int selector)
unsigned char invent_select( const char *title,
menu_type type,
int item_selector,
+ int excluded_slot,
int flags,
invtitle_annotator titlefn,
std::vector<SelItem> *items,
@@ -921,7 +923,7 @@ unsigned char invent_select( const char *title,
menu.f_selitem = selitemfn;
if (filter)
menu.set_select_filter( *filter );
- menu.load_inv_items(item_selector);
+ menu.load_inv_items(item_selector, excluded_slot);
menu.set_type(type);
// Don't override title if there are no items.
@@ -940,7 +942,7 @@ unsigned char invent( int item_class_inv, bool show_price )
{
InvShowPrices show_item_prices(show_price);
return (invent_select(NULL, MT_INVLIST, item_class_inv));
-} // end invent()
+}
// Reads in digits for a count and apprends then to val, the
// return value is the character that stopped the reading.
@@ -1040,13 +1042,13 @@ std::vector<SelItem> prompt_invent_items(
MF_MULTISELECT | MF_ALLOW_FILTER;
// The "view inventory listing" mode.
- int ch = invent_select(
- prompt,
- mtype,
- keyin == '*'? OSEL_ANY : type_expect,
- selmode,
- titlefn, &items, select_filter, fn,
- pre_select );
+ int ch = invent_select( prompt,
+ mtype,
+ keyin == '*' ? OSEL_ANY : type_expect,
+ -1,
+ selmode,
+ titlefn, &items, select_filter, fn,
+ pre_select );
if ((selmode & MF_SINGLESELECT) || ch == ESCAPE)
{
@@ -1321,6 +1323,7 @@ int prompt_invent_item( const char *prompt,
bool must_exist, bool allow_auto_list,
bool allow_easy_quit,
const char other_valid_char,
+ int excluded_slot,
int *const count,
operation_types oper )
{
@@ -1382,7 +1385,8 @@ int prompt_invent_item( const char *prompt,
keyin = invent_select(
prompt,
mtype,
- keyin == '*'? OSEL_ANY : type_expect,
+ keyin == '*' ? OSEL_ANY : type_expect,
+ excluded_slot,
MF_SINGLESELECT | MF_ANYPRINTABLE | MF_NO_SELECT_QTY
| MF_EASY_EXIT,
NULL,