summaryrefslogtreecommitdiffstats
path: root/crawl-ref
diff options
context:
space:
mode:
authorharanp <haranp@c06c8d41-db1a-0410-9941-cceddc491573>2007-10-30 11:17:52 +0000
committerharanp <haranp@c06c8d41-db1a-0410-9941-cceddc491573>2007-10-30 11:17:52 +0000
commitd95b75df0b8106c0a4c4841973f153a22da22482 (patch)
tree0205cf616bc6332e7d912bfa2b5e636b8d3ce39b /crawl-ref
parentc0acbdf98f1f66419727fb786f138590cccf2af4 (diff)
downloadcrawl-ref-d95b75df0b8106c0a4c4841973f153a22da22482.tar.gz
crawl-ref-d95b75df0b8106c0a4c4841973f153a22da22482.zip
Stack Deck interface improvements.
Incidentally, describe.cc needs to be fixed to describe marked/stacked decks properly. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@2681 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref')
-rw-r--r--crawl-ref/source/decks.cc83
1 files changed, 58 insertions, 25 deletions
diff --git a/crawl-ref/source/decks.cc b/crawl-ref/source/decks.cc
index 7efe93fd90..ecd3940281 100644
--- a/crawl-ref/source/decks.cc
+++ b/crawl-ref/source/decks.cc
@@ -17,6 +17,7 @@
#include "externs.h"
#include "beam.h"
+#include "cio.h"
#include "dungeon.h"
#include "effects.h"
#include "food.h"
@@ -876,11 +877,25 @@ bool deck_mark()
return true;
}
+static void redraw_stacked_cards(const std::vector<card_type>& draws,
+ unsigned int selected)
+{
+ for (unsigned int i = 0; i < draws.size(); ++i)
+ {
+ gotoxy(1,i+2);
+ textcolor(selected == i ? WHITE : LIGHTGREY);
+ cprintf("%u - %s", i+1, card_name(draws[i]) );
+ clear_to_end_of_line();
+ }
+}
+
+
// Stack a deck: look at the next five cards, put them back in any
// order, discard the rest of the deck.
// Return false if the operation was failed/aborted along the way.
bool deck_stack()
{
+ cursor_control con(false);
if ( !wielding_deck() )
{
mpr("You aren't wielding a deck!");
@@ -929,38 +944,56 @@ bool deck_stack()
num_cards);
more();
- while ( draws.size() > 1 )
- {
- mesclr();
- mpr("Order the cards (bottom to top)...", MSGCH_PROMPT);
- for ( unsigned int i = 0; i < draws.size(); ++i )
- {
- msg::stream << (static_cast<char>(i + 'a')) << " - "
- << card_name(draws[i]) << std::endl;
- }
-
- int selected = -1;
- while ( true )
- {
- const int keyin = tolower(get_ch());
- if (keyin >= 'a' && keyin < 'a' + static_cast<int>(draws.size()))
+ if ( draws.size() > 1 )
+ {
+ unsigned int selected = draws.size();
+ clrscr();
+ gotoxy(1,1);
+ textcolor(WHITE);
+ cprintf("Press a digit to select a card, "
+ "then another digit to swap it.");
+ gotoxy(1,10);
+ cprintf("Press Enter to accept.");
+
+ redraw_stacked_cards(draws, selected);
+
+ // Hand-hacked implementation, instead of using Menu. Oh well.
+ while (1) {
+ const int c = getch();
+ if ( c == CK_ENTER )
{
- selected = keyin - 'a';
- break;
+ gotoxy(1,11);
+ textcolor(LIGHTGREY);
+ cprintf("Are you sure? (press y or Y to confirm)");
+ if ( toupper(getch()) == 'Y' )
+ break;
+ gotoxy(1,11);
+ clear_to_end_of_line();
+ continue;
}
- else
+ if ( c >= '1' && c <= '0' + static_cast<int>(draws.size()) )
{
- canned_msg(MSG_HUH);
+ const unsigned int new_selected = c - '1';
+ if ( selected < draws.size() )
+ {
+ std::swap(draws[selected], draws[new_selected]);
+ std::swap(flags[selected], flags[new_selected]);
+ selected = draws.size();
+ }
+ else
+ selected = new_selected;
+ redraw_stacked_cards(draws, selected);
}
}
- push_top_card(deck, draws[selected], flags[selected]);
- draws.erase(draws.begin() + selected);
- flags.erase(flags.begin() + selected);
+ redraw_screen();
}
- mesclr();
+
deck.plus2 = -num_to_stack;
- push_top_card(deck, draws[0], flags[0]);
- props["num_marked"] = (char) num_to_stack;
+ for ( unsigned int i = 0; i < draws.size(); ++i )
+ push_top_card(deck, draws[draws.size() - 1 - i],
+ flags[flags.size() - 1 - i]);
+
+ props["num_marked"] = static_cast<char>(num_to_stack);
you.wield_change = true;
check_buggy_deck(deck);