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