Mercurial > hg > early-roguelike
comparison srogue/wizard.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 | 7612f48a38ad | 
   comparison
  equal
  deleted
  inserted
  replaced
| 35:05018c63a721 | 36:2128c7dc8a40 | 
|---|---|
| 1 /* | |
| 2 * Mostly wizard commands. Sometimes used by players. | |
| 3 * | |
| 4 * @(#)wizard.c 9.0 (rdk) 7/17/84 | |
| 5 * | |
| 6 * Super-Rogue | |
| 7 * Copyright (C) 1984 Robert D. Kindelberger | |
| 8 * All rights reserved. | |
| 9 * | |
| 10 * Based on "Rogue: Exploring the Dungeons of Doom" | |
| 11 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman | |
| 12 * All rights reserved. | |
| 13 * | |
| 14 * See the file LICENSE.TXT for full copyright and licensing information. | |
| 15 */ | |
| 16 | |
| 17 #include <termios.h> | |
| 18 #include <ctype.h> | |
| 19 #include "rogue.h" | |
| 20 #include <pwd.h> | |
| 21 #include "rogue.ext" | |
| 22 | |
| 23 extern struct termios terminal; | |
| 24 | |
| 25 /* | |
| 26 * whatis: | |
| 27 * What a certain object is | |
| 28 */ | |
| 29 whatis(what) | |
| 30 struct linked_list *what; | |
| 31 { | |
| 32 reg struct object *obj; | |
| 33 reg struct linked_list *item; | |
| 34 reg int wh; | |
| 35 | |
| 36 if (what == NULL) { /* we need to ask */ | |
| 37 if ((item = get_item("identify", 0)) == NULL) | |
| 38 return; | |
| 39 } | |
| 40 else /* no need to ask */ | |
| 41 item = what; | |
| 42 obj = OBJPTR(item); | |
| 43 setoflg(obj, ISKNOW); | |
| 44 wh = obj->o_which; | |
| 45 switch (obj->o_type) { | |
| 46 case SCROLL: | |
| 47 s_know[wh] = TRUE; | |
| 48 if (s_guess[wh]) { | |
| 49 free(s_guess[wh]); | |
| 50 s_guess[wh] = NULL; | |
| 51 } | |
| 52 when POTION: | |
| 53 p_know[wh] = TRUE; | |
| 54 if (p_guess[wh]) { | |
| 55 free(p_guess[wh]); | |
| 56 p_guess[wh] = NULL; | |
| 57 } | |
| 58 when STICK: | |
| 59 ws_know[wh] = TRUE; | |
| 60 if (ws_guess[wh]) { | |
| 61 free(ws_guess[wh]); | |
| 62 ws_guess[wh] = NULL; | |
| 63 } | |
| 64 when RING: | |
| 65 r_know[wh] = TRUE; | |
| 66 if (r_guess[wh]) { | |
| 67 free(r_guess[wh]); | |
| 68 r_guess[wh] = NULL; | |
| 69 } | |
| 70 } | |
| 71 if (what == NULL) | |
| 72 msg(inv_name(obj, FALSE)); | |
| 73 } | |
| 74 | |
| 75 | |
| 76 /* | |
| 77 * create_obj: | |
| 78 * Create any object for wizard or scroll (almost) | |
| 79 */ | |
| 80 create_obj(fscr) | |
| 81 bool fscr; | |
| 82 { | |
| 83 reg struct linked_list *item; | |
| 84 reg struct object *obj; | |
| 85 reg int wh, ch, otype; | |
| 86 char newitem, newtype, msz, *oname; | |
| 87 struct magic_info *mf; | |
| 88 bool nogood = TRUE, inhw = FALSE; | |
| 89 | |
| 90 if (fscr) | |
| 91 msg(" "); | |
| 92 else if (wizard) { | |
| 93 msg("Create what?%s: ", starlist); | |
| 94 ch = readchar(); | |
| 95 mpos = 0; | |
| 96 if (ch == ESCAPE) | |
| 97 return; | |
| 98 else if (ch != '*') | |
| 99 nogood = FALSE; | |
| 100 } | |
| 101 if (nogood) { | |
| 102 inhw = TRUE; | |
| 103 wclear(hw); | |
| 104 wprintw(hw,"Item\tKey\n\n"); | |
| 105 for (otype = 0; otype < NUMTHINGS; otype++) { | |
| 106 if (otype != TYP_AMULET || wizard) { | |
| 107 mf = &thnginfo[otype]; | |
| 108 wprintw(hw,"%s\t %c\n",things[otype].mi_name,mf->mf_show); | |
| 109 } | |
| 110 } | |
| 111 if (wizard) | |
| 112 waddstr(hw,"monster\t (A-z)"); | |
| 113 wprintw(hw,"\n\nWhat do you want to create? "); | |
| 114 draw(hw); | |
| 115 do { | |
| 116 ch = readchar(); | |
| 117 if (ch == ESCAPE) { | |
| 118 after = FALSE; | |
| 119 restscr(cw); | |
| 120 return; | |
| 121 } | |
| 122 switch (ch) { | |
| 123 case RING: case STICK: case POTION: | |
| 124 case SCROLL: case ARMOR: case WEAPON: | |
| 125 case FOOD: case AMULET: | |
| 126 nogood = FALSE; | |
| 127 break; | |
| 128 default: | |
| 129 if (isalpha(ch)) | |
| 130 nogood = FALSE; | |
| 131 } | |
| 132 } while (nogood); | |
| 133 } | |
| 134 if (isalpha(ch)) { | |
| 135 if (inhw) | |
| 136 restscr(cw); | |
| 137 makemons(ch); /* make monster & be done with it */ | |
| 138 return; | |
| 139 } | |
| 140 otype = getindex(ch); | |
| 141 if (otype == -1 || (otype == AMULET && !wizard)) { | |
| 142 if (inhw) | |
| 143 restscr(cw); | |
| 144 mpos = 0; | |
| 145 msg("You can't create that !!"); | |
| 146 return; | |
| 147 } | |
| 148 newitem = ch; | |
| 149 mf = &thnginfo[otype]; | |
| 150 oname = things[otype].mi_name; | |
| 151 msz = mf->mf_max; | |
| 152 nogood = TRUE; | |
| 153 if (msz == 1) { /* if only one type of item */ | |
| 154 ch = 'a'; | |
| 155 nogood = FALSE; | |
| 156 } | |
| 157 else if (!fscr && wizard) { | |
| 158 if (!inhw) { | |
| 159 msg("Which %s?%s: ", oname, starlist); | |
| 160 ch = readchar(); | |
| 161 if (ch == ESCAPE) | |
| 162 return; | |
| 163 if (ch != '*') | |
| 164 nogood = FALSE; | |
| 165 } | |
| 166 } | |
| 167 if (nogood) { | |
| 168 struct magic_item *wmi; | |
| 169 int ii; | |
| 170 | |
| 171 mpos = 0; | |
| 172 inhw = TRUE; | |
| 173 switch(newitem) { | |
| 174 case POTION: wmi = &p_magic[0]; | |
| 175 when SCROLL: wmi = &s_magic[0]; | |
| 176 when RING: wmi = &r_magic[0]; | |
| 177 when STICK: wmi = &ws_magic[0]; | |
| 178 when WEAPON: wmi = &w_magic[0]; | |
| 179 otherwise: wmi = &a_magic[0]; | |
| 180 } | |
| 181 wclear(hw); | |
| 182 for (ii = 0 ; ii < msz ; ii++) { | |
| 183 mvwaddch(hw,ii % 13,ii > 12 ? COLS/2 : 0, ii + 'a'); | |
| 184 waddstr(hw,") "); | |
| 185 waddstr(hw,wmi->mi_name); | |
| 186 wmi++; | |
| 187 } | |
| 188 sprintf(prbuf,"Which %s? ", oname); | |
| 189 mvwaddstr(hw,LINES - 1, 0, prbuf); | |
| 190 draw(hw); | |
| 191 do { | |
| 192 ch = readchar(); | |
| 193 if (ch == ESCAPE) { | |
| 194 restscr(cw); | |
| 195 msg(""); | |
| 196 return; | |
| 197 } | |
| 198 } while (!isalpha(ch)); | |
| 199 } | |
| 200 if (inhw) /* restore screen if need be */ | |
| 201 restscr(cw); | |
| 202 | |
| 203 newtype = tolower(ch) - 'a'; | |
| 204 if (newtype < 0 || newtype >= msz) { /* if an illegal value */ | |
| 205 mpos = 0; | |
| 206 after = FALSE; | |
| 207 if (inhw) | |
| 208 restscr(cw); | |
| 209 msg("There is no such %s", oname); | |
| 210 return; | |
| 211 } | |
| 212 mpos = 0; | |
| 213 item = new_thing(FALSE, newitem, newtype); | |
| 214 obj = OBJPTR(item); | |
| 215 wh = obj->o_type; | |
| 216 if (wh == WEAPON || wh == ARMOR || wh == RING) { | |
| 217 if (fscr) /* users get +3 to -3 */ | |
| 218 ch = rnd(7) - 3; | |
| 219 else { /* wizard gets to choose */ | |
| 220 if (wh == RING) | |
| 221 init_ring(obj, TRUE); | |
| 222 else | |
| 223 ch = getbless(); | |
| 224 } | |
| 225 if (wh == WEAPON) | |
| 226 obj->o_hplus = obj->o_dplus = ch; | |
| 227 else if (wh == ARMOR) | |
| 228 obj->o_ac = armors[obj->o_which].a_class - ch; | |
| 229 if (ch < 0) | |
| 230 setoflg(obj, ISCURSED); | |
| 231 else | |
| 232 resoflg(obj, ISCURSED); | |
| 233 } | |
| 234 mpos = 0; | |
| 235 if (fscr) | |
| 236 whatis(item); /* identify for aquirement scroll */ | |
| 237 wh = add_pack(item, FALSE); | |
| 238 if (wh == FALSE) /* won't fit in pack */ | |
| 239 discard(item); | |
| 240 } | |
| 241 | |
| 242 | |
| 243 /* | |
| 244 * getbless: | |
| 245 * Get a blessing for a wizards object | |
| 246 */ | |
| 247 getbless() | |
| 248 { | |
| 249 int bless; | |
| 250 | |
| 251 msg("Blessing: "); | |
| 252 prbuf[0] = '\0'; | |
| 253 bless = get_str(prbuf, cw); | |
| 254 if (bless == NORM) | |
| 255 bless = atoi(prbuf); | |
| 256 else | |
| 257 bless = 0; | |
| 258 return bless; | |
| 259 } | |
| 260 | |
| 261 /* | |
| 262 * makemons: | |
| 263 * Make a monster | |
| 264 */ | |
| 265 makemons(what) | |
| 266 int what; | |
| 267 { | |
| 268 reg int x, y, oktomake = FALSE, appear = 1; | |
| 269 struct coord mp; | |
| 270 | |
| 271 oktomake = FALSE; | |
| 272 for (x = hero.x - 1 ; x <= hero.x + 1 ; x++) { | |
| 273 for (y = hero.y - 1 ; y <= hero.y + 1 ; y++) { | |
| 274 if (x != hero.x || y != hero.y) { | |
| 275 if (step_ok(winat(y, x)) && rnd(++appear) == 0) { | |
| 276 mp.x = x; | |
| 277 mp.y = y; | |
| 278 oktomake = TRUE; | |
| 279 break; | |
| 280 } | |
| 281 } | |
| 282 } | |
| 283 } | |
| 284 if (oktomake) { | |
| 285 new_monster(midx(what), &mp, FALSE); | |
| 286 look(FALSE); | |
| 287 } | |
| 288 return oktomake; | |
| 289 } | |
| 290 | |
| 291 /* | |
| 292 * telport: | |
| 293 * Bamf the thing someplace else | |
| 294 */ | |
| 295 teleport(spot, th) | |
| 296 struct coord spot; | |
| 297 struct thing *th; | |
| 298 { | |
| 299 reg int rm, y, x; | |
| 300 struct coord oldspot; | |
| 301 struct room *rp; | |
| 302 bool ishero; | |
| 303 | |
| 304 ishero = (th == &player); | |
| 305 oldspot = th->t_pos; | |
| 306 y = th->t_pos.y; | |
| 307 x = th->t_pos.x; | |
| 308 mvwaddch(cw, y, x, th->t_oldch); | |
| 309 if (!ishero) | |
| 310 mvwaddch(mw, y, x, ' '); | |
| 311 rp = roomin(&spot); | |
| 312 if (spot.y < 0 || !step_ok(winat(spot.y, spot.x))) { | |
| 313 rp = &rooms[rnd_room()]; | |
| 314 th->t_pos = *rnd_pos(rp); | |
| 315 } | |
| 316 else | |
| 317 th->t_pos = spot; | |
| 318 rm = rp - &rooms[0]; | |
| 319 th->t_room = rp; | |
| 320 th->t_oldch = mvwinch(cw, th->t_pos.y, th->t_pos.x); | |
| 321 light(&oldspot); | |
| 322 th->t_nomove = 0; | |
| 323 if (ishero) { | |
| 324 light(&hero); | |
| 325 mvwaddch(cw, hero.y, hero.x, PLAYER); | |
| 326 /* | |
| 327 * turn off ISHELD in case teleportation was done | |
| 328 * while fighting a Fungi or Bone Devil. | |
| 329 */ | |
| 330 if (pl_on(ISHELD)) | |
| 331 unhold('F'); | |
| 332 count = 0; | |
| 333 running = FALSE; | |
| 334 flushinp(); /* flush typeahead */ | |
| 335 nochange = FALSE; | |
| 336 } | |
| 337 else | |
| 338 mvwaddch(mw, th->t_pos.y, th->t_pos.x, th->t_type); | |
| 339 return rm; | |
| 340 } | |
| 341 | |
| 342 /* | |
| 343 * passwd: | |
| 344 * See if user knows password | |
| 345 */ | |
| 346 passwd() | |
| 347 { | |
| 348 reg char *sp, c; | |
| 349 bool passok; | |
| 350 char buf[LINLEN], *xcrypt(); | |
| 351 | |
| 352 msg(wizstr); | |
| 353 mpos = 0; | |
| 354 sp = buf; | |
| 355 while ((c = getchar()) != '\n' && c != '\r' && c != ESCAPE) | |
| 356 if (c == terminal.c_cc[VKILL]) | |
| 357 sp = buf; | |
| 358 else if (c == terminal.c_cc[VERASE] && sp > buf) | |
| 359 sp--; | |
| 360 else | |
| 361 *sp++ = c; | |
| 362 if (sp == buf) | |
| 363 passok = FALSE; | |
| 364 else { | |
| 365 *sp = '\0'; | |
| 366 passok = (strcmp(PASSWD, xcrypt(buf, "mT")) == 0); | |
| 367 } | |
| 368 return passok; | |
| 369 } | 
