From 031aedb7a9cfa7ad7d86fef1a0ae3b382d31ebb9 Mon Sep 17 00:00:00 2001 From: haranp Date: Fri, 29 Dec 2006 13:22:12 +0000 Subject: Fix for bug 1622129, safe_autopickup check was happening before monster movement. Autopickup is no longer a delay but rather receives special handling (ouch, should be done better.) This necessitated removing a safety assert() in delay.cc. Also, you now get two messages when autopickup kicks in: You see 2 scrolls of identify here. C - 3 scrolls of identify I consider this...a feature. Right. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@729 c06c8d41-db1a-0410-9941-cceddc491573 --- crawl-ref/source/items.cc | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) (limited to 'crawl-ref/source/items.cc') diff --git a/crawl-ref/source/items.cc b/crawl-ref/source/items.cc index 9a5afc4fcf..180e5d17a2 100644 --- a/crawl-ref/source/items.cc +++ b/crawl-ref/source/items.cc @@ -60,12 +60,13 @@ #include "stuff.h" #include "stash.h" -static void autopickup(void); static bool invisible_to_player( const item_def& item ); static void item_list_on_square( std::vector& items, int obj, bool force_squelch = false ); static void autoinscribe_item( item_def& item ); -static void autoinscribe_items( void ); +static void autoinscribe_items(); + +static bool will_autopickup = false; // Used to be called "unlink_items", but all it really does is make // sure item coordinates are correct to the stack they're in. -- bwr @@ -733,6 +734,11 @@ static void item_list_on_square( std::vector& items, } } +bool need_to_autopickup() +{ + return will_autopickup; +} + /* * Takes keyin as an argument because it will only display a long list of items * if ; is pressed. @@ -754,7 +760,7 @@ void item_check(char keyin) } autoinscribe_items(); - autopickup(); + will_autopickup = true; origin_set(you.x_pos, you.y_pos); @@ -1522,7 +1528,6 @@ int move_item_to_player( int obj, int quant_got, bool quiet ) item.y = -1; item.link = freeslot; - /*** HP CHANGE: do autoinscribe ***/ autoinscribe_item( item ); @@ -2934,19 +2939,20 @@ bool can_autopickup() return (true); } -static void autopickup(void) +void autopickup() { //David Loewenstern 6/99 int result, o, next; bool did_pickup = false; bool tried_pickup = false; + will_autopickup = false; + if (!can_autopickup()) return; o = igrd[you.x_pos][you.y_pos]; - int unthrown = 0; while (o != NON_ITEM) { next = mitm[o].link; @@ -2971,9 +2977,6 @@ static void autopickup(void) num_to_take = num_can_take; } - if (!(mitm[o].flags & ISFLAG_THROWN)) - unthrown++; - mitm[o].flags &= ~(ISFLAG_THROWN | ISFLAG_DROPPED); result = move_item_to_player(o, num_to_take); @@ -2997,13 +3000,14 @@ static void autopickup(void) o = next; } - // move_item_to_player should leave things linked. -- bwr - // relink_cell(you.x_pos, you.y_pos); - if (did_pickup) { you.turn_is_over = true; - start_delay( DELAY_AUTOPICKUP, 1, unthrown ); + const int estop = + you.running == RMODE_EXPLORE_GREEDY? + ES_GREEDY_PICKUP : ES_PICKUP; + if ((Options.explore_stop & estop) && prompt_stop_explore(estop)) + stop_delay(); } // Greedy explore has no good way to deal with an item that we can't // pick up, so the only thing to do is to stop. -- cgit v1.2.3-54-g00ecf