|
|
1.1 root 1: /*
2: * Contains functions for dealing with things like
3: * potions and scrolls
4: *
5: * @(#)things.c 3.37 (Berkeley) 6/15/81
6: */
7:
8: #include <curses.h>
9: #include <ctype.h>
10: #include "rogue.h"
11:
12: /*
13: * inv_name:
14: * return the name of something as it would appear in an
15: * inventory.
16: */
17: char *
18: inv_name(obj, drop)
19: register struct object *obj;
20: register bool drop;
21: {
22: register char *pb;
23:
24: switch(obj->o_type)
25: {
26: when SCROLL:
27: if (obj->o_count == 1)
28: strcpy(prbuf, "A scroll ");
29: else
30: sprintf(prbuf, "%d scrolls ", obj->o_count);
31: pb = &prbuf[strlen(prbuf)];
32: if (s_know[obj->o_which])
33: sprintf(pb, "of %s", s_magic[obj->o_which].mi_name);
34: else if (s_guess[obj->o_which])
35: sprintf(pb, "called %s", s_guess[obj->o_which]);
36: else
37: sprintf(pb, "titled '%s'", s_names[obj->o_which]);
38: when POTION:
39: if (obj->o_count == 1)
40: strcpy(prbuf, "A potion ");
41: else
42: sprintf(prbuf, "%d potions ", obj->o_count);
43: pb = &prbuf[strlen(prbuf)];
44: if (p_know[obj->o_which])
45: sprintf(pb, "of %s(%s)", p_magic[obj->o_which].mi_name,
46: p_colors[obj->o_which]);
47: else if (p_guess[obj->o_which])
48: sprintf(pb, "called %s(%s)", p_guess[obj->o_which],
49: p_colors[obj->o_which]);
50: else if (obj->o_count == 1)
51: sprintf(prbuf, "A%s %s potion",
52: vowelstr(p_colors[obj->o_which]),
53: p_colors[obj->o_which]);
54: else
55: sprintf(prbuf, "%d %s potions", obj->o_count,
56: p_colors[obj->o_which]);
57: when FOOD:
58: if (obj->o_which == 1)
59: if (obj->o_count == 1)
60: sprintf(prbuf, "A%s %s", vowelstr(fruit), fruit);
61: else
62: sprintf(prbuf, "%d %ss", obj->o_count, fruit);
63: else
64: if (obj->o_count == 1)
65: strcpy(prbuf, "Some food");
66: else
67: sprintf(prbuf, "%d rations of food", obj->o_count);
68: when WEAPON:
69: if (obj->o_count > 1)
70: sprintf(prbuf, "%d ", obj->o_count);
71: else
72: strcpy(prbuf, "A ");
73: pb = &prbuf[strlen(prbuf)];
74: if (obj->o_flags & ISKNOW)
75: sprintf(pb, "%s %s", num(obj->o_hplus, obj->o_dplus),
76: w_names[obj->o_which]);
77: else
78: sprintf(pb, "%s", w_names[obj->o_which]);
79: if (obj->o_count > 1)
80: strcat(prbuf, "s");
81: when ARMOR:
82: if (obj->o_flags & ISKNOW)
83: sprintf(prbuf, "%s %s",
84: num(a_class[obj->o_which] - obj->o_ac, 0),
85: a_names[obj->o_which]);
86: else
87: sprintf(prbuf, "%s", a_names[obj->o_which]);
88: when AMULET:
89: strcpy(prbuf, "The Amulet of Yendor");
90: when STICK:
91: sprintf(prbuf, "A %s ", ws_type[obj->o_which]);
92: pb = &prbuf[strlen(prbuf)];
93: if (ws_know[obj->o_which])
94: sprintf(pb, "of %s%s(%s)", ws_magic[obj->o_which].mi_name,
95: charge_str(obj), ws_made[obj->o_which]);
96: else if (ws_guess[obj->o_which])
97: sprintf(pb, "called %s(%s)", ws_guess[obj->o_which],
98: ws_made[obj->o_which]);
99: else
100: sprintf(&prbuf[2], "%s %s", ws_made[obj->o_which],
101: ws_type[obj->o_which]);
102: when RING:
103: if (r_know[obj->o_which])
104: sprintf(prbuf, "A%s ring of %s(%s)", ring_num(obj),
105: r_magic[obj->o_which].mi_name, r_stones[obj->o_which]);
106: else if (r_guess[obj->o_which])
107: sprintf(prbuf, "A ring called %s(%s)",
108: r_guess[obj->o_which], r_stones[obj->o_which]);
109: else
110: sprintf(prbuf, "A%s %s ring", vowelstr(r_stones[obj->o_which]),
111: r_stones[obj->o_which]);
112: otherwise:
113: debug("Picked up something funny");
114: sprintf(prbuf, "Something bizarre %s", unctrl(obj->o_type));
115: }
116: if (obj == cur_armor)
117: strcat(prbuf, " (being worn)");
118: if (obj == cur_weapon)
119: strcat(prbuf, " (weapon in hand)");
120: if (obj == cur_ring[LEFT])
121: strcat(prbuf, " (on left hand)");
122: else if (obj == cur_ring[RIGHT])
123: strcat(prbuf, " (on right hand)");
124: if (drop && isupper(prbuf[0]))
125: prbuf[0] = tolower(prbuf[0]);
126: else if (!drop && islower(*prbuf))
127: *prbuf = toupper(*prbuf);
128: if (!drop)
129: strcat(prbuf, ".");
130: return prbuf;
131: }
132:
133: /*
134: * money:
135: * Add to characters purse
136: */
137: money()
138: {
139: register struct room *rp;
140:
141: for (rp = rooms; rp < &rooms[MAXROOMS]; rp++)
142: if (ce(hero, rp->r_gold))
143: {
144: if (notify)
145: {
146: if (!terse)
147: addmsg("You found ");
148: msg("%d gold pieces.", rp->r_goldval);
149: }
150: purse += rp->r_goldval;
151: rp->r_goldval = 0;
152: cmov(rp->r_gold);
153: addch(FLOOR);
154: return;
155: }
156: msg("That gold must have been counterfeit");
157: }
158:
159: /*
160: * drop:
161: * put something down
162: */
163: drop()
164: {
165: register char ch;
166: register struct linked_list *obj, *nobj;
167: register struct object *op;
168:
169: ch = mvwinch(stdscr, hero.y, hero.x);
170: if (ch != FLOOR && ch != PASSAGE)
171: {
172: msg("There is something there already");
173: return;
174: }
175: if ((obj = get_item("drop", 0)) == NULL)
176: return;
177: op = (struct object *) ldata(obj);
178: if (!dropcheck(op))
179: return;
180: /*
181: * Take it out of the pack
182: */
183: if (op->o_count >= 2 && op->o_type != WEAPON)
184: {
185: nobj = new_item(sizeof *op);
186: op->o_count--;
187: op = (struct object *) ldata(nobj);
188: *op = *((struct object *) ldata(obj));
189: op->o_count = 1;
190: obj = nobj;
191: if (op->o_group != 0)
192: inpack++;
193: }
194: else
195: detach(pack, obj);
196: inpack--;
197: /*
198: * Link it into the level object list
199: */
200: attach(lvl_obj, obj);
201: mvaddch(hero.y, hero.x, op->o_type);
202: op->o_pos = hero;
203: msg("Dropped %s", inv_name(op, TRUE));
204: }
205:
206: /*
207: * do special checks for dropping or unweilding|unwearing|unringing
208: */
209: dropcheck(op)
210: register struct object *op;
211: {
212: str_t save_max;
213:
214: if (op == NULL)
215: return TRUE;
216: if (op != cur_armor && op != cur_weapon
217: && op != cur_ring[LEFT] && op != cur_ring[RIGHT])
218: return TRUE;
219: if (op->o_flags & ISCURSED)
220: {
221: msg("You can't. It appears to be cursed.");
222: return FALSE;
223: }
224: if (op == cur_weapon)
225: cur_weapon = NULL;
226: else if (op == cur_armor)
227: {
228: waste_time();
229: cur_armor = NULL;
230: }
231: else if (op == cur_ring[LEFT] || op == cur_ring[RIGHT])
232: {
233: switch (op->o_which)
234: {
235: case R_ADDSTR:
236: save_max = max_stats.s_str;
237: chg_str(-op->o_ac);
238: max_stats.s_str = save_max;
239: break;
240: case R_SEEINVIS:
241: player.t_flags &= ~CANSEE;
242: extinguish(unsee);
243: light(&hero);
244: mvwaddch(cw, hero.y, hero.x, PLAYER);
245: break;
246: }
247: cur_ring[op == cur_ring[LEFT] ? LEFT : RIGHT] = NULL;
248: }
249: return TRUE;
250: }
251:
252: /*
253: * return a new thing
254: */
255: struct linked_list *
256: new_thing()
257: {
258: register struct linked_list *item;
259: register struct object *cur;
260: register int j, k;
261:
262: item = new_item(sizeof *cur);
263: cur = (struct object *) ldata(item);
264: cur->o_hplus = cur->o_dplus = 0;
265: cur->o_damage = cur->o_hurldmg = "0d0";
266: cur->o_ac = 11;
267: cur->o_count = 1;
268: cur->o_group = 0;
269: cur->o_flags = 0;
270: /*
271: * Decide what kind of object it will be
272: * If we haven't had food for a while, let it be food.
273: */
274: switch (no_food > 3 ? 2 : pick_one(things, NUMTHINGS))
275: {
276: when 0:
277: cur->o_type = POTION;
278: cur->o_which = pick_one(p_magic, MAXPOTIONS);
279: when 1:
280: cur->o_type = SCROLL;
281: cur->o_which = pick_one(s_magic, MAXSCROLLS);
282: when 2:
283: no_food = 0;
284: cur->o_type = FOOD;
285: if (rnd(100) > 10)
286: cur->o_which = 0;
287: else
288: cur->o_which = 1;
289: when 3:
290: cur->o_type = WEAPON;
291: cur->o_which = rnd(MAXWEAPONS);
292: init_weapon(cur, cur->o_which);
293: if ((k = rnd(100)) < 10)
294: {
295: cur->o_flags |= ISCURSED;
296: cur->o_hplus -= rnd(3)+1;
297: }
298: else if (k < 15)
299: cur->o_hplus += rnd(3)+1;
300: when 4:
301: cur->o_type = ARMOR;
302: for (j = 0, k = rnd(100); j < MAXARMORS; j++)
303: if (k < a_chances[j])
304: break;
305: if (j == MAXARMORS)
306: {
307: debug("Picked a bad armor %d", k);
308: j = 0;
309: }
310: cur->o_which = j;
311: cur->o_ac = a_class[j];
312: if ((k = rnd(100)) < 20)
313: {
314: cur->o_flags |= ISCURSED;
315: cur->o_ac += rnd(3)+1;
316: }
317: else if (k < 28)
318: cur->o_ac -= rnd(3)+1;
319: when 5:
320: cur->o_type = RING;
321: cur->o_which = pick_one(r_magic, MAXRINGS);
322: switch (cur->o_which)
323: {
324: when R_ADDSTR:
325: case R_PROTECT:
326: case R_ADDHIT:
327: case R_ADDDAM:
328: if ((cur->o_ac = rnd(3)) == 0)
329: {
330: cur->o_ac = -1;
331: cur->o_flags |= ISCURSED;
332: }
333: when R_AGGR:
334: case R_TELEPORT:
335: cur->o_flags |= ISCURSED;
336: }
337: when 6:
338: cur->o_type = STICK;
339: cur->o_which = pick_one(ws_magic, MAXSTICKS);
340: fix_stick(cur);
341: otherwise:
342: debug("Picked a bad kind of object");
343: wait_for(' ');
344: }
345: return item;
346: }
347:
348: /*
349: * pick an item out of a list of nitems possible magic items
350: */
351: pick_one(magic, nitems)
352: register struct magic_item *magic;
353: int nitems;
354: {
355: register struct magic_item *end;
356: register int i;
357: register struct magic_item *start;
358:
359: start = magic;
360: for (end = &magic[nitems], i = rnd(100); magic < end; magic++)
361: if (i < magic->mi_prob)
362: break;
363: if (magic == end)
364: {
365: if (wizard)
366: {
367: msg("bad pick_one: %d from %d items", i, nitems);
368: for (magic = start; magic < end; magic++)
369: msg("%s: %d%%", magic->mi_name, magic->mi_prob);
370: }
371: magic = start;
372: }
373: return magic - start;
374: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.