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

Annotation of early-roguelike/rogue3/fight.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:  * All the fighting gets done here
                      3:  *
                      4:  * @(#)fight.c 3.28 (Berkeley) 6/15/81
                      5:  *
                      6:  * Rogue: Exploring the Dungeons of Doom
                      7:  * Copyright (C) 1980, 1981 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 <string.h>
                     16: #include <stdlib.h>
                     17: #include "rogue.h"
                     18:
                     19: int e_levels[] = {
                     20:     10,20,40,80,160,320,640,1280,2560,5120,10240,20480,
                     21:     40920, 81920, 163840, 327680, 655360, 1310720, 2621440, 0 };
                     22:
                     23: /*
                     24:  * fight:
                     25:  *     The player attacks the monster.
                     26:  */
                     27:
                     28: int
                     29: fight(coord *mp, int mn, struct object *weap, int thrown)
                     30: {
                     31:     struct thing *tp;
                     32:     struct linked_list *item;
                     33:     int did_hit = TRUE;
                     34:
                     35:     /*
                     36:      * Find the monster we want to fight
                     37:      */
                     38:     if ((item = find_mons(mp->y, mp->x)) == NULL)
                     39:     {
                     40:        debug("Fight what @ %d,%d", mp->y, mp->x);
                     41:        return(0);
                     42:     }
                     43:     tp = (struct thing *) ldata(item);
                     44:     /*
                     45:      * Since we are fighting, things are not quiet so no healing takes
                     46:      * place.
                     47:      */
                     48:     quiet = 0;
                     49:     runto(mp, &hero);
                     50:     /*
                     51:      * Let him know it was really a mimic (if it was one).
                     52:      */
                     53:     if (tp->t_type == 'M' && tp->t_disguise != 'M' && off(player, ISBLIND))
                     54:     {
                     55:        msg("Wait! That's a mimic!");
                     56:        tp->t_disguise = 'M';
                     57:        did_hit = thrown;
                     58:     }
                     59:     if (did_hit)
                     60:     {
                     61:        char *mname;
                     62:
                     63:        did_hit = FALSE;
                     64:        if (on(player, ISBLIND))
                     65:            mname = "it";
                     66:        else
                     67:            mname = monsters[mn-'A'].m_name;
                     68:        if (roll_em(&pstats, &tp->t_stats, weap, thrown))
                     69:        {
                     70:            did_hit = TRUE;
                     71:            if (thrown)
                     72:                thunk(weap, mname);
                     73:            else
                     74:                hit(NULL, mname);
                     75:            if (on(player, CANHUH))
                     76:            {
                     77:                msg("Your hands stop glowing red");
                     78:                msg("The %s appears confused.", mname);
                     79:                tp->t_flags |= ISHUH;
                     80:                player.t_flags &= ~CANHUH;
                     81:            }
                     82:            if (tp->t_stats.s_hpt <= 0)
                     83:                killed(item, TRUE);
                     84:        }
                     85:        else
                     86:            if (thrown)
                     87:                bounce(weap, mname);
                     88:            else
                     89:                miss(NULL, mname);
                     90:     }
                     91:     count = 0;
                     92:     return did_hit;
                     93: }
                     94:
                     95: /*
                     96:  * attack:
                     97:  *     The monster attacks the player
                     98:  */
                     99:
                    100: int
                    101: attack(struct thing *mp)
                    102: {
                    103:     char *mname;
                    104:
                    105:     /*
                    106:      * Since this is an attack, stop running and any healing that was
                    107:      * going on at the time.
                    108:      */
                    109:     running = FALSE;
                    110:     quiet = 0;
                    111:     if (mp->t_type == 'F')
                    112:        fung_hit = atoi(mp->t_stats.s_dmg);
                    113:     if (mp->t_type == 'M' && off(player, ISBLIND))
                    114:        mp->t_disguise = 'M';
                    115:     if (on(player, ISBLIND))
                    116:        mname = "it";
                    117:     else
                    118:        mname = monsters[mp->t_type-'A'].m_name;
                    119:     if (roll_em(&mp->t_stats, &pstats, NULL, FALSE))
                    120:     {
                    121:        if (mp->t_type != 'E')
                    122:            hit(mname, NULL);
                    123:        if (pstats.s_hpt <= 0)
                    124:            death(mp->t_type);  /* Bye bye life ... */
                    125:        if (off(*mp, ISCANC))
                    126:            switch (mp->t_type)
                    127:            {
                    128:                case 'R':
                    129:                    /*
                    130:                     * If a rust monster hits, you lose armor
                    131:                     */
                    132:                    if (cur_armor != NULL && cur_armor->o_ac < 9)
                    133:                    {
                    134:                        if (!terse)
                    135:                            msg("Your armor appears to be weaker now. Oh my!");
                    136:                        else
                    137:                            msg("Your armor weakens");
                    138:                        cur_armor->o_ac++;
                    139:                    }
                    140:                when 'E':
                    141:                    /*
                    142:                     * The gaze of the floating eye hypnotizes you
                    143:                     */
                    144:                    if (on(player, ISBLIND))
                    145:                        break;
                    146:                    if (!no_command)
                    147:                    {
                    148:                        addmsg("You are transfixed");
                    149:                        if (!terse)
                    150:                            addmsg(" by the gaze of the floating eye.");
                    151:                        endmsg();
                    152:                    }
                    153:                    no_command += rnd(2)+2;
                    154:                    if (no_command > 100 && food_left <= 0)
                    155:                        death('E');
                    156:                when 'A':
                    157:                    /*
                    158:                     * Ants have poisonous bites
                    159:                     */
                    160:                    if (!save(VS_POISON))
                    161:                        if (!ISWEARING(R_SUSTSTR))
                    162:                        {
                    163:                            chg_str(-1);
                    164:                            if (!terse)
                    165:                                msg("You feel a sting in your arm and now feel weaker");
                    166:                            else
                    167:                                msg("A sting has weakened you");
                    168:                        }
                    169:                        else
                    170:                            if (!terse)
                    171:                                msg("A sting momentarily weakens you");
                    172:                            else
                    173:                                msg("Sting has no effect");
                    174:                when 'W':
                    175:                    /*
                    176:                     * Wraiths might drain energy levels
                    177:                     */
                    178:                    if (rnd(100) < 15)
                    179:                    {
                    180:                        int fewer;
                    181:
                    182:                        if (pstats.s_exp == 0)
                    183:                            death('W');         /* All levels gone */
                    184:                        msg("You suddenly feel weaker.");
                    185:                        if (--pstats.s_lvl == 0)
                    186:                        {
                    187:                            pstats.s_exp = 0;
                    188:                            pstats.s_lvl = 1;
                    189:                        }
                    190:                        else
                    191:                            pstats.s_exp = e_levels[pstats.s_lvl-1]+1;
                    192:                        fewer = roll(1, 10);
                    193:                        pstats.s_hpt -= fewer;
                    194:                        max_hp -= fewer;
                    195:                        if (pstats.s_hpt < 1)
                    196:                            pstats.s_hpt = 1;
                    197:                        if (max_hp < 1)
                    198:                            death('W');
                    199:                    }
                    200:                when 'F':
                    201:                    /*
                    202:                     * Violet fungi stops the poor guy from moving
                    203:                     */
                    204:                    player.t_flags |= ISHELD;
                    205:                    sprintf(mp->t_stats.s_dmg, "%dd1", ++fung_hit);
                    206:                when 'L':
                    207:                {
                    208:                    /*
                    209:                     * Leperachaun steals some gold
                    210:                     */
                    211:                    int lastpurse;
                    212:
                    213:                    lastpurse = purse;
                    214:                    purse -= GOLDCALC;
                    215:                    if (!save(VS_MAGIC))
                    216:                        purse -= GOLDCALC + GOLDCALC + GOLDCALC + GOLDCALC;
                    217:                    if (purse < 0)
                    218:                        purse = 0;
                    219:                    if (purse != lastpurse)
                    220:                        msg("Your purse feels lighter");
                    221:                    remove_monster(&mp->t_pos, find_mons(mp->t_pos.y, mp->t_pos.x));
                    222:                    mp = NULL;
                    223:                }
                    224:                when 'N':
                    225:                {
                    226:                    struct linked_list *list, *steal;
                    227:                    struct object *obj;
                    228:                    int nobj;
                    229:
                    230:                    /*
                    231:                     * Nymph's steal a magic item, look through the pack
                    232:                     * and pick out one we like.
                    233:                     */
                    234:                    steal = NULL;
                    235:                    for (nobj = 0, list = pack; list != NULL; list = next(list))
                    236:                    {
                    237:                        obj = (struct object *) ldata(list);
                    238:                        if (obj != cur_armor &&
                    239:                             obj != cur_weapon &&
                    240:                             obj != cur_ring[LEFT] &&
                    241:                             obj != cur_ring[RIGHT] && /* Nymph bug fix */
                    242:                            is_magic(obj) &&
                    243:                             rnd(++nobj) == 0)
                    244:                                steal = list;
                    245:                    }
                    246:                    if (steal != NULL)
                    247:                    {
                    248:                        struct object *sobj;
                    249:
                    250:                        sobj = (struct object *) ldata(steal);
                    251:                        remove_monster(&mp->t_pos, find_mons(mp->t_pos.y, mp->t_pos.x));
                    252:                        mp = NULL;
                    253:                        if (sobj->o_count > 1 && sobj->o_group == 0)
                    254:                        {
                    255:                            int oc;
                    256:
                    257:                            oc = sobj->o_count;
                    258:                            sobj->o_count = 1;
                    259:                            msg("She stole %s!", inv_name(sobj, TRUE));
                    260:                            sobj->o_count = oc - 1;
                    261:                        }
                    262:                        else
                    263:                        {
                    264:                            msg("She stole %s!", inv_name(sobj, TRUE));
                    265:                            detach(pack, steal);
                    266:                            discard(steal);
                    267:                        }
                    268:                        inpack--;
                    269:                    }
                    270:                }
                    271:                otherwise:
                    272:                    break;
                    273:            }
                    274:     }
                    275:     else if (mp->t_type != 'E')
                    276:     {
                    277:        if (mp->t_type == 'F')
                    278:        {
                    279:            pstats.s_hpt -= fung_hit;
                    280:            if (pstats.s_hpt <= 0)
                    281:                death(mp->t_type);      /* Bye bye life ... */
                    282:        }
                    283:        miss(mname, NULL);
                    284:     }
                    285:     /*
                    286:      * Check to see if this is a regenerating monster and let it heal if
                    287:      * it is.
                    288:      */
                    289:     if ((mp != NULL) && (on(*mp, ISREGEN) && rnd(100) < 33))
                    290:        mp->t_stats.s_hpt++;
                    291:     if (fight_flush)
                    292:     {
                    293:        flush_type();   /* flush typeahead */
                    294:     }
                    295:     count = 0;
                    296:     status();
                    297:
                    298:     if (mp == NULL)
                    299:         return(-1);
                    300:     else
                    301:         return(0);
                    302: }
                    303:
                    304: /*
                    305:  * swing:
                    306:  *     returns true if the swing hits
                    307:  */
                    308:
                    309: int
                    310: swing(int at_lvl, int op_arm, int wplus)
                    311: {
                    312:     int res = rnd(20)+1;
                    313:     int need = (21-at_lvl)-op_arm;
                    314:
                    315:     return (res+wplus >= need);
                    316: }
                    317:
                    318: /*
                    319:  * check_level:
                    320:  *     Check to see if the guy has gone up a level.
                    321:  */
                    322:
                    323: void
                    324: check_level()
                    325: {
                    326:     int i, add;
                    327:
                    328:     for (i = 0; e_levels[i] != 0; i++)
                    329:        if (e_levels[i] > pstats.s_exp)
                    330:            break;
                    331:     i++;
                    332:     if (i > pstats.s_lvl)
                    333:     {
                    334:        add = roll(i-pstats.s_lvl,10);
                    335:        max_hp += add;
                    336:        if ((pstats.s_hpt += add) > max_hp)
                    337:            pstats.s_hpt = max_hp;
                    338:        msg("Welcome to level %d", i);
                    339:     }
                    340:     pstats.s_lvl = i;
                    341: }
                    342:
                    343: /*
                    344:  * roll_em:
                    345:  *     Roll several attacks
                    346:  */
                    347:
                    348: int
                    349: roll_em(struct stats *att, struct stats *def, struct object *weap, int hurl)
                    350: {
                    351:     char *cp;
                    352:     int ndice, nsides, def_arm;
                    353:     int did_hit = FALSE;
                    354:     int prop_hplus, prop_dplus;
                    355:
                    356:     prop_hplus = prop_dplus = 0;
                    357:     if (weap == NULL)
                    358:        cp = att->s_dmg;
                    359:     else if (hurl)
                    360:        if ((weap->o_flags&ISMISL) && cur_weapon != NULL &&
                    361:          cur_weapon->o_which == weap->o_launch)
                    362:        {
                    363:            cp = weap->o_hurldmg;
                    364:            prop_hplus = cur_weapon->o_hplus;
                    365:            prop_dplus = cur_weapon->o_dplus;
                    366:        }
                    367:        else
                    368:            cp = (weap->o_flags&ISMISL ? weap->o_damage : weap->o_hurldmg);
                    369:     else
                    370:     {
                    371:        cp = weap->o_damage;
                    372:        /*
                    373:         * Drain a staff of striking
                    374:         */
                    375:        if (weap->o_type == STICK && weap->o_which == WS_HIT
                    376:            && weap->o_charges == 0)
                    377:                {
                    378:                    strcpy(weap->o_damage,"0d0");
                    379:                    weap->o_hplus = weap->o_dplus = 0;
                    380:                }
                    381:     }
                    382:     for (;;)
                    383:     {
                    384:        int damage;
                    385:        int hplus = prop_hplus + (weap == NULL ? 0 : weap->o_hplus);
                    386:        int dplus = prop_dplus + (weap == NULL ? 0 : weap->o_dplus);
                    387:
                    388:        if (weap == cur_weapon)
                    389:        {
                    390:            if (ISRING(LEFT, R_ADDDAM))
                    391:                dplus += cur_ring[LEFT]->o_ac;
                    392:            else if (ISRING(LEFT, R_ADDHIT))
                    393:                hplus += cur_ring[LEFT]->o_ac;
                    394:            if (ISRING(RIGHT, R_ADDDAM))
                    395:                dplus += cur_ring[RIGHT]->o_ac;
                    396:            else if (ISRING(RIGHT, R_ADDHIT))
                    397:                hplus += cur_ring[RIGHT]->o_ac;
                    398:        }
                    399:        ndice = atoi(cp);
                    400:        if ((cp = strchr(cp, 'd')) == NULL)
                    401:            break;
                    402:        nsides = atoi(++cp);
                    403:        if (def == &pstats)
                    404:        {
                    405:            if (cur_armor != NULL)
                    406:                def_arm = cur_armor->o_ac;
                    407:            else
                    408:                def_arm = def->s_arm;
                    409:            if (ISRING(LEFT, R_PROTECT))
                    410:                def_arm -= cur_ring[LEFT]->o_ac;
                    411:            else if (ISRING(RIGHT, R_PROTECT))
                    412:                def_arm -= cur_ring[RIGHT]->o_ac;
                    413:        }
                    414:        else
                    415:            def_arm = def->s_arm;
                    416:        if (swing(att->s_lvl, def_arm, hplus+str_plus(&att->s_str)))
                    417:        {
                    418:            int proll;
                    419:
                    420:            proll = roll(ndice, nsides);
                    421:            if (ndice + nsides > 0 && proll < 1)
                    422:                debug("Damage for %dd%d came out %d.", ndice, nsides, proll);
                    423:            damage = dplus + proll + add_dam(&att->s_str);
                    424:            def->s_hpt -= max(0, damage);
                    425:            did_hit = TRUE;
                    426:        }
                    427:        if ((cp = strchr(cp, '/')) == NULL)
                    428:            break;
                    429:        cp++;
                    430:     }
                    431:     return did_hit;
                    432: }
                    433:
                    434: /*
                    435:  * prname:
                    436:  *     The print name of a combatant
                    437:  */
                    438:
                    439: char *
                    440: prname(who, upper)
                    441: char *who;
                    442: int upper;
                    443: {
                    444:     static char tbuf[80];
                    445:
                    446:     *tbuf = '\0';
                    447:     if (who == 0)
                    448:        strcpy(tbuf, "you");
                    449:     else if (on(player, ISBLIND))
                    450:        strcpy(tbuf, "it");
                    451:     else
                    452:     {
                    453:        strcpy(tbuf, "the ");
                    454:        strcat(tbuf, who);
                    455:     }
                    456:     if (upper)
                    457:        *tbuf = toupper(*tbuf);
                    458:     return tbuf;
                    459: }
                    460:
                    461: /*
                    462:  * hit:
                    463:  *     Print a message to indicate a succesful hit
                    464:  */
                    465:
                    466: void
                    467: hit(char *er, char *ee)
                    468: {
                    469:     char *s = "";
                    470:
                    471:     addmsg(prname(er, TRUE));
                    472:     if (terse)
                    473:        s = " hit.";
                    474:     else
                    475:        switch (rnd(4))
                    476:        {
                    477:            case 0: s = " scored an excellent hit on ";
                    478:            when 1: s = " hit ";
                    479:            when 2: s = (er == 0 ? " have injured " : " has injured ");
                    480:            when 3: s = (er == 0 ? " swing and hit " : " swings and hits ");
                    481:        }
                    482:     addmsg(s);
                    483:     if (!terse)
                    484:        addmsg(prname(ee, FALSE));
                    485:     endmsg();
                    486: }
                    487:
                    488: /*
                    489:  * miss:
                    490:  *     Print a message to indicate a poor swing
                    491:  */
                    492:
                    493: void
                    494: miss(char *er, char *ee)
                    495: {
                    496:     char *s = "";
                    497:
                    498:     addmsg(prname(er, TRUE));
                    499:     switch (terse ? 0 : rnd(4))
                    500:     {
                    501:        case 0: s = (er == 0 ? " miss" : " misses");
                    502:        when 1: s = (er == 0 ? " swing and miss" : " swings and misses");
                    503:        when 2: s = (er == 0 ? " barely miss" : " barely misses");
                    504:        when 3: s = (er == 0 ? " don't hit" : " doesn't hit");
                    505:     }
                    506:     addmsg(s);
                    507:     if (!terse)
                    508:        addmsg(" %s", prname(ee, FALSE));
                    509:     endmsg();
                    510: }
                    511:
                    512: /*
                    513:  * save_throw:
                    514:  *     See if a creature save against something
                    515:  */
                    516: int
                    517: save_throw(int which, struct thing *tp)
                    518: {
                    519:     int need;
                    520:
                    521:     need = 14 + which - tp->t_stats.s_lvl / 2;
                    522:     return (roll(1, 20) >= need);
                    523: }
                    524:
                    525: /*
                    526:  * save:
                    527:  *     See if he saves against various nasty things
                    528:  */
                    529:
                    530: int
                    531: save(int which)
                    532: {
                    533:     return save_throw(which, &player);
                    534: }
                    535:
                    536: /*
                    537:  * str_plus:
                    538:  *     compute bonus/penalties for strength on the "to hit" roll
                    539:  */
                    540:
                    541: int
                    542: str_plus(str_t *str)
                    543: {
                    544:     if (str->st_str == 18)
                    545:     {
                    546:        if (str->st_add == 100)
                    547:            return 3;
                    548:        if (str->st_add > 50)
                    549:            return 2;
                    550:     }
                    551:     if (str->st_str >= 17)
                    552:        return 1;
                    553:     if (str->st_str > 6)
                    554:        return 0;
                    555:     return str->st_str - 7;
                    556: }
                    557:
                    558: /*
                    559:  * add_dam:
                    560:  *     compute additional damage done for exceptionally high or low strength
                    561:  */
                    562:
                    563:  int
                    564:  add_dam(str_t *str)
                    565:  {
                    566:     if (str->st_str == 18)
                    567:     {
                    568:        if (str->st_add == 100)
                    569:            return 6;
                    570:        if (str->st_add > 90)
                    571:            return 5;
                    572:        if (str->st_add > 75)
                    573:            return 4;
                    574:        if (str->st_add != 0)
                    575:            return 3;
                    576:        return 2;
                    577:     }
                    578:     if (str->st_str > 15)
                    579:        return 1;
                    580:     if (str->st_str > 6)
                    581:        return 0;
                    582:     return str->st_str - 7;
                    583: }
                    584:
                    585: /*
                    586:  * raise_level:
                    587:  *     The guy just magically went up a level.
                    588:  */
                    589:
                    590: void
                    591: raise_level()
                    592: {
                    593:     pstats.s_exp = e_levels[pstats.s_lvl-1] + 1L;
                    594:     check_level();
                    595: }
                    596:
                    597: /*
                    598:  * thunk:
                    599:  *     A missile hits a monster
                    600:  */
                    601:
                    602: void
                    603: thunk(struct object *weap, char *mname)
                    604: {
                    605:     if (weap->o_type == WEAPON)
                    606:        msg("The %s hits the %s", w_names[weap->o_which], mname);
                    607:     else
                    608:        msg("You hit the %s.", mname);
                    609: }
                    610:
                    611: /*
                    612:  * bounce:
                    613:  *     A missile misses a monster
                    614:  */
                    615:
                    616: void
                    617: bounce(struct object *weap, char *mname)
                    618: {
                    619:     if (weap->o_type == WEAPON)
                    620:        msg("The %s misses the %s", w_names[weap->o_which], mname);
                    621:     else
                    622:        msg("You missed the %s.", mname);
                    623: }
                    624:
                    625: /*
                    626:  * remove a monster from the screen
                    627:  */
                    628: void
                    629: remove_monster(coord *mp, struct linked_list *item)
                    630: {
                    631:     mvwaddch(mw, mp->y, mp->x, ' ');
                    632:     mvwaddch(cw, mp->y, mp->x, ((struct thing *) ldata(item))->t_oldch);
                    633:     detach(mlist, item);
                    634:     discard(item);
                    635: }
                    636:
                    637: /*
                    638:  * is_magic:
                    639:  *     Returns true if an object radiates magic
                    640:  */
                    641:
                    642: int
                    643: is_magic(struct object *obj)
                    644: {
                    645:     switch (obj->o_type)
                    646:     {
                    647:        case ARMOR:
                    648:            return obj->o_ac != a_class[obj->o_which];
                    649:        when WEAPON:
                    650:            return obj->o_hplus != 0 || obj->o_dplus != 0;
                    651:        when POTION:
                    652:        case SCROLL:
                    653:        case STICK:
                    654:        case RING:
                    655:        case AMULET:
                    656:            return TRUE;
                    657:     }
                    658:     return FALSE;
                    659: }
                    660:
                    661: /*
                    662:  * killed:
                    663:  *     Called to put a monster to death
                    664:  */
                    665:
                    666: void
                    667: killed(struct linked_list *item, int pr)
                    668: {
                    669:     struct thing *tp;
                    670:     struct linked_list *pitem, *nexti;
                    671:
                    672:     tp = (struct thing *) ldata(item);
                    673:     if (pr)
                    674:     {
                    675:        addmsg(terse ? "Defeated " : "You have defeated ");
                    676:        if (on(player, ISBLIND))
                    677:            msg("it.");
                    678:        else
                    679:        {
                    680:            if (!terse)
                    681:                addmsg("the ");
                    682:            msg("%s.", monsters[tp->t_type-'A'].m_name);
                    683:        }
                    684:     }
                    685:     pstats.s_exp += tp->t_stats.s_exp;
                    686:     /*
                    687:      * Do adjustments if he went up a level
                    688:      */
                    689:     check_level();
                    690:     /*
                    691:      * If the monster was a violet fungi, un-hold him
                    692:      */
                    693:     switch (tp->t_type)
                    694:     {
                    695:        case 'F':
                    696:            player.t_flags &= ~ISHELD;
                    697:            fung_hit = 0;
                    698:        when 'L':
                    699:        {
                    700:            struct room *rp;
                    701:
                    702:            if ((rp = roomin(&tp->t_pos)) == NULL)
                    703:                break;
                    704:            if (rp->r_goldval != 0 || fallpos(&tp->t_pos,&rp->r_gold,FALSE))
                    705:            {
                    706:                rp->r_goldval += GOLDCALC;
                    707:                if (save(VS_MAGIC))
                    708:                    rp->r_goldval += GOLDCALC + GOLDCALC
                    709:                                   + GOLDCALC + GOLDCALC;
                    710:                mvwaddch(stdscr, rp->r_gold.y, rp->r_gold.x, GOLD);
                    711:                if (!(rp->r_flags & ISDARK))
                    712:                {
                    713:                    light(&hero);
                    714:                    mvwaddch(cw, hero.y, hero.x, PLAYER);
                    715:                }
                    716:            }
                    717:        }
                    718:     }
                    719:     /*
                    720:      * Empty the monsters pack
                    721:      */
                    722:     pitem = tp->t_pack;
                    723:     while (pitem != NULL)
                    724:     {
                    725:        struct object *obj;
                    726:
                    727:        nexti = next(tp->t_pack);
                    728:        obj = (struct object *) ldata(pitem);
                    729:        obj->o_pos = tp->t_pos;
                    730:        detach(tp->t_pack, pitem);
                    731:        fall(pitem, FALSE);
                    732:        pitem = nexti;
                    733:     }
                    734:     /*
                    735:      * Get rid of the monster.
                    736:      */
                    737:     remove_monster(&tp->t_pos, item);
                    738: }

CVSweb