[BACK]Return to player.c CVS log [TXT][DIR] Up to [contributed] / early-roguelike / xrogue

Annotation of early-roguelike/xrogue/player.c, Revision 1.1

1.1     ! rubenllo    1: /*
        !             2:     player.c - functions for dealing with special player abilities
        !             3:
        !             4:     XRogue: Expeditions into the Dungeons of Doom
        !             5:     Copyright (C) 1991 Robert Pietkivitch
        !             6:     All rights reserved.
        !             7:
        !             8:     Based on "Advanced Rogue"
        !             9:     Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
        !            10:     All rights reserved.
        !            11:
        !            12:     See the file LICENSE.TXT for full copyright and licensing information.
        !            13: */
        !            14:
        !            15: #include <ctype.h>
        !            16: #include <string.h>
        !            17: #include <curses.h>
        !            18: #include "rogue.h"
        !            19:
        !            20: bool pick_spell(struct spells spells[], int ability, int num_spells, int power,
        !            21:                 const char *prompt, const char *type);
        !            22: /*
        !            23:  * affect:
        !            24:  *      cleric affecting undead
        !            25:  */
        !            26:
        !            27: void
        !            28: affect(void)
        !            29: {
        !            30:     register struct linked_list *item;
        !            31:     register struct thing *tp;
        !            32:     register char *mname;
        !            33:     bool see;
        !            34:     coord new_pos;
        !            35:     int lvl;
        !            36:
        !            37:     if (!(player.t_ctype == C_CLERIC  ||
        !            38:           (player.t_ctype == C_PALADIN && pstats.s_lvl > 4) ||
        !            39:           cur_relic[HEIL_ANKH] != 0)) {
        !            40:         msg("You cannot affect undead.");
        !            41:         return;
        !            42:     }
        !            43:
        !            44:     new_pos.y = hero.y + player.t_newpos.y;
        !            45:     new_pos.x = hero.x + player.t_newpos.x;
        !            46:
        !            47:     if (cansee(new_pos.y, new_pos.x)) see = TRUE;
        !            48:     else see = FALSE;
        !            49:
        !            50:     /* Anything there? */
        !            51:     if (new_pos.y < 0 || new_pos.y > lines-3 ||
        !            52:         new_pos.x < 0 || new_pos.x > cols-1 ||
        !            53:         mvwinch(mw, new_pos.y, new_pos.x) == ' ') {
        !            54:         msg("Nothing to affect.");
        !            55:         return;
        !            56:     }
        !            57:
        !            58:     if ((item = find_mons(new_pos.y, new_pos.x)) == 0) {
        !            59:         debug("Affect what @ %d,%d?", new_pos.y, new_pos.x);
        !            60:         return;
        !            61:     }
        !            62:     tp = THINGPTR(item);
        !            63:     mname = monster_name(tp);
        !            64:
        !            65:     if (on(player, ISINVIS) && off(*tp, CANSEE)) {
        !            66:         msg("%s%s cannot see you", see ? "The " : "It",
        !            67:             see ? mname : "");
        !            68:         return;
        !            69:     }
        !            70:
        !            71:     if (off(*tp, TURNABLE) || on(*tp, WASTURNED))
        !            72:         goto annoy;
        !            73:     turn_off(*tp, TURNABLE);
        !            74:
        !            75:     lvl = pstats.s_lvl;
        !            76:     if (player.t_ctype == C_PALADIN && cur_relic[HEIL_ANKH] == 0) {
        !            77:         lvl -= 4;
        !            78:     }
        !            79:     /* Can cleric kill it? */
        !            80:     if (lvl >= 3 * tp->t_stats.s_lvl) {
        !            81:         unsigned long test;      /* For overflow check */
        !            82:
        !            83:         msg("You have destroyed %s%s.", see ? "the " : "it", see ? mname : "");
        !            84:         test = pstats.s_exp + tp->t_stats.s_exp;
        !            85:
        !            86:         /* Be sure there is no overflow before increasing experience */
        !            87:         if (test > pstats.s_exp) pstats.s_exp = test;
        !            88:         killed(item, FALSE, TRUE, TRUE);
        !            89:         check_level();
        !            90:         return;
        !            91:     }
        !            92:
        !            93:     /* Can cleric turn it? */
        !            94:     if (rnd(100) + 1 >
        !            95:          (100 * ((2 * tp->t_stats.s_lvl) - lvl)) / lvl) {
        !            96:         unsigned long test;      /* Overflow test */
        !            97:
        !            98:         /* Make the monster flee */
        !            99:         turn_on(*tp, WASTURNED);        /* No more fleeing after this */
        !           100:         turn_on(*tp, ISFLEE);
        !           101:         runto(tp, &hero);
        !           102:
        !           103:         /* Disrupt it */
        !           104:         dsrpt_monster(tp, TRUE, TRUE);
        !           105:
        !           106:         /* Let player know */
        !           107:         msg("You have turned %s%s.", see ? "the " : "it", see ? mname : "");
        !           108:
        !           109:         /* get points for turning monster -- but check overflow first */
        !           110:         test = pstats.s_exp + tp->t_stats.s_exp/2;
        !           111:         if (test > pstats.s_exp) pstats.s_exp = test;
        !           112:         check_level();
        !           113:
        !           114:         /* If monster was suffocating, stop it */
        !           115:         if (on(*tp, DIDSUFFOCATE)) {
        !           116:             turn_off(*tp, DIDSUFFOCATE);
        !           117:             extinguish(suffocate);
        !           118:         }
        !           119:
        !           120:         /* If monster held us, stop it */
        !           121:         if (on(*tp, DIDHOLD) && (--hold_count == 0))
        !           122:                 turn_off(player, ISHELD);
        !           123:         turn_off(*tp, DIDHOLD);
        !           124:
        !           125:         /* It is okay to turn tail */
        !           126:         tp->t_oldpos = tp->t_pos;
        !           127:
        !           128:         return;
        !           129:     }
        !           130:
        !           131:     /* Otherwise -- no go */
        !           132: annoy:
        !           133:     if (see && tp->t_stats.s_intel > 16)
        !           134:         msg("%s laughs at you...", prname(mname, TRUE));
        !           135:     else
        !           136:         msg("You do not affect %s%s.", see ? "the " : "it", see ? mname : "");
        !           137:
        !           138:     /* Annoy monster */
        !           139:    if (off(*tp, ISFLEE)) runto(tp, &hero);
        !           140: }
        !           141:
        !           142: /*
        !           143:  * the cleric asks his deity for a spell
        !           144:  */
        !           145:
        !           146: void
        !           147: pray(void)
        !           148: {
        !           149:     register int num_prayers, prayer_ability, which_prayer;
        !           150:
        !           151:     which_prayer = num_prayers = prayer_ability =  0;
        !           152:
        !           153:     if (player.t_ctype != C_CLERIC  && player.t_ctype != C_PALADIN &&
        !           154:         cur_relic[HEIL_ANKH] == 0) {
        !           155:             msg("You are not permitted to pray.");
        !           156:             return;
        !           157:     }
        !           158:     if (cur_misc[WEAR_CLOAK] != NULL &&
        !           159:         cur_misc[WEAR_CLOAK]->o_which == MM_R_POWERLESS) {
        !           160:         msg("You can't seem to pray!");
        !           161:         return;
        !           162:     }
        !           163:
        !           164:     prayer_ability = pstats.s_lvl * pstats.s_wisdom - 5;
        !           165:     if (player.t_ctype != C_CLERIC)
        !           166:         prayer_ability /= 2;
        !           167:
        !           168:     if (cur_relic[HEIL_ANKH]) prayer_ability += 75;
        !           169:
        !           170:     if (player.t_action != C_PRAY) {
        !           171:         num_prayers = 0;
        !           172:
        !           173:         /* Get the number of avilable prayers */
        !           174:         if (pstats.s_wisdom > 16)
        !           175:             num_prayers += pstats.s_wisdom - 16;
        !           176:
        !           177:         num_prayers += pstats.s_lvl;
        !           178:         if (cur_relic[HEIL_ANKH])
        !           179:             num_prayers += pstats.s_wisdom - 18;
        !           180:
        !           181:         if (player.t_ctype != C_CLERIC)
        !           182:             num_prayers /= 2;
        !           183:
        !           184:         if (num_prayers > MAXPRAYERS)
        !           185:             num_prayers = MAXPRAYERS;
        !           186:         if (num_prayers < 1) {
        !           187:             msg("You are not permitted to pray yet.");
        !           188:             return;
        !           189:         }
        !           190:
        !           191:         /* Prompt for prayer */
        !           192:         if (pick_spell( cleric_spells,
        !           193:                         prayer_ability,
        !           194:                         num_prayers,
        !           195:                         pray_time,
        !           196:                         "offer",
        !           197:                         "prayer"))
        !           198:             player.t_action = C_PRAY;
        !           199:
        !           200:         return;
        !           201:     }
        !           202:
        !           203:     /* We've waited our required praying time. */
        !           204:     which_prayer = player.t_selection;
        !           205:     player.t_selection = 0;
        !           206:     player.t_action = A_NIL;
        !           207:
        !           208:     if (cleric_spells[which_prayer].s_cost + pray_time > prayer_ability) {
        !           209:         msg("Your prayer fails.");
        !           210:         return;
        !           211:     }
        !           212:
        !           213:     msg("Your prayer has been granted. ");
        !           214:
        !           215:     if (cleric_spells[which_prayer].s_type == TYP_POTION)
        !           216:         quaff(          cleric_spells[which_prayer].s_which,
        !           217:                         0,
        !           218:                         cleric_spells[which_prayer].s_flag,
        !           219:                         FALSE);
        !           220:     else if (cleric_spells[which_prayer].s_type == TYP_SCROLL)
        !           221:         read_scroll(    cleric_spells[which_prayer].s_which,
        !           222:                         cleric_spells[which_prayer].s_flag,
        !           223:                         FALSE);
        !           224:     else if (cleric_spells[which_prayer].s_type == TYP_STICK) {
        !           225:          if (!player_zap(cleric_spells[which_prayer].s_which,
        !           226:                          cleric_spells[which_prayer].s_flag)) {
        !           227:              after = FALSE;
        !           228:              return;
        !           229:          }
        !           230:     }
        !           231:     pray_time += cleric_spells[which_prayer].s_cost;
        !           232: }
        !           233:
        !           234: /*
        !           235:  * the magician is going to try and cast a spell
        !           236:  */
        !           237:
        !           238: void
        !           239: cast(void)
        !           240: {
        !           241:     register int spell_ability, which_spell, num_spells;
        !           242:
        !           243:     if (player.t_ctype != C_MAGICIAN && player.t_ctype != C_RANGER) {
        !           244:         msg("You are not permitted to cast spells.");
        !           245:         return;
        !           246:     }
        !           247:     if (cur_misc[WEAR_CLOAK] != NULL &&
        !           248:         cur_misc[WEAR_CLOAK]->o_which == MM_R_POWERLESS) {
        !           249:         msg("You can't seem to cast spells!");
        !           250:         return;
        !           251:     }
        !           252:     spell_ability = pstats.s_lvl * pstats.s_intel - 5;
        !           253:     if (player.t_ctype != C_MAGICIAN)
        !           254:         spell_ability /= 2;
        !           255:
        !           256:     if (player.t_action != C_CAST) {
        !           257:         /*
        !           258:          * Get the number of avilable spells
        !           259:          */
        !           260:         num_spells = 0;
        !           261:         if (pstats.s_intel > 16)
        !           262:             num_spells += pstats.s_intel - 16;
        !           263:
        !           264:         num_spells += pstats.s_lvl;
        !           265:         if (player.t_ctype != C_MAGICIAN)
        !           266:             num_spells /= 2;
        !           267:         if (num_spells > MAXSPELLS)
        !           268:             num_spells = MAXSPELLS;
        !           269:         if (num_spells < 1) {
        !           270:             msg("You are not allowed to cast spells yet.");
        !           271:             return;
        !           272:         }
        !           273:
        !           274:     /* prompt for spell */
        !           275:         if (pick_spell( magic_spells,
        !           276:                         spell_ability,
        !           277:                         num_spells,
        !           278:                         spell_power,
        !           279:                         "cast",
        !           280:                         "spell"))
        !           281:             player.t_action = C_CAST;
        !           282:         return;
        !           283:     }
        !           284:
        !           285:     /* We've waited our required casting time. */
        !           286:     which_spell = player.t_selection;
        !           287:     player.t_selection = 0;
        !           288:     player.t_action = A_NIL;
        !           289:
        !           290:     if ((spell_power + magic_spells[which_spell].s_cost) > spell_ability) {
        !           291:         msg("Your attempt fails.");
        !           292:         return;
        !           293:     }
        !           294:
        !           295:     msg("Your spell is successful. ");
        !           296:
        !           297:     if (magic_spells[which_spell].s_type == TYP_POTION)
        !           298:         quaff(  magic_spells[which_spell].s_which,
        !           299:                 0,
        !           300:                 magic_spells[which_spell].s_flag,
        !           301:                 FALSE);
        !           302:     else if (magic_spells[which_spell].s_type == TYP_SCROLL)
        !           303:         read_scroll(    magic_spells[which_spell].s_which,
        !           304:                         magic_spells[which_spell].s_flag,
        !           305:                         FALSE);
        !           306:     else if (magic_spells[which_spell].s_type == TYP_STICK) {
        !           307:          if (!player_zap(magic_spells[which_spell].s_which,
        !           308:                          magic_spells[which_spell].s_flag)) {
        !           309:              after = FALSE;
        !           310:              return;
        !           311:          }
        !           312:     }
        !           313:     spell_power += magic_spells[which_spell].s_cost;
        !           314: }
        !           315:
        !           316: /*
        !           317:  * the druid asks his deity for a spell
        !           318:  */
        !           319:
        !           320: void
        !           321: chant(void)
        !           322: {
        !           323:     register int num_chants, chant_ability, which_chant;
        !           324:
        !           325:     which_chant = num_chants = chant_ability = 0;
        !           326:
        !           327:     if (player.t_ctype != C_DRUID && player.t_ctype != C_MONK) {
        !           328:         msg("You are not permitted to chant.");
        !           329:         return;
        !           330:     }
        !           331:     if (cur_misc[WEAR_CLOAK] != NULL &&
        !           332:         cur_misc[WEAR_CLOAK]->o_which == MM_R_POWERLESS) {
        !           333:         msg("You can't seem to chant!");
        !           334:         return;
        !           335:     }
        !           336:     chant_ability = pstats.s_lvl * pstats.s_wisdom - 5;
        !           337:     if (player.t_ctype != C_DRUID)
        !           338:         chant_ability /= 2;
        !           339:
        !           340:     if (player.t_action != C_CHANT) {
        !           341:         num_chants = 0;
        !           342:
        !           343:         /* Get the number of avilable chants */
        !           344:         if (pstats.s_wisdom > 16)
        !           345:             num_chants += pstats.s_wisdom - 16;
        !           346:
        !           347:         num_chants += pstats.s_lvl;
        !           348:
        !           349:         if (player.t_ctype != C_DRUID)
        !           350:             num_chants /= 2;
        !           351:
        !           352:         if (num_chants > MAXCHANTS)
        !           353:             num_chants = MAXCHANTS;
        !           354:
        !           355:         if (num_chants < 1) {
        !           356:             msg("You are not permitted to chant yet.");
        !           357:             return;
        !           358:         }
        !           359:
        !           360:         /* Prompt for chant */
        !           361:         if (pick_spell( druid_spells,
        !           362:                         chant_ability,
        !           363:                         num_chants,
        !           364:                         chant_time,
        !           365:                         "sing",
        !           366:                         "chant"))
        !           367:             player.t_action = C_CHANT;
        !           368:
        !           369:         return;
        !           370:     }
        !           371:
        !           372:     /* We've waited our required chanting time. */
        !           373:     which_chant = player.t_selection;
        !           374:     player.t_selection = 0;
        !           375:     player.t_action = A_NIL;
        !           376:
        !           377:     if (druid_spells[which_chant].s_cost + chant_time > chant_ability) {
        !           378:         msg("Your chant fails.");
        !           379:         return;
        !           380:     }
        !           381:
        !           382:     msg("Your chant has been granted. ");
        !           383:
        !           384:     if (druid_spells[which_chant].s_type == TYP_POTION)
        !           385:         quaff(          druid_spells[which_chant].s_which,
        !           386:                         0,
        !           387:                         druid_spells[which_chant].s_flag,
        !           388:                         FALSE);
        !           389:     else if (druid_spells[which_chant].s_type == TYP_SCROLL)
        !           390:         read_scroll(    druid_spells[which_chant].s_which,
        !           391:                         druid_spells[which_chant].s_flag,
        !           392:                         FALSE);
        !           393:     else if (druid_spells[which_chant].s_type == TYP_STICK) {
        !           394:          if (!player_zap(druid_spells[which_chant].s_which,
        !           395:                          druid_spells[which_chant].s_flag)) {
        !           396:              after = FALSE;
        !           397:              return;
        !           398:          }
        !           399:     }
        !           400:     chant_time += druid_spells[which_chant].s_cost;
        !           401: }
        !           402:
        !           403: /* Constitution bonus */
        !           404:
        !           405: int
        !           406: const_bonus(void)   /* Hit point adjustment for changing levels */
        !           407: {
        !           408:     register int bonus;
        !           409:     if (pstats.s_const > 9 && pstats.s_const < 18)
        !           410:         bonus = 0;
        !           411:     else if (pstats.s_const >= 18 && pstats.s_const < 20)
        !           412:         bonus = 1;
        !           413:     else if (pstats.s_const >= 20 && pstats.s_const < 26)
        !           414:         bonus = 2;
        !           415:     else if (pstats.s_const >= 26 && pstats.s_const < 36)
        !           416:         bonus = 3;
        !           417:     else if (pstats.s_const >= 36)
        !           418:         bonus = 4;
        !           419:     else if (pstats.s_const > 7)
        !           420:         bonus = -1;
        !           421:     else
        !           422:         bonus = -2;
        !           423:     switch(player.t_ctype) {
        !           424:         case C_FIGHTER:         bonus = min(bonus, 11);
        !           425:         when C_RANGER:          bonus = min(bonus,  9);
        !           426:         when C_PALADIN:         bonus = min(bonus,  9);
        !           427:         when C_MAGICIAN:        bonus = min(bonus,  8);
        !           428:         when C_CLERIC:          bonus = min(bonus,  8);
        !           429:         when C_THIEF:           bonus = min(bonus, 10);
        !           430:         when C_ASSASSIN:        bonus = min(bonus, 10);
        !           431:         when C_DRUID:           bonus = min(bonus,  8);
        !           432:         when C_MONK:            bonus = min(bonus,  9);
        !           433:         otherwise:              bonus = min(bonus,  7);
        !           434:     }
        !           435:     return(bonus);
        !           436: }
        !           437:
        !           438: /*
        !           439:  * Give away slime-molds to monsters.  If monster is friendly,
        !           440:  * it will give you a "regular" food ration in return.  You have
        !           441:  * to give a slime-mold to Alteran (a unique monster) in order to
        !           442:  * get the special "Card of Alteran" quest item.  There's no other
        !           443:  * way to get this artifact and remain alive.
        !           444:  */
        !           445:
        !           446: void
        !           447: give(struct thing *th)
        !           448: {
        !           449:     /*
        !           450:      * Find any monster within one space of you
        !           451:      */
        !           452:     struct linked_list *ll;
        !           453:     struct object *lb;
        !           454:     register int x,y;
        !           455:     register struct linked_list *mon = NULL;
        !           456:     bool gotone = FALSE;
        !           457:
        !           458:     if (levtype != POSTLEV) {  /* no monsters at trading post  */
        !           459:         for (x = hero.x-1; x <= hero.x+1; x++) {
        !           460:             for (y = hero.y-1; y <= hero.y+1; y++) {
        !           461:                 if (y < 1 || x < 0 || y > lines - 3 || x > cols - 1)
        !           462:                     continue;
        !           463:                 if (isalpha(mvwinch(mw, y, x))) {
        !           464:                     if ((mon = find_mons(y, x)) != NULL) {
        !           465:                         gotone = TRUE;  /* found a monster to give away to */
        !           466:                         th = THINGPTR(mon);
        !           467:                     }
        !           468:                 }
        !           469:             }
        !           470:         }
        !           471:     }
        !           472:     if (gotone) {
        !           473:         if ((ll=get_item(pack, "give away", ALL, FALSE, FALSE)) != NULL) {
        !           474:             lb = OBJPTR(ll);
        !           475:             mpos = 0;
        !           476:             switch(lb->o_type) {
        !           477:                 case FOOD:
        !           478:                     switch (lb->o_which) {
        !           479:                         case E_SLIMEMOLD:   /* only slime-molds for now */
        !           480:                 if (on(*th, CANSELL)) {  /* quartermaster */
        !           481:                 msg("%s laughs at you. ");
        !           482:                 return;
        !           483:                 }
        !           484:                 if ((on(*th, ISFRIENDLY) || off(*th, ISMEAN)) &&
        !           485:                 off(*th, ISUNIQUE) && off(*th, CANSELL)) {
        !           486:                 turn_on(*th, ISRUN); /* we want him awake */
        !           487:                                 msg("%s accepts and promptly eats your gift of food.  --More--", prname(monster_name(th), TRUE));
        !           488:                 wait_for(' ');
        !           489:                     del_pack(ll); /* delete slime-mold */
        !           490:                           /* and add a food ration */
        !           491:                 create_obj(FALSE, FOOD, E_RATION);
        !           492:                 msg("%s gives you food in return and nods off to sleep. ", prname(monster_name(th), TRUE));
        !           493:                 turn_off(*th, ISRUN); /* put him to sleep */
        !           494:                 return;
        !           495:                 }
        !           496:                 else if (on(*th, CARRYCARD) && on(*th, ISUNIQUE)) {
        !           497:                 /* Now you get the Card of Alteran */
        !           498:                 msg("%s gives you a strange rectangular card. --More--", prname(monster_name(th), TRUE));
        !           499:                 wait_for(' ');
        !           500:                     del_pack(ll); /* get rid of slime-mold */
        !           501:                 create_obj(FALSE, RELIC, ALTERAN_CARD);
        !           502:                 msg("%s bids you farewell. ", prname(monster_name(th), TRUE));
        !           503:                 killed(mon, FALSE, FALSE, FALSE);
        !           504:                 return;
        !           505:                 }
        !           506:                 else if (on(*th, ISUNIQUE) && off(*th, ISMEAN)) {
        !           507:                 /* Dragons */
        !           508:                 msg("%s is set free by your generosity. ", prname(monster_name(th), TRUE));
        !           509:                     del_pack(ll);  /* get rid of it */
        !           510:                 /* just let him roam around */
        !           511:                 turn_on(*th, ISRUN);
        !           512:                 if (on(*th, ISFLEE)) turn_off(*th, ISFLEE);
        !           513:                 runto(th, &hero);
        !           514:                 th->t_action = A_NIL;
        !           515:                 return;
        !           516:                 }
        !           517:                 else if (on(*th, ISRUN) && off(*th, ISUNIQUE)) {
        !           518:                 /* if NOT sleeping and not a unique */
        !           519:                 switch (rnd(2)) {
        !           520:                     case 0: msg("%s ignores you. ", prname(monster_name(th), TRUE));
        !           521:                     when 1: {
        !           522:                     msg("%s nips at your hand. ", prname(monster_name(th), TRUE));
        !           523:                     if (rnd(100) < 10) {
        !           524:                                 del_pack(ll); /* delete it */
        !           525:                         if (off(*th, ISMEAN)) {
        !           526:                         msg("The slime-mold makes %s sleepy. ", prname(monster_name(th), TRUE));
        !           527:                         /* put him to sleep */
        !           528:                         turn_off(*th, ISRUN);
        !           529:                         return;
        !           530:                         }
        !           531:                         else {
        !           532:                         switch (rnd(2)) {
        !           533:                             case 0: msg("%s's eyes roll back. ", prname(monster_name(th), TRUE));
        !           534:                                 when 1: msg("%s becomes wanderlust. ", prname(monster_name(th), TRUE));
        !           535:                         }
        !           536:                         /* just let him roam around */
        !           537:                             turn_on(*th, ISRUN);
        !           538:                         if (on(*th, ISFLEE))
        !           539:                                         turn_off(*th, ISFLEE);
        !           540:                         runto(th, &hero);
        !           541:                         th->t_action = A_NIL;
        !           542:                         return;
        !           543:                         }
        !           544:                     }
        !           545:                     }
        !           546:                 }
        !           547:                 }
        !           548:                 else {
        !           549:                 msg("%s's mouth waters. ", prname(monster_name(th), TRUE));
        !           550:                 /* this wakes him up */
        !           551:                 if (off(*th, ISUNIQUE)) turn_on(*th, ISRUN);
        !           552:                 return;
        !           553:                 }
        !           554:                 otherwise:
        !           555:                 switch (rnd(3)) {  /* mention food (hint hint) */
        !           556:                     case 0: msg("You cannot give away the %s! ", foods[lb->o_which].mi_name);
        !           557:                     when 1: msg("The %s looks rancid! ", foods[lb->o_which].mi_name);
        !           558:                     when 2: msg("You change your mind. ");
        !           559:                 }
        !           560:                 return;
        !           561:                     }
        !           562:             otherwise:
        !           563:             switch (rnd(3)) {  /* do not mention other items */
        !           564:                     case 0: msg("You feel foolish. ");
        !           565:                     when 1: msg("You change your mind. ");
        !           566:                     when 2: msg("%s ignores you. ", prname(monster_name(th), TRUE));
        !           567:             }
        !           568:
        !           569:         return;
        !           570:             }
        !           571:         }
        !           572:     }
        !           573:     else msg("Your efforts are futile. ");
        !           574:     return;
        !           575: }
        !           576:
        !           577: /*
        !           578:  * Frighten a monster.  Useful for the 'good' characters.
        !           579:  */
        !           580:
        !           581: void
        !           582: fright(struct thing *th)
        !           583: {
        !           584:     /*
        !           585:      * Find any monster within one space of you
        !           586:      */
        !           587:     register int x,y;
        !           588:     register struct linked_list *mon;
        !           589:     bool gotone = FALSE;
        !           590:
        !           591:     if (levtype != POSTLEV) {  /* no monsters at trading post  */
        !           592:         for (x = hero.x-1; x <= hero.x+1; x++) {
        !           593:             for (y = hero.y-1; y <= hero.y+1; y++) {
        !           594:                 if (y < 1 || x < 0 || y > lines - 3 || x > cols - 1)
        !           595:                     continue;
        !           596:                 if (isalpha(mvwinch(mw, y, x))) {
        !           597:                     if ((mon = find_mons(y, x)) != NULL) {
        !           598:                         gotone = TRUE;  /* found a monster to give away to */
        !           599:                         th = THINGPTR(mon);
        !           600:                     }
        !           601:                 }
        !           602:             }
        !           603:         }
        !           604:     }
        !           605:     if (gotone) {  /* If 'good' character or is wearing a ring of fear */
        !           606:         if (player.t_ctype == C_RANGER || player.t_ctype == C_PALADIN ||
        !           607:             player.t_ctype == C_MONK   || ISWEARING(R_FEAR) != 0) {
        !           608:
        !           609:             player.t_action = A_NIL;
        !           610:             player.t_no_move = movement(&player);
        !           611:             switch (player.t_ctype) {
        !           612:                 case C_FIGHTER:   /* loss of strength */
        !           613:                     pstats.s_str--;
        !           614:                     if (pstats.s_str < 3) pstats.s_str = 3;
        !           615:                 when C_RANGER:    /* loss of charisma */
        !           616:         case C_PALADIN:
        !           617:                     pstats.s_charisma--;
        !           618:                     if (pstats.s_charisma < 3) pstats.s_charisma = 3;
        !           619:                 when C_CLERIC:    /* loss of wisdom */
        !           620:         case C_DRUID:
        !           621:                     pstats.s_wisdom--;
        !           622:                     if (pstats.s_wisdom < 3) pstats.s_wisdom = 3;
        !           623:                 when C_MAGICIAN:  /* loss of wisdom intelligence */
        !           624:             pstats.s_intel--;
        !           625:                     if (pstats.s_intel < 3) pstats.s_intel = 3;
        !           626:                 when C_THIEF:     /* loss of dexterity */
        !           627:                 case C_ASSASSIN:
        !           628:                     pstats.s_dext--;
        !           629:                     if (pstats.s_dext < 3) pstats.s_dext = 3;
        !           630:                 when C_MONK:      /* loss of constitution */
        !           631:                     pstats.s_const--;
        !           632:                     if (pstats.s_const < 3) pstats.s_const = 3;
        !           633:                 otherwise:        /* this msg can induce great fear */
        !           634:                     msg("You miss. ");
        !           635:         }
        !           636:
        !           637:         /* Cause a panic.  Good thru level 16. */
        !           638:             if (level < 17) {
        !           639:         msg("You wave your arms and yell! ");
        !           640:                 do_panic(th->t_index);
        !           641:                 pstats.s_hpt -= (pstats.s_hpt/2)+1;
        !           642:         if (pstats.s_hpt < 25) msg("You heart quivers... ");
        !           643:                 if (pstats.s_hpt < 1) {
        !           644:             msg("Your heart stops!!  --More--");
        !           645:             wait_for(' ');
        !           646:             pstats.s_hpt = -1;
        !           647:             death(D_FRIGHT);
        !           648:         }
        !           649:             return;
        !           650:         }
        !           651:         else {
        !           652:         /* He can't do it after level 16 */
        !           653:         switch (rnd(20)) {
        !           654:             case 0: case 2:
        !           655:             msg("You stamp your foot!! ");
        !           656:             when 4: case 8:
        !           657:             msg("%s laughs at you! ",prname(monster_name(th),TRUE));
        !           658:             when 10: case 12:
        !           659:             msg("You forget what you are doing? ");
        !           660:                 otherwise:
        !           661:                 msg(nothing);
        !           662:         }
        !           663:             return;
        !           664:         }
        !           665:     }
        !           666:         else {
        !           667:         switch (rnd(25)) {
        !           668:         case 0: case 2: case 4:
        !           669:         msg("You motion angrily! ");
        !           670:         when 6: case 8: case 10:
        !           671:         msg("You can't frighten anything. ");
        !           672:         when 12: case 14: case 16:
        !           673:         msg("Your puff up your face. ");
        !           674:         otherwise:
        !           675:         msg(nothing);
        !           676:         }
        !           677:     return;
        !           678:     }
        !           679:     }
        !           680:     else {
        !           681:     msg("There is nothing to fear but fear itself. ");
        !           682:     return;
        !           683:     }
        !           684: }
        !           685:
        !           686: /* Routines for thieves */
        !           687:
        !           688: /*
        !           689:  * gsense: Sense gold
        !           690:  */
        !           691:
        !           692: void
        !           693: gsense(void)
        !           694: {
        !           695:     /* Thief & assassin can do this, but fighter & ranger can later */
        !           696:     if (player.t_ctype == C_THIEF     || player.t_ctype == C_ASSASSIN ||
        !           697:         ((player.t_ctype == C_FIGHTER || player.t_ctype == C_RANGER)  &&
        !           698:     pstats.s_lvl >= 12)) {
        !           699:           read_scroll(S_GFIND, 0, FALSE);
        !           700:     }
        !           701:     else msg("You seem to have no gold sense.");
        !           702:     return;
        !           703: }
        !           704:
        !           705: /*
        !           706:  * xsense: Sense traps
        !           707:  */
        !           708:
        !           709: void
        !           710: xsense(void)
        !           711: {
        !           712:     /* Only thief can do this, but assassin, fighter, & monk can later */
        !           713:     if (player.t_ctype == C_THIEF   || ((player.t_ctype == C_ASSASSIN ||
        !           714:     player.t_ctype == C_FIGHTER || player.t_ctype == C_MONK)      &&
        !           715:     pstats.s_lvl >= 14)) {
        !           716:         read_scroll(S_FINDTRAPS, 0, FALSE);
        !           717:     }
        !           718:     else msg("You seem not to be able to sense traps.");
        !           719:     return;
        !           720: }
        !           721:
        !           722: /*
        !           723:  * steal:
        !           724:  *      Steal in direction given in delta
        !           725:  */
        !           726:
        !           727: void
        !           728: steal(void)
        !           729: {
        !           730:     register struct linked_list *item;
        !           731:     register struct thing *tp;
        !           732:     register char *mname;
        !           733:     coord new_pos;
        !           734:     int thief_bonus = -50;
        !           735:     bool isinvisible = FALSE;
        !           736:
        !           737:
        !           738:     /* let the fighter steal after level 15 */
        !           739:     if (player.t_ctype == C_FIGHTER && pstats.s_lvl < 15) {
        !           740:         msg(nothing);
        !           741:         return;
        !           742:     }
        !           743:     else if (player.t_ctype != C_THIEF    &&
        !           744:         player.t_ctype  != C_ASSASSIN &&
        !           745:             player.t_ctype  != C_FIGHTER) {
        !           746:             msg("Only thieves and assassins can steal.");
        !           747:             return;
        !           748:     }
        !           749:     if (on(player, ISBLIND)) {
        !           750:         msg("You can't see anything.");
        !           751:         return;
        !           752:     }
        !           753:
        !           754:     new_pos.y = hero.y + player.t_newpos.y;
        !           755:     new_pos.x = hero.x + player.t_newpos.x;
        !           756:
        !           757:     /* Anything there? */
        !           758:     if (new_pos.y < 0 || new_pos.y > lines-3 ||
        !           759:         new_pos.x < 0 || new_pos.x > cols-1 ||
        !           760:         mvwinch(mw, new_pos.y, new_pos.x) == ' ') {
        !           761:         msg("Nothing to steal from.");
        !           762:         return;
        !           763:     }
        !           764:
        !           765:     if ((item = find_mons(new_pos.y, new_pos.x)) == NULL)
        !           766:         debug("Steal from what @ %d,%d?", new_pos.y, new_pos.x);
        !           767:     tp = THINGPTR(item);
        !           768:     if (on(*tp, ISSTONE)) {
        !           769:         msg ("You can't steal from stone!");
        !           770:         return;
        !           771:     }
        !           772:
        !           773:     if (on(*tp, ISFLEE)) {
        !           774:         msg("You can't get your hand in anywhere! ");
        !           775:         return;
        !           776:     }
        !           777:
        !           778:     isinvisible = invisible(tp);
        !           779:     if (isinvisible) mname = "creature";
        !           780:     else mname = monster_name(tp);
        !           781:
        !           782:     /* Can player steal something unnoticed? */
        !           783:     if (player.t_ctype == C_THIEF)    thief_bonus = 9;
        !           784:     if (player.t_ctype == C_ASSASSIN) thief_bonus = 6;
        !           785:     if (player.t_ctype == C_FIGHTER)  thief_bonus = 3;
        !           786:     if (on(*tp, ISUNIQUE)) thief_bonus -= 15;
        !           787:     if (isinvisible) thief_bonus -= 20;
        !           788:     if (on(*tp, ISINWALL) && off(player, CANINWALL)) thief_bonus -= 50;
        !           789:
        !           790:     if (on(*tp, ISHELD) || tp->t_action == A_FREEZE ||
        !           791:         rnd(100) <
        !           792:         (thief_bonus + 2*dex_compute() + 5*pstats.s_lvl -
        !           793:          5*(tp->t_stats.s_lvl - 3))) {
        !           794:         register struct linked_list *s_item, *pack_ptr;
        !           795:         int count = 0;
        !           796:         unsigned long test;      /* Overflow check */
        !           797:
        !           798:         s_item = NULL;  /* Start stolen goods out as nothing */
        !           799:
        !           800:         /* Find a good item to take */
        !           801:         for (pack_ptr=tp->t_pack; pack_ptr != NULL; pack_ptr=next(pack_ptr))
        !           802:             if ((OBJPTR(pack_ptr))->o_type != RELIC &&
        !           803:                 pack_ptr != tp->t_using &&  /* Monster can't be using it */
        !           804:                 rnd(++count) == 0)
        !           805:                 s_item = pack_ptr;
        !           806:
        !           807:         /*
        !           808:          * Find anything?
        !           809:          */
        !           810:         if (s_item == NULL) {
        !           811:             msg("%s apparently has nothing to steal.", prname(mname, TRUE));
        !           812:             return;
        !           813:         }
        !           814:
        !           815:         /* Take it from monster */
        !           816:         if (tp->t_pack) detach(tp->t_pack, s_item);
        !           817:
        !           818:         /* Recalculate the monster's encumberance */
        !           819:         updpack(TRUE, tp);
        !           820:
        !           821:         /* Give it to player */
        !           822:         if (add_pack(s_item, FALSE) == FALSE) {
        !           823:            (OBJPTR(s_item))->o_pos = hero;
        !           824:            fall(s_item, TRUE);
        !           825:         }
        !           826:
        !           827:         /* Get points for stealing -- but first check for overflow */
        !           828:         test = pstats.s_exp + tp->t_stats.s_exp/2;
        !           829:         if (test > pstats.s_exp) pstats.s_exp = test;
        !           830:
        !           831:         /*
        !           832:          * Do adjustments if player went up a level
        !           833:          */
        !           834:         check_level();
        !           835:     }
        !           836:
        !           837:     else {
        !           838:         msg("Your attempt fails.");
        !           839:
        !           840:         /* Annoy monster (maybe) */
        !           841:         if (rnd(40) >= dex_compute() + thief_bonus) {
        !           842:             /*
        !           843:              * If this is a charmed creature, there is a chance it
        !           844:              * will become uncharmed.
        !           845:              */
        !           846:             if (on(*tp, ISCHARMED) && save(VS_MAGIC, tp, 0)) {
        !           847:                 msg("The eyes of %s turn clear.", prname(mname, FALSE));
        !           848:                 turn_off(*tp, ISCHARMED);
        !           849:             }
        !           850:             if (on(*tp, CANSELL)) {
        !           851:                 turn_off(*tp, CANSELL);
        !           852:                 tp->t_action = A_NIL;
        !           853:                 tp->t_movement = 0;
        !           854:                 if (rnd(100) < 50) /* make him steal something */
        !           855:                     turn_on(*tp, STEALMAGIC);
        !           856:                 else
        !           857:                     turn_on(*tp, STEALGOLD);
        !           858:                 if (!isinvisible)
        !           859:                     msg("%s looks insulted.", prname(mname, TRUE));
        !           860:             }
        !           861:             runto(tp, &hero);
        !           862:         }
        !           863:     }
        !           864: }
        !           865:
        !           866: /*
        !           867:  * Take charmed monsters with you via up or down commands.
        !           868:  */
        !           869:
        !           870: void
        !           871: take_with(void)
        !           872: {
        !           873:     register struct thing *tp;
        !           874:     register struct linked_list *item;
        !           875:     struct linked_list *nitem;
        !           876:     register int t;
        !           877:
        !           878:     t = 0;
        !           879:     for (item = mlist; item != NULL; item = nitem) {
        !           880:     nitem = next(item);
        !           881:     t++;
        !           882:     if (t > 5) break;
        !           883:     tp = THINGPTR(item);
        !           884:         if (on(*tp, ISCHARMED)) {
        !           885:             monsters[tp->t_index].m_normal = TRUE;
        !           886:             turn_on(*tp, ISELSEWHERE);
        !           887:             detach(mlist, item);
        !           888:             attach(tlist, item);         /* remember him next level */
        !           889:             check_residue(tp);
        !           890:             continue;
        !           891:         }
        !           892:     }
        !           893: }
        !           894:
        !           895: /*
        !           896:  * this routine lets the player pick the spell that they
        !           897:  * want to cast regardless of character class
        !           898:  * spells: spell list
        !           899:  * ability: spell ability
        !           900:  * num_spells: number of spells that can be cast
        !           901:  * power: spell power
        !           902:  * prompt: prompt for spell list
        !           903:  * type: type of thing--> spell, prayer, chant
        !           904:  */
        !           905:
        !           906: bool
        !           907: pick_spell(struct spells spells[], int ability, int num_spells, int power,
        !           908:            const char *prompt, const char *type)
        !           909: {
        !           910:     bool                nohw = FALSE;
        !           911:     register int        i;
        !           912:     int                 curlen,
        !           913:                         maxlen = 0,
        !           914:                         dummy = 0,
        !           915:                         which_spell,
        !           916:                         spell_left;
        !           917:     if (cur_misc[WEAR_CLOAK] != NULL &&
        !           918:         cur_misc[WEAR_CLOAK]->o_which == MM_R_POWERLESS) {
        !           919:         msg("You can't seem to start a %s!", type);
        !           920:         return(FALSE);
        !           921:     }
        !           922:
        !           923:     /* Prompt for spells */
        !           924:     msg("Which %s are you %sing? (* for list): ", type, prompt);
        !           925:
        !           926:     which_spell = (int) (wgetch(cw) - 'a');
        !           927:     msg("");    /* Get rid of the prompt */
        !           928:     if (which_spell == (int) ESC - (int) 'a') {
        !           929:         after = FALSE;
        !           930:         return(FALSE);
        !           931:     }
        !           932:     if (which_spell >= 0 && which_spell < num_spells) nohw = TRUE;
        !           933:
        !           934:     else if (slow_invent) {
        !           935:         register char c;
        !           936:
        !           937:         nohw = TRUE;
        !           938:         do {
        !           939:             for (i=0; i<num_spells; i++) {
        !           940:                 msg("");
        !           941:                 mvwaddch(msgw, 0, 0, '[');
        !           942:                 waddch(msgw, (char) ((int) 'a' + i));
        !           943:                 wprintw(msgw, "] A %s of ", type);
        !           944:                 if (spells[i].s_type == TYP_POTION)
        !           945:                     waddstr(msgw, p_magic[spells[i].s_which].mi_name);
        !           946:                 else if (spells[i].s_type == TYP_SCROLL)
        !           947:                     waddstr(msgw, s_magic[spells[i].s_which].mi_name);
        !           948:                 else if (spells[i].s_type == TYP_STICK)
        !           949:                     waddstr(msgw, ws_magic[spells[i].s_which].mi_name);
        !           950:                 waddstr(msgw, morestr);
        !           951:                 wclrtobot(msgw);
        !           952:                 clearok(msgw, FALSE);
        !           953:                 draw(msgw);
        !           954:                 do {
        !           955:                     c = wgetch(cw);
        !           956:                 } while (c != ' ' && c != ESC);
        !           957:                 if (c == ESC)
        !           958:                     break;
        !           959:             }
        !           960:             msg("");
        !           961:             wmove(msgw, 0, 0);
        !           962:             wprintw(msgw, "Which %s are you %sing? ", type, prompt);
        !           963:             clearok(msgw, FALSE);
        !           964:             draw(msgw);
        !           965:
        !           966:             which_spell = (int) (wgetch(cw) - 'a');
        !           967:         } while (which_spell != (int) (ESC - 'a') &&
        !           968:                  (which_spell < 0 || which_spell >= num_spells));
        !           969:
        !           970:         if (which_spell == (int) (ESC - 'a')) {
        !           971:             mpos = 0;
        !           972:             msg("");
        !           973:             after = FALSE;
        !           974:             return(FALSE);
        !           975:         }
        !           976:     }
        !           977:     else {
        !           978:         /* Now display the possible spells */
        !           979:         wclear(hw);
        !           980:         touchwin(hw);
        !           981:         wmove(hw, 2, 0);
        !           982:         wprintw(hw, "   Cost    %c%s", toupper(*type),type+1);
        !           983:         mvwaddstr(hw, 3, 0,
        !           984:                 "-----------------------------------------------");
        !           985:         maxlen = 47;    /* Maximum width of header */
        !           986:
        !           987:         for (i=0; i<num_spells; i++) {
        !           988:             sprintf(prbuf, "[%c]        %3d     A %s of ",
        !           989:                         (char) ((int) 'a' + i), spells[i].s_cost, type);
        !           990:             if (spells[i].s_type == TYP_POTION)
        !           991:                 strcat(prbuf, p_magic[spells[i].s_which].mi_name);
        !           992:             else if (spells[i].s_type == TYP_SCROLL)
        !           993:                 strcat(prbuf, s_magic[spells[i].s_which].mi_name);
        !           994:             else if (spells[i].s_type == TYP_STICK)
        !           995:                 strcat(prbuf, ws_magic[spells[i].s_which].mi_name);
        !           996:             mvwaddstr(hw, i+4, 0, prbuf);
        !           997:
        !           998:             /* Get the length of the line */
        !           999:             getyx(hw, dummy, curlen);
        !          1000:             if (maxlen < curlen) maxlen = curlen;
        !          1001:         }
        !          1002:
        !          1003:         spell_left = ability - power;
        !          1004:         if (spell_left < 0) {
        !          1005:             spell_left = 0;
        !          1006:             if (spell_left < -20) power = ability + 20;
        !          1007:         }
        !          1008:         sprintf(prbuf, "[Current %s power = %d]", type, spell_left);
        !          1009:
        !          1010:         mvwaddstr(hw, 0, 0, prbuf);
        !          1011:         wprintw(hw, " Which %s are you %sing? ", type, prompt);
        !          1012:         getyx(hw, dummy, curlen);
        !          1013:         if (maxlen < curlen) maxlen = curlen;
        !          1014:
        !          1015:         /* Should we overlay? */
        !          1016:         if (menu_overlay && num_spells + 3 < lines - 3) {
        !          1017:             over_win(cw, hw, num_spells + 5, maxlen + 3, 0, curlen, '\0');
        !          1018:         }
        !          1019:         else draw(hw);
        !          1020:     }
        !          1021:
        !          1022:     if (!nohw) {
        !          1023:         which_spell = (int) (wgetch(cw) - 'a');
        !          1024:         while (which_spell < 0 || which_spell >= num_spells) {
        !          1025:             if (which_spell == (int) ESC - (int) 'a') {
        !          1026:                 after = FALSE;
        !          1027:
        !          1028:                 /* Restore the screen */
        !          1029:                 if (num_spells + 3 < lines / 2) {
        !          1030:                     clearok(cw, FALSE);
        !          1031:                     touchwin(cw);
        !          1032:                 }
        !          1033:                 else restscr(cw);
        !          1034:                 return(FALSE);
        !          1035:             }
        !          1036:             wmove(hw, 0, 0);
        !          1037:             wclrtoeol(hw);
        !          1038:             wprintw(hw, "Please enter one of the listed %ss. ", type);
        !          1039:             getyx(hw, dummy, curlen);
        !          1040:             if (maxlen < curlen) maxlen = curlen;
        !          1041:
        !          1042:             /* Should we overlay? */
        !          1043:             if (menu_overlay && num_spells + 3 < lines - 3) {
        !          1044:                 over_win(cw, hw, num_spells + 5, maxlen + 3,
        !          1045:                             0, curlen, '\0');
        !          1046:             }
        !          1047:             else draw(hw);
        !          1048:
        !          1049:             which_spell = (int) (wgetch(cw) - 'a');
        !          1050:         }
        !          1051:     }
        !          1052:
        !          1053:     /* Now restore the screen if we have to */
        !          1054:     if (!nohw) {
        !          1055:         if (num_spells + 3 < lines / 2) {
        !          1056:             touchwin(cw);
        !          1057:             clearok(cw, FALSE);
        !          1058:         }
        !          1059:         else {
        !          1060:             restscr(cw);
        !          1061:         }
        !          1062:     }
        !          1063:
        !          1064:     if (spells[which_spell].s_type == TYP_STICK &&
        !          1065:         need_dir(STICK, spells[which_spell].s_which)) {
        !          1066:             if (!get_dir(&player.t_newpos)) {
        !          1067:                 after = FALSE;
        !          1068:                 return(FALSE);
        !          1069:             }
        !          1070:     }
        !          1071:     player.t_selection = which_spell;
        !          1072:     player.t_no_move = (which_spell/3 + 1) * movement(&player);
        !          1073:
        !          1074:     spell_left = dummy; /* hack to stop IRIX complaint about dummy */
        !          1075:                         /* not being used.                         */
        !          1076:     return(TRUE);
        !          1077: }
        !          1078:
        !          1079: /*
        !          1080:  * opt_player:
        !          1081:  * Let the player know what's happening with himself
        !          1082:  */
        !          1083:
        !          1084: void
        !          1085: opt_player(void)
        !          1086: {
        !          1087:     int i = 1;  /* initialize counters */
        !          1088:     int j = 2;
        !          1089:
        !          1090:     wclear(hw);
        !          1091:     wmove(hw, 0, 0);
        !          1092:     wprintw(hw, "Current player effects:");
        !          1093:     wmove(hw, 2, 0);
        !          1094:
        !          1095:         /*   Print a list of what is happening.
        !          1096:      *   If longer than 16 lines, make it two columns.
        !          1097:      *   Currently, a maximum of 32 (out of 39) "effects"
        !          1098:      *   can be happening all at once to a player.
        !          1099:      */
        !          1100:
        !          1101:     /* 1 - Sense gold */
        !          1102:     if (player.t_ctype == C_THIEF    || player.t_ctype == C_ASSASSIN ||
        !          1103:         ((player.t_ctype == C_FIGHTER || player.t_ctype == C_RANGER) &&
        !          1104:     pstats.s_lvl >= 12)) {
        !          1105:     wprintw(hw, "You can sense gold\n");
        !          1106:     i++;
        !          1107:     }
        !          1108:     /* 2 - Sense traps */
        !          1109:     if (player.t_ctype == C_THIEF   || ((player.t_ctype == C_ASSASSIN ||
        !          1110:         player.t_ctype == C_FIGHTER || player.t_ctype == C_MONK)      &&
        !          1111:     pstats.s_lvl >= 14)) {
        !          1112:     wprintw(hw, "You can sense traps\n");
        !          1113:     i++;
        !          1114:     }
        !          1115:     /* 3 - Steal */
        !          1116:     if (player.t_ctype == C_THIEF    || player.t_ctype == C_ASSASSIN ||
        !          1117:         (player.t_ctype == C_FIGHTER && pstats.s_lvl >= 15)) {
        !          1118:     wprintw(hw, "You can steal\n");
        !          1119:     i++;
        !          1120:     }
        !          1121:     /* 4 - Cast spells */
        !          1122:     if (player.t_ctype == C_MAGICIAN ||
        !          1123:         (player.t_ctype == C_RANGER  && pstats.s_lvl > 1)) {
        !          1124:     wprintw(hw, "You can cast spells\n");
        !          1125:     i++;
        !          1126:     }
        !          1127:     /* 5 - Make chants */
        !          1128:     if (player.t_ctype == C_DRUID ||
        !          1129:         (player.t_ctype == C_MONK && pstats.s_lvl > 1)) {
        !          1130:     wprintw(hw, "You can chant\n");
        !          1131:     i++;
        !          1132:     }
        !          1133:     /* 6 - Give prayers */
        !          1134:     if (cur_relic[HEIL_ANKH] != 0 || player.t_ctype == C_CLERIC ||
        !          1135:         (player.t_ctype == C_PALADIN && pstats.s_lvl > 1)) {
        !          1136:     wprintw(hw, "You can pray\n");
        !          1137:     i++;
        !          1138:     }
        !          1139:     /* 7 - Affect the undead */
        !          1140:     if (cur_relic[HEIL_ANKH] != 0 || player.t_ctype == C_CLERIC ||
        !          1141:         (player.t_ctype == C_PALADIN && pstats.s_lvl > 4)) {
        !          1142:     wprintw(hw, "You can affect the undead\n");
        !          1143:     i++;
        !          1144:     }
        !          1145:     /* 8 - Cause fear */
        !          1146:     if (ISWEARING(R_FEAR) != 0   || ((player.t_ctype == C_RANGER ||
        !          1147:         player.t_ctype == C_PALADIN || player.t_ctype == C_MONK)    &&
        !          1148:         pstats.s_lvl > 1)) {
        !          1149:     wprintw(hw, "You are fearful\n");
        !          1150:     i++;
        !          1151:     }
        !          1152:     /* 9 - Confuse monster */
        !          1153:     if (on(player, CANHUH) != 0) {
        !          1154:     wprintw(hw, "You have multi-colored hands\n");
        !          1155:     i++;
        !          1156:     }
        !          1157:     /* 10 - Confused yourself */
        !          1158:     if (on(player, ISHUH) != 0) {
        !          1159:     wprintw(hw, "You are confused\n");
        !          1160:     i++;
        !          1161:     }                  /* really ISHUH or ISCLEAR */
        !          1162:     /* 11 - Clear thought */
        !          1163:     if (on(player, ISCLEAR) != 0) {
        !          1164:     wprintw(hw, "You are clear headed\n");
        !          1165:     i++;
        !          1166:     }
        !          1167:     /* 12 - Slow */
        !          1168:     if (on(player, ISSLOW) != 0) {
        !          1169:     wprintw(hw, "You are moving slow\n");
        !          1170:     i++;
        !          1171:     }                 /* really ISSLOW or ISHASTE */
        !          1172:     /* 13 - Haste */
        !          1173:     if (on(player, ISHASTE) != 0) {
        !          1174:     wprintw(hw, "You are moving fast\n");
        !          1175:     i++;
        !          1176:     }
        !          1177:     /* 14 - Flying */
        !          1178:     if (on(player, ISFLY) != 0) {
        !          1179:     wprintw(hw, "You are flying\n");
        !          1180:     i++;
        !          1181:     }
        !          1182:     /* 15 - Blind */
        !          1183:     if (on(player, ISBLIND) != 0) {
        !          1184:     wprintw(hw, "You are blind\n");
        !          1185:     i++;
        !          1186:     }                 /* really ISBLIND or CANSEE */
        !          1187:     /* 16 - Extra sight */
        !          1188:     if (on(player, CANSEE) != 0) {
        !          1189:     wprintw(hw, "You have extra sight\n");
        !          1190:     i++;
        !          1191:     }
        !          1192:     /* 17 - Invisibility */
        !          1193:     if (on(player, ISINVIS) != 0) {
        !          1194:     /* Okay, start a second column of effects to the screen. */
        !          1195:         if (i > 16) {
        !          1196:             mvwaddstr(hw, j, 37, "You are invisible");
        !          1197:         j++;
        !          1198:         }
        !          1199:     else {
        !          1200:         wprintw(hw, "You are invisible\n");
        !          1201:         i++;
        !          1202:     }
        !          1203:     }
        !          1204:     /* 18 - Regeneration and vampiric regen */
        !          1205:     if (ISWEARING(R_VAMPREGEN) != 0 || ISWEARING(R_REGEN) != 0) {
        !          1206:         if (i > 16) {
        !          1207:             mvwaddstr(hw, j, 37, "You have regenerative powers");
        !          1208:         j++;
        !          1209:         }
        !          1210:     else {
        !          1211:         wprintw(hw, "You have regenerative powers\n");
        !          1212:         i++;
        !          1213:     }
        !          1214:     }
        !          1215:     /* 19 - Phasing */
        !          1216:     if (on(player, CANINWALL) != 0) {
        !          1217:         if (i > 16) {
        !          1218:             mvwaddstr(hw, j, 37, "You can walk through walls");
        !          1219:         j++;
        !          1220:         }
        !          1221:     else {
        !          1222:         wprintw(hw, "You can walk through walls\n");
        !          1223:         i++;
        !          1224:     }
        !          1225:     }
        !          1226:     /* 20 - Skill (good or bad, it won't last) */
        !          1227:     if (find_slot(unskill) != 0) {
        !          1228:         if (i > 16) {
        !          1229:             mvwaddstr(hw, j, 37, "You feel skillful");
        !          1230:         j++;
        !          1231:         }
        !          1232:     else {
        !          1233:         wprintw(hw, "You feel skillful\n");
        !          1234:         i++;
        !          1235:     }
        !          1236:     }
        !          1237:     /* 21 - Stealthy */
        !          1238:     if (ISWEARING(R_STEALTH) != 0) {
        !          1239:         if (i > 16) {
        !          1240:             mvwaddstr(hw, j, 37, "You have stealth");
        !          1241:         j++;
        !          1242:         }
        !          1243:     else {
        !          1244:         wprintw(hw, "You have stealth\n");
        !          1245:         i++;
        !          1246:     }
        !          1247:     }
        !          1248:     /* 22 - Alertness */
        !          1249:     if (ISWEARING(R_ALERT) != 0) {
        !          1250:         if (i > 16) {
        !          1251:             mvwaddstr(hw, j, 37, "You are awake and alert");
        !          1252:         j++;
        !          1253:         }
        !          1254:     else {
        !          1255:         wprintw(hw, "You are awake and alert\n");
        !          1256:         i++;
        !          1257:     }
        !          1258:     }
        !          1259:     /* 23 - Free action */
        !          1260:     if (ISWEARING(R_FREEDOM) != 0) {
        !          1261:         if (i > 16) {
        !          1262:             mvwaddstr(hw, j, 37, "You feel free");
        !          1263:         j++;
        !          1264:         }
        !          1265:     else {
        !          1266:         wprintw(hw, "You feel free\n");
        !          1267:         i++;
        !          1268:     }
        !          1269:     }
        !          1270:     /* 24 - Heroism */
        !          1271:     if (ISWEARING(R_HEROISM) != 0) {
        !          1272:         if (i > 16) {
        !          1273:             mvwaddstr(hw, j, 37, "You are brave");
        !          1274:         j++;
        !          1275:         }
        !          1276:     else {
        !          1277:         wprintw(hw, "You are brave\n");
        !          1278:         i++;
        !          1279:     }
        !          1280:     }
        !          1281:     /* 25 - Ice protection */
        !          1282:     if (on(player, NOCOLD) != 0) {
        !          1283:         if (i > 16) {
        !          1284:             mvwaddstr(hw, j, 37, "You are protected from ice");
        !          1285:         j++;
        !          1286:         }
        !          1287:     else {
        !          1288:         wprintw(hw, "You are protected from ice\n");
        !          1289:         i++;
        !          1290:     }
        !          1291:     }
        !          1292:     /* 26 - Fire protection */
        !          1293:     if (on(player, NOFIRE) != 0) {
        !          1294:         if (i > 16) {
        !          1295:             mvwaddstr(hw, j, 37, "You are protected from fire");
        !          1296:         j++;
        !          1297:         }
        !          1298:     else {
        !          1299:         wprintw(hw, "You are protected from fire\n");
        !          1300:         i++;
        !          1301:     }
        !          1302:     }
        !          1303:     /* 27 - Lightning protection */
        !          1304:     if (on(player, NOBOLT) != 0) {
        !          1305:         if (i > 16) {
        !          1306:             mvwaddstr(hw, j, 37, "You are protected from lightning");
        !          1307:         j++;
        !          1308:         }
        !          1309:     else {
        !          1310:         wprintw(hw, "You are protected from lightning\n");
        !          1311:         i++;
        !          1312:     }
        !          1313:     }
        !          1314:     /* 28 - Gas protection */
        !          1315:     if (on(player, NOGAS) != 0) {
        !          1316:         if (i > 16) {
        !          1317:             mvwaddstr(hw, j, 37, "You are protected from gas");
        !          1318:         j++;
        !          1319:         }
        !          1320:     else {
        !          1321:         wprintw(hw, "You are protected from gas\n");
        !          1322:         i++;
        !          1323:     }
        !          1324:     }
        !          1325:     /* 29 - Acid protection */
        !          1326:     if (on(player, NOACID) != 0) {
        !          1327:         if (i > 16) {
        !          1328:             mvwaddstr(hw, j, 37, "You are protected from acid");
        !          1329:         j++;
        !          1330:         }
        !          1331:     else {
        !          1332:         wprintw(hw, "You are protected from acid\n");
        !          1333:         i++;
        !          1334:     }
        !          1335:     }
        !          1336:     /* 30 - Breath protection */
        !          1337:     if (cur_relic[YENDOR_AMULET] != 0) {
        !          1338:         if (i > 16) {
        !          1339:             mvwaddstr(hw, j, 37, "You are protected from monster breath");
        !          1340:         j++;
        !          1341:         }
        !          1342:     else {
        !          1343:         wprintw(hw, "You are protected from monster breath\n");
        !          1344:         i++;
        !          1345:     }             /* really only YENDOR or STONEBONES */
        !          1346:     }
        !          1347:     /* 31 - Magic missile protection */
        !          1348:     if (cur_relic[STONEBONES_AMULET] != 0) {
        !          1349:         if (i > 16) {
        !          1350:             mvwaddstr(hw, j, 37, "You are protected from magic missiles");
        !          1351:         j++;
        !          1352:         }
        !          1353:     else {
        !          1354:         wprintw(hw, "You are protected from magic missiles\n");
        !          1355:         i++;
        !          1356:     }
        !          1357:     }
        !          1358:     /* 32 - Sustain health */
        !          1359:     if (ISWEARING(R_HEALTH) != 0 && (off(player, HASDISEASE) &&
        !          1360:     off(player, HASINFEST) && off(player, DOROT))) {
        !          1361:         if (i > 16) {     /* he's really healthy */
        !          1362:             mvwaddstr(hw, j, 37, "You are in good health");
        !          1363:         j++;
        !          1364:         }
        !          1365:     else {
        !          1366:         wprintw(hw, "You are in good health\n");
        !          1367:         i++;
        !          1368:     }
        !          1369:     }
        !          1370:     /* 33 - Being held */
        !          1371:     if (on(player, ISHELD) != 0) {
        !          1372:         if (i > 16) {
        !          1373:             mvwaddstr(hw, j, 37, "You are being held");
        !          1374:         j++;
        !          1375:         }
        !          1376:     else {
        !          1377:         wprintw(hw, "You are being held\n");
        !          1378:         i++;
        !          1379:     }
        !          1380:     }
        !          1381:     /* 34 - Stinks */
        !          1382:     if (on(player, HASSTINK) != 0) {
        !          1383:         if (i > 16) {
        !          1384:             mvwaddstr(hw, j, 37, "You are affronted by a bad smell");
        !          1385:         j++;
        !          1386:         }
        !          1387:     else {
        !          1388:         wprintw(hw, "You are affronted by a bad smell\n");
        !          1389:         i++;
        !          1390:     }
        !          1391:     }
        !          1392:     /* 35 - Any attribute that is down */
        !          1393:     if (pstats.s_intel    < max_stats.s_intel  ||
        !          1394:         pstats.s_str      < max_stats.s_str    ||
        !          1395:         pstats.s_wisdom   < max_stats.s_wisdom ||
        !          1396:         pstats.s_dext     < max_stats.s_dext   ||
        !          1397:         pstats.s_const    < max_stats.s_const  ||
        !          1398:         pstats.s_charisma < max_stats.s_charisma) {
        !          1399:         if (i > 16) {
        !          1400:             mvwaddstr(hw, j, 37, "You are afflicted");
        !          1401:         j++;
        !          1402:         }
        !          1403:     else {
        !          1404:         wprintw(hw, "You are afflicted\n");
        !          1405:         i++;
        !          1406:     }
        !          1407:     }
        !          1408:     /* 36 - Diseased */
        !          1409:     if (on(player, HASDISEASE) != 0) {
        !          1410:         if (i > 16) {
        !          1411:             mvwaddstr(hw, j, 37, "You have a disease");
        !          1412:         j++;
        !          1413:         }
        !          1414:     else {
        !          1415:         wprintw(hw, "You have a disease\n");
        !          1416:         i++;
        !          1417:     }
        !          1418:     }
        !          1419:     /* 37 - Infested */
        !          1420:     if (on(player, HASINFEST) != 0) {
        !          1421:         if (i > 16) {
        !          1422:             mvwaddstr(hw, j, 37, "You have an infestation");
        !          1423:         j++;
        !          1424:         }
        !          1425:     else {
        !          1426:         wprintw(hw, "You have an infestation\n");
        !          1427:         i++;
        !          1428:     }
        !          1429:     }
        !          1430:     /* 38 - Body rot */
        !          1431:     if (on(player, DOROT) != 0) {
        !          1432:         if (i > 16) {
        !          1433:             mvwaddstr(hw, j, 37, "You have body rot");
        !          1434:         j++;
        !          1435:         }
        !          1436:     else {
        !          1437:         wprintw(hw, "You have body rot\n");
        !          1438:         i++;
        !          1439:     }
        !          1440:     }
        !          1441:     /* 39 - Dancing */
        !          1442:     if (on(player, ISDANCE) != 0) {
        !          1443:         if (i > 16) {
        !          1444:             mvwaddstr(hw, j, 37, "You are a dancing fool");
        !          1445:         j++;
        !          1446:         }
        !          1447:     else {
        !          1448:         wprintw(hw, "You are a dancing fool\n");
        !          1449:         i++;
        !          1450:     }
        !          1451:     }
        !          1452:     if (i == 1) {
        !          1453:     wclear(hw);
        !          1454:         msg("No player effects. ");
        !          1455:     return;
        !          1456:     }
        !          1457:     else {
        !          1458:     if (i > 1 && i < 17) {
        !          1459:         j = 39;
        !          1460:             if (menu_overlay) {     /* Print the list. */
        !          1461:                 wmove(hw, i+2, 0);
        !          1462:                 wprintw(hw, spacemsg);
        !          1463:                 over_win(cw, hw, i+3, j, i+2, 27, '\0');
        !          1464:         }
        !          1465:             else {
        !          1466:                 wmove(hw, i+2, 0);
        !          1467:                 wprintw(hw, spacemsg);
        !          1468:             draw(hw);
        !          1469:         }
        !          1470:     }
        !          1471:     else {
        !          1472:         i = 17;
        !          1473:             if (menu_overlay) {     /* Print the list. */
        !          1474:                 wmove(hw, i+2, 0);
        !          1475:                 wprintw(hw, spacemsg);
        !          1476:         if (j > 2) j = 78;
        !          1477:         else j = 39;
        !          1478:                 over_win(cw, hw, i+3, j, i+2, 27, '\0');
        !          1479:         }
        !          1480:             else {
        !          1481:                 wmove(hw, i+2, 0);
        !          1482:                 wprintw(hw, spacemsg);
        !          1483:             draw(hw);
        !          1484:         }
        !          1485:     }
        !          1486:         wait_for(' ');
        !          1487:     wclear(hw);
        !          1488:     status(FALSE);
        !          1489:     touchwin(cw);
        !          1490:         return;
        !          1491:     }
        !          1492: }
        !          1493:

CVSweb