home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #18 / NN_1992_18.iso / spool / comp / sources / games / 191 < prev    next >
Encoding:
Internet Message Format  |  1992-08-22  |  55.9 KB

  1. Path: sparky!uunet!zephyr.ens.tek.com!master!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v14i061:  umoria4 - single player dungeon simulation (ver. 5.5), Part29/39
  5. Message-ID: <3425@master.CNA.TEK.COM>
  6. Date: 22 Aug 92 22:14:05 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 1428
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: grabiner@math.harvard.edu (David Grabiner)
  12. Posting-number: Volume 14, Issue 61
  13. Archive-name: umoria4/Part29
  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 29 (of 39)."
  26. # Contents:  OOChanges.1 source/scrolls.c util/showmon.c
  27. # Wrapped by billr@saab on Thu Aug 20 09:11:34 1992
  28. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  29. if test -f 'OOChanges.1' -a "${1}" != "-c" ; then 
  30.   echo shar: Will not clobber existing file \"'OOChanges.1'\"
  31. else
  32. echo shar: Extracting \"'OOChanges.1'\" \(27455 characters\)
  33. sed "s/^X//" >'OOChanges.1' <<'END_OF_FILE'
  34. X:::::1987 Fixes:::::
  35. X87 fixes deleted, see the 4.85 or 4.87 sources
  36. X:::::1988 Fixes:::::
  37. X88 fixes deleted, see the 4.88 sources
  38. X:::::1989 Fixes:::::
  39. X---------------------  2/26
  40. Xall files: merged the umoria and PC-Moria sources
  41. Xcreature.c: get_moves(), 12 numbers were wrong for monster movement
  42. Xwizard.c: a few more int to bigint_t changes needed in wizard mode commands
  43. Xfiles.c: fix columns in monster dictionary so that everything lines up
  44. Xmisc2.c, moria2.c: line up columns for print_new_spells() and examine_book()
  45. X8 files: replace == with = in comments and strings
  46. Xmagic.c, misc1.c, misc2.c, moria2.c, signals.c: missing/misplaced breaks
  47. Xmonsters.c: 2 grey snakes, renamed one to green
  48. Xmisc1.c: compact_objects, stmt which decrements cur_dis in wrong place
  49. Xspells.c: disarm_all should not set traps to zero, should just clear trap
  50. X    bits
  51. Xmoria2.c: in jamdoor() i_ptr->p1 should be t_ptr->p1
  52. Xmoria2.c: in place_trap(), covered pits should transform to open pits
  53. Xmoria2.c: mon_take_hit(), int i should be bigint_t i
  54. Xio.c: more prompt will now accept space/escape/return/linefeed
  55. Xio.c: EOF code did not work on machine with unsigned characters
  56. X------------------------ 2/27
  57. Xsave.c: missing controlz calls on error returns
  58. Xcreature.c: don't let non-moving creature move if glyph prevented it
  59. X    from attacking
  60. Xcreature.c: give monsters a chance to recover from Bash, depends on
  61. X    square of monster level
  62. Xmoria2.c: give monsters a chance to ignore bash, function of hitpoints
  63. X    and level
  64. Xspells.c: fixed restore_level, needed while loop
  65. Xmoria2.c: monster_multiply(), i=18 statement in wrong place, would not
  66. X    always multiply monster when it should
  67. X--------------------- 3/2
  68. Xmoria1.c: get_panel(), add one to y and x on lines 945/950, prevent scrolling
  69. X    while inside rooms
  70. X--------------------- 3/9
  71. Xwizard.c: tmp_val = -999; for gold changed to tmp_lval
  72. Xsignals.c: added SIGXCPU to list of signals that cause panic save
  73. Xspells.c: call monster_name before mon_take_hit in fire_bolt()
  74. Xmoria2.c: move_char (), stop before attacking a creature
  75. Xdungeon.c: added move_char (5) to see_infra and see_invis setting and clearing
  76. X--------------------- 3/10
  77. Xcreature.c: added take_hit (0, ddesc) line to every monster spell, ensure
  78. X    that player leaves resting/find/search modes
  79. Xpotions.c: remove chp += mhp code from gain const potion, now chp = mhp
  80. Xmoria2.c: change monster_death(), summon_object 4d2 instead of 4d3
  81. X    so that comments match code
  82. Xcreature.c: make_move(), prevent monster from moving again after opening
  83. X    a door, also, make chance of opening locked door dependant on monster
  84. X    level
  85. Xmonsters.c: giant red ant lion, not hurt by fire, move&attack normally
  86. X--------------------- 5/5
  87. Xgenerate.c: fixed error in generation of type 3 (subtype 3) rooms
  88. Xmisc2.c, config.c: added alternate wizard code/definitions
  89. Xtreasur1.c: restore mana potion made more valuable (35 -> 350)
  90. X        staff of speed value increased   (800 -> 1000)
  91. X        ring of sustain charisma level changed (7 -> 44)
  92. X        ring of stupidity level decreased  (20 -> 7)
  93. X        potion of gain strength value increased  (200 -> 300)
  94. Xvariable.c: halfling clan elder had 0% chance
  95. X        gave warrior higher base to hit chance than paladin
  96. Xstore1.c: digging tools must be identified before price is adjusted
  97. Xmisc1.c:  do not adjust cost of digging tools based on value of p1
  98. X      change all mods to fields toac/todam/tohit to be += or -=
  99. X      several items (mostly cursed items) needed %P1 added to name
  100. X      for digging tools, inc p1 instead of replacing it, so that tools
  101. X         will still have same minimum values as specified in treasur1.c
  102. Xmonsters.c: Forest Wight should be able to open doors.
  103. X        Grey Wraith should not drain mana
  104. Xmoria1.c: fix stealth so that it uses the value of p1
  105. Xtreasur2.c: change 'a's to '&'s for doors
  106. Xspells.c: word of destruction should not put wall over character
  107. X      Could not use wand of drain life at a distance
  108. Xmoria2.c: when in find mode, attack if run into creature only if can't see it
  109. X-------------------------5/7
  110. Xmoria1.c,moria2.c: remove heavy weapon message from test_hit and put it in
  111. X  py_attack instead
  112. Xspells.c: teleport_away now calls unlite_spot if necessary, fixes bug that
  113. X    I thought had been fixed 3/28/88
  114. Xsave.c: for MSDOS: when restore save file, must search object list for secret
  115. X    doors/traps, and convert the '#/.' char to wallsym/floorsym, when save
  116. X    file, must do the reverse translation
  117. Xspells.c: unlight_area() was really messed up, is much shorter now, will
  118. X    always print "darkness" message now if it should
  119. Xmisc1.c: cleaned up prt_map(), probably much faster now
  120. Xmoria1.c: cleaned up light_room(), draw_block(), sub2_move_light(),
  121. X    they are probably much faster now
  122. Xall:  changed print(char *, int, int) to print(char, int, int) in io.c
  123. Xmisc1.c: crown of the magi, now has RL instead of see invisible
  124. X---------------------- 5/8
  125. Xall: checked uses of fm/pl/tl for consistency,eliminate extra parens/tests/etc
  126. Xdeath.c: changed call to exit(1) to exit_game instead,
  127. Xio.c, dungeon.c: new function move_cursor_relative to position cursor on map
  128. X--------------------- 5/13
  129. XMoria.doc: added changes to bring it up-to-date, ran through Spell again
  130. X--------------------- 5/18
  131. Xspells.c: polymorph monster spell incorrect, missing an else flag = TRUE line
  132. Xmoria2.c: fix setting of reset_flag in find mode in move_char() routine
  133. XMoria.doc: created MacWrite version for Macintosh, plus some more editing
  134. X    corrections
  135. X--------------------- 5/29
  136. Xdeath.c, externs.h, files.c, io.c, misc2.c, moria2.c: eliminated the function
  137. X    pad, replaced most calls with printf %-30s formats
  138. Xdeath.c: rewrote fill_str and renamed it to center_string, previously was
  139. X    returning pointer to local variable
  140. Xdeath.c: eliminated dprint, replaced it with calls to put_buffer
  141. Xsignals.c: suspend handler now saves/restore special local chars (^R, ^W, etc)
  142. Xgenerate.c: rewrote blank_cave, should be a bit faster now
  143. Xexterns.h, io.c, misc1.c, variable.c: eliminate used_line array, no longer
  144. X    call erase_line in prt_map in misc1.c
  145. Xmisc2.c, moria1.c, store2.c: make sure cursor is always in the right
  146. X    place after an inkey call
  147. Xcreate.c, misc2.c: rewrite put_character and associated routines, line up
  148. X    columns, eliminate strcat/strcpy calls
  149. Xfiles.c: rewrote file_character so that it matches put_character, etc.
  150. Xio.c: fixed put_buffer so that it won't print past right edge of screen
  151. Xfiles.c, misc1.c, moria1.c, ms_misc1.c: loc_symbol rewritten, now checks
  152. X    values of pl/tl/fm, did not correctly handle monsters which were
  153. X    visible, but were not in a lighted spot
  154. Xmoria1.c, io.c: rest() only erases MSG_LINE now if original 'hit ... to quit'
  155. X    message displayed, new function in io.c erase_non_msg does this
  156. Xmisc1.c: magic_treasure(), fixed helms which had wrong else level of cursed
  157. X    items, added cursed rings of searching, set p1 value for amulet of magi
  158. X---------------------- 5/30
  159. Xtreasure1.c, treasure2.c: three axes changed from type 21 to 22, this prevents
  160. X    the Priest shop from buying these weapons
  161. X--------------------- 6/2
  162. Xcreature.c, moria1.c, moria2.c, spells.c, types.h: massive reorganization
  163. X    of the way that visible monsters are handled, now ml is set if and
  164. X    only if the creature is visible on screen
  165. Xcreature.c, externs.h, moria2.c: procedure check_mon_lite removed, calls to
  166. X    it replaced by calls to update_mon ()
  167. Xmisc1.c: delete unused code
  168. Xcreature.c, moria2.c: two places needed to test fm in addition to pl and tl
  169. Xspells.c: need to set fm/tl/pl before call to lite_spot/change_trap, eliminate
  170. X    some unncessary calls to lite_spot, eliminate unneccsary clearing of fm
  171. X------------------------- 6/8
  172. Xdungeon.c, moria1.c, moria2.c: allow searching while blind, decrease chance of
  173. X    successs if blind or have no light
  174. Xmoria1.c, moria2.c, store2.c: change prt("", x, y) to erase_line (x, y)
  175. Xmisc2.c: replace all "\0" with just ""
  176. Xio.c, moria2.c, scrolls.c, store2.c: add '.' to end of sentences
  177. Xdungeon.c, misc2.c, moria2.c, scrolls.c, store2.c: add msg_flag = FALSE after
  178. X    lots of msg_prints, to make sure never get " -more" message line
  179. Xcreature.c, dungeon.c, spells.c, staff.c: don't print 'light' message if blind
  180. Xmoria2.c: disarm_trap(), make no_light and blind same penalty, increase
  181. X    blind/no_light and confused penalties
  182. Xmoria1.c: rewrote area_affect, delete redundant code, don't stop at doorway
  183. X    if no_light and it is unlit
  184. Xgenerate.c: fixed error in build_tunnel, stack points could overrun stack
  185. X------------------------ 6/9
  186. Xmoria1.c: change test_hit so that always miss 1/20, and always hit 1/20
  187. Xmoria1.c, moria2.c, spells.c: changed fval incorrectly when manipulating
  188. X    doors, only change to corr_floor2 if next_to4 a room space
  189. Xcreature.c: in get_moves, change 1.732 to 2, makes it faster, also can no
  190. X    longer circle monsters by moving in a diamond shape
  191. Xdeath.c, io.c, files.c, main.c: for MSDOS, don't leave the highscore_fd file
  192. X    open permanently
  193. Xsave.c: save value of total_winner, in case of a forced call to save_char()
  194. Xall, types.h: deleted MSDOS ifdefs, the bytlint/byteint/wordint/worlint type
  195. X    definitions were confusing, so changed all to int8/int8u/int16u/int16
  196. Xgenerate.c: rewrote loops to try to speed up level generation
  197. X---------------- 6/12
  198. Xmisc1.c: for items with duplicates in treasure1.c, set level of all equal
  199. X    to that of lowest
  200. Xtreasur2.c: several items did not match same item in treasure1.c
  201. X----------------- 6/13
  202. Xtreasur2.c: wands/staffs in store now have same level as those in dungeon
  203. Xdungeon.c, misc2.c, moria1.c, ms_misc.c, store2.c: removed some ASCII
  204. X    dependencies
  205. X------------------ 6/16
  206. Xexterns.h, constants.c, generate.c, misc1.c: fixes to make level generation
  207. X    faster, rearrange order build_tunnel makes comparisons, call
  208. X    correct_dir directly instead of through rand_dir, rewrite loops,
  209. X    rewrite next_to4, rewrite next_to8
  210. Xexterns.h, files.c, misc1.c, moria1.c, ms_misc.c: loc_symbol returns char
  211. X== the following are due to CJS (Bruce Moria)
  212. Xcreate.c: in get_money(), charisma was subtracted and added, now only add
  213. Xdesc.c: unquote() did not work at all, rewrote the whole thing
  214. X    in identify, string[0] == 'T' should be string[1]
  215. Xmoria1.c: area_affect, for direction 1, the 3 should be a 2
  216. Xmisc2.c, moria2.c, scrolls.c, spells.c, store2.c: change msg_print(" ") to ""
  217. Xstore2.c: eliminate erase_line/display_commands at end of purchase_haggle
  218. Xconfig.h: for defined(Pyramid), define ultrix
  219. Xeat.c: py.stats.intel to s_ptr->intel
  220. Xcreature.c:  in make_move(), set m_ptr at begining of function,
  221. X      in mon_move(), set m_ptr at begining of function,
  222. X    test cmove before calling randint in mon_move()
  223. X    change if (randint(10) > py.misc.stl) to && (randint(...))
  224. Xdungeon.c: move random teleport outside innermost loop, put with other checks
  225. X== end CJS fixes ==
  226. Xcreature.c: collapse a large number of if (...) if (...) constructions
  227. X    to if (... && ...)
  228. Xconstant.h, desc.c, externs.h, generate.c, misc1.c, rnd.c, save.c,variables.c:
  229. X    all versions now use rnd(), rnd does not use SYSV calling conventions
  230. X    anymore    BSD random() states eliminated
  231. Xgenerate.c: added code to build_tunnel to prevent infinite loops
  232. X--------------- 6/19
  233. X*.c: collapse a large number of if (...) if (...) constructions
  234. X    to if (... && ...), delete unneeded braces
  235. X---------------- 6/21
  236. Xcreature.c, spells.c: build_wall and earthquake, now kill monster if it can
  237. X    not move through walls, and it can not move out of the way of the new
  238. X    wall, also, does more damage to those that escape, in creature.c,
  239. X    if in wall, must escape to empty space
  240. X----------------- 7/17
  241. Xmain.c: added a setbuf call, for buffered output
  242. X------------------ 8/4
  243. Xmerging changes due to Christopher J Stuart...zillions of changes
  244. Xstat structure changed
  245. Xexterns.h: move functions definitions for lint to here
  246. Xcreate.c: help functions sorta' added, money now more dependent on stats,
  247. X      really good/bad characters eliminated, etc...
  248. X------------------ 8/8
  249. Xcreature.c: new function disturb used, stop attacks if player dead, add
  250. X    message for two attacks which had no message, confuse-monster only
  251. X    works if monster actually hits, door bashing different and noisy too!,
  252. X    creatures only eat lower level creatures, monster drawing changed,
  253. X    monster memory added, etc...
  254. X------------------ 8/9
  255. Xdesc.c: eliminate lots of unnecessary strcpy/strlen/etc calls, can inscribe
  256. X    objects, store/dungeon objects will be merged in the inventory when
  257. X    objects are identified, if curse a special object it loses its
  258. X    special ability, %d code for damage, %a code for armor, etc...
  259. Xeat.c: misc changes...
  260. X----------------- 8/11
  261. Xhelp.c: moved help text into files, added monster recall info, etc...
  262. X----------------- 8/14
  263. XMoria.doc: editing changes, removed lots of unnecessary hyphens
  264. Xio.c: rebuilt it (accidentally deleted current version)
  265. Xdeath.c: scoring procedures moved elsewhere, print_tomb more efficient and
  266. X    uses far less stack, final char display different, upon_death
  267. X    changed to exit_game, etc...
  268. Xgenerate.c: added STATIC and void
  269. Xmagic.c: reduce indentation, increase spell damage, 7 dam/mana for Magic
  270. X    Missle, 4 d/m for balls, 5 d/m for bolts, etc...
  271. Xmisc1.c: crowns higher chance of magic, monster dist changed to increase
  272. X    chance of higher level monsters, unnecessary uid/eid calls deleted,
  273. X    m_level changed to include level[0] monsters, highlighting for ores,
  274. X    disappear percentages for objects in compact_obj() modified, '!'
  275. X    char added to magic descriptions, damage added to bows
  276. X------------------- 8/15
  277. Xmisc2.c: print message if gold/object created under player, stat handling
  278. X    completely changed, new func title_strings, search/rest/paralysis/count
  279. X    message print changed, new func prt_speed(), new stat functions, can
  280. X    hide stat changes if unknown, get_name uses loginname if none entered,
  281. X    change_name can print to file, inven drop/carry/etc changed to be
  282. X    a little simpler, new func join_names, spell_chance/learn_spell/etc
  283. X    chnaged to be a little simpler, get_spell with capital letter verifies
  284. X    choice, etc...
  285. X---------------------- 8/16
  286. Xmonsters.c: no change
  287. Xtreasure1.c: %d added to weapons, %a added to armor, plus to dam added to
  288. X    bows, mage's guide should be mages' guide?? appostrophe removed
  289. X---------------------- 8/17
  290. Xtreasure2.c: change & in traps to a/an, scroll/potion subvals changed to 200
  291. X    plus value in treasure1.c, etc...
  292. Xpotions.c: every potion prints message, ident true only if something noticable
  293. X    happens, greatly reduce indentation, stat handling different, etc...
  294. Xprayer.c: reduce indentation greatly, use up mana if prayer fails, etc...
  295. Xscrolls.c: reduce indentation, only ident if something noticable happens,
  296. X    for identify must search for new location of scroll, etc...
  297. Xsets.c: ifdef out unused functions
  298. Xdungeon.c: add command counts, use new func disturb(), double regen if
  299. X    searching, damage if really hungry, messages for protevil resist_heat
  300. X    and resist_cold, new code for quiting rest mode, move teleport code
  301. X    outside inner loop, add code to check strength/weight, find mode
  302. X    done differently now, allow ^char for control characters, all
  303. X    command chars translated to rogue_like chars, new commands = (options)
  304. X    { (inscribe) V (view scores) M deleted but W improved : (map area)
  305. X    rogue-like summon ^S -> &, etc...
  306. X---------------------- 8/24
  307. Xfiles.c: init_scorefile deleted, intro->read_times, don't modify argv,
  308. X    new func helpfile, print_map deleted, print_monsters deleted,
  309. X    file_character now takes filename as argument, etc...
  310. Xio.c: lint defs, new suspend function, much better curses handling,
  311. X    new func moriaterm and restore_term, inkey does refresh on ^R, flush
  312. X    should work now, new funct get_check, save_screen, restore_screen,
  313. X    etc...
  314. Xconstant.h: add defs for STATIC, ESCAPE, stats, increase treasure in
  315. X    streamers, change store min and turnaround amount, MAX_MON_NATTACK,
  316. X    MAX_EXP
  317. Xwands.c: inscribe wand if empty, reduce indentation, etc...
  318. Xstaffs.c: inscribe staff if empty, reduce indentation, etc...
  319. Xspells.c: identify- update stats if affected, allow ident of equip items;
  320. X    better light_line messages; when set pl false, must set fm false also;
  321. X    misc, etc...
  322. X------------------- 8/29
  323. Xmoria1.c: new function enchanted(), part of py_bonuses split into
  324. X    calc_bonuses, cur_char1/2 deleted, complete rewrite of inven_command
  325. X    routines, new functions check_weight/verify, can display weights,
  326. X    get_item can show either inven or equip, options added, run code
  327. X    completely rewritten, misc, etc...
  328. X--------------- 8/30
  329. Xstore1.c: item_value has *item->number removed, many routines changed to pass
  330. X    item pointer, identify removed from store_carry, known1/2 put in
  331. X    store_create, store_maint alg changed, etc...
  332. Xstore2.c: clean up handling of msg_flag, incremental haggling in get_haggle(),
  333. X    display_command moved from purchase/sell_haggle to store_purchase/sell,
  334. X    enter_store code cleaned up, etc...
  335. Xconfig.h: misc...
  336. Xexterns.h: add new variables, delete old variables, rearrange stuff, etc...
  337. Xtypes.h: added logging structure and recall structure, etc...
  338. Xvariables.c: add new variables, delete old variables, rearrange stuff,
  339. X    remove learn from spell structure, change titles so none shared
  340. X    between classes, etc...
  341. X-------------- 8/31
  342. Xmoria2.c: weight bug fixed, py_attack did not decrement inven_weight when
  343. X    inven_wield was a missile, and the player was carrying more than one
  344. X    of them
  345. X-------------- 9/1
  346. Xmoria2.c: carry has pickup option, new functions for inscribing objects,
  347. X    summon_objects returns type/number of objects created, ditto
  348. X    monster death, new function check_view, add todam for using bow/arrow,
  349. X    bashing changes, new sub py_bash extracted from old bash code,
  350. X    jamdoor p1 values changed successive spikes have smaller effect,
  351. X    etc...
  352. X------------- 9/2
  353. Xmain.c: add bruce moria comment, new options, read environment variables, etc.
  354. Xwizard.c: wizard can change weight and speed of character, etc...
  355. Xunix.c: new file, contains UNIX specific code for user_name, check_input, and
  356. X    system()
  357. Xsignals.c: completely rewritten to be much nicer, same functionality
  358. Xrecall.c: new file, for printing out monster memory info
  359. Xsave.c: completely rewritten, same functionality, I think
  360. X------------- 9/7
  361. Xlint on mips machine
  362. X------------- 9/8
  363. Xlint on AIX (SYS V)
  364. X------------- 9/9
  365. Xlint on ultrix
  366. X------------- 9/11
  367. Xfix anonymous errors in order to get the program to compile...
  368. Xio.c, ms_misc.c: put screen_map in io.c, and made it a default feature
  369. Xsignals.c, main.c, io.c: on EOF, the program now returns ESCAPE char until
  370. X    exits dungeon(), then saves with no penalty
  371. X------------ 9/12
  372. Xexterns.h, desc.c, variables.c, types.h: mushrooms/colors/rocks/etc changed to
  373. X    char pointers instead of char arrays, saves space, make random init
  374. X    faster, change player title to char pointers also
  375. Xmoria1.c, potions.c, misc2.c, eat.c, dungeon.c, creature.c: cleanup handling
  376. X    of chp and cmana, call prt_c* only once every time they change
  377. Xdungeon.c: set pointers only once at start of procedure
  378. Xeat.c: reduce indentation
  379. Xio.c, dungeon.c: remove msg_flag = FALSE line from inkey and put it in
  380. X    dungeon.c where get command
  381. X------------ 9/14
  382. Xcreature.c: change put_qio calls to just setting screen_change to true
  383. Xdungeon.c: remove superfluous erase_line and put_qio calls
  384. Xmany: make character numbers more clear, 'a' for 97, DELETE for 127, etc...
  385. Xdesc.c: objdes() bug with ins_buf handling, now clear ins_buf if none
  386. Xmany, moria1.c: made "Which dir?" default for get_dir()
  387. X-------------- 9/15
  388. Xmisc1.c, monsters.c, treasur[12].c, many others: changed all hit ponts from
  389. X    strings to a char array of size two, changed damroll to take two
  390. X    characters instead of a string, this eliminates most all scanf calls
  391. X-------------- 9/18
  392. Xmonsters.c, creature.c, types.h: replaced strings containing monster attacks
  393. X    with 4 byte array containing index into a monster attack table,
  394. X    this eliminates the rest of the scanf calls, and saves space
  395. Xcreature.c: many duplicate damroll calls in make_attack collapsed into
  396. X    a single damroll call
  397. Xmoria2.c: in chest_trap(), moved exploding chest trap to end to avoid
  398. X    dangling pointer problem; in twall, only light spot if c_ptr->tl
  399. X    is true;
  400. Xwizard.c, recall.c, desc.c, files.c: changes to fix handling of new damage
  401. X    types for monsters and weapons
  402. X---------------- 9/19
  403. Xmany files: eliminated redundant trap_lista, fixed place_trap so that it
  404. X    no longer takes a typ parameter, change_type no longer calls
  405. X    place_trap, negative level values for traps all made positive
  406. X    and diasrm_object() changed appropriately
  407. Xexterns.h, dungeon.c, misc2.c, moria1.c, variables.c: eliminated print_stat
  408. X    variable since it was not used very much
  409. X---------------- 9/21
  410. Xcreate.c, externs.h, variable.c: eliminated bit_array variable
  411. Xvariable.c: eliminated names of unused Rogue class spells
  412. Xmany files...: changed the floor/wall definitions from variables to constants,
  413. X    changed the values to make tests easier, all fval comparisons now use
  414. X    manifest constants, door type floors eliminated since new find/run
  415. X    code made them unnecessary
  416. Xconstant.h, misc2.c, externs.h, variable.c: changed var stat_column to
  417. X    constant, eliminated password variables
  418. Xmany files: changed moria_flag to new_level_flag, and reset_flag to
  419. X    free_turn_flag
  420. X------------- 9/23
  421. Xmerged Xenix diffs and Atari ST diffs
  422. Xtreasure1.c: potion of sleep no longer cures blindness
  423. Xwands.c: wand of wonder was wrong had 2 << randint() instead of 1 << randint()
  424. Xeat.c, potions.c, scrolls.c, staffs.c, treasur2.c, wands.c: added store
  425. X    bought flag 0x80000000 to all food/potion/scroll/staff/wand objects
  426. X    in treasure2.c, modifed the code so that these objects do not give
  427. X    experience when used
  428. Xall files: removed all floating point code except for randnor() and los()
  429. Xmany files: hp_player(-damage,"") calls did not work, change them all to
  430. X    direct calls to take_hit(damage),  hp_player string parameter
  431. X    removed since no longer used
  432. X------------- 9/25
  433. Xconstant.h, config.h, externs.h, variable.c, misc1.c, misc2.c, potions.c:
  434. X    floating point randnor code replaced by integer on that uses a table,
  435. X    definition of MAXINT removed so there are now no differences between
  436. X    16 bit and 32 bit versions of moria, MAXSHORT and MAXLONG defined
  437. XMakefile, misc1.c, externs.h: calls to floor removed, math library no longer
  438. X    used!!, DONT_DEFINE_CLASS def for SUN4 no longer needed
  439. X------------- 9/27
  440. Xmisc1.c: replaced los code with an integer arithmetic version by jnh (Joseph
  441. X    Hall), moria now uses no floating point numbers
  442. Xdungeon.c, files.c, moria1.c, store2.c, wizard.c: removed all sscanf calls
  443. X    except for those in ms_misc.c, and one "%lx" in wizard.c
  444. X------------ 9/28
  445. Xtreasure1.c, treasure2.c, types.h: change subval and number to 8 bit integers,
  446. X    move flags after name, move number before weight, save 12 bytes per
  447. Xconstants.h, etc: INVEN_MAX definition removed, INVEN_ARRAY_SIZE 1 smaller
  448. Xvariable.c: store_choice now array of 8 bit integers
  449. Xmonsters.c, treasure2.c: change t_level and m_level to array of 16 bit ints
  450. Xmany: interpretation of subval changed to fit it into byte, new range uses
  451. X    p1 to decide whether stacking permitted, torches can now stack
  452. Xcreate.c, types.h: changed size of history from 400 to 240 characters,
  453. X    also print as lines of 60 instead of lines of 70
  454. Xvariable.c, misc2.c, types.h: changed definition of spell_type from 12 to 6
  455. X    bytes, new array spell_names to prevent duplicate strings,
  456. X    no longer have entry for warriors
  457. Xvariable.c, types.h: human female too light, made 150 from 120, also changed
  458. X    every base/mod field from 16 bits to 8 bits
  459. Xtypes.h, variable.c: in background_type, change next and bonus fields to
  460. X    8 bit integers, added 50 to bonus to make it positive
  461. X----------------- 9/29
  462. Xmonsters.c: massive changes to monster file to fix inconsistencies
  463. X----------------- 9/30
  464. Xset.c: make flasks of oil vulnerable to frost and fire, like potions
  465. Xmoria2.c: if set off a trap, temp set confused to zero to ensure that player
  466. X    will move onto the trap instead of in random direction
  467. Xio.c, externs.h: confirm() no longer used, deleted
  468. Xtreasur1.c, treasur2.c: give non overlapping subvals to potions/scrolls,
  469. X    duplicate ones caused problems for giving random names
  470. Xdesc.c, treasur1.c: %M for mushrooms changed to %m
  471. Xrecall.c: fix printing of monster hit points, two numbers instead of a string
  472. Xmoria2.c: new look code from bruce moria, look in arcs so that can see
  473. X    anything on the screen, allows access to monster memories
  474. Xgenerate.c, misc2.c, moria1.c, moria2.c: various fixes to reduce code size,
  475. X    increase speed, etc...
  476. Xmisc1.c, etc...: popm and popt no longer take a pointer, instead return int,
  477. X    pusht takes an int8u now instead of an int as a parameter
  478. X---------------- 10/1
  479. Xall: added copyright notice to every *.[ch] file
  480. X--------------- 10/3
  481. Xconfig.h, creature.c, recall.c, save.c: fixed a few bugs picked up by the
  482. X    ultrix compiler
  483. Xdungeon.c: disabled the save command
  484. X-------------- 10/6
  485. Xcreate.c, files.c, dungeon.c, main.c, save.c: wrote helpfile function,
  486. X    changed calling sequence so that caller does not have to do anything
  487. Xconstant.h, desc.c, variables.c: eliminated lots of excess colors/rocks/etc.
  488. X    eliminated all duplicates except between potions and mushrooms
  489. Xtypes.h: fixed _frac problem with exp and chp, had to be unsigned shorts
  490. Xmisc1.c: made traps invisible again
  491. Xmoria1.c, moria2.c, store2.c: replaced strcpy(string, "constant") code with
  492. X    p = "constant" where possible
  493. Xtreasure1.c, treasure2.c: changed subvals for wands/staffs/amulets so that
  494. X    they start at zero, and don't have any missing numbers
  495. Xspells.c: teleport_away() must clear m_ptr->ml before calling update_mon()
  496. Xmoria1.c, spells.c: check lite_spot() calls, eliminate unnecessary ones
  497. Xdeath.c, misc2.c, wizard.c: eliminated lots of unnecessary blanks in string
  498. X    constants
  499. X--------------- 10/7
  500. Xmisc1.c, moria2.c, treasure1.c, treasure2.c: fixed lamp/torch subvals, again
  501. X    can not let torches have subval >= 64, the torch wield code will
  502. X    not work
  503. Xstore1.c: don't let items with subval >= 192 stack in stores, they are
  504. X    always handled as a group anyways
  505. Xspells.c: fire_bolt and fire_ball fixed in regards creature lighting
  506. Xvariable.c: store_choice for temple wrong because broad aze renumbered
  507. X    earlier, changed 13-15 to 12-14
  508. Xconstant.h, dungeon.c, moria1.c: added print ac flag to status field,
  509. X    calc_bonus sets flag, prevent printing AC while in store
  510. Xcreate.c: dis_ac must have dis_tac added to it
  511. Xspells.c: detect_monster evil and insivible now set m_ptr->ml when
  512. X    print monster on screen, then creature() will correctly erase them
  513. X--------------------- 10/8
  514. Xtypes.h: fixed _frac problem with cmana, had to be unsigned short
  515. Xmoria1.c: in inven_command wear code, print 'too heavy' message after
  516. X    print wielding message
  517. Xstore1.c: item_value, must multiply value by item->number before returning
  518. Xstore1.c: sell_price return zero if item should not be put into store
  519. Xmonsters.c: disenchanter bat sleep set from 0 to 1
  520. Xall: eliminated all unnecessary elipses
  521. Xconstants.h, creature.c, dungeon.c, eat.c: new defines for the creature
  522. X    move, spell, and defense fields, eliminated all hex constants from
  523. X    the 3 c files
  524. X------------ 10/9
  525. Xmoria2.c: fixed falling rock trap in move_char(), step back so that
  526. X    player is not under the rubble
  527. Xvariable.c: put copyright message in string, so that it appears in executable
  528. Xspells.c: create_trap modified to light up trap, in case it is an open pit
  529. Xall:replace prt calls with put_buffer where ever possible, because it's faster
  530. Xexterns.h, io.c, signals.c: put ignore/default/restore_signal code back in
  531. Xwizard.c: rewrote the version info
  532. Xdungeon.c, moria2.c, signals.c: modified to use get_check() for consistency
  533. X------------ 10/10
  534. END_OF_FILE
  535. if test 27455 -ne `wc -c <'OOChanges.1'`; then
  536.     echo shar: \"'OOChanges.1'\" unpacked with wrong size!
  537. fi
  538. # end of 'OOChanges.1'
  539. fi
  540. if test -f 'source/scrolls.c' -a "${1}" != "-c" ; then 
  541.   echo shar: Will not clobber existing file \"'source/scrolls.c'\"
  542. else
  543. echo shar: Extracting \"'source/scrolls.c'\" \(13819 characters\)
  544. sed "s/^X//" >'source/scrolls.c' <<'END_OF_FILE'
  545. X/* source/scrolls.c: scroll code
  546. X
  547. X   Copyright (c) 1989-92 James E. Wilson, Robert A. Koeneke
  548. X
  549. X   This software may be copied and distributed for educational, research, and
  550. X   not for profit purposes provided that this copyright and statement are
  551. X   included in all such copies. */
  552. X
  553. X#ifdef __TURBOC__
  554. X#include    <stdio.h>
  555. X#endif /* __TURBOC__ */
  556. X#include "config.h"
  557. X#include "constant.h"
  558. X#include "types.h"
  559. X#include "externs.h"
  560. X
  561. X#ifdef USG
  562. X#include <string.h>
  563. X#else
  564. X#include <strings.h>
  565. X#endif
  566. X
  567. X/* Scrolls for the reading                -RAK-    */
  568. Xvoid read_scroll()
  569. X{
  570. X  int32u i;
  571. X  int j, k, item_val, y, x;
  572. X  int tmp[6], flag, used_up;
  573. X  bigvtype out_val, tmp_str;
  574. X  register int ident, l;
  575. X  register inven_type *i_ptr;
  576. X  register struct misc *m_ptr;
  577. X#ifdef ATARIST_MWC
  578. X  int32u holder = TR_CURSED;
  579. X#endif
  580. X
  581. X  free_turn_flag = TRUE;
  582. X  if (py.flags.blind > 0)
  583. X    msg_print("You can't see to read the scroll.");
  584. X  else if (no_light())
  585. X    msg_print("You have no light to read by.");
  586. X  else if (py.flags.confused > 0)
  587. X    msg_print("You are too confused to read a scroll.");
  588. X  else if (inven_ctr == 0)
  589. X    msg_print("You are not carrying anything!");
  590. X  else if (!find_range(TV_SCROLL1, TV_SCROLL2, &j, &k))
  591. X    msg_print ("You are not carrying any scrolls!");
  592. X  else if (get_item(&item_val, "Read which scroll?", j, k, CNIL, CNIL))
  593. X    {
  594. X      i_ptr = &inventory[item_val];
  595. X      free_turn_flag = FALSE;
  596. X      used_up = TRUE;
  597. X      i = i_ptr->flags;
  598. X      ident = FALSE;
  599. X
  600. X      while (i != 0)
  601. X    {
  602. X      j = bit_pos(&i) + 1;
  603. X      if (i_ptr->tval == TV_SCROLL2)
  604. X        j += 32;
  605. X
  606. X      /* Scrolls.            */
  607. X      switch(j)
  608. X        {
  609. X        case 1:
  610. X          i_ptr = &inventory[INVEN_WIELD];
  611. X          if (i_ptr->tval != TV_NOTHING)
  612. X        {
  613. X          objdes(tmp_str, i_ptr, FALSE);
  614. X          (void) sprintf(out_val, "Your %s glows faintly!", tmp_str);
  615. X          msg_print(out_val);
  616. X          if (enchant(&i_ptr->tohit, 10))
  617. X            {
  618. X#ifdef ATARIST_MWC
  619. X              i_ptr->flags &= ~holder;
  620. X#else
  621. X              i_ptr->flags &= ~TR_CURSED;
  622. X#endif
  623. X              calc_bonuses();
  624. X            }
  625. X          else
  626. X            msg_print("The enchantment fails.");
  627. X          ident = TRUE;
  628. X        }
  629. X          break;
  630. X        case 2:
  631. X          i_ptr = &inventory[INVEN_WIELD];
  632. X          if (i_ptr->tval != TV_NOTHING)
  633. X        {
  634. X          objdes(tmp_str, i_ptr, FALSE);
  635. X          (void) sprintf(out_val, "Your %s glows faintly!", tmp_str);
  636. X          msg_print(out_val);
  637. X          if ((i_ptr->tval >= TV_HAFTED)&&(i_ptr->tval <= TV_DIGGING))
  638. X            j = i_ptr->damage[0] * i_ptr->damage[1];
  639. X          else /* Bows' and arrows' enchantments should not be limited
  640. X              by their low base damages */
  641. X            j = 10; 
  642. X          if (enchant(&i_ptr->todam, j))
  643. X            {
  644. X#ifdef ATARIST_MWC
  645. X              i_ptr->flags &= ~holder;
  646. X#else
  647. X              i_ptr->flags &= ~TR_CURSED;
  648. X#endif
  649. X              calc_bonuses ();
  650. X            }
  651. X          else
  652. X            msg_print("The enchantment fails.");
  653. X          ident = TRUE;
  654. X        }
  655. X          break;
  656. X        case 3:
  657. X          k = 0;
  658. X          l = 0;
  659. X          if (inventory[INVEN_BODY].tval != TV_NOTHING)
  660. X        tmp[k++] = INVEN_BODY;
  661. X          if (inventory[INVEN_ARM].tval != TV_NOTHING)
  662. X        tmp[k++] = INVEN_ARM;
  663. X          if (inventory[INVEN_OUTER].tval != TV_NOTHING)
  664. X        tmp[k++] = INVEN_OUTER;
  665. X          if (inventory[INVEN_HANDS].tval != TV_NOTHING)
  666. X        tmp[k++] = INVEN_HANDS;
  667. X          if (inventory[INVEN_HEAD].tval != TV_NOTHING)
  668. X        tmp[k++] = INVEN_HEAD;
  669. X          /* also enchant boots */
  670. X          if (inventory[INVEN_FEET].tval != TV_NOTHING)
  671. X        tmp[k++] = INVEN_FEET;
  672. X
  673. X          if (k > 0)  l = tmp[randint(k)-1];
  674. X#ifdef ATARIST_MWC
  675. X          if (holder & inventory[INVEN_BODY].flags)
  676. X        l = INVEN_BODY;
  677. X          else if (holder & inventory[INVEN_ARM].flags)
  678. X        l = INVEN_ARM;
  679. X          else if (holder & inventory[INVEN_OUTER].flags)
  680. X        l = INVEN_OUTER;
  681. X          else if (holder & inventory[INVEN_HEAD].flags)
  682. X        l = INVEN_HEAD;
  683. X          else if (holder & inventory[INVEN_HANDS].flags)
  684. X        l = INVEN_HANDS;
  685. X          else if (holder & inventory[INVEN_FEET].flags)
  686. X        l = INVEN_FEET;
  687. X#else
  688. X          if (TR_CURSED & inventory[INVEN_BODY].flags)
  689. X        l = INVEN_BODY;
  690. X          else if (TR_CURSED & inventory[INVEN_ARM].flags)
  691. X        l = INVEN_ARM;
  692. X          else if (TR_CURSED & inventory[INVEN_OUTER].flags)
  693. X        l = INVEN_OUTER;
  694. X          else if (TR_CURSED & inventory[INVEN_HEAD].flags)
  695. X        l = INVEN_HEAD;
  696. X          else if (TR_CURSED & inventory[INVEN_HANDS].flags)
  697. X        l = INVEN_HANDS;
  698. X          else if (TR_CURSED & inventory[INVEN_FEET].flags)
  699. X        l = INVEN_FEET;
  700. X#endif
  701. X
  702. X          if (l > 0)
  703. X        {
  704. X          i_ptr = &inventory[l];
  705. X          objdes(tmp_str, i_ptr, FALSE);
  706. X          (void) sprintf(out_val, "Your %s glows faintly!", tmp_str);
  707. X          msg_print(out_val);
  708. X          if (enchant(&i_ptr->toac, 10))
  709. X            {
  710. X#ifdef ATARIST_MWC
  711. X              i_ptr->flags &= ~holder;
  712. X#else
  713. X              i_ptr->flags &= ~TR_CURSED;
  714. X#endif
  715. X              calc_bonuses ();
  716. X            }
  717. X          else
  718. X            msg_print("The enchantment fails.");
  719. X          ident = TRUE;
  720. X        }
  721. X          break;
  722. X        case 4:
  723. X          msg_print("This is an identify scroll.");
  724. X          ident = TRUE;
  725. X          used_up = ident_spell();
  726. X
  727. X          /* The identify may merge objects, causing the identify scroll
  728. X         to move to a different place.    Check for that here.  It can
  729. X         move arbitrarily far if an identify scroll was used on
  730. X         another identify scroll, but it always moves down. */
  731. X          while (i_ptr->tval != TV_SCROLL1 || i_ptr->flags != 0x00000008)
  732. X        {
  733. X          item_val--;
  734. X          i_ptr = &inventory[item_val];
  735. X        }
  736. X          break;
  737. X        case 5:
  738. X          if (remove_curse())
  739. X        {
  740. X          msg_print("You feel as if someone is watching over you.");
  741. X          ident = TRUE;
  742. X        }
  743. X          break;
  744. X        case 6:
  745. X          ident = light_area(char_row, char_col);
  746. X          break;
  747. X        case 7:
  748. X          for (k = 0; k < randint(3); k++)
  749. X        {
  750. X          y = char_row;
  751. X          x = char_col;
  752. X          ident |= summon_monster(&y, &x, FALSE);
  753. X        }
  754. X          break;
  755. X        case 8:
  756. X          teleport(10);
  757. X          ident = TRUE;
  758. X          break;
  759. X        case 9:
  760. X          teleport(100);
  761. X          ident = TRUE;
  762. X          break;
  763. X        case 10:
  764. X          dun_level += (-3) + 2*randint(2);
  765. X          if (dun_level < 1)
  766. X        dun_level = 1;
  767. X          new_level_flag = TRUE;
  768. X          ident = TRUE;
  769. X          break;
  770. X        case 11:
  771. X          if (py.flags.confuse_monster == 0)
  772. X        {
  773. X          msg_print("Your hands begin to glow.");
  774. X          py.flags.confuse_monster = TRUE;
  775. X          ident = TRUE;
  776. X        }
  777. X          break;
  778. X        case 12:
  779. X          ident = TRUE;
  780. X          map_area();
  781. X          break;
  782. X        case 13:
  783. X          ident = sleep_monsters1(char_row, char_col);
  784. X          break;
  785. X        case 14:
  786. X          ident = TRUE;
  787. X          warding_glyph();
  788. X          break;
  789. X        case 15:
  790. X          ident = detect_treasure();
  791. X          break;
  792. X        case 16:
  793. X          ident = detect_object();
  794. X          break;
  795. X        case 17:
  796. X          ident = detect_trap();
  797. X          break;
  798. X        case 18:
  799. X          ident = detect_sdoor();
  800. X          break;
  801. X        case 19:
  802. X          msg_print("This is a mass genocide scroll.");
  803. X          ident = mass_genocide();
  804. X          break;
  805. X        case 20:
  806. X          ident = detect_invisible();
  807. X          break;
  808. X        case 21:
  809. X          ident = aggravate_monster(20);
  810. X          if (ident)
  811. X        msg_print("There is a high pitched humming noise.");
  812. X          break;
  813. X        case 22:
  814. X          ident = trap_creation();
  815. X          break;
  816. X        case 23:
  817. X          ident = td_destroy();
  818. X          break;
  819. X        case 24:
  820. X          ident = door_creation();
  821. X          break;
  822. X        case 25:
  823. X          msg_print("This is a Recharge-Item scroll.");
  824. X          ident = TRUE;
  825. X          used_up = recharge(60);
  826. X          break;
  827. X        case 26:
  828. X          msg_print("This is a genocide scroll.");
  829. X          ident = genocide();
  830. X          break;
  831. X        case 27:
  832. X          ident = unlight_area(char_row, char_col);
  833. X          break;
  834. X        case 28:
  835. X          ident = protect_evil();
  836. X          break;
  837. X        case 29:
  838. X          ident = TRUE;
  839. X          create_food();
  840. X          break;
  841. X        case 30:
  842. X          ident = dispel_creature(CD_UNDEAD, 60);
  843. X          break;
  844. X        case 33:
  845. X          i_ptr = &inventory[INVEN_WIELD];
  846. X          if (i_ptr->tval != TV_NOTHING)
  847. X        {
  848. X          objdes(tmp_str, i_ptr, FALSE);
  849. X          (void) sprintf(out_val, "Your %s glows brightly!", tmp_str);
  850. X          msg_print(out_val);
  851. X          flag = FALSE;
  852. X          for (k = 0; k < randint(2); k++)
  853. X            if (enchant(&i_ptr->tohit, 10))
  854. X              flag = TRUE;
  855. X          if ((i_ptr->tval >= TV_HAFTED)&&(i_ptr->tval <= TV_DIGGING))
  856. X            j = i_ptr->damage[0] * i_ptr->damage[1];
  857. X          else /* Bows' and arrows' enchantments should not be limited
  858. X              by their low base damages */
  859. X            j = 10; 
  860. X          for (k = 0; k < randint(2); k++)
  861. X            if (enchant(&i_ptr->todam, j))
  862. X              flag = TRUE;
  863. X          if (flag)
  864. X            {
  865. X#ifdef ATARIST_MWC
  866. X              i_ptr->flags &= ~holder;
  867. X#else
  868. X              i_ptr->flags &= ~TR_CURSED;
  869. X#endif
  870. X              calc_bonuses ();
  871. X            }
  872. X          else
  873. X            msg_print("The enchantment fails.");
  874. X          ident = TRUE;
  875. X        }
  876. X          break;
  877. X        case 34:
  878. X          i_ptr = &inventory[INVEN_WIELD];
  879. X          if (i_ptr->tval != TV_NOTHING)
  880. X        {
  881. X          objdes(tmp_str, i_ptr, FALSE);
  882. X          (void)sprintf(out_val,"Your %s glows black, fades.",tmp_str);
  883. X          msg_print(out_val);
  884. X          unmagic_name(i_ptr);
  885. X          i_ptr->tohit = -randint(5) - randint(5);
  886. X          i_ptr->todam = -randint(5) - randint(5);
  887. X          /* Must call py_bonuses() before set (clear) flags, and
  888. X             must call calc_bonuses() after set (clear) flags, so that
  889. X             all attributes will be properly turned off. */
  890. X          py_bonuses(i_ptr, -1);
  891. X          i_ptr->flags = TR_CURSED;
  892. X          calc_bonuses ();
  893. X          ident = TRUE;
  894. X        }
  895. X          break;
  896. X        case 35:
  897. X          k = 0;
  898. X          l = 0;
  899. X          if (inventory[INVEN_BODY].tval != TV_NOTHING)
  900. X        tmp[k++] = INVEN_BODY;
  901. X          if (inventory[INVEN_ARM].tval != TV_NOTHING)
  902. X        tmp[k++] = INVEN_ARM;
  903. X          if (inventory[INVEN_OUTER].tval != TV_NOTHING)
  904. X        tmp[k++] = INVEN_OUTER;
  905. X          if (inventory[INVEN_HANDS].tval != TV_NOTHING)
  906. X        tmp[k++] = INVEN_HANDS;
  907. X          if (inventory[INVEN_HEAD].tval != TV_NOTHING)
  908. X        tmp[k++] = INVEN_HEAD;
  909. X          /* also enchant boots */
  910. X          if (inventory[INVEN_FEET].tval != TV_NOTHING)
  911. X        tmp[k++] = INVEN_FEET;
  912. X
  913. X          if (k > 0)  l = tmp[randint(k)-1];
  914. X#ifdef ATARIST_MWC
  915. X          if (holder & inventory[INVEN_BODY].flags)
  916. X        l = INVEN_BODY;
  917. X          else if (holder & inventory[INVEN_ARM].flags)
  918. X        l = INVEN_ARM;
  919. X          else if (holder & inventory[INVEN_OUTER].flags)
  920. X        l = INVEN_OUTER;
  921. X          else if (holder & inventory[INVEN_HEAD].flags)
  922. X        l = INVEN_HEAD;
  923. X          else if (holder & inventory[INVEN_HANDS].flags)
  924. X        l = INVEN_HANDS;
  925. X          else if (holder & inventory[INVEN_FEET].flags)
  926. X        l = INVEN_FEET;
  927. X#else
  928. X          if (TR_CURSED & inventory[INVEN_BODY].flags)
  929. X        l = INVEN_BODY;
  930. X          else if (TR_CURSED & inventory[INVEN_ARM].flags)
  931. X        l = INVEN_ARM;
  932. X          else if (TR_CURSED & inventory[INVEN_OUTER].flags)
  933. X        l = INVEN_OUTER;
  934. X          else if (TR_CURSED & inventory[INVEN_HEAD].flags)
  935. X        l = INVEN_HEAD;
  936. X          else if (TR_CURSED & inventory[INVEN_HANDS].flags)
  937. X        l = INVEN_HANDS;
  938. X          else if (TR_CURSED & inventory[INVEN_FEET].flags)
  939. X        l = INVEN_FEET;
  940. X#endif
  941. X
  942. X          if (l > 0)
  943. X        {
  944. X          i_ptr = &inventory[l];
  945. X          objdes(tmp_str, i_ptr, FALSE);
  946. X          (void) sprintf(out_val,"Your %s glows brightly!", tmp_str);
  947. X          msg_print(out_val);
  948. X          flag = FALSE;
  949. X          for (k = 0; k < randint(2) + 1; k++)
  950. X            if (enchant(&i_ptr->toac, 10))
  951. X              flag = TRUE;
  952. X          if (flag)
  953. X            {
  954. X#ifdef ATARIST_MWC
  955. X              i_ptr->flags &= ~holder;
  956. X#else
  957. X              i_ptr->flags &= ~TR_CURSED;
  958. X#endif
  959. X              calc_bonuses ();
  960. X            }
  961. X          else
  962. X            msg_print("The enchantment fails.");
  963. X          ident = TRUE;
  964. X        }
  965. X          break;
  966. X        case 36:
  967. X          if ((inventory[INVEN_BODY].tval != TV_NOTHING)
  968. X          && (randint(4) == 1))
  969. X        k = INVEN_BODY;
  970. X          else if ((inventory[INVEN_ARM].tval != TV_NOTHING)
  971. X               && (randint(3) ==1))
  972. X        k = INVEN_ARM;
  973. X          else if ((inventory[INVEN_OUTER].tval != TV_NOTHING)
  974. X               && (randint(3) ==1))
  975. X        k = INVEN_OUTER;
  976. X          else if ((inventory[INVEN_HEAD].tval != TV_NOTHING)
  977. X               && (randint(3) ==1))
  978. X        k = INVEN_HEAD;
  979. X          else if ((inventory[INVEN_HANDS].tval != TV_NOTHING)
  980. X               && (randint(3) ==1))
  981. X        k = INVEN_HANDS;
  982. X          else if ((inventory[INVEN_FEET].tval != TV_NOTHING)
  983. X               && (randint(3) ==1))
  984. X        k = INVEN_FEET;
  985. X          else if (inventory[INVEN_BODY].tval != TV_NOTHING)
  986. X        k = INVEN_BODY;
  987. X          else if (inventory[INVEN_ARM].tval != TV_NOTHING)
  988. X        k = INVEN_ARM;
  989. X          else if (inventory[INVEN_OUTER].tval != TV_NOTHING)
  990. X        k = INVEN_OUTER;
  991. X          else if (inventory[INVEN_HEAD].tval != TV_NOTHING)
  992. X        k = INVEN_HEAD;
  993. X          else if (inventory[INVEN_HANDS].tval != TV_NOTHING)
  994. X        k = INVEN_HANDS;
  995. X          else if (inventory[INVEN_FEET].tval != TV_NOTHING)
  996. X        k = INVEN_FEET;
  997. X          else
  998. X        k = 0;
  999. X
  1000. X          if (k > 0)
  1001. X        {
  1002. X          i_ptr = &inventory[k];
  1003. X          objdes(tmp_str, i_ptr, FALSE);
  1004. X          (void)sprintf(out_val,"Your %s glows black, fades.",tmp_str);
  1005. X          msg_print(out_val);
  1006. X          unmagic_name(i_ptr);
  1007. X          i_ptr->flags = TR_CURSED;
  1008. X          i_ptr->toac = -randint(5) - randint(5);
  1009. X          calc_bonuses ();
  1010. X          ident = TRUE;
  1011. X        }
  1012. X          break;
  1013. X        case 37:
  1014. X          ident = FALSE;
  1015. X          for (k = 0; k < randint(3); k++)
  1016. X        {
  1017. X          y = char_row;
  1018. X          x = char_col;
  1019. X          ident |= summon_undead(&y, &x);
  1020. X        }
  1021. X          break;
  1022. X        case 38:
  1023. X          ident = TRUE;
  1024. X          bless(randint(12)+6);
  1025. X          break;
  1026. X        case 39:
  1027. X          ident = TRUE;
  1028. X          bless(randint(24)+12);
  1029. X          break;
  1030. X        case 40:
  1031. X          ident = TRUE;
  1032. X          bless(randint(48)+24);
  1033. X          break;
  1034. X        case 41:
  1035. X          ident = TRUE;
  1036. X          if (py.flags.word_recall == 0)
  1037. X        py.flags.word_recall = 25 + randint(30);
  1038. X          msg_print("The air about you becomes charged.");
  1039. X          break;
  1040. X        case 42:
  1041. X          destroy_area(char_row, char_col);
  1042. X          ident = TRUE;
  1043. X          break;
  1044. X        default:
  1045. X          msg_print("Internal error in scroll()");
  1046. X          break;
  1047. X        }
  1048. X      /* End of Scrolls.                   */
  1049. X    }
  1050. X      i_ptr = &inventory[item_val];
  1051. X      if (ident)
  1052. X    {
  1053. X      if (!known1_p(i_ptr))
  1054. X        {
  1055. X          m_ptr = &py.misc;
  1056. X          /* round half-way case up */
  1057. X          m_ptr->exp += (i_ptr->level +(m_ptr->lev >> 1)) / m_ptr->lev;
  1058. X          prt_experience();
  1059. X
  1060. X          identify(&item_val);
  1061. X          i_ptr = &inventory[item_val];
  1062. X        }
  1063. X    }
  1064. X      else if (!known1_p(i_ptr))
  1065. X    sample (i_ptr);
  1066. X      if (used_up)
  1067. X    {
  1068. X      desc_remain(item_val);
  1069. X      inven_destroy(item_val);
  1070. X    }
  1071. X    }
  1072. X}
  1073. END_OF_FILE
  1074. if test 13819 -ne `wc -c <'source/scrolls.c'`; then
  1075.     echo shar: \"'source/scrolls.c'\" unpacked with wrong size!
  1076. fi
  1077. # end of 'source/scrolls.c'
  1078. fi
  1079. if test -f 'util/showmon.c' -a "${1}" != "-c" ; then 
  1080.   echo shar: Will not clobber existing file \"'util/showmon.c'\"
  1081. else
  1082. echo shar: Extracting \"'util/showmon.c'\" \(11673 characters\)
  1083. sed "s/^X//" >'util/showmon.c' <<'END_OF_FILE'
  1084. X/* this used to be in files.c, this is not a working program */
  1085. X
  1086. X/* move to cheat.c file */
  1087. X/* Prints a listing of monsters                -RAK-     */
  1088. Xprint_monsters()
  1089. X{
  1090. X  register int i;
  1091. X  int j, xpos, attype, adesc, adice, asides, count;
  1092. X  register FILE *file1;
  1093. X  vtype out_val, filename1;
  1094. X  char *attstr;
  1095. X  register creature_type *c_ptr;
  1096. X  register char *string;
  1097. X
  1098. X  prt("File name: ", 0, 0);
  1099. X  if (get_string(filename1, 0, 11, 64))
  1100. X    {
  1101. X      if (strlen(filename1) == 0)
  1102. X    (void) strcpy(filename1, "MORIAMON.DAT");
  1103. X      if ((file1 = fopen(filename1, "w")) != NULL)
  1104. X    {
  1105. X      prt("Writing Monster Dictionary...", 0, 0);
  1106. X      put_qio();
  1107. X      for (i = 0; i < MAX_CREATURES; i++)
  1108. X        {
  1109. X          c_ptr = &c_list[i];
  1110. X          /* Begin writing to file                       */
  1111. X          (void) fprintf(file1, "------------------------------------");
  1112. X          (void) fprintf(file1, "--------\n");
  1113. X          (void) fprintf(file1, "%3d  %-31s     (%c)\n", i, c_ptr->name,
  1114. X                 c_ptr->cchar);
  1115. X          (void) fprintf(file1, "     Speed =%3d  Level     =%3d  Exp =%6u\n",
  1116. X              c_ptr->speed-10, c_ptr->level, c_ptr->mexp);
  1117. X          (void) fprintf(file1, "     AC    =%3d  Eye-sight =%3d  HD  =%6s\n",
  1118. X              c_ptr->ac, c_ptr->aaf, c_ptr->hd);
  1119. X          if (CM_WIN & c_ptr->cmove)
  1120. X        (void) fprintf(file1, "     Creature is a ***Win Creature***\n");
  1121. X          if (CM_EATS_OTHER) & c_ptr->cmove)
  1122. X        (void) fprintf(file1, "     Creature Eats/kills other creatures.\n");
  1123. X          if (CD_DRAGON & c_ptr->cdefense)
  1124. X        (void) fprintf(file1, "     Creature is a dragon.\n");
  1125. X          if (CD_ANIMAL & c_ptr->cdefense)
  1126. X        (void) fprintf(file1, "     Creature is an animal.\n");
  1127. X          if (CD_EVIL & c_ptr->cdefense)
  1128. X        (void) fprintf(file1, "     Creature is evil.\n");
  1129. X          if (CD_UNDEAD & c_ptr->cdefense)
  1130. X        (void) fprintf(file1, "     Creature is undead.\n");
  1131. X          if (CD_FROST & c_ptr->cdefense)
  1132. X        (void) fprintf(file1, "     Creature harmed by cold.\n");
  1133. X          if (CD_FIRE & c_ptr->cdefense)
  1134. X        (void) fprintf(file1, "     Creature harmed by fire.\n");
  1135. X          if (CD_POISON & c_ptr->cdefense)
  1136. X        (void) fprintf(file1, "     Creature harmed by poison.\n");
  1137. X          if (CD_ACID & c_ptr->cdefense)
  1138. X        (void) fprintf(file1, "     Creature harmed by acid.\n");
  1139. X          if (CD_LIGHT & c_ptr->cdefense)
  1140. X        (void) fprintf(file1, "     Creature harmed by blue light.\n");
  1141. X          if (CD_STONE & c_ptr->cdefense)
  1142. X        (void) fprintf(file1, "     Creature harmed by Stone-to-Mud.\n");
  1143. X          if (CD_NO_SLEEP & c_ptr->cdefense)
  1144. X        (void) fprintf(file1, "     Creature cannot be charmed or slept.\n");
  1145. X          if (CD_INFRA & c_ptr->cdefense)
  1146. X        (void) fprintf(file1, "     Creature seen with Infra-Vision.\n");
  1147. X          if (CD_MAX_HP & c_ptr->cdefense)
  1148. X        (void) fprintf(file1, "     Creature has MAX hit points.\n");
  1149. X          if (CM_INVISIBLE & c_ptr->cmove)
  1150. X        (void) fprintf(file1, "     Creature is invisible.\n");
  1151. X          if (CM_PICKS_UP & c_ptr->cmove)
  1152. X        (void) fprintf(file1, "     Creature picks up objects.\n");
  1153. X          if (CM_MULTIPLY & c_ptr->cmove)
  1154. X        (void) fprintf(file1, "     Creature multiplies.\n");
  1155. X          if (CM_CARRY_OBJ & c_ptr->cmove)
  1156. X        (void) fprintf(file1, "     Carries object(s).\n");
  1157. X          if (CM_CARRY_GOLD & c_ptr->cmove)
  1158. X        (void) fprintf(file1, "     Carries gold, gems, etc.\n");
  1159. X          if (CM_60_RANDOM & c_ptr->cmove)
  1160. X        (void) fprintf(file1, "       Has object/gold 60%% of time.\n");
  1161. X          if (CM_90_RANDOM & c_ptr->cmove)
  1162. X        (void) fprintf(file1, "       Has object/gold 90%% of time.\n");
  1163. X          if (CM_1D2_OBJ & c_ptr->cmove)
  1164. X        (void) fprintf(file1, "       Has 1d2 object(s)/gold.\n");
  1165. X          if (CM_2D2_OBJ & c_ptr->cmove)
  1166. X        (void) fprintf(file1, "       Has 2d2 object(s)/gold.\n");
  1167. X          if (CM_4D2_OBJ & c_ptr->cmove)
  1168. X        (void) fprintf(file1, "       Has 4d2 object(s)/gold.\n");
  1169. X          /*
  1170. X           * Creature casts spells / Breathes Dragon
  1171. X           * breath.
  1172. X           */
  1173. X          if (c_ptr->spells != 0)
  1174. X        {
  1175. X          (void) fprintf(file1, "   --Spells/Dragon Breath =\n");
  1176. X          (void) fprintf(file1, "       Casts spells 1 out of %d turns.\n",
  1177. X              (int)(CS_FREQ & c_ptr->spells));
  1178. X          if (CS_TEL_SHORT & c_ptr->spells)
  1179. X            (void) fprintf(file1, "       Can teleport short.\n");
  1180. X          if (CS_TEL_LONG & c_ptr->spells)
  1181. X            (void) fprintf(file1, "       Can teleport long.\n");
  1182. X          if (CS_TEL_TO & c_ptr->spells)
  1183. X            (void) fprintf(file1, "       Teleport player to itself.\n");
  1184. X          if (CS_LGHT_WND & c_ptr->spells)
  1185. X            (void) fprintf(file1, "       Cause light wounds.\n");
  1186. X          if (CS_SER_WND & c_ptr->spells)
  1187. X            (void) fprintf(file1, "       Cause serious wounds.\n");
  1188. X          if (CS_HOLD_PER & c_ptr->spells)
  1189. X            (void) fprintf(file1, "       Hold person.\n");
  1190. X          if (CS_BLIND & c_ptr->spells)
  1191. X            (void) fprintf(file1, "       Cause blindness.\n");
  1192. X          if (CS_CONFUSE & c_ptr->spells)
  1193. X            (void) fprintf(file1, "       Cause confusion.\n");
  1194. X          if (CS_FEAR & c_ptr->spells)
  1195. X            (void) fprintf(file1, "       Cause fear.\n");
  1196. X          if (CS_SUMMON_MON & c_ptr->spells)
  1197. X            (void) fprintf(file1, "       Summon a monster.\n");
  1198. X          if (CS_SUMMON_UND & c_ptr->spells)
  1199. X            (void) fprintf(file1, "       Summon an undead.\n");
  1200. X          if (CS_SLOW_PER & c_ptr->spells)
  1201. X            (void) fprintf(file1, "       Slow person.\n");
  1202. X          if (CS_DRAIN_MANA & c_ptr->spells)
  1203. X            (void) fprintf(file1, "       Drains mana for healing.\n");
  1204. X          if (0x00020000L & c_ptr->spells)
  1205. X            (void) fprintf(file1, "       **Unknown spell value**\n");
  1206. X          if (0x00040000L & c_ptr->spells)
  1207. X            (void) fprintf(file1, "       **Unknown spell value**\n");
  1208. X          if (CS_BR_LIGHT & c_ptr->spells)
  1209. X            (void) fprintf(file1, "       Breathes Lightning Dragon Breath.\n");
  1210. X          if (CS_BR_GAS & c_ptr->spells)
  1211. X            (void) fprintf(file1, "       Breathes Gas Dragon Breath.\n");
  1212. X          if (CS_BR_ACID & c_ptr->spells)
  1213. X            (void) fprintf(file1, "       Breathes Acid Dragon Breath.\n");
  1214. X          if (CS_BR_FROST & c_ptr->spells)
  1215. X            (void) fprintf(file1, "       Breathes Frost Dragon Breath.\n");
  1216. X          if (CS_BR_FIRE & c_ptr->spells)
  1217. X            (void) fprintf(file1, "       Breathes Fire Dragon Breath.\n");
  1218. X        }
  1219. X          /* Movement for creature                       */
  1220. X          (void) fprintf(file1, "   --Movement =\n");
  1221. X          if ((CM_ALL_MV_FLAGS & c_ptr->cmove) == 0)
  1222. X        (void) fprintf(file1, "       Do not move.\n");
  1223. X          if (CM_ATTACK_ONLY & c_ptr->cmove)
  1224. X        (void) fprintf(file1, "       Move only to attack.\n");
  1225. X          if (CM_MOVE_NORMAL & c_ptr->cmove)
  1226. X        (void) fprintf(file1, "       Move and attack normally.\n");
  1227. X          if (CM_20_RANDOM & c_ptr->cmove)
  1228. X        (void) fprintf(file1, "       20%% random movement.\n");
  1229. X          if (CM_40_RANDOM & c_ptr->cmove)
  1230. X        (void) fprintf(file1, "       40%% random movement.\n");
  1231. X          if (CM_75_RANDOM & c_ptr->cmove)
  1232. X        (void) fprintf(file1, "       75%% random movement.\n");
  1233. X          if (CM_OPEN_DOOR & c_ptr->cmove)
  1234. X        (void) fprintf(file1, "       Can open doors.\n");
  1235. X          if (CM_PHASE & c_ptr->cmove)
  1236. X        (void) fprintf(file1, "       Can phase through walls.\n");
  1237. X
  1238. X          (void) fprintf(file1, "   --Creature attacks =\n");
  1239. X          attstr = c_ptr->damage;
  1240. X          count = 0;
  1241. X          while (*attstr != 0 && count < 4)
  1242. X        {
  1243. X          attype = monster_attacks[*attstr].attack_type;
  1244. X          adesc = monster_attacks[*attstr].attack_desc;
  1245. X          adice = monster_attacks[*attstr].attack_dice;
  1246. X          asides = monster_attacks[*attstr].attack_sides;
  1247. X          attstr++;
  1248. X          count++;
  1249. X          out_val[0] = '\0';
  1250. X          switch (adesc)
  1251. X            {
  1252. X            case 0:
  1253. X              (void) strcpy(out_val, "       No hits for ");
  1254. X              break;
  1255. X            case 1:
  1256. X              (void) strcpy(out_val, "       Hits for ");
  1257. X              break;
  1258. X            case 2:
  1259. X              (void) strcpy(out_val, "       Bites for ");
  1260. X              break;
  1261. X            case 3:
  1262. X              (void) strcpy(out_val, "       Claws for ");
  1263. X              break;
  1264. X            case 4:
  1265. X              (void) strcpy(out_val, "       Stings for ");
  1266. X              break;
  1267. X            case 5:
  1268. X              (void) strcpy(out_val, "       Touches for ");
  1269. X              break;
  1270. X            case 6:
  1271. X              (void) strcpy(out_val, "       Kicks for ");
  1272. X              break;
  1273. X            case 7:
  1274. X              (void) strcpy(out_val, "       Gazes for ");
  1275. X              break;
  1276. X            case 8:
  1277. X              (void) strcpy(out_val, "       Breathes for ");
  1278. X              break;
  1279. X            case 9:
  1280. X              (void) strcpy(out_val, "       Spits for ");
  1281. X              break;
  1282. X            case 10:
  1283. X              (void) strcpy(out_val, "       Wails for ");
  1284. X              break;
  1285. X            case 11:
  1286. X              (void) strcpy(out_val, "       Embraces for ");
  1287. X              break;
  1288. X            case 12:
  1289. X              (void) strcpy(out_val, "       Crawls on you for ");
  1290. X              break;
  1291. X            case 13:
  1292. X              (void) strcpy(out_val, "       Shoots spores for ");
  1293. X              break;
  1294. X            case 14:
  1295. X              (void) strcpy(out_val, "       Begs for money for ");
  1296. X              break;
  1297. X            case 15:
  1298. X              (void) strcpy(out_val, "       Slimes you for ");
  1299. X              break;
  1300. X            case 16:
  1301. X              (void) strcpy(out_val, "       Crushes you for ");
  1302. X              break;
  1303. X            case 17:
  1304. X              (void) strcpy(out_val, "       Tramples you for ");
  1305. X              break;
  1306. X            case 18:
  1307. X              (void) strcpy(out_val, "       Drools on you for ");
  1308. X              break;
  1309. X            case 19:
  1310. X              (void) strcpy(out_val, "       Insults you for ");
  1311. X              break;
  1312. X            case 99:
  1313. X              (void) strcpy(out_val, "       Is repelled.");
  1314. X              break;
  1315. X            default:
  1316. X              (void) strcpy(out_val, "     **Unknown value** ");
  1317. X              break;
  1318. X            }
  1319. X          switch (attype)
  1320. X            {
  1321. X            case 0:
  1322. X              (void) strcat(out_val, "no damage.");
  1323. X              break;
  1324. X            case 1:
  1325. X              (void) strcat(out_val, "normal damage.");
  1326. X              break;
  1327. X            case 2:
  1328. X              (void) strcat(out_val, "lowering strength.");
  1329. X              break;
  1330. X            case 3:
  1331. X              (void) strcat(out_val, "confusion.");
  1332. X              break;
  1333. X            case 4:
  1334. X              (void) strcat(out_val, "fear.");
  1335. X              break;
  1336. X            case 5:
  1337. X              (void) strcat(out_val, "fire damage.");
  1338. X              break;
  1339. X            case 6:
  1340. X              (void) strcat(out_val, "acid damage.");
  1341. X              break;
  1342. X            case 7:
  1343. X              (void) strcat(out_val, "cold damage.");
  1344. X              break;
  1345. X            case 8:
  1346. X              (void) strcat(out_val, "lightning damage.");
  1347. X              break;
  1348. X            case 9:
  1349. X              (void) strcat(out_val, "corrosion damage.");
  1350. X              break;
  1351. X            case 10:
  1352. X              (void) strcat(out_val, "blindness.");
  1353. X              break;
  1354. X            case 11:
  1355. X              (void) strcat(out_val, "paralyzation.");
  1356. X              break;
  1357. X            case 12:
  1358. X              (void) strcat(out_val, "stealing money.");
  1359. X              break;
  1360. X            case 13:
  1361. X              (void) strcat(out_val, "stealing object.");
  1362. X              break;
  1363. X            case 14:
  1364. X              (void) strcat(out_val, "poison damage.");
  1365. X              break;
  1366. X            case 15:
  1367. X              (void) strcat(out_val, "lose dexterity.");
  1368. X              break;
  1369. X            case 16:
  1370. X              (void) strcat(out_val, "lose constitution.");
  1371. X              break;
  1372. X            case 17:
  1373. X              (void) strcat(out_val, "lose intelligence.");
  1374. X              break;
  1375. X            case 18:
  1376. X              (void) strcat(out_val, "lose wisdom.");
  1377. X              break;
  1378. X            case 19:
  1379. X              (void) strcat(out_val, "lose experience.");
  1380. X              break;
  1381. X            case 20:
  1382. X              (void) strcat(out_val, "aggravates monsters.");
  1383. X              break;
  1384. X            case 21:
  1385. X              (void) strcat(out_val, "disenchants objects.");
  1386. X              break;
  1387. X            case 22:
  1388. X              (void) strcat(out_val, "eating food.");
  1389. X              break;
  1390. X            case 23:
  1391. X              (void) strcat(out_val, "eating light source.");
  1392. X              break;
  1393. X            case 24:
  1394. X              (void) strcat(out_val, "absorbing charges.");
  1395. X              break;
  1396. X            case 99:
  1397. X              (void) strcat(out_val, "blank message.");
  1398. X              break;
  1399. X            default:
  1400. X              (void) strcat(out_val, "**Unknown value**");
  1401. X              break;
  1402. X            }
  1403. X          (void) fprintf(file1, "%s (%dd%d)\n", out_val, adice,asides);
  1404. X        }
  1405. X          for (j = 0; j < 2; j++)
  1406. X        (void) fprintf(file1, "\n");
  1407. X        }
  1408. X      /* End writing to file                   */
  1409. X      (void) fclose(file1);
  1410. X      prt("Completed.", 0, 0);
  1411. X    }
  1412. X    }
  1413. X}
  1414. END_OF_FILE
  1415. if test 11673 -ne `wc -c <'util/showmon.c'`; then
  1416.     echo shar: \"'util/showmon.c'\" unpacked with wrong size!
  1417. fi
  1418. # end of 'util/showmon.c'
  1419. fi
  1420. echo shar: End of archive 29 \(of 39\).
  1421. cp /dev/null ark29isdone
  1422. MISSING=""
  1423. 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
  1424.     if test ! -f ark${I}isdone ; then
  1425.     MISSING="${MISSING} ${I}"
  1426.     fi
  1427. done
  1428. if test "${MISSING}" = "" ; then
  1429.     echo You have unpacked all 39 archives.
  1430.     echo "Now run "bldfiles.sh" to build split files"
  1431.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1432. else
  1433.     echo You still need to unpack the following archives:
  1434.     echo "        " ${MISSING}
  1435. fi
  1436. ##  End of shell archive.
  1437. exit 0
  1438.