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

Annotation of early-roguelike/rogue4/fight.c, Revision 1.1

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

CVSweb