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: }

Defined functions

aggravate defined in line 167; used 1 times
amulet defined in line 16; used 1 times
clonewiz defined in line 178; used 1 times
inrange defined in line 82; used 2 times
wiz_hit defined in line 36; used 1 times

Defined variables

wizapp defined in line 13; used 2 times
  • in line 186(2)

Defined macros

BOLT_LIM defined in line 11; used 3 times
WIZSHOT defined in line 10; used 1 times
Last modified: 1985-10-01
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2579
Valid CSS Valid XHTML 1.0 Strict