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

Annotation of early-roguelike/rogue5/scrolls.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:  * Read a scroll and let it happen
                      3:  *
                      4:  * @(#)scrolls.c       4.44 (Berkeley) 02/05/99
                      5:  *
                      6:  * Rogue: Exploring the Dungeons of Doom
                      7:  * Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman
                      8:  * All rights reserved.
                      9:  *
                     10:  * See the file LICENSE.TXT for full copyright and licensing information.
                     11:  */
                     12:
                     13: #include <curses.h>
                     14: #include <ctype.h>
                     15: #include "rogue.h"
                     16:
                     17: /*
                     18:  * read_scroll:
                     19:  *     Read a scroll from the pack and do the appropriate thing
                     20:  */
                     21:
                     22: void
                     23: read_scroll(void)
                     24: {
                     25:     THING *obj;
                     26:     PLACE *pp;
                     27:     int y, x;
                     28:     int ch;
                     29:     int i;
                     30:     int discardit = FALSE;
                     31:     struct room *cur_room;
                     32:     THING *orig_obj;
                     33:     coord mp;
                     34:
                     35:     obj = get_item("read", SCROLL);
                     36:     if (obj == NULL)
                     37:        return;
                     38:     if (obj->o_type != SCROLL)
                     39:     {
                     40:        if (!terse)
                     41:            msg("there is nothing on it to read");
                     42:        else
                     43:            msg("nothing to read");
                     44:        return;
                     45:     }
                     46:     /*
                     47:      * Calculate the effect it has on the poor guy.
                     48:      */
                     49:     if (obj == cur_weapon)
                     50:        cur_weapon = NULL;
                     51:     /*
                     52:      * Get rid of the thing
                     53:      */
                     54:     discardit = (obj->o_count == 1);
                     55:     leave_pack(obj, FALSE, FALSE);
                     56:     orig_obj = obj;
                     57:
                     58:     switch (obj->o_which)
                     59:     {
                     60:        case S_CONFUSE:
                     61:            /*
                     62:             * Scroll of monster confusion.  Give him that power.
                     63:             */
                     64:            player.t_flags |= CANHUH;
                     65:            msg("your hands begin to glow %s", pick_color("red"));
                     66:        when S_ARMOR:
                     67:            if (cur_armor != NULL)
                     68:            {
                     69:                cur_armor->o_arm--;
                     70:                cur_armor->o_flags &= ~ISCURSED;
                     71:                msg("your armor glows %s for a moment", pick_color("silver"));
                     72:            }
                     73:        when S_HOLD:
                     74:            /*
                     75:             * Hold monster scroll.  Stop all monsters within two spaces
                     76:             * from chasing after the hero.
                     77:             */
                     78:
                     79:            ch = 0;
                     80:            for (x = hero.x - 2; x <= hero.x + 2; x++)
                     81:                if (x >= 0 && x < NUMCOLS)
                     82:                    for (y = hero.y - 2; y <= hero.y + 2; y++)
                     83:                        if (y >= 0 && y <= NUMLINES - 1)
                     84:                            if ((obj = moat(y, x)) != NULL && on(*obj, ISRUN))
                     85:                            {
                     86:                                obj->t_flags &= ~ISRUN;
                     87:                                obj->t_flags |= ISHELD;
                     88:                                ch++;
                     89:                            }
                     90:            if (ch)
                     91:            {
                     92:                addmsg("the monster");
                     93:                if (ch > 1)
                     94:                    addmsg("s around you");
                     95:                addmsg(" freeze");
                     96:                if (ch == 1)
                     97:                    addmsg("s");
                     98:                endmsg();
                     99:                scr_info[S_HOLD].oi_know = TRUE;
                    100:            }
                    101:            else
                    102:                msg("you feel a strange sense of loss");
                    103:        when S_SLEEP:
                    104:            /*
                    105:             * Scroll which makes you fall asleep
                    106:             */
                    107:            scr_info[S_SLEEP].oi_know = TRUE;
                    108:            no_command += rnd(SLEEPTIME) + 4;
                    109:            player.t_flags &= ~ISRUN;
                    110:            msg("you fall asleep");
                    111:        when S_CREATE:
                    112:            /*
                    113:             * Create a monster:
                    114:             * First look in a circle around him, next try his room
                    115:             * otherwise give up
                    116:             */
                    117:            i = 0;
                    118:            for (y = hero.y - 1; y <= hero.y + 1; y++)
                    119:                for (x = hero.x - 1; x <= hero.x + 1; x++)
                    120:                    /*
                    121:                     * Don't put a monster in top of the player.
                    122:                     */
                    123:                    if (y == hero.y && x == hero.x)
                    124:                        continue;
                    125:                    /*
                    126:                     * Or anything else nasty
                    127:                     * Also avoid a xeroc which is disguised as scroll
                    128:                     */
                    129:                    else if (moat(y, x) == NULL && step_ok(ch = winat(y, x)))
                    130:                    {
                    131:                        if (ch == SCROLL
                    132:                            && find_obj(y, x)->o_which == S_SCARE)
                    133:                                continue;
                    134:                        else if (rnd(++i) == 0)
                    135:                        {
                    136:                            mp.y = y;
                    137:                            mp.x = x;
                    138:                        }
                    139:                    }
                    140:            if (i == 0)
                    141:                msg("you hear a faint cry of anguish in the distance");
                    142:            else
                    143:            {
                    144:                obj = new_item();
                    145:                new_monster(obj, randmonster(FALSE), &mp);
                    146:            }
                    147:        when S_ID_POTION:
                    148:        case S_ID_SCROLL:
                    149:        case S_ID_WEAPON:
                    150:        case S_ID_ARMOR:
                    151:        case S_ID_R_OR_S:
                    152:        {
                    153:            int id_type[S_ID_R_OR_S + 1] =
                    154:                { 0, 0, 0, 0, 0, POTION, SCROLL, WEAPON, ARMOR, R_OR_S };
                    155:            /*
                    156:             * Identify, let him figure something out
                    157:             */
                    158:            scr_info[obj->o_which].oi_know = TRUE;
                    159:            msg("this scroll is an %s scroll", scr_info[obj->o_which].oi_name);
                    160:            whatis(TRUE, id_type[obj->o_which]);
                    161:        }
                    162:        when S_MAP:
                    163:            /*
                    164:             * Scroll of magic mapping.
                    165:             */
                    166:            scr_info[S_MAP].oi_know = TRUE;
                    167:            msg("oh, now this scroll has a map on it");
                    168:            /*
                    169:             * take all the things we want to keep hidden out of the window
                    170:             */
                    171:            for (y = 1; y < NUMLINES - 1; y++)
                    172:                for (x = 0; x < NUMCOLS; x++)
                    173:                {
                    174:                    pp = INDEX(y, x);
                    175:                    switch (ch = pp->p_ch)
                    176:                    {
                    177:                        case DOOR:
                    178:                        case STAIRS:
                    179:                            break;
                    180:
                    181:                        case '-':
                    182:                        case '|':
                    183:                            if (!(pp->p_flags & F_REAL))
                    184:                            {
                    185:                                ch = pp->p_ch = DOOR;
                    186:                                pp->p_flags |= F_REAL;
                    187:                            }
                    188:                            break;
                    189:
                    190:                        case ' ':
                    191:                            if (pp->p_flags & F_REAL)
                    192:                                goto def;
                    193:                            pp->p_flags |= F_REAL;
                    194:                            ch = pp->p_ch = PASSAGE;
                    195:                            /* FALLTHROUGH */
                    196:
                    197:                        case PASSAGE:
                    198: pass:
                    199:                            if (!(pp->p_flags & F_REAL))
                    200:                                pp->p_ch = PASSAGE;
                    201:                            pp->p_flags |= (F_SEEN|F_REAL);
                    202:                            ch = PASSAGE;
                    203:                            break;
                    204:
                    205:                        case FLOOR:
                    206:                            if (pp->p_flags & F_REAL)
                    207:                                ch = ' ';
                    208:                            else
                    209:                            {
                    210:                                ch = TRAP;
                    211:                                pp->p_ch = TRAP;
                    212:                                pp->p_flags |= (F_SEEN|F_REAL);
                    213:                            }
                    214:                            break;
                    215:
                    216:                        default:
                    217: def:
                    218:                            if (pp->p_flags & F_PASS)
                    219:                                goto pass;
                    220:                            ch = ' ';
                    221:                            break;
                    222:                    }
                    223:                    if (ch != ' ')
                    224:                    {
                    225:                        if ((obj = pp->p_monst) != NULL)
                    226:                            obj->t_oldch = ch;
                    227:                        if (obj == NULL || !on(player, SEEMONST))
                    228:                            mvaddch(y, x, ch);
                    229:                    }
                    230:                }
                    231:        when S_FDET:
                    232:            /*
                    233:             * Potion of gold detection
                    234:             */
                    235:            ch = FALSE;
                    236:            wclear(hw);
                    237:            for (obj = lvl_obj; obj != NULL; obj = next(obj))
                    238:                if (obj->o_type == FOOD)
                    239:                {
                    240:                    ch = TRUE;
                    241:                    wmove(hw, obj->o_pos.y, obj->o_pos.x);
                    242:                    waddch(hw, FOOD);
                    243:                }
                    244:            if (ch)
                    245:            {
                    246:                scr_info[S_FDET].oi_know = TRUE;
                    247:                show_win("Your nose tingles and you smell food.--More--");
                    248:            }
                    249:            else
                    250:                msg("your nose tingles");
                    251:        when S_TELEP:
                    252:            /*
                    253:             * Scroll of teleportation:
                    254:             * Make him dissapear and reappear
                    255:             */
                    256:            {
                    257:                cur_room = proom;
                    258:                teleport();
                    259:                if (cur_room != proom)
                    260:                    scr_info[S_TELEP].oi_know = TRUE;
                    261:            }
                    262:        when S_ENCH:
                    263:            if (cur_weapon == NULL || cur_weapon->o_type != WEAPON)
                    264:                msg("you feel a strange sense of loss");
                    265:            else
                    266:            {
                    267:                cur_weapon->o_flags &= ~ISCURSED;
                    268:                if (rnd(2) == 0)
                    269:                    cur_weapon->o_hplus++;
                    270:                else
                    271:                    cur_weapon->o_dplus++;
                    272:                msg("your %s glows %s for a moment",
                    273:                    weap_info[cur_weapon->o_which].oi_name, pick_color("blue"));
                    274:            }
                    275:        when S_SCARE:
                    276:            /*
                    277:             * Reading it is a mistake and produces laughter at her
                    278:             * poor boo boo.
                    279:             */
                    280:            msg("you hear maniacal laughter in the distance");
                    281:        when S_REMOVE:
                    282:            uncurse(cur_armor);
                    283:            uncurse(cur_weapon);
                    284:            uncurse(cur_ring[LEFT]);
                    285:            uncurse(cur_ring[RIGHT]);
                    286:            msg(choose_str("you feel in touch with the Universal Onenes",
                    287:                           "you feel as if somebody is watching over you"));
                    288:        when S_AGGR:
                    289:            /*
                    290:             * This scroll aggravates all the monsters on the current
                    291:             * level and sets them running towards the hero
                    292:             */
                    293:            aggravate();
                    294:            msg("you hear a high pitched humming noise");
                    295:        when S_PROTECT:
                    296:            if (cur_armor != NULL)
                    297:            {
                    298:                cur_armor->o_flags |= ISPROT;
                    299:                msg("your armor is covered by a shimmering %s shield",
                    300:                    pick_color("gold"));
                    301:            }
                    302:            else
                    303:                msg("you feel a strange sense of loss");
                    304: #ifdef MASTER
                    305:        otherwise:
                    306:            msg("what a puzzling scroll!");
                    307:            return;
                    308: #endif
                    309:     }
                    310:     obj = orig_obj;
                    311:     look(TRUE);        /* put the result of the scroll on the screen */
                    312:     status();
                    313:
                    314:     call_it(&scr_info[obj->o_which]);
                    315:
                    316:     if (discardit)
                    317:        discard(obj);
                    318: }
                    319:
                    320: /*
                    321:  * uncurse:
                    322:  *     Uncurse an item
                    323:  */
                    324:
                    325: void
                    326: uncurse(THING *obj)
                    327: {
                    328:     if (obj != NULL)
                    329:        obj->o_flags &= ~ISCURSED;
                    330: }

CVSweb