Mercurial > hg > early-roguelike
diff rogue4/extern.c @ 12:9535a08ddc39
Import Rogue 5.2 from the Roguelike Restoration Project (r1490)
author | edwarj4 |
---|---|
date | Sat, 24 Oct 2009 16:52:52 +0000 |
parents | |
children | 63b9fd7d70ce |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rogue4/extern.c Sat Oct 24 16:52:52 2009 +0000 @@ -0,0 +1,325 @@ +/* + * global variable initializaton + * + * @(#)extern.c 4.32 (Berkeley) 4/1/82 + * + * Rogue: Exploring the Dungeons of Doom + * Copyright (C) 1980, 1981, 1982 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 "rogue.h" + +bool after; /* True if we want after daemons */ +bool noscore; /* Was a wizard sometime */ +bool s_know[MAXSCROLLS]; /* Does he know what a scroll does */ +bool p_know[MAXPOTIONS]; /* Does he know what a potion does */ +bool r_know[MAXRINGS]; /* Does he know what a ring does */ +bool ws_know[MAXSTICKS]; /* Does he know what a stick does */ +bool amulet = FALSE; /* He found the amulet */ +bool askme = FALSE; /* Ask about unidentified things */ +bool door_stop = FALSE; /* Stop running when we pass a door */ +bool fight_flush = FALSE; /* True if toilet input */ +bool firstmove = FALSE; /* First move after setting door_stop */ +bool in_shell = FALSE; /* True if executing a shell */ +bool jump = FALSE; /* Show running as series of jumps */ +bool passgo = FALSE; /* Follow passages */ +bool playing = TRUE; /* True until he quits */ +bool running = FALSE; /* True if player is running */ +bool save_msg = TRUE; /* Remember last msg */ +bool slow_invent = FALSE; /* Inventory one line at a time */ +bool terse = FALSE; /* True if we should be short */ +#ifdef WIZARD +bool wizard = FALSE; /* True if allows wizard commands */ +#endif + +char take; /* Thing the rogue is taking */ +char prbuf[MAXSTR]; /* Buffer for sprintfs */ +char outbuf[BUFSIZ]; /* Output buffer for stdout */ +char runch; /* Direction player is running */ +char *s_names[MAXSCROLLS]; /* Names of the scrolls */ +const char *p_colors[MAXPOTIONS]; /* Colors of the potions */ +const char *r_stones[MAXRINGS]; /* Stone settings of the rings */ +const char *w_names[MAXWEAPONS + 1] = { /* Names of the various weapons */ + "mace", + "long sword", + "short bow", + "arrow", + "dagger", + "two handed sword", + "dart", + "crossbow", + "crossbow bolt", + "spear", + NULL /* fake entry for dragon's breath */ +}; +const char *a_names[MAXARMORS] = { /* Names of armor types */ + "leather armor", + "ring mail", + "studded leather armor", + "scale mail", + "chain mail", + "splint mail", + "banded mail", + "plate mail", +}; +const char *ws_made[MAXSTICKS]; /* What sticks are made of */ +char *release; /* Release number of rogue */ +char whoami[MAXSTR]; /* Name of player */ +char fruit[MAXSTR]; /* Favorite fruit */ +char huh[MAXSTR]; /* The last message printed */ +char *s_guess[MAXSCROLLS]; /* Players guess at what scroll is */ +char *p_guess[MAXPOTIONS]; /* Players guess at what potion is */ +char *r_guess[MAXRINGS]; /* Players guess at what ring is */ +char *ws_guess[MAXSTICKS]; /* Players guess at what wand is */ +char *ws_type[MAXSTICKS]; /* Is it a wand or a staff */ +char file_name[MAXSTR]; /* Save file name */ +char home[MAXSTR]; /* User's home directory */ +char _level[MAXLINES*MAXCOLS]; /* Level map */ +char _flags[MAXLINES*MAXCOLS]; /* Flags for each space on the map */ + +int max_level; /* Deepest player has gone */ +int ntraps; /* Number of traps on this level */ +int dnum; /* Dungeon number */ +int level = 1; /* What level rogue is on */ +int purse = 0; /* How much gold the rogue has */ +int mpos = 0; /* Where cursor is on top line */ +int no_move = 0; /* Number of turns held in place */ +int no_command = 0; /* Number of turns asleep */ +int inpack = 0; /* Number of things in pack */ +int total = 0; /* Total dynamic memory bytes */ +int lastscore = -1; /* Score before this turn */ +int no_food = 0; /* Number of levels without food */ +int count = 0; /* Number of times to repeat command */ +int fung_hit = 0; /* Number of time fungi has hit */ +int quiet = 0; /* Number of quiet turns */ +int food_left; /* Amount of food in hero's stomach */ +int group = 2; /* Current group number */ +int hungry_state = 0; /* How hungry is he */ +int fd; /* File descriptor for score file */ +int a_chances[MAXARMORS] = { /* Chance for each armor type */ + 20, + 35, + 50, + 63, + 75, + 85, + 95, + 100 +}; +int a_class[MAXARMORS] = { /* Armor class for each armor type */ + 8, + 7, + 7, + 6, + 5, + 4, + 4, + 3, +}; + +long seed; /* Random number seed */ + +coord oldpos; /* Position before last look() call */ +coord delta; /* Change indicated to get_dir() */ + +THING player; /* The rogue */ +THING *cur_armor; /* What a well dresssed rogue wears */ +THING *cur_weapon; /* Which weapon he is weilding */ +THING *cur_ring[2]; /* Which rings are being worn */ +THING *lvl_obj = NULL; /* List of objects on this level */ +THING *mlist = NULL; /* List of monsters on the level */ +THING *_monst[MAXLINES*MAXCOLS]; /* Pointers for monsters at each spot */ + +WINDOW *hw; /* Used as a scratch window */ + +#define INIT_STATS { 16, 0, 1, 10, 12, "1d4", 12 } + +struct stats max_stats = INIT_STATS; /* The maximum for the player */ + +struct room *oldrp; /* Roomin(&oldpos) */ +struct room rooms[MAXROOMS]; /* One for each room -- A level */ +struct room passages[MAXPASS] = /* One for each passage */ +{ + { {0, 0}, {0, 0}, {0, 0}, 0, ISGONE|ISDARK, 0, 0 }, + { {0, 0}, {0, 0}, {0, 0}, 0, ISGONE|ISDARK, 0, 0 }, + { {0, 0}, {0, 0}, {0, 0}, 0, ISGONE|ISDARK, 0, 0 }, + { {0, 0}, {0, 0}, {0, 0}, 0, ISGONE|ISDARK, 0, 0 }, + { {0, 0}, {0, 0}, {0, 0}, 0, ISGONE|ISDARK, 0, 0 }, + { {0, 0}, {0, 0}, {0, 0}, 0, ISGONE|ISDARK, 0, 0 }, + { {0, 0}, {0, 0}, {0, 0}, 0, ISGONE|ISDARK, 0, 0 }, + { {0, 0}, {0, 0}, {0, 0}, 0, ISGONE|ISDARK, 0, 0 }, + { {0, 0}, {0, 0}, {0, 0}, 0, ISGONE|ISDARK, 0, 0 }, + { {0, 0}, {0, 0}, {0, 0}, 0, ISGONE|ISDARK, 0, 0 }, + { {0, 0}, {0, 0}, {0, 0}, 0, ISGONE|ISDARK, 0, 0 }, + { {0, 0}, {0, 0}, {0, 0}, 0, ISGONE|ISDARK, 0, 0 } +}; + +#define ___ 1 +#define XX 10 +struct monster monsters[26] = +{ + /* Name CARRY FLAG str, exp, lvl, amr, hpt, dmg */ + { "giant ant", 0, ISMEAN, { XX, 9, 2, 3, ___, "1d6" } }, + { "bat", 0, 0, { XX, 1, 1, 3, ___, "1d2" } }, + { "centaur", 15, 0, { XX, 15, 4, 4, ___, "1d6/1d6" } }, + { "dragon", 100, ISMEAN, { XX,6800, 10, -1, ___, "1d8/1d8/3d10" } }, + { "floating eye",0, 0, { XX, 5, 1, 9, ___, "0d0" } }, + /* NOTE: the damage is %%% so that xstr won't merge this */ + /* string with others, since it is written on in the program */ + { "violet fungi",0, ISMEAN, { XX, 80, 8, 3, ___, "%%%d0" } }, + { "gnome", 10, 0, { XX, 7, 1, 5, ___, "1d6" } }, + { "hobgoblin", 0, ISMEAN, { XX, 3, 1, 5, ___, "1d8" } }, + { "invisible stalker",0,ISINVIS,{ XX,120, 8, 3, ___, "4d4" } }, + { "jackal", 0, ISMEAN, { XX, 2, 1, 7, ___, "1d2" } }, + { "kobold", 0, ISMEAN, { XX, 1, 1, 7, ___, "1d4" } }, + { "leprechaun", 0, 0, { XX, 10, 3, 8, ___, "1d1" } }, + { "mimic", 30, 0, { XX,100, 7, 7, ___, "3d4" } }, + { "nymph", 100, 0, { XX, 37, 3, 9, ___, "0d0" } }, + { "orc", 15, ISGREED,{ XX, 5, 1, 6, ___, "1d8" } }, + { "purple worm", 70, 0, { XX,4000, 15, 6, ___, "2d12/2d4" } }, + { "quasit", 30, ISMEAN, { XX, 32, 3, 2, ___, "1d2/1d2/1d4" } }, + { "rust monster",0, ISMEAN, { XX, 20, 5, 2, ___, "0d0/0d0" } }, + { "snake", 0, ISMEAN, { XX, 2, 1, 5, ___, "1d3" } }, + { "troll", 50, ISREGEN|ISMEAN,{ XX, 120, 6, 4, ___, "1d8/1d8/2d6" } }, + { "umber hulk", 40, ISMEAN, { XX,200, 8, 2, ___, "3d4/3d4/2d5" } }, + { "vampire", 20, ISREGEN|ISMEAN,{ XX,350, 8, 1, ___, "1d10" } }, + { "wraith", 0, 0, { XX, 55, 5, 4, ___, "1d6" } }, + { "xorn", 0, ISMEAN, { XX,190, 7, -2, ___, "1d3/1d3/1d3/4d6" } }, + { "yeti", 30, 0, { XX, 50, 4, 6, ___, "1d6/1d6" } }, + { "zombie", 0, ISMEAN, { XX, 6, 2, 8, ___, "1d8" } } +}; +#undef ___ +#undef XX + +struct magic_item things[NUMTHINGS] = { + { 0, 27 }, /* potion */ + { 0, 30 }, /* scroll */ + { 0, 17 }, /* food */ + { 0, 8 }, /* weapon */ + { 0, 8 }, /* armor */ + { 0, 5 }, /* ring */ + { 0, 5 }, /* stick */ +}; + +struct magic_item s_magic[MAXSCROLLS] = { + { "monster confusion", 8, 140 }, + { "magic mapping", 5, 150 }, + { "hold monster", 3, 180 }, + { "sleep", 5, 5 }, + { "enchant armor", 8, 160 }, + { "identify", 27, 100 }, + { "scare monster", 4, 200 }, + { "gold detection", 4, 50 }, + { "teleportation", 7, 165 }, + { "enchant weapon", 10, 150 }, + { "create monster", 5, 75 }, + { "remove curse", 8, 105 }, + { "aggravate monsters", 4, 20 }, + { "blank paper", 1, 5 }, + { "genocide", 1, 300 }, +}; + +struct magic_item p_magic[MAXPOTIONS] = { + { "confusion", 8, 5 }, + { "paralysis", 10, 5 }, + { "poison", 8, 5 }, + { "gain strength", 15, 150 }, + { "see invisible", 2, 100 }, + { "healing", 15, 130 }, + { "monster detection", 6, 130 }, + { "magic detection", 6, 105 }, + { "raise level", 2, 250 }, + { "extra healing", 5, 200 }, + { "haste self", 4, 190 }, + { "restore strength", 14, 130 }, + { "blindness", 4, 5 }, + { "thirst quenching", 1, 5 }, +}; + +struct magic_item r_magic[MAXRINGS] = { + { "protection", 9, 400 }, + { "add strength", 9, 400 }, + { "sustain strength", 5, 280 }, + { "searching", 10, 420 }, + { "see invisible", 10, 310 }, + { "adornment", 1, 10 }, + { "aggravate monster", 10, 10 }, + { "dexterity", 8, 440 }, + { "increase damage", 8, 400 }, + { "regeneration", 4, 460 }, + { "slow digestion", 9, 240 }, + { "teleportation", 5, 30 }, + { "stealth", 7, 470 }, + { "maintain armor", 5, 380 }, +}; + +struct magic_item ws_magic[MAXSTICKS] = { + { "light", 12, 250 }, + { "striking", 9, 75 }, + { "lightning", 3, 330 }, + { "fire", 3, 330 }, + { "cold", 3, 330 }, + { "polymorph", 15, 310 }, + { "magic missile", 10, 170 }, + { "haste monster", 9, 5 }, + { "slow monster", 11, 350 }, + { "drain life", 9, 300 }, + { "nothing", 1, 5 }, + { "teleport away", 5, 340 }, + { "teleport to", 5, 50 }, + { "cancellation", 5, 280 }, +}; + +struct h_list helpstr[] = { + '?', " prints help", + '/', " identify object", + 'h', " left", + 'j', " down", + 'k', " up", + 'l', " right", + 'y', " up & left", + 'u', " up & right", + 'b', " down & left", + 'n', " down & 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", + 't', "<dir> throw something", + 'f', "<dir> forward until find something", + 'z', "<dir> zap a wand in a direction", + '^', "<dir> identify trap type", + 's', " search for trap/secret door", + '>', " go down a staircase", + '<', " go up a staircase", + '.', " rest for a while", + 'i', " inventory", + 'I', " inventory single item", + 'q', " quaff potion", + 'r', " read paper", + 'e', " eat food", + 'w', " wield a weapon", + 'W', " wear armor", + 'T', " take armor off", + 'P', " put on ring", + 'R', " remove ring", + 'd', " drop object", + 'c', " call object", + 'D', " recall what's been discovered", + 'o', " examine/set options", + CTRL('L'), " redraw screen", + CTRL('R'), " repeat last message", + ESCAPE, " cancel command", + '!', " shell escape", + 'S', " save game", + 'Q', " quit", + 0, 0 +};