Changed pure deck distribution formula. All consumable items go towards decks of wonder, books and jewellery go towards decks of dungeon, and corpses are now valued proportionally to their weight, rather than every corpse being of equal value.
The chance of getting rare and legendary decks increases with piety.
The card countdown (which must be 0 to get a new gift deck) sometimes decreases when drawing a card, with the chance increasing with the number of piety points gained from drawing the card.
All of this is very tentative and subject to change upon the results of play testing.
Also, some more optional debugging messages have been added, which can be activated in a more fine grained manner than DEBUG_DIAGNOSTICS (DEBUG_CARDS, DEBUG_GIFTS, etc).
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@2184 c06c8d41-db1a-0410-9941-cceddc491573
E42EFZ3RINKLTGOJJZAH2N5QF3P4S5NCO5T52HLXJRMBPP463HTAC
TTJ3ZULM45YPPVIYM5AQ5WE362I5WCJ7RUILQDGVCBEXKVQ3YAYAC
2UBWR54HKLIWZQXB3ZFOH4R4X6TZWWZZWEU26KRDOS3BHC5J7GPAC
EI5XQIKW3OBVTDVT2A4Q535I5FOVEKARLFISM457IHGAK7TVOMVAC
PRQVFUGUGPKI2Q74ODEI3CYUJQB63CKC6ONQTE3BTOHKXG4JCNLQC
RHRAOBKSM35XB4EELW33PZ6ZJ25Z7R5CVCJVBEEAKCBQR7YK2BBAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
TZTHE3TEKUDMNLAXWKHO66SYIVCVCIOJLKF3MCHSNJTXCKTWK3LAC
MI7CWKRDXHAU7PIHLXXOSFBULRGT2OOMIMOSQLMVYOUVGABIVXGAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
APMT6XTVAD4ZCXCMUPTW5KCNR7TXW6W37SNYUP5A6NLFLXT3BCYQC
3KAINFIXO7WNWGUGZB43EUNFRS2ZPBLQZDTY456QACMRHYIJ7WDAC
UKN6HTZXDUUOWKNWNKWPHKGUGL474JIAQN5JU3DM3DU26WGMNP4AC
CJPKK53ACPSKYLJQAI3MF6WORZZ3UC3RF5YEH4F2YMTTOZ7KZLHQC
3NFVCXRVGHN2CHLLWFZES5RBS4R2BCDS4EEQNSDCFYIFQWQK7MUQC
T3N3QMDZCRFNBUCRXTICPL4XBK6ZBQC4HE2QD747EKTPABXRRA7QC
XKAJWK6MPHS3ZCZIPPLTIMOPF6AROGLRDDCS6EFE3IGE4AHT7MYQC
DTJNZWOY2ODLIKWXJXEXOABVO2NDU7DM4UZ3NVLHXPQORVNFPTJQC
2KTJHQUX2LTU2BCLS5YXVRRKMOYKKIZAPF2LBKORFGSHEN5IO3IAC
4O3VTUJT5T7NBNF3Q45XO2WHS6TCJXVLH6CKX4K36WUBDRT5F6KAC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
}
static void get_pure_deck_weights(int weights[])
{
weights[0] = you.sacrifice_value[OBJ_ARMOUR] + 1;
weights[1] = you.sacrifice_value[OBJ_WEAPONS] +
you.sacrifice_value[OBJ_STAVES] +
you.sacrifice_value[OBJ_MISSILES] + 1;
weights[2] = you.sacrifice_value[OBJ_MISCELLANY] +
you.sacrifice_value[OBJ_JEWELLERY] +
you.sacrifice_value[OBJ_BOOKS] +
you.sacrifice_value[OBJ_GOLD];
weights[3] = you.sacrifice_value[OBJ_CORPSES] / 2;
weights[4] = you.sacrifice_value[OBJ_POTIONS] +
you.sacrifice_value[OBJ_SCROLLS] +
you.sacrifice_value[OBJ_WANDS] +
you.sacrifice_value[OBJ_FOOD];
#if DEBUG_GIFTS || DEBUG_CARDS
static void show_pure_deck_chances()
{
int weights[5];
get_pure_deck_weights(weights);
float total = (float) (weights[0] + weights[1] + weights[2] + weights[3] +
weights[4]);
mprf(MSGCH_DIAGNOSTICS, "Pure cards chances: "
"escape %0.2f%%, destruction %0.2f%%, dungeons %0.2f%%,"
"summoning %0.2f%%, wonders %0.2f%%",
(float)weights[0] / total * 100.0,
(float)weights[1] / total * 100.0,
(float)weights[2] / total * 100.0,
(float)weights[3] / total * 100.0,
(float)weights[4] / total * 100.0);
}
#endif
// FIXME do something with OBJ_FOOD,
// OBJ_WANDS, OBJ_JEWELLERY, OBJ_BOOKS
// (and maybe OBJ_ORBS...)
weights[0] = you.sacrifice_value[OBJ_SCROLLS] +
you.sacrifice_value[OBJ_ARMOUR] + 1;
weights[1] = you.sacrifice_value[OBJ_WEAPONS] +
you.sacrifice_value[OBJ_STAVES] +
you.sacrifice_value[OBJ_MISSILES] + 1;
weights[2] = you.sacrifice_value[OBJ_MISCELLANY];
weights[3] = you.sacrifice_value[OBJ_CORPSES] * 100;
weights[4] = you.sacrifice_value[OBJ_POTIONS];
get_pure_deck_weights(weights);
// Piety|Common | Rare |Legendary
// --------------------------------
// 0: 95.00%, 5.00%, 0.00%
// 20: 86.00%, 10.50%, 3.50%
// 40: 77.00%, 16.00%, 7.00%
// 60: 68.00%, 21.50%, 10.50%
// 80: 59.00%, 27.00%, 14.00%
// 100: 50.00%, 32.50%, 17.50%
// 120: 41.00%, 38.00%, 21.00%
// 140: 32.00%, 43.50%, 24.50%
// 160: 23.00%, 49.00%, 28.00%
// 180: 14.00%, 54.50%, 31.50%
// 200: 5.00%, 60.00%, 35.00%
int common_weight = 95 - (90 * you.piety / MAX_PIETY);
int rare_weight = 5 + (55 * you.piety / MAX_PIETY);
int legend_weight = 0 + (35 * you.piety / MAX_PIETY);
deck_rarity_type rarity = (deck_rarity_type)
random_choose_weighted(common_weight,
DECK_RARITY_COMMON,
rare_weight,
DECK_RARITY_RARE,
legend_weight,
DECK_RARITY_LEGENDARY,
0);
item_def &deck(mitm[thing_created]);
deck.colour = deck_rarity_to_color(rarity);
// For a stacked deck, 0% chance of card countdown decrement
// drawing a card which doesn't use up the deck, and 40%
// on a card which does. For a non-stacked deck, an
// average 50% of decrement for drawing a card which doesn't
// use up the deck, and 80% on a card which does use up the
// deck.
int chance = 0;
switch(level)
{
case 0: chance = 0; break;
case 1: chance = 40; break;
case 2: chance = 70; break;
default:
case 3: chance = 100; break;
}
if (random2(100) < chance && you.attribute[ATTR_CARD_COUNTDOWN])
{
you.attribute[ATTR_CARD_COUNTDOWN]--;
#if DEBUG_DIAGNOSTICS || DEBUG_CARDS || DEBUG_GIFTS
mprf(MSGCH_DIAGNOSTICS, "Countdown down to %d",
you.attribute[ATTR_CARD_COUNTDOWN]);
#endif
}
if ((mitm[i].base_type == OBJ_CORPSES && coinflip())
// Aproximate piety gain chance.
// Value: %
// ---------
// 10: 9.0%
// 20: 17.5%
// 30: 25.5%
// 40: 34.0%
// 50: 42.5%
// 60: 50.0%
// 70: 58.0%
// 80: 63.0%
if ((item.base_type == OBJ_CORPSES && coinflip())
}
if (item.base_type == OBJ_FOOD && item.sub_type == FOOD_CHUNK)
// No sacrifice value for chunks of flesh, since food
// value goes towards decks of wonder.
;
else if (item.base_type == OBJ_CORPSES)
{
#if DEBUG_GIFTS || DEBUG_CARDS || DEBUG_SACRIFICE
mprf(MSGCH_DIAGNOSTICS, "Corpse mass is %d",
item_mass(item));
#endif
you.sacrifice_value[item.base_type] += item_mass(item);
unsigned char deck_rarity_to_color(deck_rarity_type rarity)
{
switch(rarity)
{
case DECK_RARITY_COMMON:
{
const unsigned char colours[] = {BLACK, BLUE, GREEN, CYAN, RED};
return RANDOM_ELEMENT(colours);
}
case DECK_RARITY_RARE:
if (coinflip())
return (MAGENTA);
else
return (BROWN);
case DECK_RARITY_LEGENDARY:
return LIGHTMAGENTA;
}
return (WHITE);
}