git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6716 c06c8d41-db1a-0410-9941-cceddc491573
IRGU5RNHZDY3OZJHDREJFPELSWGRGECFJN6F5KJBWKBIKIMFVFWQC J44YLLLSMPKEY3IXV3CPOM257PQZW45A4QWSSBYVFXS5T5XGQQWAC K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC 2YL37AGHLFOMIF3GCTVQGGV2RNNWETWM6ZMUHO3QEWDVBFFSFAKQC RISMOCQM6BKK4XSIRKYLOBB2UPDYJNDAL6OGIIR5GGNZQAK5YSZAC 3ZWALZFSTSIVYXY4BAY6ANGINTDACZC6RSSJTEMQSTSUIE66YOBQC 3ZUPHPFVGLZ6GPKZ4NSFUX5Z4FUQCE7NJX2EUNN2AXARWOXX7U7AC 7K5P2GRF6QUXTMERG2R3BB6DZFQYJQ6V2KNPMBPFDLOP36NQILPAC typedef std::string (*string_fn)();typedef std::map<std::string, string_fn> skill_op_map;static skill_op_map Skill_Op_Map;// The species for which the skill title is being worked out.static species_type Skill_Species = SP_UNKNOWN;struct skill_title_key_t {const char *key;string_fn op;skill_title_key_t(const char *k, string_fn o) : key(k), op(o){Skill_Op_Map[k] = o;}
{"Necromancy", "Grave Robber", "Reanimator", "Necromancer", "Thanatomancer", "%s of Death"},{"Translocations", "Grasshopper", "Placeless %s", "Blinker", "Portalist", "Plane %s"}, // 30{"Transmigration", "Changer", "Transmogrifier", "Alchemist", "Malleable", "Shapeless %s"},
{"Necromancy", "Grave Robber", "Reanimator", "Necromancer", "Thanatomancer", "@Genus_Short@ of Death"},{"Translocations", "Grasshopper", "Placeless @Genus@", "Blinker", "Portalist", "Plane @Walker@"}, // 30{"Transmigration", "Changer", "Transmogrifier", "Alchemist", "Malleable", "Shapeless @Genus@"},
}// [ds] @Genus@ distinguishes between Ogre-Mages and Ogres, but// @genus@ does not. This is rather confusing.static std::string _stk_genus_cap(){return species_name(Skill_Species, 1, true, false, false);}static std::string _stk_genus_nocap(){std::string s = species_name(Skill_Species, 1, true, false, true);return (lowercase(s));}static std::string _stk_genus_short_cap(){return (Skill_Species == SP_DEMIGOD ? "God" : _stk_genus_cap());}static std::string _stk_walker(){return (Skill_Species == SP_NAGA ? "Slider" :Skill_Species == SP_KENKU ? "Glider": "Walker");}static std::string _stk_weight(){switch (Skill_Species){case SP_OGRE:case SP_OGRE_MAGE:case SP_TROLL:return "Heavy";case SP_NAGA:case SP_CENTAUR:return "Cruiser";default:return "Middle";case SP_HIGH_ELF:case SP_GREY_ELF:case SP_DEEP_ELF:case SP_SLUDGE_ELF:case SP_KENKU:return "Little";case SP_HALFLING:case SP_GNOME:case SP_KOBOLD:return "Feather";case SP_SPRIGGAN:return "Fly";}}static skill_title_key_t _skill_title_keys[] = {stk("Genus", _stk_genus_cap),stk("genus", _stk_genus_nocap),stk("Genus_Short", _stk_genus_short_cap),stk("Walker", _stk_walker),stk("Weight", _stk_weight),};static std::string _replace_skill_keys(const std::string &text){std::string::size_type at = 0, last = 0;std::ostringstream res;while ((at = text.find('@', last)) != std::string::npos){res << text.substr(last, at - last);const std::string::size_type end = text.find('@', at + 1);if (end == std::string::npos)break;const std::string key = text.substr(at + 1, end - at - 1);const std::string value = stk::get(key);ASSERT(!value.empty());res << value;last = end + 1;}if (!last)return text;res << text.substr(last);return res.str();
where = result.find("%s");if (where != std::string::npos){if (best_skill == SK_UNARMED_COMBAT){std::string weightclass = "";switch (species){case SP_OGRE:case SP_OGRE_MAGE:case SP_TROLL:weightclass = "Heavy";break;case SP_NAGA:case SP_CENTAUR:weightclass = "Cruiser";break;default:weightclass = "Middle";break;case SP_HIGH_ELF:case SP_GREY_ELF:case SP_DEEP_ELF:case SP_SLUDGE_ELF:case SP_KENKU:weightclass = "Little";break;case SP_HALFLING:case SP_GNOME:case SP_KOBOLD:weightclass = "Feather";break;case SP_SPRIGGAN:weightclass = "Fly";break;}result.replace(where, 2, weightclass);}else if (best_skill == SK_TRANSLOCATIONS && skill_rank == 5){result.replace(where, 2, (species == SP_NAGA ? "Slider" :species == SP_KENKU ? "Glider": "Walker"));}else{const bool need_cap = (best_skill != SK_BOWS);const std::string sp =species_name(static_cast<species_type>(species), 0, true,need_cap);result.replace(where, 2, sp);}}