/*
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 <curses.h>
#include <ctype.h>
#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', "<dir> 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', "<dir> Throw something" },
{ 'T', " Take off something" },
{ 'v', " Print program version" },
{ 'w', " Wield a weapon" },
{ 'W', " Wear something" },
{ 'X', " Sense for traps" },
{ 'z', "<dir> 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'), "<dir> 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);
}