Annotation of 43BSDReno/games/hack/hack.wizard.c, revision 1.1

1.1     ! root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
        !             2: /* hack.wizard.c - version 1.0.3 */
        !             3: 
        !             4: /* wizard code - inspired by rogue code from Merlyn Leroy (digi-g!brian) */
        !             5: 
        !             6: #include "hack.h"
        !             7: extern struct permonst pm_wizard;
        !             8: extern struct monst *makemon();
        !             9: 
        !            10: #define        WIZSHOT     6   /* one chance in WIZSHOT that wizard will try magic */
        !            11: #define        BOLT_LIM    8   /* from this distance D and 1 will try to hit you */
        !            12: 
        !            13: char wizapp[] = "@DNPTUVXcemntx";
        !            14: 
        !            15: /* If he has found the Amulet, make the wizard appear after some time */
        !            16: amulet(){
        !            17:        register struct obj *otmp;
        !            18:        register struct monst *mtmp;
        !            19: 
        !            20:        if(!flags.made_amulet || !flags.no_of_wizards)
        !            21:                return;
        !            22:        /* find wizard, and wake him if necessary */
        !            23:        for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
        !            24:            if(mtmp->data->mlet == '1' && mtmp->msleep && !rn2(40))
        !            25:                for(otmp = invent; otmp; otmp = otmp->nobj)
        !            26:                    if(otmp->olet == AMULET_SYM && !otmp->spe) {
        !            27:                        mtmp->msleep = 0;
        !            28:                        if(dist(mtmp->mx,mtmp->my) > 2)
        !            29:                            pline(
        !            30:     "You get the creepy feeling that somebody noticed your taking the Amulet."
        !            31:                            );
        !            32:                        return;
        !            33:                    }
        !            34: }
        !            35: 
        !            36: wiz_hit(mtmp)
        !            37: register struct monst *mtmp;
        !            38: {
        !            39:        /* if we have stolen or found the amulet, we disappear */
        !            40:        if(mtmp->minvent && mtmp->minvent->olet == AMULET_SYM &&
        !            41:            mtmp->minvent->spe == 0) {
        !            42:                /* vanish -- very primitive */
        !            43:                fall_down(mtmp);
        !            44:                return(1);
        !            45:        }
        !            46: 
        !            47:        /* if it is lying around someplace, we teleport to it */
        !            48:        if(!carrying(AMULET_OF_YENDOR)) {
        !            49:            register struct obj *otmp;
        !            50: 
        !            51:            for(otmp = fobj; otmp; otmp = otmp->nobj)
        !            52:                if(otmp->olet == AMULET_SYM && !otmp->spe) {
        !            53:                    if((u.ux != otmp->ox || u.uy != otmp->oy) &&
        !            54:                       !m_at(otmp->ox, otmp->oy)) {
        !            55: 
        !            56:                        /* teleport to it and pick it up */
        !            57:                        mtmp->mx = otmp->ox;
        !            58:                        mtmp->my = otmp->oy;
        !            59:                        freeobj(otmp);
        !            60:                        mpickobj(mtmp, otmp);
        !            61:                        pmon(mtmp);
        !            62:                        return(0);
        !            63:                    }
        !            64:                    goto hithim;
        !            65:                }
        !            66:            return(0);                          /* we don't know where it is */
        !            67:        }
        !            68: hithim:
        !            69:        if(rn2(2)) {                            /* hit - perhaps steal */
        !            70: 
        !            71:            /* if hit 1/20 chance of stealing amulet & vanish
        !            72:                - amulet is on level 26 again. */
        !            73:            if(hitu(mtmp, d(mtmp->data->damn,mtmp->data->damd))
        !            74:                && !rn2(20) && stealamulet(mtmp))
        !            75:                ;
        !            76:        }
        !            77:        else
        !            78:            inrange(mtmp);                      /* try magic */
        !            79:        return(0);
        !            80: }
        !            81: 
        !            82: inrange(mtmp)
        !            83: register struct monst *mtmp;
        !            84: {
        !            85:        register schar tx,ty;
        !            86: 
        !            87:        /* do nothing if cancelled (but make '1' say something) */
        !            88:        if(mtmp->data->mlet != '1' && mtmp->mcan)
        !            89:                return;
        !            90: 
        !            91:        /* spit fire only when both in a room or both in a corridor */
        !            92:        if(inroom(u.ux,u.uy) != inroom(mtmp->mx,mtmp->my)) return;
        !            93:        tx = u.ux - mtmp->mx;
        !            94:        ty = u.uy - mtmp->my;
        !            95:        if((!tx && abs(ty) < BOLT_LIM) || (!ty && abs(tx) < BOLT_LIM)
        !            96:            || (abs(tx) == abs(ty) && abs(tx) < BOLT_LIM)){
        !            97:            switch(mtmp->data->mlet) {
        !            98:            case 'D':
        !            99:                /* spit fire in the direction of @ (not nec. hitting) */
        !           100:                buzz(-1,mtmp->mx,mtmp->my,sgn(tx),sgn(ty));
        !           101:                break;
        !           102:            case '1':
        !           103:                if(rn2(WIZSHOT)) break;
        !           104:                /* if you zapped wizard with wand of cancellation,
        !           105:                he has to shake off the effects before he can throw
        !           106:                spells successfully.  1/2 the time they fail anyway */
        !           107:                if(mtmp->mcan || rn2(2)) {
        !           108:                    if(canseemon(mtmp))
        !           109:                        pline("%s makes a gesture, then curses.",
        !           110:                            Monnam(mtmp));
        !           111:                    else
        !           112:                        pline("You hear mumbled cursing.");
        !           113:                    if(!rn2(3)) {
        !           114:                        mtmp->mspeed = 0;
        !           115:                        mtmp->minvis = 0;
        !           116:                    }
        !           117:                    if(!rn2(3))
        !           118:                        mtmp->mcan = 0;
        !           119:                } else {
        !           120:                    if(canseemon(mtmp)){
        !           121:                        if(!rn2(6) && !Invis) {
        !           122:                            pline("%s hypnotizes you.", Monnam(mtmp));
        !           123:                            nomul(rn2(3) + 3);
        !           124:                            break;
        !           125:                        } else
        !           126:                            pline("%s chants an incantation.",
        !           127:                                Monnam(mtmp));
        !           128:                    } else
        !           129:                            pline("You hear a mumbled incantation.");
        !           130:                    switch(rn2(Invis ? 5 : 6)) {
        !           131:                    case 0:
        !           132:                        /* create a nasty monster from a deep level */
        !           133:                        /* (for the moment, 'nasty' is not implemented) */
        !           134:                        (void) makemon((struct permonst *)0, u.ux, u.uy);
        !           135:                        break;
        !           136:                    case 1:
        !           137:                        pline("\"Destroy the thief, my pets!\"");
        !           138:                        aggravate();    /* aggravate all the monsters */
        !           139:                        /* fall into next case */
        !           140:                    case 2:
        !           141:                        if (flags.no_of_wizards == 1 && rnd(5) == 0)
        !           142:                            /* if only 1 wizard, clone himself */
        !           143:                            clonewiz(mtmp);
        !           144:                        break;
        !           145:                    case 3:
        !           146:                        if(mtmp->mspeed == MSLOW)
        !           147:                                mtmp->mspeed = 0;
        !           148:                        else
        !           149:                                mtmp->mspeed = MFAST;
        !           150:                        break;
        !           151:                    case 4:
        !           152:                        mtmp->minvis = 1;
        !           153:                        break;
        !           154:                    case 5:
        !           155:                        /* Only if not Invisible */
        !           156:                        pline("You hear a clap of thunder!");
        !           157:                        /* shoot a bolt of fire or cold, or a sleep ray */
        !           158:                        buzz(-rnd(3),mtmp->mx,mtmp->my,sgn(tx),sgn(ty));
        !           159:                        break;
        !           160:                    }
        !           161:                }
        !           162:            }
        !           163:            if(u.uhp < 1) done_in_by(mtmp);
        !           164:        }
        !           165: }
        !           166: 
        !           167: aggravate()
        !           168: {
        !           169:        register struct monst *mtmp;
        !           170: 
        !           171:        for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
        !           172:                mtmp->msleep = 0;
        !           173:                if(mtmp->mfroz && !rn2(5))
        !           174:                        mtmp->mfroz = 0;
        !           175:        }
        !           176: }
        !           177: 
        !           178: clonewiz(mtmp)
        !           179: register struct monst *mtmp;
        !           180: {
        !           181:        register struct monst *mtmp2;
        !           182: 
        !           183:        if(mtmp2 = makemon(PM_WIZARD, mtmp->mx, mtmp->my)) {
        !           184:                flags.no_of_wizards = 2;
        !           185:                unpmon(mtmp2);
        !           186:                mtmp2->mappearance = wizapp[rn2(sizeof(wizapp)-1)];
        !           187:                pmon(mtmp);
        !           188:        }
        !           189: }

unix.superglobalmegacorp.com

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