You now get messages like "The seven-headed hydra bites."
and "You slice the 12-headed hydra."
FR 1963606: Take a note when you pick up a rune (or the Orb!) for the first time.
There are a couple of other files I changed, but I can't remember any big stuff, so it was probably just cleanup.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@5029 c06c8d41-db1a-0410-9941-cceddc491573
KEANRIMF5CGFVZ2XJYNFPOAKLXOSOJUOVA73IWBWOG576265ERHAC
LNCIVPGKO36VUODC5HDGIVJM4BSK5ONC3ANMZKDLWLYJGROEZWCQC
MI3QIGA6VDUMXL7NO3Q2NWCJN5FGX5CDMDYLEKOMD6SALHEINW5QC
MLF7O6GXUABY244PDOX3KYGEMIBCJW2Y42GVP4LRW2L5KVD3UF7AC
GPEJOT73KMACP33IPAKFR5ROGHCOIP22VXZMQNYTGLEA2OSZUM2AC
WJSOXPDCW52YN2ZG6L5J2LS65CDVS626L33MJWEX3FBSLOFVXFPAC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
ILOED4VB4I6VPAUTR75ZWX6MXDYXB5DO2EDK2UH67O3HNKWV23RQC
RC6L3CIBLJEH4GWRFD7UQNGI6PZT74FRUVOYHSAN2XCC74NZUASQC
LLKV4OYGEDB4GVJS5JVBZP5JQFW7VMPZ2CBRSITJ5XCFS3QNWIBQC
LDBTCT5WIPLJPZWXS2RUQ26QKISCUUTLO77M464WOE6VSYSNPKYAC
TAHSTXR7ROOMDFUSBUU4ZAIEWQLAS5CIRCTARLD4Q2BGNLSL7E5QC
TJISAZK5RWKXIIC5UTQNY4KT3UX3ASGBUQQNWZ7ZDULPRYFRZXQQC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
AVCMVFA3MKCXHO6H44UK5KJNIHTGQV7UA7GYXM26VI6TXXU5ZN6QC
QUHEENPY2PYTEUS7C4R3CKE4FHSHGR2BIXB6EW676ESX3727PA3AC
JAYS2VMYWPH2YKIDWEXW2NOK4ATTIXTGZTXUVDDIQGCXLB5W4OUQC
VJDLV4PF2ZJ46NERO4LZUX5JE2CD5XBOBQCYYPTFWTHLUEYDUOYAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
OEISFRW2B7E4YRJSWXNXBH2IAJO4O3LHNYFPFD3MBY57LYVRHMZQC
X7X6JKZXOCG6NVLZLGNCQDFFXW4H3S77BVAJ5LS7ZHZ4GQVLMOMAC
S2LIBA2CLTZ6ZU66AUZ2CCNLCDOBSGWQGTZ6HFAFP2XSWAALGLSQC
25CH7HH4LKXFIZ75YNMXS3TSXO6O27DYSOPLOD45K4OCNFWLS4LQC
XI7U6RL6MFTH6SZQMLO4XFWGXGIFJBCRT6ZFCJFR2B2MGRSKDDCAC
RM2JXW3ATVYRYHF3NMG5ALGI64OJ7IP2F3MDUDPUT5TBKSSN4KVQC
CAHE52HL2ZGRJPBYZ3DS4BVKUD2XC7N3SG25TGG7JGHGJDST4P3QC
O4DT3BQQ3XYPL6PQ72G6VPBAVHXZMEOLONFXNHXFMBXBVOYMB6VQC
FLKXPXQ7SRFZPJPDM35D5CG6M52WP4SL32QNEZNSHGBNZYTKYGYAC
JW2KRJHES33W7UTWZ6NDO4TLMK4EFU4HKZXBWR2UJOMPCCOTR4CQC
77H4BWWPPGLM3PLZH4QTAJRXIZTSDVNCOKZE223I437FN2UJ34RQC
ARVJY7XPMCHI4IAQMD2VUWTAXQLCRNVSM2MK3YT4S4WHQYFTLEMAC
74LQ7JXVLAFSHLI7LCBKFX47CNTYSKGUQSXNX5FCIUIGCC2JTR3QC
34RCM6RXIWHZMYXNGFQKLKQIAJ6QISIQ3D5HMK4HZNLVX66BSUBAC
UWMN4HLG6YA2YFQEVIVMDISD6APKEPIZXMMPMNUYCBQDSAUYSXPQC
EIULXYQC3OPXDGTBRDOI7ITILQ22RGEGG6UFCGY2O5HD7SN5NUUQC
IVVTHLTTLOP5TSULXJWUSSXHOKYWVU3OWKYVK45A7RIB6V34MYQAC
XIXBLWIVUPWM3P6XQIB7CS45JOOIYE6OBYYYERCFAYYO4VOWOYUQC
SUQ7J6V6BDWG6G6KBGPQ6HYKBMJDM6VKN7ODHVU6YCPRWNEOZCJQC
7V4DCKFJCNBXFODMKJ6H3MCDUTSD4XVQ7D4D6XFCD4JNF4HCE4KAC
DDU4A3JGN5IUIPP5IASOODKPR2WBHSDSV4FITZ6HNXNSXXQACWAQC
43ZTEB57FU7KE5EVMYWZONNVJBZCGF3JEAJZIY25LC4LGE65PG5QC
PADV7V2SZDQMQICKJ5DZPQMFF26JXPNM5XEHTWD3BSHPTAAXXJKQC
X2FMEN4E345XD26Z2X7JMJ7VGHOGCGIELMHQRE2ITLVNQACP3NOQC
KFULGQQOHWUTXOM3BXCCYPGGVGGY4Z6265XUFRCBPNLTZAEHJZSQC
TV3ZC6WOZKSQQJQN26JIVKCHK6UK7WMDBYZDUYRWEAZ4JB4YVNAAC
ZK5H5YBD3R7H3KKNKSJYE65TUEPPWIWUJLU567FKSZYQYIW6ZVFAC
WF2DSJGR6PKLGQSXEFF4ZW4EZZFGMHXPXWUYAKYBPFJH6KJKAANQC
UZ5623MOLKBTGBSRBJ4OBOEI4IEZSPV3NCV2DRMUZ3CHHJQVHIIAC
NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC
IE3INS4WUXZOBVXB5VWRBYPVPXADD2U2W5H3TBTOYNWJ3EGRSGQQC
4NBPZKMZBKB3QYX4FFUAKDXQS43NJCBDLMHKDJFVXHQLX4MQDINAC
QDTVLBRGHDTRUVT7I3O72K6TMOYAUSAJBZUHGOEFU2RKJNUPWZSQC
W7KGGF2VUXLD6YH55EPIRQ5SF5VKVKT33P6RNKCFCVQ4QXOLQE7AC
AUXVWXWIFSTWFA6VZXN2FMG7FQEKRZVV6MD32VQQ7J2RKCXHAVGAC
67WH6I2XIMRRL26UM4FJJJZEMJIDPW5Q77FFNZGKWGTWS7GTCJ6QC
A3MLQ7PZMDW5YGEKMX6YOKMJQE7CZPULZ4SWAFKAQIKWI5XXYG7AC
XVX7AVLLYZJIJUZA2LZ6T57PHULWPDRZOHELDF4JHZ35EMINFFZQC
5BJPWUPLJFS34FUTFJVKA4A52YMIGV6EWDXLNSDCWBJWBGVSQFGQC
FJ2URTFOTFNB5VZUQMFTO7MMQBBWSOPRY2RE3UG2ZFJYOXBIMC7QC
VXSORUQOM2VZA4CAZDC6KPAY373NQIN3UT7CXQXTRCYXO2WM62DAC
OR7VGWIBRR55M7HATPIORQMMB4YQ7EQXO2IWAFFFPEJ4VV3ASRRQC
W5VEC2PBIM5DMU5233HOWAZUEPTGWJRZZIA3H35YYQQW6BTP6XUAC
EFWEYIB2R3DPD3JWIPU6LS6SFLPMYN7J7X4GBZR7DJWKHJ3UELSAC
LJK4ZQATLSB4MKZG3ARZX5V6RFGTN3NLCN6GTCUGJQKU26SOXMUAC
6ME4TYV7ITXCAUMNVB27LRRHB72J2FVVZMJNS34IMAN57R37AE2QC
QYQKV4R47PTERXVFQNNWWQVICGSOMBHW6WM5TAZAKLIYOLLPUAJAC
GL7TJGUGV4JPLZCDWH6QVST4RYW7UJV6IP7UAEWEKNBWJO2H2ZHAC
GRH4XPIYHDOXXF3R3QPMZTFHGLO2OJAZS4FLNBBXG3DHTQQM7RDQC
JDM27QE4HR52AYFSQE763BFF57ANOTF5MXKMO377PP5EXMN7SAOAC
CWPA3Q5BG7KTTY6GX7CCS26PWC4UHJ47PUCMJX5BOJIP3FSTP2BQC
YCL3W2PFE6ILTGBFODCSXNPDIA46KVSZP2TI7HDMYAOEJT65RIEAC
WXSNNK2RXP3DQFAEQGQUZJHFWXJC7ZKG2WURZGL566UDM4YXFSWQC
LAMIVDKY7LO5ONX5Z273ZCCEA5UBENOJD5VWNE4AK2EXGFED6BFQC
VRFQK6S2TXOFFO5K5HRDXPR7QEKKAZAVCASSIJVPWQ4GE26UOGTQC
PAYI4UTJCR3XZSFOX5L35EURHRXQ6STO4Z7AQ3525QPNL3QYLNBAC
22QSFI3GQEJGETOKQHXI6JHR5VQV7GUC76VCLZCFYECSTSUIDRBQC
W2KRIXSCRJPS6WDIYTHVF5IRMF3V5DWECRAWUPVTB7VZ6A2BLD4QC
ZIFFVCQ72K35WGIUMZYN3KOXIUXF2CNXWKG6ZWEZ6LT3NSF3XOQAC
VCG3BRIYRTNNWYC3LOXD6KFGXOX37HAFW2HNV7WXVG2V7EUHLDZQC
GOPBXMJ7EKKPDSDXCANWW6ARWGNLOQ5DK7WI4UPD7K2GCDSK2HXAC
32TNF7QPH765BC6VP4KVA4R2REGP6VI7CJ7QW2OOGP66Y7CUNQWQC
NXVPOFYKJFWQWKVPQUMWH2Y2KJEZX44BUOBFJ4JD4KFGPEGYHG4QC
5B5DP5S6A6LQMKZYVLQAEMHQZWFWYDHPCKQGRNSCNNYIBQYZ6BIQC
JJH7VX2LLBZPDKG24SQREWQLX6I6RYNWFECHRZVK7PT5KPQ4MAMAC
M47QBURKKRV2JFK6U7GQNVWK7RUTBVPBJ5FHURC55SKQSXAUFSBAC
YH23OR26YDA6C5K74QRWHROMTPGRNZHTHE4HJGPC3JVNAJ62CHGAC
65CM2EZCAFFBWLAYZ7ALBV3BQKNZCYOHYIFY46KU7BZL3LHV36JAC
4MPLCIJZL4YNUWK2RTKNE6N4UWNBMO5WDRKW737ENVE3RKV5LCRAC
LW4N5EHKL776DURXZMAM6JEW3JPWWX5BSNP7TCZHTLCDOQTTGFCAC
HSRRNAU5UAYC6B6IQWGJPFROMZBTJICPCH6DJVZDHDTAGOQ6IOYAC
YFACWAHJI6DAZDNCI7C4NSSPYFRAKORZTXUFX6PRM6JQ7GCQKHGAC
7U7IZUR2C7UALYI4Y3SHBYGTHYVQM6JI4PXDFXUFL3T3L6JBSC6AC
2YZN7CPQFZMSMFMVCE2FATR52SVDE3OZHTS7F7QCKJIZUA4WX2AQC
6LQRCVJKIKB2HM33QCHYLVM3UCWGIJTJPCWLDUFSFP3YCCQTSCEAC
WNQLH6VJ5DIPNQJUSUQBEKGNOZYCVWU5BYP4W6WQZBRMSR7GLUUQC
YC3DFUPDLGXVGGW7IQ57YCMKASBANVE22IRDIDZXAC2KOMRZC5ZAC
SCZCQPNBQG2GXZ76LCEYOMB4QMZGI6YV7LJEC7ZVBUG27KLO564AC
3ZNI2YMHYXRVEONY5CGWXSRMFSLOATZMKU7H6HRY3CC2W6OZAM7QC
6TEISZD7HYSSL24EOKIBNURU66KGSQX7B7SNAHBP4DQSAOTGH2MQC
FXLBM7PB5FCPMKZNI3NSVDAEM26MAQU5RG55BEBL3LRN7QMPLWTAC
DBGS3HXMW24VO5GBITT3UI2ZNIISUXUHAEAYUI52QPUT7IO46ITQC
IHIJSWVOONSTA2WCHKW3YKBLETUQECFVBVLMET5SGQZ4C6U3GCUQC
7NDXS36TE7QVXTXJWMYSVG5UHCCLPIO4VL6NXFGTDK3ZNKE3A2IAC
ACDPN464TK2LKLHSDN3YVRHAPF7WLSLLU3UHIYEXKFDEZPEU3XSQC
return (grid == DNGN_DEEP_WATER || grid == DNGN_SHALLOW_WATER ||
grid == DNGN_LAVA || is_trap(x, y) || is_monster_blocked(x, y));
return (grid == DNGN_DEEP_WATER || grid == DNGN_SHALLOW_WATER
|| grid == DNGN_LAVA || is_trap(x, y) || is_monster_blocked(x, y));
return airborne() &&
(permanent_flight() ||
// Boots of levitation keep you with DUR_LEVITATION >= 2 at
// all times. This is so that you can evoke stop-levitation
// in order to actually cancel levitation (by setting
// DUR_LEVITATION to 1.) Note that antimagic() won't do this.
(player_equip_ego_type( EQ_BOOTS, SPARM_LEVITATION ) &&
you.duration[DUR_LEVITATION] > 1));
// Boots of levitation keep you with DUR_LEVITATION >= 2 at
// all times. This is so that you can evoke stop-levitation
// in order to actually cancel levitation (by setting
// DUR_LEVITATION to 1.) Note that antimagic() won't do this.
return (airborne()
&& (permanent_flight()
|| player_equip_ego_type( EQ_BOOTS, SPARM_LEVITATION )
&& you.duration[DUR_LEVITATION] > 1));
for ( unsigned int i = 0; i < Options.note_skill_levels.size(); ++i )
if ( level == Options.note_skill_levels[i] )
for (unsigned int i = 0; i < Options.note_skill_levels.size(); ++i)
if (level == Options.note_skill_levels[i])
return (hp > 0 && Options.note_hp_percent &&
hp <= (maxhp * Options.note_hp_percent) / 100);
return (hp > 0 && Options.note_hp_percent
&& hp <= (maxhp * Options.note_hp_percent) / 100);
if ( lev == dungeon_branch_depth(branch) ||
(branch == BRANCH_MAIN_DUNGEON && (lev % 5) == 0) ||
(branch != BRANCH_MAIN_DUNGEON && lev == 1) )
if (lev == _dungeon_branch_depth(branch)
|| branch == BRANCH_MAIN_DUNGEON && (lev % 5) == 0
|| branch != BRANCH_MAIN_DUNGEON && lev == 1)
{
/* Is a note worth taking?
This function assumes that game state has not changed since
the note was taken, e.g. you.* is valid.
*/
static bool is_noteworthy( const Note& note )
// Is a note worth taking?
// This function assumes that game state has not changed since
// the note was taken, e.g. you.* is valid.
static bool _is_noteworthy( const Note& note )
if ( note.type == NOTE_XP_LEVEL_CHANGE ||
note.type == NOTE_GET_GOD ||
note.type == NOTE_GOD_GIFT ||
note.type == NOTE_GET_MUTATION ||
note.type == NOTE_LOSE_MUTATION ||
note.type == NOTE_GET_ITEM ||
note.type == NOTE_ID_ITEM ||
note.type == NOTE_SEEN_MONSTER ||
note.type == NOTE_KILL_MONSTER ||
note.type == NOTE_POLY_MONSTER ||
note.type == NOTE_USER_NOTE ||
note.type == NOTE_MESSAGE ||
note.type == NOTE_LOSE_GOD ||
note.type == NOTE_PENANCE ||
note.type == NOTE_MOLLIFY_GOD ||
note.type == NOTE_DEATH )
if (note.type == NOTE_XP_LEVEL_CHANGE
|| note.type == NOTE_GET_GOD
|| note.type == NOTE_GOD_GIFT
|| note.type == NOTE_GET_MUTATION
|| note.type == NOTE_LOSE_MUTATION
|| note.type == NOTE_GET_ITEM
|| note.type == NOTE_ID_ITEM
|| note.type == NOTE_SEEN_MONSTER
|| note.type == NOTE_KILL_MONSTER
|| note.type == NOTE_POLY_MONSTER
|| note.type == NOTE_USER_NOTE
|| note.type == NOTE_MESSAGE
|| note.type == NOTE_FOUND_ORB_OR_RUNE
|| note.type == NOTE_LOSE_GOD
|| note.type == NOTE_PENANCE
|| note.type == NOTE_MOLLIFY_GOD
|| note.type == NOTE_DEATH)
{
if ( note.type == NOTE_MP_CHANGE ||
note.type == NOTE_MAXHP_CHANGE ||
note.type == NOTE_MAXMP_CHANGE )
if (note.type == NOTE_MP_CHANGE
|| note.type == NOTE_MAXHP_CHANGE
|| note.type == NOTE_MAXMP_CHANGE)
{
if ( Options.note_all_skill_levels )
return true;
if ( is_noteworthy_skill_level(note.second) )
return true;
if ( Options.note_skill_max && is_highest_skill(note.first) )
if (Options.note_all_skill_levels
|| _is_noteworthy_skill_level(note.second)
|| Options.note_skill_max && _is_highest_skill(note.first))
{
/* not if we have a recent warning */
if ( (note.turn - rnote.turn < 5) &&
/* unless we've lost half our HP since then */
(note.first * 2 >= rnote.first) )
// Not if we have a recent warning
// unless we've lost half our HP since then.
if (note.turn - rnote.turn < 5
&& note.first * 2 >= rnote.first)
{
const char* ordinals[5] = { "first", "second", "third", "fourth",
"fifth" };
if ( number < 1)
const char* ordinals[5] = { "first", "second", "third", "fourth", "fifth" };
if (number < 1)
// accuracy is halved if the dragon is attacking a target that's
// wielding a weapon of dragon slaying (which makes the
// dragon/draconian avoid looking at the foe).
if ((mons_genus(monster->type) == MONS_DRAGON
|| mons_genus(monster->type) == MONS_DRACONIAN))
// Accuracy is lowered by one quarter if the dragon is attacking a
// a target thatis wielding a weapon of dragon slaying (which
// makes the dragon/draconian avoid looking at the foe).
// FIXME: This effect is not yet implemented for player draconians
// or characters in dragon form breathing at monsters wielding a
// weapon with this brand.
if (mons_genus(monster->type) == MONS_DRAGON
|| mons_genus(monster->type) == MONS_DRACONIAN)
break;
case MONS_HYDRA:
if (mon.number < 1 || desc == DESC_PLAIN || desc == DESC_DBNAME)
break;
if (mon.number < 11)
{
result += (mon.number == 1) ? "one" :
(mon.number == 2) ? "two" :
(mon.number == 3) ? "three" :
(mon.number == 4) ? "four" :
(mon.number == 5) ? "five" :
(mon.number == 6) ? "six" :
(mon.number == 7) ? "seven" :
(mon.number == 8) ? "eight" :
(mon.number == 9) ? "nine"
: "ten";
}
else
{
snprintf(info, INFO_SIZE, "%d", mon.number);
result += info;
}
result += "-headed ";
for ( int srx = you.x_pos - max_dist; srx <= you.x_pos + max_dist; ++srx )
{
for ( int sry=you.y_pos - max_dist; sry<=you.y_pos + max_dist; ++sry )
for (int srx = you.x_pos - max_dist; srx <= you.x_pos + max_dist; ++srx)
for (int sry = you.y_pos - max_dist; sry <= you.y_pos + max_dist; ++sry)
// XXX: Not strictly correct if we add any other monster with a
// variable number of attacks.
if (mon->has_hydra_multi_attack())
mprf(MSGCH_EXAMINE, "It has %d head%s.", mon->number,
(mon->number > 1? "s" : ""));
static void adjust_spells(void);
static void adjust_ability(void);
static void list_wizard_commands();
#ifdef OBSOLETE_COMMAND_HELP
static const char *command_string( int i );
#endif
static void _adjust_spells(void);
static void _adjust_ability(void);
static void _list_wizard_commands();
static void show_keyhelp_menu(const std::vector<formatted_string> &lines,
bool with_manual, bool easy_exit = false,
int hotkey = 0)
static void _show_keyhelp_menu(const std::vector<formatted_string> &lines,
bool with_manual, bool easy_exit = false,
int hotkey = 0)