/* help.c - Routines having to do with help XRogue: Expeditions into the Dungeons of Doom Copyright (C) 1991 Robert Pietkivitch All rights reserved. Based on "Advanced Rogue" Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T All rights reserved. Based on "Rogue: Exploring the Dungeons of Doom" Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman All rights reserved. See the file LICENSE.TXT for full copyright and licensing information. */ #include #include #include "mach_dep.h" #include "rogue.h" /* * Give character descripts */ static char *game_fighter = "Strength is the main attribute of the Fighter. \ He can wield any weapon and the two-handed sword is his weapon of choice. He \ can also wear any type of armor. Plate armor being the best choice and \ leather armor the worst. The Fighter is able to sense both traps and gold \ at higher experience levels. His natural quest item is the Axe of Aklad. \ Due to his superior form, the Fighter usually receives more hit-points per \ new experience level than the other characters. The Fighter is neither good \ or evil; he is a neutral character. The default attribute values of the \ Fighter are: Int=7, Str=16, Wis=7, Dxt=16, Con=17, and Chr=11. Default gold \ amount is 2000 pieces and default hit-points are 24."; static char *game_thief = "Dexterity is the main attribute of the Thief. His \ stealth allows him to move quietly, thus disturbing less monsters. He can \ sense traps and gold and can take (steal) things from the monsters. The \ Thief can not wield the two-handed sword so the bastard sword is his weapon \ of choice. He can only wear studded leather armor. The Thief's natural \ quest item is the Daggers of Musty Doit. With higher dexterity the Thief \ is able to \"backstab\" monsters, thereby killing them with a single blow. \ His character type fluctuates between that of good, neutral, and evil. The \ default attribute values of the Thief are: Int=7, Str=14, Wis=7, Dxt=18, \ Con=17, and Chr=11. Default gold amount is 2000 pieces and default \ hit-points are 23."; static char *game_assassin = "Dexterity is the main attribute of the \ Assassin. Like the Thief, he moves with an extra degree of stealth. He can \ sense gold and steal things from monsters. The ability to sense traps comes \ at higher experience levels. The Assassin can not wield the two-handed sword \ and he can only wear studded leather armor. The natural quest item of the \ Assassin is the Eye of Vecna. He is also skilled in the use of poison. \ Higher dexterity enables him to \"assassinate\" monsters with a single blow. \ The Assassin is aligned with the powers of evil. The default attribute \ values of the Assassin are: Int=7, Str=14, Wis=7, Dxt=18, Con=17, and \ Chr=11. Default gold amount is 2000 pieces and default hit-points are 23."; static char *game_ranger = "Charisma is the main attribute of the Ranger who \ also has a secondary attribute of Intelligence. Like the Magician, this \ gives him the ability to cast spells which increases as he attains higher \ experience levels. Like the Fighter, he can wield any weapon and wear any \ armor. The Ranger's natural quest item is the Mandolin of Brian. He is \ aligned with the powers of good. Therefore, he can be made to suffer and \ even become cursed by the very powers that allow him to cast spells if he \ happens to cause the demise of a likewise good creature. The default \ attribute values of the Ranger are: Int=11, Str=11, Wis=7, Dxt=16, Con=16, \ and Chr=13. Default gold amount is 2000 pieces and default hit-points \ are 22."; static char *game_paladin = "Charisma is the main attribute of the Paladin \ who has a secondary attribute of Wisdom. Like the Cleric, this gives him \ the ability to offer prayers, receive what his heart desires, and an ability \ to turn the undead. This ability will increase as he gains higher \ experience levels. Like the Fighter, he can wield any weapon and wear any \ armor. The Ankh of Heil is the Paladin's natural quest item. Like the \ Ranger, the Paladin is aligned with the powers of good. This can cause \ him to suffer and become cursed if he brings ruin to a likewise good \ creature. The default attribute values of the Paladin are: Int=7, \ Str=11, Wis=11, Dxt=16, Con=16, and Chr=13. Default gold amount is \ 2000 pieces and default hit-points are 22."; static char *game_druid = "Wisdom is the main attribute of the Druid. This \ gives him the ability to chant secret words and mantras, which is much \ greater than that of the Monk. The Druid can not wield the two-handed or \ bastard swords but he can wear any armor. His natural quest item is the Quill \ of Nagrom. Like the Magician and Cleric, the Druid is aligned neutral. He \ therefore, must rely upon his Wisdom and his chanting ability in order to \ remain alive. Likewise, he does not receive as many new hit-points per \ new experience level. The default attribute values of the Druid are: Int=7, \ Str=10, Wis=14, Dxt=16, Con=15, and Chr=12. Default gold amount is 2000 \ pieces and default hit-points are 21."; static char *game_monk = "Constitution is the main attribute of the Monk who \ has a secondary aspect of Wisdom. Like the Druid, this gives him the \ ability to chant mantras which will increase as he gains higher experience. \ The Monk can not wield the two-handed sword and he can not wear any armor. \ The Cloak of Emori is the Monk's natural quest item. The Monk can also \ sense traps, though much less than the Thief or Assassin. He is the most \ healthy character. Like the Ranger and Paladin, he is aligned with the \ powers of good. Therefore, he is made to suffer and can become cursed if \ he kills a likewise good creature. The default attribute values of the \ Monk are: Int=7, Str=11, Wis=11, Dxt=16, Con=18, and Chr=11. Default \ gold amount is 2000 pieces and default hit-points are 22."; static char *game_magician = "Intelligence is the main attribute of the \ Magician. The Magician's ability to cast spells is much greater than that \ of the Ranger. He can not wield the two- handed or bastard swords, but he \ can wear any kind of armor. His natural quest item is the Amulet of \ Stonebones. The Magician is aligned neutral. He must rely upon his \ Intelligence and spell casting abilities to remain alive. There- fore, he \ does not receive as many new hit-points per new experience level. The \ default attribute values of the Magician are: Int=14, Str=10, Wis=7, \ Dxt=16, Con=15, and Chr=12. Default gold amount is 2000 pieces and \ default hit-points are 21."; static char *game_cleric = "Wisdom is the main attribute of the Cleric. The \ Cleric's ability to give or offer prayers, receive their due, and affect \ the undead are much greater than that of the Paladin. Like the Magician, \ the Cleric can not wield the two- handed or bastard swords, but he can \ wear any armor. His natural quest item is the Horn of Geryon. The Cleric \ is aligned neutral and he must rely upon his Wisdom and prayer ability to \ remain alive. He therefore, does not receive as many new hit-points per \ new experience level. The default attribute values of the Cleric are: Int=7, \ Str=10, Wis=14, Dxt=16, Con=15, and Chr=12. The default gold amount is 2000 \ pieces and default hit-points are 21."; static char *game_food ="There are three types of food, regular food rations, \ various fruits, and slime- molds. Eating regular food will add 750 points to \ your current food level [see the CTRL(E) command]. Eating fruit adds \ 300 points. Certain fruits also cure you, add an attribute point, add a \ hit-point, increase your armor, give you additional prayer, chant, or spell \ casting abilities, or add experience points. Eating slime-mold (monster \ food) can make you ill, but they will add 100 points to your current food \ level. If your food level points drop below 100 you will become weak. You \ will faint and might die if they drop to 0 or below. At the other extreme, \ if your food level points reach 2000 (and above) you will become satiated. \ Risk eating more and you could choke to death."; /* static char *game_monst ="To be updated."; static char *game_potion ="To be updated..."; static char *game_scroll ="To be updated..."; static char *game_ring ="To be updated..."; static char *game_stick ="To be updated..."; static char *game_weapon ="To be updated..."; static char *game_armor ="To be updated..."; static char *game_miscm ="To be updated..."; static char *game_qitems ="To be updated..."; static char *game_dungeon ="To be updated..."; static char *game_traps ="To be updated..."; static char *game_mazes ="To be updated..."; static char *game_option ="To be updated..."; static char *game_begin ="To be updated..."; */ /* help list */ static struct h_list helpstr[] = { { '?', " Print help" }, { '/', " Identify object" }, { '=', " Identify a screen character" }, { ' ', "" }, { 'h', " Move left" }, { 'j', " Move down" }, { 'k', " Move up" }, { 'l', " Move right" }, { 'y', " Move up and left" }, { 'u', " Move up and right" }, { 'b', " Move down and left" }, { 'n', " Move down and right" }, { 'H', " Run left" }, { 'J', " Run down" }, { 'K', " Run up" }, { 'L', " Run right" }, { 'Y', " Run up & left" }, { 'U', " Run up & right" }, { 'B', " Run down & left" }, { 'N', " Run down & right" }, { ' ', "" }, { '>', " Go down a staircase" }, { '<', " Go up a staircase" }, { '\\', " Game descriptions" }, { '.', " Rest for a while" }, { '*', " Count gold pieces" }, { 'a', " Affect the undead" }, { 'A', " Choose artifact (equipage)" }, { 'c', " Chant a mantra" }, { 'C', " Cast a spell" }, { 'd', " Drop something" }, { 'D', " Dip something (into a pool)" }, { 'e', " Eat food or fruit" }, { 'f', " Forward until find something" }, { 'F', " Frighten a monster" }, { 'g', " Give food to monster" }, { 'G', " Sense for gold" }, { 'i', " Inventory" }, { 'I', " Inventory (single item)" }, { 'm', " Mark an object (specific)" }, { 'o', " Examine and/or set options" }, { 'O', " Character type and quest item" }, { 'p', " Pray to the powers that be" }, { 'P', " Pick up object(s)" }, { 'q', " Quaff a potion" }, { 'Q', " Quit the game" }, { 'r', " Read a scroll" }, { 's', " Search for a trap/secret door" }, { 'S', " Save your game" }, { 't', " Throw something" }, { 'T', " Take off something" }, { 'v', " Print program version" }, { 'w', " Wield a weapon" }, { 'W', " Wear something" }, { 'X', " Sense for traps" }, { 'z', " Zap a wand or staff" }, { ' ', "" }, { '^', " Set a trap" }, { '$', " Price an item (trading post)" }, { '#', " Buy an item (trading post)" }, { '%', " Sell an item (trading post)" }, { '!', " Shell escape" }, { ESC, " Cancel command (Esc)" }, { ' ', "" }, { CTRL('B'), " Current score (if you win)" }, { CTRL('E'), " Current food level" }, { CTRL('L'), " Redraw the screen" }, { CTRL('N'), " Name an object or a monster" }, { CTRL('O'), " Character affect status" }, { CTRL('R'), " Repeat last message" }, { CTRL('T'), " Take (steal) from (direction)" }, { CTRL('U'), " Use a magic item" }, { 0, "" } } ; /* wizard help list */ static struct h_list wiz_help[] = { { ' ', "" }, { '+', " Random fortunes" }, { 'M', " Make an object" }, { 'V', " Display vlevel and turns" }, { CTRL('A'), " System activity" }, { CTRL('C'), " Move to another dungeon level" }, { CTRL('D'), " Go down 1 dungeon level" }, { CTRL('F'), " Display the entire level" }, { CTRL('G'), " Charge wands and staffs" }, { CTRL('H'), " Jump 9 experience levels" }, { CTRL('I'), " Inventory of level" }, { CTRL('J'), " Teleport somewhere" }, { CTRL('K'), " Identify an object" }, { CTRL('M'), " Recharge wand or staff" }, { CTRL('P'), " Toggle wizard status" }, { CTRL('X'), " Detect monsters" }, { CTRL('Y'), " Display food levels" }, { 0, "" } }; /* item help list */ static struct item_list item_help[] = { { '@', " You (visible)" }, { '_', " You (invisible)" }, { ' ', "" }, { ':', " Food ration or fruit (eat)" }, { '!', " Potion (quaff)" }, { '?', " Scroll (read)" }, { '=', " Ring (wear)" }, { ')', " Weapon (wield)" }, { ']', " Armor (wear)" }, { '/', " Wand or staff (zap)" }, { ';', " Magic item (use)" }, { ',', " Artifact (quest item)" }, { '*', " Gold or zapped missile" }, { ' ', "" }, { '$', " Magical item in room" }, { '>', " Blessed magical item" }, { '<', " Cursed magical item" }, { ' ', " " }, { '`', " Dart trap" }, { '{', " Arrow trap" }, { '}', " Bear trap" }, { '~', " Teleport trap" }, { '$', " Sleeping gas trap" }, { '>', " Trap door" }, { '<', " Outer region entrance" }, { '\'', " Maze entrance" }, { '^', " Trading post entrance" }, { '"', " Magic pool or lake" }, { ' ', " Solid rock or mountain" }, { '.', " Floor of a room or meadow" }, { '%', " Stairs (up or down)" }, { '+', " Doorway" }, { '&', " Secret doorway" }, { '#', " Passage between rooms" }, { '\\', " Forest" }, { HORZWALL, " Horizontal wall of a room" }, { VERTWALL, " Vertical wall of a room" }, { 0, "" } }; void ident_hero(void) { bool doit = TRUE; wclear(hw); wprintw(hw, "Characters, Items, and Game Descriptions:\n"); wprintw(hw, "-----------------------------------------\n"); wprintw(hw, "a) Fighter m) Scrolls\n"); wprintw(hw, "b) Thief n) Rings\n"); wprintw(hw, "c) Assassin o) Wands and Staffs\n"); wprintw(hw, "d) Ranger p) Weapons\n"); wprintw(hw, "e) Paladin q) Armors\n"); wprintw(hw, "f) Monk r) Miscellaneous Magic Items\n"); wprintw(hw, "g) Magician s) Quest Items (Artifacts and Relics)\n"); wprintw(hw, "h) Cleric t) The Dungeon\n"); wprintw(hw, "i) Druid u) Traps\n"); wprintw(hw, "j) Monsters v) Mazes and Outer Regions\n"); wprintw(hw, "k) Foods w) Setting game options\n"); wprintw(hw, "l) Potions x) Starting out\n"); wprintw(hw, "\nEnter a letter: "); draw(hw); while (doit) { switch (wgetch(cw)) { case EOF: case ESC: doit = FALSE; when 'a': wclear(hw); wprintw(hw, "Fighter Characteristics:"); mvwaddstr(hw, 2, 0, game_fighter); draw(hw); doit = FALSE; when 'b': wclear(hw); wprintw(hw, "Thief Characteristics:"); mvwaddstr(hw, 2, 0, game_thief); draw(hw); doit = FALSE; when 'c': wclear(hw); wprintw(hw, "Assassin Characteristics:"); mvwaddstr(hw, 2, 0, game_assassin); draw(hw); doit = FALSE; when 'd': wclear(hw); wprintw(hw, "Ranger Characteristics:"); mvwaddstr(hw, 2, 0, game_ranger); draw(hw); doit = FALSE; when 'e': wclear(hw); wprintw(hw, "Paladin Characteristics:"); mvwaddstr(hw, 2, 0, game_paladin); draw(hw); doit = FALSE; when 'f': wclear(hw); wprintw(hw, "Monk Characteristics:"); mvwaddstr(hw, 2, 0, game_monk); draw(hw); doit = FALSE; when 'g': wclear(hw); wprintw(hw, "Magician Characteristics:"); mvwaddstr(hw, 2, 0, game_magician); draw(hw); doit = FALSE; when 'h': wclear(hw); wprintw(hw, "Cleric Characteristics:"); mvwaddstr(hw, 2, 0, game_cleric); draw(hw); doit = FALSE; when 'i': wclear(hw); wprintw(hw, "Druid Characteristics:"); mvwaddstr(hw, 2, 0, game_druid); draw(hw); doit = FALSE; when 'j': wclear(hw); wprintw(hw, "Monster Characteristics:"); draw(hw); doit = FALSE; when 'k': wclear(hw); wprintw(hw, "Foods:"); mvwaddstr(hw, 2, 0, game_food); draw(hw); doit = FALSE; when 'l': wclear(hw); wprintw(hw, "Potions:"); draw(hw); doit = FALSE; when 'm': wclear(hw); wprintw(hw, "Scrolls:"); draw(hw); doit = FALSE; when 'n': wclear(hw); wprintw(hw, "Rings:"); draw(hw); doit = FALSE; when 'o': wclear(hw); wprintw(hw, "Wands and Staffs:"); draw(hw); doit = FALSE; when 'p': wclear(hw); wprintw(hw, "Weapons:"); draw(hw); doit = FALSE; when 'q': wclear(hw); wprintw(hw, "Armors:"); draw(hw); doit = FALSE; when 'r': wclear(hw); wprintw(hw, "Miscellaneous Magic Items:"); draw(hw); doit = FALSE; when 's': wclear(hw); wprintw(hw, "Quest Items (Artifacts and Relics):"); draw(hw); doit = FALSE; when 't': wclear(hw); wprintw(hw, "The Dungeon:"); draw(hw); doit = FALSE; when 'u': wclear(hw); wprintw(hw, "Traps:"); draw(hw); doit = FALSE; when 'v': wclear(hw); wprintw(hw, "Mazes and Outer Regions:"); draw(hw); doit = FALSE; when 'w': wclear(hw); wprintw(hw, "Setting game options:"); draw(hw); doit = FALSE; when 'x': wclear(hw); wprintw(hw, "Starting out:"); draw(hw); doit = FALSE; otherwise: doit = TRUE; } } wmove(hw, lines-1, 0); wprintw(hw, spacemsg); draw(hw); wait_for(' '); wclear(hw); draw(hw); wmove(cw, 0, 0); wclrtoeol(cw); status(FALSE); touchwin(cw); } /* * Real Help */ void help(void) { register struct h_list *strp = helpstr; register struct item_list *itemp = item_help; struct h_list *wizp = wiz_help; register char helpch; register int cnt; msg("Character you want help for (* for commands, @ for items): "); helpch = wgetch(cw); mpos = 0; /* * If it's not a *, @, or +, then just print help string * for the character entered. */ if (helpch != '*' && helpch != '@' && helpch != '+') { wmove(msgw, 0, 0); while (strp->h_ch) { if (strp->h_ch == helpch) { msg("%s%s", unctrl(strp->h_ch), strp->h_desc); return; } strp++; } if (wizard) { while (wizp->h_ch) { if (wizp->h_ch == helpch) { msg("%s%s", unctrl(wizp->h_ch), wizp->h_desc); return; } wizp++; } } msg("Unknown command '%s'", unctrl(helpch)); return; } /* fortunes - but let's not say so - explicitly */ if (helpch == '+') { msg("Meaningless command '+'"); return; } /* * Print help for everything else */ if (helpch == '*') { wclear(hw); cnt = 0; while (strp->h_ch) { mvwaddstr(hw, cnt % 23, cnt > 22 ? 40 : 0, unctrl(strp->h_ch)); waddstr(hw, strp->h_desc); strp++; if (++cnt >= 46 && strp->h_ch) { wmove(hw, lines-1, 0); wprintw(hw, morestr); draw(hw); wait_for(' '); wclear(hw); cnt = 0; } } if (wizard) { while (wizp->h_ch) { mvwaddstr(hw, cnt % 23, cnt > 22 ? 40 : 0, unctrl(wizp->h_ch)); waddstr(hw, wizp->h_desc); wizp++; if (++cnt >= 46 && wizp->h_ch) { wmove(hw, lines-1, 0); wprintw(hw, morestr); draw(hw); wait_for(' '); wclear(hw); cnt = 0; } } } } if (helpch == '@') { wclear(hw); cnt = 0; while (itemp->item_ch) { mvwaddstr(hw, cnt % 23, cnt > 22 ? 40 : 0, unctrl(itemp->item_ch)); waddstr(hw, itemp->item_desc); itemp++; if (++cnt >= 46 && itemp->item_ch) { wmove(hw, lines-1, 0); wprintw(hw, morestr); draw(hw); wait_for(' '); wclear(hw); cnt = 0; } } } wmove(hw, lines-1, 0); wprintw(hw, spacemsg); draw(hw); wait_for(' '); wclear(hw); draw(hw); wmove(cw, 0, 0); wclrtoeol(cw); status(FALSE); touchwin(cw); } /* * identify: * Tell the player what a certain thing is. */ void identify(unsigned char ch) { register char *str = NULL; if (ch == 0) { msg("What do you want identified? "); ch = wgetch(cw); mpos = 0; if (ch == ESC) { msg(""); return; } } if (isalpha(ch)) msg("Use the \"=\" command to identify monsters. "); else switch(ch) { case VPLAYER: str = "You (visibly)"; when IPLAYER: str = "You (invisibly)"; when GOLD: str = "Gold"; when STAIRS: str = (levtype == OUTSIDE) ? "Entrance to the dungeon" : "Stairway"; when DOOR: str = "Doorway"; when SECRETDOOR:str = "Secret door"; when FLOOR: str = (levtype == OUTSIDE) ? "Meadow" : "Room floor"; when PASSAGE: str = "Passage"; when VERTWALL: case HORZWALL: str = (levtype == OUTSIDE) ? "Boundary of sector" : "Wall of a room"; when POST: str = "Trading post"; when POOL: str = (levtype == OUTSIDE) ? "Lake" : "A shimmering pool"; when TRAPDOOR: str = "Trap door"; when ARROWTRAP: str = "Arrow trap"; when SLEEPTRAP: str = "Sleeping gas trap"; when BEARTRAP: str = "Bear trap"; when TELTRAP: str = "Teleport trap"; when DARTTRAP: str = "Dart trap"; when MAZETRAP: str = "Entrance to a maze"; when WORMHOLE: str = "Entrance to a worm hole"; when FOREST: str = "Forest"; when ' ' : str = (levtype == OUTSIDE) ? "Mountain" : "Solid rock"; when FOOD: str = "Food"; when POTION: str = "Potion"; when SCROLL: str = "Scroll"; when RING: str = "Ring"; when WEAPON: str = "Weapon"; when ARMOR: str = "Armor"; when MM: str = "Miscellaneous magic"; when STICK: str = "Wand or staff"; when RELIC: str = "Artifact"; otherwise: str = "Unknown character"; } if (!isalpha(ch)) msg("%s %s", unctrl(ch), str); }