Mercurial > hg > early-roguelike
diff srogue/global.c @ 36:2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
author | elwin |
---|---|
date | Thu, 25 Nov 2010 12:21:41 +0000 |
parents | |
children | 34d7a614855e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srogue/global.c Thu Nov 25 12:21:41 2010 +0000 @@ -0,0 +1,446 @@ +/* + * global variable declaration + * + * @(#)global.c 9.0 (rdk) 7/17/84 + * + * Super-Rogue + * Copyright (C) 1984 Robert D. Kindelberger + * 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 "rogue.h" + +struct room rooms[MAXROOMS]; /* One for each room -- A level */ +struct room *oldrp; /* Roomin(&oldpos) */ +struct linked_list *mlist = NULL; /* monsters on this level */ +struct thing player; /* The rogue */ +struct stats max_stats; /* The maximum for the player */ +struct linked_list *lvl_obj = NULL; /* objects on this level */ +struct object *cur_weapon = NULL; /* Which weapon he is weilding */ +struct object *cur_armor = NULL; /* the rogue's armor */ +struct object *cur_ring[2]; /* Which rings are being worn */ +struct stats *him; /* pointer to hero stats */ +struct trap traps[MAXTRAPS]; /* traps on this level */ + +int playuid; /* uid of current player */ +int playgid; /* gid of current player */ +int level = 1; /* What level rogue is on */ +int levcount = 0; /* # of active mons this level */ +int levtype = NORMLEV; /* type of level this is, maze, etc. */ +int trader = 0; /* no. of purchases */ +int curprice = -1; /* current price of item */ +int purse = 0; /* How much gold the rogue has */ +int mpos = 0; /* Where cursor is on top line */ +int ntraps; /* # of traps on this level */ +int packvol = 0; /* volume of things in pack */ +int total = 0; /* Total dynamic memory bytes */ +int demoncnt = 0; /* number of active daemons */ +int lastscore = -1; /* Score before this turn */ +int no_food = 0; /* # of levels without food */ +int seed; /* Random number seed */ +int dnum; /* Dungeon number */ +int count = 0; /* # of times to repeat cmd */ +int fung_hit = 0; /* # of time fungi has hit */ +int quiet = 0; /* # of quiet turns */ +int max_level = 1; /* Deepest player has gone */ +int food_left = HUNGERTIME; /* Amount of food stomach */ +int group = NEWGROUP; /* Current group number */ +int hungry_state = F_OKAY; /* How hungry is he */ +int foodlev = 1; /* how fast he eats food */ +int ringfood = 0; /* rings affect on food consumption */ +char take; /* Thing the rogue is taking */ +char runch; /* Direction player is running */ +char curpurch[15]; /* name of item ready to buy */ + +char prbuf[LINLEN]; /* Buffer for sprintfs */ +char whoami[LINLEN]; /* Name of player */ +char fruit[LINLEN]; /* Favorite fruit */ +char huh[LINLEN]; /* The last message printed */ +char file_name[LINLEN]; /* Save file name */ +char scorefile[LINLEN]; /* place for scorefile */ +char home[LINLEN]; /* User's home directory */ +char outbuf[BUFSIZ]; /* Output buffer for stdout */ + +char *s_guess[MAXSCROLLS]; /* his guess at what scroll is */ +char *p_guess[MAXPOTIONS]; /* his guess at what potion is */ +char *r_guess[MAXRINGS]; /* his guess at what ring is */ +char *ws_guess[MAXSTICKS]; /* his guess at what wand is */ + +bool isfight = FALSE; /* true if player is fighting */ +bool nlmove = FALSE; /* true when transported to new level */ +bool inpool = FALSE; /* true if hero standing in pool */ +bool inwhgt = FALSE; /* true if from wghtchk() */ +bool running = FALSE; /* True if player is running */ +bool playing = TRUE; /* True until he quits */ +bool wizard = FALSE; /* True if he is a wizard */ +bool after = TRUE; /* True if we want after daemons */ +bool door_stop = FALSE; /* Stop run when we pass a door */ +bool firstmove = FALSE; /* First move after door_stop */ +bool waswizard = FALSE; /* Was a wizard sometime */ +bool amulet = FALSE; /* He found the amulet */ +bool in_shell = FALSE; /* True if executing a shell */ +bool nochange = FALSE; /* true if last stat same as now */ + +bool s_know[MAXSCROLLS]; /* Does he know about a scroll */ +bool p_know[MAXPOTIONS]; /* Does he know about a potion */ +bool r_know[MAXRINGS]; /* Does he know about a ring */ +bool ws_know[MAXSTICKS]; /* Does he know about a stick */ + +char spacemsg[] = { "-- Press space to continue --" }; +char morestr[] = { "-- More --" }; +char retstr[] = { "[Press return to continue]" }; +char wizstr[] = { "Wizards Password: " }; +char illegal[] = { "Illegal command '%s'." }; +char callit[] = { "Call it: " }; +char starlist[] = { " (* for a list)" }; + +struct coord oldpos; /* Pos before last look() call */ +struct coord delta; /* Change indicated to get_dir() */ +struct coord stairs; /* where the stairs are put */ +struct coord rndspot = { -1, -1 }; /* for random teleporting */ + +struct monster *mtlev[MONRANGE]; + +#define _r {10,10,10,10} /* real ability (unused) */ +#define _p 0,0,0,0 /* hit points, pack, carry (unused) */ +#define _c 10 /* constitution (unused) */ + +/* + * NAME SHOW CARRY {LEVEL} FLAGS _r {STR DEX WIS _c} EXP LVL ARM _p DMG + */ +struct monster monsters[MAXMONS + 1] = { +{"giant ant",'A',0,{3,12,1},ISMEAN,{_r,{10,16,5,_c},10,2,3,_p,"1d6"}}, +{"bat",'B',0,{1,6,1},ISHUH,{_r,{10,10,10,_c},1,1,3,_p,"1d2"}}, +{"centaur",'C',15,{8,17,1},0,{_r,{16,10,15,_c},15,4,4,_p,"1d6/1d6"}}, +{"red dragon",'D',100,{21,500,0},ISGREED,{_r,{17,10,17,_c},9000,11,-1,_p,"1d8/1d8/3d10"}}, +{"floating eye",'E',0,{2,11,0},0,{_r,{10,10,10,_c},5,1,9,_p,"0d0"}}, +{"violet fungi",'F',0,{15,24,0},ISMEAN|ISSTUCK,{_r,{10,5,3,_c},85,8,2,_p,"000d0"}}, +{"gnome",'G',10,{6,15,1},0,{_r,{10,10,11,_c},8,1,5,_p,"1d6"}}, +{"hobgoblin",'H',0,{1,8,1},ISMEAN,{_r,{10,10,10,_c},3,1,5,_p,"1d8"}}, +{"invisible stalker",'I',0,{16,25,1},ISINVIS|ISHUH,{_r,{10,15,15,_c},120,8,2,_p,"4d4"}}, +{"jackal",'J',0,{1,6,1},ISMEAN,{_r,{10,10,10,_c},2,1,7,_p,"1d2"}}, +{"kobold",'K',0,{1,6,1},ISMEAN,{_r,{10,10,10,_c},1,1,8,_p,"1d4"}}, +{"leprechaun",'L',0,{7,16,0},0,{_r,{10,15,16,_c},10,3,8,_p,"1d1"}}, +{"mimic",'M',30,{19,500,0},0,{_r,{10,10,10,_c},140,8,7,_p,"3d4"}}, +{"nymph",'N',100,{11,20,0},0,{_r,{10,18,18,_c},40,3,9,_p,"0d0"}}, +{"orc",'O',15,{4,13,1},0,{_r,{10,10,10,10},5,1,6,_p,"1d8"}}, +{"purple worm",'P',70,{22,500,0},0,{_r,{18,5,10,_c},7000,15,6,_p,"2d12/2d4"}}, +{"quasit",'Q',30,{10,19,1},ISMEAN,{_r,{10,15,16,_c},35,3,2,_p,"1d2/1d2/1d4"}}, +{"rust monster",'R',0,{9,18,1},ISMEAN,{_r,{10,10,10,_c},25,5,2,_p,"0d0/0d0"}}, +{"snake",'S',0,{1,7,1},ISMEAN,{_r,{10,10,10,_c},3,1,5,_p,"1d3"}}, +{"troll",'T',50,{13,22,0},ISMEAN|ISREGEN,{_r,{10,10,11,_c},55,6,4,_p,"1d8/1d8/2d6"}}, +{"umber hulk",'U',40,{18,500,1},ISMEAN,{_r,{17,10,10,_c},130,8,2,_p,"3d4/3d4/2d5"}}, +{"vampire",'V',20,{20,500,1},ISMEAN|ISREGEN,{_r,{21,16,16,_c},380,8,1,_p,"1d10"}}, +{"wraith",'W',0,{14,23,1},ISMEAN,{_r,{10,10,10,_c},55,5,4,_p,"1d6"}}, +{"xorn",'X',0,{17,26,1},ISMEAN,{_r,{17,6,11,_c},120,7,-2,_p,"1d3/1d3/1d3/4d6"}}, +{"yeti",'Y',30,{12,21,1},ISMEAN,{_r,{10,10,10,_c},50,4,6,_p,"1d6/1d6"}}, +{"zombie",'Z',0,{5,14,1},ISMEAN,{_r,{10,10,10,_c},7,2,8,_p,"1d8"}}, +{"anhkheg",'a',10,{7,16,1},ISMEAN,{_r,{10,15,3,_c},20,3,2,_p,"3d6"}}, +{"giant beetle",'b',0,{9,18,1},ISMEAN,{_r,{10,15,10,_c},30,5,3,_p,"4d4"}}, +{"cockatrice",'c',100,{8,17,0},0,{_r,{10,10,11,_c},200,5,6,_p,"1d3"}}, +{"bone devil",'d',0,{27,500,1},ISMEAN,{_r,{18,10,16,_c},8000,12,-1,_p,"5d4"}}, +{"elasmosaurus",'e',0,{28,500,1},ISMEAN,{_r,{17,5,3,_c},4500,12,7,_p,"4d6"}}, +{"killer frog",'f',0,{3,8,1},ISMEAN,{_r,{10,10,10,_c},4,3,8,_p,"2d3/1d4"}}, +{"green dragon",'g',50,{25,500,1},0,{_r,{18,10,18,_c},7500,10,2,_p,"1d6/1d6/2d10"}}, +{"hell hound",'h',20,{10,19,1},ISMEAN,{_r,{10,15,10,_c},30,5,4,_p,"1d10"}}, +{"imp",'i',20,{2,9,1},ISMEAN|ISREGEN,{_r,{10,14,11,_c},6,2,1,_p,"1d4"}}, +{"jaguar",'j',0,{10,19,0},0,{_r,{10,10,11,_c},25,8,6,_p,"2d3/2d5"}}, +{"koppleganger",'k',20,{8,17,1},ISMEAN,{_r,{10,10,16,_c},35,4,5,_p,"1d12"}}, +{"lonchu",'l',15,{2,9,1},ISMEAN,{_r,{10,4,18,_c},5,2,1,_p,"1d4/1d4"}}, +{"minotaur",'m',0,{12,21,1},ISMEAN,{_r,{10,10,11,_c},40,8,6,_p,"1d3/2d4"}}, +{"neotyugh",'n',10,{14,23,1},ISMEAN,{_r,{10,6,4,_c},50,6,3,_p,"1d8/1d8/2d3"}}, +{"ogre",'o',50,{7,16,1},0,{_r,{20,10,10,_c},15,4,5,_p,"2d6"}}, +{"pseudo dragon",'p',50,{9,18,1},0,{_r,{10,10,16,_c},20,4,2,_p,"2d3/1d6"}}, +{"quellit",'q',85,{30,500,1},0,{_r,{17,10,10,_c},12500,17,0,_p,"2d10/2d6"}}, +{"rhynosphinx",'r',40,{26,500,0},0,{_r,{19,6,18,_c},5000,13,-1,_p,"2d10/2d8"}}, +{"shadow",'s',15,{5,14,1},ISMEAN|ISREGEN|ISINVIS,{_r,{10,17,18,_c},6,3,5,_p,"1d6"}}, +{"titanothere",'t',0,{19,500,0},0,{_r,{17,6,3,_c},750,14,6,_p,"2d8/1d6"}}, +{"ulodyte",'u',10,{2,8,1},ISMEAN,{_r,{10,10,10,_c},3,2,5,_p,"1d3/1d3"}}, +{"vrock",'v',0,{4,13,1},ISMEAN,{_r,{10,10,11,_c},8,3,2,_p,"1d4/1d6"}}, +{"wuccubi",'w',0,{14,23,1},ISMEAN,{_r,{10,10,10,_c},90,6,0,_p,"1d4/1d10"}}, +{"xonoclon",'x',0,{20,500,0},0,{_r,{19,10,4,_c},1750,14,0,_p,"3d8"}}, +{"yeenoghu",'y',10,{15,24,1},ISMEAN,{_r,{17,15,10,_c},250,8,1,_p,"3d6"}}, +{"zemure",'z',0,{1,6,1},ISMEAN|ISREGEN,{_r,{10,10,10,_c},4,2,7,_p,"1d4"}}, +{"devil Asmodeus",'A',-1,{1,500,1},ISMEAN|ISREGEN,{_r,{24,18,18,_c},500000,40,-10,_p,"4d10/4d10"}}, +}; + +#undef _p /* erase these definitions */ +#undef _c +#undef _r + +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", + 'p', "<dir> zap a wand in a direction", + 'z', " zap a wand or staff", + '>', " go down a staircase", + 's', " search for trap/secret door", + '.', " (dot) rest for a while", + 'i', " inventory pack", + 'I', " inventory single item", + 'q', " quaff potion", + 'r', " read a scroll", + '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", + 'O', " examine/set options", + 'a', " display maximum stats", + 'D', " dip object in pool", + CTRL('L')," redraw screen", + ESCAPE, " cancel command", + '!', " shell escape", + 'S', " save game", + 'Q', " quit", + 0, 0 +}; + +char *s_names[MAXSCROLLS]; /* Names of the scrolls */ +char *p_colors[MAXPOTIONS]; /* Colors of the potions */ +char *r_stones[MAXRINGS]; /* Stone settings of the rings */ +struct rod ws_stuff[MAXSTICKS]; /* Stuff for sticks */ + +struct magic_item things[NUMTHINGS + 1] = { + { "potion", 257, 5, }, + { "scroll", 250, 30, }, + { "food", 185, 7, }, + { "weapon", 92, 0, }, + { "armor", 92, 0, }, + { "ring", 62, 5, }, + { "stick", 62, 0, }, + { "amulet", 0, -250, }, + { NULL, 0, 0, }, +}; + +struct magic_item a_magic[MAXARMORS + 1] = { + { "leather armor", 170, 5 }, + { "ring mail", 130, 30 }, + { "studded leather armor", 130, 20 }, + { "scale mail", 120, 3 }, + { "padded armor", 100, 250 }, + { "chain mail", 90, 75 }, + { "splint mail", 90, 80 }, + { "banded mail", 90, 90 }, + { "plate mail", 50, 400 }, + { "plate armor", 30, 650 }, + { NULL, 0, 0 }, +}; +struct init_armor armors[MAXARMORS] = { + { 8, 150, 500, }, + { 7, 250, 650, }, + { 7, 200, 550, }, + { 6, 400, 900, }, + { 6, 100, 450, }, + { 5, 300, 650, }, + { 4, 400, 700, }, + { 4, 350, 600, }, + { 3, 450, 950, }, + { 2, 350, 750, }, +}; +struct magic_item w_magic[MAXWEAPONS + 1] = { + { "mace", 70, 25 }, + { "long sword", 70, 60 }, + { "short bow", 60, 150 }, + { "arrow", 60, 2 }, + { "dagger", 20, 5 }, + { "rock", 20, 1 }, + { "two-handed sword", 50, 120 }, + { "sling", 20, 5 }, + { "dart", 30, 3 }, + { "crossbow", 60, 70 }, + { "crossbow bolt", 60, 3 }, + { "spear", 70, 8 }, + { "trident", 70, 90 }, + { "spetum", 70, 50 }, + { "bardiche", 70, 30 }, + { "pike", 70, 75 }, + { "bastard sword", 60, 100 }, + { "halberd", 70, 40 }, + { NULL, 0, 0 }, +}; + +struct init_weps weaps[MAXWEAPONS] = { + { "2d4", "1d3", 0, 100, 300, NONE }, + { "1d10", "1d2", 0, 60, 180, NONE }, + { "1d1", "1d1", 0, 40, 190, NONE }, + { "1d1", "1d6", ISMANY|ISMISL, 5, 8, BOW }, + { "1d6", "1d4", ISMISL, 10, 30, NONE }, + { "1d2", "1d4", ISMANY|ISMISL, 5, 10, SLING }, + { "3d6", "1d2", 0, 250, 550, NONE }, + { "0d0", "0d0", 0, 5, 7, NONE }, + { "1d1", "1d3", ISMANY|ISMISL, 5, 5, NONE }, + { "1d1", "1d1", 0, 100, 250, NONE }, + { "1d2", "1d10", ISMANY|ISMISL, 7, 11, CROSSBOW }, + { "1d8", "1d6", ISMISL, 50, 200, NONE }, + { "3d4", "1d4", 0, 50, 220, NONE }, + { "2d5", "1d3", 0, 50, 200, NONE }, + { "3d3", "1d2", 0, 125, 270, NONE }, + { "1d12", "1d8", 0, 80, 260, NONE }, + { "2d7", "1d2", 0, 100, 400, NONE }, + { "2d6", "1d3", 0, 175, 370, NONE }, +}; + +struct magic_item s_magic[MAXSCROLLS + 1] = { + { "monster confusion", 50, 200 }, + { "magic mapping", 52, 200 }, + { "light", 80, 100 }, + { "hold monster", 25, 200 }, + { "sleep", 41, 50 }, + { "enchant armor", 75, 175 }, + { "identify", 211, 150 }, + { "scare monster", 42, 300 }, + { "gold detection", 32, 100 }, + { "teleportation", 73, 200 }, + { "enchant weapon", 91, 175 }, + { "create monster", 34, 75 }, + { "remove curse", 82, 100 }, + { "aggravate monsters", 10, 50 }, + { "blank paper", 11, 50 }, + { "genocide", 5, 350 }, + { "item knowledge", 14, 250 }, + { "item protection", 9, 250 }, + { "demons curse", 5, 25 }, + { "transport", 11, 100 }, + { "enchantment", 3, 300 }, + { "gods blessing", 4, 450 }, + { "aquirement", 3, 450 }, + { "banishment", 5, 25 }, + { "recharge wand", 14, 250 }, + { "locate traps", 18, 185 }, + { NULL, 0, 0 }, +}; + +struct magic_item p_magic[MAXPOTIONS + 1] = { + { "confusion", 69, 50 }, + { "paralysis", 69, 50 }, + { "poison", 55, 50 }, + { "gain strength", 130, 150 }, + { "see invisible", 25, 175 }, + { "healing", 120, 130 }, + { "monster detection", 59, 120 }, + { "magic detection", 54, 105 }, + { "raise level", 25, 300 }, + { "extra healing", 52, 175 }, + { "haste self", 41, 200 }, + { "restore strength", 140, 200 }, + { "blindness", 25, 50 }, + { "thirst quenching", 10, 50 }, + { "increase dexterity", 50, 175 }, + { "etherealness", 20, 150 }, + { "increase wisdom", 35, 175 }, + { "regeneration", 10, 175 }, + { "super ability", 3, 500 }, + { "decrepedness", 4, 25 }, + { "invincibility", 4, 500 }, + { NULL, 0, 0 }, +}; + +struct magic_item r_magic[MAXRINGS + 1] = { + { "protection", 71, 200 }, + { "strength", 70, 200 }, + { "sustain strength", 45, 250 }, + { "searching", 70, 150 }, + { "see invisible", 77, 175 }, + { "constitution", 13, 350 }, + { "aggravate monster", 60, 100 }, + { "agility", 75, 250 }, + { "increase damage", 61, 250 }, + { "regeneration", 41, 250 }, + { "digestion", 60, 225 }, + { "teleportation", 60, 100 }, + { "stealth", 75, 200 }, + { "speed", 40, 225 }, + { "find traps", 27, 200 }, + { "delusion", 18, 100 }, + { "sustain ability", 9, 450 }, + { "blindness", 10, 50 }, + { "lethargy", 14, 75 }, + { "ogre strength", 8, 350 }, + { "enfeeblement", 5, 25 }, + { "burden", 10, 50 }, + { "illumination", 16, 100 }, + { "fire protection", 5, 225 }, + { "wisdom", 25, 200 }, + { "dexterity", 35, 200 }, + { NULL, 0, 0 }, +}; + +struct magic_item ws_magic[MAXSTICKS + 1] = { + { "light", 95, 120 }, + { "striking", 75, 115 }, + { "lightning", 30, 200 }, + { "fire", 30, 200 }, + { "cold", 30, 200 }, + { "polymorph", 95, 210 }, + { "magic missile", 70, 170 }, + { "haste monster", 80, 50 }, + { "slow monster", 90, 220 }, + { "drain life", 80, 210 }, + { "nothing", 10, 70 }, + { "teleport away", 55, 140 }, + { "teleport to", 50, 60 }, + { "cancellation", 55, 130 }, + { "sap life", 20, 50 }, + { "curing", 25, 250 }, + { "pyromania", 15, 25 }, + { "annihilate monster", 5, 750 }, + { "paralyze monster", 10, 650 }, + { "food absorption", 10, 75 }, + { "regenerate monster", 15, 25 }, + { "hide monster", 10, 50 }, + { "anti-matter", 5, 25 }, + { "clone monster", 10, 10 }, + { "confuse monster", 15, 150 }, + { "degenerate monster", 15, 150 }, + { NULL, 0, 0 }, +}; + +struct magic_info thnginfo[NUMTHINGS] = { + { MAXPOTIONS, V_POTION, POTION, p_magic, }, + { MAXSCROLLS, V_SCROLL, SCROLL, s_magic, }, + { MAXFOODS, V_FOOD, FOOD, NULL, }, + { MAXWEAPONS, V_WEAPON, WEAPON, w_magic, }, + { MAXARMORS, V_ARMOR, ARMOR, a_magic, }, + { MAXRINGS, V_RING, RING, r_magic, }, + { MAXSTICKS, V_STICK, STICK, ws_magic, }, + { MAXAMULETS, V_AMULET, AMULET, NULL, }, +}; + +long e_levels[] = { + 10L,20L,40L,80L,160L,320L,640L,1280L,2560L,5120L,10240L,20480L, + 40920L, 81920L, 163840L, 327680L, 655360L, 1310720L, 2621440L, + 3932160L, 5242880L, 7864320L, 10485760L, 15728640L, 20971520L, + 41943040L, 83886080L, 167772160L, 335544320L, 0L, +}; + +WINDOW *cw; /* what the hero sees */ +WINDOW *hw; /* utility window */ +WINDOW *mw; /* monster window */