diff options
author | haranp <haranp@c06c8d41-db1a-0410-9941-cceddc491573> | 2007-10-30 11:17:52 +0000 |
---|---|---|
committer | haranp <haranp@c06c8d41-db1a-0410-9941-cceddc491573> | 2007-10-30 11:17:52 +0000 |
commit | d95b75df0b8106c0a4c4841973f153a22da22482 (patch) | |
tree | 0205cf616bc6332e7d912bfa2b5e636b8d3ce39b /crawl-ref | |
parent | c0acbdf98f1f66419727fb786f138590cccf2af4 (diff) | |
download | crawl-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.cc | 83 |
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); |