home *** CD-ROM | disk | FTP | other *** search
- Path: uunet!news.tek.com!master!saab!billr
- From: billr@saab.CNA.TEK.COM (Bill Randle)
- Newsgroups: comp.sources.games
- Subject: v16i068: nethack31 - display oriented dungeons & dragons (Ver. 3.1), Part60/108
- Message-ID: <4371@master.CNA.TEK.COM>
- Date: 1 Feb 93 19:49:35 GMT
- Sender: news@master.CNA.TEK.COM
- Lines: 1562
- Approved: billr@saab.CNA.TEK.COM
- Xref: uunet comp.sources.games:1618
-
- Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller)
- Posting-number: Volume 16, Issue 68
- Archive-name: nethack31/Part60
- Supersedes: nethack3p9: Volume 10, Issue 46-102
- Environment: Amiga, Atari, Mac, MS-DOS, OS2, Unix, VMS, X11
-
-
-
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of archive 60 (of 108)."
- # Contents: src/dothrow.c src/monst.c3
- # Wrapped by billr@saab on Wed Jan 27 16:09:10 1993
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'src/dothrow.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'src/dothrow.c'\"
- else
- echo shar: Extracting \"'src/dothrow.c'\" \(21479 characters\)
- sed "s/^X//" >'src/dothrow.c' <<'END_OF_FILE'
- X/* SCCS Id: @(#)dothrow.c 3.1 92/12/10 */
- X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
- X/* NetHack may be freely redistributed. See license for details. */
- X
- X/* Contains code for 't' (throw) */
- X
- X#include "hack.h"
- X
- Xstatic void FDECL(hitfloor, (struct obj *));
- Xstatic int FDECL(gem_accept, (struct monst *, struct obj *));
- Xstatic int FDECL(throw_gold, (struct obj *));
- Xstatic void FDECL(check_shop_obj, (struct obj *,XCHAR_P,XCHAR_P,BOOLEAN_P));
- X
- Xstatic const char NEARDATA toss_objs[] =
- X { ALLOW_COUNT, GOLD_CLASS, ALL_CLASSES, WEAPON_CLASS, 0 };
- Xextern boolean notonhead; /* for long worms */
- X
- Xint
- Xdothrow()
- X{
- X register struct obj *obj;
- X
- X if(check_capacity(NULL)) return(0);
- X obj = getobj(toss_objs, "throw");
- X /* it is also possible to throw food */
- X /* (or jewels, or iron balls... ) */
- X
- X if(!obj || !getdir(NULL)) { /* ask "in what direction?" */
- X if (obj && obj->oclass == GOLD_CLASS) {
- X u.ugold += obj->quan;
- X flags.botl = 1;
- X dealloc_obj(obj);
- X }
- X return(0);
- X }
- X
- X if(obj->oclass == GOLD_CLASS) return(throw_gold(obj));
- X
- X if(!canletgo(obj,"throw"))
- X return(0);
- X if (obj->oartifact == ART_MJOLLNIR && obj != uwep) {
- X You("must be wielding %s in order to throw it.", xname(obj));
- X return(0);
- X }
- X if ((obj->oartifact == ART_MJOLLNIR && ACURR(A_STR) != 125)
- X || (obj->otyp == BOULDER
- X#ifdef POLYSELF
- X && !throws_rocks(uasmon)
- X#endif
- X )) {
- X pline("It's too heavy.");
- X return(1);
- X }
- X if(!u.dx && !u.dy && !u.dz) {
- X You("cannot throw an object at yourself.");
- X return(0);
- X }
- X u_wipe_engr(2);
- X
- X if(obj == uwep) {
- X if(welded(obj)) {
- X weldmsg(obj, FALSE);
- X return(1);
- X }
- X if(obj->quan > 1L)
- X setuwep(splitobj(obj, 1L));
- X else {
- X setuwep((struct obj *)0);
- X if (uwep) return(1); /* unwielded, died, rewielded */
- X }
- X }
- X else if(obj->quan > 1L)
- X (void) splitobj(obj, 1L);
- X freeinv(obj);
- X return(throwit(obj));
- X}
- X
- Xstatic void
- Xhitfloor(obj)
- Xregister struct obj *obj;
- X{
- X if (IS_SOFT(levl[u.ux][u.uy].typ) || u.uinwater) {
- X dropy(obj);
- X if(*u.ushops)
- X check_shop_obj(obj, obj->ox, obj->oy, FALSE);
- X return;
- X }
- X if (IS_ALTAR(levl[u.ux][u.uy].typ)) doaltarobj(obj);
- X else
- X pline("%s hits the floor.", Doname2(obj));
- X if (breaks(obj, TRUE)) return;
- X else if(obj->oclass == POTION_CLASS) {
- X pline("The flask breaks, and you smell a peculiar odor...");
- X potionbreathe(obj);
- X if(*u.ushops)
- X check_shop_obj(obj, u.ux, u.uy, TRUE);
- X obfree(obj, (struct obj *)0);
- X } else {
- X if(ship_object(obj, u.ux, u.uy, FALSE))
- X return;
- X dropy(obj);
- X if(*u.ushops)
- X check_shop_obj(obj, obj->ox, obj->oy, FALSE);
- X }
- X}
- X
- X/*
- X * The player moves through the air for a few squares as a result of
- X * throwing or kicking something. To simplify matters, bumping into monsters
- X * won't cause damage but will wake them and make them angry.
- X * Auto-pickup isn't done, since you don't have control over your movements
- X * at the time.
- X * dx and dy should be the direction of the hurtle, not of the original
- X * kick or throw.
- X */
- Xvoid
- Xhurtle(dx, dy, range)
- X int dx, dy, range;
- X{
- X register struct monst *mon;
- X struct obj *obj;
- X int nx, ny;
- X
- X if(!range || (!dx && !dy) || u.ustuck) return; /* paranoia */
- X
- X nomul(-range);
- X You("%s in the opposite direction.", range > 1 ? "hurtle" : "float");
- X while(range--) {
- X nx = u.ux + dx;
- X ny = u.uy + dy;
- X
- X if(!isok(nx,ny)) break;
- X if(IS_ROCK(levl[nx][ny].typ) || closed_door(nx,ny)) {
- X pline("Ouch!");
- X losehp(rnd(2+range), IS_ROCK(levl[nx][ny].typ) ?
- X "bumping to a wall" : "bumping into a door", KILLED_BY);
- X break;
- X }
- X
- X if (obj = sobj_at(BOULDER,nx,ny)) {
- X You("bump into a %s. Ouch!", xname(obj));
- X losehp(rnd(2+range), "bumping to a boulder", KILLED_BY);
- X break;
- X }
- X
- X u.ux = nx;
- X u.uy = ny;
- X newsym(u.ux - dx, u.uy - dy);
- X if(mon = m_at(u.ux, u.uy)) {
- X You("bump into %s.", a_monnam(mon));
- X wakeup(mon);
- X if(Is_airlevel(&u.uz))
- X mnexto(mon);
- X else {
- X /* sorry, not ricochets */
- X u.ux -= dx;
- X u.uy -= dy;
- X }
- X range = 0;
- X }
- X
- X newsym(u.ux, u.uy);
- X
- X if(range) {
- X flush_screen(1);
- X delay_output();
- X }
- X }
- X}
- X
- Xstatic void
- Xcheck_shop_obj(obj, x, y, broken)
- Xregister struct obj *obj;
- Xregister xchar x, y;
- Xregister boolean broken;
- X{
- X register struct monst *shkp =
- X shop_keeper(*in_rooms(u.ux, u.uy, SHOPBASE));
- X
- X if(!shkp) return;
- X if(!inside_shop(u.ux, u.uy)) return;
- X
- X if(broken) {
- X if(obj->unpaid) {
- X (void)stolen_value(obj, u.ux, u.uy,
- X (shkp && shkp->mpeaceful), FALSE);
- X subfrombill(obj, shkp);
- X }
- X return;
- X }
- X
- X if(!costly_spot(x, y) ||
- X *in_rooms(u.ux, u.uy, 0) != *in_rooms(x, y, 0)) {
- X if(!inside_shop(x, y) && obj->unpaid) {
- X (void)stolen_value(obj, u.ux, u.uy,
- X (shkp && shkp->mpeaceful), FALSE);
- X subfrombill(obj, shkp);
- X }
- X } else
- X if(costly_spot(u.ux, u.uy) && costly_spot(x, y)) {
- X if(obj->unpaid) subfrombill(obj, shkp);
- X else if(!(x == shkp->mx && y == shkp->my))
- X sellobj(obj, x, y);
- X }
- X}
- X
- X
- Xint
- Xthrowit(obj)
- Xregister struct obj *obj;
- X{
- X register struct monst *mon;
- X register int range, urange;
- X boolean impaired = (Confusion || Stunned || Blind ||
- X Hallucination || Fumbling);
- X int do_death = 0;
- X
- X if (obj->cursed && (u.dx || u.dy) && !rn2(7)) {
- X boolean slipok = TRUE;
- X if ((obj->oclass == WEAPON_CLASS || obj->oclass == GEM_CLASS)
- X && uwep && (objects[obj->otyp].w_propellor > 0) &&
- X (objects[obj->otyp].w_propellor ==
- X -objects[uwep->otyp].w_propellor))
- X pline("The %s misfires!", xname(obj));
- X else {
- X /* only slip if it's meant to be thrown */
- X if((obj->otyp >= DART && obj->otyp <= JAVELIN) ||
- X (obj->otyp >= DAGGER && obj->otyp <= CRYSKNIFE &&
- X obj->otyp != ATHAME) || obj->otyp == WAR_HAMMER)
- X pline("The %s slips as you throw it!", xname(obj));
- X else slipok = FALSE;
- X }
- X if (slipok) {
- X u.dx = rn2(3)-1;
- X u.dy = rn2(3)-1;
- X if (!u.dx && !u.dy) u.dz = 1;
- X impaired = TRUE;
- X }
- X }
- X
- X if(u.uswallow) {
- X mon = u.ustuck;
- X bhitpos.x = mon->mx;
- X bhitpos.y = mon->my;
- X } else if(u.dz) {
- X if (u.dz < 0 && pl_character[0] == 'V' &&
- X obj->oartifact == ART_MJOLLNIR && !impaired) {
- X pline("%s hits the ceiling and returns to your hand!",
- X The(xname(obj)));
- X obj = addinv(obj);
- X setuwep(obj);
- X return(1);
- X }
- X if (u.dz < 0 && !Is_airlevel(&u.uz) && !Underwater && !Is_waterlevel(&u.uz)) {
- X pline("%s hits the ceiling, then falls back on top of your %s.",
- X Doname2(obj), /* note: obj->quan == 1 */
- X body_part(HEAD));
- X if(obj->oclass == POTION_CLASS)
- X potionhit(&youmonst, obj);
- X else {
- X int dmg = rnd((int)(obj->owt));
- X
- X if (uarmh) {
- X if(is_metallic(uarmh)) {
- X pline("Fortunately, you are wearing a hard helmet.");
- X dmg = 1;
- X } else if (flags.verbose)
- X Your("%s does not protect you.", xname(uarmh));
- X } else if (obj->otyp == CORPSE &&
- X obj->corpsenm == PM_COCKATRICE) {
- X#ifdef POLYSELF
- X if(!resists_ston(uasmon))
- X if(!(poly_when_stoned(uasmon) &&
- X polymon(PM_STONE_GOLEM))) {
- X#endif
- X killer = doname(obj);
- X You("turn to stone.");
- X do_death = STONING;
- X#ifdef POLYSELF
- X }
- X#endif
- X }
- X
- X if (!breaks(obj, TRUE)) {
- X if(!ship_object(obj, u.ux, u.uy, FALSE)) {
- X dropy(obj);
- X if(*u.ushops)
- X check_shop_obj(obj, obj->ox, obj->oy, FALSE);
- X }
- X }
- X if (do_death == STONING)
- X done(STONING);
- X else
- X losehp(dmg, "falling object", KILLED_BY_AN);
- X }
- X } else hitfloor(obj);
- X return(1);
- X
- X } else if(obj->otyp == BOOMERANG && !Underwater) {
- X if(Is_airlevel(&u.uz) || Levitation) hurtle(-u.dx, -u.dy, 1);
- X mon = boomhit(u.dx, u.dy);
- X if(mon == &youmonst) { /* the thing was caught */
- X exercise(A_DEX, TRUE);
- X (void) addinv(obj);
- X return(1);
- X }
- X } else {
- X urange = (int)(ACURRSTR)/2;
- X range = urange - (int)(obj->owt/40);
- X if (obj == uball) {
- X if (u.ustuck) range = 1;
- X else if (range >= 5) range = 5;
- X }
- X if (range < 1) range = 1;
- X
- X if ((obj->oclass == WEAPON_CLASS || obj->oclass == GEM_CLASS)
- X && uwep && objects[obj->otyp].w_propellor) {
- X if (objects[obj->otyp].w_propellor ==
- X -objects[uwep->otyp].w_propellor)
- X range++;
- X else
- X range /= 2;
- X }
- X
- X if (Is_airlevel(&u.uz) || Levitation) {
- X /* action, reaction... */
- X urange -= range;
- X if(urange < 1) urange = 1;
- X range -= urange;
- X if(range < 1) range = 1;
- X }
- X
- X#ifdef POLYSELF
- X if (obj->otyp == BOULDER) range = 20;
- X#endif
- X if (obj == uball && u.utrap && u.utraptype == TT_INFLOOR)
- X range = 1;
- X
- X if (Underwater) range = 1;
- X
- X mon = bhit(u.dx,u.dy,range,THROWN_WEAPON,
- X (int (*)()) 0,(int (*)()) 0,obj);
- X
- X /* have to do this after bhit() so u.ux & u.uy are correct */
- X if(Is_airlevel(&u.uz) || Levitation)
- X hurtle(-u.dx, -u.dy, urange);
- X }
- X if(mon) {
- X if(mon->isshk && (!inside_shop(u.ux, u.uy) ||
- X !index(in_rooms(mon->mx, mon->my, SHOPBASE), *u.ushops))) {
- X if(obj->otyp == PICK_AXE) {
- X register struct obj *otmp;
- X
- X /* check if the pick axe was caught through */
- X /* a successful call to shkcatch() in bhit() */
- X for (otmp = mon->minvent; otmp; otmp = otmp->nobj)
- X if (otmp == obj) return(1);
- X }
- X wakeup(mon);
- X hot_pursuit(mon);
- X }
- X (void) snuff_candle(obj);
- X /* awake monster if sleeping */
- X wakeup(mon);
- X notonhead = (bhitpos.x != mon->mx || bhitpos.y != mon->my);
- X if(thitmonst(mon, obj)) return(1);
- X }
- X if(!u.uswallow) {
- X /* the code following might become part of dropy() */
- X int obj_glyph = obj_to_glyph(obj);
- X boolean gone = FALSE;
- X
- X if (obj->oartifact == ART_MJOLLNIR && pl_character[0] == 'V') {
- X /* we must be wearing Gauntlets of Power to get here */
- X int x = bhitpos.x - u.dx, y = bhitpos.y - u.dy;
- X
- X tmp_at(DISP_FLASH, obj_glyph);
- X while(x != u.ux || y != u.uy) {
- X tmp_at(x, y);
- X delay_output();
- X x -= u.dx; y -= u.dy;
- X }
- X tmp_at(DISP_END, 0);
- X
- X if(!impaired) {
- X pline("%s returns to your hand!", The(xname(obj)));
- X obj = addinv(obj);
- X setuwep(obj);
- X if(cansee(bhitpos.x, bhitpos.y))
- X newsym(bhitpos.x,bhitpos.y);
- X } else {
- X int dmg = rnd(4);
- X if (Blind)
- X pline("%s hits your %s!",
- X The(xname(obj)), body_part(ARM));
- X else
- X pline("%s flies back toward you, hitting your %s!",
- X The(xname(obj)), body_part(ARM));
- X (void) artifact_hit((struct monst *) 0, &youmonst,
- X obj, &dmg, 0);
- X losehp(dmg, xname(obj), KILLED_BY);
- X if(ship_object(obj, u.ux, u.uy, FALSE))
- X return (1);
- X dropy(obj);
- X }
- X return (1);
- X }
- X if (!IS_SOFT(levl[bhitpos.x][bhitpos.y].typ) && !u.uinwater &&
- X obj->oclass == POTION_CLASS && rn2(2)) {
- X if(distu(bhitpos.x, bhitpos.y) < 3 && rn2(5)) {
- X pline("The flask breaks, and you smell a peculiar odor...");
- X potionbreathe(obj);
- X } else if(!Blind)
- X pline("The flask breaks.");
- X else pline("Crash!");
- X if(*u.ushops)
- X check_shop_obj(obj, bhitpos.x, bhitpos.y, TRUE);
- X obfree(obj, (struct obj *)0);
- X gone = TRUE;
- X }
- X if (gone || (!IS_SOFT(levl[bhitpos.x][bhitpos.y].typ) &&
- X breaks(obj, TRUE))) {
- X tmp_at(DISP_FLASH, obj_glyph);
- X tmp_at(bhitpos.x, bhitpos.y);
- X delay_output();
- X tmp_at(DISP_END, 0);
- X return(1);
- X }
- X if(flooreffects(obj,bhitpos.x,bhitpos.y,"fall")) return(1);
- X if(obj->otyp == CRYSKNIFE)
- X obj->otyp = WORM_TOOTH;
- X if(mon && mon->isshk && obj->otyp == PICK_AXE) {
- X mpickobj(mon, obj);
- X if(*u.ushops)
- X check_shop_obj(obj, bhitpos.x, bhitpos.y, FALSE);
- X return(1);
- X }
- X (void) snuff_candle(obj);
- X if(!mon && obj != uball) {
- X if(ship_object(obj, bhitpos.x, bhitpos.y, FALSE))
- X return(1);
- X }
- X obj->nobj = fobj;
- X fobj = obj;
- X place_object(obj, bhitpos.x, bhitpos.y);
- X if(*u.ushops && obj != uball)
- X check_shop_obj(obj, bhitpos.x, bhitpos.y, FALSE);
- X stackobj(obj);
- X if (obj == uball) drop_ball(bhitpos.x, bhitpos.y);
- X if(cansee(bhitpos.x, bhitpos.y)) newsym(bhitpos.x,bhitpos.y);
- X } else {
- X /* ball is not picked up by monster */
- X if (obj != uball) mpickobj(u.ustuck,obj);
- X }
- X return(1);
- X}
- X
- Xint
- Xthitmonst(mon, obj)
- Xregister struct monst *mon;
- Xregister struct obj *obj;
- X{
- X register int tmp; /* Base chance to hit */
- X register int disttmp; /* distance modifier */
- X
- X /* Differences from melee weapons:
- X *
- X * Dex still gives a bonus, but strength does not.
- X * Polymorphed players lacking attacks may still throw.
- X * There's a base -1 to hit.
- X * No bonuses for fleeing or stunned targets (they don't dodge
- X * melee blows as readily, but dodging arrows is hard anyway).
- X * Not affected by traps, etc.
- X * Certain items which don't in themselves do damage ignore tmp.
- X * Distance and monster size affect chance to hit.
- X */
- X tmp = -1 + Luck + find_mac(mon);
- X#ifdef POLYSELF
- X if (u.umonnum >= 0) tmp += uasmon->mlevel;
- X else
- X#endif
- X tmp += u.ulevel;
- X if(ACURR(A_DEX) < 4) tmp -= 3;
- X else if(ACURR(A_DEX) < 6) tmp -= 2;
- X else if(ACURR(A_DEX) < 8) tmp -= 1;
- X else if(ACURR(A_DEX) >= 14) tmp += (ACURR(A_DEX) - 14);
- X
- X /* modify to-hit depending on distance; but keep it sane */
- X disttmp = 3 - distmin(u.ux, u.uy, mon->mx, mon->my);
- X if(disttmp < -4) disttmp = -4;
- X tmp += disttmp;
- X
- X /* it's easier to hit a larger target */
- X if(bigmonst(mon->data)) tmp++;
- X
- X if(mon->msleep) {
- X mon->msleep = 0;
- X tmp += 2;
- X }
- X if(!mon->mcanmove || !mon->data->mmove) {
- X tmp += 4;
- X if(!rn2(10)) {
- X mon->mcanmove = 1;
- X mon->mfrozen = 0;
- X }
- X }
- X if (is_orc(mon->data) && pl_character[0]=='E') tmp++;
- X if (u.uswallow && mon == u.ustuck) tmp += 1000; /* Guaranteed hit */
- X
- X if(obj->oclass == GEM_CLASS && mon->data->mlet == S_UNICORN) {
- X if (mon->mtame) {
- X pline("%s catches and drops %s.",
- X Monnam(mon), the(xname(obj)));
- X return(0);
- X } else {
- X pline("%s catches %s.", Monnam(mon), the(xname(obj)));
- X return(gem_accept(mon, obj));
- X }
- X }
- X if(obj->oclass == WEAPON_CLASS || obj->otyp == PICK_AXE ||
- X obj->otyp == UNICORN_HORN || obj->oclass == GEM_CLASS) {
- X if(obj->otyp < DART || obj->oclass == GEM_CLASS) {
- X if (!uwep ||
- X objects[obj->otyp].w_propellor !=
- X -objects[uwep->otyp].w_propellor) {
- X tmp -= 4;
- X } else {
- X tmp += uwep->spe - uwep->oeroded;
- X /*
- X * Elves and Samurais are highly trained w/bows,
- X * especially their own special types of bow.
- X * Polymorphing won't make you a bow expert.
- X */
- X if ((pl_character[0] == 'E' || pl_character[0] == 'S')
- X && -objects[uwep->otyp].w_propellor == WP_BOW)
- X tmp++;
- X if (pl_character[0] == 'E' && uwep->otyp == ELVEN_BOW)
- X tmp++;
- X if (pl_character[0] == 'S' && uwep->otyp == YUMI)
- X tmp++;
- X }
- X } else if(obj->otyp == BOOMERANG) tmp += 4;
- X tmp += obj->spe;
- X tmp += hitval(obj, mon->data);
- X if(tmp >= rnd(20)) {
- X if(hmon(mon,obj,1)){
- X /* mon still alive */
- X cutworm(mon, bhitpos.x, bhitpos.y, obj);
- X }
- X exercise(A_DEX, TRUE);
- X /* projectiles thrown disappear sometimes */
- X if((obj->otyp < BOOMERANG || obj->oclass == GEM_CLASS)
- X && rn2(3)) {
- X if(*u.ushops)
- X check_shop_obj(obj, bhitpos.x,
- X bhitpos.y, TRUE);
- X /* check bill; free */
- X obfree(obj, (struct obj *)0);
- X return(1);
- X }
- X } else miss(xname(obj), mon);
- X } else if(obj->otyp == HEAVY_IRON_BALL) {
- X if(obj != uball) tmp += 2;
- X exercise(A_STR, TRUE);
- X if(tmp >= rnd(20)) {
- X (void) hmon(mon,obj,1);
- X exercise(A_DEX, TRUE);
- X } else miss(xname(obj), mon);
- X } else if (obj->otyp == BOULDER) {
- X tmp += 6; /* Likely to hit! */
- X exercise(A_STR, TRUE);
- X if(tmp >= rnd(20)) {
- X (void) hmon(mon,obj,1);
- X exercise(A_DEX, TRUE);
- X } else miss(xname(obj), mon);
- X } else if((obj->otyp == CREAM_PIE
- X#ifdef POLYSELF
- X || obj->otyp == BLINDING_VENOM
- X#endif
- X ) && ACURR(A_DEX) >= rnd(10)) {
- X (void) hmon(mon,obj,1); /* can't die from it */
- X#ifdef POLYSELF
- X } else if(obj->otyp == ACID_VENOM && ACURR(A_DEX) >= rnd(10)) {
- X (void) hmon(mon,obj,1);
- X#endif
- X } else if(obj->oclass == POTION_CLASS && ACURR(A_DEX) >= rnd(15)) {
- X potionhit(mon, obj);
- X return(1);
- X } else {
- X pline("%s misses %s.", The(xname(obj)), mon_nam(mon));
- X if(obj->oclass == FOOD_CLASS && is_domestic(mon->data))
- X if(tamedog(mon,obj)) return(1);
- X }
- X return(0);
- X}
- X
- Xstatic int
- Xgem_accept(mon, obj)
- Xregister struct monst *mon;
- Xregister struct obj *obj;
- X{
- X char buf[BUFSZ];
- X boolean is_buddy = sgn(mon->data->maligntyp) == sgn(u.ualign.type);
- X boolean is_gem = objects[obj->otyp].oc_material == GEMSTONE;
- X int ret = 0;
- X static const char NEARDATA nogood[] = " is not interested in your junk.";
- X static const char NEARDATA acceptgift[] = " accepts your gift.";
- X static const char NEARDATA maybeluck[] = " hesitatingly";
- X static const char NEARDATA noluck[] = " graciously";
- X static const char NEARDATA addluck[] = " gratefully";
- X
- X Strcpy(buf,Monnam(mon));
- X
- X mon->mpeaceful = 1;
- X
- X /* object properly identified */
- X if(obj->dknown && objects[obj->otyp].oc_name_known) {
- X if(is_gem) {
- X if(is_buddy) {
- X Strcat(buf,addluck);
- X change_luck(5);
- X } else {
- X Strcat(buf,maybeluck);
- X change_luck(rn2(7)-3);
- X }
- X } else {
- X Strcat(buf,nogood);
- X goto nopick;
- X }
- X /* making guesses */
- X } else if(obj->onamelth || objects[obj->otyp].oc_uname) {
- X if(is_gem) {
- X if(is_buddy) {
- X Strcat(buf,addluck);
- X change_luck(2);
- X } else {
- X Strcat(buf,maybeluck);
- X change_luck(rn2(3)-1);
- X }
- X } else {
- X Strcat(buf,nogood);
- X goto nopick;
- X }
- X /* value completely unknown to @ */
- X } else {
- X if(is_gem) {
- X if(is_buddy) {
- X Strcat(buf,addluck);
- X change_luck(1);
- X } else {
- X Strcat(buf,maybeluck);
- X change_luck(rn2(3)-1);
- X }
- X } else {
- X Strcat(buf,noluck);
- X }
- X }
- X Strcat(buf,acceptgift);
- X mpickobj(mon, obj);
- X if(*u.ushops) check_shop_obj(obj, mon->mx, mon->my, TRUE);
- X ret = 1;
- X
- Xnopick:
- X if(!Blind) pline(buf);
- X rloc(mon);
- X return(ret);
- X}
- X
- X/* returns 0 if object doesn't break */
- X/* returns 1 if object broke */
- Xint
- Xbreaks(obj, loose)
- Xregister struct obj *obj;
- Xregister boolean loose; /* if not loose, obj is in fobj chain */
- X{
- X switch(obj->otyp) {
- X case MIRROR:
- X change_luck(-2); /* and fall through */
- X case CRYSTAL_BALL:
- X#ifdef TOURIST
- X case EXPENSIVE_CAMERA:
- X#endif
- X if(!Blind)
- X pline("%s shatters into a thousand pieces!",
- X Doname2(obj));
- X else You("hear something shatter!");
- X break;
- X case EGG:
- X pline("Splat!");
- X break;
- X case CREAM_PIE:
- X pline("What a mess!");
- X break;
- X case ACID_VENOM:
- X case BLINDING_VENOM:
- X pline("Splash!");
- X break;
- X default:
- X return 0;
- X }
- X
- X /* it is currently assumed that 'loose' is co-extensive
- X * with 'thrown'. if this changes, an explicit 'thrown'
- X * arg must be added to breaks() to ensure proper
- X * treatment of shop objs.
- X */
- X if(loose) {
- X newsym(obj->ox,obj->oy);
- X if(*u.ushops)
- X check_shop_obj(obj, obj->ox, obj->oy, TRUE);
- X obfree(obj, (struct obj *)0);
- X } else {
- X /* it is assumed that the obj is a floor-object */
- X register struct monst *shkp;
- X boolean costly, insider;
- X long loss = 0L;
- X
- X#ifdef GCC_WARN
- X shkp = (struct monst *) 0;
- X#endif
- X
- X costly = (costly_spot(obj->ox, obj->oy) &&
- X (shkp = shop_keeper(*in_rooms(obj->ox,
- X obj->oy, SHOPBASE))) != (struct monst *)0);
- X insider = (*u.ushops && inside_shop(u.ux, u.uy) &&
- X *in_rooms(obj->ox, obj->oy, SHOPBASE) == *u.ushops);
- X
- X if(costly)
- X loss = stolen_value(obj, u.ux, u.uy,
- X (shkp && shkp->mpeaceful), FALSE);
- X if(loss && !insider)
- X make_angry_shk(shkp, obj->ox, obj->oy);
- X
- X delobj(obj);
- X }
- X return(1);
- X}
- X
- X/*
- X * Note that the gold object is *not* attached to the fobj chain.
- X */
- Xstatic int
- Xthrow_gold(obj)
- Xstruct obj *obj;
- X{
- X int range, odx, ody;
- X long zorks = obj->quan;
- X register struct monst *mon;
- X
- X if(u.uswallow) {
- X pline(is_animal(u.ustuck->data) ?
- X "%s in the %s's entrails." : "%s into %s.",
- X "The gold disappears", mon_nam(u.ustuck));
- X u.ustuck->mgold += zorks;
- X dealloc_obj(obj);
- X return(1);
- X }
- X
- X if(u.dz) {
- X if(u.dz < 0 && !Is_airlevel(&u.uz) && !Underwater && !Is_waterlevel(&u.uz)) {
- X pline("The gold hits the ceiling, then falls back on top of your %s.",
- X body_part(HEAD));
- X /* some self damage? */
- X if(uarmh) pline("Fortunately, you are wearing a helmet!");
- X }
- X if(flooreffects(obj,u.ux,u.uy,"fall")) return(1);
- X if(u.dz > 0) pline("The gold hits the floor.");
- X obj->nobj = fobj; /* add the gold to the object list */
- X fobj = obj;
- X place_object(obj,u.ux,u.uy);
- X if(*u.ushops) sellobj(obj, u.ux, u.uy);
- X stackobj(obj);
- X newsym(u.ux,u.uy);
- X return 1;
- X }
- X
- X /* consistent with range for normal objects */
- X range = (int)((ACURRSTR)/2 - obj->owt/40);
- X
- X /* see if the gold has a place to move into */
- X odx = u.ux + u.dx;
- X ody = u.uy + u.dy;
- X if(!ZAP_POS(levl[odx][ody].typ) || closed_door(odx, ody)) {
- X bhitpos.x = u.ux;
- X bhitpos.y = u.uy;
- X } else {
- X mon = bhit(u.dx, u.dy, range, THROWN_WEAPON,
- X (int (*)()) 0, (int (*)()) 0, obj);
- X if(mon) {
- X if (ghitm(mon, obj)) /* was it caught? */
- X return 1;
- X } else {
- X if(ship_object(obj, bhitpos.x, bhitpos.y, FALSE))
- X return 1;
- X }
- X }
- X
- X if(flooreffects(obj,bhitpos.x,bhitpos.y,"fall")) return(1);
- X obj->nobj = fobj; /* add the gold to the object list */
- X fobj = obj;
- X place_object(obj,bhitpos.x,bhitpos.y);
- X if(*u.ushops) sellobj(obj, bhitpos.x, bhitpos.y);
- X stackobj(obj);
- X newsym(bhitpos.x,bhitpos.y);
- X return(1);
- X}
- X
- X/*dothrow.c*/
- END_OF_FILE
- if test 21479 -ne `wc -c <'src/dothrow.c'`; then
- echo shar: \"'src/dothrow.c'\" unpacked with wrong size!
- fi
- # end of 'src/dothrow.c'
- fi
- if test -f 'src/monst.c3' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'src/monst.c3'\"
- else
- echo shar: Extracting \"'src/monst.c3'\" \(33131 characters\)
- sed "s/^X//" >'src/monst.c3' <<'END_OF_FILE'
- X#ifdef SEDUCE
- X { "succubus", S_DEMON, 6, 12, 0, 70, -9, (G_NOCORPSE | 1),
- X { { AT_BITE, AD_SSEX, 0, 0 }, { AT_CLAW, AD_PHYS, 1, 3 },
- X { AT_CLAW, AD_PHYS, 1, 3 }, NO_ATTK,
- X NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_SEDUCE, MZ_HUMAN,
- X MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS,
- X M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_FEMALE, 0, C(GRAY) },
- X { "incubus", S_DEMON, 6, 12, 0, 70, -9, (G_NOCORPSE | 1),
- X { { AT_BITE, AD_SSEX, 0, 0 }, { AT_CLAW, AD_PHYS, 1, 3 },
- X { AT_CLAW, AD_PHYS, 1, 3 }, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_SEDUCE, MZ_HUMAN,
- X MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS,
- X M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_MALE, 0, C(GRAY) },
- X#else
- X { "succubus", S_DEMON, 6, 12, 0, 70, -9, (G_NOCORPSE | 1),
- X { { AT_CLAW, AD_PHYS, 1, 3 }, { AT_CLAW, AD_PHYS, 1, 3 },
- X { AT_BITE, AD_DRLI, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_SEDUCE, MZ_HUMAN,
- X MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY,
- X M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_FEMALE, 0, C(GRAY) },
- X { "incubus", S_DEMON, 6, 12, 0, 70, -9, (G_NOCORPSE | 1),
- X { { AT_CLAW, AD_PHYS, 1, 3 }, { AT_CLAW, AD_PHYS, 1, 3 },
- X { AT_BITE, AD_DRLI, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_SEDUCE, MZ_HUMAN,
- X MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS,
- X M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_MALE, 0, C(GRAY) },
- X#endif
- X { "erinyes", S_DEMON, 7, 12, 2, 30, 10,
- X (G_HELL | G_NOCORPSE | G_SGROUP | 2),
- X { { AT_WEAP, AD_DRST, 2, 4 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN,
- X MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_POIS,
- X M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_FEMALE |
- X M2_COLLECT, 0, C(RED) },
- X { "barbed devil", S_DEMON, 8, 12, 0, 35, 8,
- X (G_HELL | G_NOCORPSE | G_SGROUP | 2),
- X { { AT_CLAW, AD_PHYS, 2, 4 }, { AT_CLAW, AD_PHYS, 2, 4 },
- X { AT_STNG, AD_PHYS, 3, 4 }, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN,
- X MR_FIRE | MR_POISON, 0, M1_POIS | M1_THICK_HIDE,
- X M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, 0, C(RED) },
- X { "marilith", S_DEMON, 7, 12, -6, 80, -12, (G_HELL | G_NOCORPSE | 1),
- X { { AT_WEAP, AD_PHYS, 2, 4 }, { AT_WEAP, AD_PHYS, 2, 4 },
- X { AT_WEAP, AD_PHYS, 2, 4 }, { AT_WEAP, AD_PHYS, 2, 4 },
- X { AT_WEAP, AD_PHYS, 2, 4 }, { AT_WEAP, AD_PHYS, 2, 4 } },
- X WT_HUMAN, 400, 0, MS_CUSS, MZ_LARGE,
- X MR_FIRE | MR_POISON, 0,
- X M1_HUMANOID | M1_SLITHY | M1_SEE_INVIS | M1_POIS,
- X M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_FEMALE | M2_COLLECT,
- X 0, C(RED) },
- X { "vrock", S_DEMON, 8, 12, 0, 50, -9,
- X (G_HELL | G_NOCORPSE | G_SGROUP | 2),
- X { { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 },
- X { AT_CLAW, AD_PHYS, 1, 8 }, { AT_CLAW, AD_PHYS, 1, 8 },
- X { AT_BITE, AD_PHYS, 1, 6 }, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE,
- X MR_FIRE | MR_POISON, 0, M1_POIS,
- X M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, 0, C(RED) },
- X { "hezrou", S_DEMON, 9, 6, -2, 55, -10,
- X (G_HELL | G_NOCORPSE | G_SGROUP | 2),
- X { { AT_CLAW, AD_PHYS, 1, 3 }, { AT_CLAW, AD_PHYS, 1, 3 },
- X { AT_BITE, AD_PHYS, 4, 4 }, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE,
- X MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_POIS,
- X M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, 0, C(RED) },
- X { "bone devil", S_DEMON, 9, 15, -1, 40, -9,
- X (G_HELL | G_NOCORPSE | G_SGROUP | 2),
- X { { AT_WEAP, AD_PHYS, 3, 4 }, { AT_STNG, AD_DRST, 2, 4 },
- X NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE,
- X MR_FIRE | MR_POISON, 0, M1_POIS,
- X M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT,
- X 0, C(GRAY) },
- X { "ice devil", S_DEMON, 11, 6, -4, 55, -12, (G_HELL | G_NOCORPSE | 2),
- X { { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 },
- X { AT_BITE, AD_PHYS, 2, 4 }, { AT_STNG, AD_COLD, 3, 4 },
- X NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE,
- X MR_FIRE | MR_COLD | MR_POISON, 0, M1_SEE_INVIS | M1_POIS,
- X M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, 0, C(WHITE) },
- X { "nalfeshnee", S_DEMON, 11, 9, -1, 65, -11, (G_HELL | G_NOCORPSE | 1),
- X { { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 },
- X { AT_BITE, AD_PHYS, 2, 4 }, { AT_MAGC, AD_SPEL, 0, 0 },
- X NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE,
- X MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_POIS,
- X M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, 0, C(RED) },
- X { "pit fiend", S_DEMON, 13, 6, -3, 65, -13, (G_HELL | G_NOCORPSE | 2),
- X { { AT_WEAP, AD_PHYS, 4, 2 }, { AT_WEAP, AD_PHYS, 4, 2 },
- X { AT_HUGS, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_GROWL, MZ_LARGE,
- X MR_FIRE | MR_POISON, 0, M1_SEE_INVIS | M1_POIS,
- X M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT, 0, C(RED) },
- X { "balrog", S_DEMON, 16, 5, -2, 75, -14, (G_HELL | G_NOCORPSE | 1),
- X { { AT_WEAP, AD_PHYS, 8, 4 }, { AT_WEAP, AD_PHYS, 4, 6 },
- X NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE,
- X MR_FIRE | MR_POISON, 0, M1_FLY | M1_SEE_INVIS | M1_POIS,
- X M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT,
- X 0, C(RED) },
- X /* Named demon lords & princes plus Arch-Devils */
- X { "Juiblex", S_DEMON, 50, 3, -7, 65, -15,
- X (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
- X { { AT_ENGL, AD_DISE, 4, 10 }, { AT_SPIT, AD_ACID, 3, 6 },
- X NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X 1500, 0, 0, MS_GURGLE, MZ_LARGE,
- X MR_FIRE | MR_POISON | MR_ACID | MR_STONE, 0,
- X M1_AMPHIBIOUS | M1_AMORPHOUS | M1_NOHEAD | M1_FLY | M1_SEE_INVIS |
- X M1_ACID | M1_POIS,
- X M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY |
- X M2_LORD | M2_MALE,
- X M3_WANTSAMUL, C(BRIGHT_GREEN) },
- X { "Yeenoghu", S_DEMON, 56, 18, -5, 80, -15,
- X (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 3, 6 }, { AT_WEAP, AD_CONF, 2, 8 },
- X { AT_WEAP, AD_PLYS, 1, 6 }, { AT_MAGC, AD_MAGM, 2, 6 },
- X NO_ATTK, NO_ATTK },
- X 900, 500, 0, MS_ORC, MZ_LARGE, MR_FIRE | MR_POISON, 0,
- X M1_FLY | M1_SEE_INVIS | M1_POIS, M2_NOPOLY | M2_DEMON | M2_STALK |
- X M2_HOSTILE | M2_PNAME | M2_NASTY | M2_LORD | M2_MALE | M2_COLLECT,
- X M3_WANTSAMUL, C(HI_LORD) },
- X { "Orcus", S_DEMON, 66, 9, -6, 85, -20,
- X (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
- X { { AT_MAGC, AD_SPEL, 8, 6 }, { AT_WEAP, AD_PHYS, 3, 6 },
- X { AT_CLAW, AD_PHYS, 3, 4 }, { AT_CLAW, AD_PHYS, 3, 4 },
- X { AT_STNG, AD_DRST, 2, 4 }, NO_ATTK },
- X 1500, 500, 0, MS_ORC, MZ_HUGE,
- X MR_FIRE | MR_POISON, 0,
- X M1_FLY | M1_SEE_INVIS | M1_POIS, M2_NOPOLY | M2_DEMON | M2_STALK |
- X M2_HOSTILE | M2_PNAME | M2_NASTY | M2_PRINCE | M2_MALE | M2_COLLECT,
- X M3_WANTSBOOK | M3_WANTSAMUL, C(HI_LORD) },
- X { "Geryon", S_DEMON, 72, 3, -3, 75, 15,
- X (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
- X { { AT_CLAW, AD_PHYS, 3, 6 }, { AT_CLAW, AD_PHYS, 3, 6 },
- X { AT_STNG, AD_DRST, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK },
- X 1500, 500, 0, MS_BRIBE, MZ_HUGE,
- X MR_FIRE | MR_POISON, 0,
- X M1_FLY | M1_SEE_INVIS | M1_POIS | M1_SLITHY, M2_NOPOLY | M2_DEMON |
- X M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY | M2_PRINCE | M2_MALE,
- X M3_WANTSAMUL, C(HI_LORD) },
- X { "Dispater", S_DEMON, 78, 15, -2, 80, 15,
- X (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 4, 6 }, { AT_MAGC, AD_SPEL, 6, 6 },
- X NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X 1500, 500, 0, MS_BRIBE, MZ_HUMAN,
- X MR_FIRE | MR_POISON, 0, M1_FLY | M1_SEE_INVIS | M1_POIS |
- X M1_HUMANOID, M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE |
- X M2_PNAME | M2_NASTY | M2_PRINCE | M2_MALE | M2_COLLECT,
- X M3_WANTSAMUL, C(HI_LORD) },
- X { "Baalzebub", S_DEMON, 89, 9, -5, 85, 20,
- X (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
- X { { AT_BITE, AD_DRST, 2, 6 }, { AT_GAZE, AD_STUN, 2, 6 },
- X NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X 1500, 500, 0, MS_BRIBE, MZ_LARGE,
- X MR_FIRE | MR_POISON, 0, M1_FLY | M1_SEE_INVIS | M1_POIS,
- X M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY |
- X M2_PRINCE | M2_MALE, M3_WANTSAMUL | M3_WAITFORU, C(HI_LORD) },
- X { "Asmodeus", S_DEMON, 105, 12, -7, 90, 20,
- X (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
- X { { AT_CLAW, AD_PHYS, 4, 4 }, { AT_MAGC, AD_COLD, 6, 6 },
- X NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X 1500, 500, 0, MS_BRIBE, MZ_HUGE,
- X MR_FIRE | MR_COLD | MR_POISON, 0,
- X M1_FLY | M1_SEE_INVIS | M1_HUMANOID | M1_POIS,
- X M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG |
- X M2_NASTY | M2_PRINCE | M2_MALE, M3_WANTSAMUL | M3_WAITFORU,
- X C(HI_LORD) },
- X { "Demogorgon", S_DEMON, 106, 15, -8, 95, -20,
- X (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
- X { { AT_MAGC, AD_SPEL, 8, 6 }, { AT_STNG, AD_DRLI, 1, 4 },
- X { AT_CLAW, AD_DISE, 1, 6 }, { AT_CLAW, AD_DISE, 1, 6 },
- X NO_ATTK, NO_ATTK },
- X 1500, 500, 0, MS_GROWL, MZ_HUGE, MR_FIRE | MR_POISON, 0,
- X M1_FLY | M1_SEE_INVIS | M1_NOHANDS | M1_POIS, M2_NOPOLY | M2_DEMON |
- X M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY | M2_PRINCE | M2_MALE,
- X M3_WANTSAMUL, C(HI_LORD) },
- X { "Death", S_DEMON, 20, 3, 4, 95, 0, (G_UNIQ | G_NOGEN),
- X { { AT_TUCH, AD_DETH, 8, 8 }, { AT_TUCH, AD_DETH, 8, 8 },
- X NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 0, 0, MS_DEATH, MZ_HUMAN,
- X MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE,
- X MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE,
- X M1_FLY | M1_SEE_INVIS | M1_HUMANOID | M1_REGEN,
- X M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY,
- X 0, C(HI_LORD) },
- X { "Pestilence", S_DEMON, 20, 3, 4, 95, 0, (G_UNIQ | G_NOGEN),
- X { { AT_TUCH, AD_PEST, 8, 8 }, { AT_TUCH, AD_PEST, 8, 8 },
- X NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 0, 0, MS_PESTILENCE, MZ_HUMAN,
- X MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE,
- X MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE,
- X M1_FLY | M1_SEE_INVIS | M1_HUMANOID | M1_REGEN,
- X M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY,
- X 0, C(HI_LORD) },
- X { "Famine", S_DEMON, 20, 3, 4, 95, 0, (G_UNIQ | G_NOGEN),
- X { { AT_TUCH, AD_FAMN, 8, 8 }, { AT_TUCH, AD_FAMN, 8, 8 },
- X NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 0, 0, MS_FAMINE, MZ_HUMAN,
- X MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE,
- X MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE,
- X M1_FLY | M1_SEE_INVIS | M1_HUMANOID | M1_REGEN,
- X M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY,
- X 0, C(HI_LORD) },
- X#ifdef MAIL
- X { "mail daemon", S_DEMON, 56, 24, 10, 127, 0, (G_NOGEN | G_NOCORPSE),
- X { NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X 600, 300, 0, MS_SILENT, MZ_HUMAN,
- X MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0,
- X M1_FLY | M1_SWIM | M1_BREATHLESS | M1_SEE_INVIS | M1_HUMANOID |
- X M1_POIS, M2_NOPOLY | M2_STALK | M2_PEACEFUL, 0, C(BRIGHT_BLUE) },
- X/* Neither rain nor sleet nor gloom of night shall stay this courier... */
- X#endif
- X { "djinni", S_DEMON, 7, 12, 4, 30, 0, (G_NOGEN | G_NOCORPSE),
- X { { AT_WEAP, AD_PHYS, 2, 8 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X 1500, 400, 0, MS_DJINNI, MZ_HUMAN, MR_POISON | MR_STONE, 0,
- X M1_HUMANOID | M1_FLY | M1_POIS,
- X M2_NOPOLY | M2_STALK | M2_COLLECT, 0, C(YELLOW) },
- X/* sea monsters */
- X { "giant eel", S_EEL, 5, 9, -1, 0, 0, (G_GENO | G_NOGEN),
- X { { AT_BITE, AD_PHYS, 3, 6 }, { AT_TUCH, AD_WRAP, 0, 0 },
- X NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X 200, 250, 0, MS_SILENT, MZ_HUGE,
- X 0, 0, M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY |
- X M1_NOLIMBS | M1_CARNIVORE | M1_OVIPAROUS, M2_HOSTILE, 0, C(CYAN) },
- X { "electric eel", S_EEL, 7, 10, -3, 0, 0, (G_GENO | G_NOGEN),
- X { { AT_BITE, AD_ELEC, 4, 6 }, { AT_TUCH, AD_WRAP, 0, 0 },
- X NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X 200, 250, 0, MS_SILENT, MZ_HUGE, MR_ELEC, MR_ELEC,
- X M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS |
- X M1_CARNIVORE | M1_OVIPAROUS, M2_HOSTILE, 0, C(BLUE) },
- X { "kraken", S_EEL, 20, 3, 6, 0, -3, (G_GENO | G_NOGEN),
- X { { AT_CLAW, AD_PHYS, 2, 4 }, { AT_CLAW, AD_PHYS, 2, 4 },
- X { AT_HUGS, AD_WRAP, 2, 6 }, { AT_BITE, AD_PHYS, 5, 4 },
- X NO_ATTK, NO_ATTK },
- X 1800, 1000, 0, MS_SILENT, MZ_HUGE, 0, 0,
- X M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
- X M2_NOPOLY | M2_HOSTILE | M2_STRONG, 0, C(RED) },
- X/* lizards */
- X { "newt", S_LIZARD, 0, 6, 8, 0, 0, (G_GENO | 5),
- X { { AT_BITE, AD_PHYS, 1, 2 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X 10, 20, 0, MS_SILENT, MZ_TINY, 0, 0,
- X M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
- X M2_HOSTILE, 0, C(YELLOW) },
- X { "gecko", S_LIZARD, 1, 6, 8, 0, 0, (G_GENO | 5),
- X { { AT_BITE, AD_PHYS, 1, 3 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X 10, 20, 0, MS_SQEEK, MZ_TINY, 0, 0,
- X M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, C(GREEN) },
- X { "iguana", S_LIZARD, 2, 6, 7, 0, 0, (G_GENO | 5),
- X { { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X 30, 30, 0, MS_SILENT, MZ_TINY, 0, 0,
- X M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, C(BROWN) },
- X { "baby crocodile", S_LIZARD, 3, 6, 7, 0, 0, G_GENO,
- X { { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X 200, 200, 0, MS_SILENT, MZ_MEDIUM, 0, 0,
- X M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
- X M2_HOSTILE, 0, C(BROWN) },
- X { "lizard", S_LIZARD, 5, 6, 6, 10, 0, (G_GENO | 5),
- X { { AT_BITE, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X 10, 40, 0, MS_SILENT, MZ_TINY, MR_STONE, MR_STONE,
- X M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, C(GREEN) },
- X { "chameleon", S_LIZARD, 6, 5, 6, 10, 0, (G_GENO | 2),
- X { { AT_BITE, AD_PHYS, 4, 2 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X 100, 100, 0, MS_SILENT, MZ_TINY,
- X 0, 0, M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
- X M2_NOPOLY | M2_HOSTILE, 0, C(BROWN) },
- X { "crocodile", S_LIZARD, 6, 9, 5, 0, 0, (G_GENO | 1),
- X { { AT_BITE, AD_PHYS, 4, 2 }, { AT_CLAW, AD_PHYS, 1, 12 },
- X NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE, 0, 0,
- X M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS |
- X M1_OVIPAROUS | M1_CARNIVORE, M2_STRONG | M2_HOSTILE, 0, C(BROWN) },
- X
- X/* character classes */
- X { "archeologist", S_HUMAN, 1, 10, 10, 1, 3, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_TUNNEL | M1_NEEDPICK | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, 0, C(HI_DOMESTIC) },
- X { "barbarian", S_HUMAN, 1, 10, 10, 1, 0, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, MR_POISON, MR_POISON,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, 0, C(HI_DOMESTIC) },
- X { "caveman", S_HUMAN, 1, 10, 10, 0, 1, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_MALE | M2_COLLECT, 0, C(RED) },
- X { "cavewoman", S_HUMAN, 1, 10, 10, 0, 1, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_FEMALE | M2_COLLECT,
- X 0, C(HI_DOMESTIC) },
- X /* Note: players who are elves still get normal carrying capacity,
- X * even though this is strictly speaking inconsistent.
- X */
- X { "elf", S_HUMAN, 1, 12, 10, 2, -3, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN, MR_SLEEP, MR_SLEEP,
- X M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS,
- X M2_NOPOLY | M2_ELF | M2_STRONG | M2_COLLECT, 0, C(HI_DOMESTIC) },
- X { "healer", S_HUMAN, 1, 10, 10, 1, 0, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, MR_POISON, MR_POISON,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, 0, C(HI_DOMESTIC) },
- X { "knight", S_HUMAN, 1, 10, 10, 1, 3, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, 0, C(HI_DOMESTIC) },
- X { "priest", S_HUMAN, 1, 10, 10, 2, 0, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_MALE | M2_COLLECT,
- X 0, C(HI_DOMESTIC) },
- X { "priestess", S_HUMAN, 1, 10, 10, 2, 0, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_FEMALE | M2_COLLECT,
- X 0, C(HI_DOMESTIC) },
- X { "rogue", S_HUMAN, 1, 10, 10, 1, -3, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
- X 0, C(HI_DOMESTIC) },
- X { "samurai", S_HUMAN, 1, 10, 10, 1, 3, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, 0, C(HI_DOMESTIC) },
- X#ifdef TOURIST
- X { "tourist", S_HUMAN, 1, 10, 10, 1, 0, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, 0, C(HI_DOMESTIC) },
- X#endif
- X { "valkyrie", S_HUMAN, 1, 10, 10, 1, -1, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, MR_COLD, MR_COLD,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_FEMALE | M2_COLLECT,
- X 0, C(HI_DOMESTIC) },
- X { "wizard", S_HUMAN, 1, 10, 10, 3, 0, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT | M2_MAGIC,
- X 0, C(HI_DOMESTIC) },
- X#ifdef MULDGN
- X { "Lord Carnarvon", S_HUMAN, 20, 12, 0, 30, 20, (G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, 0, 0,
- X M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE |
- X M2_COLLECT | M2_MAGIC,
- X M3_CLOSE, C(HI_LORD) },
- X { "Pelias", S_HUMAN, 20, 12, 0, 30, 0, (G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, MR_POISON, MR_POISON,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG |
- X M2_COLLECT | M2_MAGIC,
- X M3_CLOSE, C(HI_LORD) },
- X { "Shaman Karnov", S_HUMAN, 20, 12, 0, 30, 20, (G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE |
- X M2_COLLECT | M2_MAGIC,
- X M3_CLOSE, C(HI_LORD) },
- X /* Two for elves - one of each sex. */
- X { "Earendil", S_HUMAN, 20, 15, 0, 50, -20, (G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_ELF, 350, 0, MS_LEADER, MZ_HUMAN, MR_SLEEP, MR_SLEEP,
- X M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
- X M2_NOPOLY | M2_ELF | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG |
- X M2_MALE | M2_COLLECT | M2_MAGIC, M3_CLOSE, C(HI_LORD) },
- X { "Elwing", S_HUMAN, 20, 15, 0, 50, -20, (G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_ELF, 350, 0, MS_LEADER, MZ_HUMAN, MR_SLEEP, MR_SLEEP,
- X M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
- X M2_NOPOLY | M2_ELF | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG |
- X M2_FEMALE | M2_COLLECT | M2_MAGIC, M3_CLOSE, C(HI_LORD) },
- X { "Hippocrates", S_HUMAN, 20, 12, 0, 40, 0, (G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, MR_POISON, MR_POISON,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE |
- X M2_COLLECT | M2_MAGIC, M3_CLOSE, C(HI_LORD) },
- X { "King Arthur", S_HUMAN, 20, 12, 0, 40, 20, (G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE |
- X M2_COLLECT | M2_MAGIC, M3_CLOSE, C(HI_LORD) },
- X { "Arch Priest", S_HUMAN, 25, 15, MARM(7,-3), 70, 0,
- X (G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 4, 10 }, { AT_KICK, AD_PHYS, 2, 8 },
- X { AT_MAGC, AD_CLRC, 2, 8 }, { AT_MAGC, AD_CLRC, 2, 8 },
- X NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN,
- X MR_FIRE | MR_ELEC | MR_SLEEP | MR_POISON,
- X MR_FIRE | MR_ELEC | MR_SLEEP | MR_POISON,
- X M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_NASTY |
- X M2_COLLECT | M2_MAGIC, M3_CLOSE, C(WHITE) },
- X { "Master of Thieves", S_HUMAN, 20, 15, 0, 30, -20, (G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 2, 6 }, { AT_WEAP, AD_PHYS, 2, 6 }, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_MALE |
- X M2_GREEDY | M2_JEWELS | M2_COLLECT | M2_MAGIC,
- X M3_CLOSE, C(HI_LORD) },
- X { "Lord Sato", S_HUMAN, 20, 0, 0, 30, 20, (G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE |
- X M2_COLLECT | M2_MAGIC, M3_CLOSE, C(HI_LORD) },
- X#ifdef TOURIST
- X { "Twoflower", S_HUMAN, 20, 10, 10, 20, 0, (G_NOGEN | G_UNIQ),
- X { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE |
- X M2_COLLECT | M2_MAGIC, M3_CLOSE, C(HI_DOMESTIC) },
- X#endif
- X { "Norn", S_HUMAN, 20, 15, 0, 80, 0, (G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, MR_COLD, MR_COLD,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_FEMALE |
- X M2_COLLECT | M2_MAGIC, M3_CLOSE, C(HI_LORD) },
- X { "Wizard of Balance", S_HUMAN, 20, 12, 0, 60, 0, (G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG |
- X M2_COLLECT | M2_MAGIC, M3_CLOSE, C(HI_LORD) },
- X
- X /* The nemesis monsters */
- X
- X { "Minion of Huhetol", S_DEMON, 16, 10, -2, 75, -14,
- X (G_NOCORPSE | G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 8, 4 }, { AT_WEAP, AD_PHYS, 4, 6 },
- X { AT_MAGC, AD_SPEL, 0, 0 }, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_NEMESIS, MZ_LARGE, MR_FIRE | MR_POISON, 0,
- X M1_FLY | M1_SEE_INVIS | M1_POIS,
- X M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY |
- X M2_COLLECT, M3_WANTSARTI | M3_WAITFORU, C(RED) },
- X { "Thoth Amon", S_HUMAN, 16, 10, 0, 10, -14, (G_NOGEN | G_UNIQ),
- X { { AT_MAGC, AD_SPEL, 0, 0 }, { AT_MAGC, AD_SPEL, 0, 0 },
- X { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN, MR_POISON, MR_POISON,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_STALK | M2_HOSTILE | M2_NASTY |
- X M2_COLLECT | M2_MAGIC, M3_WANTSARTI | M3_WAITFORU, C(HI_LORD) },
- X { "Chromatic Dragon", S_DRAGON, 16, 10, 0, 30, -14, (G_NOGEN | G_UNIQ),
- X { { AT_BREA, AD_RBRE, 6, 8 }, { AT_MAGC, AD_SPEL, 0, 0 },
- X { AT_BITE, AD_PHYS, 4, 8 }, { AT_BITE, AD_PHYS, 4, 8 },
- X { AT_BITE, AD_PHYS, 4, 8 }, { AT_STNG, AD_PHYS, 1, 6 } },
- X WT_DRAGON, 1700, 0, MS_NEMESIS, MZ_GIGANTIC,
- X MR_FIRE | MR_COLD | MR_ELEC | MR_DISINT | MR_POISON,
- X MR_FIRE | MR_COLD | MR_ELEC | MR_DISINT | MR_POISON,
- X M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_SEE_INVIS | M1_POIS,
- X M2_NOPOLY | M2_HOSTILE | M2_FEMALE | M2_PNAME | M2_STALK |
- X M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
- X M3_WANTSARTI | M3_WAITFORU, C(HI_LORD) },
- X { "Goblin King", S_ORC, 15, 10, MARM(10,4), 0, -15, (G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 2, 6 }, { AT_WEAP, AD_PHYS, 2, 6 },
- X NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X 750, 350, 0, MS_NEMESIS, MZ_HUMAN, 0, 0, M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_ORC | M2_HOSTILE | M2_STRONG | M2_STALK | M2_NASTY |
- X M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT | M2_MAGIC,
- X M3_WANTSARTI | M3_WAITFORU, C(HI_LORD) },
- X { "Cyclops", S_GIANT, 18, 10, 0, 0, -15, (G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 4, 8 }, { AT_WEAP, AD_PHYS, 4, 8 },
- X NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X 1900, 700, 0, MS_NEMESIS, MZ_HUGE, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_STALK |
- X M2_HOSTILE | M2_NASTY | M2_MALE | M2_JEWELS | M2_COLLECT,
- X M3_WANTSARTI | M3_WAITFORU, C(GRAY) },
- X { "Ixoth", S_DRAGON, 15, 9, -1, 20, -14, (G_NOGEN | G_UNIQ),
- X { { AT_BREA, AD_FIRE, 8, 6 }, { AT_BITE, AD_PHYS, 4, 8 },
- X { AT_MAGC, AD_SPEL, 0, 0 }, { AT_CLAW, AD_PHYS, 2, 4 },
- X { AT_CLAW, AD_PHYS, 2, 4 }, NO_ATTK },
- X WT_DRAGON, 1600, 0, MS_NEMESIS, MZ_GIGANTIC, MR_FIRE, MR_FIRE,
- X M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_SEE_INVIS,
- X M2_NOPOLY | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY | M2_STALK |
- X M2_GREEDY | M2_JEWELS | M2_MAGIC,
- X M3_WANTSARTI | M3_WAITFORU, C(RED) },
- X { "Nalzok", S_DEMON, 16, 10, -2, 85, -127,
- X (G_NOGEN | G_UNIQ | G_NOCORPSE),
- X { { AT_WEAP, AD_PHYS, 8, 4 }, { AT_WEAP, AD_PHYS, 4, 6 },
- X { AT_MAGC, AD_SPEL, 0, 0 }, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_NEMESIS, MZ_LARGE, MR_FIRE | MR_POISON, 0,
- X M1_FLY | M1_SEE_INVIS | M1_POIS,
- X M2_NOPOLY | M2_DEMON | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_STALK |
- X M2_NASTY | M2_COLLECT, M3_WANTSARTI | M3_WAITFORU, C(RED) },
- X { "Master Assassin", S_HUMAN, 15, 15, 0, 30, 18, (G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_DRST, 2, 6 }, { AT_WEAP, AD_PHYS, 2, 8 }, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_HOSTILE | M2_STALK | M2_NASTY |
- X M2_COLLECT | M2_MAGIC,
- X M3_WANTSARTI | M3_WAITFORU, C(HI_LORD) },
- X /* A renegade daimyo who led a 13 year civil war against the shogun */
- X /* of his time. */
- X { "Ashikaga Takauji", S_HUMAN, 15, 15, 0, 40, -13, (G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 2, 6 }, { AT_WEAP, AD_PHYS, 2, 6 }, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_PNAME | M2_HOSTILE | M2_STALK |
- X M2_NASTY | M2_MALE | M2_COLLECT | M2_MAGIC,
- X M3_WANTSARTI | M3_WAITFORU, C(HI_LORD) },
- X
- X/* NOTE: the Master of Thieves was defined above. */
- X
- X { "Lord Surtur", S_GIANT, 15, 12, 2, 50, 12, (G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 2, 10 }, { AT_WEAP, AD_PHYS, 2, 10 }, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X 2250, 850, 0, MS_NEMESIS, MZ_HUGE, MR_FIRE, MR_FIRE,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_STALK |
- X M2_HOSTILE | M2_NASTY | M2_MALE | M2_PNAME | M2_COLLECT | M2_JEWELS,
- X M3_WANTSARTI | M3_WAITFORU, C(HI_LORD) },
- X { "Dark One", S_HUMAN, 15, 10, 0, 80, -10, (G_NOGEN | G_UNIQ),
- X { { AT_WEAP, AD_PHYS, 1, 6 }, { AT_MAGC, AD_SPEL, 0, 0 },
- X { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_HOSTILE | M2_STALK | M2_NASTY |
- X M2_COLLECT | M2_MAGIC,
- X M3_WANTSARTI | M3_WAITFORU, C(BLACK) },
- X
- X/* The "guards" */
- X { "student", S_HUMAN, 5, 10, 10, 10, 3, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
- X M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
- X 0, C(HI_DOMESTIC) },
- X { "chieftain", S_HUMAN, 5, 10, 10, 10, 0, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, MR_POISON, MR_POISON,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
- X 0, C(HI_DOMESTIC) },
- X { "neanderthal", S_HUMAN, 5, 10, 10, 10, 1, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
- X 0, C(HI_DOMESTIC) },
- X { "High-elf", S_HUMAN, 5, 12, MARM(10,5), 10, -7, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 2, 4 }, { AT_MAGC, AD_CLRC, 0, 0 },
- X NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_ELF, 350, 0, MS_GUARDIAN, MZ_HUMAN, MR_SLEEP, MR_SLEEP,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_ELF | M2_PEACEFUL | M2_COLLECT, 0, C(HI_DOMESTIC) },
- X { "intern", S_HUMAN, 5, 10, 10, 10, 3, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, MR_POISON, MR_POISON,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
- X 0, C(HI_DOMESTIC) },
- X { "page", S_HUMAN, 5, 10, 10, 10, 3, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
- X 0, C(HI_DOMESTIC) },
- X { "acolyte", S_HUMAN, 5, 10, 10, 20, 0, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 6 }, { AT_MAGC, AD_CLRC, 0, 0 },
- X NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
- X 0, C(HI_DOMESTIC) },
- X { "thug", S_HUMAN, 5, 10, 10, 10, -3, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG |
- X M2_GREEDY | M2_COLLECT,
- X 0, C(HI_DOMESTIC) },
- X { "ninja", S_HUMAN, 5, 10, 10, 10, 3, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
- X 0, C(HI_DOMESTIC) },
- X { "ronin", S_HUMAN, 5, 10, 10, 10, 3, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_HOSTILE | M2_STRONG | M2_COLLECT,
- X 0, C(HI_DOMESTIC) },
- X#ifdef TOURIST
- X { "guide", S_HUMAN, 5, 10, 10, 20, 0, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 6 }, { AT_MAGC, AD_SPEL, 0, 0 },
- X NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG |
- X M2_COLLECT | M2_MAGIC, 0, C(HI_DOMESTIC) },
- X#endif
- X { "warrior", S_HUMAN, 5, 10, 10, 10, -1, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK,
- X NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
- X 0, C(HI_DOMESTIC) },
- X { "apprentice", S_HUMAN, 5, 10, 10, 30, 0, G_NOGEN,
- X { { AT_WEAP, AD_PHYS, 1, 6 }, { AT_MAGC, AD_SPEL, 0, 0 },
- X NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN, 0, 0,
- X M1_HUMANOID | M1_OMNIVORE,
- X M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG |
- X M2_COLLECT | M2_MAGIC, 0, C(HI_DOMESTIC) },
- X#endif /* MULDGN /* */
- X/* ARRAY TERMINATOR */
- X { "", 0, 0, 0, 0, 0, 0, 0,
- X { NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
- X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, C(0) }
- X};
- X#endif /* !SPLITMON_1 */
- X
- X#ifndef SPLITMON_1
- X/* dummy routine used to force linkage */
- Xvoid
- Xmonst_init()
- X{
- X return;
- X}
- X#endif
- X
- X/*monst.c*/
- END_OF_FILE
- if test 33131 -ne `wc -c <'src/monst.c3'`; then
- echo shar: \"'src/monst.c3'\" unpacked with wrong size!
- fi
- # end of 'src/monst.c3'
- fi
- echo shar: End of archive 60 \(of 108\).
- cp /dev/null ark60isdone
- MISSING=""
- for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
- 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \
- 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 \
- 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
- 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 \
- 101 102 103 104 105 106 107 108 ; do
- if test ! -f ark${I}isdone ; then
- MISSING="${MISSING} ${I}"
- fi
- done
- if test "${MISSING}" = "" ; then
- echo You have unpacked all 108 archives.
- echo "Now execute 'rebuild.sh'"
- rm -f ark10[0-8]isdone ark[1-9]isdone ark[1-9][0-9]isdone
- else
- echo You still need to unpack the following archives:
- echo " " ${MISSING}
- fi
- ## End of shell archive.
- exit 0
-