git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@3331 c06c8d41-db1a-0410-9941-cceddc491573
YH23OR26YDA6C5K74QRWHROMTPGRNZHTHE4HJGPC3JVNAJ62CHGAC S7WNIRQ2K5A4BAFCEOXS5F6BMXYZM2R2Y2PW7MA5XSM6AUVW36SQC RBAGQ2PB7V5YAM5KSHSZR2E3MLKDSRVM5XYGI2TIXP5QMVBOQHDQC BFYHDL4EHSPKKC6EPKDRPESHYAA2WFKC6RXQIRRTSSTF3Z2QPVCAC K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC PGTE3JC4J5U536IJTCJFXTUOSRE73JXZJINWAGCANOQOCGC7J6AAC SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC 2PAHDAPDO6PN4FNGB5N7CQNEGHSE3NOGPXYZMIAOJC4VW34FRVOAC 2N5AKUYV6EUUT254C47WSHZKD7FGN65JKJ3RCKSDP74XJIHIFMDQC BK6MGPSEAEMU4URBAPKY3VTKK6JC6IZVN5CNOSN2UPTIOWQYEWLQC WNQLH6VJ5DIPNQJUSUQBEKGNOZYCVWU5BYP4W6WQZBRMSR7GLUUQC AYYQVALBAAKFK5U52WGHWE2N7LCVZM3BGRADPVJQWOFLS2TXK6QAC JQFQX7IWSJ4TYWVUVXAFMCPSAN67PRMNECDQI5WMON2JFMQVVUEQC 4XGOVPFCU6KZIYHKWCHUTZY6G5S326DKBG3UREPR34Q4TSDD3TAAC RCU52DRCPWJVQ6HME4QR6V6EVQWTBKZTPWDI47UGUDAUBPOO5YNAC ZIFFVCQ72K35WGIUMZYN3KOXIUXF2CNXWKG6ZWEZ6LT3NSF3XOQAC NXVPOFYKJFWQWKVPQUMWH2Y2KJEZX44BUOBFJ4JD4KFGPEGYHG4QC VNSBAPL2FZNOR2R2NIJQITPHLQCMUE53U54GAENUSIN4526NHCPAC M47QBURKKRV2JFK6U7GQNVWK7RUTBVPBJ5FHURC55SKQSXAUFSBAC IIN7AVA6JYRBXH6ZYRR7BY7TV6PW7ANAQ2A3PD55FKBKKQFEEF2AC 25CH7HH4LKXFIZ75YNMXS3TSXO6O27DYSOPLOD45K4OCNFWLS4LQC for (int i = 0; i < NUM_MONSTER_SPELL_SLOTS; i++)mprf( MSGCH_DIAGNOSTICS, "Spell #%d: %d (%s)",i, spells[i], spell_title(spells[i]) );
// Only for ghosts, too spammy to use for all monsters.if (book == MST_GHOST){for (int i = 0; i < NUM_MONSTER_SPELL_SLOTS; i++)mprf( MSGCH_DIAGNOSTICS, "Spell #%d: %d (%s)",i, spells[i], spell_title(spells[i]) );}
// Initializes a Menu from a formatted_string as follows://// 1) Splits the formatted_string on EOL (this is not necessarily \n).// 2) Picks the most recently used non-whitespace colour as the colour// for the next line (so it can't do multiple colours on one line).// 3) Ignores all cursor movement ops in the formatted_string.//// These are limitations that should be fixed eventually.//Menu( const formatted_string &fs );
: f_selitem(NULL),f_drawitem(NULL),f_keyfilter(NULL),title(NULL),flags(_flags),tag(tagname),first_entry(0),y_offset(0),pagesize(0),max_pagesize(0),more("-more-", true),items(),sel(),select_filter(),highlighter(new MenuHighlighter),num(-1),lastch(0),alive(false),last_selected(-1)
: f_selitem(NULL), f_drawitem(NULL), f_keyfilter(NULL), title(NULL),flags(_flags), tag(tagname), first_entry(0), y_offset(0),pagesize(0), max_pagesize(0), more("-more-", true), items(),sel(), select_filter(), highlighter(new MenuHighlighter), num(-1),lastch(0), alive(false), last_selected(-1)
}Menu::Menu( const formatted_string &fs ): f_selitem(NULL), f_drawitem(NULL), f_keyfilter(NULL), title(NULL),// This is a text-viewer menu, init flags to be easy on the user.flags(MF_NOSELECT | MF_EASY_EXIT),tag(), first_entry(0), y_offset(0), pagesize(0),max_pagesize(0), more("-more-", true), items(), sel(),select_filter(), highlighter(new MenuHighlighter), num(-1),lastch(0), alive(false), last_selected(-1){int colour = LIGHTGREY;int last_text_colour = LIGHTGREY;std::string line;for (formatted_string::oplist::const_iterator i = fs.ops.begin();i != fs.ops.end(); ++i){const formatted_string::fs_op &op(*i);switch (op.type){case FSOP_COLOUR:colour = op.x;break;case FSOP_TEXT:line += op.text;if (op.text.find_first_not_of(" \t\r\n") != std::string::npos)last_text_colour = colour;check_add_formatted_line(last_text_colour, line, true);break;default:break;}}check_add_formatted_line(colour, line, false);
if (check_eol && line.find(EOL) == std::string::npos)return;std::vector<std::string> lines = split_string(EOL, line, false, true);int size = lines.size();// If we have stuff after EOL, leave that in the line variable and// don't add an entry for it, unless the caller told us not to// check EOL sanity.if (check_eol && !ends_with(line, EOL))line = lines[--size];elseline.clear();for (int i = 0; i < size; ++i){std::string &s(lines[i]);trim_string_right(s);MenuEntry *me = new MenuEntry(s);me->colour = col;if (!title)set_title(me);elseadd_entry(me);}line.clear();}
}// to highlight species in aptitudes list ('?%')static std::string get_species_key(){if (player_genus(GENPC_DRACONIAN) && you.experience_level < 7)return "";std::string result = "";switch (you.species){case SP_RED_DRACONIAN: result = "Red"; break;case SP_WHITE_DRACONIAN: result = "White"; break;case SP_GREEN_DRACONIAN: result = "Green"; break;case SP_GOLDEN_DRACONIAN: result = "Yellow"; break;case SP_GREY_DRACONIAN: result = "Grey"; break;case SP_BLACK_DRACONIAN: result = "Black"; break;case SP_PURPLE_DRACONIAN: result = "Purple"; break;case SP_MOTTLED_DRACONIAN: result = "Mottled"; break;case SP_PALE_DRACONIAN: result = "Pale"; break;default:result = species_name(you.species, 1);}result += " ";return (result);
// Parses a formatted string in much the same way as parse_string, but// handles EOL by moving the cursor down to the next line instead of// using a literal EOL. This is important if the text is not supposed// to clobber existing text to the right of the lines being displayed// (some of the tutorial messages need this).//
}///////////////////////////////////////////////////////////////////////////// Manual menu highlighter.class help_highlighter : public MenuHighlighter{public:help_highlighter();int entry_colour(const MenuEntry *entry) const;private:text_pattern pattern;std::string get_species_key() const;};help_highlighter::help_highlighter(): pattern(get_species_key()){}int help_highlighter::entry_colour(const MenuEntry *entry) const{return !pattern.empty() && pattern.matches(entry->text)? WHITE : -1;}// to highlight species in aptitudes list ('?%')std::string help_highlighter::get_species_key() const{if (player_genus(GENPC_DRACONIAN) && you.experience_level < 7)return "";std::string result = species_name(you.species, you.experience_level);if (player_genus(GENPC_DRACONIAN))strip_tag(result,species_name(you.species, you.experience_level, true));result += " ";return (result);