NOTE_DEBUG_XOM might be a tiny bit technical or spoily, but at the same time I like the results and think this flag could actually be turned into an option to autonote all Xom effects, so I've left it on in this commit, in case someone else is playtesting Xom.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@9598 c06c8d41-db1a-0410-9941-cceddc491573
7GCM5WFIKX5N2PQ5UCVNMFJEKTZTBCUVZH5RZ7CPDL3Z6GB26KAQC
3KQZKOH3ILSXKL2KVT3BPHQ7AMR2B7T6GNWYC7T3SG2UQBXQZDCQC
M7WTOF3BVX5MGA7AQZB22YEFWCSL7RLW54PQM3MTRLCKUCUZZEUAC
UEO5XIX4ORXCZH2VSSCCUAQEXANUIBYSHSREXAFBE4PAJDBQU3BQC
MACQITZTGQEWIRQWNC7G46R4QUFSLGQ7ATERWEHAFRA66AS2XICQC
PTJJ6D52LDVJN7WA7NMYV2WHH3WJMWWLRGF3D7ZSBUNLAACFRJHAC
5BJPWUPLJFS34FUTFJVKA4A52YMIGV6EWDXLNSDCWBJWBGVSQFGQC
KFULGQQOHWUTXOM3BXCCYPGGVGGY4Z6265XUFRCBPNLTZAEHJZSQC
F7Q7QRZACTDPP6KH3AB5J6B6B5PRVV4FURTOIGXHRHWNVSQT3TVAC
JYEEOUYQ7ZPKOGWUV7VCORBVSOLF2UCBFBH3TR75RGOSS6PNKYUAC
H2OHWQKMHL66CPVJGJL35RY7EIZB74SZTGOLDJDSCG5WVEVPIIUAC
64HB7VYSYHQEN5UP7OYJ5GSVA2XMDSLLH647UPWE5NSFF3AVZSSQC
PUY2VWZJ3G7HNCLIHZP5VGT2DAGHI436ETDJQTPEBFPRSEHOM2NQC
DHI4FAUHYA3V7I2LKBE74AA672FVDUE2LBOZHTTL3EAE4YJP2ICAC
TPJYUAKSEZMCCCJANJ5EQ7F67QVTPFEOWBD7WYK33NLRN657Y5VQC
43XCHFXZ34FDVT2QG23RZ65V6NRBY6PE3ENQEEDXFYKRR7IRFHCAC
HCVH2CWL32UD66O6Z7ZYDUASWN3RF5TW6FSWURGMD7MELKB772FAC
5WHLQTLOJRJ67M4KAJZURHMNQLYHBW4XHQFBXV2LUQ4W6YKTOXVAC
KO7PZNWIRLSAPOXUHK7U446ZXT562QCPIT3AYFYKPG7OWRLNBU4QC
IBV5MNXWCCOWCI7DPVTPFEEMLX7QWP75EP6YQ3RA2WJOKWSGMPSQC
XYQFJLTMLSU7LC7VODUJVN5F2P47STH2KVSP7Q3BSCUUDRHROW7QC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
NDP5ANTLTYSDYLBHZPEJLO6IDU6OKA6UQHYWSBUXEEPYHZLRTYNQC
3BJ2OOF4F524G6UKVGOZVT6W3FSTSHHTKRJADUBZCHDXZWV3KANQC
X55CKEKNO5RD2JMQ4MYX6PXQLDMLH4U4PPKSBK5EQ622J5HOPD2AC
IP4A3VRYFYIVLRUAU4DF4KDNP6E4UISWJX3LI2F4EGSSMIJYRJXAC
6CZYPP67SB2M3SQS3QIPJWHZY7PJIRTTBH5CLORV3AALVTJIL5MQC
OELSU5HUOEW6D2AAZJUYB5G25OOGR3YU7UZKNA57EJG5HRMCQ7UAC
2DWQ5F6EYSBKF7CN3MFNMXQWS6NWHKDJN6RN6AH2FWAJUZGLB6RAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
X2FMEN4E345XD26Z2X7JMJ7VGHOGCGIELMHQRE2ITLVNQACP3NOQC
EYYWIH7377INOKPRABJUATNQ2YWKLOVHZKQIY55POX2YXVMDDWAAC
CJZ3R6IPU766AVGO2QHTEHY6BGM375IUL4W2XA33F2G2SGIAD2KQC
XZTGZ7MOPX7ZOHQ4IQPXOHGUH5WPRNOYAQ6IQOMZDZYNVSAYFTNAC
MSMWAL6JZAWNGZXCNXPATUMAU6TVXBWWFY666P7UBSZ5LPYJYUCQC
2J3TK3NYTO5XO6IHLTV5O6B3HYN2NHXD5ST3WLL5KPTUOVS5F3RQC
IH5TVAZGKN7IQOTSOJ56WG5C3CMTG3AI63XT3XVNHC7DI4N2TSUAC
W4YW6B4WTSMU4E5TXG27A6C2ZH3WASWOKCEMVHP7KEF2CZDLADJAC
2SMZGNBB352OJBIT2UE3NONODTTMV3FJJFBQUN4VNLLNYJKTJKBQC
V7IKAPO5OY7CJTT62GMHQOD3EQW42FTTY3KDBOTJUODPS5WMBCHAC
3DQXSE4YGFBBDUWK4YEOFWW4UPWILWELFSLP37SL6BERGAZJC5YAC
3HGELZU7NELOQ635HZO6IJIYLBSNCJ5VPH46IE22KA3OSLEFK7AQC
6G55KX5P4X7RFJAOJ7QU4ATMWC3ZVTCXKVHTYEAH5JYYGZCFQ7SAC
SOCJXX6MMOXLBEWBID4QN5FW2YNYULNNN7K3IRL7RSWK5EUNAZLQC
RQ24Y25QDO2GY65XESEVBCP6VXCB7BDTWXO42IPPI6UPRJQ5XYDAC
UPA65AL4JXYLIHH4D42IWJHRTOAF2BPOVZOAKOXBLZBYIMDZDFFQC
RQR4PTMGQLTRWLYRU3KXIIDGND7FBORESJWMWFVD3WYU5SISZXAAC
3PBG6FJ6WGSR4UM3I7UQUYYCSYU3UBCKCIKYKUEEANIK72TUL4XAC
5HPIIGNWB3UXJ5APQLAGFOV2CA7J2GB7AWAVVZDBB2YZS4TNCMAQC
OSRZEPPGBIMSZBWIVBTZTTIMV6TEUGVZRZ5AI2ZJW7CVZZQBUIMQC
VTQBKNSYDYZVBBQTF32DEECEEDYX75GX464E7GVFSK22N5JRNM4QC
25EF5X4H3LURXFZ35ZGYGUB6ND7NFQVH4M2XX2SI33I4XRGYG5HAC
QZERCVTY5BISIKSDH6WUXGZPIBAF4KUCGSZEEGMGBCORNUXT4HXAC
CH7JECYYH35H4TRHRNRTRJCQTQLZ2WRH62TKV72SUIU2RTK5OH7AC
HMC247EGUJ3Q25DQ3VKUCIGLIO4SZORFQQWAPAF6S2WLQY3WU5TQC
OMSSJON5IE4LBXJ7CZE52IZRZS7ZICS23SKP4AGLHH3QNCRMEFVAC
potion_type pot =
static_cast<potion_type>(
random_choose(POT_HEALING, POT_HEAL_WOUNDS, POT_SPEED,
POT_MIGHT, POT_INVISIBILITY, POT_BERSERK_RAGE,
POT_EXPERIENCE, -1));
potion_type pot = POT_HEALING;
while (true)
{
pot = static_cast<potion_type>(
random_choose(POT_HEALING, POT_HEAL_WOUNDS, POT_SPEED,
POT_MIGHT, POT_INVISIBILITY, POT_BERSERK_RAGE,
POT_EXPERIENCE, -1));
bool has_effect = true;
// Don't pick something that won't have an effect.
// Extending an existing effect is okay, though.
switch (pot)
{
case POT_HEALING:
if (you.rotting || you.disease || you.duration[DUR_CONF]
|| you.duration[DUR_POISONING])
{
break;
}
// else fall through
case POT_HEAL_WOUNDS:
if (you.hp == you.hp_max && player_rotted() == 0)
has_effect = false;
break;
case POT_BERSERK_RAGE:
if (!you.can_go_berserk(false))
has_effect = false;
break;
case POT_EXPERIENCE:
if (you.experience_level == 27)
has_effect = false;
break;
default:
break;
}
if (has_effect)
break;
}
#ifdef NOTE_DEBUG_XOM
std::string potion_msg = "XOM: potion effect ";
switch (pot)
{
case POT_HEALING: potion_msg += "(healing)"; break;
case POT_HEAL_WOUNDS: potion_msg += "(heal wounds)"; break;
case POT_SPEED: potion_msg += "(speed)"; break;
case POT_MIGHT: potion_msg += "(might)"; break;
case POT_INVISIBILITY: potion_msg += "(invisibility)"; break;
case POT_BERSERK_RAGE: potion_msg += "(berserk)"; break;
case POT_EXPERIENCE: potion_msg += "(experience)"; break;
default: potion_msg += "(other)"; break;
}
take_note(Note(NOTE_MESSAGE, 0, 0, potion_msg.c_str()), true);
#endif
#ifdef NOTE_DEBUG_XOM
static char summ_buf[80];
snprintf(summ_buf, sizeof(summ_buf), "XOM: summons %d %s%s",
num_actually_summoned,
hostiletype == 0 ? "friendly " :
hostiletype == 3 ? "hostile " : "",
only_demonic ? "demons" : "monsters");
take_note(Note(NOTE_MESSAGE, 0, 0, summ_buf), true);
#endif
lose_stat(stat, 1 + random2(max), true, "the vengeance of Xom" );
const int loss = 1 + random2(max);
lose_stat(stat, loss, true, "the vengeance of Xom" );
#ifdef NOTE_DEBUG_XOM
static char stat_buf[80];
snprintf(stat_buf, sizeof(stat_buf), "XOM: stat loss (-%d %s)",
loss, (stat == STAT_STRENGTH ? " Str" :
stat == STAT_DEXTERITY ? " Dex" : "Int"));
take_note(Note(NOTE_MESSAGE, 0, 0, stat_buf), true);
#endif
#ifdef DEBUG_CHAOS
std::string chaos_effect = "CHAOS effect: ";
switch (choice)
{
case CHAOS_CLONE: chaos_effect += "clone"; break;
case CHAOS_POLY: chaos_effect += "polymorph"; break;
case CHAOS_POLY_UP: chaos_effect += "polymorph PPT_MORE"; break;
case CHAOS_MAKE_SHIFTER: chaos_effect += "shifter"; break;
case CHAOS_MISCAST: chaos_effect += "miscast"; break;
case CHAOS_RAGE: chaos_effect += "berserk"; break;
case CHAOS_HEAL: chaos_effect += "healing"; break;
case CHAOS_HASTE: chaos_effect += "hasting"; break;
case CHAOS_INVIS: chaos_effect += "invisible"; break;
case CHAOS_SLOW: chaos_effect += "slowing"; break;
case CHAOS_PARALYSIS: chaos_effect += "paralysis"; break;
case CHAOS_PETRIFY: chaos_effect += "petrify"; break;
default: chaos_effect += "(other)"; break;
}
take_note(Note(NOTE_MESSAGE, 0, 0, chaos_effect.c_str()), true);
#endif
#ifdef DEBUG_CHAOS
std::string brand_name = "CHAOS brand: ";
switch (brand)
{
case SPWPN_NORMAL: brand_name += "(plain)"; break;
case SPWPN_FLAMING: brand_name += "flaming"; break;
case SPWPN_FREEZING: brand_name += "freezing"; break;
case SPWPN_HOLY_WRATH: brand_name += "holy wrath"; break;
case SPWPN_ELECTROCUTION: brand_name += "electrocution"; break;
case SPWPN_VENOM: brand_name += "venom"; break;
case SPWPN_DRAINING: brand_name += "draining"; break;
case SPWPN_DISTORTION: brand_name += "distortion"; break;
case SPWPN_VAMPIRICISM: brand_name += "vampiricism"; break;
case SPWPN_VORPAL: brand_name += "vorpal"; break;
// ranged weapon brands
case SPWPN_FLAME: brand_name += "(flame)"; break;
case SPWPN_FROST: brand_name += "(frost)"; break;
// both ranged and non-ranged
case SPWPN_CHAOS: brand_name += "chaos"; break;
case SPWPN_CONFUSE: brand_name += "confusion"; break;
default: brand_name += "(other)"; break;
}
take_note(Note(NOTE_MESSAGE, 0, 0, brand_name.c_str()), true);
#endif
}
// Turns autopickup off if we ran into an invisible monster or saw a monster
// turn invisible.
// Turns autopickup on if we saw an invisible monster become visible or
// killed an invisible monster.
void autotoggle_autopickup(bool off)
{
if (off)
{
if (Options.autopickup_on)
{
Options.autopickup_on = false;
mprf(MSGCH_WARN,
"Deactivating autopickup; reactivate with <w>Ctrl+A</w>.");
}
if (Options.tutorial_left)
{
learned_something_new(TUT_INVISIBLE_DANGER);
Options.tut_seen_invisible = you.num_turns;
}
}
else if (!Options.autopickup_on)
{
Options.autopickup_on = true;
mprf(MSGCH_WARN, "Reactivating autopickup.");
}
{
// Now that autoprayer has been removed the vectors aren't
// really needed anymore, but let's keep them "just in case".
std::vector<std::string> deactivatees;
std::vector<std::string> restart;
if (Options.autopickup_on)
{
deactivatees.push_back("autopickup");
Options.autopickup_on = false;
restart.push_back("Ctrl+A");
}
if (!deactivatees.empty())
{
mprf(MSGCH_WARN, "Deactivating %s; reactivate with %s.",
comma_separated_line(deactivatees.begin(),
deactivatees.end()).c_str(),
comma_separated_line(restart.begin(),
restart.end()).c_str());
}
if (Options.tutorial_left)
{
learned_something_new(TUT_INVISIBLE_DANGER);
Options.tut_seen_invisible = you.num_turns;
}
}
autotoggle_autopickup(true);