Mercurial > hg > early-roguelike
comparison rogue5/wizard.c @ 33:f502bf60e6e4
Import Rogue 5.4 from the Roguelike Restoration Project (r1490)
| author | elwin |
|---|---|
| date | Mon, 24 May 2010 20:10:59 +0000 |
| parents | |
| children | e7aab31362af |
comparison
equal
deleted
inserted
replaced
| 32:2dcd75e6a736 | 33:f502bf60e6e4 |
|---|---|
| 1 /* | |
| 2 * Special wizard commands (some of which are also non-wizard commands | |
| 3 * under strange circumstances) | |
| 4 * | |
| 5 * @(#)wizard.c 4.30 (Berkeley) 02/05/99 | |
| 6 * | |
| 7 * Rogue: Exploring the Dungeons of Doom | |
| 8 * Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman | |
| 9 * All rights reserved. | |
| 10 * | |
| 11 * See the file LICENSE.TXT for full copyright and licensing information. | |
| 12 */ | |
| 13 | |
| 14 #include <stdlib.h> | |
| 15 #include <curses.h> | |
| 16 #include <string.h> | |
| 17 #include <ctype.h> | |
| 18 #include "rogue.h" | |
| 19 | |
| 20 /* | |
| 21 * whatis: | |
| 22 * What a certin object is | |
| 23 */ | |
| 24 | |
| 25 void | |
| 26 whatis(int insist, int type) | |
| 27 { | |
| 28 THING *obj; | |
| 29 | |
| 30 if (pack == NULL) | |
| 31 { | |
| 32 msg("you don't have anything in your pack to identify"); | |
| 33 return; | |
| 34 } | |
| 35 | |
| 36 for (;;) | |
| 37 { | |
| 38 obj = get_item("identify", type); | |
| 39 if (insist) | |
| 40 { | |
| 41 if (n_objs == 0) | |
| 42 return; | |
| 43 else if (obj == NULL) | |
| 44 msg("you must identify something"); | |
| 45 else if (type && obj->o_type != type && | |
| 46 !(type == R_OR_S && (obj->o_type == RING || obj->o_type == STICK)) ) | |
| 47 msg("you must identify a %s", type_name(type)); | |
| 48 else | |
| 49 break; | |
| 50 } | |
| 51 else | |
| 52 break; | |
| 53 } | |
| 54 | |
| 55 if (obj == NULL) | |
| 56 return; | |
| 57 | |
| 58 switch (obj->o_type) | |
| 59 { | |
| 60 case SCROLL: | |
| 61 set_know(obj, scr_info); | |
| 62 when POTION: | |
| 63 set_know(obj, pot_info); | |
| 64 when STICK: | |
| 65 set_know(obj, ws_info); | |
| 66 when WEAPON: | |
| 67 case ARMOR: | |
| 68 obj->o_flags |= ISKNOW; | |
| 69 when RING: | |
| 70 set_know(obj, ring_info); | |
| 71 } | |
| 72 msg(inv_name(obj, FALSE)); | |
| 73 } | |
| 74 | |
| 75 /* | |
| 76 * set_know: | |
| 77 * Set things up when we really know what a thing is | |
| 78 */ | |
| 79 | |
| 80 void | |
| 81 set_know(THING *obj, struct obj_info *info) | |
| 82 { | |
| 83 char **guess; | |
| 84 | |
| 85 info[obj->o_which].oi_know = TRUE; | |
| 86 obj->o_flags |= ISKNOW; | |
| 87 guess = &info[obj->o_which].oi_guess; | |
| 88 if (*guess) | |
| 89 { | |
| 90 free(*guess); | |
| 91 *guess = NULL; | |
| 92 } | |
| 93 } | |
| 94 | |
| 95 /* | |
| 96 * type_name: | |
| 97 * Return a pointer to the name of the type | |
| 98 */ | |
| 99 const char * | |
| 100 type_name(int type) | |
| 101 { | |
| 102 struct h_list *hp; | |
| 103 struct h_list tlist[] = { | |
| 104 {POTION, "potion", FALSE}, | |
| 105 {SCROLL, "scroll", FALSE}, | |
| 106 {FOOD, "food", FALSE}, | |
| 107 {R_OR_S, "ring, wand or staff", FALSE}, | |
| 108 {RING, "ring", FALSE}, | |
| 109 {STICK, "wand or staff", FALSE}, | |
| 110 {WEAPON, "weapon", FALSE}, | |
| 111 {ARMOR, "suit of armor", FALSE}, | |
| 112 }; | |
| 113 | |
| 114 for (hp = tlist; hp->h_ch; hp++) | |
| 115 if (type == hp->h_ch) | |
| 116 return hp->h_desc; | |
| 117 /* NOTREACHED */ | |
| 118 return(0); | |
| 119 } | |
| 120 | |
| 121 #ifdef MASTER | |
| 122 /* | |
| 123 * create_obj: | |
| 124 * wizard command for getting anything he wants | |
| 125 */ | |
| 126 | |
| 127 void | |
| 128 create_obj(void) | |
| 129 { | |
| 130 THING *obj; | |
| 131 int ch, bless; | |
| 132 | |
| 133 obj = new_item(); | |
| 134 msg("type of item: "); | |
| 135 obj->o_type = readchar(); | |
| 136 mpos = 0; | |
| 137 msg("which %c do you want? (0-f)", obj->o_type); | |
| 138 obj->o_which = (isdigit((ch = readchar())) ? ch - '0' : ch - 'a' + 10); | |
| 139 obj->o_group = 0; | |
| 140 obj->o_count = 1; | |
| 141 mpos = 0; | |
| 142 if (obj->o_type == WEAPON || obj->o_type == ARMOR) | |
| 143 { | |
| 144 msg("blessing? (+,-,n)"); | |
| 145 bless = readchar(); | |
| 146 mpos = 0; | |
| 147 if (bless == '-') | |
| 148 obj->o_flags |= ISCURSED; | |
| 149 if (obj->o_type == WEAPON) | |
| 150 { | |
| 151 init_weapon(obj, obj->o_which); | |
| 152 if (bless == '-') | |
| 153 obj->o_hplus -= rnd(3)+1; | |
| 154 if (bless == '+') | |
| 155 obj->o_hplus += rnd(3)+1; | |
| 156 } | |
| 157 else | |
| 158 { | |
| 159 obj->o_arm = a_class[obj->o_which]; | |
| 160 if (bless == '-') | |
| 161 obj->o_arm += rnd(3)+1; | |
| 162 if (bless == '+') | |
| 163 obj->o_arm -= rnd(3)+1; | |
| 164 } | |
| 165 } | |
| 166 else if (obj->o_type == RING) | |
| 167 switch (obj->o_which) | |
| 168 { | |
| 169 case R_PROTECT: | |
| 170 case R_ADDSTR: | |
| 171 case R_ADDHIT: | |
| 172 case R_ADDDAM: | |
| 173 msg("blessing? (+,-,n)"); | |
| 174 bless = readchar(); | |
| 175 mpos = 0; | |
| 176 if (bless == '-') | |
| 177 obj->o_flags |= ISCURSED; | |
| 178 obj->o_arm = (bless == '-' ? -1 : rnd(2) + 1); | |
| 179 when R_AGGR: | |
| 180 case R_TELEPORT: | |
| 181 obj->o_flags |= ISCURSED; | |
| 182 } | |
| 183 else if (obj->o_type == STICK) | |
| 184 fix_stick(obj); | |
| 185 else if (obj->o_type == GOLD) | |
| 186 { | |
| 187 msg("how much?"); | |
| 188 get_num(&obj->o_goldval, stdscr); | |
| 189 } | |
| 190 add_pack(obj, FALSE); | |
| 191 } | |
| 192 #endif | |
| 193 | |
| 194 /* | |
| 195 * telport: | |
| 196 * Bamf the hero someplace else | |
| 197 */ | |
| 198 | |
| 199 void | |
| 200 teleport(void) | |
| 201 { | |
| 202 coord c; | |
| 203 | |
| 204 mvaddch(hero.y, hero.x, floor_at()); | |
| 205 find_floor(NULL, &c, FALSE, TRUE); | |
| 206 if (roomin(&c) != proom) | |
| 207 { | |
| 208 leave_room(&hero); | |
| 209 hero = c; | |
| 210 enter_room(&hero); | |
| 211 } | |
| 212 else | |
| 213 { | |
| 214 hero = c; | |
| 215 look(TRUE); | |
| 216 } | |
| 217 mvaddch(hero.y, hero.x, PLAYER); | |
| 218 /* | |
| 219 * turn off ISHELD in case teleportation was done while fighting | |
| 220 * a Flytrap | |
| 221 */ | |
| 222 if (on(player, ISHELD)) { | |
| 223 player.t_flags &= ~ISHELD; | |
| 224 vf_hit = 0; | |
| 225 strcpy(monsters['F'-'A'].m_stats.s_dmg, "000x0"); | |
| 226 } | |
| 227 no_move = 0; | |
| 228 count = 0; | |
| 229 running = FALSE; | |
| 230 flush_type(); | |
| 231 } | |
| 232 | |
| 233 #ifdef MASTER | |
| 234 /* | |
| 235 * passwd: | |
| 236 * See if user knows password | |
| 237 */ | |
| 238 int | |
| 239 passwd(void) | |
| 240 { | |
| 241 char *sp; | |
| 242 int c; | |
| 243 static char buf[MAXSTR]; | |
| 244 | |
| 245 msg("wizard's Password:"); | |
| 246 mpos = 0; | |
| 247 sp = buf; | |
| 248 while ((c = readchar()) != '\n' && c != '\r' && c != ESCAPE) | |
| 249 if (c == md_killchar()) | |
| 250 sp = buf; | |
| 251 else if (c == md_erasechar() && sp > buf) | |
| 252 sp--; | |
| 253 else | |
| 254 *sp++ = (char) c; | |
| 255 if (sp == buf) | |
| 256 return FALSE; | |
| 257 *sp = '\0'; | |
| 258 return (strcmp(PASSWD, md_crypt(buf, "mT")) == 0); | |
| 259 } | |
| 260 | |
| 261 /* | |
| 262 * show_map: | |
| 263 * Print out the map for the wizard | |
| 264 */ | |
| 265 | |
| 266 void | |
| 267 show_map(void) | |
| 268 { | |
| 269 int y, x, real; | |
| 270 | |
| 271 wclear(hw); | |
| 272 for (y = 1; y < NUMLINES - 1; y++) | |
| 273 for (x = 0; x < NUMCOLS; x++) | |
| 274 { | |
| 275 real = flat(y, x) & F_REAL; | |
| 276 if (!real) | |
| 277 wstandout(hw); | |
| 278 wmove(hw, y, x); | |
| 279 waddch(hw, chat(y, x)); | |
| 280 if (!(real & F_REAL)) | |
| 281 wstandend(hw); | |
| 282 } | |
| 283 show_win("---More (level map)---"); | |
| 284 } | |
| 285 #endif |
