Annotation of early-roguelike/rogue3/wizard.c, Revision 1.1.1.1
1.1 rubenllo 1:
2: /*
3: * Special wizard commands (some of which are also non-wizard commands
4: * under strange circumstances)
5: *
6: * @(#)wizard.c 3.8 (Berkeley) 6/3/81
7: *
8: * Rogue: Exploring the Dungeons of Doom
9: * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
10: * All rights reserved.
11: *
12: * See the file LICENSE.TXT for full copyright and licensing information.
13: */
14:
15: #include "curses.h"
16: #include <ctype.h>
17: #include <string.h>
18: #include <stdlib.h>
19: #include "machdep.h"
20: #include "rogue.h"
21:
22: /*
23: * whatis:
24: * What a certin object is
25: */
26:
27: void
28: whatis()
29: {
30: struct object *obj;
31: struct linked_list *item;
32:
33: if ((item = get_item("identify", 0)) == NULL)
34: return;
35: obj = (struct object *) ldata(item);
36: switch (obj->o_type)
37: {
38: case SCROLL:
39: s_know[obj->o_which] = TRUE;
40: if (s_guess[obj->o_which])
41: {
42: free(s_guess[obj->o_which]);
43: s_guess[obj->o_which] = NULL;
44: }
45: when POTION:
46: p_know[obj->o_which] = TRUE;
47: if (p_guess[obj->o_which])
48: {
49: free(p_guess[obj->o_which]);
50: p_guess[obj->o_which] = NULL;
51: }
52: when STICK:
53: ws_know[obj->o_which] = TRUE;
54: obj->o_flags |= ISKNOW;
55: if (ws_guess[obj->o_which])
56: {
57: free(ws_guess[obj->o_which]);
58: ws_guess[obj->o_which] = NULL;
59: }
60: when WEAPON:
61: case ARMOR:
62: obj->o_flags |= ISKNOW;
63: when RING:
64: r_know[obj->o_which] = TRUE;
65: obj->o_flags |= ISKNOW;
66: if (r_guess[obj->o_which])
67: {
68: free(r_guess[obj->o_which]);
69: r_guess[obj->o_which] = NULL;
70: }
71: }
72: msg(inv_name(obj, FALSE));
73: }
74:
75: /*
76: * create_obj:
77: * Wizard command for getting anything he wants
78: */
79:
80: void
81: create_obj()
82: {
83: struct linked_list *item;
84: struct object *obj;
85: int bless;
86: int ch;
87:
88: item = new_item(sizeof *obj);
89: obj = (struct object *) ldata(item);
90: msg("Type of item: ");
91: obj->o_type = readchar(cw);
92: mpos = 0;
93: msg("Which %c do you want? (0-f)", obj->o_type);
94: obj->o_which = (isdigit((ch = readchar(cw))) ? ch - '0' : ch - 'a' + 10);
95: obj->o_group = 0;
96: obj->o_count = 1;
97: mpos = 0;
98: if (obj->o_type == WEAPON || obj->o_type == ARMOR)
99: {
100: msg("Blessing? (+,-,n)");
101: bless = readchar(cw);
102: mpos = 0;
103: if (obj->o_type == WEAPON)
104: {
105: init_weapon(obj, obj->o_which);
106: if (bless == '-') {
107: obj->o_hplus -= rnd(3)+1;
108: obj->o_flags |= ISCURSED;
109: }
110: if (bless == '+')
111: obj->o_hplus += rnd(3)+1;
112: }
113: else
114: {
115: obj->o_ac = a_class[obj->o_which];
116: if (bless == '-') {
117: obj->o_ac += rnd(3)+1;
118: obj->o_flags |= ISCURSED;
119: }
120: if (bless == '+')
121: obj->o_ac -= rnd(3)+1;
122: }
123: }
124: else if (obj->o_type == RING)
125: switch (obj->o_which)
126: {
127: case R_PROTECT:
128: case R_ADDSTR:
129: case R_ADDHIT:
130: case R_ADDDAM:
131: msg("Blessing? (+,-,n)");
132: bless = readchar(cw);
133: mpos = 0;
134: if (bless == '-')
135: obj->o_flags |= ISCURSED;
136: obj->o_ac = (bless == '-' ? -1 : rnd(2) + 1);
137: }
138: else if (obj->o_type == STICK)
139: fix_stick(obj);
140: add_pack(item, FALSE);
141: }
142:
143: /*
144: * telport:
145: * Bamf the hero someplace else
146: */
147:
148: int
149: teleport()
150: {
151: int rm;
152: coord c;
153:
154: c = hero;
155: mvwaddch(cw, hero.y, hero.x, mvwinch(stdscr, hero.y, hero.x));
156: do
157: {
158: rm = rnd_room();
159: rnd_pos(&rooms[rm], &hero);
160: } until(winat(hero.y, hero.x) == FLOOR);
161: light(&c);
162: light(&hero);
163: mvwaddch(cw, hero.y, hero.x, PLAYER);
164: /*
165: * turn off ISHELD in case teleportation was done while fighting
166: * a Fungi
167: */
168: if (on(player, ISHELD)) {
169: struct linked_list *item;
170: struct thing *mon;
171:
172: player.t_flags &= ~ISHELD;
173: fung_hit = 0;
174: for (item = mlist; item != NULL; item = next(item)) {
175: mon = (struct thing *) ldata(item);
176: if (mon->t_type == 'F')
177: strcpy(mon->t_stats.s_dmg, "000d0");
178: }
179: }
180: count = 0;
181: running = FALSE;
182: flush_type(); /* flush typeahead */
183: return rm;
184: }
185:
186: /*
187: * passwd:
188: * see if user knows password
189: */
190:
191: int
192: passwd()
193: {
194: char *sp, c;
195: char buf[80];
196:
197: msg("Wizard's Password:");
198: mpos = 0;
199: sp = buf;
200: while ((c = readchar(cw)) != '\n' && c != '\r' && c != '\033')
201: if (c == md_killchar())
202: sp = buf;
203: else if (c == md_erasechar() && sp > buf)
204: sp--;
205: else
206: *sp++ = c;
207: if (sp == buf)
208: return FALSE;
209: *sp = '\0';
210: return (strcmp(PASSWD, crypt(buf, "mT")) == 0);
211: }
CVSweb