|
|
1.1 root 1: /*
2: * Copyright (c) 1988 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * This code is derived from software contributed to Berkeley by
6: * Timothy C. Stoehr.
7: *
8: * Redistribution and use in source and binary forms are permitted
9: * provided that: (1) source distributions retain this entire copyright
10: * notice and comment, and (2) distributions including binaries display
11: * the following acknowledgement: ``This product includes software
12: * developed by the University of California, Berkeley and its contributors''
13: * in the documentation or other materials provided with the distribution
14: * and in all advertising materials mentioning features or use of this
15: * software. Neither the name of the University nor the names of its
16: * contributors may be used to endorse or promote products derived
17: * from this software without specific prior written permission.
18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
19: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
20: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21: */
22:
23: #ifndef lint
24: static char sccsid[] = "@(#)use.c 5.3 (Berkeley) 6/1/90";
25: #endif /* not lint */
26:
27: /*
28: * use.c
29: *
30: * This source herein may be modified and/or distributed by anybody who
31: * so desires, with the following restrictions:
32: * 1.) No portion of this notice shall be removed.
33: * 2.) Credit shall not be taken for the creation of this source.
34: * 3.) This code is not to be traded, sold, or used for personal
35: * gain or profit.
36: *
37: */
38:
39: #include "rogue.h"
40:
41: short halluc = 0;
42: short blind = 0;
43: short confused = 0;
44: short levitate = 0;
45: short haste_self = 0;
46: boolean see_invisible = 0;
47: short extra_hp = 0;
48: boolean detect_monster = 0;
49: boolean con_mon = 0;
50: char *strange_feeling = "you have a strange feeling for a moment, then it passes";
51:
52: extern short bear_trap;
53: extern char hunger_str[];
54: extern short cur_room;
55: extern long level_points[];
56: extern boolean being_held;
57: extern char *fruit, *you_can_move_again;
58: extern boolean sustain_strength;
59:
60: quaff()
61: {
62: short ch;
63: char buf[80];
64: object *obj;
65:
66: ch = pack_letter("quaff what?", POTION);
67:
68: if (ch == CANCEL) {
69: return;
70: }
71: if (!(obj = get_letter_object(ch))) {
72: message("no such item.", 0);
73: return;
74: }
75: if (obj->what_is != POTION) {
76: message("you can't drink that", 0);
77: return;
78: }
79: switch(obj->which_kind) {
80: case INCREASE_STRENGTH:
81: message("you feel stronger now, what bulging muscles!",
82: 0);
83: rogue.str_current++;
84: if (rogue.str_current > rogue.str_max) {
85: rogue.str_max = rogue.str_current;
86: }
87: break;
88: case RESTORE_STRENGTH:
89: rogue.str_current = rogue.str_max;
90: message("this tastes great, you feel warm all over", 0);
91: break;
92: case HEALING:
93: message("you begin to feel better", 0);
94: potion_heal(0);
95: break;
96: case EXTRA_HEALING:
97: message("you begin to feel much better", 0);
98: potion_heal(1);
99: break;
100: case POISON:
101: if (!sustain_strength) {
102: rogue.str_current -= get_rand(1, 3);
103: if (rogue.str_current < 1) {
104: rogue.str_current = 1;
105: }
106: }
107: message("you feel very sick now", 0);
108: if (halluc) {
109: unhallucinate();
110: }
111: break;
112: case RAISE_LEVEL:
113: rogue.exp_points = level_points[rogue.exp - 1];
114: message("you suddenly feel much more skillful", 0);
115: add_exp(1, 1);
116: break;
117: case BLINDNESS:
118: go_blind();
119: break;
120: case HALLUCINATION:
121: message("oh wow, everything seems so cosmic", 0);
122: halluc += get_rand(500, 800);
123: break;
124: case DETECT_MONSTER:
125: show_monsters();
126: if (!(level_monsters.next_monster)) {
127: message(strange_feeling, 0);
128: }
129: break;
130: case DETECT_OBJECTS:
131: if (level_objects.next_object) {
132: if (!blind) {
133: show_objects();
134: }
135: } else {
136: message(strange_feeling, 0);
137: }
138: break;
139: case CONFUSION:
140: message((halluc ? "what a trippy feeling" :
141: "you feel confused"), 0);
142: cnfs();
143: break;
144: case LEVITATION:
145: message("you start to float in the air", 0);
146: levitate += get_rand(15, 30);
147: being_held = bear_trap = 0;
148: break;
149: case HASTE_SELF:
150: message("you feel yourself moving much faster", 0);
151: haste_self += get_rand(11, 21);
152: if (!(haste_self % 2)) {
153: haste_self++;
154: }
155: break;
156: case SEE_INVISIBLE:
157: sprintf(buf, "hmm, this potion tastes like %sjuice", fruit);
158: message(buf, 0);
159: if (blind) {
160: unblind();
161: }
162: see_invisible = 1;
163: relight();
164: break;
165: }
166: print_stats((STAT_STRENGTH | STAT_HP));
167: if (id_potions[obj->which_kind].id_status != CALLED) {
168: id_potions[obj->which_kind].id_status = IDENTIFIED;
169: }
170: vanish(obj, 1, &rogue.pack);
171: }
172:
173: read_scroll()
174: {
175: short ch;
176: object *obj;
177: char msg[DCOLS];
178:
179: ch = pack_letter("read what?", SCROL);
180:
181: if (ch == CANCEL) {
182: return;
183: }
184: if (!(obj = get_letter_object(ch))) {
185: message("no such item.", 0);
186: return;
187: }
188: if (obj->what_is != SCROL) {
189: message("you can't read that", 0);
190: return;
191: }
192: switch(obj->which_kind) {
193: case SCARE_MONSTER:
194: message("you hear a maniacal laughter in the distance",
195: 0);
196: break;
197: case HOLD_MONSTER:
198: hold_monster();
199: break;
200: case ENCH_WEAPON:
201: if (rogue.weapon) {
202: if (rogue.weapon->what_is == WEAPON) {
203: sprintf(msg, "your %sglow%s %sfor a moment",
204: name_of(rogue.weapon),
205: ((rogue.weapon->quantity <= 1) ? "s" : ""),
206: get_ench_color());
207: message(msg, 0);
208: if (coin_toss()) {
209: rogue.weapon->hit_enchant++;
210: } else {
211: rogue.weapon->d_enchant++;
212: }
213: }
214: rogue.weapon->is_cursed = 0;
215: } else {
216: message("your hands tingle", 0);
217: }
218: break;
219: case ENCH_ARMOR:
220: if (rogue.armor) {
221: sprintf(msg, "your armor glows %sfor a moment",
222: get_ench_color());
223: message(msg, 0);
224: rogue.armor->d_enchant++;
225: rogue.armor->is_cursed = 0;
226: print_stats(STAT_ARMOR);
227: } else {
228: message("your skin crawls", 0);
229: }
230: break;
231: case IDENTIFY:
232: message("this is a scroll of identify", 0);
233: obj->identified = 1;
234: id_scrolls[obj->which_kind].id_status = IDENTIFIED;
235: idntfy();
236: break;
237: case TELEPORT:
238: tele();
239: break;
240: case SLEEP:
241: message("you fall asleep", 0);
242: take_a_nap();
243: break;
244: case PROTECT_ARMOR:
245: if (rogue.armor) {
246: message( "your armor is covered by a shimmering gold shield",0);
247: rogue.armor->is_protected = 1;
248: rogue.armor->is_cursed = 0;
249: } else {
250: message("your acne seems to have disappeared", 0);
251: }
252: break;
253: case REMOVE_CURSE:
254: message((!halluc) ?
255: "you feel as though someone is watching over you" :
256: "you feel in touch with the universal oneness", 0);
257: uncurse_all();
258: break;
259: case CREATE_MONSTER:
260: create_monster();
261: break;
262: case AGGRAVATE_MONSTER:
263: aggravate();
264: break;
265: case MAGIC_MAPPING:
266: message("this scroll seems to have a map on it", 0);
267: draw_magic_map();
268: break;
269: case CON_MON:
270: con_mon = 1;
271: sprintf(msg, "your hands glow %sfor a moment", get_ench_color());
272: message(msg, 0);
273: break;
274: }
275: if (id_scrolls[obj->which_kind].id_status != CALLED) {
276: id_scrolls[obj->which_kind].id_status = IDENTIFIED;
277: }
278: vanish(obj, (obj->which_kind != SLEEP), &rogue.pack);
279: }
280:
281: /* vanish() does NOT handle a quiver of weapons with more than one
282: * arrow (or whatever) in the quiver. It will only decrement the count.
283: */
284:
285: vanish(obj, rm, pack)
286: object *obj;
287: short rm;
288: object *pack;
289: {
290: if (obj->quantity > 1) {
291: obj->quantity--;
292: } else {
293: if (obj->in_use_flags & BEING_WIELDED) {
294: unwield(obj);
295: } else if (obj->in_use_flags & BEING_WORN) {
296: unwear(obj);
297: } else if (obj->in_use_flags & ON_EITHER_HAND) {
298: un_put_on(obj);
299: }
300: take_from_pack(obj, pack);
301: free_object(obj);
302: }
303: if (rm) {
304: (void) reg_move();
305: }
306: }
307:
308: potion_heal(extra)
309: {
310: float ratio;
311: short add;
312:
313: rogue.hp_current += rogue.exp;
314:
315: ratio = ((float)rogue.hp_current) / rogue.hp_max;
316:
317: if (ratio >= 1.00) {
318: rogue.hp_max += (extra ? 2 : 1);
319: extra_hp += (extra ? 2 : 1);
320: rogue.hp_current = rogue.hp_max;
321: } else if (ratio >= 0.90) {
322: rogue.hp_max += (extra ? 1 : 0);
323: extra_hp += (extra ? 1 : 0);
324: rogue.hp_current = rogue.hp_max;
325: } else {
326: if (ratio < 0.33) {
327: ratio = 0.33;
328: }
329: if (extra) {
330: ratio += ratio;
331: }
332: add = (short)(ratio * ((float)rogue.hp_max - rogue.hp_current));
333: rogue.hp_current += add;
334: if (rogue.hp_current > rogue.hp_max) {
335: rogue.hp_current = rogue.hp_max;
336: }
337: }
338: if (blind) {
339: unblind();
340: }
341: if (confused && extra) {
342: unconfuse();
343: } else if (confused) {
344: confused = (confused / 2) + 1;
345: }
346: if (halluc && extra) {
347: unhallucinate();
348: } else if (halluc) {
349: halluc = (halluc / 2) + 1;
350: }
351: }
352:
353: idntfy()
354: {
355: short ch;
356: object *obj;
357: struct id *id_table;
358: char desc[DCOLS];
359: AGAIN:
360: ch = pack_letter("what would you like to identify?", ALL_OBJECTS);
361:
362: if (ch == CANCEL) {
363: return;
364: }
365: if (!(obj = get_letter_object(ch))) {
366: message("no such item, try again", 0);
367: message("", 0);
368: check_message();
369: goto AGAIN;
370: }
371: obj->identified = 1;
372: if (obj->what_is & (SCROL | POTION | WEAPON | ARMOR | WAND | RING)) {
373: id_table = get_id_table(obj);
374: id_table[obj->which_kind].id_status = IDENTIFIED;
375: }
376: get_desc(obj, desc);
377: message(desc, 0);
378: }
379:
380: eat()
381: {
382: short ch;
383: short moves;
384: object *obj;
385: char buf[70];
386:
387: ch = pack_letter("eat what?", FOOD);
388:
389: if (ch == CANCEL) {
390: return;
391: }
392: if (!(obj = get_letter_object(ch))) {
393: message("no such item.", 0);
394: return;
395: }
396: if (obj->what_is != FOOD) {
397: message("you can't eat that", 0);
398: return;
399: }
400: if ((obj->which_kind == FRUIT) || rand_percent(60)) {
401: moves = get_rand(950, 1150);
402: if (obj->which_kind == RATION) {
403: message("yum, that tasted good", 0);
404: } else {
405: sprintf(buf, "my, that was a yummy %s", fruit);
406: message(buf, 0);
407: }
408: } else {
409: moves = get_rand(750, 950);
410: message("yuk, that food tasted awful", 0);
411: add_exp(2, 1);
412: }
413: rogue.moves_left /= 3;
414: rogue.moves_left += moves;
415: hunger_str[0] = 0;
416: print_stats(STAT_HUNGER);
417:
418: vanish(obj, 1, &rogue.pack);
419: }
420:
421: hold_monster()
422: {
423: short i, j;
424: short mcount = 0;
425: object *monster;
426: short row, col;
427:
428: for (i = -2; i <= 2; i++) {
429: for (j = -2; j <= 2; j++) {
430: row = rogue.row + i;
431: col = rogue.col + j;
432: if ((row < MIN_ROW) || (row > (DROWS-2)) || (col < 0) ||
433: (col > (DCOLS-1))) {
434: continue;
435: }
436: if (dungeon[row][col] & MONSTER) {
437: monster = object_at(&level_monsters, row, col);
438: monster->m_flags |= ASLEEP;
439: monster->m_flags &= (~WAKENS);
440: mcount++;
441: }
442: }
443: }
444: if (mcount == 0) {
445: message("you feel a strange sense of loss", 0);
446: } else if (mcount == 1) {
447: message("the monster freezes", 0);
448: } else {
449: message("the monsters around you freeze", 0);
450: }
451: }
452:
453: tele()
454: {
455: mvaddch(rogue.row, rogue.col, get_dungeon_char(rogue.row, rogue.col));
456:
457: if (cur_room >= 0) {
458: darken_room(cur_room);
459: }
460: put_player(get_room_number(rogue.row, rogue.col));
461: being_held = 0;
462: bear_trap = 0;
463: }
464:
465: hallucinate()
466: {
467: object *obj, *monster;
468: short ch;
469:
470: if (blind) return;
471:
472: obj = level_objects.next_object;
473:
474: while (obj) {
475: ch = mvinch(obj->row, obj->col);
476: if (((ch < 'A') || (ch > 'Z')) &&
477: ((obj->row != rogue.row) || (obj->col != rogue.col)))
478: if ((ch != ' ') && (ch != '.') && (ch != '#') && (ch != '+')) {
479: addch(gr_obj_char());
480: }
481: obj = obj->next_object;
482: }
483: monster = level_monsters.next_monster;
484:
485: while (monster) {
486: ch = mvinch(monster->row, monster->col);
487: if ((ch >= 'A') && (ch <= 'Z')) {
488: addch(get_rand('A', 'Z'));
489: }
490: monster = monster->next_monster;
491: }
492: }
493:
494: unhallucinate()
495: {
496: halluc = 0;
497: relight();
498: message("everything looks SO boring now", 1);
499: }
500:
501: unblind()
502: {
503: blind = 0;
504: message("the veil of darkness lifts", 1);
505: relight();
506: if (halluc) {
507: hallucinate();
508: }
509: if (detect_monster) {
510: show_monsters();
511: }
512: }
513:
514: relight()
515: {
516: if (cur_room == PASSAGE) {
517: light_passage(rogue.row, rogue.col);
518: } else {
519: light_up_room(cur_room);
520: }
521: mvaddch(rogue.row, rogue.col, rogue.fchar);
522: }
523:
524: take_a_nap()
525: {
526: short i;
527:
528: i = get_rand(2, 5);
529: md_sleep(1);
530:
531: while (i--) {
532: mv_mons();
533: }
534: md_sleep(1);
535: message(you_can_move_again, 0);
536: }
537:
538: go_blind()
539: {
540: short i, j;
541:
542: if (!blind) {
543: message("a cloak of darkness falls around you", 0);
544: }
545: blind += get_rand(500, 800);
546:
547: if (detect_monster) {
548: object *monster;
549:
550: monster = level_monsters.next_monster;
551:
552: while (monster) {
553: mvaddch(monster->row, monster->col, monster->trail_char);
554: monster = monster->next_monster;
555: }
556: }
557: if (cur_room >= 0) {
558: for (i = rooms[cur_room].top_row + 1;
559: i < rooms[cur_room].bottom_row; i++) {
560: for (j = rooms[cur_room].left_col + 1;
561: j < rooms[cur_room].right_col; j++) {
562: mvaddch(i, j, ' ');
563: }
564: }
565: }
566: mvaddch(rogue.row, rogue.col, rogue.fchar);
567: }
568:
569: char *
570: get_ench_color()
571: {
572: if (halluc) {
573: return(id_potions[get_rand(0, POTIONS-1)].title);
574: } else if (con_mon) {
575: return("red ");
576: }
577: return("blue ");
578: }
579:
580: cnfs()
581: {
582: confused += get_rand(12, 22);
583: }
584:
585: unconfuse()
586: {
587: char msg[80];
588:
589: confused = 0;
590: sprintf(msg, "you feel less %s now", (halluc ? "trippy" : "confused"));
591: message(msg, 1);
592: }
593:
594: uncurse_all()
595: {
596: object *obj;
597:
598: obj = rogue.pack.next_object;
599:
600: while (obj) {
601: obj->is_cursed = 0;
602: obj = obj->next_object;
603: }
604: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.