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 two
if ( 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 },