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

Annotation of early-roguelike/arogue7/player.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:  * player.c  -  This file contains functions for dealing with special player
                      3:  * abilities
                      4:  *
                      5:  * Advanced Rogue
                      6:  * Copyright (C) 1984, 1985, 1986 Michael Morgan, Ken Dalka and AT&T
                      7:  * All rights reserved.
                      8:  *
                      9:  * Based on "Rogue: Exploring the Dungeons of Doom"
                     10:  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
                     11:  * All rights reserved.
                     12:  *
                     13:  * See the file LICENSE.TXT for full copyright and licensing information.
                     14:  */
                     15:
                     16: /*
                     17:  * This file contains functions for dealing with special player abilities
                     18:  */
                     19:
                     20: #include <ctype.h>
                     21: #include <string.h>
                     22: #include "curses.h"
                     23: #include "rogue.h"
                     24: #ifdef PC7300
                     25: #include "menu.h"
                     26: #endif
                     27:
                     28: bool pick_spell(struct spells spells[], int ability, int num_spells, int power,
                     29:            char *prompt, char *type);
                     30: 
                     31: /*
                     32:  * affect:
                     33:  *     cleric affecting undead
                     34:  */
                     35:
                     36: void
                     37: affect(void)
                     38: {
                     39:     register struct linked_list *item;
                     40:     register struct thing *tp;
                     41:     register char *mname;
                     42:     bool see;
                     43:     coord new_pos;
                     44:     int lvl;
                     45:
                     46:     if (!(player.t_ctype == C_CLERIC  ||
                     47:           (player.t_ctype == C_PALADIN && pstats.s_lvl > 4) ||
                     48:          cur_relic[HEIL_ANKH] != 0)) {
                     49:        msg("You cannot affect undead.");
                     50:        return;
                     51:     }
                     52:
                     53:     new_pos.y = hero.y + player.t_newpos.y;
                     54:     new_pos.x = hero.x + player.t_newpos.x;
                     55:
                     56:     if (cansee(new_pos.y, new_pos.x)) see = TRUE;
                     57:     else see = FALSE;
                     58:
                     59:     /* Anything there? */
                     60:     if (new_pos.y < 0 || new_pos.y > lines-3 ||
                     61:        new_pos.x < 0 || new_pos.x > cols-1 ||
                     62:        mvwinch(mw, new_pos.y, new_pos.x) == ' ') {
                     63:        msg("Nothing to affect.");
                     64:        return;
                     65:     }
                     66:
                     67:     if ((item = find_mons(new_pos.y, new_pos.x)) == NULL) {
                     68:        debug("Affect what @ %d,%d?", new_pos.y, new_pos.x);
                     69:        return;
                     70:     }
                     71:     tp = THINGPTR(item);
                     72:     mname = monster_name(tp);
                     73:
                     74:     if (on(player, ISINVIS) && off(*tp, CANSEE)) {
                     75:        msg("%s%s cannot see you", see ? "The " : "It",
                     76:            see ? mname : "");
                     77:        return;
                     78:     }
                     79:
                     80:     if (off(*tp, TURNABLE) || on(*tp, WASTURNED))
                     81:        goto annoy;
                     82:     turn_off(*tp, TURNABLE);
                     83:
                     84:     lvl = pstats.s_lvl;
                     85:     if (player.t_ctype == C_PALADIN && cur_relic[HEIL_ANKH] == 0) {
                     86:        lvl -= 4;
                     87:     }
                     88:     /* Can cleric kill it? */
                     89:     if (lvl >= 3 * tp->t_stats.s_lvl) {
                     90:        unsigned long test;     /* For overflow check */
                     91:
                     92:        msg("You have destroyed %s%s.", see ? "the " : "it", see ? mname : "");
                     93:        test = pstats.s_exp + tp->t_stats.s_exp;
                     94:
                     95:        /* Be sure there is no overflow before increasing experience */
                     96:        if (test > pstats.s_exp) pstats.s_exp = test;
                     97:        killed(item, FALSE, TRUE, TRUE);
                     98:        check_level();
                     99:        return;
                    100:     }
                    101:
                    102:     /* Can cleric turn it? */
                    103:     if (rnd(100) + 1 >
                    104:         (100 * ((2 * tp->t_stats.s_lvl) - lvl)) / lvl) {
                    105:        unsigned long test;     /* Overflow test */
                    106:
                    107:        /* Make the monster flee */
                    108:        turn_on(*tp, WASTURNED);        /* No more fleeing after this */
                    109:        turn_on(*tp, ISFLEE);
                    110:        runto(tp, &hero);
                    111:
                    112:        /* Disrupt it */
                    113:        dsrpt_monster(tp, TRUE, TRUE);
                    114:
                    115:        /* Let player know */
                    116:        msg("You have turned %s%s.", see ? "the " : "it", see ? mname : "");
                    117:
                    118:        /* get points for turning monster -- but check overflow first */
                    119:        test = pstats.s_exp + tp->t_stats.s_exp/2;
                    120:        if (test > pstats.s_exp) pstats.s_exp = test;
                    121:        check_level();
                    122:
                    123:        /* If monster was suffocating, stop it */
                    124:        if (on(*tp, DIDSUFFOCATE)) {
                    125:            turn_off(*tp, DIDSUFFOCATE);
                    126:            extinguish(suffocate);
                    127:        }
                    128:
                    129:        /* If monster held us, stop it */
                    130:        if (on(*tp, DIDHOLD) && (--hold_count == 0))
                    131:                turn_off(player, ISHELD);
                    132:        turn_off(*tp, DIDHOLD);
                    133:
                    134:        /* It is okay to turn tail */
                    135:        tp->t_oldpos = tp->t_pos;
                    136:
                    137:        return;
                    138:     }
                    139:
                    140:     /* Otherwise -- no go */
                    141: annoy:
                    142:     if (see && tp->t_stats.s_intel > 16)
                    143:        msg("%s laughs at you...", prname(mname, TRUE));
                    144:     else
                    145:        msg("You do not affect %s%s.", see ? "the " : "it", see ? mname : "");
                    146:
                    147:     /* Annoy monster */
                    148:    if (off(*tp, ISFLEE)) runto(tp, &hero);
                    149: }
                    150: 
                    151: /*
                    152:  * the magic user is going to try and cast a spell
                    153:  */
                    154: void
                    155: cast(void)
                    156: {
                    157:     int                spell_ability,
                    158:                which_spell,
                    159:                num_spells;
                    160:
                    161:     if (player.t_ctype != C_MAGICIAN && player.t_ctype != C_RANGER) {
                    162:        msg("You are not permitted to cast spells.");
                    163:        return;
                    164:     }
                    165:     spell_ability = pstats.s_lvl * pstats.s_intel;
                    166:     if (player.t_ctype != C_MAGICIAN)
                    167:        spell_ability /= 3;
                    168:
                    169:     if (player.t_action != C_CAST) {
                    170:        /*
                    171:         * Get the number of avilable spells
                    172:         */
                    173:        num_spells = 0;
                    174:        if (pstats.s_intel >= 16)
                    175:            num_spells += pstats.s_intel - 15;
                    176:        num_spells += pstats.s_lvl;
                    177:        if (player.t_ctype != C_MAGICIAN)
                    178:            num_spells /= 3;
                    179:        if (num_spells > MAXSPELLS)
                    180:            num_spells = MAXSPELLS;
                    181:        if (num_spells < 1) {
                    182:            msg("You are not allowed to cast spells yet.");
                    183:            return;
                    184:        }
                    185:        if (pick_spell( magic_spells,
                    186:                        spell_ability,
                    187:                        num_spells,
                    188:                        spell_power,
                    189:                        "cast",
                    190:                        "spell"))
                    191:            player.t_action = C_CAST;
                    192:        return;
                    193:     }
                    194:
                    195:     /* We've waited our required casting time. */
                    196:     which_spell = player.t_selection;
                    197:     player.t_selection = 0;
                    198:     player.t_using = NULL;
                    199:     player.t_action = A_NIL;
                    200:
                    201:     if ((spell_power + magic_spells[which_spell].s_cost) > spell_ability) {
                    202:        msg("Your attempt fails.");
                    203:        return;
                    204:     }
                    205:
                    206:     msg("Your spell is successful.");
                    207:
                    208:     if (magic_spells[which_spell].s_type == TYP_POTION)
                    209:         quaff( magic_spells[which_spell].s_which,
                    210:                0,
                    211:                magic_spells[which_spell].s_flag,
                    212:                FALSE);
                    213:     else if (magic_spells[which_spell].s_type == TYP_SCROLL)
                    214:         read_scroll(   magic_spells[which_spell].s_which,
                    215:                        magic_spells[which_spell].s_flag,
                    216:                        FALSE);
                    217:     else if (magic_spells[which_spell].s_type == TYP_STICK) {
                    218:         if (!player_zap(magic_spells[which_spell].s_which,
                    219:                         magic_spells[which_spell].s_flag)) {
                    220:             after = FALSE;
                    221:             return;
                    222:         }
                    223:     }
                    224:     spell_power += magic_spells[which_spell].s_cost;
                    225: }
                    226: 
                    227: /*
                    228:  * the druid asks his deity for a spell
                    229:  */
                    230: void
                    231: chant(void)
                    232: {
                    233:     register int       num_chants,
                    234:                        chant_ability,
                    235:                        which_chant;
                    236:
                    237:     which_chant = num_chants = chant_ability = 0;
                    238:
                    239:     if (player.t_ctype != C_DRUID && player.t_ctype != C_RANGER) {
                    240:        msg("You are not permitted to chant.");
                    241:        return;
                    242:     }
                    243:     if (cur_misc[WEAR_CLOAK] != NULL &&
                    244:        cur_misc[WEAR_CLOAK]->o_which == MM_R_POWERLESS) {
                    245:        msg("You can't seem to chant!");
                    246:        return;
                    247:     }
                    248:     chant_ability = pstats.s_lvl * pstats.s_wisdom;
                    249:     if (player.t_ctype != C_DRUID)
                    250:        chant_ability /= 3;
                    251:
                    252:     if (player.t_action != C_CHANT) {
                    253:        num_chants = 0;
                    254:
                    255:        /* Get the number of avilable chants */
                    256:        if (pstats.s_wisdom > 16)
                    257:            num_chants = (pstats.s_wisdom - 15) / 2;
                    258:
                    259:        num_chants += pstats.s_lvl;
                    260:
                    261:        if (player.t_ctype != C_DRUID)
                    262:            num_chants /= 3;
                    263:
                    264:        if (num_chants > MAXCHANTS)
                    265:            num_chants = MAXCHANTS;
                    266:
                    267:        if (num_chants < 1) {
                    268:            msg("You are not permitted to chant yet.");
                    269:            return;
                    270:        }
                    271:
                    272:        /* Prompt for chant */
                    273:        if (pick_spell( druid_spells,
                    274:                        chant_ability,
                    275:                        num_chants,
                    276:                        chant_time,
                    277:                        "sing",
                    278:                        "chant"))
                    279:            player.t_action = C_CHANT;
                    280:
                    281:        return;
                    282:     }
                    283:
                    284:     /* We've waited our required chanting time. */
                    285:     which_chant = player.t_selection;
                    286:     player.t_selection = 0;
                    287:     player.t_using = NULL;
                    288:     player.t_action = A_NIL;
                    289:
                    290:     if (druid_spells[which_chant].s_cost + chant_time > chant_ability) {
                    291:        msg("Your chant fails.");
                    292:        return;
                    293:     }
                    294:
                    295:     msg("Your chant has been granted.");
                    296:
                    297:     if (druid_spells[which_chant].s_type == TYP_POTION)
                    298:        quaff(          druid_spells[which_chant].s_which,
                    299:                        0,
                    300:                        druid_spells[which_chant].s_flag,
                    301:                        FALSE);
                    302:     else if (druid_spells[which_chant].s_type == TYP_SCROLL)
                    303:        read_scroll(    druid_spells[which_chant].s_which,
                    304:                        druid_spells[which_chant].s_flag,
                    305:                        FALSE);
                    306:     else if (druid_spells[which_chant].s_type == TYP_STICK) {
                    307:         if (!player_zap(druid_spells[which_chant].s_which,
                    308:                         druid_spells[which_chant].s_flag)) {
                    309:             after = FALSE;
                    310:             return;
                    311:         }
                    312:     }
                    313:     chant_time += druid_spells[which_chant].s_cost;
                    314: }
                    315: 
                    316: /* Constitution bonus */
                    317:
                    318: int
                    319: const_bonus(void)      /* Hit point adjustment for changing levels */
                    320: {
                    321:     register int bonus;
                    322:     if (pstats.s_const > 6 && pstats.s_const <= 14)
                    323:        bonus = 0;
                    324:     else if (pstats.s_const > 14)
                    325:        bonus = pstats.s_const-14;
                    326:     else if (pstats.s_const > 3)
                    327:        bonus = -1;
                    328:     else
                    329:        bonus = -2;
                    330:     switch(player.t_ctype) {
                    331:        case C_FIGHTER:         bonus = min(bonus, 11);
                    332:        when C_MAGICIAN:        bonus = min(bonus, 4);
                    333:        when C_CLERIC:          bonus = min(bonus, 4);
                    334:        when C_THIEF:           bonus = min(bonus, 4);
                    335:        when C_RANGER:          bonus = min(bonus, 6);
                    336:        when C_PALADIN:         bonus = min(bonus, 8);
                    337:        when C_ASSASIN:         bonus = min(bonus, 4);
                    338:        when C_MONK:            bonus = min(bonus, 6);
                    339:        when C_DRUID:           bonus = min(bonus, 4);
                    340:        otherwise:              bonus = min(bonus, 4);
                    341:     }
                    342:     return(bonus);
                    343: }
                    344:
                    345: 
                    346: /* Routines for thieves */
                    347:
                    348: /*
                    349:  * gsense:
                    350:  *     Sense gold
                    351:  */
                    352:
                    353: void
                    354: gsense(void)
                    355: {
                    356:     /* Only thieves can do this */
                    357:     if (player.t_ctype != C_THIEF && player.t_ctype != C_ASSASIN) {
                    358:        msg("You seem to have no gold sense.");
                    359:        return;
                    360:     }
                    361:
                    362:     read_scroll(S_GFIND, 0, FALSE);
                    363: }
                    364: 
                    365: /*
                    366:  * the cleric asks his deity for a spell
                    367:  */
                    368: void
                    369: pray(void)
                    370: {
                    371:     register int       num_prayers,
                    372:                        prayer_ability,
                    373:                        which_prayer;
                    374:
                    375:     which_prayer = num_prayers = prayer_ability =  0;
                    376:
                    377:     if (player.t_ctype != C_CLERIC  &&
                    378:        player.t_ctype != C_PALADIN &&
                    379:        cur_relic[HEIL_ANKH] == 0) {
                    380:            msg("You are not permitted to pray.");
                    381:            return;
                    382:     }
                    383:     if (cur_misc[WEAR_CLOAK] != NULL &&
                    384:        cur_misc[WEAR_CLOAK]->o_which == MM_R_POWERLESS) {
                    385:        msg("You can't seem to pray!");
                    386:        return;
                    387:     }
                    388:
                    389:     prayer_ability = pstats.s_lvl * pstats.s_wisdom;
                    390:     if (player.t_ctype != C_CLERIC)
                    391:        prayer_ability /= 3;
                    392:
                    393:     if (cur_relic[HEIL_ANKH]) prayer_ability *= 2;
                    394:
                    395:     if (player.t_action != C_PRAY) {
                    396:        num_prayers = 0;
                    397:
                    398:        /* Get the number of avilable prayers */
                    399:        if (pstats.s_wisdom > 16)
                    400:            num_prayers += (pstats.s_wisdom - 15) / 2;
                    401:
                    402:        num_prayers += pstats.s_lvl;
                    403:        if (cur_relic[HEIL_ANKH]) num_prayers += 3;
                    404:
                    405:        if (player.t_ctype != C_CLERIC)
                    406:            num_prayers /= 3;
                    407:
                    408:        if (num_prayers > MAXPRAYERS)
                    409:            num_prayers = MAXPRAYERS;
                    410:        if (num_prayers < 1) {
                    411:            msg("You are not permitted to pray yet.");
                    412:            return;
                    413:        }
                    414:
                    415:        /* Prompt for prayer */
                    416:        if (pick_spell( cleric_spells,
                    417:                        prayer_ability,
                    418:                        num_prayers,
                    419:                        pray_time,
                    420:                        "offer",
                    421:                        "prayer"))
                    422:            player.t_action = C_PRAY;
                    423:
                    424:        return;
                    425:     }
                    426:
                    427:     /* We've waited our required praying time. */
                    428:     which_prayer = player.t_selection;
                    429:     player.t_selection = 0;
                    430:     player.t_using = NULL;
                    431:     player.t_action = A_NIL;
                    432:
                    433:     if (cleric_spells[which_prayer].s_cost + pray_time > prayer_ability) {
                    434:        msg("Your prayer fails.");
                    435:        return;
                    436:     }
                    437:
                    438:     msg("Your prayer has been granted.");
                    439:
                    440:     if (cleric_spells[which_prayer].s_type == TYP_POTION)
                    441:        quaff(          cleric_spells[which_prayer].s_which,
                    442:                        0,
                    443:                        cleric_spells[which_prayer].s_flag,
                    444:                        FALSE);
                    445:     else if (cleric_spells[which_prayer].s_type == TYP_SCROLL)
                    446:        read_scroll(    cleric_spells[which_prayer].s_which,
                    447:                        cleric_spells[which_prayer].s_flag,
                    448:                        FALSE);
                    449:     else if (cleric_spells[which_prayer].s_type == TYP_STICK) {
                    450:         if (!player_zap(cleric_spells[which_prayer].s_which,
                    451:                         cleric_spells[which_prayer].s_flag)) {
                    452:             after = FALSE;
                    453:             return;
                    454:         }
                    455:     }
                    456:     pray_time += cleric_spells[which_prayer].s_cost;
                    457: }
                    458:
                    459:
                    460: 
                    461: /*
                    462:  * steal:
                    463:  *     Steal in direction given in delta
                    464:  */
                    465:
                    466: void
                    467: steal(void)
                    468: {
                    469:     register struct linked_list *item;
                    470:     register struct thing *tp;
                    471:     register char *mname;
                    472:     coord new_pos;
                    473:     int thief_bonus = -50;
                    474:     bool isinvisible = FALSE;
                    475:
                    476:     if (player.t_ctype != C_THIEF && player.t_ctype != C_ASSASIN) {
                    477:        msg("Only thieves and assassins can steal.");
                    478:        return;
                    479:     }
                    480:     if (on(player, ISBLIND)) {
                    481:        msg("You can't see anything.");
                    482:        return;
                    483:     }
                    484:
                    485:     new_pos.y = hero.y + player.t_newpos.y;
                    486:     new_pos.x = hero.x + player.t_newpos.x;
                    487:
                    488:     /* Anything there? */
                    489:     if (new_pos.y < 0 || new_pos.y > lines-3 ||
                    490:        new_pos.x < 0 || new_pos.x > cols-1 ||
                    491:        mvwinch(mw, new_pos.y, new_pos.x) == ' ') {
                    492:        msg("Nothing to steal from.");
                    493:        return;
                    494:     }
                    495:
                    496:     if ((item = find_mons(new_pos.y, new_pos.x)) == NULL)
                    497:        debug("Steal from what @ %d,%d?", new_pos.y, new_pos.x);
                    498:     tp = THINGPTR(item);
                    499:     if (on(*tp, ISSTONE)) {
                    500:        msg ("You can't steal from stone!");
                    501:        return;
                    502:     }
                    503:     if (isinvisible = invisible(tp)) mname = "creature";
                    504:     else mname = monster_name(tp);
                    505:
                    506:     /* Can player steal something unnoticed? */
                    507:     if (player.t_ctype == C_THIEF) thief_bonus = 10;
                    508:     if (player.t_ctype == C_ASSASIN) thief_bonus = 0;
                    509:     if (on(*tp, ISUNIQUE)) thief_bonus -= 15;
                    510:     if (isinvisible) thief_bonus -= 20;
                    511:     if (on(*tp, ISINWALL) && off(player, CANINWALL)) thief_bonus -= 50;
                    512:
                    513:     if (on(*tp, ISHELD) || tp->t_action == A_FREEZE ||
                    514:        rnd(100) <
                    515:        (thief_bonus + 2*dex_compute() + 5*pstats.s_lvl -
                    516:         5*(tp->t_stats.s_lvl - 3))) {
                    517:        register struct linked_list *s_item, *pack_ptr;
                    518:        int count = 0;
                    519:        unsigned long test;     /* Overflow check */
                    520:
                    521:        s_item = NULL;  /* Start stolen goods out as nothing */
                    522:
                    523:        /* Find a good item to take */
                    524:        for (pack_ptr=tp->t_pack; pack_ptr != NULL; pack_ptr=next(pack_ptr))
                    525:            if ((OBJPTR(pack_ptr))->o_type != RELIC &&
                    526:                pack_ptr != tp->t_using &&  /* Monster can't be using it */
                    527:                rnd(++count) == 0)
                    528:                s_item = pack_ptr;
                    529:
                    530:        /*
                    531:         * Find anything?
                    532:         */
                    533:        if (s_item == NULL) {
                    534:            msg("%s apparently has nothing to steal.", prname(mname, TRUE));
                    535:            return;
                    536:        }
                    537:
                    538:        /* Take it from monster */
                    539:        if (tp->t_pack) detach(tp->t_pack, s_item);
                    540:
                    541:        /* Recalculate the monster's encumberance */
                    542:        updpack(TRUE, tp);
                    543:
                    544:        /* Give it to player */
                    545:        if (add_pack(s_item, FALSE, NULL) == FALSE) {
                    546:           (OBJPTR(s_item))->o_pos = hero;
                    547:           fall(s_item, TRUE);
                    548:        }
                    549:
                    550:        /* Get points for stealing -- but first check for overflow */
                    551:        test = pstats.s_exp + tp->t_stats.s_exp/2;
                    552:        if (test > pstats.s_exp) pstats.s_exp = test;
                    553:
                    554:        /*
                    555:         * Do adjustments if player went up a level
                    556:         */
                    557:        check_level();
                    558:     }
                    559:
                    560:     else {
                    561:        msg("Your attempt fails.");
                    562:
                    563:        /* Annoy monster (maybe) */
                    564:        if (rnd(35) >= dex_compute() + thief_bonus) {
                    565:            /*
                    566:             * If this is a charmed creature, there is a chance it
                    567:             * will become uncharmed.
                    568:             */
                    569:            if (on(*tp, ISCHARMED) && save(VS_MAGIC, tp, 0)) {
                    570:                msg("The eyes of %s turn clear.", prname(mname, FALSE));
                    571:                turn_off(*tp, ISCHARMED);
                    572:            }
                    573:            if (on(*tp, CANSELL)) {
                    574:                turn_off(*tp, CANSELL);
                    575:                tp->t_action = A_NIL;
                    576:                tp->t_movement = 0;
                    577:                if (rnd(100) < 50) /* make him steal something */
                    578:                    turn_on(*tp, STEALMAGIC);
                    579:                else
                    580:                    turn_on(*tp, STEALGOLD);
                    581:                if (!isinvisible)
                    582:                    msg("%s looks insulted.", prname(mname, TRUE));
                    583:            }
                    584:            runto(tp, &hero);
                    585:        }
                    586:     }
                    587: }
                    588:
                    589: #ifdef PC7300
                    590: /* Use MAXSPELLS or whatever is the biggest number of spells/prayers/etc */
                    591: static menu_t Display;                         /* The menu structure */
                    592: static mitem_t Dispitems[MAXSPELLS+1];         /* Info for each line */
                    593: static char Displines[MAXSPELLS+1][LINELEN+1]; /* The lines themselves */
                    594: #endif
                    595:
                    596: /*
                    597:  * this routine lets the player pick the spell that they
                    598:  * want to cast regardless of character class
                    599:  * spells: spell list
                    600:  * ability: spell ability
                    601:  * num_spells: number of spells that can be cast
                    602:  * power: spell power
                    603:  * prompt: prompt for spell list
                    604:  * type: type of thing--> spell, prayer, chant
                    605:  */
                    606: bool
                    607: pick_spell(struct spells spells[], int ability, int num_spells, int power,
                    608:            char *prompt, char *type)
                    609: {
                    610:     bool               nohw = FALSE;
                    611:     register int       i;
                    612:     int                        curlen,
                    613:                        maxlen,
                    614:                        dummy,
                    615:                        which_spell,
                    616:                        spell_left;
                    617: #ifdef PC7300
                    618:     char label[LINELEN],       /* For menu label */
                    619:         title[LINELEN];        /* For menu title */
                    620: #endif
                    621:
                    622:     if (cur_misc[WEAR_CLOAK] != NULL &&
                    623:        cur_misc[WEAR_CLOAK]->o_which == MM_R_POWERLESS) {
                    624:        msg("You can't seem to start a %s!", type);
                    625:        return(FALSE);
                    626:     }
                    627:
                    628:     /* Prompt for spells */
                    629:     msg("Which %s are you %sing? (* for list): ", type, prompt);
                    630:
                    631:     which_spell = (int) (readchar() - 'a');
                    632:     msg("");   /* Get rid of the prompt */
                    633:     if (which_spell == (int) ESCAPE - (int) 'a') {
                    634:        after = FALSE;
                    635:        return(FALSE);
                    636:     }
                    637:     if (which_spell >= 0 && which_spell < num_spells) nohw = TRUE;
                    638:
                    639:     else if (slow_invent) {
                    640:        register char c;
                    641:
                    642:        nohw = TRUE;
                    643:        do {
                    644:            for (i=0; i<num_spells; i++) {
                    645:                msg("");
                    646:                mvwaddch(msgw, 0, 0, '[');
                    647:                waddch(msgw, (char) ((int) 'a' + i));
                    648:                wprintw(msgw, "] A %s of ", type);
                    649:                if (spells[i].s_type == TYP_POTION)
                    650:                    waddstr(msgw, p_magic[spells[i].s_which].mi_name);
                    651:                else if (spells[i].s_type == TYP_SCROLL)
                    652:                    waddstr(msgw, s_magic[spells[i].s_which].mi_name);
                    653:                else if (spells[i].s_type == TYP_STICK)
                    654:                    waddstr(msgw, ws_magic[spells[i].s_which].mi_name);
                    655:                waddstr(msgw, morestr);
                    656:                wclrtobot(msgw);
                    657:                clearok(msgw, FALSE);
                    658:                draw(msgw);
                    659:                do {
                    660:                    c = readchar();
                    661:                } while (c != ' ' && c != ESCAPE);
                    662:                if (c == ESCAPE)
                    663:                    break;
                    664:            }
                    665:            msg("");
                    666:            wmove(msgw, 0, 0);
                    667:            wprintw(msgw, "Which %s are you %sing? ", type, prompt);
                    668:            clearok(msgw, FALSE);
                    669:            draw(msgw);
                    670:
                    671:            which_spell = (int) (readchar() - 'a');
                    672:        } while (which_spell != (int) (ESCAPE - 'a') &&
                    673:                 (which_spell < 0 || which_spell >= num_spells));
                    674:
                    675:        if (which_spell == (int) (ESCAPE - 'a')) {
                    676:            mpos = 0;
                    677:            msg("");
                    678:            after = FALSE;
                    679:            return(FALSE);
                    680:        }
                    681:     }
                    682:     else {
                    683:        /* Now display the possible spells */
                    684:        wclear(hw);
                    685:        touchwin(hw);
                    686:        wmove(hw, 2, 0);
                    687:        *type = toupper(*type);
                    688:        wprintw(hw, "   Cost    %s", type);
                    689:        *type = tolower(*type);
                    690:        mvwaddstr(hw, 3, 0,
                    691:                "-----------------------------------------------");
                    692:        maxlen = 47;    /* Maximum width of header */
                    693:
                    694:        for (i=0; i<num_spells; i++) {
                    695:            sprintf(prbuf, "[%c]        %3d     A %s of ",
                    696:                        (char) ((int) 'a' + i), spells[i].s_cost, type);
                    697:            if (spells[i].s_type == TYP_POTION)
                    698:                strcat(prbuf, p_magic[spells[i].s_which].mi_name);
                    699:            else if (spells[i].s_type == TYP_SCROLL)
                    700:                strcat(prbuf, s_magic[spells[i].s_which].mi_name);
                    701:            else if (spells[i].s_type == TYP_STICK)
                    702:                strcat(prbuf, ws_magic[spells[i].s_which].mi_name);
                    703:            mvwaddstr(hw, i+4, 0, prbuf);
                    704:
                    705:            /* Get the length of the line */
                    706:            getyx(hw, dummy, curlen);
                    707:            if (maxlen < curlen) maxlen = curlen;
                    708:
                    709: #ifdef PC7300
                    710:            /* Put it into the PC menu display */
                    711:            strcpy(Displines[i], prbuf);
                    712:            Dispitems[i].mi_name = Displines[i];
                    713:            Dispitems[i].mi_flags = 0;
                    714:            Dispitems[i].mi_val = i;
                    715: #endif
                    716:        }
                    717:
                    718:        spell_left = ability - power;
                    719:        if (spell_left < 0) {
                    720:            spell_left = 0;
                    721:            if (spell_left < -20) power = ability + 20;
                    722:        }
                    723:        sprintf(prbuf, "[Current %s power = %d]", type, spell_left);
                    724:
                    725:        mvwaddstr(hw, 0, 0, prbuf);
                    726:        wprintw(hw, " Which %s are you %sing? ", type, prompt);
                    727:        getyx(hw, dummy, curlen);
                    728:        if (maxlen < curlen) maxlen = curlen;
                    729:
                    730: #ifdef PC7300
                    731:        /* Place an end marker for the items */
                    732:        Dispitems[num_spells].mi_name = 0;
                    733:
                    734:        /* Design prompts */
                    735:        sprintf(label, "Current %s power is %d", type, spell_left);
                    736:        *type = toupper(*type);
                    737:        sprintf(title, "        Cost    %s", type);
                    738:        *type = tolower(*type);
                    739:        sprintf(prbuf, "Select a %s or press Cancl to continue.", type);
                    740:
                    741:        /* Set up the main menu structure */
                    742:        Display.m_label = label;
                    743:        Display.m_title = title;
                    744:        Display.m_prompt = prbuf;
                    745:        Display.m_curptr = '\0';
                    746:        Display.m_markptr = '\0';
                    747:        Display.m_flags = M_ASISTITLE;
                    748:        Display.m_selcnt = 1;
                    749:        Display.m_items = Dispitems;
                    750:        Display.m_curi = 0;
                    751:
                    752:        /*
                    753:         * Try to display the menu.  If we don't have a local terminal,
                    754:         * the call will fail and we will just continue with the
                    755:         * normal mode.
                    756:         */
                    757:        if (menu(&Display) >= 0) {
                    758:            if (Display.m_selcnt == 0) {
                    759:                /* Menu was cancelled */
                    760:                after = FALSE;
                    761:                return FALSE;   /* all done if abort */
                    762:            }
                    763:            else which_spell = (int) Display.m_curi->mi_val;
                    764:            goto got_spell;
                    765:        }
                    766: #endif
                    767:        /* Should we overlay? */
                    768:        if (menu_overlay && num_spells + 3 < lines / 2) {
                    769:            over_win(cw, hw, num_spells + 5, maxlen + 3, 0, curlen, '\0');
                    770:        }
                    771:        else draw(hw);
                    772:     }
                    773:
                    774:     if (!nohw) {
                    775:        which_spell = (int) (readchar() - 'a');
                    776:        while (which_spell < 0 || which_spell >= num_spells) {
                    777:            if (which_spell == (int) ESCAPE - (int) 'a') {
                    778:                after = FALSE;
                    779:
                    780:                /* Restore the screen */
                    781:                touchwin(cw);
                    782:                if (num_spells + 3 < lines / 2) clearok(cw, FALSE);
                    783:                else clearok(cw, TRUE);
                    784:                return(FALSE);
                    785:            }
                    786:            wmove(hw, 0, 0);
                    787:            wclrtoeol(hw);
                    788:            wprintw(hw, "Please enter one of the listed %ss. ", type);
                    789:            getyx(hw, dummy, curlen);
                    790:            if (maxlen < curlen) maxlen = curlen;
                    791:
                    792:            /* Should we overlay? */
                    793:            if (menu_overlay && num_spells + 3 < lines / 2) {
                    794:                over_win(cw, hw, num_spells + 5, maxlen + 3,
                    795:                            0, curlen, '\0');
                    796:            }
                    797:            else draw(hw);
                    798:
                    799:            which_spell = (int) (readchar() - 'a');
                    800:        }
                    801:     }
                    802:
                    803:     /* Now restore the screen if we have to */
                    804:     if (!nohw) {
                    805:        touchwin(cw);
                    806:        if (num_spells + 3 < lines / 2) clearok(cw, FALSE);
                    807:        else clearok(cw, TRUE);
                    808:     }
                    809:
                    810: #ifdef PC7300
                    811: got_spell:
                    812: #endif
                    813:     if (spells[which_spell].s_type == TYP_STICK &&
                    814:        need_dir(STICK, spells[which_spell].s_which)) {
                    815:            if (!get_dir(&player.t_newpos)) {
                    816:                after = FALSE;
                    817:                return(FALSE);
                    818:            }
                    819:     }
                    820:     player.t_selection = which_spell;
                    821:     player.t_using = NULL;
                    822:     player.t_no_move = (which_spell/3 + 1) * movement(&player);
                    823:     return(TRUE);
                    824: }

CVSweb