/* '/?' command shortcuts */ ---------------------------- if (!strncasecmp(buf, "prob", 4) || !strncasecmp(buf, "prb", 3)) { strcpy(init_search_string, "Troubleshooting"); strcpy(init_search_string, "PROBLEM "); /* Guild setting[s]/config/cfg/opt[s]/options -> /guild_cfg */ else if ((my_strcasestr(buf, "setting") || my_strcasestr(buf, "config") || my_strcasestr(buf, "cfg") || my_strcasestr(buf, "opt")) && my_strcasestr(buf, "guild")) { strcpy(init_search_string, "/GUILD_CFG"); /* Undo/reset -> /undoskills (which also mentions the new experimental way in The Mirror) */ else if (((my_strcasestr(buf, "undo") || my_strcasestr(buf, "reset")) && (my_strcasestr(buf, "skil") || my_strcasestr(buf, "spec"))) || !strcasecmp("undo", buf) || !strcasecmp("reset", buf) || !strcasecmp(buf, "respec") || !strcasecmp(buf, "respecc") || !strcasecmp(buf, "reskill") || !strcasecmp(buf, "reskil")) { strcpy(init_search_string, "/UNDOSKILLS"); /* Timeout/delet(e|ion)/eras(e|ure) -> character/account timeout */ else if (my_strcasestr(buf, "timeout") || my_strcasestr(buf, "time out") || ((my_strcasestr(buf, "delet") || my_strcasestr(buf, "eras")) && (my_strcasestr(buf, "char") || my_strcasestr(buf, "acc")))) { strcpy(init_search_string, "timeout"); /* 'form[s]' becomes "Druid Forms" chapter if we're a druid */ else if (((!strcasecmp(buf, "form") || !strcasecmp(buf, "forms")) && p_ptr->pclass == CLASS_DRUID)|| (my_strcasestr(buf, "form") && my_strcasestr(buf, "druid"))) { strcpy(init_search_string, "Druid forms"); /* race / class stats tables */ else if (my_strcasestr(buf, "race") && my_strcasestr(buf, "tab")) { strcpy(init_search_string, "Race STR"); else if (my_strcasestr(buf, "clas") && my_strcasestr(buf, "tab")) { strcpy(init_search_string, "Class STR"); /* Cloned from chapter search shortcuts */ else if ((my_strcasestr(buf, "race") || my_strcasestr(buf, "racial")) && (my_strcasestr(buf, "bonus") || my_strcasestr(buf, "boni") || my_strcasestr(buf, "malus") || my_strcasestr(buf, "mali") || my_strcasestr(buf, "tab"))) {//(table) strcpy(init_search_string, "Race STR"); /* Since there is nothing significant starting on 'table', actually accept this shortcut too */ else if (init_search_type == 3 && my_strcasestr("table", buf) && strlen(buf) >= 3) { strcpy(init_search_string, "Race STR"); else if (my_strcasestr(buf, "class") && (my_strcasestr(buf, "bonus") || my_strcasestr(buf, "boni") || my_strcasestr(buf, "malus") || my_strcasestr(buf, "mali") || my_strcasestr(buf, "tab"))) {//(table) strcpy(init_search_string, "Class STR"); else if (my_strcasestr(buf, "auto") && my_strcasestr(buf, "reincar")) strcpy(init_search_string, "reincarnation"); else if (!strcasecmp(buf, "go")) strcpy(init_search_string, "Go challenge"); /* Pft, inconsistency - basically, data uses 'color' while text uses 'colour'.. */ else if (init_search_type == 3 && !strcasecmp("color", init_search_string)) strcpy(init_search_string, "colour"); /* "(7.9) Parties, Iron Teams, Guilds" */ else if (!strcasecmp(buf, "team") || !strcasecmp(buf, "iron team") || !strcasecmp(buf, "ironteam")) strcpy(init_search_string, "teams"); else if (!strcasecmp(buf, "guild")) strcpy(init_search_string, "guilds"); else if (!strcasecmp(buf, "party")) strcpy(init_search_string, "parties"); else if (my_strcasestr(buf, "magical") && my_strcasestr(buf, "dev")) strcpy(init_search_string, "magic devices"); //NOT -> magic device (skill name) else if ((my_strcasestr(buf, "die") || my_strcasestr(buf, "dice")) && my_strcasestr(buf, "hp")) strcpy(init_search_string, "hp die"); else if (!strcasecmp(buf, "death") || !strcasecmp(buf, "dead")) strcpy(init_search_string, "Death, Ghosts"); //chapter (3.11) about when you died else if (!strcasecmp("rescue", buf)) strcpy(init_search_string, "Getting Help"); else if (!strcasecmp("mirror", buf)) strcpy(init_search_string, "The Mirror"); else if (my_strcasestr(buf, "shop") && my_strcasestr(buf, "serv")) strcpy(init_search_string, "services"); else if (!strcasecmp(buf, "stor") || !strcasecmp(buf, "store") || !strcasecmp(buf, "stores")) strcpy(init_search_string, "Shops"); else if (my_strcasestr(buf, "shop") && my_strcasestr(buf, "player")) strcpy(init_search_string, "Player stores"); else if (my_strcasestr(buf, "store") && my_strcasestr(buf, "player")) strcpy(init_search_string, "Player stores"); else if (!strcasecmp("rw", buf)) strcpy(init_search_string, "Nazgul"); else if (!strcasecmp(buf, "win") || !strcasecmp(buf, "winning") || !strcasecmp(buf, "winner")|| !strcasecmp(buf, "winners")) strcpy(init_search_string, "goal"); else if (!strcasecmp(buf, "king") || !strcasecmp(buf, "queen") || !strcasecmp(buf, "emperor")|| !strcasecmp(buf, "empress")) strcpy(init_search_string, "goal"); else if (!strcasecmp("OoD", buf)) strcpy(init_search_string, "OOD "); //uh hacky: avoid overlap with OOD_xx flag else if ((cp = my_strcasestr(buf, "town")) && (cp2 = my_strcasestr(buf, "dun")) && cp < cp2) strcpy(init_search_string, "town dungeons"); else if ((cp = my_strcasestr(buf, "town")) && (cp2 = my_strcasestr(buf, "dun")) && cp > cp2) strcpy(init_search_string, "IDDC");// dungeon towns else if (my_strcasestr(buf, "dun") && my_strcasestr(buf, "list")) strcpy(init_search_string, "Dungeon"); //which in turn gets expanded to "Dungeon " sth. instead of chapter "Dungeons" else if (my_strcasestr(buf, "death") && my_strcasestr(buf, "msg")) strcpy(init_search_string, "death messages"); else if (!strcasecmp("speed", buf)) strcpy(init_search_string, "time"); //for now redirect 'speed' to chapter about in-game time systems else if (!strcasecmp("city", buf)) strcpy(init_search_string, "town"); else if (!strcasecmp("cities", buf)) strcpy(init_search_string, "towns"); else if (!strcasecmp("dual wield", buf) || !strcasecmp("dual wielding", buf) || !strcasecmp("dual-wielding", buf)) strcpy(init_search_string, "dual-wield"); else if (!strcasecmp("spell power", buf) || !strcasecmp("spell pow", buf)) strcpy(init_search_string, "spell-power"); else if (!strcasecmp("crit", buf) || !strcasecmp("crits", buf) || !strcasecmp("critical", buf) || (my_strcasestr(buf, "crit") && (my_strcasestr(buf, "hit") || my_strcasestr(buf, "strike") || my_strcasestr(buf, "mon")))) { if (my_strcasestr(buf, "mon")) strcpy(init_search_string, "Critical hits by monsters"); //monster crits else strcpy(init_search_string, "critical-strike"); //player crits else if (my_strcasestr(buf, "tech") && my_strcasestr(buf, "lev")) strcpy(init_search_string, "Technique levels"); /* '/?' command or 'c' (chapter search) shortcuts */ ---------------------------------------------------- /* 'Troubleshooting' section, directly access it */ if (!strncasecmp(buf, "prob", 4) || !strncasecmp(buf, "prb", 3)) { if (!p) strcpy(buf, "Troubleshooting"); strcpy(buf, "PROBLEM "); if (!strcasecmp(buf, "about")) strcpy(buf, "introduction"); /* Expand 'AC' to 'Armour Class' */ if (!strcasecmp(buf, "ac")) strcpy(buf, "armour class"); else if (my_strcasestr(buf, "armo") && my_strcasestr(buf, "clas")) strcpy(buf, "armour class"); //translate armor class to armour class /* Expand 'tc' to 'Treasure Class' */ if (!strcasecmp(buf, "tc")) strcpy(buf, "treasure class"); /* Expand 'am' to 'Anti-Magic' */ if (!strcasecmp(buf, "am")) strcpy(buf, "anti-magic"); /* Bag/Bags redirect to 'Subinventory' */ if (!strcasecmp(buf, "bag") || !strcasecmp(buf, "bags") || my_strcasestr(buf, "container") || my_strcasestr(buf, "subinv") || my_strcasestr(buf, "sub-inv") || my_strcasestr(buf, "sub inv")) { strcpy(buf, "Subinventory:"); /* Expand 'Update' to 'Updating' */ if (!strcasecmp(buf, "update")) strcpy(buf, "updating"); if (my_strcasestr(buf, "auto") && !my_strcasestr(buf, "/auto") && my_strcasestr(buf, "ret")) strcpy(buf, "auto-ret"); //auto-retaliation, but not slash command /* Note: Class/race shortcuts such as hk, rm, mc, cp / ho, ht, he/he, de aren't feasible because they are already partially in use for other things or colliding. */ /* Melee weapon classes */ if (my_strcasestr(buf, "weap") && my_strcasestr(buf, "clas")) strcpy(buf, "weapon types"); else if (my_strcasestr(buf, "weap") && my_strcasestr(buf, "typ")) strcpy(buf, "weapon types"); /* ENABLE_DEMOLITIONIST */ if ((my_strcasestr("obtaining ", buf) && strlen(buf) >= 3) || my_strcasestr(buf, "chemic")) { strcpy(buf, "OBTAINING CHEMICALS/INGREDIENTS"); if ((my_strcasestr("charges", buf) && strlen(buf) >= 5 && !my_strcasestr(buf, "re")) || (my_strcasestr(buf, "reci") && !my_strcasestr(buf, "preci"))) { //recipes strcpy(buf, "CHARGE TYPE"); if (my_strcasestr(buf, "xp") && (my_strcasestr(buf, "table") || my_strcasestr(buf, "tabl") || my_strcasestr(buf, "tab"))) strcpy(buf, "Experience Points Table"); if (my_strcasestr(buf, "demo") && my_strcasestr(buf, "char")) strcpy(buf, "Demolition Charges"); /* Demolitionist perk */ if (!strncasecmp(buf, "demol", 5) && !my_strcasestr(buf, "char")) { /* don't overlook chapter 'Demolition Charges'! */ strcpy(buf, "DEMOLITIONIST"); if (my_strcasestr(buf, "load") && (my_strcasestr(buf, "trap") || my_strcasestr(buf, "kit"))) strcpy(buf, "Trap kit load"); else if (my_strcasestr(buf, "trap") && ((my_strcasestr(buf, "kit") && !my_strcasestr(buf, "bag")) || my_strcasestr(buf, "mon"))) { /* not 'trap kit bag'! */ strcpy(buf, "ABOUT TRAP KITS:"); } else if ((my_strcasestr(buf, "trap") || my_strcasestr(buf, "kit")) && my_strcasestr(buf, "bag")) { strcpy(buf, "Trap Kit Bag"); /* Race/class boni/mali table */ if ((my_strcasestr(buf, "race") || my_strcasestr(buf, "racial")) && (my_strcasestr(buf, "bonus") || my_strcasestr(buf, "boni") || my_strcasestr(buf, "malus") || my_strcasestr(buf, "mali") || my_strcasestr(buf, "tab"))) {//(table) //strcpy(buf, "boni/mali of the different races"); strcpy(buf, "Race STR"); /* Since there is nothing significant starting on 'table', actually accept this shortcut too */ if (my_strcasestr("table", buf) && strlen(buf) >= 3) { //strcpy(buf, "boni/mali of the different races"); strcpy(buf, "Race STR"); if (my_strcasestr(buf, "class") && (my_strcasestr(buf, "bonus") || my_strcasestr(buf, "boni") || my_strcasestr(buf, "malus") || my_strcasestr(buf, "mali") || my_strcasestr(buf, "tab"))) {//(table) //strcpy(buf, "boni/mali of the different classes"); strcpy(buf, "Class STR"); /* Expand 'pfe' to 'Protection from evil' */ if (!strcasecmp(buf, "pfe")) strcpy(buf, "Protection from evil"); /* Expand 'rll' to 'Restore Life Levels' and fall back to caps-search */ if (!strcasecmp(buf, "rll")) { strcpy(buf, "RESTORE LIFE LEVELS"); /* Expand 'wor' to 'Word of Recall' and fall back to caps-search */ if (!strcasecmp(buf, "wor")) { strcpy(buf, "WORD OF RECALL"); /* Note: 'rop' is already ring of power (slang paragraph) */ /* Slaying/Nothingness/Morgul weapons */ if (!strcasecmp("slaying", buf)) { strcpy(buf, "WEAPONS OF SLAYING"); if (!strcasecmp("nothing", buf)) { strcpy(buf, "WEAPONS OF NOTHINGNESS"); if (!strcasecmp("morgul", buf)) { strcpy(buf, "WEAPONS OF MORGUL"); /* Ethereal/magic/silver ammo */ if (my_strcasestr("amm", buf)) { if (my_strcasestr(buf, "mag")) { strcpy(buf, "MAGIC AMMUNITION"); } else if (my_strcasestr(buf, "sil")) { strcpy(buf, "SILVER AMMUNITION"); } else if (my_strcasestr(buf, "eth")) { strcpy(buf, "ETHEREAL AMMUNITION"); /* Maia initiation (could just chapter-search "init", but somehow this seems more intuitive..) */ if (!strncasecmp(buf, "enl", 3) && my_strcasestr("Enlightened:", buf)) { strcpy(buf, "ENLIGHTENED:"); if (!strncasecmp(buf, "cor", 3) && my_strcasestr("Corrupted:", buf)) { strcpy(buf, "CORRUPTED:"); /* Draconian traits */ if (!strncasecmp(buf, "trai", 4) && my_strcasestr("traits:", buf)) { strcpy(buf, "Table of their traits:"); /* Rogue 'Cloaking' ability has no dedicated paragraph, use key list for it */ if (!strcasecmp(buf, "cloak") || !strcasecmp(buf, "cloaking")) { strcpy(buf, "'cloaking mode'"); /* There is no Black Breath chapter but it is explained fully in the chapter containing Nazgul info */ if (my_strcasestr(buf, "black") == buf || !strcasecmp(buf, "bb")) strcpy(buf, "nazgul"); if (my_strcasestr(buf, "art") && my_strcasestr(buf, "cre")) strcpy(buf, "Artifact creation"); /* The chapter explaining 'stats' is actually titled 'Attributes' */ if (!strcasecmp(buf, "stats") || !strcasecmp(buf, "stat")) strcpy(buf, "Attributes"); /* Expand 'pxx' and 'Pxx' to 'PROBLEM xx' */ if ((buf[0] == 'p' || buf[0] == 'P') && buf[1] && buf[1] >= '0' && buf[1] <= '9') { sprintf(tmpbuf, "PROBLEM %d:", atoi(buf + 1)); /* Misc chapters, hardcoded: */ || !strcasecmp(buf, "tt")) { strcpy(chapter, "Bree "); || !strcasecmp(buf, "potd")) { strcpy(chapter, "Minas Anor "); if (my_strcasestr(buf, "Fate") || !strcasecmp(buf, "df")) { strcpy(chapter, "Death Fate "); if (my_strcasestr(buf, "Mandos") || my_strcasestr(buf, "Halls") || !strcasecmp(buf, "hom")) { strcpy(chapter, "The Halls of Mandos "); if ((my_strcasestr(buf, "Orc") && my_strcasestr(buf, "Cav")) || !strcasecmp(buf, "oc")) { strcpy(chapter, "The Orc Cave "); if (my_strcasestr(buf, "Mirk") || !strcasecmp(buf, "mw")) { strcpy(chapter, "Mirkwood "); if ((my_strcasestr(buf, "Old") && my_strcasestr(buf, "For")) || !strcasecmp(buf, "of")) { strcpy(chapter, "The Old Forest "); if (my_strcasestr(buf, "Helc") || !strcasecmp(buf, "hc")) { strcpy(chapter, "The Helcaraxe "); if (my_strcasestr(buf, "Sandw") || my_strcasestr(buf, "Lair") || !strcasecmp(buf, "swl") || !strcasecmp(buf, "sl")) { strcpy(chapter, "The Sandworm Lair "); if (my_strcasestr(buf, "Heart") || !strcasecmp(buf, "hote")) { strcpy(chapter, "The Heart of the Earth "); if (my_strcasestr(buf, "Maze")) { strcpy(chapter, "The Maze "); if (my_strcasestr(buf, "Ciri") || ((s = my_strcasestr(buf, "Ung")) && (s == buf || s[-1] == ' ') && !my_strcasestr(buf, "Ungoli")) || !strcasecmp(buf, "cu")) { //Ungoliant check is just paranoia, not a dungeon boss strcpy(chapter, "Cirith Ungol "); if (my_strcasestr(buf, "Rhun") || !strcasecmp(buf, "lor")) { strcpy(chapter, "The Land of Rhun "); if (my_strcasestr(buf, "Moria") || my_strcasestr(buf, "Mines") || !strcasecmp(buf, "mom")) { //was Mori, but collides with "memories" strcpy(chapter, "The Mines of Moria "); if (find >= 2 || my_strcasestr(buf, "SWC")) { strcpy(chapter, "The Small Water Cave "); if (my_strcasestr(buf, "Subm") || my_strcasestr(buf, "Ruin") || !strcasecmp(buf, "sr")) { strcpy(chapter, "Submerged Ruins "); if (my_strcasestr(buf, "Illu") || my_strcasestr(buf, "Cast") || !strcasecmp(buf, "ic")) { strcpy(chapter, "The Illusory Castle "); if (find >= 2 || !strcasecmp(buf, "slom")) { strcpy(chapter, "The Sacred Land of Mountains "); if (!strcasecmp(buf, "Dol") || my_strcasestr(buf, "Guld") || !strcasecmp(buf, "dg")) { strcpy(chapter, "Dol Guldur "); || !strcasecmp(buf, "mtd")) { //note: TSLoM has been filtered out before us already strcpy(chapter, "Mount Doom "); if ((my_strcasestr(buf, "Clou") && my_strcasestr(buf, "Pla")) || !strcasecmp(buf, "cp")) { strcpy(chapter, "The Cloud Planes "); if ((my_strcasestr(buf, "Neth") && my_strcasestr(buf, "Rea")) || !strcasecmp(buf, "nr")) { strcpy(chapter, "Nether Realm "); if (!strcasecmp(buf, "IDDC") || !strcasecmp(buf, "Ironman Deep Dive Challenge") || find >= 2) { strcpy(chapter, "Ironman Deep Dive Challenge (IDDC)"); if ((!strcasecmp(buf, "HT") || !strcasecmp(buf, "HL") || my_strcasestr(buf, "Highla") || my_strcasestr(buf, "Tourn")) || (my_strcasestr(buf, "Hi") && my_strcasestr(buf, "Tou"))) { strcpy(chapter, "Highlander Tournament"); if (!strcasecmp(buf, "AMC") || (my_strcasestr(buf, "Arena"))) {// && my_strcasestr("Challenge", buf))) { strcpy(chapter, "Arena Monster Challenge"); if (!strcasecmp(buf, "DK") || !strcasecmp(buf, "Dungeon Keeper") || my_strcasestr(buf, "Keeper") || (my_strcasestr(buf, "Dun") && my_strcasestr(buf, "Kee"))) { //sorry, Death Knights strcpy(chapter, "Dungeon Keeper"); if (!strcasecmp(buf, "XO") || !strcasecmp(buf, "Extermination Orders") strcpy(chapter, "Extermination orders"); if (!strcasecmp(buf, "Christmas") || !strcasecmp(buf, "xmas")) { strcpy(chapter, "Christmas"); if (my_strcasestr(buf, "nye") || find >= 2) { strcpy(chapter, "New year's eve"); if (!strcasecmp(buf, "ma")) { strcpy(chapter, ".Martial Arts"); if (!strcasecmp(buf, "Io") || my_strcasestr(buf, "orders") || (my_strcasestr(buf, "ord") && my_strcasestr(buf, "Item"))) { strcpy(buf, "Item orders"); /* Additions -- can override temp_priority[] (guide chapter prefix match) again. */ if (my_strcasestr(buf, "Line") && !(my_strcasestr(buf, "command") || my_strcasestr(buf, "cmd"))) { //draconian lineages strcpy(chapter, " Lineage"); if (my_strcasestr(buf, "Line") && (my_strcasestr(buf, "command") || my_strcasestr(buf, "cmd"))) { strcpy(buf, "WINDOWS COMMAND-LINE OPTIONS"); strcpy(buf, "POSIX COMMAND-LINE OPTIONS"); if (!strcasecmp(buf, "option") || !strcasecmp(buf, "options")) strcpy(buf, "Client options"); if (my_strcasestr(buf, "Depth")) { //min depth for exp in relation to char lv strcpy(chapter, " Character level"); if (my_strcasestr(buf, "Dung") && (my_strcasestr(buf, "typ") || my_strcasestr(buf, "Col"))) { //dungeon types/colours, same as staircases below strcpy(chapter, "Dungeon types"); if (my_strcasestr(buf, "Boss")) { //dungeon bosses strcpy(chapter, "Dungeon, sorted by depth"); } else if (my_strcasestr("Dungeons", buf) && strlen(buf) >= 3) { //dungeons strcpy(chapter, "Dungeon "); if (my_strcasestr(buf, "Stair") && !my_strcasestr(buf, "goi")) { //staircase types, same as 'Dungeon types' strcpy(chapter, "Dungeon types"); if (!strcasecmp(buf, "goi")) { //staircase types, same as 'Dungeon types' strcpy(buf, "GOI "); /* 'Item power inscription' */ if (!strcmp(buf, "@@") || !strcmp(buf, "@@@")) { strcpy(buf, "ITEM POWER INSCRIPTION"); if (!strcmp(searchstr, "GOI")) strcpy(searchstr, "GOI ");