[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

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