the weight is 5 for everything at all rarities except for Damnation (which is 0,1,2) and Focus (which is 1,1,2). Suggestions and changes would be appreciated (look at the top of decks.cc to see what to change.)
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@2941 c06c8d41-db1a-0410-9941-cceddc491573
CJWCTWT75S4P3OSCMUZ2W6UTWI6GOQMUSBUN6KEN4TVFEG4HHHGQC
CA6ZG6P2CE5EPAOQSB3P7NBDKTNFFHQP4CPOUFZL32ON6N32GSSQC
CUB27EJDQG66FF2YCKOV4HU3LAJVJIHUJ5QYLURRDIEVGPK666DQC
VUP5G3CB6L5I5TPVWMM4KAMF6N4X6UPO4HQZKTSO2ETXZEFBMOMAC
6LYLJJDKKIPIXKJITRAC7LAZSNBO7O4IJIVBKUC7FD57AV53LHHAC
EGV2HM7SD7UQSWJGLR65NQJTUBAJ7WHLM67FMH4UFP7JRSFKREPAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
3KAINFIXO7WNWGUGZB43EUNFRS2ZPBLQZDTY456QACMRHYIJ7WDAC
Q2XCGRT36NCRQKWNL53EAS3ADON5SJQ5GEMJMX5S3QAG553HFVFQC
DH3YTI6VVI727SQXO4CXSDCSBG2UN3UAWLFULBGRLBVH22ACRXIAC
QKGDOYIYKE6B36ION5O2DRW65DWWPZMYNWJVH7LJJ7FPGGM2MYAQC
2IJDLTWK74ULETLFTIPUIY2MSG6RNONVAFNFE7MADPT6UNYSSBDAC
TMFNNWBMIPWM2FDC7I5R2RUKWNBS3GD3DX6VN452VYRPC3GU2HCQC
5BJPWUPLJFS34FUTFJVKA4A52YMIGV6EWDXLNSDCWBJWBGVSQFGQC
JPYDWBRN75GC6UZ26MXJTCXGORTJOWGRDEU4JFPU52LYHGK6UI2QC
K2GMFKXUWN5R3KCW6OYVXHN47MIQZKEEIOSAU6LFFKBNKF6JBVWAC
#define VECFROM(x) (x), (x) + ARRAYSIZE(x)
#define DEFVEC(Z) static std::vector<card_type> Z(VECFROM(a_##Z))
static card_type a_deck_of_transport[] = {
CARD_PORTAL, CARD_WARP, CARD_SWAP, CARD_VELOCITY
struct card_with_weights
{
card_type card;
int weight[3];
static card_type a_deck_of_destruction[] = {
CARD_VITRIOL, CARD_FLAME, CARD_FROST, CARD_VENOM, CARD_HAMMER,
CARD_SPARK, CARD_PAIN, CARD_TORMENT
const deck_archetype deck_of_transport[] = {
{ CARD_PORTAL, {5, 5, 5} },
{ CARD_WARP, {5, 5, 5} },
{ CARD_SWAP, {5, 5, 5} },
{ CARD_VELOCITY, {5, 5, 5} },
END_OF_DECK
DEFVEC(deck_of_destruction);
static card_type a_deck_of_battle[] = {
CARD_ELIXIR, CARD_BATTLELUST, CARD_METAMORPHOSIS,
CARD_HELM, CARD_BLADE, CARD_SHADOW
const deck_archetype deck_of_emergency[] = {
{ CARD_TOMB, {5, 5, 5} },
{ CARD_BANSHEE, {5, 5, 5} },
{ CARD_DAMNATION, {0, 1, 2} },
{ CARD_SOLITUDE, {5, 5, 5} },
{ CARD_WARPWRIGHT, {5, 5, 5} },
END_OF_DECK
DEFVEC(deck_of_battle);
static card_type a_deck_of_enchantments[] = {
CARD_ELIXIR
const deck_archetype deck_of_destruction[] = {
{ CARD_VITRIOL, {5, 5, 5} },
{ CARD_FLAME, {5, 5, 5} },
{ CARD_FROST, {5, 5, 5} },
{ CARD_VENOM, {5, 5, 5} },
{ CARD_HAMMER, {5, 5, 5} },
{ CARD_SPARK, {5, 5, 5} },
{ CARD_PAIN, {5, 5, 5} },
{ CARD_TORMENT, {5, 5, 5} },
END_OF_DECK
static card_type a_deck_of_summoning[] = {
CARD_CRUSADE, CARD_SUMMON_ANIMAL, CARD_SUMMON_DEMON, CARD_SUMMON_WEAPON,
CARD_SUMMON_SKELETON
const deck_archetype deck_of_battle[] = {
{ CARD_ELIXIR, {5, 5, 5} },
{ CARD_BATTLELUST, {5, 5, 5} },
{ CARD_METAMORPHOSIS, {5, 5, 5} },
{ CARD_HELM, {5, 5, 5} },
{ CARD_BLADE, {5, 5, 5} },
{ CARD_SHADOW, {5, 5, 5} },
END_OF_DECK
DEFVEC(deck_of_wonders);
const deck_archetype deck_of_summoning[] = {
{ CARD_CRUSADE, {5, 5, 5} },
{ CARD_SUMMON_ANIMAL, {5, 5, 5} },
{ CARD_SUMMON_DEMON, {5, 5, 5} },
{ CARD_SUMMON_WEAPON, {5, 5, 5} },
{ CARD_SUMMON_SKELETON, {5, 5, 5} },
END_OF_DECK
};
static card_type a_deck_of_dungeons[] = {
CARD_GLASS, CARD_MAP, CARD_DOWSING, CARD_SPADE, CARD_TROWEL, CARD_MINEFIELD
const deck_archetype deck_of_wonders[] = {
{ CARD_POTION, {5, 5, 5} },
{ CARD_FOCUS, {1, 1, 2} },
{ CARD_SHUFFLE, {5, 5, 5} },
{ CARD_EXPERIENCE, {5, 5, 5} },
{ CARD_WILD_MAGIC, {5, 5, 5} },
{ CARD_HELIX, {5, 5, 5} },
END_OF_DECK
DEFVEC(deck_of_dungeons);
const deck_archetype deck_of_dungeons[] = {
{ CARD_GLASS, {5, 5, 5} },
{ CARD_MAP, {5, 5, 5} },
{ CARD_DOWSING, {5, 5, 5} },
{ CARD_SPADE, {5, 5, 5} },
{ CARD_TROWEL, {5, 5, 5} },
{ CARD_MINEFIELD, {5, 5, 5} },
END_OF_DECK
};
static card_type a_deck_of_oddities[] = {
CARD_GENIE, CARD_BARGAIN, CARD_WRATH, CARD_XOM,
CARD_FEAST, CARD_FAMINE, CARD_CURSE
const deck_archetype deck_of_oddities[] = {
{ CARD_GENIE, {5, 5, 5} },
{ CARD_BARGAIN, {5, 5, 5} },
{ CARD_WRATH, {5, 5, 5} },
{ CARD_XOM, {5, 5, 5} },
{ CARD_FEAST, {5, 5, 5} },
{ CARD_FAMINE, {5, 5, 5} },
{ CARD_CURSE, {5, 5, 5} },
END_OF_DECK
DEFVEC(deck_of_oddities);
static card_type a_deck_of_punishment[] = {
CARD_WRAITH, CARD_WILD_MAGIC, CARD_WRATH,
CARD_XOM, CARD_FAMINE, CARD_CURSE, CARD_TOMB,
CARD_DAMNATION, CARD_PORTAL, CARD_MINEFIELD
const deck_archetype deck_of_punishment[] = {
{ CARD_WRAITH, {5, 5, 5} },
{ CARD_WILD_MAGIC, {5, 5, 5} },
{ CARD_WRATH, {5, 5, 5} },
{ CARD_XOM, {5, 5, 5} },
{ CARD_FAMINE, {5, 5, 5} },
{ CARD_CURSE, {5, 5, 5} },
{ CARD_TOMB, {5, 5, 5} },
{ CARD_DAMNATION, {5, 5, 5} },
{ CARD_PORTAL, {5, 5, 5} },
{ CARD_MINEFIELD, {5, 5, 5} },
END_OF_DECK
case MISC_DECK_OF_DESTRUCTION: pdeck = &deck_of_destruction; break;
case MISC_DECK_OF_DUNGEONS: pdeck = &deck_of_dungeons; break;
case MISC_DECK_OF_SUMMONING: pdeck = &deck_of_summoning; break;
case MISC_DECK_OF_WONDERS: pdeck = &deck_of_wonders; break;
case MISC_DECK_OF_PUNISHMENT: pdeck = &deck_of_punishment; break;
case MISC_DECK_OF_DESTRUCTION: pdeck = deck_of_destruction; break;
case MISC_DECK_OF_DUNGEONS: pdeck = deck_of_dungeons; break;
case MISC_DECK_OF_SUMMONING: pdeck = deck_of_summoning; break;
case MISC_DECK_OF_WONDERS: pdeck = deck_of_wonders; break;
case MISC_DECK_OF_PUNISHMENT: pdeck = deck_of_punishment; break;
case 0: pdeck = &deck_of_destruction; break;
case 1: pdeck = &deck_of_enchantments; break;
case 2: pdeck = &deck_of_battle; break;
case 3: pdeck = &deck_of_summoning; break;
case 4: pdeck = &deck_of_transport; break;
case 5: pdeck = &deck_of_emergency; break;
case 0: pdeck = deck_of_destruction; break;
case 1: pdeck = deck_of_enchantments; break;
case 2: pdeck = deck_of_battle; break;
case 3: pdeck = deck_of_summoning; break;
case 4: pdeck = deck_of_transport; break;
case 5: pdeck = deck_of_emergency; break;
const std::vector<card_type> *pdeck = random_sub_deck(deck_type);
// We assume here that common == 0, rare == 1, legendary == 2.
// FIXME: We should use one of the various choose_random_weighted
// functions here, probably with an iterator, instead of
// duplicating the implementation.
card_type chosen = (*pdeck)[random2(pdeck->size())];
// Paranoia
if (chosen < CARD_BLANK1 || chosen >= NUM_CARDS)
chosen = NUM_CARDS;
return chosen;
return result;
static void retry_blank_card(card_type &card, unsigned char deck_type,
unsigned char flags)
{
// BLANK1 == hasn't been retried
if (card != CARD_BLANK1)
return;
if (flags & (CFLAG_MARKED | CFLAG_SEEN))
{
// Can't retry a card which has been seen or marked.
card = CARD_BLANK2;
return;
}
const std::vector<card_type> *pdeck = random_sub_deck(deck_type);
if (flags & CFLAG_ODDITY)
pdeck = &deck_of_oddities;
// High Evocations gives you another shot (but not at being punished...)
if (pdeck != &deck_of_punishment
&& you.skills[SK_EVOCATIONS] > random2(30))
if ( one_chance_in(100) )