home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume14 / umoria4 / part20 < 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: v14i052:  umoria4 - single player dungeon simulation (ver. 5.5), Part20/39
  5. Message-ID: <3416@master.CNA.TEK.COM>
  6. Date: 22 Aug 92 22:12:17 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 2135
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: grabiner@math.harvard.edu (David Grabiner)
  12. Posting-number: Volume 14, Issue 52
  13. Archive-name: umoria4/Part20
  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 20 (of 39)."
  26. # Contents:  atari_st/Makefile.tc mac/moria.r source/store2.c
  27. # Wrapped by billr@saab on Thu Aug 20 09:11:31 1992
  28. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  29. if test -f 'atari_st/Makefile.tc' -a "${1}" != "-c" ; then 
  30.   echo shar: Will not clobber existing file \"'atari_st/Makefile.tc'\"
  31. else
  32. echo shar: Extracting \"'atari_st/Makefile.tc'\" \(3833 characters\)
  33. sed "s/^X//" >'atari_st/Makefile.tc' <<'END_OF_FILE'
  34. X# BINDIR is the directory where the moria binary will be put
  35. X# LIBDIR is where the other files (scoreboard, news, hours) will be put
  36. X# LIBDIR must be the same directory defined in config.h
  37. X# this was clipped from the link command: -lcurses -ltermcap
  38. XBINDIR = \umoria
  39. XLIBDIR = \umorie\files
  40. X
  41. XCFLAGS = -DGEMDOS -O
  42. XCC = cc
  43. X
  44. XSRCS = main.c misc1.c misc2.c misc3.c misc4.c store1.c files.c io.c \
  45. X    create.c desc.c generate.c sets.c dungeon.c creature.c death.c \
  46. X    eat.c help.c magic.c potions.c prayer.c save.c staffs.c wands.c \
  47. X    scrolls.c spells.c wizard.c store2.c signals.c moria1.c moria2.c \
  48. X    moria3.c moria4.c monsters.c treasure.c variable.c rnd.c recall.c \
  49. X    atarist.c player.c tables.c
  50. X
  51. XOBJS = main.o misc1.o misc2.o misc3.o misc4.o store1.o files.o io.o \
  52. X    create.o desc.o generate.o sets.o dungeon.o creature.o death.o \
  53. X    eat.o help.o magic.o potions.o prayer.o save.o staffs.o wands.o \
  54. X    scrolls.o spells.o wizard.o store2.o signals.o moria1.o moria2.o \
  55. X    moria3.o moria4.o monsters.o treasure.o variable.o rnd.o recall.o \
  56. X    atarist.o curses.o player.o tables.o
  57. X
  58. XLIBFILES = moria_hours moria_help moria_orig_help moria_wiz_help \
  59. X    moria_orig_wiz_help moria_man
  60. X
  61. Xmoria : $(OBJS)
  62. X#    $(CC) -o moria $(CFLAGS) $(OBJS)
  63. X#    \tc\tlink -C=moria.lnk
  64. X
  65. Xlibfiles: $(LIBFILES)
  66. X    chmod 444 $(LIBFILES)
  67. X    cp $(LIBFILES) $(LIBDIR)
  68. X
  69. X$(BINDIR):
  70. X    mkdir $(BINDIR)
  71. X    chmod 755 $(BINDIR)
  72. X
  73. X$(LIBDIR):
  74. X    mkdir $(LIBDIR)
  75. X    chmod 711 $(LIBDIR)
  76. X
  77. X$(LIBDIR)/moria_hours: moria_hours
  78. X    chmod 644 moria_hours
  79. X    cp moria_hours $(LIBDIR)
  80. X
  81. Xlintout : $(SRCS)
  82. X    lint $(SRCS) -lcurses -ltermcap > lintout
  83. X
  84. Xlintout2 : $(SRCS)
  85. X    lint -bach $(SRCS) -lcurses -ltermcap > lintout
  86. X
  87. XTAGS : $(SRCS)
  88. X    ctags -x $(SRCS) > TAGS
  89. X
  90. X# you must define BINDIR and LIBDIR before installing
  91. Xinstall:
  92. X    cp moria $(BINDIR)
  93. X    cp Moria_hours $(LIBDIR)
  94. X    cp Moria_news $(LIBDIR)
  95. X    cp Highscores $(LIBDIR)
  96. X    chmod 4511 $(BINDIR)/moria
  97. X    chmod 644 $(LIBDIR)/Highscores
  98. X    chmod 444 $(LIBDIR)/Moria_news
  99. X    chmod 444 $(LIBDIR)/Moria_hours
  100. X    chmod 555 $(LIBDIR)
  101. X
  102. Xclean:
  103. X    rm -r *.o
  104. X    rm -i moria
  105. X
  106. Xcreate.o: constant.h types.h externs.h config.h
  107. Xcreature.o: constant.h types.h externs.h config.h
  108. Xdeath.o: constant.h types.h externs.h config.h
  109. Xdesc.o: constant.h types.h externs.h config.h
  110. Xdungeon.o: constant.h types.h externs.h config.h
  111. Xeat.o: constant.h types.h externs.h config.h
  112. Xfiles.o: constant.h types.h externs.h config.h
  113. Xgenerate.o: constant.h types.h externs.h config.h
  114. Xhelp.o: constant.h types.h externs.h config.h
  115. Xio.o: constant.h types.h externs.h config.h
  116. Xmagic.o: constant.h types.h externs.h config.h
  117. Xmain.o: constant.h types.h externs.h config.h
  118. Xmisc1.o: constant.h types.h externs.h config.h
  119. Xmisc2.o: constant.h types.h externs.h config.h
  120. Xmisc3.o: constant.h types.h externs.h config.h
  121. Xmisc4.o: constant.h types.h externs.h config.h
  122. Xmonsters.o: constant.h types.h config.h
  123. Xmoria1.o: constant.h types.h externs.h config.h
  124. Xmoria2.o: constant.h types.h externs.h config.h
  125. Xmoria3.o: constant.h types.h externs.h config.h
  126. Xmoria4.o: constant.h types.h externs.h config.h
  127. Xplayer.o: constant.h types.h config.h
  128. Xpotions.o: constant.h types.h externs.h config.h
  129. Xprayer.o: constant.h types.h externs.h config.h
  130. Xrecall.o: constant.h config.h types.h externs.h
  131. Xrnd.o: constant.h types.h
  132. Xsave.o: constant.h types.h externs.h config.h
  133. Xscrolls.o: constant.h types.h externs.h config.h
  134. Xsets.o: constant.h config.h
  135. Xsignals.o: constant.h types.h externs.h config.h
  136. Xspells.o: constant.h types.h externs.h config.h
  137. Xstaffs.o: constant.h types.h externs.h config.h
  138. Xstore1.o: constant.h types.h externs.h config.h
  139. Xstore2.o: constant.h types.h externs.h config.h
  140. Xtables.o: constant.h types.h config.h
  141. Xtreasure.o: constant.h types.h config.h
  142. Xatarist.o: constant.h config.h types.h externs.h
  143. Xvariable.o: constant.h types.h config.h
  144. Xwands.o: constant.h types.h externs.h config.h
  145. Xwizard.o: constant.h types.h externs.h config.h
  146. END_OF_FILE
  147. if test 3833 -ne `wc -c <'atari_st/Makefile.tc'`; then
  148.     echo shar: \"'atari_st/Makefile.tc'\" unpacked with wrong size!
  149. fi
  150. # end of 'atari_st/Makefile.tc'
  151. fi
  152. if test -f 'mac/moria.r' -a "${1}" != "-c" ; then 
  153.   echo shar: Will not clobber existing file \"'mac/moria.r'\"
  154. else
  155. echo shar: Extracting \"'mac/moria.r'\" \(19941 characters\)
  156. sed "s/^X//" >'mac/moria.r' <<'END_OF_FILE'
  157. X/* mac/moria.r: MacMoria resources, for Mac functionality
  158. X
  159. X   Copyright (c) 1989-92 Curtis McCauley, James E. Wilson
  160. X
  161. X   This software may be copied and distributed for educational, research, and
  162. X   not for profit purposes provided that this copyright and statement are
  163. X   included in all such copies. */
  164. X
  165. X#include "Types.r"
  166. X
  167. Xinclude "ScrnMgr.rsrc";
  168. X
  169. Xtype 'MRIA' as 'STR ';
  170. X
  171. Xtype 'CNFG' (256 : 257) {
  172. X    longint;
  173. X};
  174. X
  175. Xtype 'TEXT' {
  176. X    string;
  177. X};
  178. X
  179. Xresource 'MRIA' (0) {
  180. X    "Moria 5.4 for the Macintosh"
  181. X};
  182. X
  183. Xresource 'BNDL' (128, purgeable) {
  184. X    'MRIA',
  185. X    0,
  186. X    { /* array TypeArray: 2 elements */
  187. X        /* [1] */
  188. X        'ICN#',
  189. X        { /* array IDArray: 3 elements */
  190. X            /* [1] Application */
  191. X            0, 128,
  192. X            /* [2] Save file */
  193. X            1, 129,
  194. X            /* [3] Aux files */
  195. X            2, 130
  196. X        },
  197. X        /* [2] */
  198. X        'FREF',
  199. X        { /* array IDArray: 5 elements */
  200. X            /* [1] Appilication */
  201. X            0, 128,
  202. X            /* [2] Save file */
  203. X            1, 129,
  204. X            /* [3] Info files */
  205. X            2, 130,
  206. X            /* [4] Score file */
  207. X            3, 131,
  208. X            /* [5] Config file */
  209. X            4, 132
  210. X        }
  211. X    }
  212. X};
  213. X
  214. Xresource 'FREF' (128, "Application", purgeable) {
  215. X    'APPL',
  216. X    0,
  217. X    ""
  218. X};
  219. X
  220. Xresource 'FREF' (129, "Save Files", purgeable) {
  221. X    'SAVE',
  222. X    1,
  223. X    ""
  224. X};
  225. X
  226. Xresource 'FREF' (130, "Info Files", purgeable) {
  227. X    'TEXT',
  228. X    2,
  229. X    ""
  230. X};
  231. X
  232. Xresource 'FREF' (131, "Score File", purgeable) {
  233. X    'SCOR',
  234. X    2,
  235. X    ""
  236. X};
  237. X
  238. Xresource 'FREF' (132, "Config File", purgeable) {
  239. X    'CNFG',
  240. X    2,
  241. X    ""
  242. X};
  243. X
  244. Xresource 'ICON' (128, "Application", purgeable) {
  245. X    $"00 01 00 00 00 02 80 00 00 04 40 00 00 08 20 00"
  246. X    $"00 10 10 00 00 22 08 00 00 45 04 00 00 88 82 00"
  247. X    $"01 05 15 00 02 02 A8 80 04 40 40 40 08 A8 80 20"
  248. X    $"11 15 00 10 24 8A 00 28 40 51 3F 44 91 20 C0 8A"
  249. X    $"40 00 80 51 24 41 30 22 10 01 C8 14 09 1E 7F 8F"
  250. X    $"04 02 30 07 02 41 00 07 01 00 80 07 00 80 60 07"
  251. X    $"00 40 1F E7 00 20 02 1F 00 10 04 07 00 08 08 00"
  252. X    $"00 04 10 00 00 02 20 00 00 01 40 00 00 00 80"
  253. X};
  254. X
  255. Xresource 'ICON' (256, "Command Set", purgeable) {
  256. X    $"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
  257. X    $"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
  258. X    $"00 00 00 00 7F FF FF FE 80 00 00 01 9A AA AA A9"
  259. X    $"80 00 00 01 95 55 55 59 80 00 00 01 9A AA AA A9"
  260. X    $"80 00 00 01 85 7F FF 51 80 00 00 01 80 00 00 01"
  261. X    $"7F FF FF FE"
  262. X};
  263. X
  264. Xresource 'ICON' (257, "TEXT Editor", purgeable) {
  265. X    $"0F FF FE 00 08 00 03 00 08 00 02 80 08 00 02 40"
  266. X    $"08 00 02 20 08 00 02 10 08 00 03 F8 08 00 00 08"
  267. X    $"08 00 00 08 08 07 C0 08 08 0F E0 08 08 18 30 08"
  268. X    $"08 30 18 08 08 20 18 08 08 00 18 08 08 00 30 08"
  269. X    $"08 00 60 08 08 00 C0 08 08 01 80 08 08 01 80 08"
  270. X    $"08 01 80 08 08 01 80 08 08 00 00 08 08 01 80 08"
  271. X    $"08 03 C0 08 08 01 80 08 08 00 00 08 08 00 00 08"
  272. X    $"08 00 00 08 08 00 00 08 08 00 00 08 0F FF FF F8"
  273. X};
  274. X
  275. Xresource 'ICN#' (128, "Application", purgeable) {
  276. X    { /* array: 2 elements */
  277. X        /* [1] */
  278. X        $"00 01 00 00 00 02 80 00 00 04 40 00 00 08 20 00"
  279. X        $"00 10 10 00 00 22 08 00 00 45 04 00 00 88 82 00"
  280. X        $"01 05 15 00 02 02 A8 80 04 40 40 40 08 A8 80 20"
  281. X        $"11 15 00 10 24 8A 00 28 40 51 3F 44 91 20 C0 8A"
  282. X        $"40 00 80 51 24 41 30 22 10 01 C8 14 09 1E 7F 8F"
  283. X        $"04 02 30 07 02 41 00 07 01 00 80 07 00 80 60 07"
  284. X        $"00 40 1F E7 00 20 02 1F 00 10 04 07 00 08 08 00"
  285. X        $"00 04 10 00 00 02 20 00 00 01 40 00 00 00 80",
  286. X        /* [2] */
  287. X        $"00 01 00 00 00 03 80 00 00 07 C0 00 00 0F E0 00"
  288. X        $"00 1F F0 00 00 3F F8 00 00 7F FC 00 00 FF FE 00"
  289. X        $"01 FF FF 00 03 FF FF 80 07 FF FF C0 0F FF FF E0"
  290. X        $"1F FF FF F0 3F FF FF F8 7F FF FF FC FF FF FF FE"
  291. X        $"7F FF FF FF 3F FF FF FE 1F FF FF FC 0F FF FF FF"
  292. X        $"07 FF FF FF 03 FF FF FF 01 FF FF FF 00 FF FF FF"
  293. X        $"00 7F FF FF 00 3F FE 1F 00 1F FC 07 00 0F F8 00"
  294. X        $"00 07 F0 00 00 03 E0 00 00 01 C0 00 00 00 80"
  295. X    }
  296. X};
  297. X
  298. Xresource 'ICN#' (129, "Save Files", purgeable) {
  299. X    { /* array: 2 elements */
  300. X        /* [1] */
  301. X        $"0F FF FE 00 08 00 03 00 08 00 02 80 08 00 02 40"
  302. X        $"08 00 02 20 08 00 02 10 08 00 03 F8 08 00 00 08"
  303. X        $"08 00 00 08 08 7F FE 08 08 FF FF 08 09 80 01 88"
  304. X        $"09 9F F9 88 09 B0 09 88 09 B1 29 88 09 92 A9 88"
  305. X        $"09 91 29 88 09 B0 49 88 09 B0 09 88 09 9F F9 88"
  306. X        $"09 80 01 88 09 FF FF 88 09 FF FF 88 09 80 01 88"
  307. X        $"08 00 00 08 09 12 64 88 09 B5 55 48 09 55 65 C8"
  308. X        $"09 15 55 48 09 12 55 48 08 00 00 08 0F FF FF F8",
  309. X        /* [2] */
  310. X        $"0F FF FE 00 0F FF FF 00 0F FF FF 80 0F FF FF C0"
  311. X        $"0F FF FF E0 0F FF FF F0 0F FF FF F8 0F FF FF F8"
  312. X        $"0F FF FF F8 0F FF FF F8 0F FF FF F8 0F FF FF F8"
  313. X        $"0F FF FF F8 0F FF FF F8 0F FF FF F8 0F FF FF F8"
  314. X        $"0F FF FF F8 0F FF FF F8 0F FF FF F8 0F FF FF F8"
  315. X        $"0F FF FF F8 0F FF FF F8 0F FF FF F8 0F FF FF F8"
  316. X        $"0F FF FF F8 0F FF FF F8 0F FF FF F8 0F FF FF F8"
  317. X        $"0F FF FF F8 0F FF FF F8 0F FF FF F8 0F FF FF F8"
  318. X    }
  319. X};
  320. X
  321. Xresource 'ICN#' (130, "Aux Files", purgeable) {
  322. X    { /* array: 2 elements */
  323. X        /* [1] */
  324. X        $"0F FF FE 00 08 00 03 00 08 00 02 80 09 FB AE 40"
  325. X        $"08 00 02 20 08 00 02 10 09 F7 7B F8 08 00 00 08"
  326. X        $"08 00 00 08 09 BB ED C8 08 00 00 08 08 00 00 08"
  327. X        $"09 F7 B7 C8 08 00 00 08 08 00 00 08 09 B5 FD C8"
  328. X        $"08 00 00 08 08 00 00 08 09 77 B6 C8 08 00 00 08"
  329. X        $"08 00 00 08 09 EB B7 48 08 00 00 08 08 00 00 08"
  330. X        $"08 00 00 08 09 12 64 88 09 B5 55 48 09 55 65 C8"
  331. X        $"09 15 55 48 09 12 55 48 08 00 00 08 0F FF FF F8",
  332. X        /* [2] */
  333. X        $"0F FF FE 00 0F FF FF 00 0F FF FF 80 0F FF FF C0"
  334. X        $"0F FF FF E0 0F FF FF F0 0F FF FF F8 0F FF FF F8"
  335. X        $"0F FF FF F8 0F FF FF F8 0F FF FF F8 0F FF FF F8"
  336. X        $"0F FF FF F8 0F FF FF F8 0F FF FF F8 0F FF FF F8"
  337. X        $"0F FF FF F8 0F FF FF F8 0F FF FF F8 0F FF FF F8"
  338. X        $"0F FF FF F8 0F FF FF F8 0F FF FF F8 0F FF FF F8"
  339. X        $"0F FF FF F8 0F FF FF F8 0F FF FF F8 0F FF FF F8"
  340. X        $"0F FF FF F8 0F FF FF F8 0F FF FF F8 0F FF FF F8"
  341. X    }
  342. X};
  343. X
  344. Xresource 'DLOG' (128, "About", purgeable) {
  345. X    {46, 26, 304, 274},
  346. X    dBoxProc,
  347. X    invisible,
  348. X    noGoAway,
  349. X    0x0,
  350. X    128,
  351. X    ""
  352. X};
  353. X
  354. Xresource 'DITL' (128, "About", purgeable) {
  355. X    {    /* array DITLarray: 4 elements */
  356. X        /* [1] */
  357. X        {224, 192, 247, 235},
  358. X        Button {
  359. X            enabled,
  360. X            "OK"
  361. X        },
  362. X        /* [2] */
  363. X        {232, 224, 241, 233},
  364. X        UserItem {
  365. X            disabled
  366. X        },
  367. X        /* [3] */
  368. X        {16, 8, 248, 184},
  369. X        StaticText {
  370. X            disabled,
  371. X            "Moria for the Macintosh\n"
  372. X            "Version 5.4\n"
  373. X            "Programmers:\n"
  374. X            "Robert Alan Koeneke\n"
  375. X            "Jimmey Wayne Todd\n\n"
  376. X            "UNIX Port:\n"
  377. X            "James E. Wilson\n\n"
  378. X            "Macintosh Port:\n"
  379. X            "Curtis W. McCauley"
  380. X        },
  381. X        /* [4] */
  382. X        {16, 195, 48, 227},
  383. X        Icon {
  384. X            disabled,
  385. X            128
  386. X        }
  387. X    }
  388. X};
  389. X
  390. Xresource 'STR ' (128, "About Title", purgeable) {
  391. X    "About Moria\311"
  392. X};
  393. X
  394. Xresource 'CNFG' (256, "Command Set", purgeable) {
  395. X    '-o\0x00\0x00'
  396. X};
  397. X
  398. Xresource 'DLOG' (256, "Command Set", purgeable) {
  399. X    {42, 34, 218, 404},
  400. X    dBoxProc,
  401. X    invisible,
  402. X    noGoAway,
  403. X    0x0,
  404. X    256,
  405. X    ""
  406. X};
  407. X
  408. Xresource 'DITL' (256, "Command Set", purgeable) {
  409. X    {    /* array DITLarray: 9 elements */
  410. X        /* [1] */
  411. X        {24, 296, 48, 352},
  412. X        Button {
  413. X            enabled,
  414. X            "OK"
  415. X        },
  416. X        /* [2] */
  417. X        {64, 296, 88, 352},
  418. X        Button {
  419. X            enabled,
  420. X            "Cancel"
  421. X        },
  422. X        /* [3] */
  423. X        {40, 24, 56, 200},
  424. X        RadioButton {
  425. X            enabled,
  426. X            "Rogue-Like Commands"
  427. X        },
  428. X        /* [4] */
  429. X        {64, 24, 80, 200},
  430. X        RadioButton {
  431. X            enabled,
  432. X            "Original Commands"
  433. X        },
  434. X        /* [5] */
  435. X        {112, 72, 168, 352},
  436. X        StaticText {
  437. X            disabled,
  438. X            "Choose the desired command set.  The change "
  439. X            "will take effect when you start the next game."
  440. X        },
  441. X        /* [6] */
  442. X        {16, 16, 96, 232},
  443. X        UserItem {
  444. X            disabled
  445. X        },
  446. X        /* [7] */
  447. X        {8, 24, 24, 104},
  448. X        StaticText {
  449. X            enabled,
  450. X            "Choose One"
  451. X        },
  452. X        /* [8] */
  453. X        {32, 336, 40, 344},
  454. X        UserItem {
  455. X            disabled
  456. X        },
  457. X        /* [9] */
  458. X        {112, 16, 144, 48},
  459. X        Icon {
  460. X            disabled,
  461. X            256
  462. X        }
  463. X    }
  464. X};
  465. X
  466. Xresource 'CNFG' (257, "TEXT Editor", purgeable) {
  467. X    'MACA'
  468. X};
  469. X
  470. Xresource 'DLOG' (257, "TEXT Editor", purgeable) {
  471. X    {42, 34, 226, 426},
  472. X    dBoxProc,
  473. X    invisible,
  474. X    noGoAway,
  475. X    0x0,
  476. X    257,
  477. X    ""
  478. X};
  479. X
  480. Xresource 'DITL' (257, "TEXT Editor", purgeable) {
  481. X    {    /* array DITLarray: 11 elements */
  482. X        /* [1] */
  483. X        {24, 320, 48, 376},
  484. X        Button {
  485. X            enabled,
  486. X            "OK"
  487. X        },
  488. X        /* [2] */
  489. X        {64, 320, 88, 376},
  490. X        Button {
  491. X            enabled,
  492. X            "Cancel"
  493. X        },
  494. X        /* [3] */
  495. X        {40, 24, 56, 200},
  496. X        RadioButton {
  497. X            enabled,
  498. X            "MacWrite"
  499. X        },
  500. X        /* [4] */
  501. X        {64, 24, 80, 176},
  502. X        RadioButton {
  503. X            enabled,
  504. X            "Microsoft Word"
  505. X        },
  506. X        /* [5] */
  507. X        {88, 24, 104, 176},
  508. X        RadioButton {
  509. X            enabled,
  510. X            "Other:  File Creator"
  511. X        },
  512. X        /* [6] */
  513. X        {88, 176, 104, 240},
  514. X        EditText {
  515. X            disabled,
  516. X            ""
  517. X        },
  518. X        /* [7] */
  519. X        {136, 72, 176, 376},
  520. X        StaticText {
  521. X            disabled,
  522. X            "Choose what kind of documents you want Moria "
  523. X            "to create when it prints to a file."
  524. X        },
  525. X        /* [8] */
  526. X        {16, 8, 120, 264},
  527. X        UserItem {
  528. X            disabled
  529. X        },
  530. X        /* [9] */
  531. X        {8, 24, 24, 104},
  532. X        StaticText {
  533. X            enabled,
  534. X            "Choose One"
  535. X        },
  536. X        /* [10] */
  537. X        {32, 360, 40, 368},
  538. X        UserItem {
  539. X            disabled
  540. X        },
  541. X        /* [11] */
  542. X        {136, 16, 168, 48},
  543. X        Icon {
  544. X            disabled,
  545. X            257
  546. X        }
  547. X    }
  548. X};
  549. X
  550. Xresource 'DLOG' (258, "Save, Quit, or Cancel", purgeable) {
  551. X    {40, 40, 168, 318},
  552. X    dBoxProc,
  553. X    invisible,
  554. X    noGoAway,
  555. X    0x0,
  556. X    258,
  557. X    ""
  558. X};
  559. X
  560. Xresource 'DITL' (258, "Save, Quit, or Cancel", purgeable) {
  561. X    {    /* array DITLarray: 6 elements */
  562. X        /* [1] */
  563. X        {64, 16, 84, 76},
  564. X        Button {
  565. X            enabled,
  566. X            "Save"
  567. X        },
  568. X        /* [2] */
  569. X        {96, 16, 116, 76},
  570. X        Button {
  571. X            enabled,
  572. X            "Quit"
  573. X        },
  574. X        /* [3] */
  575. X        {96, 200, 116, 260},
  576. X        Button {
  577. X            enabled,
  578. X            "Cancel"
  579. X        },
  580. X        /* [4] */
  581. X        {64, 200, 80, 216},
  582. X        UserItem {
  583. X            disabled
  584. X        },
  585. X        /* [5] */
  586. X        {8, 56, 48, 264},
  587. X        StaticText {
  588. X            disabled,
  589. X            "What do you want to do with the game in progress?"
  590. X        },
  591. X        /* [6] */
  592. X        {8, 16, 40, 48},
  593. X        Icon {
  594. X            disabled,
  595. X            0
  596. X        }
  597. X    }
  598. X};
  599. X
  600. Xresource 'MENU' (129, "File") {
  601. X    129,
  602. X    textMenuProc,
  603. X    0x7FFFFFC3,
  604. X    enabled,
  605. X    "File",
  606. X    {    /* array: 7 elements */
  607. X        /* [1] */
  608. X        "New", noIcon, "N", "", plain,
  609. X        /* [2] */
  610. X        "Open\311", noIcon, "O", "", plain,
  611. X        /* [3] */
  612. X        "-", noIcon, "", "", plain,
  613. X        /* [4] */
  614. X        "Save", noIcon, "S", "", plain,
  615. X        /* [5] */
  616. X        "Save As\311", noIcon, "", "", plain,
  617. X        /* [6] */
  618. X        "-", noIcon, "", "", plain,
  619. X        /* [7] */
  620. X        "Quit", noIcon, "Q", "", plain
  621. X    }
  622. X};
  623. X
  624. Xresource 'MENU' (229, "File (No Keys)") {
  625. X    229,
  626. X    textMenuProc,
  627. X    0x7FFFFFC3,
  628. X    enabled,
  629. X    "File",
  630. X    {    /* array: 7 elements */
  631. X        /* [1] */
  632. X        "New", noIcon, "", "", plain,
  633. X        /* [2] */
  634. X        "Open\311", noIcon, "", "", plain,
  635. X        /* [3] */
  636. X        "-", noIcon, "", "", plain,
  637. X        /* [4] */
  638. X        "Save", noIcon, "", "", plain,
  639. X        /* [5] */
  640. X        "Save As\311", noIcon, "", "", plain,
  641. X        /* [6] */
  642. X        "-", noIcon, "", "", plain,
  643. X        /* [7] */
  644. X        "Quit", noIcon, "", "", plain
  645. X    }
  646. X};
  647. X
  648. Xresource 'MENU' (133, "Moria") {
  649. X    133,
  650. X    textMenuProc,
  651. X    0x7FFFFF17,
  652. X    enabled,
  653. X    "Moria",
  654. X    {    /* array: 5 elements */
  655. X        /* [1] */
  656. X        "Help\311", noIcon, "H", "", plain,
  657. X        /* [2] */
  658. X        "Command Set\311", noIcon, "", "", plain,
  659. X        /* [3] */
  660. X        "TEXT Editor\311", noIcon, "", "", plain,
  661. X        /* [4] */
  662. X        "-", noIcon, "", "", plain,
  663. X        /* [5] */
  664. X        "High Scores\311", noIcon, "", "", plain
  665. X    }
  666. X};
  667. X
  668. Xresource 'MENU' (233, "Moria (No Keys)") {
  669. X    233,
  670. X    textMenuProc,
  671. X    0x7FFFFF17,
  672. X    enabled,
  673. X    "Moria",
  674. X    {    /* array: 5 elements */
  675. X        /* [1] */
  676. X        "Help\311", noIcon, "", "", plain,
  677. X        /* [2] */
  678. X        "Command Set\311", noIcon, "", "", plain,
  679. X        /* [3] */
  680. X        "TEXT Editor\311", noIcon, "", "", plain,
  681. X        /* [4] */
  682. X        "-", noIcon, "", "", plain,
  683. X        /* [5] */
  684. X        "High Scores\311", noIcon, "", "", plain
  685. X    }
  686. X};
  687. X
  688. Xresource 'DLOG' (512, "Mac Help", purgeable) {
  689. X    {40, 34, 310, 496},
  690. X    dBoxProc,
  691. X    invisible,
  692. X    noGoAway,
  693. X    0x0,
  694. X    512,
  695. X    ""
  696. X};
  697. X
  698. Xresource 'DITL' (512, "Mac Help", purgeable) {
  699. X    {    /* array DITLarray: 6 elements */
  700. X        /* [1] */
  701. X        {16, 392, 36, 452},
  702. X        Button {
  703. X            enabled,
  704. X            "Ok"
  705. X        },
  706. X        /* [2] */
  707. X        {24, 432, 32, 440},
  708. X        UserItem {
  709. X            disabled
  710. X        },
  711. X        /* [3] */
  712. X        {48, 8, 264, 440},
  713. X        UserItem {
  714. X            disabled
  715. X        },
  716. X        /* [4] */
  717. X        {48, 439, 264, 455},
  718. X        Control {
  719. X            enabled,
  720. X            512
  721. X        },
  722. X        /* [5] */
  723. X        {8, 52, 40, 380},
  724. X        StaticText {
  725. X            disabled,
  726. X            "Moria for the Macintosh Version 5.4"
  727. X        },
  728. X        /* [6] */
  729. X        {8, 8, 40, 40},
  730. X        Icon {
  731. X            disabled,
  732. X            128
  733. X        }
  734. X    }
  735. X};
  736. X
  737. Xresource 'CNTL' (512, "Mac Help Scroll Bar", purgeable) {
  738. X    {0, 0, 216, 16},
  739. X    0,
  740. X    visible,
  741. X    0,
  742. X    0,
  743. X    scrollBarProc,
  744. X    0,
  745. X    ""
  746. X};
  747. X
  748. Xresource 'TEXT' (512, "Mac Help", purgeable) {
  749. X    "This is an beta version of Mac Moria, implementation 2.0b1, which is "
  750. X    "based on the Umoria 5.4 sources.  Please send comments and bug repor"
  751. X    "ts to wilson@toad.com (Jim Wilson).\n\n"
  752. X    "Users of previous versions o"
  753. X    "f Mac Moria should discard the old program.  Otherwise, the Finder mig"
  754. X    "ht get confused when you double-click on a saved game to start Moria.\n"
  755. X    "\n*****************************\n\nMoria is a dungeon exploration game.  "
  756. X    "The name comes from \322The Lord of the Rings\323 trilogy written by J. R"
  757. X    ". R. Tolkien.  Moria is pronounced with the accent on the first syllable,"
  758. X    " e.g. MORE-ee-ah.  For details on the game itself, please read the Mor"
  759. X    "ia Docs file that is distributed along with Moria.\n\nMoria was original"
  760. X    "ly written for VAX/VMS systems.  As such,  it is heavily dependent on "
  761. X    "the keyboard for game play.  The mouse is not used at all, except for "
  762. X    "standard things like menus and dialogs.  To get a list of the availabl"
  763. X    "e keyboard commands, hit the \324?\325 key while playing the game.\n\nSome"
  764. X    " of the commands are specified as being control characters, i.e.  saving t"
  765. X    "he game is ^X.  To type these characters hold down the control key and"
  766. X    " then press the appropriate character key.  If you do not have a contr"
  767. X    "ol key, use the command key (apple/cloverleaf key) instead of the cont"
  768. X    "rol key.  If you prefer, you may enter these commands using two keystr"
  769. X    "okes, by first typing the '^' key followed by the letter.\n\nThe game al"
  770. X    "so uses the escape key (ESC) quite a bit.  If you do not have an escap"
  771. X    "e key on your keyboard, you can use the ` key or the Clear key on the "
  772. X    "numeric keypad instead.  An escape can also by typed as ^[, i.e. contr"
  773. X    "ol (or command) left bracket.\n\nFile Menu\n\nThe game fully supports the "
  774. X    "standard Macintosh file menu.  Use New to start playing a new game,  o"
  775. X    "r Open to restart a previous game.   Save As will always ask you for t"
  776. X    "he name of the file to save your character in.  Save will usually save"
  777. X    " the game in a file with the same name as the name of the current char"
  778. X    "acter.  If you are playing a new game, or have changed the name of you"
  779. X    "r character, Save will instead ask you for the name of the save file. "
  780. X    " The Quit option, of course, is used to exit the game.\n\nA game can onl"
  781. X    "y be saved at the point where it is your turn to move.  At all other t"
  782. X    "imes the Save command will not be available.\n\nThe File Menu is disable"
  783. X    "d while saving and restoring games.  There is no cause for alarm if you "
  784. X    "see this occur.  After the operation is completed, there will be a prompt"
  785. X    " that says \322press any key to continue\323.  After you press a key, t"
  786. X    "he File Menu will be reenabled.\n\nIf your character dies, or you decide"
  787. X    " to stop running him, you will be prompted via a standard file dialog "
  788. X    "for the name of a file in which to save his memories.  Pressing cancel"
  789. X    " will avoid saving the memories.\n\nEdit Menu\n\nThe Edit Menu items are n"
  790. X    "ot used by the game.  The Edit menu is disabled unless there is a Desk"
  791. X    " Accessory open.\n\nScreen/FontSize Menu\n\nIf you have a color system, th"
  792. X    "e Color item allows you to choose the background and foreground colors"
  793. X    " of the game window.  The game must use a constant width font, so only"
  794. X    " the Monaco font is supported.  You can, however, specify which point "
  795. X    "size that you want to use.  The menu will list every point size availa"
  796. X    "ble on your Macintosh for the Monaco font.\n\nAdvanced users can choose "
  797. X    "a different font by using ResEdit or a similar program to edit the STR"
  798. X    " \"Font Name\" resource.\n\nMoria Menu\n\nHelp brings up this dialog.\n\n"
  799. X    "Command Set allows you to choose between the original Moria command set "
  800. X    "and an optional command set similar to the UNIX game Rogue.  The main dif"
  801. X    "ference between the two is that the original command set uses the nume"
  802. X    "ric keypad for movement, whereas the Rogue-like command set uses the \324"
  803. X    "hjkl\325 keys for, respectively, left down up and right.  The program wil"
  804. X    "l remember your setting and use it as a default the next time you star"
  805. X    "t a new character.  The command set can be chosen for the current char"
  806. X    "acter by using the set options ('=') command.\n\nNote that the numeric k"
  807. X    "eypad, if your system has one, is always available for indicating dire"
  808. X    "ctions, regardless of the command set chosen.  The arrow keys will wor"
  809. X    "k as well.\n\nText Editor allows you to choose the type of TEXT file cre"
  810. X    "ated by Moria, that is, it allows you to specify which application wil"
  811. X    "l be used by the Finder when you open a TEXT file created by Moria.  Y"
  812. X    "ou can choose MacWrite or Microsoft Word files.  You can also specify "
  813. X    "the signature of the desired application if you prefer something else."
  814. X    "\n\nHigh Scores displays all of the scores stored in the scorefile.  You"
  815. X    " can clear these scores by just deleting the High Scores file.  This f"
  816. X    "eature is not implemented.\n\nConfiguration Info\n\nMoria is fully Multifi"
  817. X    "nder compatible/aware.  It requires 450 K of memory under Multifinder."
  818. X    "  The game will run on any Macintosh with 1 Megabyte or more of memory"
  819. X    ".\n\nMoria comes with a documentation file, called Moria Docs.  The Mori"
  820. X    "a Docs file is an explanation of the game system.  Please remember to "
  821. X    "always distribute this file with the game, since it contains much impo"
  822. X    "rtant information.\n\nMoria will create two files when it is run.  The H"
  823. X    "igh Scores file keeps a list of the scores of all of the previous game"
  824. X    "s.  If this file is not present, a new one will be created in the fold"
  825. X    "er which contains the game.  This file can be kept either in the folde"
  826. X    "r that contains the application, or in the System Folder.\n\nMoria also "
  827. X    "creates a file called Moria Config in the System Folder.  This file co"
  828. X    "ntains all of the configuration info for Moria, such as the size and l"
  829. X    "ocation of windows, the font size, the command set, etc.  This file mu"
  830. X    "st remain in the Sytem Folder.\n\nThe text displayed when Moria starts u"
  831. X    "p is stored in the data fork of this program.  You can edit it with mo"
  832. X    "st text editors by first changing the file type of the program from 'A"
  833. X    "PPL' to 'TEXT' with ResEdit.  Remember to change the file type back ag"
  834. X    "ain when you are through.  Be careful not to disturb the lines which b"
  835. X    "egin with a '#'.\n\0x00"
  836. X};
  837. X
  838. Xtype 'DFPR' {
  839. X    unsigned hex integer = $600A;                    /* branch around header */
  840. X    unsigned hex integer;                            /* flags */
  841. X    unsigned literal longint;                        /* resource type */
  842. X    integer;                                        /* resource id */
  843. X    integer;                                        /* version */
  844. X    unsigned hex integer = $4EF9;                    /* jump instruction */
  845. X    unsigned hex longint = $0;                        /* target address for jump */
  846. X};
  847. X
  848. Xtype 'LDEF' as 'DFPR';
  849. X
  850. Xresource 'LDEF' (514, "High Scores", purgeable) {
  851. X    $0, 'LDEF', 514, 0
  852. X};
  853. X
  854. Xresource 'DITL' (514, "High Scores", purgeable) {
  855. X    {    /* array DITLarray: 5 elements */
  856. X        /* [1] */
  857. X        {15, 422, 35, 482},
  858. X        Button {
  859. X            enabled,
  860. X            "Ok"
  861. X        },
  862. X        /* [2] */
  863. X        {24, 464, 32, 472},
  864. X        UserItem {
  865. X            disabled
  866. X        },
  867. X        /* [3] */
  868. X        {48, 2, 281, 490},
  869. X        UserItem {
  870. X            disabled
  871. X        },
  872. X        /* [4] */
  873. X        {8, 56, 40, 336},
  874. X        StaticText {
  875. X            disabled,
  876. X            "Moria High Scores\n"
  877. X            "Positions ^0 to ^1"
  878. X        },
  879. X        /* [5] */
  880. X        {8, 8, 40, 40},
  881. X        Icon {
  882. X            disabled,
  883. X            128
  884. X        }
  885. X    }
  886. X};
  887. X
  888. Xresource 'DLOG' (514, "High Scores", purgeable) {
  889. X    {40, 34, 327, 526},
  890. X    dBoxProc,
  891. X    invisible,
  892. X    noGoAway,
  893. X    0x0,
  894. X    514,
  895. X    ""
  896. X};
  897. X
  898. Xresource 'DITL' (1024, "General Error", purgeable) {
  899. X    {    /* array DITLarray: 2 elements */
  900. X        /* [1] */
  901. X        {80, 304, 100, 364},
  902. X        Button {
  903. X            enabled,
  904. X            "Ok"
  905. X        },
  906. X        /* [2] */
  907. X        {7, 68, 71, 364},
  908. X        StaticText {
  909. X            disabled,
  910. X            "^0"
  911. X        }
  912. X    }
  913. X};
  914. X
  915. Xresource 'ALRT' (1024, "General Error", purgeable) {
  916. X    {42, 42, 148, 416},
  917. X    1024,
  918. X    {    /* array: 4 elements */
  919. X        /* [1] */
  920. X        OK, visible, sound1,
  921. X        /* [2] */
  922. X        OK, visible, sound1,
  923. X        /* [3] */
  924. X        OK, visible, sound1,
  925. X        /* [4] */
  926. X        OK, visible, sound1
  927. X    }
  928. X};
  929. X
  930. Xresource 'SIZE' (-1) {
  931. X    dontSaveScreen,
  932. X    acceptSuspendResumeEvents,
  933. X    enableOptionSwitch,
  934. X    canBackground,
  935. X    multiFinderAware,
  936. X    backgroundAndForeground,
  937. X    dontGetFrontClicks,
  938. X    ignoreChildDiedEvents,
  939. X    not32BitCompatible,
  940. X    reserved,
  941. X    reserved,
  942. X    reserved,
  943. X    reserved,
  944. X    reserved,
  945. X    reserved,
  946. X    reserved,
  947. X    375 * 1024,
  948. X    375 * 1024
  949. X};
  950. END_OF_FILE
  951. if test 19941 -ne `wc -c <'mac/moria.r'`; then
  952.     echo shar: \"'mac/moria.r'\" unpacked with wrong size!
  953. fi
  954. # end of 'mac/moria.r'
  955. fi
  956. if test -f 'source/store2.c' -a "${1}" != "-c" ; then 
  957.   echo shar: Will not clobber existing file \"'source/store2.c'\"
  958. else
  959. echo shar: Extracting \"'source/store2.c'\" \(29309 characters\)
  960. sed "s/^X//" >'source/store2.c' <<'END_OF_FILE'
  961. X/* source/store2.c: store code, entering, command interpreter, buying, selling
  962. X
  963. X   Copyright (c) 1989-92 James E. Wilson, Robert A. Koeneke
  964. X
  965. X   This software may be copied and distributed for educational, research, and
  966. X   not for profit purposes provided that this copyright and statement are
  967. X   included in all such copies. */
  968. X
  969. X#ifdef __TURBOC__
  970. X#include    <stdio.h>
  971. X#include    <stdlib.h>
  972. X#endif /* __TURBOC__ */
  973. X#include "config.h"
  974. X#include "constant.h"
  975. X#include "types.h"
  976. X#include "externs.h"
  977. X
  978. X#ifdef USG
  979. X#ifndef ATARIST_MWC
  980. X#include <string.h>
  981. X#endif
  982. X#else
  983. X#include <strings.h>
  984. X#endif
  985. X
  986. X#if defined(LINT_ARGS)
  987. Xstatic void prt_comment1(void);
  988. Xstatic void prt_comment2(int32, int32, int);
  989. Xstatic void prt_comment3(int32, int32, int);
  990. Xstatic void prt_comment4(void);
  991. Xstatic void prt_comment5(void);
  992. Xstatic void prt_comment6(void);
  993. Xstatic void display_commands(void);
  994. Xstatic void haggle_commands(int);
  995. Xstatic void display_inventory(int, int);
  996. Xstatic void display_cost(int, int);
  997. Xstatic void store_prt_gold(void);
  998. Xstatic void display_store(int, int);
  999. Xstatic int get_store_item(int *, char *, int, int);
  1000. Xstatic int increase_insults(int);
  1001. Xstatic void decrease_insults(int);
  1002. Xstatic int haggle_insults(int);
  1003. Xstatic int get_haggle(char *, int32 *, int);
  1004. Xstatic int receive_offer(int, char *, int32 *, int32, int, int);
  1005. Xstatic int purchase_haggle(int, int32 *, struct inven_type *);
  1006. Xstatic int sell_haggle(int, int32 *, struct inven_type *);
  1007. Xstatic int store_purchase(int, int *);
  1008. Xstatic int store_sell(int, int *);
  1009. X#endif
  1010. X
  1011. X#ifdef ATARIST_TC
  1012. X/* Include this to get prototypes for standard library functions.  */
  1013. X#include <stdlib.h>
  1014. X#endif
  1015. X
  1016. Xlong atol();
  1017. X
  1018. Xstatic char *comment1[14] = {
  1019. X  "Done!",  "Accepted!",  "Fine.",  "Agreed!",  "Ok.",  "Taken!",
  1020. X  "You drive a hard bargain, but taken.",
  1021. X  "You'll force me bankrupt, but it's a deal.",  "Sigh.  I'll take it.",
  1022. X  "My poor sick children may starve, but done!",  "Finally!  I accept.",
  1023. X  "Robbed again.",  "A pleasure to do business with you!",
  1024. X  "My spouse will skin me, but accepted."
  1025. X  };
  1026. X
  1027. Xstatic char *comment2a[3] = {
  1028. X  "%A2 is my final offer; take it or leave it.",
  1029. X  "I'll give you no more than %A2.",
  1030. X  "My patience grows thin.  %A2 is final."
  1031. X  };
  1032. X
  1033. Xstatic char *comment2b[16] = {
  1034. X  "%A1 for such a fine item?  HA!  No less than %A2.",
  1035. X  "%A1 is an insult!  Try %A2 gold pieces.",
  1036. X  "%A1?!?  You would rob my poor starving children?",
  1037. X  "Why, I'll take no less than %A2 gold pieces.",
  1038. X  "Ha!  No less than %A2 gold pieces.",
  1039. X  "Thou knave!  No less than %A2 gold pieces.",
  1040. X  "%A1 is far too little, how about %A2?",
  1041. X  "I paid more than %A1 for it myself, try %A2.",
  1042. X  "%A1?  Are you mad?!?  How about %A2 gold pieces?",
  1043. X  "As scrap this would bring %A1.  Try %A2 in gold.",
  1044. X  "May the fleas of 1000 orcs molest you.  I want %A2.",
  1045. X  "My mother you can get for %A1, this costs %A2.",
  1046. X  "May your chickens grow lips.  I want %A2 in gold!",
  1047. X  "Sell this for such a pittance?  Give me %A2 gold.",
  1048. X  "May the Balrog find you tasty!  %A2 gold pieces?",
  1049. X  "Your mother was a Troll!  %A2 or I'll tell."
  1050. X  };
  1051. X
  1052. Xstatic char *comment3a[3] = {
  1053. X  "I'll pay no more than %A1; take it or leave it.",
  1054. X  "You'll get no more than %A1 from me.",
  1055. X  "%A1 and that's final."
  1056. X  };
  1057. X
  1058. Xstatic char *comment3b[15] = {
  1059. X  "%A2 for that piece of junk?  No more than %A1.",
  1060. X  "For %A2 I could own ten of those.  Try %A1.",
  1061. X  "%A2?  NEVER!  %A1 is more like it.",
  1062. X  "Let's be reasonable. How about %A1 gold pieces?",
  1063. X  "%A1 gold for that junk, no more.",
  1064. X  "%A1 gold pieces and be thankful for it!",
  1065. X  "%A1 gold pieces and not a copper more.",
  1066. X  "%A2 gold?  HA!  %A1 is more like it.",  "Try about %A1 gold.",
  1067. X  "I wouldn't pay %A2 for your children, try %A1.",
  1068. X  "*CHOKE* For that!?  Let's say %A1.",  "How about %A1?",
  1069. X  "That looks war surplus!  Say %A1 gold.",
  1070. X  "I'll buy it as scrap for %A1.",
  1071. X  "%A2 is too much, let us say %A1 gold."
  1072. X  };
  1073. X
  1074. Xstatic char *comment4a[5] = {
  1075. X  "ENOUGH!  You have abused me once too often!",
  1076. X  "THAT DOES IT!  You shall waste my time no more!",
  1077. X  "This is getting nowhere.  I'm going home!",
  1078. X  "BAH!  No more shall you insult me!",
  1079. X  "Begone!  I have had enough abuse for one day."
  1080. X  };
  1081. X
  1082. Xstatic char *comment4b[5] = {
  1083. X  "Out of my place!",  "out... Out... OUT!!!",  "Come back tomorrow.",
  1084. X  "Leave my place.  Begone!",  "Come back when thou art richer."
  1085. X  };
  1086. X
  1087. Xstatic char *comment5[10] = {
  1088. X  "You will have to do better than that!",  "That's an insult!",
  1089. X  "Do you wish to do business or not?",  "Hah!  Try again.",
  1090. X  "Ridiculous!",  "You've got to be kidding!",  "You'd better be kidding!",
  1091. X  "You try my patience.",  "I don't hear you.",
  1092. X  "Hmmm, nice weather we're having."
  1093. X  };
  1094. X
  1095. Xstatic char *comment6[5] = {
  1096. X  "I must have heard you wrong.",  "What was that?",
  1097. X  "I'm sorry, say that again.",  "What did you say?",
  1098. X  "Sorry, what was that again?"
  1099. X  };
  1100. X
  1101. X
  1102. Xextern int16 last_store_inc;
  1103. X
  1104. X/* Comments vary.                    -RAK-    */
  1105. X/* Comment one : Finished haggling                */
  1106. Xstatic void prt_comment1()
  1107. X{
  1108. X  msg_print(comment1[randint(14)-1]);
  1109. X}
  1110. X
  1111. X
  1112. X/* %A1 is offer, %A2 is asking.        */
  1113. Xstatic void prt_comment2(offer, asking, final)
  1114. Xint32 offer, asking; int final;
  1115. X{
  1116. X  vtype comment;
  1117. X
  1118. X  if (final > 0)
  1119. X    (void) strcpy(comment, comment2a[randint(3)-1]);
  1120. X  else
  1121. X    (void) strcpy(comment, comment2b[randint(16)-1]);
  1122. X
  1123. X  insert_lnum(comment, "%A1", offer, FALSE);
  1124. X  insert_lnum(comment, "%A2", asking, FALSE);
  1125. X  msg_print(comment);
  1126. X}
  1127. X
  1128. X
  1129. Xstatic void prt_comment3(offer, asking, final)
  1130. Xint32 offer, asking; int final;
  1131. X{
  1132. X  vtype comment;
  1133. X
  1134. X  if (final > 0)
  1135. X    (void) strcpy (comment, comment3a[randint(3)-1]);
  1136. X  else
  1137. X    (void) strcpy (comment, comment3b[randint(15)-1]);
  1138. X
  1139. X  insert_lnum(comment, "%A1", offer, FALSE);
  1140. X  insert_lnum(comment, "%A2", asking, FALSE);
  1141. X  msg_print(comment);
  1142. X}
  1143. X
  1144. X
  1145. X/* Kick 'da bum out.                    -RAK-    */
  1146. Xstatic void prt_comment4()
  1147. X{
  1148. X  register int tmp;
  1149. X
  1150. X  tmp = randint(5) - 1;
  1151. X  msg_print(comment4a[tmp]);
  1152. X  msg_print(comment4b[tmp]);
  1153. X}
  1154. X
  1155. X
  1156. Xstatic void prt_comment5()
  1157. X{
  1158. X  msg_print(comment5[randint(10)-1]);
  1159. X}
  1160. X
  1161. X
  1162. Xstatic void prt_comment6()
  1163. X{
  1164. X  msg_print (comment6[randint(5)-1]);
  1165. X}
  1166. X
  1167. X
  1168. X/* Displays the set of commands                -RAK-    */
  1169. Xstatic void display_commands()
  1170. X{
  1171. X  prt("You may:", 20, 0);
  1172. X  prt(" p) Purchase an item.           b) Browse store's inventory.", 21, 0);
  1173. X  prt(" s) Sell an item.               i/e/t/w/x) Inventory/Equipment Lists.",
  1174. X      22, 0);
  1175. X  prt("ESC) Exit from Building.        ^R) Redraw the screen.", 23, 0);
  1176. X}
  1177. X
  1178. X
  1179. X/* Displays the set of commands                -RAK-    */
  1180. Xstatic void haggle_commands(typ)
  1181. Xint typ;
  1182. X{
  1183. X  if (typ == -1)
  1184. X    prt("Specify an asking-price in gold pieces.", 21, 0);
  1185. X  else
  1186. X    prt("Specify an offer in gold pieces.", 21, 0);
  1187. X  prt("ESC) Quit Haggling.", 22, 0);
  1188. X  erase_line (23, 0);    /* clear last line */
  1189. X}
  1190. X
  1191. X
  1192. X/* Displays a store's inventory                -RAK-    */
  1193. Xstatic void display_inventory(store_num, start)
  1194. Xint store_num, start;
  1195. X{
  1196. X  register store_type *s_ptr;
  1197. X  register inven_type *i_ptr;
  1198. X  register int i, j, stop;
  1199. X  bigvtype out_val1, out_val2;
  1200. X  int32 x;
  1201. X
  1202. X  s_ptr = &store[store_num];
  1203. X  i = (start % 12);
  1204. X  stop = ((start / 12) + 1) * 12;
  1205. X  if (stop > s_ptr->store_ctr)    stop = s_ptr->store_ctr;
  1206. X  while (start < stop)
  1207. X    {
  1208. X      i_ptr = &s_ptr->store_inven[start].sitem;
  1209. X      x = i_ptr->number;
  1210. X      if ((i_ptr->subval >= ITEM_SINGLE_STACK_MIN)
  1211. X      && (i_ptr->subval <= ITEM_SINGLE_STACK_MAX))
  1212. X    i_ptr->number = 1;
  1213. X      objdes(out_val1, i_ptr, TRUE);
  1214. X      i_ptr->number = x;
  1215. X      (void) sprintf(out_val2, "%c) %s", 'a'+i, out_val1);
  1216. X      prt(out_val2, i+5, 0);
  1217. X      x = s_ptr->store_inven[start].scost;
  1218. X      if (x <= 0)
  1219. X    {
  1220. X      int32 value = -x;
  1221. X      value = value * chr_adj() / 100;
  1222. X      if (value <= 0)
  1223. X        value = 1;
  1224. X      (void) sprintf(out_val2, "%9ld", value);
  1225. X    }
  1226. X      else
  1227. X    (void) sprintf(out_val2,"%9ld [Fixed]", x);
  1228. X      prt(out_val2, i+5, 59);
  1229. X      i++;
  1230. X      start++;
  1231. X    }
  1232. X  if (i < 12)
  1233. X    for (j = 0; j < (11 - i + 1); j++)
  1234. X      erase_line (j+i+5, 0); /* clear remaining lines */
  1235. X  if (s_ptr->store_ctr > 12)
  1236. X    put_buffer("- cont. -", 17, 60);
  1237. X  else
  1238. X    erase_line (17, 60);
  1239. X}
  1240. X
  1241. X
  1242. X/* Re-displays only a single cost            -RAK-    */
  1243. Xstatic void display_cost(store_num, pos)
  1244. Xint store_num, pos;
  1245. X{
  1246. X  register int i;
  1247. X  register int32 j;
  1248. X  vtype out_val;
  1249. X  register store_type *s_ptr;
  1250. X
  1251. X  s_ptr = &store[store_num];
  1252. X  i = (pos % 12);
  1253. X  if (s_ptr->store_inven[pos].scost < 0)
  1254. X    {
  1255. X      j = - s_ptr->store_inven[pos].scost;
  1256. X      j = j * chr_adj() / 100;
  1257. X      (void) sprintf(out_val, "%ld", j);
  1258. X    }
  1259. X  else
  1260. X    (void) sprintf(out_val, "%9ld [Fixed]", s_ptr->store_inven[pos].scost);
  1261. X  prt(out_val, i+5, 59);
  1262. X}
  1263. X
  1264. X
  1265. X/* Displays players gold                    -RAK-    */
  1266. Xstatic void store_prt_gold()
  1267. X{
  1268. X  vtype out_val;
  1269. X
  1270. X  (void) sprintf(out_val, "Gold Remaining : %ld", py.misc.au);
  1271. X  prt(out_val, 18, 17);
  1272. X}
  1273. X
  1274. X
  1275. X/* Displays store                    -RAK-    */
  1276. Xstatic void display_store(store_num, cur_top)
  1277. Xint store_num, cur_top;
  1278. X{
  1279. X  register store_type *s_ptr;
  1280. X
  1281. X  s_ptr = &store[store_num];
  1282. X  clear_screen();
  1283. X  put_buffer(owners[s_ptr->owner].owner_name, 3, 9);
  1284. X  put_buffer("Item", 4, 3);
  1285. X  put_buffer("Asking Price", 4, 60);
  1286. X  store_prt_gold();
  1287. X  display_commands();
  1288. X  display_inventory(store_num, cur_top);
  1289. X}
  1290. X
  1291. X
  1292. X/* Get the ID of a store item and return it's value    -RAK-    */
  1293. Xstatic int get_store_item(com_val, pmt, i, j)
  1294. Xint *com_val;
  1295. Xchar *pmt;
  1296. Xregister int i, j;
  1297. X{
  1298. X  char command;
  1299. X  vtype out_val;
  1300. X  register int flag;
  1301. X
  1302. X  *com_val = -1;
  1303. X  flag = FALSE;
  1304. X  (void) sprintf(out_val, "(Items %c-%c, ESC to exit) %s", i+'a', j+'a', pmt);
  1305. X  while (get_com(out_val, &command))
  1306. X    {
  1307. X      command -= 'a';
  1308. X      if (command >= i && command <= j)
  1309. X    {
  1310. X      flag = TRUE;
  1311. X      *com_val = command;
  1312. X      break;
  1313. X    }
  1314. X      bell();
  1315. X    }
  1316. X  erase_line(MSG_LINE, 0);
  1317. X  return(flag);
  1318. X}
  1319. X
  1320. X
  1321. X/* Increase the insult counter and get angry if too many -RAK-    */
  1322. Xstatic int increase_insults(store_num)
  1323. Xint store_num;
  1324. X{
  1325. X  register int increase;
  1326. X  register store_type *s_ptr;
  1327. X
  1328. X  increase = FALSE;
  1329. X  s_ptr = &store[store_num];
  1330. X  s_ptr->insult_cur++;
  1331. X  if (s_ptr->insult_cur > owners[s_ptr->owner].insult_max)
  1332. X    {
  1333. X      prt_comment4();
  1334. X      s_ptr->insult_cur = 0;
  1335. X      s_ptr->good_buy = 0;
  1336. X      s_ptr->bad_buy = 0;
  1337. X      s_ptr->store_open = turn + 2500 + randint(2500);
  1338. X      increase = TRUE;
  1339. X    }
  1340. X  return(increase);
  1341. X}
  1342. X
  1343. X
  1344. X/* Decrease insults                    -RAK-    */
  1345. Xstatic void decrease_insults(store_num)
  1346. Xint store_num;
  1347. X{
  1348. X  register store_type *s_ptr;
  1349. X
  1350. X  s_ptr = &store[store_num];
  1351. X  if (s_ptr->insult_cur != 0)
  1352. X    s_ptr->insult_cur--;
  1353. X}
  1354. X
  1355. X
  1356. X/* Have insulted while haggling                -RAK-    */
  1357. Xstatic int haggle_insults(store_num)
  1358. Xint store_num;
  1359. X{
  1360. X  register int haggle;
  1361. X
  1362. X  haggle = FALSE;
  1363. X  if (increase_insults(store_num))
  1364. X    haggle = TRUE;
  1365. X  else
  1366. X    {
  1367. X      prt_comment5();
  1368. X      msg_print (CNIL); /* keep insult separate from rest of haggle */
  1369. X    }
  1370. X  return(haggle);
  1371. X}
  1372. X
  1373. X
  1374. Xstatic int get_haggle(comment, new_offer, num_offer)
  1375. Xchar *comment;
  1376. Xint32 *new_offer;
  1377. Xint num_offer;
  1378. X{
  1379. X  register int32 i;
  1380. X  vtype out_val, default_offer;
  1381. X  register int flag, clen;
  1382. X  int orig_clen;
  1383. X  register char *p;
  1384. X  int increment;
  1385. X
  1386. X  flag = TRUE;
  1387. X  increment = FALSE;
  1388. X  clen = strlen(comment);
  1389. X  orig_clen = clen;
  1390. X  if (num_offer == 0)
  1391. X    last_store_inc = 0;
  1392. X  i = 0;
  1393. X  do
  1394. X    {
  1395. X      prt(comment, 0, 0);
  1396. X      if (num_offer && last_store_inc != 0)
  1397. X    {
  1398. X      (void) sprintf (default_offer, "[%c%d] ",
  1399. X              (last_store_inc < 0) ? '-' : '+',
  1400. X              abs (last_store_inc));
  1401. X      prt (default_offer, 0, orig_clen);
  1402. X      clen = orig_clen + strlen (default_offer);
  1403. X    }
  1404. X      if (!get_string(out_val, 0, clen, 40))
  1405. X    flag = FALSE;
  1406. X      for (p = out_val; *p == ' '; p++)
  1407. X    ;
  1408. X      if (*p == '+' || *p == '-')
  1409. X    increment = TRUE;
  1410. X      if (num_offer && increment)
  1411. X    {
  1412. X      i = atol (out_val);
  1413. X      /* Don't accept a zero here.  Turn off increment if it was zero
  1414. X         because a zero will not exit.  This can be zero if the user
  1415. X         did not type a number after the +/- sign.  */
  1416. X      if (i == 0)
  1417. X        increment = FALSE;
  1418. X      else
  1419. X        last_store_inc = i;
  1420. X    }
  1421. X      else if (num_offer && *out_val == '\0')
  1422. X    {
  1423. X      i = last_store_inc;
  1424. X      increment = TRUE;
  1425. X    }
  1426. X      else
  1427. X    i = atol (out_val);
  1428. X
  1429. X      /* don't allow incremental haggling, if player has not made an offer
  1430. X     yet */
  1431. X      if (flag && num_offer == 0 && increment)
  1432. X    {
  1433. X      msg_print("You haven't even made your first offer yet!");
  1434. X      i = 0;
  1435. X      increment = FALSE;
  1436. X    }
  1437. X    }
  1438. X  while (flag && (i == 0));
  1439. X  if (flag)
  1440. X    {
  1441. X      if (increment)
  1442. X    *new_offer += i;
  1443. X      else
  1444. X    *new_offer = i;
  1445. X    }
  1446. X  else
  1447. X    erase_line (0, 0);
  1448. X  return(flag);
  1449. X}
  1450. X
  1451. X
  1452. Xstatic int receive_offer(store_num, comment, new_offer, last_offer,
  1453. X             num_offer, factor)
  1454. Xint store_num;
  1455. Xchar *comment;
  1456. Xregister int32 *new_offer, last_offer;
  1457. Xint num_offer, factor;
  1458. X{
  1459. X  register int flag;
  1460. X  register int receive;
  1461. X
  1462. X  receive = 0;
  1463. X  flag = FALSE;
  1464. X  do
  1465. X    {
  1466. X      if (get_haggle(comment, new_offer, num_offer))
  1467. X    {
  1468. X      if (*new_offer*factor >= last_offer*factor)
  1469. X        flag = TRUE;
  1470. X      else if (haggle_insults(store_num))
  1471. X        {
  1472. X          receive = 2;
  1473. X          flag = TRUE;
  1474. X        }
  1475. X      else
  1476. X        /* new_offer rejected, reset new_offer so that incremental
  1477. X           haggling works correctly */
  1478. X        *new_offer = last_offer;
  1479. X    }
  1480. X      else
  1481. X    {
  1482. X      receive = 1;
  1483. X      flag = TRUE;
  1484. X    }
  1485. X    }
  1486. X  while (!flag);
  1487. X  return(receive);
  1488. X}
  1489. X
  1490. X
  1491. X/* Haggling routine                    -RAK-    */
  1492. Xstatic int purchase_haggle(store_num, price, item)
  1493. Xint store_num;
  1494. Xint32 *price;
  1495. Xinven_type *item;
  1496. X{
  1497. X  int32 max_sell, min_sell, max_buy;
  1498. X  int32 cost, cur_ask, final_ask, min_offer;
  1499. X  int32 last_offer, new_offer;
  1500. X  int32 x1, x2, x3;
  1501. X  int32 min_per, max_per;
  1502. X  register int flag, loop_flag;
  1503. X  char *comment;
  1504. X  vtype out_val;
  1505. X  int purchase, num_offer, final_flag, didnt_haggle;
  1506. X  register store_type *s_ptr;
  1507. X  register owner_type *o_ptr;
  1508. X
  1509. X  flag = FALSE;
  1510. X  purchase = 0;
  1511. X  *price = 0;
  1512. X  final_flag = 0;
  1513. X  didnt_haggle = FALSE;
  1514. X  s_ptr = &store[store_num];
  1515. X  o_ptr = &owners[s_ptr->owner];
  1516. X  cost = sell_price(store_num, &max_sell, &min_sell, item);
  1517. X  max_sell = max_sell * chr_adj() / 100;
  1518. X  if (max_sell <= 0)  max_sell = 1;
  1519. X  min_sell = min_sell * chr_adj() / 100;
  1520. X  if (min_sell <= 0)  min_sell = 1;
  1521. X  /* cast max_inflate to signed so that subtraction works correctly */
  1522. X  max_buy  = cost * (200 - (int)o_ptr->max_inflate) / 100;
  1523. X  if (max_buy <= 0) max_buy = 1;
  1524. X  min_per  = o_ptr->haggle_per;
  1525. X  max_per  = min_per * 3;
  1526. X  haggle_commands(1);
  1527. X  cur_ask   = max_sell;
  1528. X  final_ask = min_sell;
  1529. X  min_offer = max_buy;
  1530. X  last_offer = min_offer;
  1531. X  new_offer = 0;
  1532. X  num_offer = 0; /* this prevents incremental haggling on first try */
  1533. X  comment = "Asking";
  1534. X
  1535. X  /* go right to final price if player has bargained well */
  1536. X  if (noneedtobargain(store_num, final_ask))
  1537. X    {
  1538. X      msg_print("After a long bargaining session, you agree upon the price.");
  1539. X      cur_ask = min_sell;
  1540. X      comment = "Final offer";
  1541. X      didnt_haggle = TRUE;
  1542. X
  1543. X      /* Set up automatic increment, so that a return will accept the
  1544. X     final price.  */
  1545. X      last_store_inc = min_sell;
  1546. X      num_offer = 1;
  1547. X    }
  1548. X
  1549. X  do
  1550. X    {
  1551. X      do
  1552. X    {
  1553. X      loop_flag = TRUE;
  1554. X      (void) sprintf(out_val, "%s :  %ld", comment, cur_ask);
  1555. X      put_buffer(out_val, 1, 0);
  1556. X      purchase = receive_offer(store_num, "What do you offer? ",
  1557. X                   &new_offer, last_offer, num_offer, 1);
  1558. X      if (purchase != 0)
  1559. X        flag = TRUE;
  1560. X      else
  1561. X        {
  1562. X          if (new_offer > cur_ask)
  1563. X        {
  1564. X          prt_comment6();
  1565. X          /* rejected, reset new_offer for incremental haggling */
  1566. X          new_offer = last_offer;
  1567. X
  1568. X          /* If the automatic increment is large enough to overflow,
  1569. X             then the player must have made a mistake.  Clear it
  1570. X             because it is useless.  */
  1571. X          if (last_offer + last_store_inc > cur_ask)
  1572. X            last_store_inc = 0;
  1573. X        }
  1574. X          else if (new_offer == cur_ask)
  1575. X        {
  1576. X          flag = TRUE;
  1577. X          *price = new_offer;
  1578. X        }
  1579. X          else
  1580. X        loop_flag = FALSE;
  1581. X        }
  1582. X    }
  1583. X      while (!flag && loop_flag);
  1584. X      if (!flag)
  1585. X    {
  1586. X      x1 = (new_offer - last_offer) * 100 / (cur_ask - last_offer);
  1587. X      if (x1 < min_per)
  1588. X        {
  1589. X          flag = haggle_insults(store_num);
  1590. X          if (flag)     purchase = 2;
  1591. X        }
  1592. X      else if (x1 > max_per)
  1593. X        {
  1594. X          x1 = x1 * 75 / 100;
  1595. X          if (x1 < max_per)     x1 = max_per;
  1596. X        }
  1597. X      x2 = x1 + randint(5) - 3;
  1598. X      x3 = ((cur_ask - new_offer) * x2 / 100) + 1;
  1599. X      /* don't let the price go up */
  1600. X      if (x3 < 0)
  1601. X        x3 = 0;
  1602. X      cur_ask -= x3;
  1603. X      if (cur_ask < final_ask)
  1604. X        {
  1605. X          cur_ask = final_ask;
  1606. X          comment = "Final Offer";
  1607. X          /* Set the automatic haggle increment so that RET will give
  1608. X         a new_offer equal to the final_ask price.  */
  1609. X          last_store_inc = final_ask - new_offer;
  1610. X          final_flag++;
  1611. X          if (final_flag > 3)
  1612. X        {
  1613. X          if (increase_insults(store_num))
  1614. X            purchase = 2;
  1615. X          else
  1616. X            purchase = 1;
  1617. X          flag = TRUE;
  1618. X        }
  1619. X        }
  1620. X      else if (new_offer >= cur_ask)
  1621. X        {
  1622. X          flag = TRUE;
  1623. X          *price = new_offer;
  1624. X        }
  1625. X      if (!flag)
  1626. X        {
  1627. X          last_offer = new_offer;
  1628. X          num_offer++; /* enable incremental haggling */
  1629. X          erase_line (1, 0);
  1630. X          (void) sprintf(out_val, "Your last offer : %ld", last_offer);
  1631. X          put_buffer(out_val, 1, 39);
  1632. X          prt_comment2(last_offer, cur_ask, final_flag);
  1633. X
  1634. X          /* If the current increment would take you over the store's
  1635. X         price, then decrease it to an exact match.  */
  1636. X          if (cur_ask - last_offer < last_store_inc)
  1637. X        last_store_inc = cur_ask - last_offer;
  1638. X        }
  1639. X    }
  1640. X    }
  1641. X  while (!flag);
  1642. X
  1643. X  /* update bargaining info */
  1644. X  if ((purchase == 0) && (!didnt_haggle))
  1645. X    updatebargain(store_num, *price, final_ask);
  1646. X
  1647. X  return(purchase);
  1648. X}
  1649. X
  1650. X
  1651. X/* Haggling routine                    -RAK-    */
  1652. Xstatic int sell_haggle(store_num, price, item)
  1653. Xint store_num;
  1654. Xint32 *price;
  1655. Xinven_type *item;
  1656. X{
  1657. X  int32 max_sell, max_buy, min_buy;
  1658. X  int32 cost, cur_ask, final_ask, min_offer;
  1659. X  int32 last_offer, new_offer;
  1660. X  int32 max_gold;
  1661. X  int32 x1, x2, x3;
  1662. X  int32 min_per, max_per;
  1663. X  register int flag, loop_flag;
  1664. X  char *comment;
  1665. X  vtype out_val;
  1666. X  register store_type *s_ptr;
  1667. X  register owner_type *o_ptr;
  1668. X  int sell, num_offer, final_flag, didnt_haggle;
  1669. X
  1670. X  flag = FALSE;
  1671. X  sell = 0;
  1672. X  *price = 0;
  1673. X  final_flag = 0;
  1674. X  didnt_haggle = FALSE;
  1675. X  s_ptr = &store[store_num];
  1676. X  cost = item_value(item);
  1677. X  if (cost < 1)
  1678. X    {
  1679. X      sell = 3;
  1680. X      flag = TRUE;
  1681. X    }
  1682. X  else
  1683. X    {
  1684. X      o_ptr = &owners[s_ptr->owner];
  1685. X      cost = cost * (200 - chr_adj()) / 100;
  1686. X      cost = cost * (200 - rgold_adj[o_ptr->owner_race][py.misc.prace]) / 100;
  1687. X      if (cost < 1)  cost = 1;
  1688. X      max_sell = cost * o_ptr->max_inflate / 100;
  1689. X      /* cast max_inflate to signed so that subtraction works correctly */
  1690. X      max_buy  = cost * (200 - (int)o_ptr->max_inflate) / 100;
  1691. X      min_buy  = cost * (200 - o_ptr->min_inflate) / 100;
  1692. X      if (min_buy < 1) min_buy = 1;
  1693. X      if (max_buy < 1) max_buy = 1;
  1694. X      if (min_buy < max_buy)  min_buy = max_buy;
  1695. X      min_per  = o_ptr->haggle_per;
  1696. X      max_per  = min_per * 3;
  1697. X      max_gold = o_ptr->max_cost;
  1698. X    }
  1699. X  if (!flag)
  1700. X    {
  1701. X      haggle_commands(-1);
  1702. X      num_offer = 0; /* this prevents incremental haggling on first try */
  1703. X      if (max_buy > max_gold)
  1704. X    {
  1705. X      final_flag= 1;
  1706. X      comment = "Final Offer";
  1707. X      /* Disable the automatic haggle increment on RET.  */
  1708. X      last_store_inc = 0;
  1709. X      cur_ask   = max_gold;
  1710. X      final_ask = max_gold;
  1711. X      msg_print("I am sorry, but I have not the money to afford such \
  1712. Xa fine item.");
  1713. X      didnt_haggle = TRUE;
  1714. X    }
  1715. X      else
  1716. X    {
  1717. X      cur_ask   = max_buy;
  1718. X      final_ask = min_buy;
  1719. X      if (final_ask > max_gold)
  1720. X        final_ask = max_gold;
  1721. X      comment = "Offer";
  1722. X
  1723. X      /* go right to final price if player has bargained well */
  1724. X          if (noneedtobargain(store_num, final_ask))
  1725. X        {
  1726. X          msg_print("After a long bargaining session, you agree upon \
  1727. Xthe price.");
  1728. X              cur_ask = final_ask;
  1729. X          comment = "Final offer";
  1730. X          didnt_haggle = TRUE;
  1731. X
  1732. X          /* Set up automatic increment, so that a return will accept the
  1733. X         final price.  */
  1734. X          last_store_inc = final_ask;
  1735. X          num_offer = 1;
  1736. X            }
  1737. X    }
  1738. X      min_offer = max_sell;
  1739. X      last_offer = min_offer;
  1740. X      new_offer = 0;
  1741. X      if (cur_ask < 1)    cur_ask = 1;
  1742. X      do
  1743. X    {
  1744. X      do
  1745. X        {
  1746. X          loop_flag = TRUE;
  1747. X          (void) sprintf(out_val, "%s :  %ld", comment, cur_ask);
  1748. X          put_buffer(out_val, 1, 0);
  1749. X          sell = receive_offer(store_num, "What price do you ask? ",
  1750. X                 &new_offer, last_offer, num_offer, -1);
  1751. X          if (sell != 0)
  1752. X        flag   = TRUE;
  1753. X          else
  1754. X        {
  1755. X          if (new_offer < cur_ask)
  1756. X            {
  1757. X              prt_comment6();
  1758. X              /* rejected, reset new_offer for incremental haggling */
  1759. X              new_offer = last_offer;
  1760. X
  1761. X              /* If the automatic increment is large enough to
  1762. X             overflow, then the player must have made a mistake.
  1763. X             Clear it because it is useless.  */
  1764. X              if (last_offer + last_store_inc < cur_ask)
  1765. X            last_store_inc = 0;
  1766. X            }
  1767. X          else if (new_offer == cur_ask)
  1768. X            {
  1769. X              flag = TRUE;
  1770. X              *price = new_offer;
  1771. X            }
  1772. X          else
  1773. X            loop_flag = FALSE;
  1774. X        }
  1775. X        }
  1776. X      while (!flag && loop_flag);
  1777. X      if (!flag)
  1778. X        {
  1779. X          x1 = (last_offer - new_offer) * 100 / (last_offer - cur_ask);
  1780. X          if (x1 < min_per)
  1781. X        {
  1782. X          flag = haggle_insults(store_num);
  1783. X          if (flag)  sell = 2;
  1784. X        }
  1785. X          else if (x1 > max_per)
  1786. X        {
  1787. X          x1 = x1 * 75 / 100;
  1788. X          if (x1 < max_per)  x1 = max_per;
  1789. X        }
  1790. X          x2 = x1 + randint(5) - 3;
  1791. X          x3 = ((new_offer - cur_ask) * x2 / 100) + 1;
  1792. X          /* don't let the price go down */
  1793. X          if (x3 < 0)
  1794. X        x3 = 0;
  1795. X          cur_ask += x3;
  1796. X          if (cur_ask > final_ask)
  1797. X        {
  1798. X          cur_ask = final_ask;
  1799. X          comment = "Final Offer";
  1800. X          /* Set the automatic haggle increment so that RET will give
  1801. X             a new_offer equal to the final_ask price.  */
  1802. X          last_store_inc = final_ask - new_offer;
  1803. X          final_flag++;
  1804. X          if (final_flag > 3)
  1805. X            {
  1806. X              if (increase_insults(store_num))
  1807. X            sell = 2;
  1808. X              else
  1809. X            sell = 1;
  1810. X              flag = TRUE;
  1811. X            }
  1812. X        }
  1813. X          else if (new_offer <= cur_ask)
  1814. X        {
  1815. X          flag = TRUE;
  1816. X          *price = new_offer;
  1817. X        }
  1818. X          if (!flag)
  1819. X        {
  1820. X          last_offer = new_offer;
  1821. X          num_offer++; /* enable incremental haggling */
  1822. X          erase_line (1, 0);
  1823. X          (void) sprintf(out_val, "Your last bid %ld", last_offer);
  1824. X          put_buffer(out_val, 1, 39);
  1825. X          prt_comment3(cur_ask, last_offer, final_flag);
  1826. X
  1827. X          /* If the current decrement would take you under the store's
  1828. X             price, then increase it to an exact match.  */
  1829. X          if (cur_ask - last_offer > last_store_inc)
  1830. X            last_store_inc = cur_ask - last_offer;
  1831. X        }
  1832. X        }
  1833. X    }
  1834. X      while (!flag);
  1835. X    }
  1836. X
  1837. X  /* update bargaining info */
  1838. X  if ((sell == 0) && (!didnt_haggle))
  1839. X    updatebargain(store_num, *price, final_ask);
  1840. X
  1841. X  return(sell);
  1842. X}
  1843. X
  1844. X
  1845. X/* Buy an item from a store                -RAK-    */
  1846. Xstatic int store_purchase(store_num, cur_top)
  1847. Xint store_num;
  1848. Xint *cur_top;
  1849. X{
  1850. X  int32 price;
  1851. X  register int i, choice;
  1852. X  bigvtype out_val, tmp_str;
  1853. X  register store_type *s_ptr;
  1854. X  inven_type sell_obj;
  1855. X  register inven_record *r_ptr;
  1856. X  int item_val, item_new, purchase;
  1857. X
  1858. X  purchase = FALSE;
  1859. X  s_ptr = &store[store_num];
  1860. X  /* i == number of objects shown on screen    */
  1861. X  if (*cur_top == 12)
  1862. X    i = s_ptr->store_ctr - 1 - 12;
  1863. X  else if (s_ptr->store_ctr > 11)
  1864. X    i = 11;
  1865. X  else
  1866. X    i = s_ptr->store_ctr - 1;
  1867. X  if (s_ptr->store_ctr < 1)
  1868. X    msg_print("I am currently out of stock.");
  1869. X      /* Get the item number to be bought        */
  1870. X  else if (get_store_item(&item_val,
  1871. X              "Which item are you interested in? ", 0, i))
  1872. X    {
  1873. X      item_val = item_val + *cur_top;    /* TRUE item_val    */
  1874. X      take_one_item(&sell_obj, &s_ptr->store_inven[item_val].sitem);
  1875. X      if (inven_check_num(&sell_obj))
  1876. X    {
  1877. X      if (s_ptr->store_inven[item_val].scost > 0)
  1878. X        {
  1879. X          price = s_ptr->store_inven[item_val].scost;
  1880. X          choice = 0;
  1881. X        }
  1882. X      else
  1883. X        choice = purchase_haggle(store_num, &price, &sell_obj);
  1884. X      if (choice == 0)
  1885. X        {
  1886. X          if (py.misc.au >= price)
  1887. X        {
  1888. X          prt_comment1();
  1889. X          decrease_insults(store_num);
  1890. X          py.misc.au -= price;
  1891. X          item_new = inven_carry(&sell_obj);
  1892. X          i = s_ptr->store_ctr;
  1893. X          store_destroy(store_num, item_val, TRUE);
  1894. X          objdes(tmp_str, &inventory[item_new], TRUE);
  1895. X          (void) sprintf(out_val, "You have %s (%c)",
  1896. X                   tmp_str, item_new+'a');
  1897. X          prt(out_val, 0, 0);
  1898. X          check_strength();
  1899. X          if (*cur_top >= s_ptr->store_ctr)
  1900. X            {
  1901. X              *cur_top = 0;
  1902. X              display_inventory(store_num, *cur_top);
  1903. X            }
  1904. X          else
  1905. X            {
  1906. X              r_ptr = &s_ptr->store_inven[item_val];
  1907. X              if (i == s_ptr->store_ctr)
  1908. X            {
  1909. X              if (r_ptr->scost < 0)
  1910. X                {
  1911. X                  r_ptr->scost = price;
  1912. X                  display_cost(store_num, item_val);
  1913. X                }
  1914. X            }
  1915. X              else
  1916. X            display_inventory(store_num, item_val);
  1917. X            }
  1918. X          store_prt_gold();
  1919. X        }
  1920. X          else
  1921. X        {
  1922. X          if (increase_insults(store_num))
  1923. X            purchase = TRUE;
  1924. X          else
  1925. X            {
  1926. X              prt_comment1();
  1927. X              msg_print("Liar!  You have not the gold!");
  1928. X            }
  1929. X        }
  1930. X        }
  1931. X      else if (choice == 2)
  1932. X        purchase = TRUE;
  1933. X
  1934. X      /* Less intuitive, but looks better here than in purchase_haggle. */
  1935. X      display_commands();
  1936. X      erase_line (1, 0);
  1937. X    }
  1938. X      else
  1939. X    prt("You cannot carry that many different items.", 0, 0);
  1940. X    }
  1941. X  return(purchase);
  1942. X}
  1943. X
  1944. X
  1945. X/* Sell an item to the store                -RAK-    */
  1946. Xstatic int store_sell(store_num, cur_top)
  1947. Xint store_num, *cur_top;
  1948. X{
  1949. X  int item_val, item_pos;
  1950. X  int32 price;
  1951. X  bigvtype out_val, tmp_str;
  1952. X  inven_type sold_obj;
  1953. X  register int sell, choice, flag;
  1954. X  char mask[INVEN_WIELD];
  1955. X  int counter, first_item, last_item;
  1956. X
  1957. X  sell = FALSE;
  1958. X  first_item = inven_ctr;
  1959. X  last_item = -1;
  1960. X  for (counter = 0; counter < inven_ctr; counter++)
  1961. X    {
  1962. X#ifdef MAC
  1963. X      flag = store_buy(store_num, (inventory[counter].tval));
  1964. X#else
  1965. X      flag = (*store_buy[store_num])(inventory[counter].tval);
  1966. X#endif
  1967. X      mask[counter] = flag;
  1968. X      if (flag)
  1969. X    {
  1970. X      if (counter < first_item)
  1971. X        first_item = counter;
  1972. X      if (counter > last_item)
  1973. X        last_item = counter;
  1974. X    } /* end of if (flag) */
  1975. X    } /* end of for (counter) */
  1976. X  if (last_item == -1)
  1977. X    msg_print("You have nothing to sell to this store!");
  1978. X  else if (get_item(&item_val, "Which one? ", first_item, last_item, mask,
  1979. X            "I do not buy such items."))
  1980. X    {
  1981. X      take_one_item(&sold_obj, &inventory[item_val]);
  1982. X      objdes(tmp_str, &sold_obj, TRUE);
  1983. X      (void) sprintf(out_val, "Selling %s (%c)", tmp_str, item_val+'a');
  1984. X      msg_print(out_val);
  1985. X      if (store_check_num(&sold_obj, store_num))
  1986. X    {
  1987. X      choice = sell_haggle(store_num, &price, &sold_obj);
  1988. X      if (choice == 0)
  1989. X        {
  1990. X          prt_comment1();
  1991. X          decrease_insults(store_num);
  1992. X          py.misc.au += price;
  1993. X          /* identify object in inventory to set object_ident */
  1994. X          identify(&item_val);
  1995. X          /* retake sold_obj so that it will be identified */
  1996. X          take_one_item(&sold_obj, &inventory[item_val]);
  1997. X          /* call known2 for store item, so charges/pluses are known */
  1998. X          known2(&sold_obj);
  1999. X          inven_destroy(item_val);
  2000. X          objdes(tmp_str, &sold_obj, TRUE);
  2001. X          (void) sprintf(out_val, "You've sold %s", tmp_str);
  2002. X          msg_print(out_val);
  2003. X          store_carry(store_num, &item_pos, &sold_obj);
  2004. X          check_strength();
  2005. X          if (item_pos >= 0)
  2006. X        {
  2007. X          if (item_pos < 12)
  2008. X            if (*cur_top < 12)
  2009. X              display_inventory(store_num, item_pos);
  2010. X            else
  2011. X              {
  2012. X            *cur_top = 0;
  2013. X            display_inventory(store_num, *cur_top);
  2014. X              }
  2015. X          else if (*cur_top > 11)
  2016. X            display_inventory(store_num, item_pos);
  2017. X          else
  2018. X            {
  2019. X              *cur_top = 12;
  2020. X              display_inventory(store_num, *cur_top);
  2021. X            }
  2022. X        }
  2023. X          store_prt_gold();
  2024. X        }
  2025. X      else if (choice == 2)
  2026. X        sell = TRUE;
  2027. X      else if (choice == 3)
  2028. X        {
  2029. X          msg_print("How dare you!");
  2030. X          msg_print("I will not buy that!");
  2031. X          sell = increase_insults(store_num);
  2032. X        }
  2033. X      /* Less intuitive, but looks better here than in sell_haggle. */
  2034. X      erase_line (1, 0);
  2035. X      display_commands();
  2036. X    }
  2037. X      else
  2038. X    msg_print("I have not the room in my store to keep it.");
  2039. X    }
  2040. X  return(sell);
  2041. X}
  2042. X
  2043. X
  2044. X/* Entering a store                    -RAK-    */
  2045. Xvoid enter_store(store_num)
  2046. Xint store_num;
  2047. X{
  2048. X  int cur_top, tmp_chr;
  2049. X  char command;
  2050. X  register int exit_flag;
  2051. X  register store_type *s_ptr;
  2052. X
  2053. X  s_ptr = &store[store_num];
  2054. X  if (s_ptr->store_open < turn)
  2055. X    {
  2056. X      exit_flag = FALSE;
  2057. X      cur_top = 0;
  2058. X      display_store(store_num, cur_top);
  2059. X      do
  2060. X    {
  2061. X      move_cursor (20, 9);
  2062. X      /* clear the msg flag just like we do in dungeon.c */
  2063. X      msg_flag = FALSE;
  2064. X      if (get_com(CNIL, &command))
  2065. X        {
  2066. X          switch(command)
  2067. X        {
  2068. X        case 'b':
  2069. X          if (cur_top == 0)
  2070. X            if (s_ptr->store_ctr > 12)
  2071. X              {
  2072. X            cur_top = 12;
  2073. X            display_inventory(store_num, cur_top);
  2074. X              }
  2075. X            else
  2076. X              msg_print("Entire inventory is shown.");
  2077. X          else
  2078. X            {
  2079. X              cur_top = 0;
  2080. X              display_inventory(store_num, cur_top);
  2081. X            }
  2082. X          break;
  2083. X        case 'E': case 'e':     /* Equipment List    */
  2084. X        case 'I': case 'i':     /* Inventory        */
  2085. X        case 'T': case 't':     /* Take off        */
  2086. X        case 'W': case 'w':    /* Wear            */
  2087. X        case 'X': case 'x':    /* Switch weapon        */
  2088. X          tmp_chr = py.stats.use_stat[A_CHR];
  2089. X          do
  2090. X            {
  2091. X              inven_command(command);
  2092. X              command = doing_inven;
  2093. X            }
  2094. X          while (command);
  2095. X          /* redisplay store prices if charisma changes */
  2096. X          if (tmp_chr != py.stats.use_stat[A_CHR])
  2097. X            display_inventory(store_num, cur_top);
  2098. X          free_turn_flag = FALSE;    /* No free moves here. -CJS- */
  2099. X          break;
  2100. X        case 'p':
  2101. X          exit_flag = store_purchase(store_num, &cur_top);
  2102. X          break;
  2103. X        case 's':
  2104. X          exit_flag = store_sell(store_num, &cur_top);
  2105. X          break;
  2106. X        default:
  2107. X          bell();
  2108. X          break;
  2109. X        }
  2110. X        }
  2111. X      else
  2112. X        exit_flag = TRUE;
  2113. X    }
  2114. X      while (!exit_flag);
  2115. X      /* Can't save and restore the screen because inven_command does that. */
  2116. X      draw_cave();
  2117. X    }
  2118. X  else
  2119. X    msg_print("The doors are locked.");
  2120. X}
  2121. END_OF_FILE
  2122. if test 29309 -ne `wc -c <'source/store2.c'`; then
  2123.     echo shar: \"'source/store2.c'\" unpacked with wrong size!
  2124. fi
  2125. # end of 'source/store2.c'
  2126. fi
  2127. echo shar: End of archive 20 \(of 39\).
  2128. cp /dev/null ark20isdone
  2129. MISSING=""
  2130. 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
  2131.     if test ! -f ark${I}isdone ; then
  2132.     MISSING="${MISSING} ${I}"
  2133.     fi
  2134. done
  2135. if test "${MISSING}" = "" ; then
  2136.     echo You have unpacked all 39 archives.
  2137.     echo "Now run "bldfiles.sh" to build split files"
  2138.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2139. else
  2140.     echo You still need to unpack the following archives:
  2141.     echo "        " ${MISSING}
  2142. fi
  2143. ##  End of shell archive.
  2144. exit 0
  2145.