billr@saab.CNA.TEK.COM (Bill Randle) (07/24/89)
Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu> Posting-number: Volume 7, Issue 63 Archive-name: NetHack3/Part08 #! /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 8 (of 38)." # Contents: src/monst.c2 src/save.c # Wrapped by billr@saab on Sun Jul 23 21:32:51 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'src/monst.c2' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/monst.c2'\" else echo shar: Extracting \"'src/monst.c2'\" \(35010 characters\) sed "s/^X//" >'src/monst.c2' <<'END_OF_FILE' X/* Leprechauns */ X { "leprechaun", S_LEPRECHAUN, 5, 15, 8, 20, 0, (G_GENO | 4), X { { AT_CLAW, AD_PHYS, 1, 2 }, { AT_CLAW, AD_SGLD, 0, 0 }, X NO_ATTK, NO_ATTK, NO_ATTK }, X 30, 300, 0, MS_LAUGH, M1_HUMANOID | M1_TPORT | M1_GREEDY, X M2_HOSTILE }, X/* Mummies */ X { "kobold mummy", S_MUMMY, 3, 8, 6, 20, -2, (G_GENO | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 10, 20, 0, MS_SILENT, X M1_HUMANOID | M1_UNDEAD | M1_POIS, M2_HOSTILE }, X { "gnome mummy", S_MUMMY, 4, 10, 6, 20, -3, (G_GENO | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 20, 25, 0, MS_SILENT, X M1_HUMANOID | M1_UNDEAD | M1_POIS, M2_HOSTILE }, X { "orc mummy", S_MUMMY, 5, 10, 5, 20, -4, (G_GENO | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 30, 30, 0, MS_SILENT, M1_HUMANOID | M1_UNDEAD | M1_POIS | X M1_GREEDY | M1_JEWELS, M2_HOSTILE | M2_ORC }, X { "elf mummy", S_MUMMY, 6, 12, 4, 30, -5, (G_GENO | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 35, 35, 0, MS_SILENT, M1_HUMANOID | M1_UNDEAD | M1_POIS | M1_SLEE_RES, X M2_HOSTILE | M2_ELF }, X { "human mummy", S_MUMMY, 6, 12, 4, 30, -5, (G_GENO | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 2, 4 }, { AT_CLAW, AD_PHYS, 2, 4 }, X NO_ATTK, NO_ATTK, NO_ATTK }, X 40, 40, 0, MS_SILENT, X M1_HUMANOID | M1_UNDEAD | M1_POIS, M2_HOSTILE }, X { "ettin mummy", S_MUMMY, 7, 12, 4, 30, -6, (G_GENO | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 2, 6 }, { AT_CLAW, AD_PHYS, 2, 6 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 70, 50, 0, MS_SILENT, X M1_HUMANOID | M1_UNDEAD | M1_POIS | M1_BIG, X M2_HOSTILE | M2_STRONG }, X { "giant mummy", S_MUMMY, 8, 14, 3, 30, -7, (G_GENO | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 3, 4 }, { AT_CLAW, AD_PHYS, 3, 4 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 70, 50, 0, MS_SILENT, X M1_HUMANOID | M1_UNDEAD | M1_POIS | M1_BIG | M1_JEWELS, X M2_HOSTILE | M2_GIANT | M2_STRONG }, X/* Nymphs */ X { "wood nymph", S_NYMPH, 3, 12, 9, 20, 0, (G_GENO | 2), X { { AT_CLAW, AD_SITM, 0, 0 }, { AT_CLAW, AD_SEDU, 0, 0 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 30, 300, 0, MS_SEDUCE, X M1_HUMANOID | M1_TPORT | M1_COLLECT | M1_FEM, M2_HOSTILE }, X { "water nymph", S_NYMPH, 3, 12, 9, 20, 0, (G_GENO | 2), X { { AT_CLAW, AD_SITM, 0, 0 }, { AT_CLAW, AD_SEDU, 0, 0 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 30, 300, 0, MS_SEDUCE, X M1_HUMANOID | M1_TPORT | M1_COLLECT | M1_FEM | M1_SWIM, X M2_HOSTILE }, X { "mountain nymph", S_NYMPH, 3, 12, 9, 20, 0, (G_GENO | 2), X { { AT_CLAW, AD_SITM, 0, 0 }, { AT_CLAW, AD_SEDU, 0, 0 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 30, 300, 0, MS_SEDUCE, X M1_HUMANOID | M1_TPORT | M1_COLLECT | M1_FEM, M2_HOSTILE }, X/* Ogres */ X { "ogre", S_OGRE, 5, 10, 5, 0, -3, (G_SGROUP | G_GENO | 1), X { { AT_WEAP, AD_PHYS, 2, 5 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 60, 500, 0, MS_GRUNT, X M1_BIG | M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_COLLECT, X M2_STRONG }, X { "ogre lord", S_OGRE, 7, 12, 3, 30, -5, (G_GENO | 2), X { { AT_WEAP, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 70, 700, 0, MS_GRUNT, X M1_BIG | M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_COLLECT | M1_LORD, X M2_STRONG }, X { "ogre king", S_OGRE, 7, 14, 4, 60, -7, (G_GENO | 2), X { { AT_WEAP, AD_PHYS, 3, 5 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 70, 750, 0, MS_GRUNT, X M1_BIG | M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_COLLECT | M1_PRINCE, X M2_STRONG }, X/* Puddings */ X { "gray ooze", S_PUDDING, 3, 1, 8, 0, 0, (G_GENO | 2), X { { AT_BITE, AD_RUST, 2, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 50, 500, 0, MS_SILENT, M1_NOEYES | M1_NOHANDS | M1_POIS_RES, X M2_HOSTILE | M2_NOLIMBS | M2_OMNIVORE | M2_AMORPHOUS }, X { "brown pudding", S_PUDDING, 5, 3, 8, 0, 0, (G_GENO | 1), X { { AT_BITE, AD_DCAY, 0, 0 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 50, 500, 0, MS_SILENT, M1_NOEYES | M1_NOHANDS | M1_POIS_RES | X M1_COLD_RES | M1_ELEC_RES, X M2_HOSTILE | M2_NOLIMBS | M2_OMNIVORE | M2_AMORPHOUS }, X { "black pudding", S_PUDDING, 10, 6, 6, 0, 0, (G_GENO | 1), X { { AT_BITE, AD_RUST, 3, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 50, 500, 0, MS_SILENT, M1_NOEYES | M1_NOHANDS | M1_POIS_RES | X M1_COLD_RES | M1_ELEC_RES, X M2_HOSTILE | M2_NOLIMBS | M2_OMNIVORE | M2_AMORPHOUS }, X/* Quantum Mechanics */ X { "quantum mechanic", S_QUANTMECH, 7, 12, 3, 10, 0, (G_GENO | 3), X { { AT_CLAW, AD_TLPT, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 2, 20, 0, MS_SILENT, M1_ANIMAL | M1_HUMANOID | M1_POIS, M2_HOSTILE }, X { "mad scientist", S_QUANTMECH, 8, 12, 2, 20, 0, (G_GENO | 2), X { { AT_WEAP, AD_SLEE, 1, 8 }, { AT_CLAW, AD_DREN, 0, 0 }, X NO_ATTK, NO_ATTK, NO_ATTK }, X 35, 200, 0, MS_SILENT, M1_HUMANOID | M1_POIS | M1_COLLECT, X M2_HOSTILE | M2_HUMAN }, X/* Rust Monster */ X { "rust monster", S_RUSTMONST, 5, 18, 2, 0, 0, (G_GENO | 2), X { { AT_TUCH, AD_RUST, 0, 0 }, { AT_TUCH, AD_RUST, 0, 0 }, NO_ATTK, X NO_ATTK, NO_ATTK }, X 50, 500, 0, MS_SILENT, M1_SWIM | M1_ANIMAL | M1_NOHANDS, M2_HOSTILE }, X/* Snakes */ X { "garter snake", S_SNAKE, 1, 8, 8, 0, 0, (G_LGROUP | G_GENO | 1), X { { AT_BITE, AD_PHYS, 1, 2 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 5, 60, 0, MS_HISS, X M1_VSMALL | M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_EGGS, M2_CONCEAL | X M2_NOLIMBS | M2_CARNIVORE }, X { "snake", S_SNAKE, 4, 15, 3, 0, 0, (G_GENO | 2), X { { AT_BITE, AD_DRST, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 10, 80, 0, MS_HISS, M1_VSMALL | M1_SWIM | M1_ANIMAL | M1_NOHANDS | X M1_EGGS | M1_POIS | M1_POIS_RES, M2_HOSTILE | M2_CONCEAL | X M2_NOLIMBS | M2_CARNIVORE }, X { "pit viper", S_SNAKE, 6, 15, 2, 0, 0, (G_GENO | 1), X { { AT_BITE, AD_DRST, 1, 4 }, { AT_BITE, AD_DRST, 1, 4 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 5, 60, 0, MS_HISS, M1_VSMALL | X M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_EGGS | M1_POIS | M1_POIS_RES, X M2_HOSTILE | M2_CONCEAL | M2_NOLIMBS | M2_CARNIVORE }, X { "cobra", S_SNAKE, 6, 18, 2, 0, 0, (G_GENO | 1), X { { AT_BITE, AD_DRST, 2, 4 }, { AT_SPIT, AD_BLND, 0, 0 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 15, 100, 0, MS_HISS, M1_VSMALL | X M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_EGGS | M1_POIS | M1_POIS_RES, X M2_HOSTILE | M2_CONCEAL | M2_NOLIMBS | M2_CARNIVORE }, X { "python", S_SNAKE, 6, 3, 5, 0, 0, (G_GENO | 1), X { { AT_BITE, AD_DRST, 1, 4 }, { AT_HUGS, AD_WRAP, 2, 4 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 15, 100, 0, MS_HISS, M1_BIG | X M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_EGGS | M1_POIS | M1_POIS_RES, X M2_HOSTILE | M2_STRONG | M2_NOLIMBS | M2_CARNIVORE }, X { "water moccasin", S_SNAKE, 4, 15, 3, 0, 0, X (G_GENO | G_NOGEN | G_LGROUP), X { { AT_BITE, AD_DRST, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 10, 100, 0, MS_HISS, M1_VSMALL | M1_SWIM | M1_ANIMAL | M1_NOHANDS | X M1_EGGS | M1_POIS | M1_POIS_RES, M2_HOSTILE | M2_CONCEAL | X M2_NOLIMBS | M2_CARNIVORE }, X/* Trolls */ X { "troll", S_TROLL, 7, 12, 4, 0, -3, (G_GENO | 2), X { { AT_CLAW, AD_PHYS, 4, 2 }, { AT_CLAW, AD_PHYS, 4, 2 }, X { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK }, X 40, 400, 0, MS_GRUNT, M1_BIG | M1_HUMANOID | M1_REGEN | M1_STALK, X M2_STRONG | M2_CARNIVORE | M2_HOSTILE }, X { "ice troll", S_TROLL, 9, 10, 2, 20, -3, (G_GENO | 1), X { { AT_CLAW, AD_PHYS, 2, 6 }, { AT_CLAW, AD_COLD, 2, 6 }, X { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK }, X 40, 300, 0, MS_GRUNT, X M1_BIG | M1_HUMANOID | M1_COLD_RES | M1_REGEN | M1_STALK, X M2_STRONG | M2_CARNIVORE | M2_HOSTILE }, X { "rock troll", S_TROLL, 9, 12, 0, 0, -3, (G_GENO | 1), X { { AT_CLAW, AD_PHYS, 2, 8 }, { AT_WEAP, AD_PHYS, 3, 6 }, X { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK }, X 40, 300, 0, MS_GRUNT, X M1_BIG | M1_HUMANOID | M1_REGEN | M1_STALK | M1_COLLECT, X M2_STRONG | M2_CARNIVORE | M2_HOSTILE }, X { "water troll", S_TROLL, 11, 14, 4, 40, -3, (G_NOGEN | G_GENO), X { { AT_CLAW, AD_PHYS, 2, 8 }, { AT_CLAW, AD_PHYS, 2, 8 }, X { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK }, X 40, 400, 0, MS_GRUNT, X M1_BIG | M1_SWIM | M1_HUMANOID | M1_REGEN | M1_STALK, X M2_STRONG | M2_CARNIVORE | M2_HOSTILE }, X#ifdef TOLKIEN X { "Olog-hai", S_TROLL, 13, 12, -4, 0, -7, (G_GENO | 1), X { { AT_CLAW, AD_PHYS, 2, 8 }, { AT_WEAP, AD_PHYS, 3, 6 }, X { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK }, X 40, 400, 0, MS_GRUNT, X M1_BIG | M1_HUMANOID | M1_REGEN | M1_STALK | M1_COLLECT, X M2_STRONG | M2_CARNIVORE | M2_HOSTILE }, X#endif X/* Umber Hulk */ X { "umber hulk", S_UMBER, 9, 6, 2, 25, 0, (G_GENO | 2), X { { AT_CLAW, AD_PHYS, 3, 4 }, { AT_CLAW, AD_PHYS, 3, 4 }, X { AT_BITE, AD_PHYS, 2, 5 }, { AT_GAZE, AD_CONF, 0, 0 }, NO_ATTK }, X 50, 500, 0, MS_SILENT, M1_BIG, M2_STRONG | M2_TUNNEL | M2_CARNIVORE }, X/* Vampires */ X { "vampire", S_VAMPIRE, 10, 12, 1, 25, -8, (G_GENO | 1), X { { AT_CLAW, AD_PHYS, 1, 6 }, { AT_BITE, AD_DRLI, 1, 6 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 40, 400, 0, MS_VAMPIRE, X M1_FLY | M1_HUMANOID | M1_UNDEAD | M1_POIS | M1_REGEN | X M1_STALK, M2_HOSTILE | M2_STRONG | M2_NASTY }, X { "vampire lord", S_VAMPIRE, 12, 14, 0, 50, -9, (G_GENO | 1), X { { AT_CLAW, AD_PHYS, 1, 8 }, { AT_BITE, AD_DRLI, 1, 8 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 40, 400, 0, MS_VAMPIRE, X M1_FLY | M1_HUMANOID | M1_UNDEAD | M1_POIS | M1_REGEN | X M1_STALK | M1_LORD, M2_HOSTILE | M2_STRONG | M2_NASTY }, X { "Vlad the Impaler", S_VAMPIRE, 14, 18, -3, 80, -10, X (G_NOGEN | G_NOCORPSE | G_UNIQ), X { { AT_WEAP, AD_PHYS, 1, 6 }, { AT_BITE, AD_DRLI, 1, 6 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 40, 400, PL_NSIZ, MS_VAMPIRE, X M1_NOPOLY | M1_FLY | M1_HUMANOID | M1_UNDEAD | M1_POIS | X M1_REGEN | M1_STALK | M1_PRINCE, X M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY }, X/* Wraiths */ X { "barrow wight", S_WRAITH, 3, 12, 5, 5, -3, (G_GENO | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 1, 4 }, { AT_MAGC, AD_SPEL, 0, 0 }, X { AT_WEAP, AD_DRLI, 0, 0 }, NO_ATTK, NO_ATTK }, 0, 0, 0, MS_SILENT, X M1_HUMANOID | M1_UNDEAD | M1_POIS_RES | M1_STALK | M1_COLLECT, X M2_HOSTILE }, X { "wraith", S_WRAITH, 6, 12, 4, 15, -6, (G_GENO | 2), X { { AT_TUCH, AD_DRLI, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 0, 0, 0, MS_SILENT, X M1_FLY | M1_HUMANOID | M1_UNDEAD | M1_POIS_RES | M1_STALK, X M2_HOSTILE }, X#ifdef TOLKIEN X { "Nazgul", S_WRAITH, 13, 12, 0, 25, -17, (G_GENO | G_NOCORPSE | 1), X { { AT_WEAP, AD_DRLI, 1, 4 }, { AT_BREA, AD_SLEE, 0, 0 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 0, 0, 0, MS_SILENT, X M1_HUMANOID | M1_UNDEAD | M1_POIS_RES | M1_STALK | M1_COLLECT, X M2_STRONG }, X#endif X/* Xorn */ X { "xorn", S_XORN, 8, 9,-2, 20, 0, (G_GENO | 1), X { { AT_CLAW, AD_PHYS, 1, 3 }, { AT_CLAW, AD_PHYS, 1, 3 }, X { AT_CLAW, AD_PHYS, 1, 3 }, { AT_BITE, AD_PHYS, 4, 6 }, X NO_ATTK }, 70, 700, 0, MS_SILENT, X M1_BIG | M1_WALLWALK | M1_FIRE_RES | M1_COLD_RES | M1_STON_RES, X M2_HOSTILE | M2_STRONG | M2_THICK_HIDE }, X/* Yeti */ X { "yeti", S_YETI, 5, 15, 6, 0, 0, (G_GENO | 2), X { { AT_CLAW, AD_PHYS, 1, 6 }, { AT_CLAW, AD_PHYS, 1, 6 }, X { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK }, X 70, 700, 0, MS_GROWL, M1_BIG | M1_ANIMAL | M1_HUMANOID | M1_COLD_RES, X M2_HOSTILE | M2_STRONG | M2_CARNIVORE }, X/* Zombies */ X { "kobold zombie", S_ZOMBIE, 0, 6, 10, 0, -2, (G_GENO | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 10, 0, 0, MS_SILENT, M1_HUMANOID | M1_UNDEAD | M1_POIS | X M1_POIS_RES | M1_STALK, M2_HOSTILE }, X { "gnome zombie", S_ZOMBIE, 1, 6, 10, 0, -2, (G_GENO | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 1, 5 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 20, 0, 0, MS_SILENT, M1_HUMANOID | M1_UNDEAD | M1_POIS | X M1_POIS_RES | M1_STALK, M2_HOSTILE }, X { "orc zombie", S_ZOMBIE, 2, 6, 9, 0, -3, X (G_GENO | G_SGROUP | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 30, 0, 0, MS_SILENT, M1_HUMANOID | M1_UNDEAD | M1_POIS_RES | X M1_STALK | M1_GREEDY | M1_JEWELS, M2_HOSTILE | M2_ORC }, X { "elf zombie", S_ZOMBIE, 3, 6, 9, 0, -3, X (G_GENO | G_SGROUP | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 1, 7 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 35, 0, 0, MS_SILENT, M1_HUMANOID | M1_UNDEAD | M1_POIS_RES | X M1_STALK | M1_SLEE_RES, M2_HOSTILE | M2_ELF }, X { "human zombie", S_ZOMBIE, 4, 6, 8, 0, -3, X (G_GENO | G_SGROUP | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 40, 0, 0, MS_SILENT, X M1_HUMANOID | M1_UNDEAD | M1_POIS_RES | M1_STALK, M2_HOSTILE }, X { "ettin zombie", S_ZOMBIE, 6, 8, 6, 0, -4, (G_GENO | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 1, 10 }, { AT_CLAW, AD_PHYS, 1, 10 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 70, 0, 0, MS_SILENT, X M1_BIG | M1_HUMANOID | M1_UNDEAD | M1_POIS_RES | M1_STALK, X M2_HOSTILE | M2_STRONG }, X { "giant zombie", S_ZOMBIE, 8, 8, 6, 0, -4, (G_GENO | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 2, 8 }, { AT_CLAW, AD_PHYS, 2, 8 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 70, 0, 0, MS_SILENT, X M1_BIG | M1_HUMANOID | M1_UNDEAD | M1_POIS_RES | M1_STALK | X M1_JEWELS, M2_HOSTILE | M2_GIANT | M2_STRONG }, X/* Golems */ X#ifdef GOLEMS X { "straw golem", S_GOLEM, 3, 12, 10, 0, 0, (G_GENO | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 1, 2 }, { AT_CLAW, AD_PHYS, 1, 2 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 10, 0, 0, MS_SILENT, X M1_BIG | M1_HUMANOID | M1_POIS_RES, M2_HOSTILE }, X { "rope golem", S_GOLEM, 4, 9, 8, 0, 0, (G_GENO | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 1, 6 }, { AT_HUGS, AD_PHYS, 6, 1 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 20, 0, 0, MS_SILENT, X M1_BIG | M1_HUMANOID | M1_POIS_RES, M2_HOSTILE }, X { "leather golem", S_GOLEM, 6, 6, 6, 0, 0, (G_GENO | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 1, 6 }, { AT_CLAW, AD_PHYS, 1, 6 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 40, 0, 0, MS_SILENT, X M1_BIG | M1_HUMANOID | M1_POIS_RES, M2_HOSTILE }, X { "wood golem", S_GOLEM, 7, 3, 4, 0, 0, (G_GENO | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 3, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 50, 0, 0, MS_SILENT, M1_BIG | M1_HUMANOID | M1_POIS_RES, X M2_HOSTILE | M2_THICK_HIDE }, X { "flesh golem", S_GOLEM, 9, 8, 9, 30, 0, (G_GENO | 1), X { { AT_CLAW, AD_PHYS, 2, 8 }, { AT_CLAW, AD_PHYS, 2, 8 }, X NO_ATTK, NO_ATTK, NO_ATTK }, X 60, 600, 0, MS_SILENT, M1_BIG | M1_HUMANOID | M1_POIS_RES | X M1_FIRE_RES | M1_COLD_RES | M1_ELEC_RES, M2_HOSTILE | M2_STRONG }, X { "clay golem", S_GOLEM, 11, 7, 7, 40, 0, (G_GENO | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 3, 10 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 75, 0, 0, MS_SILENT, M1_BIG | M1_HUMANOID | M1_POIS_RES, X M2_HOSTILE | M2_STRONG | M2_THICK_HIDE }, X { "stone golem", S_GOLEM, 14, 6, 5, 50, 0, (G_GENO | G_NOCORPSE | 1), X { { AT_CLAW, AD_PHYS, 3, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 90, 0, 0, MS_SILENT, M1_BIG | M1_HUMANOID | M1_POIS_RES | M1_STON_RES, X M2_HOSTILE | M2_STRONG | M2_THICK_HIDE }, X { "iron golem", S_GOLEM, 18, 6, 3, 60, 0, (G_GENO | G_NOCORPSE | 1), X { { AT_WEAP, AD_PHYS, 4, 10 }, { AT_BREA, AD_DRST, 4, 6 }, X NO_ATTK, NO_ATTK, NO_ATTK }, X 100, 0, 0, MS_SILENT, M1_BIG | M1_HUMANOID | M1_POIS | X M1_FIRE_RES | M1_COLD_RES | M1_ELEC_RES | M1_COLLECT, X M2_HOSTILE | M2_STRONG | M2_THICK_HIDE }, X#endif /* GOLEMS */ X/* Humans */ X { "human", S_HUMAN, 0, 12, 10, 0, 0, G_NOGEN, X { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 35, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT, X M2_HUMAN | M2_PEACEFUL | M2_STRONG }, /* for corpses */ X { "wererat", S_HUMAN, 2, 12, 7, 10, -7, 1, X { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 35, 400, 0, MS_SILENT, M1_NOPOLY | M1_HUMANOID | M1_WERE | M1_POIS | X M1_REGEN | M1_COLLECT, M2_HOSTILE | M2_HUMAN }, X { "werejackal", S_HUMAN, 2, 12, 7, 10, -7, 1, X { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 35, 400, 0, MS_BARK, M1_NOPOLY | M1_HUMANOID | M1_WERE | M1_POIS | X M1_REGEN | M1_COLLECT, M2_HOSTILE | M2_HUMAN }, X { "werewolf", S_HUMAN, 5, 12, 6, 20, -7, 1, X { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 35, 400, 0, MS_BARK, M1_NOPOLY | M1_HUMANOID | M1_WERE | M1_POIS | X M1_REGEN | M1_COLLECT, M2_HOSTILE | M2_HUMAN }, X#ifdef TOLKIEN X { "Woodland-elf", S_HUMAN, 4, 12, 5, 10, 5, (G_GENO | G_SGROUP | 2), X { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 35, 350, 0, MS_HUMANOID, M1_HUMANOID | M1_COLLECT | M1_SLEE_RES, X M2_ELF }, X { "Green-elf", S_HUMAN, 5, 12, 5, 10, 6, (G_GENO | G_SGROUP | 2), X { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 35, 350, 0, MS_HUMANOID, M1_HUMANOID | M1_COLLECT | M1_SLEE_RES, X M2_ELF }, X { "Grey-elf", S_HUMAN, 6, 12, 5, 10, 7, (G_GENO | G_SGROUP | 2), X { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 35, 350, 0, MS_HUMANOID, M1_HUMANOID | M1_COLLECT | M1_SLEE_RES, X M2_ELF }, X#endif X { "elf-lord", S_HUMAN, 8, 12, 5, 20, 9, (G_GENO | G_SGROUP | 2), X { { AT_WEAP, AD_PHYS, 2, 4 }, { AT_WEAP, AD_PHYS, 2, 4 }, X NO_ATTK, NO_ATTK, NO_ATTK }, X 35, 350, 0, MS_HUMANOID, M1_HUMANOID | M1_LORD | M1_COLLECT | X M1_SLEE_RES, M2_ELF | M2_STRONG }, X { "Elvenking", S_HUMAN, 9, 12, 5, 25, 10, (G_GENO | 1), X { { AT_WEAP, AD_PHYS, 2, 4 }, { AT_WEAP, AD_PHYS, 2, 4}, X NO_ATTK, NO_ATTK, NO_ATTK }, X 35, 350, 0, MS_HUMANOID, M1_HUMANOID | M1_PRINCE | M1_COLLECT | X M1_SLEE_RES, M2_ELF | M2_STRONG }, X { "nurse", S_HUMAN, 11, 6, 0, 0, 0, (G_GENO | 3), X { { AT_CLAW, AD_HEAL, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 35, 400, 0, MS_NURSE, M1_NOPOLY | M1_HUMANOID | M1_POIS_RES, X M2_HUMAN | M2_HOSTILE }, X { "shopkeeper", S_HUMAN, 12, 18, 0, 50, 0, G_NOGEN, X { { AT_WEAP, AD_PHYS, 4, 4 }, { AT_WEAP, AD_PHYS, 4, 4 }, NO_ATTK, X NO_ATTK, NO_ATTK }, 40, 400, sizeof(struct eshk), MS_SELL, X M1_NOPOLY | M1_HUMANOID | M1_MAGIC | M1_COLLECT, X M2_HUMAN | M2_PEACEFUL | M2_STRONG }, X { "guard", S_HUMAN, 12, 12, -1, 40, 10, G_NOGEN, X { { AT_WEAP, AD_PHYS, 4, 10 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 45, 400, sizeof(struct egd), MS_GUARD, X M1_NOPOLY | M1_HUMANOID | M1_COLLECT, X M2_HUMAN | M2_MERC | M2_PEACEFUL | M2_STRONG }, X#if defined(ALTARS) && defined(THEOLOGY) X { "temple priest", S_HUMAN, 12, 12, 0, 50, 1, G_NOGEN, X { { AT_WEAP, AD_PHYS, 4, 10 }, { AT_KICK, AD_PHYS, 1, 4 }, X { AT_MAGC, AD_CLRC, 0, 0 }, NO_ATTK, NO_ATTK }, X 45, 400, sizeof(struct epri), MS_PRIEST, X M1_NOPOLY | M1_HUMANOID | M1_ELEC_RES | M1_COLLECT, X M2_HUMAN | M2_PEACEFUL }, X { "temple priestess", S_HUMAN, 12, 12, 0, 50, 1, G_NOGEN, X { { AT_WEAP, AD_PHYS, 4, 10 }, { AT_KICK, AD_PHYS, 1, 4 }, X { AT_MAGC, AD_CLRC, 0, 0 }, NO_ATTK, NO_ATTK }, X 45, 400, sizeof(struct epri), MS_PRIEST, X M1_NOPOLY | M1_HUMANOID | M1_ELEC_RES | M1_COLLECT | M1_FEM, X M2_HUMAN | M2_PEACEFUL }, X#endif X#ifdef ARMY X { "unarmored soldier", S_HUMAN, 6, 4, 10, 0, -2, G_NOGEN, X { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 45, 400, 0, MS_SOLDIER, X M1_NOPOLY | M1_HUMANOID | M1_STALK | M1_COLLECT, X M2_HUMAN | M2_MERC | M2_HOSTILE | M2_STRONG }, X { "soldier", S_HUMAN, 6, 4, 3, 0, -2, (G_SGROUP | G_GENO | 1), X { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 45, 400, 0, MS_SOLDIER, X M1_NOPOLY | M1_HUMANOID | M1_STALK | M1_COLLECT, X M2_HUMAN | M2_MERC | M2_HOSTILE | M2_STRONG }, X { "sergeant", S_HUMAN, 8, 4, 0, 5, -3, (G_SGROUP | G_GENO | 1), X { { AT_WEAP, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 45, 400, 0, MS_SOLDIER, X M1_NOPOLY | M1_HUMANOID | M1_STALK | M1_COLLECT, X M2_HUMAN | M2_MERC | M2_HOSTILE | M2_STRONG }, X { "lieutenant", S_HUMAN, 10, 4, -2, 15, -4, (G_GENO | 1), X { { AT_WEAP, AD_PHYS, 3, 4 }, { AT_WEAP, AD_PHYS, 3, 4 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 45, 400, 0, MS_SOLDIER, X M1_NOPOLY | M1_HUMANOID | M1_STALK | M1_COLLECT, X M2_HUMAN | M2_MERC | M2_HOSTILE | M2_STRONG }, X { "captain", S_HUMAN, 12, 4, -3, 15, -5, (G_GENO | 1), X { { AT_WEAP, AD_PHYS, 4, 4 }, { AT_WEAP, AD_PHYS, 4, 4 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 45, 400, 0, MS_SOLDIER, X M1_NOPOLY | M1_HUMANOID | M1_STALK | M1_COLLECT, X M2_HUMAN | M2_MERC | M2_HOSTILE | M2_STRONG }, X#endif X { "Wizard of Yendor", S_HUMAN, 30, 12, -8, 100, -20, G_NOGEN, X { { AT_CLAW, AD_SAMU, 2, 12 }, { AT_MAGC, AD_SPEL, 0, 0 }, X { AT_BITE, AD_CUSS, 0, 0 }, NO_ATTK, NO_ATTK }, 40, 400, PL_NSIZ, X MS_CUSS, M1_NOPOLY | M1_FLY | M1_HUMANOID | M1_POIS_RES | X M1_FIRE_RES | M1_REGEN | M1_SEE_INVIS | M1_TPORT | X M1_TPORT_CONTROL | M1_MAGIC, X M2_HUMAN | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_NASTY }, X#ifdef MEDUSA X { "Medusa", S_HUMAN, 20, 12, 2, 50, -15, G_NOGEN | G_UNIQ, X { { AT_CLAW, AD_PHYS, 1, 8 }, { AT_GAZE, AD_STON, 0, 0 }, X { AT_BITE, AD_DRST, 1, 6 }, { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK }, X 40, 400, 0, MS_HISS, X M1_NOPOLY | M1_BIG | M1_HUMANOID | M1_POIS | M1_POIS_RES | X M1_STON_RES | M1_FEM, M2_HOSTILE | M2_STRONG | M2_PNAME }, X#endif X#ifdef ORACLE X { "oracle", S_HUMAN, 12, 0, 0, 50, 0, G_NOGEN | G_UNIQ, X { { AT_NONE, AD_MAGM, 0, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 35, 400, 0, MS_ORACLE, M1_NOPOLY | M1_HUMANOID | M1_FEM, X M2_HUMAN | M2_PEACEFUL }, X#endif X#ifdef CHARON X { "Charon", S_HUMAN, 76, 18, -5, 120, 0, X (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), X { { AT_WEAP, AD_PHYS, 1, 8 }, { AT_TUCH, AD_PLYS, 1, 8 }, X NO_ATTK, NO_ATTK, NO_ATTK }, 0, 0, PL_NSIZ, MS_FERRY, X M1_NOPOLY | M1_HUMANOID | M1_POIS_RES | M1_FIRE_RES | M1_COLLECT, X M2_HUMAN | M2_PEACEFUL }, X#endif X/* Ghost */ X { "ghost", S_GHOST, 10, 3, -5, 50, -5, (G_NOCORPSE | G_NOGEN), X { { AT_TUCH, AD_PHYS, 1, 1 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 0, 0, PL_NSIZ, MS_SILENT, M1_NOPOLY | M1_FLY | M1_WALLWALK | X M1_HUMANOID | M1_UNDEAD | M1_STALK | M1_POIS_RES, M2_HOSTILE }, X/* (major) Demons */ X { "water demon", S_DEMON, 8, 12,-4, 30, -7, (G_NOCORPSE | G_NOGEN), X { { AT_WEAP, AD_PHYS, 1, 3 }, { AT_CLAW, AD_PHYS, 1, 3 }, X { AT_BITE, AD_PHYS, 1, 3 }, NO_ATTK, NO_ATTK }, X 60, 0, 0, MS_SILENT, M1_SWIM | M1_POIS | M1_FIRE_RES | X M1_STALK | M1_COLLECT, M2_DEMON | M2_HOSTILE | M2_NASTY }, X#ifndef HARD /* generic type */ X { "demon", S_DEMON, 10, 12,-4, 30, -7, (G_NOCORPSE | 1), X { { AT_WEAP, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 }, X { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK }, X 60, 0, 0, MS_JEER, M1_POIS | M1_FIRE_RES | M1_STALK | M1_COLLECT, X M2_DEMON | M2_HOSTILE | M2_NASTY }, X#else /* used in hell for bigger, badder demons! */ X /* standard demons & devils */ X { "horned devil", S_DEMON, 6, 9, -5, 50, 11, (G_HELL | G_NOCORPSE | 2), X { { AT_WEAP, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 }, X { AT_BITE, AD_PHYS, 2, 3 }, { AT_STNG, AD_PHYS, 1, 3 }, NO_ATTK }, X 0, 0, 0, MS_SILENT, M1_POIS | M1_FIRE_RES | M1_STALK, X M2_DEMON | M2_HOSTILE | M2_NASTY | M2_THICK_HIDE }, 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 }, 0, 0, 0, MS_SEDUCE, X M1_HUMANOID | M1_FLY | M1_POIS | M1_FIRE_RES | M1_STALK | M1_FEM, X M2_DEMON | M2_HOSTILE | M2_NASTY }, 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 }, 0, 0, 0, MS_SEDUCE, X M1_HUMANOID | M1_FLY | M1_POIS | M1_FIRE_RES | M1_STALK, X M2_DEMON | M2_HOSTILE | M2_NASTY }, 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 }, 0, 0, 0, MS_SEDUCE, X M1_HUMANOID | M1_FLY | M1_POIS | M1_FIRE_RES | M1_STALK | M1_FEM, X M2_DEMON | M2_HOSTILE | M2_NASTY }, 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 }, 0, 0, 0, MS_SEDUCE, X M1_HUMANOID | M1_FLY | M1_POIS | M1_FIRE_RES | M1_STALK, X M2_DEMON | M2_HOSTILE | M2_NASTY }, 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, NO_ATTK, NO_ATTK }, X 0, 0, 0, MS_SILENT, M1_HUMANOID | M1_POIS | M1_FIRE_RES | M1_STALK | X M1_COLLECT | M1_FEM, M2_DEMON | M2_HOSTILE | M2_STRONG | M2_NASTY }, 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 }, }, 0, 0, 0, MS_SILENT, M1_HUMANOID | X M1_POIS | M1_FIRE_RES | M1_STALK | M1_COLLECT | M1_FEM, X M2_DEMON | M2_HOSTILE | M2_NASTY }, 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 }, X 0, 0, 0, MS_SILENT, M1_POIS | M1_FIRE_RES | M1_STALK, X M2_DEMON | M2_HOSTILE | M2_NASTY | M2_THICK_HIDE }, 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 }, }, X 0, 0, 0, MS_SILENT, M1_POIS | M1_FIRE_RES | M1_STALK, X M2_DEMON | M2_HOSTILE | M2_NASTY }, 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 }, 0, 0, 0, MS_SILENT, X M1_HUMANOID | M1_POIS | M1_FIRE_RES | M1_STALK, X M2_DEMON | M2_HOSTILE | M2_NASTY }, 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 }, 0, 0, 0, MS_SILENT, X M1_POIS | M1_FIRE_RES | M1_STALK | M1_COLLECT, X M2_DEMON | M2_HOSTILE | M2_NASTY }, 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 }, NO_ATTK }, X 0, 0, 0, MS_SILENT, M1_HUMANOID | M1_POIS | M1_FIRE_RES | M1_STALK, X M2_DEMON | M2_HOSTILE | M2_NASTY }, 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 }, NO_ATTK }, X 0, 0, 0, MS_SILENT, M1_POIS | M1_FIRE_RES | M1_COLD_RES | M1_STALK, X M2_DEMON | M2_HOSTILE | M2_NASTY }, 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 }, 0, 0, 0, MS_GROWL, X M1_POIS | M1_FIRE_RES | M1_STALK | M1_COLLECT, X M2_DEMON | M2_HOSTILE | M2_NASTY }, 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 }, X 0, 0, 0, MS_SILENT, M1_FLY | M1_BIG | M1_COLLECT | M1_STALK | X M1_POIS | M1_FIRE_RES, M2_DEMON | M2_HOSTILE | M2_STRONG | M2_NASTY }, 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 }, 0, 0, PL_NSIZ, MS_GURGLE, M1_NOPOLY | X M1_FLY | M1_NOHANDS | M1_POIS | M1_FIRE_RES | M1_STALK | M1_LORD, X M2_DEMON | M2_HOSTILE | M2_PNAME | M2_NASTY | M2_AMORPHOUS }, 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 }, NO_ATTK }, X 0, 0, PL_NSIZ, MS_ORC, M1_NOPOLY | M1_FLY | M1_POIS | X M1_FIRE_RES | M1_STALK | M1_COLLECT | M1_LORD, X M2_DEMON | M2_HOSTILE | M2_PNAME | M2_NASTY }, 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 }, }, 0, 0, PL_NSIZ, MS_ORC, X M1_NOPOLY | M1_FLY | M1_POIS | M1_FIRE_RES | M1_STALK | X M1_COLLECT | M1_PRINCE, M2_DEMON | M2_HOSTILE | M2_PNAME | M2_NASTY }, 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 }, 0, 0, PL_NSIZ, X MS_JEER, M1_NOPOLY | M1_FLY | M1_POIS | M1_FIRE_RES | X M1_STALK | M1_PRINCE, M2_DEMON | M2_HOSTILE | M2_PNAME | M2_NASTY }, 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 }, 0, 0, PL_NSIZ, MS_JEER, X M1_NOPOLY | M1_FLY | M1_HUMANOID | M1_POIS | X M1_FIRE_RES | M1_STALK | M1_COLLECT | M1_PRINCE, X M2_DEMON | M2_HOSTILE | M2_PNAME | M2_NASTY }, X { "Baalzebul", 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 }, 0, 0, PL_NSIZ, MS_JEER, X M1_NOPOLY | M1_FLY | M1_POIS | M1_FIRE_RES | M1_STALK | X M1_PRINCE, M2_DEMON | M2_HOSTILE | M2_PNAME | M2_NASTY }, 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 }, 0, 0, PL_NSIZ, MS_JEER, X M1_NOPOLY | M1_FLY | M1_HUMANOID | M1_POIS | X M1_FIRE_RES | M1_COLD_RES | M1_STALK | M1_PRINCE, X M2_DEMON | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY }, 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 }, 0, 0, PL_NSIZ, MS_GROWL, M1_NOPOLY | M1_FLY | X M1_NOHANDS | M1_POIS | M1_FIRE_RES | M1_STALK | X M1_PRINCE, M2_DEMON | M2_HOSTILE | M2_PNAME | M2_NASTY }, X#endif 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 }, 0, 0, 0, MS_SILENT, X M1_NOPOLY | M1_FLY | M1_SWIM | M1_HUMANOID | M1_POIS | M1_FIRE_RES | X M1_COLD_RES | M1_SLEE_RES | M1_STALK, M2_PEACEFUL }, 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, NO_ATTK, NO_ATTK }, X 0, 0, 0, MS_DJINNI, X M1_NOPOLY | M1_FLY | M1_POIS | M1_STALK | M1_COLLECT, 0 }, X/* eels */ 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 }, 10, 250, 0, MS_SILENT, X M1_BIG | M1_VSMALL | M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_NOPOLY | X M1_EGGS, M2_HOSTILE | M2_NOLIMBS | M2_CARNIVORE }, 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 }, 10, 250, 0, MS_SILENT, X M1_BIG | M1_VSMALL | M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_NOPOLY | X M1_EGGS | M1_ELEC_RES, M2_HOSTILE | M2_NOLIMBS | M2_CARNIVORE }, X/* kraken */ 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 }, NO_ATTK }, X 1, 10, 0, MS_SILENT, X M1_BIG | M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_NOPOLY, X M2_HOSTILE | M2_STRONG | M2_CARNIVORE }, X/* chameleon */ X { "chameleon", S_CHAMELEON, 6, 5, 6, 10, 0, (G_GENO | 2), X { { AT_BITE, AD_PHYS, 4, 2 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 1, 10, 0, MS_SILENT, M1_VSMALL | M1_ANIMAL, X M2_HOSTILE | M2_CARNIVORE }, 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, NO_ATTK, NO_ATTK }, X 45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT, X M2_HUMAN | M2_STRONG | M2_TUNNEL | M2_NEEDPICK }, X { "barbarian", S_HUMAN, 1, 10, 10, 1, -3, G_NOGEN, X { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT | X M1_POIS_RES, M2_HUMAN | M2_STRONG }, X { "caveman", S_HUMAN, 1, 10, 10, 0, 1, G_NOGEN, X { {AT_WEAP, AD_PHYS, 2, 4}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT, X M2_HUMAN | M2_STRONG | M2_CARNIVORE }, X { "cavewoman", S_HUMAN, 1, 10, 10, 0, 1, G_NOGEN, X { {AT_WEAP, AD_PHYS, 2, 4}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT | M1_FEM, X M2_HUMAN | M2_STRONG | M2_CARNIVORE }, X { "elf", S_HUMAN, 1, 12, 10, 2, 3, G_NOGEN, X { {AT_WEAP, AD_PHYS, 1, 8}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT | X M1_SLEE_RES | M1_SEE_INVIS, M2_ELF | M2_STRONG }, X { "healer", S_HUMAN, 1, 10, 10, 1, 3, G_NOGEN, X { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT | X M1_POIS_RES, M2_HUMAN | M2_STRONG }, X { "knight", S_HUMAN, 1, 10, 10, 1, 3, G_NOGEN, X { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT, X M2_HUMAN | M2_STRONG }, X { "priest", S_HUMAN, 1, 10, 10, 2, 0, G_NOGEN, X { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT, X M2_HUMAN | M2_STRONG }, X { "priestess", S_HUMAN, 1, 10, 10, 2, 0, G_NOGEN, X { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT | M1_FEM, X M2_HUMAN | M2_STRONG }, X { "rogue", S_HUMAN, 1, 10, 10, 1, -3, G_NOGEN, X { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT | X M1_GREEDY, M2_HUMAN | M2_STRONG }, X { "samurai", S_HUMAN, 1, 10, 10, 1, 3, G_NOGEN, X { {AT_WEAP, AD_PHYS, 1, 8}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT, X M2_HUMAN | M2_STRONG }, X { "tourist", S_HUMAN, 1, 10, 10, 1, 0, G_NOGEN, X { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT, X M2_HUMAN | M2_STRONG }, X { "valkyrie", S_HUMAN, 1, 10, 10, 1, -1, G_NOGEN, X { {AT_WEAP, AD_PHYS, 1, 8}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT | X M1_COLD_RES | M1_FEM, M2_HUMAN | M2_STRONG }, X { "wizard", S_HUMAN, 1, 10, 10, 3, 0, G_NOGEN, X { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 45, 400, 0, MS_HUMANOID, X M1_NOPOLY | M1_HUMANOID | M1_MAGIC | M1_COLLECT, X M2_HUMAN | M2_STRONG }, X X/* ARRAY TERMINATOR */ X { "", 0, 0, 0, 0, 0, 0, 0, X { NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X 0, 0, 0, 0, 0, 0 } X}; END_OF_FILE if test 35010 -ne `wc -c <'src/monst.c2'`; then echo shar: \"'src/monst.c2'\" unpacked with wrong size! fi # end of 'src/monst.c2' fi if test -f 'src/save.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/save.c'\" else echo shar: Extracting \"'src/save.c'\" \(17421 characters\) sed "s/^X//" >'src/save.c' <<'END_OF_FILE' X/* SCCS Id: @(#)save.c 3.0 89/04/13 X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ X/* NetHack may be freely redistributed. See license for details. */ X X/* block some unused #defines to avoid overloading some cpp's */ X#define MONATTK_H X#include "hack.h" X#include "lev.h" X X#ifdef WORM X#include "wseg.h" X#endif X X#ifndef TOS X#include <signal.h> X#endif /* !TOS */ X#ifdef EXPLORE_MODE X#include <fcntl.h> X#endif /* EXPLORE_MODE */ X Xboolean hu; /* set during hang-up */ X X#if defined(DGK) && !defined(TOS) Xstruct finfo fileinfo[MAXLEVEL+1]; Xlong bytes_counted; Xint count_only; X#else Xboolean level_exists[MAXLEVEL+1]; X#endif X X#if defined(DGK) && !defined(TOS) Xstatic void savelev0(); X#endif /* DGK && !TOS */ Xstatic void saveobjchn(); Xstatic void savemonchn(); Xstatic void savegoldchn(); Xstatic void savetrapchn(); Xstatic void savegenoinfo(); X#if defined(DGK) && !defined(TOS) Xstatic boolean swapout_oldest(); Xstatic void copyfile(); X#endif /* defined(DGK) && !defined(TOS) */ Xstatic void spill_objs(); X Xint Xdosave(){ X pline("Really save? "); /* especially useful if COMPRESS defined */ X if(yn() == 'n') { X clrlin(); X (void) fflush(stdout); X if(multi > 0) nomul(0); X } else { X#ifdef EXPLORE_MODE X if(!discover) { X pline("Do you want to create a non-scoring, restartable save file? "); X if(yn() == 'y') discover = TRUE; X } X#endif X clear_screen(); X (void) fflush(stdout); X hu = FALSE; X if(dosave0()) { X settty("Be seeing you...\n"); X exit(0); X } else (void)doredraw(); X } X return 0; X} X X#ifndef NOSAVEONHANGUP Xint Xhangup(){ X hu = TRUE; X (void) dosave0(); X exit(1); X return 0; X} X#endif X X/* returns 1 if save successful */ Xint Xdosave0() { X register int fd, ofd; X int tmp; /* not register ! */ X xchar ltmp; X#if defined(DGK) && !defined(TOS) X long fds, needed; X int mode; X#endif X#ifdef COMPRESS X char cmd[80]; X#endif X#ifdef UNIX X (void) signal(SIGHUP, SIG_IGN); X#endif X#if !defined(__TURBOC__) && !defined(TOS) X (void) signal(SIGINT, SIG_IGN); X#endif X X#ifdef MSDOS X# ifdef DGK X if(!hu && !saveDiskPrompt(0)) return 0; X# endif X# ifdef EXPLORE_MODE X if(!hu) { X X fd = open(SAVEF, O_RDONLY); X if (fd > 0) { X (void) close(fd); X clrlin(); X pline("There seems to be an old save file. Overwrite it? "); X if (yn() == 'n') return 0; X } X } X# endif X# ifdef TOS X fd = creat(SAVEF, FCMASK); X# else X fd = open(SAVEF, O_WRONLY | O_BINARY | O_CREAT | O_TRUNC, FCMASK); X# endif X#else /* MSDOS */ X# ifdef EXPLORE_MODE X if(!hu) { X fd = open(SAVEF, O_RDONLY); X if (fd > 0) { X (void) close(fd); X clrlin(); X pline("There seems to be an old save file. Overwrite it? "); X if (yn() == 'n') return 0; X } X } X# endif X fd = creat(SAVEF, FCMASK); X#endif /* MSDOS */ X if(fd < 0) { X if(!hu) pline("Cannot open save file."); X (void) unlink(SAVEF); /* ab@unido */ X return(0); X } X if(flags.moonphase == FULL_MOON) /* ut-sally!fletcher */ X change_luck(-1); /* and unido!ab */ X home(); X cl_end(); X#if defined(DGK) && !defined(TOS) X if(!hu) msmsg("Saving: "); X mode = COUNT; Xagain: X savelev(fd, dlevel, mode); X /* count_only will be set properly by savelev */ X#else X savelev(fd,dlevel); X#endif X saveobjchn(fd, invent); X savemonchn(fd, fallen_down); X savegenoinfo(fd); X tmp = getuid(); X bwrite(fd, (genericptr_t) &tmp, sizeof tmp); X bwrite(fd, (genericptr_t) &flags, sizeof(struct flag)); X bwrite(fd, (genericptr_t) &dlevel, sizeof dlevel); X bwrite(fd, (genericptr_t) &maxdlevel, sizeof maxdlevel); X bwrite(fd, (genericptr_t) &moves, sizeof moves); X bwrite(fd, (genericptr_t) &wiz_level, sizeof wiz_level); X bwrite(fd, (genericptr_t) &medusa_level, sizeof medusa_level); X#ifdef ORACLE X bwrite(fd, (genericptr_t) &oracle_level, sizeof oracle_level); X#endif X#ifdef REINCARNATION X bwrite(fd, (genericptr_t) &rogue_level, sizeof rogue_level); X#endif X#ifdef STRONGHOLD X bwrite(fd, (genericptr_t) &stronghold_level, sizeof stronghold_level); X bwrite(fd, (genericptr_t) &tower_level, sizeof tower_level); X bwrite(fd, (genericptr_t) tune, sizeof tune); X# ifdef MUSIC X bwrite(fd, (genericptr_t) &music_heard, sizeof music_heard); X# endif X#endif X bwrite(fd, (genericptr_t) &is_maze_lev, sizeof is_maze_lev); X bwrite(fd, (genericptr_t) &u, sizeof(struct you)); X#ifdef SPELLS X bwrite(fd, (genericptr_t) spl_book, sizeof(struct spell) * (MAXSPELL + 1)); X#endif X if(u.ustuck) X bwrite(fd, (genericptr_t) &(u.ustuck->m_id), sizeof u.ustuck->m_id); X bwrite(fd, (genericptr_t) pl_character, sizeof pl_character); X bwrite(fd, (genericptr_t) pl_fruit, sizeof pl_fruit); X bwrite(fd, (genericptr_t) ¤t_fruit, sizeof current_fruit); X savefruitchn(fd); X savenames(fd); X#if defined(DGK) && !defined(TOS) X if (mode == COUNT) { X# ifdef ZEROCOMP X bflush(fd); X# endif X /* make sure there is enough disk space */ X needed = bytes_counted; X for (ltmp = 1; ltmp <= maxdlevel; ltmp++) X if (ltmp != dlevel && fileinfo[ltmp].where) X needed += fileinfo[ltmp].size + (sizeof ltmp); X fds = freediskspace(SAVEF); X if(needed > fds) { X if(!hu) { X pline("There is insufficient space on SAVE disk."); X pline("Require %ld bytes but only have %ld.", needed, X fds); X } X flushout(); X (void) close(fd); X (void) unlink(SAVEF); X return 0; X } X mode = WRITE; X goto again; X } X#endif X for(ltmp = (xchar)1; ltmp <= maxdlevel; ltmp++) { X#if defined(DGK) && !defined(TOS) X if (ltmp == dlevel || !fileinfo[ltmp].where) continue; X if (fileinfo[ltmp].where != ACTIVE) X swapin_file(ltmp); X#else X if(ltmp == dlevel || !level_exists[ltmp]) continue; X#endif X glo(ltmp); X#ifdef DGK X if(!hu) msmsg("."); X#endif X if((ofd = open(lock, OMASK)) < 0) { X if(!hu) pline("Error while saving: cannot read %s.", lock); X (void) close(fd); X (void) unlink(SAVEF); X if(!hu) done("tricked"); X return(0); X } X#ifdef ZEROCOMP X minit(); X#endif X getlev(ofd, hackpid, ltmp, FALSE); X (void) close(ofd); X bwrite(fd, (genericptr_t) <mp, sizeof ltmp); /* level number */ X#if defined(DGK) && !defined(TOS) X savelev(fd, ltmp, WRITE); /* actual level */ X#else X savelev(fd, ltmp); /* actual level */ X#endif X (void) unlink(lock); X } X#ifdef ZEROCOMP X bflush(fd); X#endif X (void) close(fd); X glo(dlevel); X (void) unlink(lock); /* get rid of current level --jgm */ X glo(0); X (void) unlink(lock); X#ifdef COMPRESS X Strcpy(cmd, COMPRESS); X Strcat(cmd, " "); X# ifdef COMPRESS_OPTIONS X Strcat(cmd, COMPRESS_OPTIONS); X Strcat(cmd, " "); X# endif X Strcat(cmd, SAVEF); X (void) system(cmd); X#endif X return(1); X} X X#if defined(DGK) && !defined(TOS) Xboolean Xsavelev(fd, lev, mode) Xint fd; Xxchar lev; Xint mode; X{ X if (mode & COUNT) { X# ifdef ZEROCOMP /* should be superfluous */ X if (!count_only) /* did we just write? */ X bflush(0); X /*dbg();*/ X# endif X count_only = TRUE; X bytes_counted = 0; X savelev0(fd, lev); X while (bytes_counted > freediskspace(levels)) X if (!swapout_oldest()) X return FALSE; X } X if (mode & WRITE) { X# ifdef ZEROCOMP X if (mode & COUNT) /* did we just count? */ X bflush(fd); X# endif X count_only = FALSE; X bytes_counted = 0; X savelev0(fd, lev); X } X fileinfo[lev].where = ACTIVE; X fileinfo[lev].time = moves; X fileinfo[lev].size = bytes_counted; X return TRUE; X} X Xstatic Xvoid Xsavelev0(fd,lev) X#else Xvoid Xsavelev(fd,lev) X#endif Xint fd; Xxchar lev; X{ X#ifdef WORM X register struct wseg *wtmp; X register int tmp; X#endif X#ifdef TOS X short tlev; X#endif X X if(fd < 0) panic("Save on bad file!"); /* impossible */ X#if !defined(DGK) || defined(TOS) X if(lev >= 0 && lev <= MAXLEVEL) X level_exists[lev] = TRUE; X#endif X bwrite(fd,(genericptr_t) &hackpid,sizeof(hackpid)); X#ifdef TOS X tlev=lev; X bwrite(fd,(genericptr_t) &tlev,sizeof(tlev)); X#else X bwrite(fd,(genericptr_t) &lev,sizeof(lev)); X#endif X bwrite(fd,(genericptr_t) levl,sizeof(levl)); X#ifdef REINCARNATION X if(dlevel == rogue_level && lev != rogue_level) X /* save the symbols actually used to represent the level, not X * those in use for the current level (the default symbols used X * for rogue), since we will need to know whether to update X * the display of the screen when the game is restored under X * a potentially different value of showsyms from the X * environment */ X /* if a game is saved off the rogue level, the usual showsyms X * will be written out for the rogue level too, but they will X * be ignored on restore so it doesn't matter */ X bwrite(fd, (genericptr_t) &savesyms, sizeof(struct symbols)); X else X#endif X bwrite(fd, (genericptr_t) &showsyms, sizeof(struct symbols)); X bwrite(fd,(genericptr_t) &moves,sizeof(long)); X bwrite(fd,(genericptr_t) &xupstair,sizeof(xupstair)); X bwrite(fd,(genericptr_t) &yupstair,sizeof(yupstair)); X bwrite(fd,(genericptr_t) &xdnstair,sizeof(xdnstair)); X bwrite(fd,(genericptr_t) &ydnstair,sizeof(ydnstair)); X#ifdef STRONGHOLD X bwrite(fd,(genericptr_t) &xupladder,sizeof(xupladder)); X bwrite(fd,(genericptr_t) &yupladder,sizeof(yupladder)); X bwrite(fd,(genericptr_t) &xdnladder,sizeof(xdnladder)); X bwrite(fd,(genericptr_t) &ydnladder,sizeof(ydnladder)); X#endif X bwrite(fd,(genericptr_t) &fountsound,sizeof(fountsound)); X bwrite(fd,(genericptr_t) &sinksound,sizeof(sinksound)); X savemonchn(fd, fmon); X savegoldchn(fd, fgold); X savetrapchn(fd, ftrap); X X saveobjchn(fd, fobj); X saveobjchn(fd, billobjs); X X save_engravings(fd); X bwrite(fd,(genericptr_t) rooms,sizeof(rooms)); X bwrite(fd,(genericptr_t) doors,sizeof(doors)); X#ifdef WORM X bwrite(fd,(genericptr_t) wsegs,sizeof(wsegs)); X for(tmp=1; tmp<32; tmp++){ X for(wtmp = wsegs[tmp]; wtmp; wtmp = wtmp->nseg){ X bwrite(fd,(genericptr_t) wtmp,sizeof(struct wseg)); X } X#if defined(DGK) && !defined(TOS) X if (!count_only) X#endif X wsegs[tmp] = 0; X } X bwrite(fd,(genericptr_t) wgrowtime,sizeof(wgrowtime)); X#endif /* WORM /**/ X#if defined(DGK) && !defined(TOS) X if (count_only) return; X#endif X billobjs = 0; X fgold = 0; X ftrap = 0; X fmon = 0; X fobj = 0; X} X X#ifdef ZEROCOMP X X#define RLESC '\0' /* Leading character for run of LRESC's */ X#define flushoutrun(ln) bputc(RLESC); bputc(ln); ln = -1; X Xstatic unsigned char outbuf[BUFSZ]; Xstatic unsigned short outbufp = 0; Xstatic short outrunlength = -1; Xstatic int bwritefd; X X/*dbg() X{ X if(!hu) printf("outbufp %d outrunlength %d\n", outbufp,outrunlength); X}*/ X Xstatic void bputc(c) Xunsigned char c; X{ X# ifdef DGK X bytes_counted++; X if (count_only) X return; X# endif X if (outbufp >= BUFSZ) { X (void) write(bwritefd, outbuf, (int) BUFSZ); X outbufp = 0; X } X outbuf[outbufp++] = c; X} X Xvoid Xbflush(fd) /* flush run and buffer */ Xregister int fd; X{ X bwritefd = fd; X if (outrunlength >= 0) { /* flush run */ X flushoutrun(outrunlength); X } X if (outbufp) { X#ifdef DGK X if (!count_only) /* flush buffer */ X#endif X (void) write(fd, outbuf, outbufp); X outbufp = 0; X } X /*printf("bflush()"); getret();*/ X} X Xvoid Xbwrite(fd, loc, num) Xregister int fd; Xregister genericptr_t loc; Xregister unsigned num; X{ X bwritefd = fd; X for (; num; num--, ((char *)loc)++) { X if (*((char *)loc) == RLESC) { /* One more char in run */ X if (++outrunlength == 0xFF) { X flushoutrun(outrunlength); X } X } else { /* end of run */ X if (outrunlength >= 0) { /* flush run */ X flushoutrun(outrunlength); X } X bputc(*((char *)loc)); X } X } X} X X#else /* ZEROCOMP */ X Xvoid Xbwrite(fd,loc,num) Xregister int fd; Xregister genericptr_t loc; Xregister unsigned num; X{ X#if defined(DGK) && !defined(TOS) X bytes_counted += num; X if (!count_only) X#endif X/* lint wants the 3rd arg of write to be an int; lint -p an unsigned */ X#if defined(BSD) || defined(ULTRIX) X if(write(fd, loc, (int)num) != (int)num) { X#else /* e.g. SYSV, __TURBOC__ */ X if(write(fd, loc, num) != num) { X#endif X if(!hu) panic("cannot write %u bytes to file #%d", num, fd); X else exit(1); X } X} X#endif /* ZEROCOMP */ X Xstatic void Xsaveobjchn(fd,otmp) Xregister int fd; Xregister struct obj *otmp; X{ X register struct obj *otmp2; X unsigned int xl; X int minusone = -1; X X while(otmp) { X if(Is_container(otmp)) /* unlink contained objects */ X spill_objs(otmp); /* (this rearranges the list) */ X X otmp2 = otmp->nobj; X xl = otmp->onamelth; X bwrite(fd, (genericptr_t) &xl, sizeof(int)); X bwrite(fd, (genericptr_t) otmp, xl + sizeof(struct obj)); X#if defined(DGK) && !defined(TOS) X if (!count_only) X#endif X free((genericptr_t) otmp); X otmp = otmp2; X } X bwrite(fd, (genericptr_t) &minusone, sizeof(int)); X} X Xstatic void Xsavemonchn(fd,mtmp) Xregister int fd; Xregister struct monst *mtmp; X{ X register struct monst *mtmp2; X unsigned int xl; X int minusone = -1; X struct permonst *monbegin = &mons[0]; X X bwrite(fd, (genericptr_t) &monbegin, sizeof(monbegin)); X X while(mtmp) { X mtmp2 = mtmp->nmon; X xl = mtmp->mxlth + mtmp->mnamelth; X bwrite(fd, (genericptr_t) &xl, sizeof(int)); X bwrite(fd, (genericptr_t) mtmp, xl + sizeof(struct monst)); X if(mtmp->minvent) saveobjchn(fd,mtmp->minvent); X#if defined(DGK) && !defined(TOS) X if (!count_only) X#endif X free((genericptr_t) mtmp); X mtmp = mtmp2; X } X bwrite(fd, (genericptr_t) &minusone, sizeof(int)); X} X Xstatic void Xsavegoldchn(fd,gold) Xregister int fd; Xregister struct gold *gold; X{ X register struct gold *gold2; X while(gold) { X gold2 = gold->ngold; X bwrite(fd, (genericptr_t) gold, sizeof(struct gold)); X#if defined(DGK) && !defined(TOS) X if (!count_only) X#endif X free((genericptr_t) gold); X gold = gold2; X } X bwrite(fd, (genericptr_t)nul, sizeof(struct gold)); X} X Xstatic void Xsavetrapchn(fd,trap) Xregister int fd; Xregister struct trap *trap; X{ X register struct trap *trap2; X while(trap) { X trap2 = trap->ntrap; X bwrite(fd, (genericptr_t) trap, sizeof(struct trap)); X#if defined(DGK) && !defined(TOS) X if (!count_only) X#endif X free((genericptr_t) trap); X trap = trap2; X } X bwrite(fd, (genericptr_t)nul, sizeof(struct trap)); X} X X/* save all the fruit names and ID's; this is used only in saving whole games X * (not levels) and in saving bones levels. When saving a bones level, X * we only want to save the fruits which exist on the bones level; the bones X * level routine marks nonexistent fruits by making the fid negative. X */ Xvoid Xsavefruitchn(fd) Xregister int fd; X{ X register struct fruit *f2; X while(ffruit) { X f2 = ffruit->nextf; X if (ffruit->fid >= 0) X bwrite(fd, (genericptr_t) ffruit, sizeof(struct fruit)); X free((genericptr_t) ffruit); X ffruit = f2; X } X bwrite(fd, (genericptr_t)nul, sizeof(struct fruit)); X} X Xstatic void Xsavegenoinfo(fd) Xregister int fd; X{ X register int i; X X for (i = 0; i < NUMMONS; i++) X bwrite(fd, (genericptr_t) &(mons[i].geno), sizeof(unsigned)); X} X X#if defined(DGK) && !defined(TOS) Xboolean Xswapin_file(lev) Xint lev; X{ X char to[PATHLEN], from[PATHLEN]; X X Sprintf(from, "%s%s", permbones, alllevels); X Sprintf(to, "%s%s", levels, alllevels); X name_file(from, lev); X name_file(to, lev); X while (fileinfo[lev].size > freediskspace(to)) X if (!swapout_oldest()) X return FALSE; X#ifdef WIZARD X if (wizard) { X pline("Swapping in `%s'", from); X (void) fflush(stdout); X } X#endif X copyfile(from, to); X (void) unlink(from); X fileinfo[lev].where = ACTIVE; X return TRUE; X} X Xstatic boolean Xswapout_oldest() { X char to[PATHLEN], from[PATHLEN]; X int i, oldest; X long oldtime; X X if (!ramdisk) X return FALSE; X for (i = 1, oldtime = 0, oldest = 0; i <= maxdlevel; i++) X if (fileinfo[i].where == ACTIVE X && (!oldtime || fileinfo[i].time < oldtime)) { X oldest = i; X oldtime = fileinfo[i].time; X } X if (!oldest) X return FALSE; X Sprintf(from, "%s%s", levels, alllevels); X Sprintf(to, "%s%s", permbones, alllevels); X name_file(from, oldest); X name_file(to, oldest); X#ifdef WIZARD X if (wizard) { X pline("Swapping out `%s'.", from); X (void) fflush(stdout); X } X#endif X copyfile(from, to); X (void) unlink(from); X fileinfo[oldest].where = SWAPPED; X return TRUE; X} X Xstatic Xvoid Xcopyfile(from, to) Xchar *from, *to; X{ X char buf[BUFSIZ]; X int nfrom, nto, fdfrom, fdto; X X if ((fdfrom = open(from, O_RDONLY | O_BINARY, FCMASK)) < 0) X panic("Can't copy from %s !?", from); X if ((fdto = open(to, O_WRONLY | O_BINARY | O_CREAT | O_TRUNC, FCMASK)) < 0) X panic("Can't copy to %s", to); X do { X nfrom = read(fdfrom, buf, BUFSIZ); X nto = write(fdto, buf, nfrom); X if (nto != nfrom) X panic("Copyfile failed!"); X } while (nfrom == BUFSIZ); X (void) close(fdfrom); X (void) close(fdto); X} X#endif X X/* X * "spill" objects out of containers (unlinking from the fcobj list). X * X * The objects will be rearranged, and properly aged. When we restore, they X * can be put back into their containers. By the time all of the calls to X * saveobjchn() been made, the fcobj list should be empty. Thus it need not X * be saved, and doing so could cause some strange addressing problems. X * X * NOTE: The cobj field is set to -1. It will be used as a flag to indicate X * that this object was previously in a container. X */ X Xstatic void Xspill_objs(cobj) Xregister struct obj *cobj; X{ X register struct obj *otmp, *otmp2, *probj; X X#ifdef LINT X probj = (struct obj *)0; /* suppress "used before set" error */ X#endif X for(otmp = fcobj; otmp; otmp = otmp2) { X X otmp2 = otmp->nobj; X if(otmp->cobj == cobj) { X X if(cobj->cursed && rn2(2)) otmp->cursed = 1; X /* X * Place all of the objects in a given container after that container X * in the list. On restore, they should be able to be picked up and X * put back in. X */ X if(otmp == fcobj) fcobj = otmp2; X else probj->nobj = otmp2; X X otmp->nobj = cobj->nobj; X cobj->nobj = otmp; X otmp->cobj = (struct obj *)-1; X } else probj = otmp; X } X X} END_OF_FILE if test 17421 -ne `wc -c <'src/save.c'`; then echo shar: \"'src/save.c'\" unpacked with wrong size! fi # end of 'src/save.c' fi echo shar: End of archive 8 \(of 38\). cp /dev/null ark8isdone 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 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 38 archives. rm -f 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