Annotation of researchv10no/games/rogue/scrolls.c, revision 1.1.1.1

1.1       root        1: 
                      2: /*
                      3:  * Read a scroll and let it happen
                      4:  *
                      5:  * @(#)scrolls.c       3.5 (Berkeley) 6/15/81
                      6:  */
                      7: 
                      8: #include <curses.h>
                      9: #include <ctype.h>
                     10: #include "rogue.h"
                     11: 
                     12: read_scroll()
                     13: {
                     14:     register struct object *obj;
                     15:     register struct linked_list *item;
                     16:     register struct room *rp;
                     17:     register int i,j;
                     18:     register char ch, nch;
                     19:     register struct linked_list *titem;
                     20:     char buf[80];
                     21: 
                     22:     item = get_item("read", SCROLL);
                     23:     if (item == NULL)
                     24:        return;
                     25:     obj = (struct object *) ldata(item);
                     26:     if (obj->o_type != SCROLL)
                     27:     {
                     28:        if (!terse)
                     29:            msg("There is nothing on it to read");
                     30:        else
                     31:            msg("Nothing to read");
                     32:        return;
                     33:     }
                     34:     msg("As you read the scroll, it vanishes.");
                     35:     /*
                     36:      * Calculate the effect it has on the poor guy.
                     37:      */
                     38:     if (obj == cur_weapon)
                     39:        cur_weapon = NULL;
                     40:     switch(obj->o_which)
                     41:     {
                     42:        when S_CONFUSE:
                     43:            /*
                     44:             * Scroll of monster confusion.  Give him that power.
                     45:             */
                     46:            msg("Your hands begin to glow red");
                     47:            player.t_flags |= CANHUH;
                     48:        when S_LIGHT:
                     49:            s_know[S_LIGHT] = TRUE;
                     50:            if ((rp = roomin(&hero)) == NULL)
                     51:                msg("The corridor glows and then fades");
                     52:            else
                     53:            {
                     54:                addmsg("The room is lit");
                     55:                if (!terse)
                     56:                    addmsg(" by a shimmering blue light.");
                     57:                endmsg();
                     58:                rp->r_flags &= ~ISDARK;
                     59:                /*
                     60:                 * Light the room and put the player back up
                     61:                 */
                     62:                light(&hero);
                     63:                mvwaddch(cw, hero.y, hero.x, PLAYER);
                     64:            }
                     65:        when S_ARMOR:
                     66:            if (cur_armor != NULL)
                     67:            {
                     68:                msg("Your armor glows faintly for a moment");
                     69:                cur_armor->o_ac--;
                     70:                cur_armor->o_flags &= ~ISCURSED;
                     71:            }
                     72:        when S_HOLD:
                     73:            /*
                     74:             * Hold monster scroll.  Stop all monsters within two spaces
                     75:             * from chasing after the hero.
                     76:             */
                     77:            {
                     78:                register int x,y;
                     79:                register struct linked_list *mon;
                     80: 
                     81:                for (x = hero.x-2; x <= hero.x+2; x++)
                     82:                    for (y = hero.y-2; y <= hero.y+2; y++)
                     83:                        if (y > 0 && x > 0 && isupper(mvwinch(mw, y, x)))
                     84:                            if ((mon = find_mons(y, x)) != NULL)
                     85:                            {
                     86:                                register struct thing *th;
                     87: 
                     88:                                th = (struct thing *) ldata(mon);
                     89:                                th->t_flags &= ~ISRUN;
                     90:                                th->t_flags |= ISHELD;
                     91:                            }
                     92:            }
                     93:        when S_SLEEP:
                     94:            /*
                     95:             * Scroll which makes you fall asleep
                     96:             */
                     97:            s_know[S_SLEEP] = TRUE;
                     98:            msg("You fall asleep.");
                     99:            no_command += 4 + rnd(SLEEPTIME);
                    100:        when S_CREATE:
                    101:            /*
                    102:             * Create a monster
                    103:             * First look in a circle around him, next try his room
                    104:             * otherwise give up
                    105:             */
                    106:            {
                    107:                register int x, y;
                    108:                register bool appear = 0;
                    109:                coord mp;
                    110: 
                    111:                /*
                    112:                 * Search for an open place
                    113:                 */
                    114:                for (y = hero.y; y <= hero.y+1; y++)
                    115:                    for (x = hero.x; x <= hero.x+1; x++)
                    116:                    {
                    117:                        /*
                    118:                         * Don't put a monster in top of the player.
                    119:                         */
                    120:                        if (y == hero.y && x == hero.x)
                    121:                            continue;
                    122:                        /*
                    123:                         * Or anything else nasty
                    124:                         */
                    125:                        if (step_ok(winat(y, x)))
                    126:                        {
                    127:                            if (rnd(++appear) == 0)
                    128:                            {
                    129:                                mp.y = y;
                    130:                                mp.x = x;
                    131:                            }
                    132:                        }
                    133:                    }
                    134:                if (appear)
                    135:                {
                    136:                    titem = new_item(sizeof (struct thing));
                    137:                    new_monster(titem, randmonster(FALSE), &mp);
                    138:                }
                    139:                else
                    140:                    msg("You hear a faint cry of anguish in the distance.");
                    141:            }
                    142:        when S_IDENT:
                    143:            /*
                    144:             * Identify, let the rogue figure something out
                    145:             */
                    146:            msg("This scroll is an identify scroll");
                    147:            s_know[S_IDENT] = TRUE;
                    148:            whatis();
                    149:        when S_MAP:
                    150:            /*
                    151:             * Scroll of magic mapping.
                    152:             */
                    153:            s_know[S_MAP] = TRUE;
                    154:            msg("Oh, now this scroll has a map on it.");
                    155:            overwrite(stdscr, hw);
                    156:            /*
                    157:             * Take all the things we want to keep hidden out of the window
                    158:             */
                    159:            for (i = 0; i < LINES; i++)
                    160:                for (j = 0; j < COLS; j++)
                    161:                {
                    162:                    switch (nch = ch = mvwinch(hw, i, j))
                    163:                    {
                    164:                        case SECRETDOOR:
                    165:                            mvaddch(i, j, nch = DOOR);
                    166:                        case '-':
                    167:                        case '|':
                    168:                        case DOOR:
                    169:                        case PASSAGE:
                    170:                        case ' ':
                    171:                        case STAIRS:
                    172:                            if (mvwinch(mw, i, j) != ' ')
                    173:                            {
                    174:                                register struct thing *it;
                    175: 
                    176:                                it = (struct thing *) ldata(find_mons(i, j));
                    177:                                if (it->t_oldch == ' ')
                    178:                                    it->t_oldch = nch;
                    179:                            }
                    180:                            break;
                    181:                        default:
                    182:                            nch = ' ';
                    183:                    }
                    184:                    if (nch != ch)
                    185:                        waddch(hw, nch);
                    186:                }
                    187:            /*
                    188:             * Copy in what he has discovered
                    189:             */
                    190:            overlay(cw, hw);
                    191:            /*
                    192:             * And set up for display
                    193:             */
                    194:            overwrite(hw, cw);
                    195:        when S_GFIND:
                    196:            /*
                    197:             * Potion of gold detection
                    198:             */
                    199:            {
                    200:                int gtotal = 0;
                    201: 
                    202:                wclear(hw);
                    203:                for (i = 0; i < MAXROOMS; i++)
                    204:                {
                    205:                    gtotal += rooms[i].r_goldval;
                    206:                    if (rooms[i].r_goldval != 0 &&
                    207:                        mvwinch(stdscr, rooms[i].r_gold.y, rooms[i].r_gold.x)
                    208:                        == GOLD)
                    209:                        mvwaddch(hw,rooms[i].r_gold.y,rooms[i].r_gold.x,GOLD);
                    210:                }
                    211:                if (gtotal)
                    212:                {
                    213:                    s_know[S_GFIND] = TRUE;
                    214:                    show_win(hw,
                    215:                        "You begin to feel greedy and you sense gold.--More--");
                    216:                }
                    217:                else msg("You begin to feel a pull downward");
                    218:            }
                    219:        when S_TELEP:
                    220:            /*
                    221:             * Scroll of teleportation:
                    222:             * Make him dissapear and reappear
                    223:             */
                    224:            {
                    225:                int rm;
                    226:                struct room *cur_room;
                    227: 
                    228:                cur_room = roomin(&hero);
                    229:                rm = teleport();
                    230:                if (cur_room != &rooms[rm])
                    231:                    s_know[S_TELEP] = TRUE;
                    232:            }
                    233:        when S_ENCH:
                    234:            if (cur_weapon == NULL)
                    235:                msg("You feel a strange sense of loss.");
                    236:            else
                    237:            {
                    238:                cur_weapon->o_flags &= ~ISCURSED;
                    239:                if (rnd(100) > 50)
                    240:                    cur_weapon->o_hplus++;
                    241:                else
                    242:                    cur_weapon->o_dplus++;
                    243:                msg("Your %s glows blue for a moment.", w_names[cur_weapon->o_which]);
                    244:            }
                    245:        when S_SCARE:
                    246:            /*
                    247:             * A monster will refuse to step on a scare monster scroll
                    248:             * if it is dropped.  Thus reading it is a mistake and produces
                    249:             * laughter at the poor rogue's boo boo.
                    250:             */
                    251:            msg("You hear maniacal laughter in the distance.");
                    252:        when S_REMOVE:
                    253:            if (cur_armor != NULL)
                    254:                cur_armor->o_flags &= ~ISCURSED;
                    255:            if (cur_weapon != NULL)
                    256:                cur_weapon->o_flags &= ~ISCURSED;
                    257:            if (cur_ring[LEFT] != NULL)
                    258:                cur_ring[LEFT]->o_flags &= ~ISCURSED;
                    259:            if (cur_ring[RIGHT] != NULL)
                    260:                cur_ring[RIGHT]->o_flags &= ~ISCURSED;
                    261:            msg("You feel as if somebody is watching over you.");
                    262:        when S_AGGR:
                    263:            /*
                    264:             * This scroll aggravates all the monsters on the current
                    265:             * level and sets them running towards the hero
                    266:             */
                    267:            aggravate();
                    268:            msg("You hear a high pitched humming noise.");
                    269:        when S_NOP:
                    270:            msg("This scroll seems to be blank.");
                    271:        when S_GENOCIDE:
                    272:            msg("You have been granted the boon of genocide");
                    273:            genocide();
                    274:            s_know[S_GENOCIDE] = TRUE;
                    275:        otherwise:
                    276:            msg("What a puzzling scroll!");
                    277:            return;
                    278:     }
                    279:     look(TRUE);        /* put the result of the scroll on the screen */
                    280:     status();
                    281:     if (s_know[obj->o_which] && s_guess[obj->o_which])
                    282:     {
                    283:        cfree(s_guess[obj->o_which]);
                    284:        s_guess[obj->o_which] = NULL;
                    285:     }
                    286:     else if (!s_know[obj->o_which] && askme && s_guess[obj->o_which] == NULL)
                    287:     {
                    288:        msg(terse ? "Call it: " : "What do you want to call it? ");
                    289:        if (get_str(buf, cw) == NORM)
                    290:        {
                    291:            s_guess[obj->o_which] = malloc((unsigned int) strlen(buf) + 1);
                    292:            strcpy(s_guess[obj->o_which], buf);
                    293:        }
                    294:     }
                    295:     /*
                    296:      * Get rid of the thing
                    297:      */
                    298:     inpack--;
                    299:     if (obj->o_count > 1)
                    300:        obj->o_count--;
                    301:     else
                    302:     {
                    303:        detach(pack, item);
                    304:         discard(item);
                    305:     }
                    306: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.