# 2.11BSD#431 - /usr/src/games/rogue/use.c

##### Functions

    cnfs              X
    eat               X
    get_ench_color    X
    go_blind          X
    hallucinate       X
    hold_monster      X
    idntfy            X
    potion_heal       X
    quaff             X
    read_scroll       X
    relight           X
    take_a_nap        X
    tele              X
    unblind           X
    unconfuse         X
    uncurse_all       X
    unhallucinate     X
    vanish            X

##### Variables

    blind             X
    confused          X
    extra_hp          X
    halluc            X
    haste_self        X
    levitate          X
    strange_feeling   X

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

#### Defined functions

cnfs defined in line 558; used 2 times

- in line 120
- in /usr/src/games/rogue/spec_hit.c line 437

eat defined in line 358; used 1 times

- in /usr/src/games/rogue/play.c line 94

get_ench_color defined in line 547; used 4 times

- in line 184, 200, 249
- in /usr/src/games/rogue/rogue.h line 401

go_blind defined in line 516; used 1 times

- in line 96

hallucinate defined in line 443; used 2 times

- in line 485
- in /usr/src/games/rogue/move.c line 426

hold_monster defined in line 399; used 1 times

- in line 176

idntfy defined in line 331; used 1 times

- in line 213

potion_heal defined in line 286; used 2 times

- in line 72-76(2)

quaff defined in line 38; used 1 times

- in /usr/src/games/rogue/play.c line 97

read_scroll defined in line 151; used 1 times

- in /usr/src/games/rogue/play.c line 100

relight defined in line 492; used 6 times

- in line 141, 475, 483
- in /usr/src/games/rogue/ring.c line 298
- in /usr/src/games/rogue/zap.c line 71, 235

take_a_nap defined in line 502; used 2 times

- in line 220
- in /usr/src/games/rogue/trap.c line 101

tele defined in line 431; used 3 times

- in line 216
- in /usr/src/games/rogue/move.c line 63
- in /usr/src/games/rogue/trap.c line 82

unblind defined in line 479; used 3 times

- in line 138, 317
- in /usr/src/games/rogue/move.c line 431

unconfuse defined in line 563; used 2 times

- in line 320
- in /usr/src/games/rogue/move.c line 436

uncurse_all defined in line 572; used 1 times

- in line 235

unhallucinate defined in line 472; used 3 times

- in line 87, 325
- in /usr/src/games/rogue/move.c line 424

vanish defined in line 263; used 6 times

- in line 148, 256, 396
- in /usr/src/games/rogue/pack.c line 86
- in /usr/src/games/rogue/spec_hit.c line 180
- in /usr/src/games/rogue/throw.c line 83

#### Defined variables

blind defined in line 20; used 26 times

- in line 110, 137, 316, 448, 481, 520-523(2)
- in /usr/src/games/rogue/monster.c line 228, 245, 434, 442, 545, 605, 690
- in /usr/src/games/rogue/move.c line 213, 429-430(2)
- in /usr/src/games/rogue/room.c line 69, 95, 117
- in /usr/src/games/rogue/save.c line 107(2), 178(2)
- in /usr/src/games/rogue/spec_hit.c line 324
- in /usr/src/games/rogue/trap.c line 227

confused defined in line 21; used 15 times

- in line 319-322(4), 560, 567
- in /usr/src/games/rogue/move.c line 41, 140, 210, 434-435(2)
- in /usr/src/games/rogue/save.c line 108(2), 179(2)

extra_hp defined in line 25; used 4 times

- in line 297-301(2)
- in /usr/src/games/rogue/level.c line 824-829(2)

halluc defined in line 19; used 19 times

- in line 86, 100, 118, 232, 324-327(4), 474, 484, 550, 568
- in /usr/src/games/rogue/monster.c line 549
- in /usr/src/games/rogue/move.c line 422-423(2)
- in /usr/src/games/rogue/save.c line 106(2), 177(2)

haste_self defined in line 23; used 10 times

- in line 129-131(3)
- in /usr/src/games/rogue/monster.c line 141
- in /usr/src/games/rogue/move.c line 450-451(2)
- in /usr/src/games/rogue/save.c line 110(2), 181(2)

levitate defined in line 22; used 13 times

- in line 124
- in /usr/src/games/rogue/level.c line 730
- in /usr/src/games/rogue/move.c line 98-101(2), 131, 442-443(2)
- in /usr/src/games/rogue/pack.c line 72
- in /usr/src/games/rogue/save.c line 109(2), 180(2)
- in /usr/src/games/rogue/spec_hit.c line 37

sccsid defined in line 14; never used
strange_feeling defined in line 28; used 2 times

- in line 105, 114

Last modified: 1987-11-26 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 2278 |