Annotation of early-roguelike/rogue5/wizard.c, Revision 1.1.1.1
1.1 rubenllo 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: THING *mp;
224:
225: player.t_flags &= ~ISHELD;
226: vf_hit = 0;
227: for (mp = mlist; mp != NULL; mp = next(mp)) {
228: if (mp->t_type == 'F')
229: strcpy(mp->t_stats.s_dmg, "0x0");
230: }
231: }
232: no_move = 0;
233: count = 0;
234: running = FALSE;
235: flush_type();
236: }
237:
238: #ifdef MASTER
239: /*
240: * passwd:
241: * See if user knows password
242: */
243: int
244: passwd(void)
245: {
246: char *sp;
247: int c;
248: static char buf[MAXSTR];
249:
250: msg("wizard's Password:");
251: mpos = 0;
252: sp = buf;
253: while ((c = readchar()) != '\n' && c != '\r' && c != ESCAPE)
254: if (c == md_killchar())
255: sp = buf;
256: else if (c == md_erasechar() && sp > buf)
257: sp--;
258: else
259: *sp++ = (char) c;
260: if (sp == buf)
261: return FALSE;
262: *sp = '\0';
263: return (strcmp(PASSWD, md_crypt(buf, "mT")) == 0);
264: }
265:
266: /*
267: * show_map:
268: * Print out the map for the wizard
269: */
270:
271: void
272: show_map(void)
273: {
274: int y, x, real;
275:
276: wclear(hw);
277: for (y = 1; y < NUMLINES - 1; y++)
278: for (x = 0; x < NUMCOLS; x++)
279: {
280: real = flat(y, x) & F_REAL;
281: if (!real)
282: wstandout(hw);
283: wmove(hw, y, x);
284: waddch(hw, chat(y, x));
285: if (!(real & F_REAL))
286: wstandend(hw);
287: }
288: show_win("---More (level map)---");
289: }
290: #endif
CVSweb