[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     ! 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