Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.1 6/24/83 (MC840302); site mcvax.UUCP Path: utzoo!watmath!clyde!burl!ulysses!allegra!mit-eddie!godot!harvard!seismo!mcvax!play From: play@mcvax.UUCP (funhouse) Newsgroups: net.sources Subject: Hack sources (part 2 of 15) Message-ID: <6244@mcvax.UUCP> Date: Mon, 17-Dec-84 19:28:17 EST Article-I.D.: mcvax.6244 Posted: Mon Dec 17 19:28:17 1984 Date-Received: Wed, 19-Dec-84 00:46:56 EST Organization: CWI, Amsterdam Lines: 697 # This is part 2 (of 15) of the Hack sources. Send complaints to # mcvax!play . # This is a shell archive. Remove anything before this line, then # unpack it by saving it in a file and typing "sh file". (Files # unpacked will be owned by you and have default permissions.) # # This archive contains: # def.edog.h def.eshk.h def.func_tab.h def.gen.h def.monst.h def.obj.h def.objclass.h def.objects.h def.permonst.h def.trap.h def.wseg.h hack.6 echo x - def.edog.h cat > "def.edog.h" << '//E*O*F def.edog.h//' /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ struct edog { long hungrytime; /* at this time dog gets hungry */ long eattime; /* dog is eating */ long droptime; /* moment dog dropped object */ unsigned dropdist; /* dist of drpped obj from @ */ unsigned apport; /* amount of training */ long whistletime; /* last time he whistled */ }; #define EDOG(mp) ((struct edog *)(&(mp->mextra[0]))) //E*O*F def.edog.h// echo x - def.eshk.h cat > "def.eshk.h" << '//E*O*F def.eshk.h//' /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #define BILLSZ 200 struct bill_x { unsigned bo_id; unsigned useup:1; unsigned bquan:7; unsigned price; /* price per unit */ }; struct eshk { long int robbed; /* amount stolen by most recent customer */ schar shoproom; /* index in rooms; set by inshop() */ coord shk; /* usual position shopkeeper */ coord shd; /* position shop door */ int billct; struct bill_x bill[BILLSZ]; int visitct; /* nr of visits by most recent customer */ char customer[PL_NSIZ]; /* most recent customer */ char shknam[PL_NSIZ]; }; //E*O*F def.eshk.h// echo x - def.func_tab.h cat > "def.func_tab.h" << '//E*O*F def.func_tab.h//' /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ struct func_tab { char f_char; int (*f_funct)(); }; extern struct func_tab list[]; //E*O*F def.func_tab.h// echo x - def.gen.h cat > "def.gen.h" << '//E*O*F def.gen.h//' /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ struct gen { struct gen *ngen; xchar gx,gy; unsigned gflag; /* 037: trap type; 040: SEEN flag */ #define SEEN 040 }; extern struct gen *fgold, *ftrap; struct gen *g_at(); #define newgen() (struct gen *) alloc(sizeof(struct gen)) //E*O*F def.gen.h// echo x - def.monst.h cat > "def.monst.h" << '//E*O*F def.monst.h//' /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ struct monst { struct monst *nmon; struct permonst *data; unsigned m_id; xchar mx,my; xchar mdx,mdy; /* if mdispl then pos where last displayed */ #define MTSZ 4 coord mtrack[MTSZ]; /* monster track */ schar mhp,orig_hp; char mimic; /* undetected mimic - this is its symbol */ Bitfield(mdispl,1); /* mdx,mdy valid */ Bitfield(minvis,1); /* invisible */ Bitfield(cham,1); /* shape-changer */ Bitfield(mhide,1); /* hides beneath objects */ Bitfield(mundetected,1); /* not seen in present hiding place */ Bitfield(mspeed,2); Bitfield(msleep,1); Bitfield(mfroz,1); Bitfield(mconf,1); Bitfield(mflee,1); Bitfield(mcan,1); /* has been cancelled */ Bitfield(mtame,1); /* implies peaceful */ Bitfield(mpeaceful,1); /* does not attack unprovoked */ Bitfield(isshk,1); /* is shopkeeper */ Bitfield(isgd,1); /* is guard */ Bitfield(mcansee,1); /* cansee 1, temp.blinded 0, blind 0 */ Bitfield(mblinded,7); /* cansee 0, temp.blinded n, blind 0 */ Bitfield(mtrapped,1); /* trapped in a pit or bear trap */ Bitfield(mnamelth,6); /* length of name (following mxlth) */ #ifndef NOWORM Bitfield(wormno,5); /* at most 31 worms on any level */ #endif NOWORM unsigned mtrapseen; /* bitmap of traps we've been trapped in */ long mlstmv; /* prevent two moves at once */ struct obj *minvent; long mgold; unsigned mxlth; /* length of following data */ /* in order to prevent alignment problems mextra should be (or follow) a long int */ long mextra[1]; /* monster dependent info */ }; #define newmonst(xl) (struct monst *) alloc((unsigned)(xl) + sizeof(struct monst)) extern struct monst *fmon; #ifndef MKLEV extern struct monst *fallen_down; #endif MKLEV struct monst *m_at(); /* these are in mspeed */ #define MSLOW 1 /* slow monster */ #define MFAST 2 /* speeded monster */ #define NAME(mtmp) (((char *) mtmp->mextra) + mtmp->mxlth) //E*O*F def.monst.h// echo x - def.obj.h cat > "def.obj.h" << '//E*O*F def.obj.h//' /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ struct obj { struct obj *nobj; unsigned o_id; unsigned o_cnt_id; /* id of container object is in */ xchar ox,oy; xchar odx,ody; uchar otyp; uchar owt; unsigned quan; /* small in general but large in case of gold */ schar spe; char olet; Bitfield(oinvis,1); Bitfield(odispl,1); Bitfield(known,1); /* exact nature known */ Bitfield(dknown,1); /* color or text known */ Bitfield(cursed,1); Bitfield(unpaid,1); /* on some bill */ Bitfield(rustfree,1); Bitfield(onamelth,6); long age; /* creation date */ long owornmask; #define W_ARM 01L #define W_ARM2 02L #define W_ARMH 04L #define W_ARMS 010L #define W_ARMG 020L #define W_ARMOR (W_ARM | W_ARM2 | W_ARMH | W_ARMS | W_ARMG) #define W_RINGL 010000L /* make W_RINGL = RING_LEFT (see uprop) */ #define W_RINGR 020000L #define W_RING (W_RINGL | W_RINGR) #define W_WEP 01000L #define W_BALL 02000L #define W_CHAIN 04000L long oextra[1]; }; extern struct obj *fobj; #define newobj(xl) (struct obj *) alloc((unsigned)(xl) + sizeof(struct obj)) #define ONAME(otmp) ((char *) otmp->oextra) //E*O*F def.obj.h// echo x - def.objclass.h cat > "def.objclass.h" << '//E*O*F def.objclass.h//' /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ /* definition of a class of objects */ struct objclass { char *oc_name; /* actual name */ char *oc_descr; /* description when name unknown */ char *oc_uname; /* called by user */ Bitfield(oc_name_known,1); Bitfield(oc_merge,1); /* merge otherwise equal objects */ char oc_olet; schar oc_prob; /* probability for mkobj() */ schar oc_delay; /* delay when using such an object */ uchar oc_weight; schar oc_oc1, oc_oc2; int oc_oi; #define nutrition oc_oi /* for foods */ #define a_ac oc_oc1 /* for armors */ #define a_can oc_oc2 /* for armors */ #define bits oc_oc1 /* for wands and rings */ /* wands */ #define NODIR 1 #define IMMEDIATE 2 #define RAY 4 /* rings */ #define SPEC 1 /* +n is meaningful */ #define wldam oc_oc1 /* for weapons */ #define wsdam oc_oc2 /* for weapons */ #define g_val oc_oi /* for gems: value on exit */ }; extern struct objclass objects[]; /* definitions of all object-symbols */ #define ILLOBJ_SYM '\\' #define AMULET_SYM '"' #define FOOD_SYM '%' #define WEAPON_SYM ')' #define TOOL_SYM '(' #define BALL_SYM '0' #define CHAIN_SYM '_' #define ROCK_SYM '`' #define ARMOR_SYM '[' #define POTION_SYM '!' #define SCROLL_SYM '?' #define WAND_SYM '/' #define RING_SYM '=' #define GEM_SYM '*' /* Other places with explicit knowledge of object symbols: * ....shk.c: char shtypes[] = "=/)%?!["; * mklev.c: "=/)%?![<>" * hack.mkobj.c: char mkobjstr[] = "))[[!!!!????%%%%/=**"; * hack.apply.c: otmp = getobj("0#%", "put in"); * hack.eat.c: otmp = getobj("%", "eat"); * hack.invent.c: if(index("!%?[)=*(0/\"", sym)){ * hack.invent.c: || index("%?!*",otmp->olet))){ */ //E*O*F def.objclass.h// echo x - def.objects.h cat > "def.objects.h" << '//E*O*F def.objects.h//' /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ /* objects have letter " % ) ( 0 _ [ ! ? / = * */ #include "def.objclass.h" #define NULL (char *)0 struct objclass objects[] = { { "strange object", NULL, NULL, 1, 0, ILLOBJ_SYM, 0, 0, 0, 0, 0, 0 }, { "amulet of Yendor", NULL, NULL, 1, 0, AMULET_SYM, 100, 0, 2, 0, 0, 0 }, #define FOOD(name,prob,delay,weight,nutrition) { name, NULL, NULL, 1, 1,\ FOOD_SYM, prob, delay, weight, 0, 0, nutrition } /* dog eats foods 0-4 but prefers 1 above 0,2,3,4 */ /* food 4 can be read */ /* food 5 improves your vision */ /* food 6 makes you stronger (like Popeye) */ /* foods CORPSE=15 up to CORPSE+52 are cadavers */ FOOD("food ration", 50, 5, 4, 800), FOOD("tripe ration", 20, 1, 2, 200), FOOD("pancake", 3, 1, 1, 200), FOOD("dead lizard", 3, 0, 1, 40), FOOD("fortune cookie", 7, 0, 1, 40), FOOD("carrot", 2, 0, 1, 50), FOOD("tin", 7, 0, 1, 0), FOOD("orange", 1, 0, 1, 80), FOOD("apple", 1, 0, 1, 50), FOOD("pear", 1, 0, 1, 50), FOOD("melon", 1, 0, 1, 100), FOOD("banana", 1, 0, 1, 80), FOOD("candy bar", 1, 0, 1, 100), FOOD("egg", 1, 0, 1, 80), FOOD("clove of garlic", 1, 0, 1, 40), FOOD("dead human", 0, 4, 40, 400), FOOD("dead giant ant", 0, 1, 3, 30), FOOD("dead giant bat", 0, 1, 3, 30), FOOD("dead centaur", 0, 5, 50, 500), FOOD("dead dragon", 0, 15, 150, 1500), FOOD("dead floating eye", 0, 1, 1, 10), FOOD("dead freezing sphere", 0, 1, 1, 10), FOOD("dead gnome", 0, 1, 10, 100), FOOD("dead hobgoblin", 0, 2, 20, 200), FOOD("dead stalker", 0, 4, 40, 400), FOOD("dead jackal", 0, 1, 10, 100), FOOD("dead kobold", 0, 1, 10, 100), FOOD("dead leprechaun", 0, 4, 40, 400), FOOD("dead mimic", 0, 4, 40, 400), FOOD("dead nymph", 0, 4, 40, 400), FOOD("dead orc", 0, 2, 20, 200), FOOD("dead purple worm", 0, 7, 70, 700), FOOD("dead quasit", 0, 2, 20, 200), FOOD("dead rust monster", 0, 5, 50, 500), FOOD("dead snake", 0, 1, 10, 100), FOOD("dead troll", 0, 4, 40, 400), FOOD("dead umber hulk", 0, 5, 50, 500), FOOD("dead vampire", 0, 4, 40, 400), FOOD("dead wraith", 0, 1, 1, 10), FOOD("dead xorn", 0, 7, 70, 700), FOOD("dead yeti", 0, 7, 70, 700), FOOD("dead zombie", 0, 1, 3, 30), FOOD("dead acid blob", 0, 1, 3, 30), FOOD("dead giant beetle", 0, 1, 1, 10), FOOD("dead cockatrice", 0, 1, 3, 30), FOOD("dead dog", 0, 2, 20, 200), FOOD("dead ettin", 0, 1, 3, 30), FOOD("dead fog cloud", 0, 1, 1, 10), FOOD("dead gelatinous cube", 0, 1, 10, 100), FOOD("dead homunculus", 0, 2, 20, 200), FOOD("dead imp", 0, 1, 1, 10), FOOD("dead jaguar", 0, 3, 30, 300), FOOD("dead killer bee", 0, 1, 1, 10), FOOD("dead leocrotta", 0, 5, 50, 500), FOOD("dead minotaur", 0, 7, 70, 700), FOOD("dead nurse", 0, 4, 40, 400), FOOD("dead owlbear", 0, 7, 70, 700), FOOD("dead piercer", 0, 2, 20, 200), FOOD("dead quivering blob", 0, 1, 10, 100), FOOD("dead giant rat", 0, 1, 3, 30), FOOD("dead giant scorpion", 0, 1, 10, 100), FOOD("dead tengu", 0, 3, 30, 300), FOOD("dead unicorn", 0, 3, 30, 300), FOOD("dead violet fungi", 0, 1, 10, 100), FOOD("dead long worm", 0, 5, 50, 500), /* %% wt of long worm should be proportional to its length */ FOOD("dead xan", 0, 3, 30, 300), FOOD("dead yellow light", 0, 1, 1, 10), FOOD("dead zruty", 0, 6, 60, 600), /* weapons ... - ROCK come several at a time */ /* weapons ... - (ROCK-1) are shot using idem+(BOW-ARROW) */ /* weapons AXE, SWORD, THSWORD are good for worm-cutting */ /* weapons AXE, DAGGER, CRYSKNIFE are good for tin-opening */ #define WEAPON(name,prob,wt,ldam,sdam) { name, NULL, NULL, 1, 0 /*%%*/,\ WEAPON_SYM, prob, 0, wt, ldam, sdam, 0 } WEAPON("arrow", 7, 0, 6, 6), WEAPON("sling bullet", 7, 0, 4, 6), WEAPON("crossbow bolt", 7, 0, 4, 6), WEAPON("dart", 7, 0, 3, 2), WEAPON("rock", 6, 1, 3, 3), WEAPON("boomerang", 2, 3, 9, 9), WEAPON("mace", 9, 3, 6, 7), WEAPON("axe", 6, 3, 6, 4), WEAPON("flail", 6, 3, 6, 5), WEAPON("long sword", 8, 3, 8, 12), WEAPON("two handed sword", 6, 4, 10, 6), WEAPON("dagger", 6, 3, 4, 3), WEAPON("worm tooth", 0, 4, 2, 2), WEAPON("crysknife", 0, 3, 12, 12), WEAPON("spear", 6, 3, 6, 8), WEAPON("bow", 6, 3, 4, 6), WEAPON("sling", 5, 3, 6, 6), WEAPON("crossbow", 6, 3, 4, 6), { "whistle", "whistle", NULL, 0, 0, TOOL_SYM, 90, 0, 2, 0, 0, 0 }, { "magic whistle", "whistle", NULL, 0, 0, TOOL_SYM, 10, 0, 2, 0, 0, 0 }, { "expensive camera", NULL, NULL, 1, 1, TOOL_SYM, 0, 0, 3, 0, 0, 0 }, { "ice box", "large box", NULL, 0, 0, TOOL_SYM, 0, 0, 40, 0, 0, 0 }, { "heavy iron ball", NULL, NULL, 1, 0, BALL_SYM, 100, 0, 20, 0, 0, 0 }, { "iron chain", NULL, NULL, 1, 0, CHAIN_SYM, 100, 0, 20, 0, 0, 0 }, { "enormous rock", NULL, NULL, 1, 0, ROCK_SYM, 100, 0, 200 /* > MAX_CARR_CAP */, 0, 0, 0 }, #define ARMOR(name,prob,delay,ac,can) { name, NULL, NULL, 1, 0,\ ARMOR_SYM, prob, delay, 8, ac, can, 0 } ARMOR("helmet", 3, 1, 9, 0), ARMOR("plate mail", 5, 5, 3, 2), ARMOR("splint mail", 8, 5, 4, 1), ARMOR("banded mail", 10, 5, 4, 0), ARMOR("chain mail", 10, 5, 5, 1), ARMOR("scale mail", 10, 5, 6, 0), ARMOR("ring mail", 15, 5, 7, 0), /* the armors below do not rust */ ARMOR("studded leather armor", 13, 3, 7, 1), ARMOR("leather armor", 17, 3, 8, 0), ARMOR("elven cloak", 5, 0, 9, 3), ARMOR("shield", 3, 0, 9, 0), ARMOR("pair of gloves", 1, 1, 9, 0), #define POTION(name,color) { name, color, NULL, 0, 1,\ POTION_SYM, 0, 0, 2, 0, 0, 0 } POTION("restore strength", "orange"), POTION("booze", "bubbly"), POTION("invisibility", "glowing"), POTION("fruit juice", "smoky"), POTION("healing", "pink"), POTION("paralysis", "puce"), POTION("monster detection", "purple"), POTION("object detection", "yellow"), POTION("sickness", "white"), POTION("confusion", "swirly"), POTION("gain strength", "purple-red"), POTION("speed", "ruby"), POTION("blindness", "dark green"), POTION("gain level", "emerald"), POTION("extra healing", "sky blue"), POTION("levitation", "brown"), POTION(NULL, "brilliant blue"), POTION(NULL, "clear"), POTION(NULL, "magenta"), POTION(NULL, "ebony"), #define SCROLL(name,text,prob) { name, text, NULL, 0, 1,\ SCROLL_SYM, prob, 0, 3, 0, 0, 0 } SCROLL("enchant armor", "ZELGO MER", 6), SCROLL("destroy armor", "JUYED AWK YACC", 5), SCROLL("confuse monster", "NR 9", 5), SCROLL("scare monster", "XIXAXA XOXAXA XUXAXA", 4), SCROLL("blank paper", "READ ME", 3), SCROLL("remove curse", "PRATYAVAYAH", 6), SCROLL("enchant weapon", "DAIYEN FOOELS", 6), SCROLL("damage weapon", "HACKEM MUCHE", 5), SCROLL("create monster", "LEP GEX VEN ZEA", 5), SCROLL("taming", "PRIRUTSENIE", 1), SCROLL("genocide", "ELBIB YLOH",2), SCROLL("light", "VERR YED HORRE", 10), SCROLL("teleportation", "VENZAR BORGAVVE", 5), SCROLL("gold detection", "THARR", 4), SCROLL("food detection", "YUM YUM", 1), SCROLL("identify", "KERNOD WEL", 18), SCROLL("magic mapping", "ELAM EBOW", 5), SCROLL("amnesia", "DUAM XNAHT", 3), SCROLL("fire", "ANDOVA BEGARIN", 5), SCROLL("punishment", "VE FORBRYDERNE", 1), SCROLL(NULL, "VELOX NEB", 0), SCROLL(NULL, "FOOBIE BLETCH", 0), SCROLL(NULL, "TEMOV", 0), SCROLL(NULL, "GARVEN DEH", 0), #define WAND(name,metal,prob,flags) { name, metal, NULL, 0, 0,\ WAND_SYM, prob, 0, 3, flags, 0, 0 } WAND("light", "iridium", 10, NODIR), WAND("secret door detection", "tin", 5, NODIR), WAND("create monster", "platinum", 5, NODIR), WAND("wishing", "glass", 1, NODIR), WAND("striking", "zinc", 9, IMMEDIATE), WAND("slow monster", "balsa", 5, IMMEDIATE), WAND("speed monster", "copper", 5, IMMEDIATE), WAND("undead turning", "silver", 5, IMMEDIATE), WAND("polymorph", "brass", 5, IMMEDIATE), WAND("cancellation", "maple", 5, IMMEDIATE), WAND("teleport monster", "pine", 5, IMMEDIATE), WAND("make invisible", "marble", 9, IMMEDIATE), WAND("digging", "iron", 5, RAY), WAND("magic missile", "aluminium", 10, RAY), WAND("fire", "steel", 5, RAY), WAND("sleep", "curved", 5, RAY), WAND("cold", "short", 5, RAY), WAND("death", "long", 1, RAY), WAND(NULL, "oak", 0, 0), WAND(NULL, "ebony", 0, 0), WAND(NULL, "runed", 0, 0), #define RING(name,stone,spec) { name, stone, NULL, 0, 0,\ RING_SYM, 0, 0, 1, spec, 0, 0 } RING("adornment", "engagement", 0), RING("teleportation", "wooden", 0), RING("regeneration", "black onyx", 0), RING("searching", "topaz", 0), RING("see invisible", "pearl", 0), RING("stealth", "sapphire", 0), RING("levitation", "moonstone", 0), RING("poison resistance", "agate", 0), RING("aggravate monster", "tiger eye", 0), RING("hunger", "shining", 0), RING("fire resistance", "gold", 0), RING("cold resistance", "copper", 0), RING("protection from shape changers", "diamond", 0), RING("conflict", "jade", 0), RING("gain strength", "ruby", SPEC), RING("increase damage", "silver", SPEC), RING("protection", "granite", SPEC), RING("warning", "wire", 0), RING("teleport control", "iron", 0), RING(NULL, "ivory", 0), RING(NULL, "blackened", 0), /* gems ************************************************************/ #define GEM(name,color,prob,gval) { name, color, NULL, 0, 1,\ GEM_SYM, prob, 0, 1, 0, 0, gval } GEM("diamond", "blue", 1, 4000), GEM("ruby", "red", 1, 3500), GEM("sapphire", "blue", 1, 3000), GEM("emerald", "green", 1, 2500), GEM("turquoise", "green", 1, 2000), GEM("aquamarine", "blue", 1, 1500), GEM("tourmaline", "green", 1, 1000), GEM("topaz", "yellow", 1, 900), GEM("opal", "yellow", 1, 800), GEM("garnet", "dark", 1, 700), GEM("amethyst", "violet", 2, 650), GEM("agate", "green", 2, 600), GEM("onyx", "white", 2, 550), GEM("jasper", "yellowish brown", 2, 500), GEM("jade", "green", 2, 450), GEM("worthless piece of blue glass", "blue", 20, 0), GEM("worthless piece of red glass", "red", 20, 0), GEM("worthless piece of yellow glass", "yellow", 20, 0), GEM("worthless piece of green glass", "green", 20, 0), { NULL, NULL, NULL, 0, 0, ILLOBJ_SYM, 0, 0, 0, 0, 0, 0 } }; char obj_symbols[] = { ILLOBJ_SYM, AMULET_SYM, FOOD_SYM, WEAPON_SYM, TOOL_SYM, BALL_SYM, CHAIN_SYM, ROCK_SYM, ARMOR_SYM, POTION_SYM, SCROLL_SYM, WAND_SYM, RING_SYM, GEM_SYM, 0 }; int bases[sizeof(obj_symbols)]; //E*O*F def.objects.h// echo x - def.permonst.h cat > "def.permonst.h" << '//E*O*F def.permonst.h//' /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ struct permonst { char *mname,mlet; schar mlevel,mmove,ac,damn,damd; unsigned pxlth; }; //E*O*F def.permonst.h// echo x - def.trap.h cat > "def.trap.h" << '//E*O*F def.trap.h//' /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ /* various kinds of traps */ #define BEAR_TRAP 0 #define ARROW_TRAP 1 #define DART_TRAP 2 #define TRAPDOOR 3 #define TELEP_TRAP 4 #define PIT 5 #define SLP_GAS_TRAP 6 #define PIERC 7 #define MIMIC 8 /* used only in mklev.c */ /* before adding more trap types, check mfndpos ! */ /* #define SEEN 32 - trap which has been seen */ //E*O*F def.trap.h// echo x - def.wseg.h cat > "def.wseg.h" << '//E*O*F def.wseg.h//' /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #ifndef NOWORM /* worm structure */ struct wseg { struct wseg *nseg; xchar wx,wy; unsigned wdispl:1; }; #define newseg() (struct wseg *) alloc(sizeof(struct wseg)) #endif NOWORM //E*O*F def.wseg.h// echo x - hack.6 cat > "hack.6" << '//E*O*F hack.6//' .TH HACK 6 "12 December 1984" .UC 4 .SH NAME hack \- Exploring The Dungeons of Doom .SH SYNOPSIS .B /usr/games/hack [ .B \-d .I directory ] [ .B \-n ] [ .B \-u .I playername ] .br .B /usr/games/hack [ .B \-d .I directory ] .B \-s [ .B \-X ] [ .I playernames ] .SH DESCRIPTION .PP .I Hack is a display oriented dungeons & dragons - like game. Both display and command structure resemble rogue. (For a game with the same structure but entirely different display - a real cave instead of dull rectangles - try Quest.) .PP To get started you really only need to know two commands. The command .B ? will give you a list of the available commands and the command .B / will identify the things you see on the screen. .PP To win the game (as opposed to merely playing to beat other people high scores) you must locate the Amulet of Yendor which is somewhere below the 20th level of the dungeon and get it out. Nobody has achieved this yet and if somebody does, he will probably go down in history as a hero among heros. .PP When the game ends, either by your death, when you quit, or if you escape from the caves, .I hack will give you (a fragment of) the list of top scorers. The scoring is based on many aspects of your behaviour but a rough estimate is obtained by taking the amount of gold you've found in the cave plus four times your (real) experience. Precious stones may be worth a lot of gold when brought to the exit. There is a 10% penalty for getting yourself killed. .PP The administration of the game is kept in the directory specified with the .B \-d option, or, if no such option is given, in the directory specified by the environment variable HACKDIR, or, if no such variable exists, in the current directory. This same directory contains several auxiliary files such as lockfiles and the list of topscorers and a subdirectory .I save where games are saved. .PP The .B \-n option suppresses printing of the news. .PP The .B \-u .I playername option supplies the answer to the question "Who are you?". When .I playername has as suffix one of .B \-T \-S \-K \-F \-C \-W then this supplies the answer to the question "What kind of character ... ?". .PP The .B \-s option will print out the list of your scores. It may be followed by arguments .B \-X where X is one of the letters C, F, K, S, T, W to print the scores of Cavemen, Fighters, Knights, Speleologists, Tourists or Wizards. It may also be followed by one or more player names to print the scores of the players mentioned. .SH AUTHORS Jay Fenlason (+ Kenny Woodland, Mike Thome and Jon Payne) wrote the original hack, very much like rogue (but full of bugs). .br Andries Brouwer continuously deformed their sources into the current version - in fact an entirely different game. .SH FILES .DT .ta \w'data, help, rumors\ \ \ 'u hack, mklev The hack program and an auxiliary .br program called by hack. .br data, help, rumors Data files used by hack. .br record The list of topscorers. .br save A subdirectory containing the saved games. .br bones_dd Descriptions of the ghost and .br belongings of a deceased adventurer. .SH BUGS .PP Probably infinite. Mail complaints to mcvax!aeb . //E*O*F hack.6// exit 0