git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@4059 c06c8d41-db1a-0410-9941-cceddc491573
LNYPEXOYU2MHSCPQOFOA3LL22OY5ONJVQZYEB7DPZ37M6WE4CK5AC VK3KMTJ7KOQDGULRZZJCWBGAI5NHU2E5CJSQULCFK563OCA4QPSAC B7MSPF6X2RLGWN4M6ZZF3WSOPKGYPTTD7LIJVST7DXN27DG6JHNAC YZ3BCKFW4PTYDL5EG2PW52KKRHPWCYPSXYH7TJAINF3335N2XCHAC 4XGOVPFCU6KZIYHKWCHUTZY6G5S326DKBG3UREPR34Q4TSDD3TAAC LOJYD6QZRNLNDDZJKVBMKQIBPTKSRN2ETCYGNVV47M7L3QLUJUJAC Z7SW3IKYNXMOHHD77NGXN6RGL32PZBO6AIHLJY74IRO23AIRKWMQC K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC 2IJDLTWK74ULETLFTIPUIY2MSG6RNONVAFNFE7MADPT6UNYSSBDAC EGV2HM7SD7UQSWJGLR65NQJTUBAJ7WHLM67FMH4UFP7JRSFKREPAC RR2J4VLJCZSAKY3HNS334KI4YUAPOMSETO2HGCGEEIUCUJAYAGSQC 2ESKXYN266CEMLSL6DNCKG4REDO34FXL4ODVGMWDJTNJRKMXWCRQC CQ24AVAI6SW3AHTIDMLPSTRRBEU6FHRF5I5FD6G5QIYE6PO4BQMQC VCG3BRIYRTNNWYC3LOXD6KFGXOX37HAFW2HNV7WXVG2V7EUHLDZQC OQXMUX5JEITCP2QXJKKOQRLRVTD3LTSDWGI6HTK5GVDIAJ7VKO6AC JM7UAK777RAVDAVLQLEOBRTGNW2B47S5G55XITJXO243IUNZHVYQC K2GMFKXUWN5R3KCW6OYVXHN47MIQZKEEIOSAU6LFFKBNKF6JBVWAC HW7XKO7HRAUQVDVVKG5GA7PYAEL5J5GKVDPT2CKAD3FLERAY5HLAC JPYDWBRN75GC6UZ26MXJTCXGORTJOWGRDEU4JFPU52LYHGK6UI2QC LP3U7LC6QK6TCMLAYTRGZ2CDZAHPM6VWDT6NPE5ET4WBBZVHBDXQC JW2KRJHES33W7UTWZ6NDO4TLMK4EFU4HKZXBWR2UJOMPCCOTR4CQC KHHAE5ZK7ITEZVMMUKYROKECLE2RU5ZU5OQ4Z4XSRQXE2R65O67AC Q2XCGRT36NCRQKWNL53EAS3ADON5SJQ5GEMJMX5S3QAG553HFVFQC 2UBWR54HKLIWZQXB3ZFOH4R4X6TZWWZZWEU26KRDOS3BHC5J7GPAC WHY6LRRJ5T2NSBE3IUCR4X3TOAH7TTK5NPUPUIFT7TPNJ6J4HBDAC }description += "$";}// Marked cards which we don't know straight off.std::vector<card_type> marked_cards;for ( int i = last_known_card + 1; i < num_cards; ++i ){unsigned char flags;const card_type card = get_card_and_flags(item, -i-1, flags);if ( flags & CFLAG_MARKED )marked_cards.push_back(card);}if ( !marked_cards.empty() ){std::sort(marked_cards.begin(), marked_cards.end(),compare_card_names);description += "Marked card(s): ";for ( unsigned int i = 0; i < marked_cards.size(); ++i ){if ( i != 0 )description += ", ";description += card_name(marked_cards[i]);
// Peek at a deck (show what the next card will be.)
// This also shuffles the deck.static void _deck_lose_card(item_def& deck){unsigned char flags = 0;// Seen cards are only half as likely to fall out,// marked cards only one-quarter as likely (note that marked// cards are also seen.)do {_shuffle_deck(deck);get_card_and_flags(deck, -1, flags);} while ( ((flags & CFLAG_MARKED) && coinflip()) ||((flags & CFLAG_SEEN) && coinflip()) );_draw_top_card(deck, false, flags);deck.plus2++;}// Peek at two cards in a deck, then shuffle them back in.
mpr("You can't peek into a marked deck.");crawl_state.zero_turns_taken();return false;
_deck_lose_card(deck);mpr("A card falls out of the deck.");
if (num_cards == 2){deck.props["non_brownie_draws"] = (char) 2;deck.plus2 = -2;_deck_peek_ident(deck);mprf("Only two cards in the deck: %s and %s.",card_name(card1), card_name(card2));mpr("You shuffle the deck.");// If both cards are the same, then you know which card you're// going to draw both times.if (card1 == card2){flags1 |= CFLAG_MARKED;flags2 |= CFLAG_MARKED;you.wield_change = true;deck.props["num_marked"] = (char) 2;}// "Shuffle" the two cards (even if they're the same, since// the flags might differ).if (coinflip()){std::swap(card1, card2);std::swap(flags1, flags2);}// After the first of two differing cards is drawn, you know// what the second card is going to be.if (card1 != card2){flags1 |= CFLAG_MARKED;deck.props["num_marked"]++;}
_set_card_and_flags(deck, 0, card1, flags1 | CFLAG_SEEN);_set_card_and_flags(deck, 1, card2, flags2 | CFLAG_SEEN);return true;}_deck_peek_ident(deck);card3 = get_card_and_flags(deck, 2, flags3);
// them back into the deck without losing any cards. The player won't// know what order they're in, and the if the top card is non-marked// then the player won't know what the next card is.// Return false if the operation was failed/aborted along the way.
// them back into the deck. The player won't know what order they're// in, and the if the top card is non-marked then the player won't// know what the next card is. Return false if the operation was// failed/aborted along the way.
// lose some cards, but keep at least twoif ( cards_in_deck(deck) > 2 ){const int num_lost = std::min(cards_in_deck(deck)-2, random2(3) + 1);for ( int i = 0; i < num_lost; ++i )_deck_lose_card(deck);if ( num_lost == 1 )mpr("A card falls out of the deck.");else if ( num_lost > 1 )mpr("Some cards fall out of the deck.");}
CrawlHashTable &props = deck.props;if (props["num_marked"].get_byte() > 0){mpr("You can't triple draw from a marked deck.");crawl_state.zero_turns_taken();return false;}
{ ABIL_NEMELEX_PEEK_DECK, ABIL_NEMELEX_DRAW_CARD,ABIL_NEMELEX_TRIPLE_DRAW, ABIL_NEMELEX_MARK_DECK,ABIL_NEMELEX_STACK_DECK },
{ ABIL_NEMELEX_DRAW_ONE, ABIL_NEMELEX_PEEK_TWO,ABIL_NEMELEX_TRIPLE_DRAW, ABIL_NEMELEX_MARK_FOUR,ABIL_NEMELEX_STACK_FIVE },
{ ABIL_NEMELEX_PEEK_DECK, "Deck Peek", 3, 0, 0, 1, ABFLAG_INSTANT },{ ABIL_NEMELEX_DRAW_CARD, "Draw Card", 2, 0, 0, 0, ABFLAG_NONE },
{ ABIL_NEMELEX_DRAW_ONE, "Draw One", 2, 0, 0, 0, ABFLAG_NONE },{ ABIL_NEMELEX_PEEK_TWO, "Peek at Two", 3, 0, 0, 1, ABFLAG_INSTANT },
{ ABIL_NEMELEX_MARK_DECK, "Mark Deck", 4, 0, 125, 5, ABFLAG_NONE },{ ABIL_NEMELEX_STACK_DECK, "Stack Deck", 5, 0, 250, 10, ABFLAG_NONE },
{ ABIL_NEMELEX_MARK_FOUR, "Mark Four", 4, 0, 125, 5, ABFLAG_NONE },{ ABIL_NEMELEX_STACK_FIVE, "Stack Five", 5, 0, 250, 10, ABFLAG_NONE },