home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume14 / umoria4 / part31 < prev    next >
Internet Message Format  |  1992-08-31  |  58KB

  1. Path: uunet!zephyr.ens.tek.com!master!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v14i063:  umoria4 - single player dungeon simulation (ver. 5.5), Part31/39
  5. Message-ID: <3427@master.CNA.TEK.COM>
  6. Date: 22 Aug 92 22:14:31 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 1654
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: grabiner@math.harvard.edu (David Grabiner)
  12. Posting-number: Volume 14, Issue 63
  13. Archive-name: umoria4/Part31
  14. Supersedes: umoria3: Volume 9, Issue 55-97; Volume 10, Issue 15-17
  15. Environment: Curses, Unix, Mac, MS-DOS, Atari-ST, Amiga, VMS
  16.  
  17.  
  18.  
  19. #! /bin/sh
  20. # This is a shell archive.  Remove anything before this line, then unpack
  21. # it by saving it into a file and typing "sh file".  To overwrite existing
  22. # files, type "sh file -c".  You can also feed this as standard input via
  23. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  24. # will see the following message at the end:
  25. #        "End of archive 31 (of 39)."
  26. # Contents:  doc/spells.doc ibmpc/CONFIG.DOC ibmpc/ms_misc.c
  27. #   misc/shading util/weapons/README
  28. # Wrapped by billr@saab on Thu Aug 20 09:11:34 1992
  29. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  30. if test -f 'doc/spells.doc' -a "${1}" != "-c" ; then 
  31.   echo shar: Will not clobber existing file \"'doc/spells.doc'\"
  32. else
  33. echo shar: Extracting \"'doc/spells.doc'\" \(11474 characters\)
  34. sed "s/^X//" >'doc/spells.doc' <<'END_OF_FILE'
  35. XAddendum to the manual for Moria.
  36. X
  37. XProposed contribution written by Mike Marcelais
  38. X                                 North Carolina School of
  39. X                                       Science And Math
  40. X                                 mrm@odin.ncssm.edu
  41. X                                 games@odin.ncssm.edu
  42. X
  43. X1.  Magic Spells
  44. X
  45. XAll player characters except Warriors are able to learn some form of
  46. Xmagic spells.  There are two kinds of magic, Magic spells, which Mages,
  47. XRogues, and Rangers get, and prayers, which Priests and Paladins have.
  48. XEach spell has a minimum level required for learning it, a mana score,
  49. Xwhich is the mana points required to cast it, and a failure percentage.
  50. X
  51. XMana points are determined by your experience level, and the level of
  52. Xyour key stat.  For Mages, Rogues, and Rangers, the key stat is intelligence,
  53. Xfor Priests and Paladins the key stat is wisdom.  The effect of your key
  54. Xstat is shown by the following table.
  55. X
  56. X             Stat Level                 Factor
  57. X                3-7                       0
  58. X                8-17                      1
  59. X               18-18/49                  3/2
  60. X            18/50-18/69                   2
  61. X            18/70-18/89                  5/2
  62. X            18/90-18/99                   3
  63. X               18/100                     4
  64. X
  65. XYour Mana score is the Factor times your experience level plus 1.
  66. XIf your key stat is 7 or less, your Mana score will be zero (not one)
  67. Xand you will not be able to use any spells.  If you attempt to cast a
  68. Xspell that calls for more Mana than you have, the rate of failure is much
  69. Xgreater than normal, you will faint for a few turns afterward, and you stand
  70. Xthe chance of damaging your health.
  71. X
  72. X1.1  Priest Spells
  73. X
  74. XPriest spells are received from the character's deity.  When the 'G'
  75. Xcommand is issued to learn new spells, spells are chosen randomly from
  76. Xthe spells that you are able to cast.  You need not
  77. Xhave the book the spell is in to learn it, because your God gave it to you,
  78. Xbut you do need the book to cast the spell.  Failure percentages and spell
  79. Xeffectiveness are based on Wisdom for priests and paladins.
  80. X
  81. X1.1.1  Priest spell levels and Mana
  82. X
  83. XThis is a table of all the spells, with the mana and level of achievement
  84. Xfor Priests and Paladins.
  85. X                           Priest    Paladin
  86. X(Beginner's Handbook)     Lv  Mana   Lv  Mana
  87. XA  Detect Evil             1   1      1   1
  88. XB  Cure Light Wounds       1   2      2   2
  89. XC  Bless                   1   2      3   3
  90. XD  Remove Fear             1   2      5   3
  91. XE  Call Light              3   2      5   4
  92. XF  Find Traps              3   3      7   5
  93. XG  Detect Doors/Stairs     3   3      7   5
  94. XH  Slow Poison             3   3      9   7
  95. X
  96. X(Words of Wisdom)
  97. XA  Blind Creature          5   4      9   7
  98. XB  Portal                  5   4      9   8
  99. XC  Cure Medium Wounds      5   4     11   9
  100. XD  Chant                   5   5     11  10
  101. XE  Sanctuary               7   5     11  10
  102. XF  Create Food             7   5     13  10
  103. XG  Remove Curse            7   6     13  11
  104. XH  Resist Heat and Cold    7   7     15  13
  105. X
  106. X(Chants and Blessings)
  107. XA  Neutralize Poison       9   6     15  15
  108. XB  Orb of Draining         9   7     17  15
  109. XC  Cure Serious Wounds     9   7     17  15
  110. XD  Sense Invisible        11   8     19  15
  111. XE  Protection from Evil   11   8     19  15
  112. XF  Earthquake             11   9     21  17
  113. XG  Sense Surroundings     13  10     23  17
  114. XH  Cure Critical Wounds   13  11     25  20
  115. XI  Turn Undead            15  12     27  21
  116. X
  117. X(Exorcisms and Dispellings)
  118. XA  Prayer                 15  14     29  22
  119. XB  Dispel Undead         17  14     31  24
  120. XC  Heal                   21  16     33  28
  121. XD  Dispel Evil           25  20     35  32
  122. XE  Glyph of Warding       33  24     37  36
  123. XF  Holy Word              39  32     39  38
  124. X
  125. X1.1.2  Priest Spell Descriptions
  126. X
  127. XThis is a short description of each of the spells, listed alphabetically.
  128. X
  129. XBless - Improves armor class and fighting ability for a short period of time.
  130. XBlind Creature - Blinds a creature for a short period of time.
  131. XCall Light - Lights up an area.
  132. XChant - Improves armor class and fighting ability for a medium period of time.
  133. XCreate Food - Causes a food item to be dropped at your feet.
  134. XCure Critical Wounds - Cures a very large number of hit points.
  135. XCure Light Wounds - Cures a small number of hit points.
  136. XCure Medium Wounds - Cures a medium number of hit points.
  137. XCure Serious Wounds - Cures a large number of hit points.
  138. XDetect Doors/Stairs - Finds all the doors and stairs on the screen.
  139. XDetect Evil - Finds all the evil creatures on the screen.
  140. XDispel Evil - Attempts to destroy the evil creature.
  141. XDispel Undead - Attempts to destroy the undead creature.
  142. XEarthquake - Randomly toggles corridors into walls and vice versa.
  143. XFind Traps - Locates all the traps on the screen.
  144. XGlyph of Warding - Leaves a 'Glyph' that monsters won't pass over.
  145. XHeal - Restores 200 Hit Points.
  146. XHoly Word - Dispels evil, removes fear, cures poison, and restores 1000 HPs.
  147. XNeutralize Poison - Cures you of poison.
  148. XOrb of Draining - Offensive spell that drains levels from monsters.
  149. XPortal - Teleports you a short distance away.
  150. XPrayer - Improves armor class and fighting ability for a long period of time.
  151. XProtection from Evil - Causes evil creatures to do less damage to you.
  152. XRemove Curse - Removes {damned} objects that you are welding.
  153. XRemove Fear - Negates the fear placed on you by an enemy.
  154. XResist Heat and Cold - Reduce damage you suffer from heat or cold attacks.
  155. XSanctuary - Causes neighboring monsters to fall asleep for a while.
  156. XSense Invisible - Finds all invisible creatures on the screen.
  157. XSense Surroundings - Maps the dungeon appearing on the screen.
  158. XSlow Poison - Reduces the rate HP are lost due to poison.
  159. XTurn Undead - Attempts to cause undead creatures to flee.
  160. X
  161. X1.2  Mage Spells
  162. X
  163. XMage Spells are more powerful and offensive in nature than Priest
  164. Xspells.  This offsets the fact that magicians are generally weaker
  165. Xthan any other class.  Because mage spells are learned though
  166. Xstudy, you must have the correct Magic book to learn and cast a
  167. Xspell.  Learning spells can be banked up.  For example:  You are a
  168. Xsecond level Mage who had learned Magic Missile and can learn one
  169. Xmore spell.  You do not wish to learn Detect Monsters, Phase Door
  170. Xor Light Area.  You can wait until you are third level and learn
  171. Xboth the Cure Light Wounds and Stinking Cloud, both third level
  172. Xspells.  Spell failure and effectiveness is based on intelligence
  173. Xfor Mages, Rangers, and Rogues.  Rangers can learn all but the most
  174. Xpowerful offensive spell.  Rogues can not learn any offensive spell.
  175. X
  176. X1.2.1  Mage Spell levels and Mana
  177. X
  178. X                                  Mage       Ranger      Rogue
  179. X(Beginners-Magik)               Lv  Mana    Lv  Mana    Lv  Mana
  180. XA  Magic Missile                 1   1       3   1      --  --
  181. XB  Detect Monsters               1   1       3   2       5   1
  182. XC  Phase Door                    1   2       3   2       7   2
  183. XD  Light Area                    1   2       5   3       9   3
  184. XE  Cure Light Wounds             3   3       5   3      11   4
  185. XF  Find Hidden Traps/Doors       3   3       5   4      13   5
  186. XG  Stinking Cloud                3   3       7   5      --  --
  187. X
  188. X(Magik I)
  189. XA  Confusion                     3   4       7   6      15   6
  190. XB  Lightning Bolt                5   4       9   7      --  --
  191. XC  Trap/Door Destruction         5   5       9   8      17   7
  192. XD  Sleep I                       5   5      11   8      19   8
  193. XE  Cure Poison                   5   5      11   9      21   9
  194. XF  Teleport Self                 7   6      13  10      --  --
  195. XG  Remove Curse                  7   6      13  11      23  10
  196. XH  Frost Bolt                    7   6      15  12      --  --
  197. XI  Turn Stone to Mud             9   7      15  13      --  --
  198. X
  199. X(Magik II)
  200. XA  Create Food                   9   7      17  17      25  12
  201. XB  Recharge Item I               9   7      17  17      27  15
  202. XC  Sleep II                      9   7      21  17      --  --
  203. XD  Polymorph Other              11   7      21  19      --  --
  204. XE  Identify                     11   7      23  25      29  18
  205. XF  Sleep III                    13   7      23  20      --  --
  206. XG  Fire Bolt                    15   9      25  20      --  --
  207. XH  Slow Monster                 17   9      25  21      --  --
  208. X
  209. X(Mages Guide to Power)
  210. XA  Frost Ball                   19  12      27  21      --  --
  211. XB  Recharge Item II             21  12      29  23      --  --
  212. XC  Teleport Other               23  12      31  25      --  --
  213. XD  Haste Self                   25  12      33  25      --  --
  214. XE  Fire Ball                    29  18      35  25      --  --
  215. XF  Word of Destruction          33  21      37  30      --  --
  216. XG  Genocide                     37  25      --  --      --  --
  217. X
  218. XNote:  Rangers don't get spells until 3'rd level, Rogues 5'th level.
  219. X
  220. X1.2.2  Mage Spell Descriptions
  221. X
  222. XConfusion - Confuses a monster for a short time.
  223. XCreate Food - Causes a food item to be dropped at your feet.
  224. XCure Light Wounds - Restores a small number of hit points.
  225. XCure Poison - Neutralizes the poison running through your veins.
  226. XDetect Monsters - Displays all the monsters on the screen.
  227. XFind Hidden Traps/Doors - Locates all the secret traps and doors.
  228. XFire Ball - Shoots a ball of flame toward a monster.
  229. XFire Bolt - Shoots a bolt of flame toward a monster.
  230. XFrost Ball - Shoots a ball of frost toward a monster.
  231. XFrost Bolt - Shoots a bolt of frost toward a monster.
  232. XGenocide - Destroys a particular monster on the level.
  233. XHaste Self - Causes you to move faster temporarily.
  234. XIdentify - Identifies an unknown object in your pack.
  235. XLight Area - Illuminates the area you are in with light.
  236. XLightning Bolt - Shoots a bolt of lightning at your enemy.
  237. XMagic Missile - Traditional bolt of magic used to damage enemies.
  238. XPhase Door - Teleports you a short distance.
  239. XPolymorph Other - Polymorphs a monster into a different creature.
  240. XRecharge Item I and II - Recharges a staff, rod, or wand.
  241. XRemove Curse - Allows you to unwield {damned} items.
  242. XSleep I - Causes a monster of your choosing to fall asleep.
  243. XSleep II - Causes neighboring monsters to fall asleep.
  244. XSleep III - Causes all monsters in range to fall asleep.
  245. XSlow Monster - Causes a monster to move slower.
  246. XStinking Cloud - Shoots a ball of noxious vapors to do damage.
  247. XTeleport Self - Teleports you to a new place on the level.
  248. XTeleport Other - Teleports an enemy to a new place on the level.
  249. XTrap/Door Destruction - Destroys all neighboring doors and traps.
  250. XTurn Stone to Mud - Causes a wall (or other stone object) to melt.
  251. XWord of Destruction - Destroys the entire screen.
  252. X
  253. XFor spells that come in numbered versions (Sleep I, II, III, etc), the
  254. Xhigher numbers have a higher effectiveness, but greater change
  255. Xof spell failure and greater Mana cost.
  256. X
  257. X1.3  Using Offensive Spells Against Monsters
  258. X
  259. XMonsters have a chance to save themselves from damage caused by
  260. Xoffensive spells, just like the player has a chanced to be saved from
  261. Xdamage by monster spells.  This chance is greater for higher level
  262. Xmonsters than for lower level monsters.  Also, some spells will never
  263. Xwork against monsters whose level is higher than the character's
  264. Xexperience level.
  265. X
  266. XMany monsters are immune to certain kinds of attack, and will suffer little
  267. Xor no damage from such attacks.  For example, a fire breathing dragon will
  268. Xsuffer little damage from a fire ball, but will suffer greatly from a
  269. Xfrost ball.  Also, Undead creatures will not be affected by sleep spells,
  270. Xsince they never sleep.
  271. X
  272. END_OF_FILE
  273. if test 11474 -ne `wc -c <'doc/spells.doc'`; then
  274.     echo shar: \"'doc/spells.doc'\" unpacked with wrong size!
  275. fi
  276. # end of 'doc/spells.doc'
  277. fi
  278. if test -f 'ibmpc/CONFIG.DOC' -a "${1}" != "-c" ; then 
  279.   echo shar: Will not clobber existing file \"'ibmpc/CONFIG.DOC'\"
  280. else
  281. echo shar: Extracting \"'ibmpc/CONFIG.DOC'\" \(10740 characters\)
  282. sed "s/^X//" >'ibmpc/CONFIG.DOC' <<'END_OF_FILE'
  283. X
  284. X                   The Dungeons of MORIA version 5.x
  285. X                   COPYRIGHT (c) Robert Alan Koeneke
  286. X
  287. X                 MSDOS port, v4.873, by D. G. Kneller
  288. X                             Nov 1, 1988
  289. X               Updated for Umoria 5.x by James E. Wilson
  290. X                             Mar 24, 1991
  291. X
  292. X
  293. X
  294. X
  295. X
  296. XTable of contents
  297. X1. USAGE ............................................................. 1
  298. X2. REQUIREMENTS ...................................................... 1
  299. X3. INSTALLATION ...................................................... 1
  300. X3.1. Hard drive systems .............................................. 1
  301. X3.2. High-density floppy systems ..................................... 2
  302. X3.3. 2 - 360K floppy systems ......................................... 2
  303. X4. OPTIONS ........................................................... 2
  304. X4.1. SAVE ............................................................ 2
  305. X4.2. SCORE ........................................................... 3
  306. X4.3. KEYBOARD ........................................................ 3
  307. X4.4. GRAPHICS ........................................................ 3
  308. X4.5. RAWIO ........................................................... 3
  309. X4.6. IBMBIOS ......................................................... 3
  310. X4.7. ANSI ............................................................ 4
  311. X5. ENVIRONMENT VARIABLES ............................................. 5
  312. X6. BUGS .............................................................. 5
  313. X7. AUTHOR'S ADDRESS .................................................. 5
  314. X
  315. X
  316. X
  317. X
  318. X
  319. X
  320. X
  321. X
  322. X
  323. X
  324. X
  325. X
  326. X
  327. X
  328. X
  329. X
  330. X
  331. X
  332. X
  333. X
  334. X
  335. X
  336. X
  337. X
  338. X
  339. X
  340. X                                 - i -
  341. X
  342. X
  343. X
  344. X
  345. XINTRODUCTION
  346. X
  347. XThis README file describes the requirements and setup necessary to get
  348. XMORIA running on your MSDOS computer.  The actual game documentation is
  349. Xin MORIA.DOC.
  350. X
  351. X
  352. X1. USAGE
  353. X
  354. X     Usage:  moria [ -norsw ] [ savefile ]
  355. X
  356. X     Where:  -n starts a new game, ignoring any existing save files.
  357. X             -o selects the original (VMS) command set.
  358. X             -r selects the Rogue-like command set.
  359. X             -s prints the score file and exits.
  360. X             -w will try to resurrect a dead character
  361. X
  362. X2. REQUIREMENTS
  363. X
  364. X     640K ram (really!)
  365. X     DOS 2.x or higher
  366. X     2 - 360K floppy disk drives or 1 high density drive or 1 hard drive
  367. X     A 24 (or 25) line by 80 column monitor.  MORIA uses either BIOS calls
  368. X     or ANSI for video output so should work properly on most monitors.
  369. X     It must use ANSI to work on DEC Rainbows.  It won't work in 43-line mode
  370. X     of an EGA.
  371. X
  372. X
  373. X3. INSTALLATION
  374. X
  375. XMORIA is very easy to configure.  The biggest problem is that there is
  376. Xnot enough room on a single 360K floppy disk to hold the DOS system
  377. Xfiles, MORIA.EXE (about 340K) and a MORIA save file (about 20K or so).
  378. XTo install MORIA, some files must be copied and 2 options in MORIA.CNF
  379. Xmust be set.  Options and the MORIA.CNF are described more fully in the
  380. Xsection entitled OPTIONS.  Here are a few methods of configuration.
  381. XThese methods are also described in the MORIA.CNF file.
  382. X
  383. X
  384. X3.1. Hard drive systems
  385. X
  386. XCreate a c:\games subdirectory on your hard disk and put c:\games on
  387. Xyour PATH (see the DOS manual if you need help with PATH). Copy
  388. XMORIA.EXE and MORIA.CNF to c:\games.  Edit MORIA.CNF and put in the
  389. Xoptions:
  390. X
  391. X     SAVE c:\games\moria.sav;n
  392. X     SCORE c:\games\moria.scr
  393. X
  394. X
  395. X
  396. X
  397. X
  398. X
  399. X                                 - 1 -
  400. X
  401. X3.2. High-density floppy systems
  402. X
  403. XThis is about as easy as for a hard disk.  Format a diskette and put the
  404. XDOS system files on it (use FORMAT A:/S).  Copy MORIA.EXE and MORIA.CNF
  405. Xto that diskette.  Edit MORIA.CNF and put in the options:
  406. X
  407. X     SAVE a:\moria.sav
  408. X     SCORE a:\moria.scr
  409. X
  410. X
  411. X
  412. X3.3. 2 - 360K floppy systems
  413. X
  414. XYou will need to use 2 floppy diskettes.  Format a diskette and put the
  415. XDOS system files on it (use FORMAT A:/S).  Copy MORIA.CNF to this
  416. Xdiskette. This diskette will go in drive A when you want to play MORIA.
  417. XFormat a second diskette (no /S) and copy MORIA.EXE to it.  This
  418. Xdiskette will go in drive B.  Edit MORIA.CNF and put in the options:
  419. X
  420. X     SAVE a:moria.sav
  421. X     SCORE a:moria.scr
  422. X
  423. X
  424. XWhen you want to play MORIA, put both diskettes in and type "B:MORIA"
  425. X
  426. X
  427. X
  428. X4. OPTIONS
  429. X
  430. XWhen MORIA starts up it looks along your PATH for the file "MORIA.CNF".
  431. XMORIA.CNF contains configuration information for MORIA in the form of
  432. Xoptions.  Options have a name and perhaps a value.  If the option
  433. Xdoesn't have a value, simply mentioning its name selects that option.
  434. XHere are the options.
  435. X
  436. X4.1. SAVE
  437. X
  438. XThe SAVE option has 1 argument, the name of a file where saved games
  439. Xwill be stored.  Normally, when you start MORIA by typing "MORIA file",
  440. XMORIA will try to use "file" as the name of a saved game.  The SAVE
  441. Xoption allows you to give the name of the save file so you don't have to
  442. Xtype it in each time you save or restore a game.  A sample SAVE option
  443. Xis:
  444. X
  445. X     SAVE c:\games\moria.sav;n
  446. X
  447. X
  448. XThe ";n" is optional.  If given it means that MORIA should never prompt
  449. Xyou for the name of the save file.  If the SAVE option isn't given,
  450. XMORIA defaults to the file MORIA.SAV in the same directory as MORIA.CNF.
  451. XAlso, the SAVE option can be just ";n", which means use the default name
  452. Xwithout prompting.
  453. X
  454. X
  455. X
  456. X
  457. X
  458. X                                 - 2 -
  459. X
  460. X4.2. SCORE
  461. X
  462. XThe SCORE option has 1 argument, the name of the file where the top
  463. Xscores are kept.  A sample SCORE option is:
  464. X
  465. X     SCORE c:\games\moria.scr
  466. X
  467. X
  468. XIf the SCORE option isn't given, MORIA defaults to the file MORIA.SCR in
  469. Xthe same directory as MORIA.CNF.
  470. X
  471. X
  472. X4.3. KEYBOARD
  473. X
  474. XMORIA can be played with either of 2 styles of commands.  There is the
  475. Xoriginal VMS-style commands and a Rogue-style set of commands. The
  476. Xchoice of command set affects the keyboard letters used for doing the
  477. Xvarious game commands.  The KEYBOARD value can be either "ROGUE" or
  478. X"VMS".  The default is to use the original VMS-style commands.
  479. X
  480. X
  481. X4.4. GRAPHICS
  482. X
  483. XThe GRAPHICS option takes 2 arguments, the ASCII number for the
  484. Xcharacter to be used for displaying the walls and floors.  For example,
  485. Xto use '#' for the walls and '.' for the floors, the GRAPHICS option
  486. Xwould be:
  487. X
  488. X     GRAPHICS 35 46
  489. X
  490. X
  491. XIncidentally, these also are the default characters that are used if the
  492. XGRAPHICS option is not specified.
  493. X
  494. X
  495. X4.5. RAWIO
  496. X
  497. XNormally DOS does some extra work whenever a character is input from the
  498. Xkeyboard.  One of the tasks is to interpret the special characters ^S
  499. X(control-S, which does a scroll lock) ^C (control-C, which acts like
  500. Xcontrol-Break) and ^P (control-P, which acts like control-PrtSc,
  501. Xtoggling output to your printer or giving an error message if you don't
  502. Xhave one). The RAWIO option will be used to tell DOS to not do this
  503. Xextra work by making the input (and output) operate in "raw" mode. This
  504. Xis good because ^P (a MORIA command) will now work. As well, screen
  505. Xoutput will be somewhat faster.
  506. X
  507. XURGENT!  RAWIO will not work on Dec Rainbows and will probably lock up
  508. Xthe computer.
  509. X
  510. X
  511. X4.6. IBMBIOS
  512. X
  513. XIBMBIOS enables the use of a BIOS call to read input from the keyboard.
  514. X
  515. X
  516. X
  517. X                                 - 3 -
  518. X
  519. XThe advantage of this is that the numeric keypad will then be useable as
  520. Xdirection keys for moving around.  With this option the keypad keys map
  521. Xto the directions:
  522. X
  523. X             7 up & left      8 up        9 up & right
  524. X             4 left           5 nothing   6 right
  525. X             1 down & left    2 down      3 down & right
  526. X
  527. X     And other keypad keys map to:
  528. X
  529. X                                          -   rest
  530. X                                          +   previous message
  531. X             Ins inventory        Del rest
  532. X
  533. X
  534. XIf you are using the Rogue-style command set, the shift key and NumLock
  535. Xkey modify these commands. With the shift key down, 7 will be "run up
  536. Xand left", 8 will be "run up", etc.  The NumLock key is used as a toggle
  537. Xbetween moving and tunneling. With NumLock enabled, 7 will be "tunnel up
  538. Xand left", etc.
  539. X
  540. X
  541. X4.7. ANSI
  542. X
  543. XThe ANSI option tells MORIA to use ANSI sequences rather than using BIOS
  544. Xcalls for doing output.  You must use the ANSI option if you are playing
  545. XMORIA on a DEC Rainbow.  On IBM PCs, ATs and clones there should be no
  546. Xneed to use this option and you can safely ignore the rest of this
  547. Xsection.
  548. X
  549. XThe ANSI option takes three optional arguments:  check_ansi, move_opt and
  550. Xuse_tgoto.  If no arguments aren't given, they are assumed to be Y (yes),
  551. XY and N (no), respectively.  The usage is
  552. X
  553. X     ANSI [ check_ansi [ move_opt [ use_tgoto ] ] ]
  554. X
  555. XAn example is:
  556. X
  557. X     ANSI Y N
  558. X
  559. Xcheck_ansi tells MORIA to check for ANSI.SYS when starting up.  You may have
  560. Xto disable this check if MORIA insists you don't have ANSI installed, but you
  561. Xknow you do.  move_opt tries to reduce the amount of output being sent to the
  562. Xscreen.  use_tgoto tells MORIA to use the actual TERMCAP tgoto() routine.  The
  563. Xdefault is to use a faster routine which only works for ANSI-like terminals.
  564. X
  565. XWhen the ANSI option is chosen, MORIA looks for ANSI control strings in
  566. Xa file called TERMCAP, first in the current directory, then in directory
  567. XETC.  A sample TERMCAP file is supplied.  Basically, this file maps
  568. Xbetween logical cursor operations (eg. "cursor up") to ANSI sequences
  569. X(eg ESC [ A).  In the file, ESC (escape) is represented as \E.  MORIA
  570. Xuses the following logical operations:
  571. X
  572. X
  573. X
  574. X
  575. X
  576. X                                 - 4 -
  577. X
  578. X     ce      clear to end of line
  579. X     cl      clear screen
  580. X     cm      cursor motion (only if use_tgoto is chosen)
  581. X     nd      cursor forward (non-destructive space)
  582. X     le      cursor back (left)
  583. X     up      cursor up
  584. X     do      cursor down
  585. X     li      number of lines on the screen
  586. X
  587. XMORIA can also use:
  588. X
  589. X     ti      terminal initialization string
  590. X     te      terminal end string
  591. X
  592. X
  593. X5. ENVIRONMENT VARIABLES
  594. X
  595. XMORIA uses the environment variable USER to determine your real name (as
  596. Xopposed to your role playing name in the game).  The USER environment
  597. Xvariable can be set from DOS with:
  598. X
  599. X     set USER = kneller
  600. X
  601. XIf the USER variable isn't set, MORIA just uses the name "player".
  602. X
  603. XIf the ANSI option is chosen, MORIA uses the variable TERM to determine
  604. Xthe terminal information to extract from the TERMCAP file.  If the TERM
  605. Xvariable isn't set, MORIA assumes the value "ibmpc-mono".
  606. X
  607. X
  608. X
  609. X6. BUGS
  610. X
  611. XI have not played this game much so there may be bugs which I have not
  612. Xseen yet.  Please report them to me so I can fix them.
  613. X
  614. X
  615. X7. AUTHOR'S ADDRESS
  616. X
  617. XIf you have any questions or bug reports please contact me at:
  618. X
  619. X     David Grabiner
  620. X     Department of Mathematics
  621. X     Harvard University
  622. X     Cambridge, MA 02138
  623. X
  624. X     or by electronic mail: grabiner@math.harvard.edu
  625. X
  626. XThe original author can be reached at:
  627. X
  628. X     James E. Wilson
  629. X     856 University Ave.
  630. X     Palo Alto, CA  94301
  631. X     USA
  632. X
  633. X     or by electronic mail:   wilson@kithrup.com
  634. X
  635. X                                 - 5 -
  636. X
  637. END_OF_FILE
  638. if test 10740 -ne `wc -c <'ibmpc/CONFIG.DOC'`; then
  639.     echo shar: \"'ibmpc/CONFIG.DOC'\" unpacked with wrong size!
  640. fi
  641. # end of 'ibmpc/CONFIG.DOC'
  642. fi
  643. if test -f 'ibmpc/ms_misc.c' -a "${1}" != "-c" ; then 
  644.   echo shar: Will not clobber existing file \"'ibmpc/ms_misc.c'\"
  645. else
  646. echo shar: Extracting \"'ibmpc/ms_misc.c'\" \(11297 characters\)
  647. sed "s/^X//" >'ibmpc/ms_misc.c' <<'END_OF_FILE'
  648. X/* ibmpc/ms_misc.c: MSDOS support code
  649. X
  650. X   Copyright (c) 1989-92 James E. Wilson, Don Kneller
  651. X
  652. X   This software may be copied and distributed for educational, research, and
  653. X   not for profit purposes provided that this copyright and statement are
  654. X   included in all such copies. */
  655. X
  656. X#ifdef __TURBOC__
  657. X#include    <conio.h>
  658. X#endif /* __TURBOC__ */
  659. X#include <string.h>
  660. X#include <ctype.h>
  661. X#include <time.h>
  662. X#include <fcntl.h>
  663. X#include <stdio.h>
  664. X
  665. X#include "config.h"
  666. X#include "constant.h"
  667. X#include "types.h"
  668. X#include "externs.h"
  669. X
  670. X#ifdef MSDOS
  671. X#ifndef USING_TCIO
  672. X/* We don't want to include curses.h when using the tcio.c file.  */
  673. X#include <curses.h>
  674. X#endif
  675. X#ifdef ANSI
  676. X#include "ms_ansi.h"
  677. X#endif
  678. X
  679. X#ifdef LINT_ARGS
  680. Xvoid exit(int);
  681. Xstatic FILE *fopenp(char *, char *, char *);
  682. Xstatic    unsigned int ioctl(int ,int ,unsigned int );
  683. X#else
  684. Xvoid exit();
  685. Xstatic unsigned int ioctl();
  686. X#endif
  687. X
  688. Xextern char *getenv();
  689. X
  690. X#define PATHLEN    80
  691. Xchar    moriatop[PATHLEN];
  692. Xchar    moriasav[PATHLEN];
  693. Xint    saveprompt = TRUE;
  694. Xint    ibmbios;
  695. Xstatic    int    rawio;
  696. Xint8u    floorsym = '.';
  697. Xint8u    wallsym = '#';
  698. X
  699. X/* UNIX compatability routines */
  700. Xvoid user_name(buf)
  701. Xchar *buf;
  702. X{
  703. X  strcpy(buf, getlogin());
  704. X}
  705. X
  706. Xchar    *
  707. Xgetlogin()
  708. X{
  709. X    char    *cp;
  710. X
  711. X    if ((cp = getenv("USER")) == NULL)
  712. X        cp = "player";
  713. X    return cp;
  714. X}
  715. X
  716. X#ifndef __TURBOC__
  717. Xunsigned int
  718. Xsleep(secs)
  719. Xint    secs;
  720. X{
  721. X    time_t    finish_time;
  722. X
  723. X    finish_time = time((long *) NULL) + secs;
  724. X    while (time((long *) NULL) < finish_time)
  725. X        /* nothing */;
  726. X    return 0;
  727. X}
  728. X#endif
  729. X
  730. X#ifdef OLD
  731. X/* This is the old code.  It is not strictly correct; it is retained in
  732. X   case the correct code below is not portable.  You will also have to
  733. X   change the declarations for these functions in externs.h.  */
  734. Xvoid
  735. Xerror(fmt, a1, a2, a3, a4)
  736. Xchar    *fmt;
  737. Xint    a1, a2, a3, a4;
  738. X{
  739. X    fprintf(stderr, "MORIA error: ");
  740. X    fprintf(stderr, fmt, a1, a2, a3, a4);
  741. X    (void) sleep(2);
  742. X    exit(1);
  743. X}
  744. X
  745. Xvoid
  746. Xwarn(fmt, a1, a2, a3, a4)
  747. Xchar    *fmt;
  748. Xint    a1, a2, a3, a4;
  749. X{
  750. X    fprintf(stderr, "MORIA warning: ");
  751. X    fprintf(stderr, fmt, a1, a2, a3, a4);
  752. X    (void) sleep(2);
  753. X}
  754. X#else
  755. X
  756. X#include <stdarg.h>
  757. X
  758. Xvoid
  759. Xerror (char *fmt, ...)
  760. X{
  761. X  va_list p_arg;
  762. X
  763. X  va_start (p_arg, fmt);
  764. X  fprintf (stderr, "Moria error: ");
  765. X  vfprintf (stderr, fmt, p_arg);
  766. X  sleep (2);
  767. X  exit (1);
  768. X}
  769. X
  770. Xvoid
  771. Xwarn(char *fmt, ...)
  772. X{
  773. X  va_list p_arg;
  774. X
  775. X  va_start(p_arg, fmt);
  776. X  fprintf(stderr, "MORIA warning: ");
  777. X  vfprintf(stderr, fmt, p_arg);
  778. X  sleep(2);
  779. X}
  780. X#endif
  781. X
  782. X/* Search the path for a file of name "name".  The directory is
  783. X * filled in with the directory part of the path.
  784. X */
  785. Xstatic FILE *
  786. Xfopenp(name, mode, directory)
  787. Xchar *name, *mode, directory[];
  788. X{
  789. X    char *dp, *pathp, *getenv(), lastch;
  790. X    FILE *fp;
  791. X
  792. X    /* Try the default directory first.  If the file can't be opened,
  793. X     * start looking along the path.
  794. X     */
  795. X    fp = fopen (name, mode);
  796. X    if (fp) {
  797. X        directory[0] = '\0';
  798. X        return fp;
  799. X    }
  800. X    pathp = getenv("PATH");
  801. X    while (pathp && *pathp) {
  802. X        dp = directory;
  803. X        while (*pathp && *pathp != ';')
  804. X            lastch = *dp++ = *pathp++;
  805. X        if (lastch != '\\' && lastch != '/' && lastch != ':')
  806. X            *dp++ = '\\';
  807. X        (void) strcpy(dp, name);
  808. X        fp = fopen (directory, mode);
  809. X        if (fp) {
  810. X            *dp = '\0';
  811. X            return fp;
  812. X        }
  813. X        if (*pathp)
  814. X            pathp++;
  815. X    }
  816. X    directory[0] = '\0';
  817. X    return NULL;
  818. X}
  819. X
  820. X/* Read the configuration.
  821. X */
  822. Xvoid
  823. Xmsdos_init()
  824. X{
  825. X    char    buf[BUFSIZ], *bp, opt[PATHLEN];
  826. X    int    arg1, arg2, cnt;
  827. X    FILE    *fp;
  828. X
  829. X    buf[0] = '\0';
  830. X    bp = MORIA_CNF_NAME;
  831. X    fp = fopenp(bp, "r", buf);
  832. X    (void) strcpy(moriatop, buf);
  833. X    (void) strcat(moriatop, MORIA_TOP_NAME);
  834. X    (void) strcpy(moriasav, buf);
  835. X    (void) strcat(moriasav, MORIA_SAV_NAME);
  836. X    if (fp == NULL) {
  837. X        warn("Can't find configuration file `%s'\n", bp);
  838. X        return;
  839. X    }
  840. X    printf("Reading configuration from %s%s\n", buf, bp);
  841. X    (void) sleep(1);
  842. X    while (fgets(buf, sizeof buf, fp)) {
  843. X        if (*buf == '#')
  844. X            continue;
  845. X
  846. X        cnt = sscanf(buf, "%s", opt);
  847. X        /* Turbo C will return EOF when reading an empty line,
  848. X           MSC will correctly read a NULL character */
  849. X        if (cnt == 0 ||
  850. X#ifdef __TURBOC__
  851. X            cnt == EOF ||
  852. X#endif
  853. X            opt[0] == '\0')
  854. X            continue;
  855. X
  856. X        /* Go through possible variables
  857. X         */
  858. X        if (strcmpi(opt, "GRAPHICS") == 0) {
  859. X            cnt = sscanf(buf, "%*s%d %d\n", &arg1, &arg2);
  860. X            if (cnt != 2)
  861. X                warn("GRAPHICS did not contain 2 values\n");
  862. X            else {
  863. X                wallsym = (int8u) arg1;
  864. X                floorsym = (int8u) arg2;
  865. X
  866. X                /* Adjust lists that depend on '#' and '.' */
  867. X                object_list[OBJ_SECRET_DOOR].tchar = wallsym;
  868. X            }
  869. X        }
  870. X        else if (strcmpi(opt, "SAVE") == 0) {
  871. X            cnt = sscanf(buf, "%*s%s", opt);
  872. X            if (cnt == 0)
  873. X                warn("SAVE option requires a filename\n");
  874. X            else {
  875. X                    bp = strchr (opt, ';');
  876. X                if (bp) {
  877. X                    *bp++ = '\0';
  878. X                    if (*bp == 'n' || *bp == 'N')
  879. X                        saveprompt = FALSE;
  880. X                }
  881. X                if (opt[0])
  882. X                    (void) strcpy(moriasav, opt);
  883. X            }
  884. X        }
  885. X        else if (strcmpi(opt, "SCORE") == 0) {
  886. X            cnt = sscanf(buf, "%*s%s", opt);
  887. X            if (cnt == 0)
  888. X                warn("SCORE option requires a filename\n");
  889. X            else
  890. X                (void) strcpy(moriatop, opt);
  891. X        }
  892. X        else if (strcmpi(opt, "KEYBOARD") == 0) {
  893. X            cnt = sscanf(buf, "%*s%s", opt);
  894. X            if (cnt == 0)
  895. X                warn("KEYBOARD option requires a value\n");
  896. X            else if (strcmpi(opt, "ROGUE") == 0)
  897. X                rogue_like_commands = TRUE;
  898. X            else if (strcmpi(opt, "VMS") == 0)
  899. X                rogue_like_commands = FALSE;
  900. X        }
  901. X        else if (strcmpi(opt, "IBMBIOS") == 0)
  902. X            ibmbios = TRUE;
  903. X        else if (strcmpi(opt, "RAWIO") == 0)
  904. X            rawio = TRUE;
  905. X#ifdef ANSI
  906. X        /* Usage: ANSI [ check_ansi [ domoveopt [ tgoto ] ] ]
  907. X         * where check_ansi and domoveopt are "Y"es unless explicitly
  908. X         * set to "N"o.     Tgoto is "N"o unless set to "Y"es.
  909. X         */
  910. X        else if (strcmpi(opt, "ANSI") == 0) {
  911. X            cnt=sscanf(buf, "%*s%1s%1s%1s",&opt[0],&opt[1],&opt[2]);
  912. X            ansi_prep(cnt < 1 || opt[0] == 'y' || opt[0] == 'Y',
  913. X                 cnt < 2 || opt[1] == 'y' || opt[1] == 'Y',
  914. X                 cnt >= 3 && (opt[2] == 'y' || opt[2] == 'Y'));
  915. X        }
  916. X#endif
  917. X        else
  918. X            warn("Unknown configuration line: `%s'\n", buf);
  919. X    }
  920. X    fclose(fp);
  921. X
  922. X    /* The only text file has been read.  Switch to binary mode */
  923. X}
  924. X
  925. X#include <dos.h>
  926. X#define DEVICE    0x80
  927. X#define RAW    0x20
  928. X#define IOCTL    0x44
  929. X#define STDIN    fileno(stdin)
  930. X#define STDOUT    fileno(stdout)
  931. X#define GETBITS    0
  932. X#define SETBITS    1
  933. X
  934. Xstatic unsigned    old_stdin, old_stdout, ioctl();
  935. X
  936. Xvoid
  937. Xmsdos_raw() {
  938. X    if (!rawio)
  939. X        return;
  940. X    old_stdin = ioctl(STDIN, GETBITS, 0);
  941. X    old_stdout = ioctl(STDOUT, GETBITS, 0);
  942. X    if (old_stdin & DEVICE)
  943. X        ioctl(STDIN, SETBITS, old_stdin | RAW);
  944. X    if (old_stdout & DEVICE)
  945. X        ioctl(STDOUT, SETBITS, old_stdout | RAW);
  946. X}
  947. X
  948. Xvoid
  949. Xmsdos_noraw() {
  950. X    if (!rawio)
  951. X        return;
  952. X    if (old_stdin)
  953. X        (void) ioctl(STDIN, SETBITS, old_stdin);
  954. X    if (old_stdout)
  955. X        (void) ioctl(STDOUT, SETBITS, old_stdout);
  956. X}
  957. X
  958. Xstatic unsigned int
  959. Xioctl(handle, mode, setvalue)
  960. Xunsigned int setvalue;
  961. X{
  962. X    union REGS regs;
  963. X
  964. X    regs.h.ah = IOCTL;
  965. X    regs.h.al = (unsigned char) mode;
  966. X    regs.x.bx = handle;
  967. X    regs.h.dl = (unsigned char) setvalue;
  968. X    regs.h.dh = 0;            /* Zero out dh */
  969. X    intdos(®s, ®s);
  970. X    return (regs.x.dx);
  971. X}
  972. X
  973. X/* Normal characters are output when the shift key is not pushed.
  974. X * Shift characters are output when either shift key is pushed.
  975. X */
  976. X#define KEYPADHI    83
  977. X#define KEYPADLOW    71
  978. X#define ISKEYPAD(x)    (KEYPADLOW <= (x) && (x) <= KEYPADHI)
  979. X#undef CTRL
  980. X#define CTRL(x)        (x - '@')
  981. Xtypedef struct {
  982. X    char normal, shift, numlock;
  983. X} KEY;
  984. Xstatic KEY roguekeypad[KEYPADHI - KEYPADLOW + 1] = {
  985. X    {'y', 'Y', CTRL('Y')},            /* 7 */
  986. X    {'k', 'K', CTRL('K')},            /* 8 */
  987. X    {'u', 'U', CTRL('U')},            /* 9 */
  988. X    {'.', '.', '.'},            /* - */
  989. X    {'h', 'H', CTRL('H')},            /* 4 */
  990. X    {'.', '.', '.'},            /* 5 */
  991. X    {'l', 'L', CTRL('L')},            /* 6 */
  992. X    {CTRL('P'), CTRL('P'), CTRL('P')},    /* + */
  993. X    {'b', 'B', CTRL('B')},            /* 1 */
  994. X    {'j', 'J', CTRL('J')},            /* 2 */
  995. X    {'n', 'N', CTRL('N')},            /* 3 */
  996. X    {'i', 'i', 'i'},            /* Ins */
  997. X    {'.', '.', '.'}                /* Del */
  998. X};
  999. Xstatic KEY originalkeypad[KEYPADHI - KEYPADLOW + 1] = {
  1000. X    {'7', '7', '7'},            /* 7 */
  1001. X    {'8', '8', '8'},            /* 8 */
  1002. X    {'9', '9', '9'},            /* 9 */
  1003. X    {'-', '-', '-'},            /* - */
  1004. X    {'4', '4', '4'},            /* 4 */
  1005. X    {'5', '5', '5'},            /* 5  - move */
  1006. X    {'6', '6', '6'},            /* 6 */
  1007. X    {CTRL('M'), CTRL('M'), CTRL('M')},    /* + */
  1008. X    {'1', '1', '1'},            /* 1 */
  1009. X    {'2', '2', '2'},            /* 2 */
  1010. X    {'3', '3', '3'},            /* 3 */
  1011. X    {'i', 'i', 'i'},        /* Ins */
  1012. X    {'.', '.', '.'}            /* Del */
  1013. X};
  1014. X
  1015. X/* bios_getch gets keys directly with a BIOS call.
  1016. X */
  1017. X#define SHIFT        (0x1 | 0x2)
  1018. X#define NUMLOCK        0x20
  1019. X#define KEYBRD_BIOS    0x16
  1020. X
  1021. Xint
  1022. Xbios_getch()
  1023. X{
  1024. X    unsigned char scan, shift;
  1025. X    int    ch;
  1026. X    KEY    *kp;
  1027. X    union REGS regs;
  1028. X
  1029. X    if (rogue_like_commands)
  1030. X        kp = roguekeypad;
  1031. X    else
  1032. X        kp = originalkeypad;
  1033. X
  1034. X    /* Get scan code.
  1035. X     */
  1036. X    regs.h.ah = 0;
  1037. X    int86(KEYBRD_BIOS, ®s, ®s);
  1038. X    ch = regs.h.al;
  1039. X    scan = regs.h.ah;
  1040. X
  1041. X    /* Get shift status.
  1042. X     */
  1043. X    regs.h.ah = 2;
  1044. X    int86(KEYBRD_BIOS, ®s, ®s);
  1045. X    shift = regs.h.al;
  1046. X
  1047. X    /* If scan code is for the keypad, translate it.
  1048. X     */
  1049. X    if (ISKEYPAD(scan)) {
  1050. X        if (shift & NUMLOCK)
  1051. X            ch = kp[scan - KEYPADLOW].numlock;
  1052. X        else if (shift & SHIFT)
  1053. X            ch = kp[scan - KEYPADLOW].shift;
  1054. X        else
  1055. X            ch = kp[scan - KEYPADLOW].normal;
  1056. X    }
  1057. X    return ch;
  1058. X}
  1059. X
  1060. Xint
  1061. Xmsdos_getch()
  1062. X{
  1063. X    int    ch;
  1064. X
  1065. X    if (ibmbios)
  1066. X        ch = bios_getch();
  1067. X    else {
  1068. X        ch = getch();
  1069. X        if (ch == 0)
  1070. X            ch = getch();
  1071. X    }
  1072. X    return ch;
  1073. X}
  1074. X
  1075. X#if 0
  1076. X/* This intro message deleted because it is obsolete.  */
  1077. X
  1078. X/* Hardcode the introductory message in */
  1079. Xvoid
  1080. Xmsdos_intro()
  1081. X{
  1082. X        char buf[80];
  1083. X
  1084. X    clear_screen();
  1085. X        wmove(stdscr,0,0);
  1086. X    waddstr(stdscr,"                         *********************");
  1087. X    wmove(stdscr,1,0);
  1088. X        sprintf(buf,"                         **   Moria %d.%d    **",
  1089. X      CUR_VERSION_MAJ, CUR_VERSION_MIN);
  1090. X        waddstr(stdscr,buf);
  1091. X        wmove(stdscr,2,0);
  1092. X    waddstr(stdscr,"                         *********************");
  1093. X        wmove(stdscr,3,0);
  1094. X    waddstr(stdscr,"                   COPYRIGHT (c) Robert Alan Koeneke");
  1095. X        wmove(stdscr,5,0);
  1096. X    waddstr(stdscr,"Programmers : Robert Alan Koeneke / University of Oklahoma");
  1097. X        wmove(stdscr,6,0);
  1098. X    waddstr(stdscr,"              Jimmey Wayne Todd   / University of Oklahoma");
  1099. X        wmove(stdscr,8,0);
  1100. X    waddstr(stdscr,"UNIX Port   : James E. Wilson     / Cygnus Support");
  1101. X        wmove(stdscr,10,0);
  1102. X    waddstr(stdscr,"MSDOS Port  : Don Kneller         / 1349 - 10th ave");
  1103. X        wmove(stdscr,11,0);
  1104. X    waddstr(stdscr,
  1105. X        "                                  / San Francisco, CA 94122");
  1106. X        wmove(stdscr,12,0);
  1107. X    waddstr(stdscr,"                                  / Dec 12, 1988");
  1108. X    pause_line(23);
  1109. X}
  1110. X#endif
  1111. X
  1112. X#ifdef PC_CURSES
  1113. X/* Seems to be a bug in PCcurses whereby it won't really clear the screen
  1114. X * if there are characters there it doesn't know about.
  1115. X */
  1116. X#define VIDEOINT    0x10
  1117. Xvoid
  1118. Xbios_clear()
  1119. X{
  1120. X    union REGS regs;
  1121. X    unsigned char    nocols, activepage;
  1122. X
  1123. X#ifdef ANSI
  1124. X    if (ansi)
  1125. X        return;
  1126. X#endif
  1127. X
  1128. X    /* get video attributes */
  1129. X    regs.h.ah = 15;
  1130. X    int86(VIDEOINT, ®s, ®s);
  1131. X    nocols = regs.h.ah;
  1132. X    activepage = regs.h.bh;
  1133. X
  1134. X    /* Move to lower right corner */
  1135. X    regs.h.ah = 2;
  1136. X    regs.h.dh = (unsigned char) 24;
  1137. X    regs.h.dl = nocols - 1;    /* lower right col */
  1138. X    regs.h.bh = activepage;
  1139. X    int86(VIDEOINT, ®s, ®s);
  1140. X
  1141. X    /* get current attribute into bh */
  1142. X    regs.h.ah = 8;
  1143. X    regs.h.bh = activepage;
  1144. X    int86(VIDEOINT, ®s, ®s);
  1145. X    regs.h.bh = regs.h.ah;
  1146. X
  1147. X    regs.h.cl = 0;    /* upper left row */
  1148. X    regs.h.ch = 0;    /* upper left col */
  1149. X    regs.h.dh = (unsigned char) 24;    /* lower right row */
  1150. X    regs.h.dl = nocols - 1;    /* lower right col */
  1151. X    regs.h.al = 0;    /* clear window */
  1152. X    regs.h.ah = 7;    /* scroll down */
  1153. X    int86(VIDEOINT, ®s, ®s);
  1154. X}
  1155. X#endif
  1156. X
  1157. X#endif
  1158. END_OF_FILE
  1159. if test 11297 -ne `wc -c <'ibmpc/ms_misc.c'`; then
  1160.     echo shar: \"'ibmpc/ms_misc.c'\" unpacked with wrong size!
  1161. fi
  1162. # end of 'ibmpc/ms_misc.c'
  1163. fi
  1164. if test -f 'misc/shading' -a "${1}" != "-c" ; then 
  1165.   echo shar: Will not clobber existing file \"'misc/shading'\"
  1166. else
  1167. echo shar: Extracting \"'misc/shading'\" \(8888 characters\)
  1168. sed "s/^X//" >'misc/shading' <<'END_OF_FILE'
  1169. XFrom ucbvax!tut.cis.ohio-state.edu!mailrus!uflorida!gatech!ncsuvx!ecemwl!jnh
  1170. XStatus: RO
  1171. X
  1172. XArticle 1484 of rec.games.programmer:
  1173. XPath: ucbvax!tut.cis.ohio-state.edu!mailrus!uflorida!gatech!ncsuvx!ecemwl!jnh
  1174. X>From: jnh@ecemwl.ncsu.edu (Joseph N. Hall)
  1175. XNewsgroups: rec.games.programmer
  1176. XSubject: Shading and line-of-sight calculation _en_masse_...
  1177. XKeywords: very very fast
  1178. XMessage-ID: <4036@ncsuvx.ncsu.edu>
  1179. XDate: 25 Sep 89 17:10:09 GMT
  1180. XSender: news@ncsuvx.ncsu.edu
  1181. XReply-To: jnh@ecemwl.UUCP (Joseph N. Hall)
  1182. XOrganization: North Carolina State University
  1183. XLines: 192
  1184. X
  1185. XHere is a rough presentation of the technique for calculating shading and
  1186. Xvisibility that I had mentioned earlier.
  1187. X
  1188. X...
  1189. X
  1190. X(summary)
  1191. X
  1192. XA Fast Algorithm for Calculating Shading and Visibility in a
  1193. XTwo-Dimensional Field
  1194. X
  1195. XBy Joseph Hall
  1196. XApplications Programmer, North Carolina State University
  1197. X
  1198. XThis document copyright 1989 by Joseph Hall.  It may be reproduced in
  1199. Xentirety for distribution for any purpose, so long as no fee whatsoever
  1200. Xis charged for its distribution and no attempt is made to restrict its
  1201. Xdistribution.  No other use is allowed without permission from the author.
  1202. XPermission from the author must be obtained if a substantial portion of
  1203. Xthis document is to be included in another copyrighted work.
  1204. X
  1205. XAs the author of this document, I hereby release the ALGORITHMS described
  1206. Xherein into the public domain.  This release does not apply to the actual
  1207. Xtext of this document.
  1208. X
  1209. X---
  1210. X
  1211. XInteractive terminal-based "rogue-like" games such as Hack, Moria, Omega,
  1212. Xand, of course, the original Rogue, feature a player character traveling
  1213. Xthrough a maze.  The maze usually comprises several levels and is usually
  1214. Xlaid out on a grid of squares or "tiles."  Each tile contains one of several
  1215. Xdistinct features, e.g., a piece of wall, floor, door, etc., and may also
  1216. Xcontain objects and/or creatures, if it is not solid.
  1217. X
  1218. XHack and Rogue handle lighting and visibility quite simply.  All corridors
  1219. Xand walls are "visible" once they have been seen.  Rooms are square and are
  1220. Xeither "lit" or "dark."  A player carrying a lamp can see with a radius of
  1221. X1 tile if he is in a corridor (which is always dark) or in a dark room.
  1222. XA player cannot see the occupants of a room until he steps into that room.
  1223. XThese conditions eliminate the possible complexity of line-of-sight and
  1224. Xshading computations, but detract somewhat from the "realism" of the game.
  1225. X
  1226. XMoria, on the other hand, allows for line-of-sight considerations.  A player
  1227. Xcan see whatever is standing or resting on a tile is it is both lit and
  1228. Xcan be seen from his current location, i.e., if there are no "solid" tiles,
  1229. Xsuch as walls or closed doors, intervening.  Thus a player can see some of
  1230. Xthe contents of a room as he approaches its entrance, and more as he gets
  1231. Xcloser.  Moria does not, however, allow for lights of radius greater than
  1232. Xone tile, and only the player is allowed to carry a light.  Again, all rooms
  1233. Xare either lit or not lit, and corridors are dark, although certain player
  1234. Xactions can permanently light portions of corridors and permanently light
  1235. Xor darken portions of rooms.
  1236. X
  1237. XOne can see the desirability of a more complex scheme, where the player
  1238. Xis allowed a lamp of variable radius, other creatures can carry lamps, and
  1239. Xrooms are lit by lamps with finite radius.  Such a scheme is not trivial to
  1240. Ximplement, at least from the standpoint of the bookkeeping required, but the
  1241. Xgreatest difficulty is the amount of calculation required, which can easily
  1242. Xtake long enough on a microcomputer to remove the interactive feel of
  1243. Xthe game.
  1244. X
  1245. XConsider:
  1246. X
  1247. XWhenever the player moves, and thus his viewpoint changes, the visibility
  1248. Xof the entire area surrounding him must be recalculated.  This area will be
  1249. Xeither the visible area on the screen or the portion of it within a limited
  1250. X"sight radius" of the player.  A sight radius of at least 25 tiles is
  1251. Xdesirable, and this could entail calculations for pi * 25 * 25 tiles, or
  1252. Xabout 2000 tiles.
  1253. X
  1254. XAdditionally, whenever a light source moves (when carried by the player or
  1255. Xby another creature), the lighting status of the area within the effective
  1256. Xradius of the light source must be recalculated.  Although a radius of 1-5
  1257. Xtiles is probably optimum for players and other creatures, there may be a
  1258. Xnumber of these light sources on screen at the same time, and larger radii
  1259. Xalso have some application.
  1260. X
  1261. XFinally, considerable recalculation is required whenever the solidity of a
  1262. Xvisible tile changes, e.g., when a door opens or closes.
  1263. X
  1264. XThe obvious approach to all of the above situations is to calculate both
  1265. Xvisibility and lighting status on a tile-by-tile basis using an ordinary
  1266. X"line-of-sight" routine.  That is, for each light source on screen, calculate
  1267. Xwhether it lights a tile within its radius by seeing whether a line of sight
  1268. Xexists between it and the tile; similarly, once the lighting status of all
  1269. Xtiles on screen is known, calculate whether the player can see them by
  1270. Xchecking the line of sight from the player to each of the surrounding tiles.
  1271. X
  1272. XThe difficulty here is that the line-of-sight routine must check each of the
  1273. Xtiles intervening between the player/light source and destination.  This
  1274. Xmakes the calculations described above roughly O(n^3), which is generally
  1275. Xunsuitable.
  1276. X
  1277. XA previous posting on USENET suggested using "rays" emanating from the player
  1278. Xor light source, one ray to each screen border tile or each tile of limiting
  1279. Xcircumference.  The algorithm involves checking the solidity of tiles along
  1280. Xeach ray, beginning at the player or light source, and marking them visible
  1281. Xuntil a solid object is encountered.  While this is fast and efficient, it
  1282. Xis incorrect.  To wit:
  1283. X
  1284. X      . |          . |        |
  1285. X    . . |        . . |          . |
  1286. X  . . . |      . . . *        * * *                . . .
  1287. X@ . x . |    @ . x * *    @ . x * *    @ . . . .    @ . .
  1288. X
  1289. X   (1)           (2)           (3)           (4)           (5)
  1290. X
  1291. X
  1292. XHere, @ is the center of a light source, x is a solid object, '*' represents
  1293. Xa shaded tile, '.' is a lit tile, and '|' is a boundary.  (1) shows the system
  1294. Xwithout shading.  (2) is the correct shading.  (3) is the shading generated
  1295. Xby the above algorithm.  (4) and (5) are the lines of sight to the border that
  1296. Xcause the incorrect shading to be generated.  The correct shading will be
  1297. Xgenerated only for the border tiles, and there will be some inaccuracies in
  1298. Xthe remaining shading.
  1299. X
  1300. XThe author has, however, found an efficient technique that relies on
  1301. Xtables of pre-calculated, rasterized shading.
  1302. X
  1303. XConsider this situation:
  1304. X
  1305. X          .          .          .          *
  1306. X        . .        . .        . .        * *
  1307. X          . . .          . . .          . . *          * * *
  1308. X        . 3 . .        . . . .        . . * *        . 3 * .
  1309. X      . . 2 . .      . . . . .      . . 2 * *      . . . . .
  1310. X    @ . . 1 . .    @ . . 1 * *    @ . . . . .    @ . . . . .
  1311. X
  1312. X         (6)         (7)         (8)         (9)
  1313. X
  1314. X'1,' '2,' and '3' represent solid objects.  (7), (8) and (9) are the shading
  1315. Xgenerated by the individual objects.  The total shading can be generated by
  1316. Xoverlaying (7), (8) and (9):
  1317. X
  1318. X          *
  1319. X        * *
  1320. X          * * *
  1321. X        . 3 * *
  1322. X      . . 2 * *
  1323. X    @ . . 1 * *
  1324. X
  1325. X        (10)
  1326. X
  1327. XThus the problem of calculating shading for an area can be reduced to one of
  1328. X"summing" the shadows that its individual tiles create.  This procedure is
  1329. Xstraightforward and won't be detailed in this short report.
  1330. X
  1331. XHOW TO STORE the pre-calculated shadows is a matter to consider, however.
  1332. XOne might expect a full set of shadows, say, out to a radius of 32, to
  1333. Xoccupy an inordinate amount of space, or, if tightly compressed, to present
  1334. Xproblems in retrieval.  But this turns out to be not nearly so bad.
  1335. X
  1336. XSymmetry considerations, first, reduce the number of shadows that must be
  1337. Xstored by a factor of 8, since only one "octant" (45-degree slice), as
  1338. Xshown above, need be calculated.
  1339. X
  1340. XThe shadows can be stored as a series of "rasters," using the following
  1341. Xrepresentation for each shadow:
  1342. X
  1343. X    byte
  1344. X    1    # of rasters in this shadow
  1345. X    2    #1 start
  1346. X    3    #1 end
  1347. X    4    #2 start
  1348. X    5    #2 end
  1349. X    ...
  1350. X
  1351. X(7), (8) and (9) can be translated as follows:
  1352. X
  1353. X    (7)    1 4-5
  1354. X    (8)    3 4-5 4-5 5-5
  1355. X    (9)    4 4-4 3-5 4-5 5-5
  1356. X
  1357. XThe full set of radius-32 shadows can, in fact, be stored in a readily-
  1358. Xaccessible table of LESS THAN 9000 BYTES.
  1359. X
  1360. X...
  1361. X
  1362. XI have written a prototype that uses this shading technique.  Missing
  1363. Xcertain optimizations in its current version, it still calculates a 32 x 32
  1364. Xarea in a relatively-constant 50 milliseconds on an 8MHz 68000.  The
  1365. Xmost efficient conventional LOS-based version that I have been able to write
  1366. Xtakes about 800 milliseconds. (!)
  1367. X
  1368. XI am working on a cleaner version of the prototype and table generator and
  1369. Xwill present them and a detailed report later (a couple of weeks?) in
  1370. Xrec.games.programmer.
  1371. X
  1372. X
  1373. Xv   v sssss|| joseph hall                      || 4116 Brewster Drive
  1374. X v v s   s || jnh@ecemwl.ncsu.edu (Internet)   || Raleigh, NC  27606
  1375. X  v   sss  || SP Software/CAD Tool Developer, Mac Hacker and Keyboardist
  1376. X-----------|| Disclaimer: NCSU may not share my views, but is welcome to.
  1377. X
  1378. X
  1379. END_OF_FILE
  1380. if test 8888 -ne `wc -c <'misc/shading'`; then
  1381.     echo shar: \"'misc/shading'\" unpacked with wrong size!
  1382. fi
  1383. # end of 'misc/shading'
  1384. fi
  1385. if test -f 'util/weapons/README' -a "${1}" != "-c" ; then 
  1386.   echo shar: Will not clobber existing file \"'util/weapons/README'\"
  1387. else
  1388. echo shar: Extracting \"'util/weapons/README'\" \(10766 characters\)
  1389. sed "s/^X//" >'util/weapons/README' <<'END_OF_FILE'
  1390. X
  1391. X>
  1392. X> Here's a question for all of you who have had experiences with HA's.  Is a
  1393. X> dagger a better weapon than say, a war hammer or an axe?  I've found a
  1394. X> bodkin [+8,+8] and a war hammer [+7,+8], and found that the dagger sold
  1395. X> for more in the stores.  Why?  Just because it is one up on To-Hit??  To me,
  1396. X> it would seem like the war hammer is a way better weapon...  Well, the
  1397. X> difference between the prices is about 1000 gp.
  1398. X>
  1399. X
  1400. X
  1401. X
  1402. Xok, here are some spoilers.
  1403. X
  1404. X
  1405. X1) dont trust what the store will buy or sell things for as being a
  1406. X   good indicator of its true value.  they basis it only on the base
  1407. X   value of a weapon, the to-hit and to-damage, and the special
  1408. X   abilities it has.  these are _not_ always what makes a weapon
  1409. X   really good, and what might be good for one character may be bad
  1410. X   for another.
  1411. X
  1412. X2) when in doubt, keep the dagger.  daggers are probably best for all
  1413. X   types of characters (mages, warriors etc) until you get your
  1414. X   strength and dexterity up real high.
  1415. X
  1416. X
  1417. Xa detail explanation of how things work follows...
  1418. X
  1419. X
  1420. Xthe amount of damage that a weapon will do is based on the following things:
  1421. X
  1422. X   * the weight of the weapon.  the lighter it is the more likely you
  1423. X     will get two hits in for each attack.  on the other hand, the
  1424. X     heavier the weapon, the more likely you are to get a critical hit
  1425. X     (good, excellent, great hits).
  1426. X
  1427. X   * the basic amount of damage the weapon does.  most daggers do 1d4,
  1428. X     two handed swords (Zweihander) do 4d6.
  1429. X
  1430. X   * your total to-hit.  this includes the pluses that come with your
  1431. X     weapon, the minuses that your armor does, any rings of to-hit or
  1432. X     slaying, etc.  the higher your total to-hit is, the more likely
  1433. X     you are to get a critical blow.
  1434. X
  1435. X   * your total to-damage.  like your total to-hit, this includes
  1436. X     everything.  when you get a really good character, this will
  1437. X     usually dominate over the weapons basic damage.
  1438. X
  1439. X   * your current strength.  the stronger you are the easier it is for
  1440. X     you to get several hits per attack.
  1441. X
  1442. X   * your current dexterity.  the more dextrous you are the more hits
  1443. X     per attack you are capable of.
  1444. X
  1445. X   * the level of your character.  the more experience you have the
  1446. X     more likely you are to get a "good (x2)" or "excellent (x3)" hit.
  1447. X
  1448. X
  1449. Xall of these things are mixed together in a rather complicated way.  i
  1450. Xhad to write a program that takes all of these factors into account
  1451. Xand gives a true indication of which weapon is better.  (i had two
  1452. XHA's that i couldnt decide between.  it turned out that depending on
  1453. Xmy current strength and dex either one could be much better than the
  1454. Xother.  i ended up keeping both of them until both my str and dex were
  1455. X18/100.)
  1456. X
  1457. X
  1458. Xthe chance that you actually hit the monster is based on:
  1459. X
  1460. X   * your "base to hit".  this is based on what race your character is
  1461. X     and ranges from -10 for Halflings to 20 for Half-Trolls.  it also
  1462. X     depends on what "class" your character is and these bonuses range
  1463. X     from 20 for mages to 70 for paladin's.  (warriors arent much
  1464. X     behind with a bonus of 68).  a human mage will have a "base to
  1465. X     hit" of 20, a half troll warrior will have a "base to hit" of 88.
  1466. X
  1467. X   * your current level.  the more experience you have, the more likely
  1468. X     you are to hit the monster.  going up one level is equivalent to
  1469. X     enchanting your weapon's to-hit by one.
  1470. X
  1471. X   * your total to-hit.  the higher your total to-hit, the more likely
  1472. X     you are to hit the monster
  1473. X
  1474. X   * the monsters ac (armor class).  the higher the monster's ac, the
  1475. X     less likely you are to hit the monster.  this varies a lot from
  1476. X     monster to monster.  most worm masses, mushrooms, jellies and
  1477. X     stuff have ac's under 10.  most of the ancient dragons have ac's
  1478. X     in the 80-100 range.  the balrog has an ac of 125, the highest of
  1479. X     any monster.  iron golems have an ac of 99, which can give you
  1480. X     some idea of how hard it would be to hit a ancient dragon without
  1481. X     taking too many risks.  most of the other monsters seem to to be
  1482. X     in the 30-60 range.
  1483. X
  1484. X   the formula for this is:
  1485. X
  1486. X      val = bth + 3*level + 3*tohit
  1487. X
  1488. X      if a random number between 1 and val is greater than the
  1489. X      monsters ac, then you hit, otherwise you miss.
  1490. X
  1491. X   you will always hit one out of 20 times, even if your weapon is too
  1492. X   heavy for you to wield.
  1493. X
  1494. Xi dont have anything to calculate calculate your chances to hit
  1495. Xmonsters because there are just too many different cases.  a level 40
  1496. Xhalf-troll warrior with a total to hit of 30 would have a two out of
  1497. Xthree chance of hitting a AMHD.  everyone else is going to going to be
  1498. Xwell under 50-50.
  1499. X
  1500. X
  1501. X
  1502. XThe program "calc_hits" can help you figure out which weapon is better
  1503. Xfor you now, and as your strength and dexterity goes up.  it is based
  1504. Xon the source code to moria so it should be basically correct.
  1505. Xcalc_hits isnt a fancy program and it handles errors by stopping the
  1506. Xprogram.  it is designed to be used by the person who wrote it. :->
  1507. X
  1508. X
  1509. Xprobably the best way to explain how to run the program is simply to
  1510. Xgive you an example run comparing a bastard sword, a dagger (stiletto)
  1511. Xand a two handed great flail.  all of them will be (+3,+4) giving you
  1512. Xa total to-hit of 2 and a total to-damage of 4.
  1513. X
  1514. Xthe results are given in a table form with the following field:
  1515. X
  1516. XMblow is the maximum number of blows you can get per attack.  it is
  1517. X      based only on your dex.
  1518. X
  1519. XBlows is the number of plows you can get with your current strength
  1520. X      based on the Mblows, and strength/weight ratio.
  1521. X
  1522. Xwt ratio is your strength to weight of weapon ratio.  a ratio above 10
  1523. X      doesnt do you any more good than a ratio of 10.  if the ratio is
  1524. X      under 2, you can only get one blow no matter what your dex is.
  1525. X
  1526. Xdam   is the amount of damage that you get, on the average if you hit
  1527. X      with every blow and dont get a critical hit.
  1528. X
  1529. Xw/ critical is the amount of damage you get on the average if you
  1530. X      include the possibilities of getting a critical hit.  for low
  1531. X      level characters, this rarely makes a difference.  for high
  1532. X      level characters, this can make a real difference.
  1533. X
  1534. X(wayne 6) % calc_hits
  1535. XEnter level of your character: 12
  1536. XEnter number of weapons: 3
  1537. XEnter weight, weapon_dam, to_hit, to_dam for weapon #0: 140 3d4 2 4
  1538. XEnter weight, weapon_dam, to_hit, to_dam for weapon #1: 12 1d4 2 4
  1539. XEnter weight, weapon_dam, to_hit, to_dam for weapon #2: 280 3d6 2 4
  1540. XEnter cstr, cdex: 11 14
  1541. X| Weapon | Max blows | Blows | weight ratio | hp of dam | w/ critical |
  1542. X|    0   |      2    |    1  |        0     |     11    |       12    |
  1543. X|    1   |      2    |    2  |        9     |     13    |       13    |
  1544. X|    2   |      0    |    0  |        0     |      0    |        0    |
  1545. X
  1546. XEnter cstr, cdex: 17 18
  1547. X| Weapon | Max blows | Blows | weight ratio | hp of dam | w/ critical |
  1548. X|    0   |      2    |    1  |        1     |     11    |       12    |
  1549. X|    1   |      2    |    2  |       14     |     13    |       13    |
  1550. X|    2   |      0    |    0  |        0     |      0    |        0    |
  1551. X
  1552. XEnter cstr, cdex: 18/20 18/10
  1553. X| Weapon | Max blows | Blows | weight ratio | hp of dam | w/ critical |
  1554. X|    0   |      3    |    2  |        2     |     23    |       25    |
  1555. X|    1   |      3    |    3  |       31     |     19    |       19    |
  1556. X|    2   |      3    |    1  |        1     |     14    |       17    |
  1557. X
  1558. XEnter cstr, cdex: 18/100 18/100
  1559. X| Weapon | Max blows | Blows | weight ratio | hp of dam | w/ critical |
  1560. X|    0   |      6    |    4  |        8     |     46    |       50    |
  1561. X|    1   |      6    |    5  |       98     |     32    |       32    |
  1562. X|    2   |      6    |    3  |        4     |     43    |       52    |
  1563. X
  1564. XEnter cstr, cdex:
  1565. X(wayne 7) % exit
  1566. X
  1567. X
  1568. X
  1569. X
  1570. X
  1571. Xthere is a second program called "mk_all_weapon" that generates a list
  1572. Xof how much damage all weapons will do given a certain character.  it
  1573. Xis useful for getting a feel of which weapons are good and why.
  1574. X
  1575. X
  1576. Xfor low level characters, the following are the top 5 weapons:
  1577. X
  1578. Xcharacter level of 12
  1579. Xtotal to-hit and to-damage of +7
  1580. Xstrength of 11.  these numbers wont change much until you get above 18
  1581. Xdexterity of 17.  these numbers will be the same unless your dex is
  1582. X                  above 18/01 or below 10.
  1583. X
  1584. X          Name                | Mblow | Blows | wt ratio | dam | w/ critical |
  1585. XDagger (Stiletto)             |   2   |    2  |    9     |  19 |       19    |
  1586. XDagger (Misercorde)           |   2   |    2  |    7     |  19 |       19    |
  1587. XDagger (Bodkin)               |   2   |    2  |    5     |  19 |       19    |
  1588. XMorningstar                   |   2   |    1  |    0     |  14 |       15    |
  1589. XKatana                        |   2   |    1  |    0     |  14 |       15    |
  1590. X
  1591. Xthe bottom 5 for a low level character:
  1592. X
  1593. XFauchard                      |   0   |    0  |    0     |   0 |        0    |
  1594. XExecutioner's Sword           |   0   |    0  |    0     |   0 |        0    |
  1595. XBeaked Axe                    |   0   |    0  |    0     |   0 |        0    |
  1596. XBattle Axe (European)         |   0   |    0  |    0     |   0 |        0    |
  1597. XBattle Axe (Balestarius)      |   0   |    0  |    0     |   0 |        0    |
  1598. X
  1599. X
  1600. X
  1601. Xfor high level characters, the following are the top 5 weapons:
  1602. X
  1603. Xcharacter level of 36
  1604. Xtotal to-hit and to-damage of +20
  1605. Xstrength of 18/100.
  1606. Xdexterity of 18/100.
  1607. X
  1608. X          Name                | Mblow | Blows | wt ratio | dam | w/ critical |
  1609. XKatana                        |   6   |    5  |    9     | 137 |      161    |
  1610. XWar Hammer                    |   6   |    5  |    9     | 130 |      153    |
  1611. XLucerne Hammer                |   6   |    5  |    9     | 130 |      153    |
  1612. XTwo Handed Sword (Claymore)   |   6   |    4  |    5     | 122 |      151    |
  1613. XTwo Handed Sword (No-Dachi)   |   6   |    4  |    5     | 120 |      149    |
  1614. X
  1615. Xthe bottom 5
  1616. X
  1617. XTwo Handed Great Flail        |   6   |    3  |    4     |  91 |      120    |
  1618. XBall and Chain                |   6   |    4  |    7     | 100 |      120    |
  1619. XAwl-Pike                      |   6   |    4  |    7     |  98 |      118    |
  1620. XLance                         |   6   |    3  |    3     |  87 |      117    |
  1621. XFauchard                      |   6   |    4  |    6     |  84 |      102    |
  1622. X
  1623. X
  1624. X
  1625. Xthe katana tends to be at or near the top for all characters at all
  1626. Xtimes.  if you get even a poor katana (HA) or (DF), keep it and enchant
  1627. Xit.
  1628. X
  1629. X
  1630. Xone of the biggest mistakes people do is get rid of the weapon that
  1631. Xthe start with and try to get a "bigger meaner" weapon.  dont.  just
  1632. Xenchant your original weapon until you get something really good.  i
  1633. Xdont consider the (FT), (FB), (SD), (SE) and (SU) as "really good".  i
  1634. Xconsider the "(SM)" good, only if i dont already have something of see
  1635. Xinvisible.  (HA) and (DF)'s i keep if they are better than the ones i
  1636. Xalready have.
  1637. X
  1638. X
  1639. X-wayne
  1640. END_OF_FILE
  1641. if test 10766 -ne `wc -c <'util/weapons/README'`; then
  1642.     echo shar: \"'util/weapons/README'\" unpacked with wrong size!
  1643. fi
  1644. # end of 'util/weapons/README'
  1645. fi
  1646. echo shar: End of archive 31 \(of 39\).
  1647. cp /dev/null ark31isdone
  1648. MISSING=""
  1649. 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 ; do
  1650.     if test ! -f ark${I}isdone ; then
  1651.     MISSING="${MISSING} ${I}"
  1652.     fi
  1653. done
  1654. if test "${MISSING}" = "" ; then
  1655.     echo You have unpacked all 39 archives.
  1656.     echo "Now run "bldfiles.sh" to build split files"
  1657.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1658. else
  1659.     echo You still need to unpack the following archives:
  1660.     echo "        " ${MISSING}
  1661. fi
  1662. ##  End of shell archive.
  1663. exit 0
  1664.