home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume14 / umoria4 / part16 < 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: v14i048:  umoria4 - single player dungeon simulation (ver. 5.5), Part16/39
  5. Message-ID: <3406@master.CNA.TEK.COM>
  6. Date: 20 Aug 92 18:05:13 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 2562
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: grabiner@math.harvard.edu (David Grabiner)
  12. Posting-number: Volume 14, Issue 48
  13. Archive-name: umoria4/Part16
  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 16 (of 39)."
  26. # Contents:  ibmpc/TERMCAP mac/mac.c source/constant.h
  27. # Wrapped by billr@saab on Thu Aug 20 09:11:30 1992
  28. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  29. if test -f 'ibmpc/TERMCAP' -a "${1}" != "-c" ; then 
  30.   echo shar: Will not clobber existing file \"'ibmpc/TERMCAP'\"
  31. else
  32. echo shar: Extracting \"'ibmpc/TERMCAP'\" \(1337 characters\)
  33. sed "s/^X//" >'ibmpc/TERMCAP' <<'END_OF_FILE'
  34. X# Termcap file for PC MORIA.  This file will only be necessary if you
  35. X# are using the "ANSI" option in MORIA.CNF (see README for details).
  36. X# For PCs, ATs and clones, there is no reason to use the "ANSI" option
  37. X# and this file can be safely discarded.  For DEC Rainbow users, this
  38. X# file is required.  It must be either in the current directory, in
  39. X# directory \ETC, or somewhere on the PATH for MORIA to find it
  40. X#
  41. X# Monochrome IBMPC.
  42. X#    This is a termcap for the NANSI.SYS device driver.
  43. X#    It is the same as the ANSI termcap, except NANSI supports
  44. X#    line insert (al) and delete (dl) while ANSI does not.
  45. X#
  46. Xibmpc-mono:\
  47. X    :co#80:\
  48. X    :li#24:\
  49. X    :cl=\E[2J:\
  50. X    :bs:\
  51. X    :ho=\E[H:\
  52. X    :cm=\E[%i%2;%2H:\
  53. X    :up=\E[A:\
  54. X    :do=\E[B:\
  55. X    :nd=\E[C:\
  56. X    :le=\E[D:\
  57. X    :ce=\E[K:\
  58. X    :ti=\E[m:\
  59. X    :te=\E[m:\
  60. X    :so=\E[1m:\
  61. X    :se=\E[m:\
  62. X    :us=\E[1m:\
  63. X    :ue=\E[m:\
  64. X    :al=\E[L:\
  65. X    :dl=\E[M:
  66. X#
  67. X# Color IBMPC.
  68. X#    This is a termcap for the NANSI.SYS device driver.
  69. X#    It is the same as the ANSI termcap, except NANSI supports
  70. X#    line insert (al) and delete (dl) while ANSI does not.
  71. X#
  72. X#    Gratiously supplied by Darren Friedlein.
  73. X#
  74. Xibmpc-color:\
  75. X    :co#80:\
  76. X    :li#24:\
  77. X    :cl=\E[2J:\
  78. X    :bs:\
  79. X    :ho=\E[H:\
  80. X    :cm=\E[%i%2;%2H:\
  81. X    :up=\E[A:\
  82. X    :do=\E[B:\
  83. X    :nd=\E[C:\
  84. X    :le=\E[D:\
  85. X    :ce=\E[K:\
  86. X    :ti=\E[44;37m\E1m:\
  87. X    :te=\E[0m:\
  88. X    :so=\E[31m:\
  89. X    :se=\E[37m:\
  90. X    :us=\E[33m:\
  91. X    :ue=\E[37m:\
  92. X    :al=\E[L:\
  93. X    :dl=\E[M:
  94. END_OF_FILE
  95. if test 1337 -ne `wc -c <'ibmpc/TERMCAP'`; then
  96.     echo shar: \"'ibmpc/TERMCAP'\" unpacked with wrong size!
  97. fi
  98. # end of 'ibmpc/TERMCAP'
  99. fi
  100. if test -f 'mac/mac.c' -a "${1}" != "-c" ; then 
  101.   echo shar: Will not clobber existing file \"'mac/mac.c'\"
  102. else
  103. echo shar: Extracting \"'mac/mac.c'\" \(30757 characters\)
  104. sed "s/^X//" >'mac/mac.c' <<'END_OF_FILE'
  105. X/* mac/mac.c: mac support code
  106. X
  107. X   Copyright (c) 1989-1991 Curtis McCauley, James E. Wilson
  108. X
  109. X   This software may be copied and distributed for educational, research, and
  110. X   not for profit purposes provided that this copyright and statement are
  111. X   included in all such copies. */
  112. X
  113. X#ifndef THINK_C
  114. X#include <types.h>
  115. X#include <controls.h>
  116. X#include <dialogs.h>
  117. X#include <memory.h>
  118. X#include <resources.h>
  119. X#include <files.h>
  120. X#include <segload.h>
  121. X#include <packages.h>
  122. X#include <menus.h>
  123. X#include <osutils.h>
  124. X#include <sysequ.h>
  125. X
  126. X#include <scrnmgr.h>
  127. X#include <dumpres.h>
  128. X
  129. X#else
  130. X
  131. X#include "ScrnMgr.h"
  132. X#include "DumpRes.h"
  133. X
  134. X#define c2pstr(x)    (char *)CtoPstr((char *)x)
  135. X#define p2cstr(x)    (char *)PtoCstr((char *)x)
  136. X
  137. X#endif
  138. X
  139. X#include <stdio.h>
  140. X#include <stdlib.h>
  141. X#include <string.h>
  142. X#ifndef THINK_C
  143. X#include <strings.h>
  144. X#endif
  145. X#include <setjmp.h>
  146. X
  147. X#include "config.h"
  148. X#include "constant.h"
  149. X#include "types.h"
  150. X#include "externs.h"
  151. X#include "macrsrc.h"
  152. X
  153. Xlong GetCommandSet(Handle theData);
  154. Xlong GetTextEditor(Handle theData);
  155. X
  156. Xvoid DoMacHelp(void), DoKillsDlg(void);
  157. X
  158. Xstatic long game_flag;
  159. Xstatic long exit_code;
  160. X
  161. Xstatic short savedir, applvrefnum;
  162. X
  163. Xstatic char **save_chars, **save_attrs;
  164. Xstatic long save_cursor_h, save_cursor_v;
  165. X
  166. X#define PATHLEN                    256
  167. X
  168. X#define TAB_WIDTH                8
  169. X
  170. X#define CODE_IGNORE                0
  171. X#define CODE_PASSTHRU            1
  172. X#define CODE_KEYPAD                2
  173. X#define CODE_ARROW                3
  174. X#define CODE_ENTER                4
  175. X
  176. Xstatic unsigned char codetable[0x80] = {
  177. X    /*                0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F    */
  178. X    /*                -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    */
  179. X    /* [00] */        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  180. X    /* [10] */        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  181. X    /* [20] */        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  182. X    /* [30] */        0,    1,    1,    1,    1,    1,    1,    0,    0,    0,    0,    0,    0,    0,    0,    1,
  183. X    /* [40] */        1,    1,    3,    1,    1,    1,    3,    1,    3,    1,    1,    1,    4,    3,    1,    1,
  184. X    /* [50] */        1,    1,    1,    2,    2,    2,    2,    2,    2,    2,    1,    2,    2,    1,    1,    1,
  185. X    /* [60] */        0,    0,    0,    0,    0,    0,    1,    0,    1,    0,    1,    0,    1,    0,    1,    0,
  186. X    /* [70] */        1,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    3,    3,    3,    3,    1
  187. X};
  188. X
  189. X#define ARROW_UP_1                0x4D
  190. X#define ARROW_DOWN_1            0x48
  191. X#define ARROW_LEFT_1            0x46
  192. X#define ARROW_RIGHT_1            0x42
  193. X
  194. X#define ARROW_UP_2                0x7E
  195. X#define ARROW_DOWN_2            0x7D
  196. X#define ARROW_LEFT_2            0x7B
  197. X#define ARROW_RIGHT_2            0x7C
  198. X
  199. X#define CMDSET_TYPE                'CNFG'
  200. X#define CMDSET_ID                256
  201. X
  202. X#define TE_TYPE                    'CNFG'
  203. X#define TE_ID                    257
  204. X
  205. X#define SPIN_TICKS                15
  206. X
  207. Xstatic long editor, cmdsetopt;
  208. X
  209. Xstatic jmp_buf jb;
  210. X
  211. X#define ABOUT_DLOG_ID            128
  212. X
  213. X#define FM_NEW                    1
  214. X#define FM_OPEN                    2
  215. X#define FM_SAVE                    4
  216. X#define FM_SAVE_AS                5
  217. X#define FM_QUIT                    7
  218. X
  219. X#define AM_HELP                    1
  220. X#define AM_CMD_SET                2
  221. X#define AM_TEXT_ED                3
  222. X#define AM_SCORES                5
  223. X
  224. X#define KEY_UNKNOWN                0xFF
  225. X#define KEY_DIR                    0x90
  226. X#define KEY_DIR_SHIFT            0xA0
  227. X#define KEY_DIR_CONTROL            0xB0
  228. X
  229. X#define NEXT_FINDER                1
  230. X#define NEXT_NEW                2
  231. X#define NEXT_OPEN                3
  232. X#define NEXT_WAIT                4
  233. X#define NEXT_QUIT                5
  234. X
  235. Xlong savefileset;
  236. Xchar savefilename[64];
  237. Xshort savefilevol;
  238. X
  239. X#define sqc_dlg_id                258
  240. X#define sqc_save_item            1
  241. X#define sqc_quit_item            2
  242. X#define sqc_cancel_item            3
  243. X#define sqc_defbrd_item            4
  244. X
  245. X#define code_enter                0x03
  246. X#define code_return                0x0D
  247. X
  248. X#define errAlrtID                1024
  249. X
  250. Xstatic short sqcdefault_item;
  251. Xstatic Handle sqcdefault_handle;
  252. X
  253. Xstatic long save_cmd_level, file_menu_level, app_menu_level;
  254. Xstatic long save_cmd_enabled, file_menu_enabled, app_menu_enabled;
  255. X
  256. X#if 0
  257. X/* this stuff is no longer used */
  258. X
  259. X#define malloc_zone_size        0x1000
  260. X
  261. Xstatic THz malloc_zone;
  262. X
  263. Xvoid init_malloc_zone()
  264. X
  265. X{
  266. X    THz theOldZone;
  267. X
  268. X    theOldZone = GetZone();
  269. X
  270. X    InitZone(NULL, 64, (Ptr)((long) malloc_zone + malloc_zone_size),
  271. X         (Ptr) malloc_zone);
  272. X
  273. X    SetZone(theOldZone);
  274. X
  275. X    return;
  276. X}
  277. X
  278. Xvoid *mac_malloc(n)
  279. Xunsigned n;
  280. X
  281. X{
  282. X    THz theOldZone;
  283. X    void *theNewPtr;
  284. X
  285. X    theOldZone = GetZone();
  286. X    SetZone(malloc_zone);
  287. X
  288. X    theNewPtr = (void *) NewPtrClear((Size) n);
  289. X
  290. X    SetZone(theOldZone);
  291. X
  292. X    return(theNewPtr);
  293. X}
  294. X
  295. Xvoid mac_free(p)
  296. Xvoid *p;
  297. X
  298. X{
  299. X#if 0
  300. X    THz theOldZone;
  301. X
  302. X    theOldZone = GetZone();
  303. X    SetZone(malloc_zone);
  304. X
  305. X    DisposPtr((Ptr) p);
  306. X
  307. X    SetZone(theOldZone);
  308. X#else
  309. X#pragma unused(p)
  310. X#endif
  311. X
  312. X    return;
  313. X}
  314. X
  315. X#endif
  316. X
  317. Xlong mac_time()
  318. X
  319. X{
  320. X    long now;
  321. X
  322. X    GetDateTime((unsigned long *) &now);
  323. X    return(now);
  324. X}
  325. X
  326. Xvoid alert_error(message)
  327. Xchar *message;
  328. X
  329. X{
  330. X    Str255 pstr;
  331. X
  332. X    strncpy((char *)pstr, message, 255);
  333. X    pstr[255] = '\0';
  334. X    (void) c2pstr(pstr);
  335. X
  336. X    ParamText(pstr, NULL, NULL, NULL);
  337. X
  338. X    DoScreenALRT(errAlrtID, akStop, fixHalf, fixHalf);
  339. X
  340. X    return;
  341. X}
  342. X
  343. Xvoid fatal_error(message)
  344. Xchar *message;
  345. X
  346. X{
  347. X    alert_error(message);
  348. X    exit(0);
  349. X}
  350. X
  351. Xchar *truncstr(pstr, wid)
  352. Xchar *pstr;
  353. Xshort wid;
  354. X
  355. X{
  356. X    unsigned char len;
  357. X
  358. X    if (StringWidth(pstr) > wid) {
  359. X        len = (unsigned char) pstr[0];
  360. X        if (len > 0) pstr[len] = '\311';
  361. X        while ( (len > 1) && (StringWidth(pstr) > wid) ) {
  362. X            pstr[0] = (char) --len;
  363. X            pstr[len] = '\311';
  364. X        }
  365. X    }
  366. X
  367. X    return(pstr);
  368. X}
  369. X
  370. Xvoid idle()
  371. X
  372. X{
  373. X    long redraw;
  374. X
  375. X    redraw = FALSE;
  376. X
  377. X    if ((!save_cmd_enabled) && (save_cmd_level > 0)) {
  378. X        EnableItem((MenuHandle) GetFileMHandle(), FM_SAVE);
  379. X        EnableItem((MenuHandle) GetFileMHandle(), FM_SAVE_AS);
  380. X        save_cmd_enabled = TRUE;
  381. X    }
  382. X    else if ((save_cmd_enabled) && (save_cmd_level <= 0)) {
  383. X        DisableItem((MenuHandle) GetFileMHandle(), FM_SAVE);
  384. X        DisableItem((MenuHandle) GetFileMHandle(), FM_SAVE_AS);
  385. X        save_cmd_enabled = FALSE;
  386. X    }
  387. X
  388. X    if ((!file_menu_enabled) && (file_menu_level > 0)) {
  389. X        EnableItem((MenuHandle) GetFileMHandle(), 0);
  390. X        file_menu_enabled = TRUE;
  391. X        redraw = TRUE;
  392. X    }
  393. X    else if ((file_menu_enabled) && (file_menu_level <= 0)) {
  394. X        DisableItem((MenuHandle) GetFileMHandle(), 0);
  395. X        file_menu_enabled = FALSE;
  396. X        redraw = TRUE;
  397. X    }
  398. X
  399. X    if ((!app_menu_enabled) && (app_menu_level > 0)) {
  400. X        EnableItem((MenuHandle) GetAppMHandle(), 0);
  401. X        app_menu_enabled = TRUE;
  402. X        redraw = TRUE;
  403. X    }
  404. X    else if ((app_menu_enabled) && (app_menu_level <= 0)) {
  405. X        DisableItem((MenuHandle) GetAppMHandle(), 0);
  406. X        app_menu_enabled = FALSE;
  407. X        redraw = TRUE;
  408. X    }
  409. X
  410. X    if (redraw)
  411. X        DrawMenuBar();
  412. X
  413. X    IdleScreenMgr();
  414. X}
  415. X
  416. Xint macgetkey(ch, nowait)
  417. Xchar *ch;
  418. Xint nowait;
  419. X
  420. X{
  421. X    char keycode, modifiers, ascii;
  422. X    short h, v;
  423. X
  424. X    do {
  425. X
  426. X        if (nowait) {
  427. X            idle();
  428. X            if (!GetScreenKeys(&keycode, &modifiers, &ascii, &h, &v))
  429. X                return(FALSE);
  430. X        }
  431. X        else {
  432. X            do {
  433. X                idle();
  434. X            } while (!GetScreenKeys(&keycode, &modifiers, &ascii, &h, &v));
  435. X        }
  436. X
  437. X    } while ( (modifiers & maskModMouse) ||
  438. X              (codetable[keycode] == CODE_IGNORE) );
  439. X
  440. X    if (ascii > 0x7F) ascii = KEY_UNKNOWN;
  441. X
  442. X    switch (codetable[keycode]) {
  443. X
  444. X        case CODE_KEYPAD:
  445. X            if ((ascii >= '1') && (ascii <= '9')) {
  446. X                ascii -= '0';
  447. X                if (modifiers & maskModControl)
  448. X                    ascii += KEY_DIR_CONTROL;
  449. X                else if (modifiers & maskModShift)
  450. X                    ascii += KEY_DIR_SHIFT;
  451. X                else
  452. X                    ascii += KEY_DIR;
  453. X            }
  454. X            break;
  455. X
  456. X        case CODE_ARROW:
  457. X            switch (keycode) {
  458. X                case ARROW_UP_1: case ARROW_UP_2:
  459. X                    ascii = 8;
  460. X                    break;
  461. X                case ARROW_DOWN_1: case ARROW_DOWN_2:
  462. X                    ascii = 2;
  463. X                    break;
  464. X                case ARROW_LEFT_1: case ARROW_LEFT_2:
  465. X                    ascii = 4;
  466. X                    break;
  467. X                case ARROW_RIGHT_1: case ARROW_RIGHT_2:
  468. X                    ascii = 6;
  469. X                    break;
  470. X                default:
  471. X                    ascii = 5;
  472. X                    break;
  473. X            }
  474. X            if (modifiers & maskModControl)
  475. X                ascii += KEY_DIR_CONTROL;
  476. X            else if (modifiers & maskModShift)
  477. X                ascii += KEY_DIR_SHIFT;
  478. X            else
  479. X                ascii += KEY_DIR;
  480. X            break;
  481. X
  482. X        case CODE_ENTER:
  483. X            ascii = '\r';
  484. X            break;
  485. X
  486. X    }
  487. X
  488. X    if (ch != NULL) *ch = ascii;
  489. X
  490. X    return(TRUE);
  491. X}
  492. X
  493. Xint extractdir(ch, shift_flag, ctrl_flag)
  494. Xchar ch;
  495. Xint *shift_flag;
  496. Xint *ctrl_flag;
  497. X
  498. X{
  499. X    long rc;
  500. X
  501. X    if ((ch & 0xF0) == KEY_DIR) {
  502. X        *shift_flag = FALSE;
  503. X        *ctrl_flag = FALSE;
  504. X        rc = ch & 0x0F;
  505. X    }
  506. X    else if ((ch & 0xF0) == KEY_DIR_SHIFT) {
  507. X        *shift_flag = TRUE;
  508. X        *ctrl_flag = FALSE;
  509. X        rc = ch & 0x0F;
  510. X    }
  511. X    else if ((ch & 0xF0) == KEY_DIR_CONTROL) {
  512. X        *shift_flag = FALSE;
  513. X        *ctrl_flag = TRUE;
  514. X        rc = ch & 0x0F;
  515. X    }
  516. X    else
  517. X        rc = -1;
  518. X
  519. X    return(rc);
  520. X}
  521. X
  522. Xvoid mac_save_screen()
  523. X
  524. X{
  525. X    Rect screen;
  526. X
  527. X    screen.left = screen.top = 0;
  528. X    screen.right = SCRN_COLS;
  529. X    screen.bottom = SCRN_ROWS;
  530. X
  531. X    HLock((Handle) save_chars);
  532. X    HLock((Handle) save_attrs);
  533. X
  534. X    GetScreenImage(*save_chars, *save_attrs, SCRN_COLS, &screen, 0, 0);
  535. X    GetScreenCursor(&save_cursor_h, &save_cursor_v);
  536. X
  537. X    HUnlock((Handle) save_chars);
  538. X    HUnlock((Handle) save_attrs);
  539. X
  540. X    return;
  541. X}
  542. X
  543. X/* This restore routine only touches as much of the screen as necessary. */
  544. X
  545. Xvoid mac_restore_screen()
  546. X
  547. X{
  548. X    Rect screen;
  549. X    long v;
  550. X    char chars[SCRN_COLS], attrs[SCRN_COLS];
  551. X    char *c, *a, *c1, *c2, *a1, *a2;
  552. X
  553. X    HLock((Handle) save_chars);
  554. X    HLock((Handle) save_attrs);
  555. X
  556. X    c = *save_chars;
  557. X    a = *save_attrs;
  558. X
  559. X    screen.top = 0;
  560. X    screen.bottom = 1;
  561. X
  562. X    for (v = 0; v < SCRN_ROWS; v++) {
  563. X
  564. X        screen.left = 0;
  565. X        screen.right = SCRN_COLS;
  566. X
  567. X        GetScreenImage(chars, attrs, SCRN_COLS, &screen, 0, v);
  568. X
  569. X        c1 = chars;
  570. X        c2 = c;
  571. X
  572. X        a1 = attrs;
  573. X        a2 = a;
  574. X
  575. X        while (screen.left < SCRN_COLS) {
  576. X            if (*c1++ != *c2++) break;
  577. X            if (*a1++ != *a2++) break;
  578. X            ++screen.left;
  579. X        }
  580. X
  581. X        c1 = chars + SCRN_COLS;
  582. X        c2 = c + SCRN_COLS;
  583. X
  584. X        a1 = attrs + SCRN_COLS;
  585. X        a2 = a + SCRN_COLS;
  586. X
  587. X        while (screen.right > screen.left) {
  588. X            if (*--c1 != *--c2) break;
  589. X            if (*--a1 != *--a2) break;
  590. X            --screen.right;
  591. X        }
  592. X
  593. X        if (screen.right > screen.left)
  594. X            DSetScreenImage(c, a, SCRN_COLS, &screen, screen.left, v);
  595. X
  596. X        c += SCRN_COLS;
  597. X        a += SCRN_COLS;
  598. X
  599. X    }
  600. X
  601. X    DSetScreenCursor(save_cursor_h, save_cursor_v);
  602. X
  603. X    HUnlock((Handle) save_chars);
  604. X    HUnlock((Handle) save_attrs);
  605. X
  606. X    return;
  607. X}
  608. X
  609. Xvoid mac_beep()
  610. X
  611. X{
  612. X    SysBeep(15);
  613. X    return;
  614. X}
  615. X
  616. Xvoid macbeginwait()
  617. X
  618. X{
  619. X    BeginScreenWait(SPIN_TICKS);
  620. X    return;
  621. X}
  622. X
  623. Xvoid macendwait()
  624. X
  625. X{
  626. X    EndScreenWait();
  627. X    return;
  628. X}
  629. X
  630. XOSErr GetDirID(wdVRefNum, vRefNum, dirID)
  631. Xshort wdVRefNum;
  632. Xshort *vRefNum;
  633. Xlong *dirID;
  634. X
  635. X{
  636. X    OSErr err;
  637. X    WDPBRec wdpb;
  638. X
  639. X    wdpb.ioNamePtr = NULL;
  640. X    wdpb.ioVRefNum = wdVRefNum;
  641. X    wdpb.ioWDIndex = 0;
  642. X    wdpb.ioWDProcID = 0;
  643. X    wdpb.ioWDVRefNum = 0;
  644. X    err = PBGetWDInfo(&wdpb, false);
  645. X
  646. X    if (!err) {
  647. X        *vRefNum = wdpb.ioWDVRefNum;
  648. X        *dirID = wdpb.ioWDDirID;
  649. X    }
  650. X
  651. X    return(err);
  652. X}
  653. X
  654. XOSErr MakePath(vRefNum, dirID, fName, pathName)
  655. Xshort vRefNum;
  656. Xlong dirID;
  657. Xchar *fName;
  658. Xchar *pathName;
  659. X
  660. X{
  661. X    char buf[PATHLEN], *bufptr;
  662. X    long len;
  663. X    OSErr err;
  664. X    Str255 vNameBuf;
  665. X    CInfoPBRec cipb;
  666. X
  667. X    bufptr = buf + PATHLEN;
  668. X
  669. X    *--bufptr = '\0';
  670. X
  671. X    if (fName != NULL) {
  672. X        len = strlen(fName);
  673. X        strncpy(bufptr -= len, fName, len);
  674. X    }
  675. X
  676. X    cipb.dirInfo.ioNamePtr = vNameBuf;
  677. X    cipb.dirInfo.ioVRefNum = vRefNum;
  678. X    cipb.dirInfo.ioFDirIndex = -1;
  679. X
  680. X    do {
  681. X        cipb.dirInfo.ioDrDirID = dirID;
  682. X        err = PBGetCatInfo(&cipb, false);
  683. X        if (!err) {
  684. X            *--bufptr = ':';
  685. X            len = strlen(p2cstr(vNameBuf));
  686. X            strncpy(bufptr -= len, (char *)vNameBuf, len);
  687. X            dirID = cipb.dirInfo.ioDrParID;
  688. X        }
  689. X    } while ( (!err) && (dirID != fsRtParID) );
  690. X
  691. X    strcpy(pathName, bufptr);
  692. X
  693. X    return(err);
  694. X}
  695. X
  696. Xvoid checkdebugger()
  697. X
  698. X{
  699. X#ifndef THINK_C
  700. X#if 1
  701. X    char keys[128];
  702. X
  703. X    GetKeys ((KeyMap *) &keys);
  704. X    if (keys[4] & 0x80) Debugger();        /* if command key is down */
  705. X#else
  706. X    if (((char *) KeyMapLM)[6] & 0x80) Debugger();            /* if command key is down */
  707. X#endif
  708. X#endif
  709. X
  710. X    return;
  711. X}
  712. X
  713. Xstatic void getstack(request)
  714. Xlong request;
  715. X
  716. X{
  717. X    long cursize;
  718. X#ifdef THINK_C
  719. X    Ptr newlimit;
  720. X#else
  721. X    long newlimit;
  722. X#endif
  723. X
  724. X    /* An extra level of indirection is apparently needed by MPW C
  725. X       for accessing system globals.  */
  726. X#ifdef THINK_C
  727. X    cursize = (((long *) CurStackBase) - ((long *) ApplLimit)) - 8;
  728. X    if (cursize < request) {
  729. X        newlimit = (Ptr)(((long *) CurStackBase - request) - 8);
  730. X        if (newlimit > HeapEnd)
  731. X            ApplLimit = newlimit;
  732. X    }
  733. X#else
  734. X    cursize = (*((int *) CurStackBase) - *((int *) ApplLimit)) - 8;
  735. X    if (cursize < request) {
  736. X        newlimit = (*((int *) CurStackBase) - request) - 8;
  737. X        if (newlimit > *((int *) HeapEnd)) *((int *) ApplLimit) = newlimit;
  738. X    }
  739. X#endif
  740. X
  741. X    return;
  742. X}
  743. X
  744. Xvoid sfposition(vrefnum)
  745. Xshort vrefnum;
  746. X
  747. X{
  748. X    short v;
  749. X    long d;
  750. X
  751. X    GetDirID(vrefnum, &v, &d);
  752. X#ifdef THINK_C
  753. X    SFSaveDisk = -v;
  754. X    CurDirStore = d;
  755. X#else
  756. X    *((short *) SFSaveDisk) = -v;
  757. X    *((int *) CurDirStore) = d;
  758. X#endif
  759. X
  760. X    return;
  761. X}
  762. X
  763. Xlong doputfile(prompt, fname, vrefnum)
  764. Xchar *prompt;
  765. Xchar *fname;
  766. Xshort *vrefnum;
  767. X
  768. X{
  769. X    char p[256], f[256];
  770. X    SFReply reply;
  771. X    Point loc;
  772. X    long h, v;
  773. X
  774. X    CenterScreenDLOG(putDlgID, fixHalf, fixThird, &h, &v);
  775. X
  776. X    loc.h = (short) h;
  777. X    loc.v = (short) v;
  778. X
  779. X    strncpy(p, prompt, 255);
  780. X    strncpy(f, fname, 255);
  781. X    p[255] = '\0';
  782. X    f[255] = '\0';
  783. X    c2pstr(p);
  784. X    c2pstr(f);
  785. X
  786. X    SFPutFile(loc, p, f, NULL, &reply);
  787. X
  788. X    if (reply.good) {
  789. X        p2cstr(reply.fName);
  790. X        strcpy(fname, (char *)reply.fName);
  791. X        *vrefnum = reply.vRefNum;
  792. X    }
  793. X
  794. X    return(reply.good);
  795. X}
  796. X
  797. Xint asksavegame(ask)
  798. Xint ask;
  799. X
  800. X{
  801. X    int rc;
  802. X
  803. X    if (!ask && savefileset)
  804. X        rc = TRUE;
  805. X
  806. X    else {
  807. X        rc = doputfile("Save game as:", savefilename, &savefilevol);
  808. X        if (rc) savefileset = TRUE;
  809. X    }
  810. X
  811. X    return(rc);
  812. X}
  813. X
  814. Xstatic pascal Boolean savefilefilter(pb)
  815. XParmBlkPtr pb;
  816. X
  817. X{
  818. X    OSType fdtype, fdcreator;
  819. X
  820. X    fdtype = pb->fileParam.ioFlFndrInfo.fdType;
  821. X    fdcreator = pb->fileParam.ioFlFndrInfo.fdCreator;
  822. X
  823. X    return(!((fdcreator == MORIA_FCREATOR) && (fdtype == SAVE_FTYPE)));
  824. X}
  825. X
  826. Xint dogetfile(fname, vrefnum)
  827. Xchar *fname;
  828. Xshort *vrefnum;
  829. X
  830. X{
  831. X    SFTypeList types;
  832. X    SFReply reply;
  833. X    Point loc;
  834. X    long h, v;
  835. X
  836. X    CenterScreenDLOG(getDlgID, fixHalf, fixThird, &h, &v);
  837. X
  838. X    loc.h = (short) h;
  839. X    loc.v = (short) v;
  840. X
  841. X    types[0] = SAVE_FTYPE;
  842. X
  843. X    SFGetFile(loc, NULL, savefilefilter, 1, types, NULL, &reply);
  844. X
  845. X    if (reply.good) {
  846. X        p2cstr(reply.fName);
  847. X        strcpy(fname, (char *)reply.fName);
  848. X        *vrefnum = reply.vRefNum;
  849. X    }
  850. X
  851. X    return(reply.good);
  852. X}
  853. X
  854. Xstatic pascal Boolean sqcfilter(dlg, evt, item)
  855. XDialogPtr dlg;
  856. XEventRecord *evt;
  857. Xshort *item;
  858. X
  859. X{
  860. X#pragma unused(dlg)
  861. X    Boolean rc;
  862. X    char key;
  863. X
  864. X    rc = FALSE;
  865. X
  866. X    if (evt->what == keyDown) {
  867. X        key = evt->message & charCodeMask;
  868. X        if ( (key == code_enter) || (key == code_return) ) {
  869. X            rc = TRUE;
  870. X            HiliteControl((ControlHandle) sqcdefault_handle, inButton);
  871. X            *item = sqcdefault_item;
  872. X        }
  873. X    }
  874. X
  875. X    return(rc);
  876. X}
  877. X
  878. Xshort currentdirectory()
  879. X
  880. X{
  881. X    short vrefnum;
  882. X
  883. X    (void) GetVol(NULL, &vrefnum);
  884. X    return(vrefnum);
  885. X}
  886. X
  887. Xvoid changedirectory(vrefnum)
  888. Xshort vrefnum;
  889. X
  890. X{
  891. X    (void) GetVol(NULL, &savedir);
  892. X    (void) SetVol(NULL, vrefnum);
  893. X    return;
  894. X}
  895. X
  896. Xvoid appldirectory()
  897. X
  898. X{
  899. X    (void) GetVol(NULL, &savedir);
  900. X    (void) SetVol(NULL, applvrefnum);
  901. X    return;
  902. X}
  903. X
  904. Xvoid restoredirectory()
  905. X
  906. X{
  907. X    (void) SetVol(NULL, savedir);
  908. X    return;
  909. X}
  910. X
  911. Xvoid mac_helpfile(filename, wait)
  912. Xchar *filename;
  913. Xint wait;
  914. X
  915. X{
  916. X    Str255 temp, temp2;    /* Buffer for line and tab-expanded line.  */
  917. X    short apRefNum;
  918. X    Handle apParam;
  919. X    FILE *file;
  920. X    int i, j, done;
  921. X    char ch;
  922. X    char *cp;        /* Source for tab expansion.  */
  923. X    Rect area;
  924. X
  925. X    GetAppParms(temp, &apRefNum, &apParam);
  926. X
  927. X    appldirectory();
  928. X    /* Ordinarily, the misc files are stored in the data fork of
  929. X       the application.  */
  930. X#if 1
  931. X    file = fopen(p2cstr(temp), "r");
  932. X#else
  933. X    file = fopen("MacMoria.files", "r");
  934. X#endif
  935. X    restoredirectory();
  936. X
  937. X    if (file != NULL) {
  938. X
  939. X        while (!feof(file))
  940. X            if (fgets ((char *)temp, 255, file) != NULL)
  941. X                if (temp[0] == '#')
  942. X                    if (strstr((char *)temp, filename) != NULL)
  943. X                        break;
  944. X
  945. X        if (feof(file)) {
  946. X            (void) fclose(file);
  947. X            file = NULL;
  948. X        }
  949. X
  950. X    }
  951. X
  952. X    if (file == NULL) {
  953. X        sprintf((char *)temp, "Cannot find text file: %s", filename);
  954. X        alert_error(temp);
  955. X    }
  956. X
  957. X    else {
  958. X
  959. X        area.left = area.top = 0;
  960. X        area.right = SCRN_COLS;
  961. X        area.bottom = SCRN_ROWS;
  962. X
  963. X        if (wait)
  964. X            mac_save_screen();
  965. X
  966. X        done = FALSE;
  967. X
  968. X        while ((!done) && (!feof(file))) {
  969. X            DEraseScreen(&area);
  970. X            for (i = 0; (!done) && (i < SCRN_ROWS - 1); i++)
  971. X                if ((fgets((char *)temp, 255, file) != NULL) && (temp[0] != '#')) {
  972. X                    /* Remove the trailing \n and
  973. X                       expand tabs.  */
  974. X                      for (cp = (char *) temp, j = 0;
  975. X                         *cp != '\n'; cp++)
  976. X                      {
  977. X                        if ((temp2[j] = *cp) == '\t')
  978. X                          {
  979. X                        do
  980. X                          {
  981. X                            temp2[j++] = ' ';
  982. X                          }
  983. X                        while (j % TAB_WIDTH != 0);
  984. X                          }
  985. X                        else
  986. X                          j++;
  987. X                      }
  988. X                    temp2[j] = '\0';
  989. X                    DSetScreenString((char *)temp2, 0, i);
  990. X                    }
  991. X                else
  992. X                    done = TRUE;
  993. X            if (wait) {
  994. X                DSetScreenCursor(20, SCRN_ROWS - 1);
  995. X                DWriteScreenString(
  996. X                    done ?
  997. X                        "[Press any key to continue.]" :
  998. X                        "[Press any key for next page or ESC to abort.]");
  999. X                macgetkey(&ch, FALSE);
  1000. X                if (ch == ESCAPE)
  1001. X                    done = TRUE;
  1002. X            }
  1003. X        }
  1004. X
  1005. X        if (wait)
  1006. X            mac_restore_screen();
  1007. X
  1008. X        fclose(file);
  1009. X
  1010. X    }
  1011. X
  1012. X    return;
  1013. X}
  1014. X
  1015. Xchar *nextstring(loc)
  1016. Xchar **loc;
  1017. X
  1018. X{
  1019. X    char *str;
  1020. X    unsigned char len;
  1021. X
  1022. X    len = *((unsigned char *) (*loc));
  1023. X    str = p2cstr(*loc);
  1024. X    *loc += len + 1;
  1025. X
  1026. X    return(str);
  1027. X}
  1028. X
  1029. X#if 0
  1030. X/* no longer used */
  1031. Xlong allocmalloczone(restart)
  1032. Xlong restart;
  1033. X
  1034. X{
  1035. X    long rc;
  1036. X
  1037. X    if (!restart) {
  1038. X        malloc_zone = (THz) NewPtr(malloc_zone_size);
  1039. X        rc = malloc_zone != NULL;
  1040. X    }
  1041. X    else
  1042. X        rc = TRUE;
  1043. X
  1044. X    if (rc && !restart)
  1045. X        init_malloc_zone();
  1046. X
  1047. X    return(rc);
  1048. X}
  1049. X#endif
  1050. X
  1051. Xint allocsavearea(restart)
  1052. Xint restart;
  1053. X
  1054. X{
  1055. X    int rc;
  1056. X
  1057. X    if (!restart) {
  1058. X        save_chars = (char **) NewHandle(SCRN_ROWS * SCRN_COLS);
  1059. X        save_attrs = (char **) NewHandle(SCRN_ROWS * SCRN_COLS);
  1060. X        rc = (save_chars != NULL) && (save_attrs != NULL);
  1061. X    }
  1062. X    else
  1063. X        rc = TRUE;
  1064. X
  1065. X    return(rc);
  1066. X}
  1067. X
  1068. Xint setupmem(restart)
  1069. Xint restart;
  1070. X
  1071. X{
  1072. X    int i;
  1073. X    memtable_type *m;
  1074. X
  1075. X    for (i = 0, m = memtable; i < MAX_PTRS; i++, m++) {
  1076. X
  1077. X        if (!restart) {
  1078. X            *m->memPtr = (char *) NewPtrClear(m->elemCnt * m->elemSiz);
  1079. X            if (*m->memPtr == NULL) return(FALSE);
  1080. X        }
  1081. X
  1082. X        else if (m->restartFlag) {
  1083. X            memset(*m->memPtr, 0, m->elemCnt * m->elemSiz);
  1084. X        }
  1085. X
  1086. X    }
  1087. X
  1088. X    return(TRUE);
  1089. X}
  1090. X
  1091. Xint getresources(restart)
  1092. Xint restart;
  1093. X
  1094. X{
  1095. X    int i, rc;
  1096. X    restable_type *r;
  1097. X
  1098. X    for (i = 0, r = restable; i < MAX_RESOURCES; i++, r++) {
  1099. X
  1100. X        if (!restart) *r->memPtr = NULL;
  1101. X
  1102. X        if ( (!restart) || (r->restartFlag) ) {
  1103. X
  1104. X            rc = LoadRes(
  1105. X                r->memPtr,
  1106. X                r->resType, r->resID,
  1107. X                r->elemCnt, r->elemSiz,
  1108. X                r->strProc);
  1109. X
  1110. X            if (!rc) return(FALSE);
  1111. X
  1112. X        }
  1113. X
  1114. X    }
  1115. X
  1116. X    return(TRUE);
  1117. X}
  1118. X
  1119. Xint getrestart(restart)
  1120. Xint restart;
  1121. X
  1122. X{
  1123. X    int i, rc;
  1124. X    unsigned size;
  1125. X    char *p, *q;
  1126. X
  1127. X    if (restart) {
  1128. X
  1129. X        size = 0;
  1130. X        for (i = 0; i < MAX_RESTART; i++) size += restart_vars[i].size;
  1131. X
  1132. X        p = NULL;
  1133. X
  1134. X        rc = LoadRes(
  1135. X            &p,
  1136. X            restartRsrc, restart_id,
  1137. X            1, size,
  1138. X            NULL);
  1139. X
  1140. X        if (!rc) return(FALSE);
  1141. X
  1142. X        q = p;
  1143. X        for (i = 0; i < MAX_RESTART; i++) {
  1144. X            BlockMove(q, restart_vars[i].ptr, restart_vars[i].size);
  1145. X            q += restart_vars[i].size;
  1146. X        }
  1147. X
  1148. X        DisposPtr(p);
  1149. X
  1150. X    }
  1151. X
  1152. X    return(TRUE);
  1153. X}
  1154. X
  1155. Xint clearvars(restart)
  1156. Xint restart;
  1157. X
  1158. X{
  1159. X    int i;
  1160. X    clrtable_type *c;
  1161. X
  1162. X    if (restart)
  1163. X        for (i = 0, c = clrtable; i < MAX_CLRS; i++, c++)
  1164. X            memset(c->ptr, 0, c->size);
  1165. X
  1166. X    return(TRUE);
  1167. X}
  1168. X
  1169. X#ifndef THINK_C
  1170. Xunsigned sleep(time)
  1171. Xunsigned time;
  1172. X
  1173. X{
  1174. X#pragma unused(time)
  1175. X    idle();
  1176. X    return(0);
  1177. X}
  1178. X#endif
  1179. X
  1180. Xchar *makefilename(buffer, suffix, append)
  1181. Xchar *buffer, *suffix;
  1182. Xint append;
  1183. X
  1184. X
  1185. X{
  1186. X    long len;
  1187. X    char *p;
  1188. X
  1189. X    len = strlen(py.misc.name) + ((append) ? strlen(suffix)+3 : 0);
  1190. X
  1191. X    if ( (strlen(py.misc.name) == 0) || (len > 31) )
  1192. X        strcpy(buffer, suffix);
  1193. X
  1194. X    else {
  1195. X        strcpy(buffer, py.misc.name);
  1196. X        if (append) {
  1197. X            strcat(buffer, "'s ");
  1198. X            strcat(buffer, suffix);
  1199. X        }
  1200. X        for (p = buffer; *p; p++)
  1201. X            if (*p == ':') *p = '.';
  1202. X    }
  1203. X
  1204. X    return(buffer);
  1205. X}
  1206. X
  1207. Xvoid initsavedefaults()
  1208. X
  1209. X{
  1210. X    savefileset = FALSE;
  1211. X
  1212. X    (void) makefilename(savefilename, "Save File", FALSE);
  1213. X    savefilevol = currentdirectory();
  1214. X
  1215. X    return;
  1216. X}
  1217. X
  1218. Xvoid setsavedefaults(name, vol)
  1219. Xchar *name;
  1220. Xshort vol;
  1221. X
  1222. X{
  1223. X    savefileset = TRUE;
  1224. X
  1225. X    strncpy(savefilename, name, 63);
  1226. X    savefilename[63] = '\0';
  1227. X
  1228. X    savefilevol = vol;
  1229. X
  1230. X    return;
  1231. X}
  1232. X
  1233. Xint getsavedefaults(name, vol)
  1234. Xchar *name;
  1235. Xshort *vol;
  1236. X
  1237. X{
  1238. X    strcpy(name, savefilename);
  1239. X    *vol = savefilevol;
  1240. X
  1241. X    return(savefileset);
  1242. X}
  1243. X
  1244. Xint getfinderfile()
  1245. X
  1246. X{
  1247. X    short message, count, i;
  1248. X    AppFile appfile;
  1249. X
  1250. X    CountAppFiles(&message, &count);
  1251. X
  1252. X    for (i = 1; i <= count; i++) {
  1253. X        GetAppFiles(i, &appfile);
  1254. X        if (appfile.fType == SAVE_FTYPE) break;
  1255. X    }
  1256. X
  1257. X    if (i <= count) {
  1258. X        setsavedefaults(p2cstr(appfile.fName), appfile.vRefNum);
  1259. X    }
  1260. X
  1261. X    return(i <= count);
  1262. X}
  1263. X
  1264. Xlong setfileinfo(fname, vrefnum, ftype)
  1265. Xchar *fname;
  1266. Xshort vrefnum;
  1267. Xlong ftype;
  1268. X
  1269. X{
  1270. X    long fcreator;
  1271. X    char temp[64];
  1272. X    FileParam pb;
  1273. X    OSErr err;
  1274. X
  1275. X    fcreator = (ftype != INFO_FTYPE) ? MORIA_FCREATOR : editor;
  1276. X
  1277. X    strcpy(temp, fname);
  1278. X    (void) c2pstr(temp);
  1279. X
  1280. X    pb.ioCompletion = NULL;
  1281. X    pb.ioNamePtr = (unsigned char *)temp;
  1282. X    pb.ioVRefNum = vrefnum;
  1283. X    pb.ioFVersNum = 0;
  1284. X    pb.ioFDirIndex = 0;
  1285. X
  1286. X    err = PBGetFInfo((ParmBlkPtr) &pb, FALSE);
  1287. X
  1288. X    if (err == noErr) {
  1289. X        pb.ioFlFndrInfo.fdType = ftype;
  1290. X        pb.ioFlFndrInfo.fdCreator = fcreator;
  1291. X        err = PBSetFInfo((ParmBlkPtr) &pb, FALSE);
  1292. X    }
  1293. X
  1294. X    return(err == noErr);
  1295. X}
  1296. X
  1297. X#if 0
  1298. Xlong getfileage(fname, vrefnum)
  1299. Xchar *fname;
  1300. Xshort vrefnum;
  1301. X
  1302. X{
  1303. X    char temp[64];
  1304. X    FileParam pb;
  1305. X    OSErr err;
  1306. X    long age;
  1307. X
  1308. X    strcpy(temp, fname);
  1309. X    (void) c2pstr(temp);
  1310. X
  1311. X    pb.ioCompletion = NULL;
  1312. X    pb.ioNamePtr = temp;
  1313. X    pb.ioVRefNum = vrefnum;
  1314. X    pb.ioFVersNum = 0;
  1315. X    pb.ioFDirIndex = 0;
  1316. X
  1317. X    err = PBGetFInfo((ParmBlkPtr) &pb, FALSE);
  1318. X
  1319. X    if (err == noErr) {
  1320. X        GetDateTime((unsigned long *) &age);
  1321. X        age -= pb.ioFlMdDat;
  1322. X    }
  1323. X    else
  1324. X        age = 0;
  1325. X
  1326. X    return(age);
  1327. X}
  1328. X#endif
  1329. X
  1330. Xvoid benediction()
  1331. X
  1332. X{
  1333. X    Rect scrn;
  1334. X
  1335. X    scrn.left = 0;
  1336. X    scrn.top = SCRN_ROWS-1;
  1337. X    scrn.right = SCRN_COLS;
  1338. X    scrn.bottom = SCRN_ROWS;
  1339. X
  1340. X    EraseScreen(&scrn);
  1341. X
  1342. X    SetScreenCursor(0, SCRN_ROWS-1);
  1343. X    WriteScreenString("Please select a command from the file menu...");
  1344. X
  1345. X    return;
  1346. X}
  1347. X
  1348. Xvoid setsavecmdstatus(val, init)
  1349. Xint val, init;
  1350. X
  1351. X{
  1352. X    save_cmd_level = val;
  1353. X
  1354. X    if (init)
  1355. X        save_cmd_enabled = val > 0;
  1356. X
  1357. X    return;
  1358. X}
  1359. X
  1360. Xvoid enablesavecmd(flag)
  1361. Xint flag;
  1362. X
  1363. X{
  1364. X    save_cmd_level += flag ? 1 : -1;
  1365. X    return;
  1366. X}
  1367. X
  1368. Xvoid setfilemenustatus(val, init)
  1369. Xint val, init;
  1370. X
  1371. X{
  1372. X    file_menu_level = val;
  1373. X
  1374. X    if (init)
  1375. X        file_menu_enabled = val > 0;
  1376. X
  1377. X    return;
  1378. X}
  1379. X
  1380. Xvoid enablefilemenu(flag)
  1381. Xint flag;
  1382. X
  1383. X{
  1384. X    file_menu_level += flag ? 1 : -1;
  1385. X    return;
  1386. X}
  1387. X
  1388. Xvoid setappmenustatus(val, init)
  1389. Xint val, init;
  1390. X
  1391. X{
  1392. X    app_menu_level = val;
  1393. X
  1394. X    if (init)
  1395. X        app_menu_enabled = val > 0;
  1396. X
  1397. X    return;
  1398. X}
  1399. X
  1400. Xvoid enableappmenu(flag)
  1401. Xint flag;
  1402. X
  1403. X{
  1404. X    app_menu_level += flag ? 1 : -1;
  1405. X    return;
  1406. X}
  1407. X
  1408. Xvoid savequitorcancel(next)
  1409. Xint next;
  1410. X
  1411. X{
  1412. X    DialogPtr thedialog;
  1413. X    short itemhit;
  1414. X    short itstype;
  1415. X    Rect itsrect;
  1416. X    long h, v;
  1417. X    long saveOk, dialogFinished;
  1418. X
  1419. X    thedialog = GetNewDialog(sqc_dlg_id, nil, (WindowPtr) -1);
  1420. X
  1421. X    CenterScreenDLOG(sqc_dlg_id, fixHalf, fixThird, &h, &v);
  1422. X    MoveWindow((WindowPtr) thedialog, (short) h, (short) v, false);
  1423. X
  1424. X    if ((save_cmd_level > 0) && !total_winner) {
  1425. X        sqcdefault_item = sqc_save_item;
  1426. X        saveOk = true;
  1427. X    }
  1428. X    else {
  1429. X        sqcdefault_item = sqc_quit_item;
  1430. X        saveOk = false;
  1431. X    }
  1432. X
  1433. X    GetDItem(thedialog, sqcdefault_item, &itstype, &sqcdefault_handle, &itsrect);
  1434. X    InsetRect(&itsrect, -4, -4);
  1435. X
  1436. X    SetDItem(thedialog, sqc_defbrd_item, userItem,
  1437. X         (Handle) DrawDefaultBorder, &itsrect);
  1438. X
  1439. X    ShowWindow((WindowPtr) thedialog);
  1440. X
  1441. X    do {
  1442. X        ModalDialog(sqcfilter, &itemhit);
  1443. X        if ( (!saveOk) && (itemhit == sqc_save_item) ) {
  1444. X            if (total_winner)
  1445. X                alert_error("Sorry.  Since you are a total \
  1446. Xwinner, you cannot save this game.  Your character must be retired.");
  1447. X            else
  1448. X                alert_error("Sorry.  You cannot save at this \
  1449. Xpoint in the game.  It must be your turn to move in order to save.");
  1450. X            dialogFinished = false;
  1451. X        }
  1452. X        else
  1453. X            dialogFinished = (itemhit == sqc_save_item) ||
  1454. X                        (itemhit == sqc_quit_item) ||
  1455. X                        (itemhit == sqc_cancel_item);
  1456. X    } while (!dialogFinished);
  1457. X
  1458. X    DisposDialog(thedialog);
  1459. X
  1460. X    switch (itemhit) {
  1461. X
  1462. X        case sqc_save_item:
  1463. X            if (asksavegame(FALSE)) {
  1464. X                HiliteMenu(0);
  1465. X                (void) strcpy (died_from, "(saved)");
  1466. X                exit_code = next;
  1467. X                if (save_char(FALSE))
  1468. X                    exit_game();
  1469. X                /* Should only get here if save_char fails */
  1470. X                UnloadSeg(save_char);
  1471. X                UnloadSeg(exit_game);
  1472. X                exit_code = NEXT_WAIT;
  1473. X                (void) strcpy (died_from, "(alive and well)");
  1474. X            }
  1475. X            break;
  1476. X
  1477. X        case sqc_quit_item:
  1478. X            HiliteMenu(0);
  1479. X            death = TRUE;
  1480. X            (void) strcpy(died_from, "Quitting.");
  1481. X            exit_code = next;
  1482. X            exit_game();
  1483. X            /* Should never get here */
  1484. X            UnloadSeg(exit_game);
  1485. X            exit_code = NEXT_WAIT;
  1486. X            (void) strcpy (died_from, "(alive and well)");
  1487. X            death = FALSE;
  1488. X            break;
  1489. X
  1490. X        default:
  1491. X            HiliteMenu(0);
  1492. X            break;
  1493. X
  1494. X    }
  1495. X
  1496. X    return;
  1497. X}
  1498. X
  1499. Xvoid loaddata(restart)
  1500. Xint restart;
  1501. X{
  1502. X    if (
  1503. X#if 0
  1504. X                (!allocmalloczone(restart))    ||
  1505. X#endif
  1506. X            (!allocsavearea(restart))    ||
  1507. X            (!setupmem(restart))        ||
  1508. X            (!getresources(restart))    ||
  1509. X            (!getrestart(restart))        ||
  1510. X            (!clearvars(restart))            )
  1511. X
  1512. X                fatal_error("Insufficient memory to play Moria.  Sorry.");
  1513. X
  1514. X    return;
  1515. X}
  1516. X
  1517. Xvoid goback()
  1518. X
  1519. X{
  1520. X    longjmp(jb, exit_code);
  1521. X}
  1522. X
  1523. Xint startfinder()
  1524. X
  1525. X{
  1526. X    int next;
  1527. X    int argc;
  1528. X    long local_cmdsetopt;
  1529. X    char *argv[2];
  1530. X
  1531. X    if ((next = setjmp(jb)) != 0) return(next);
  1532. X
  1533. X    clear_screen();
  1534. X
  1535. X    local_cmdsetopt = cmdsetopt;
  1536. X
  1537. X    argc = 0;
  1538. X    argv[argc++] = NULL;
  1539. X    argv[argc++] = (char *) &local_cmdsetopt;
  1540. X
  1541. X    game_flag = TRUE;
  1542. X    exit_code = NEXT_WAIT;
  1543. X
  1544. X    moria_main(argc, argv);
  1545. X
  1546. X    /* should never get here */
  1547. X    return(NEXT_WAIT);
  1548. X}
  1549. X
  1550. Xint startnew()
  1551. X
  1552. X{
  1553. X    int next;
  1554. X    int argc;
  1555. X    long local_cmdsetopt, local_newgameopt;
  1556. X    char *argv[3];
  1557. X
  1558. X    if ((next = setjmp(jb)) != 0) return(next);
  1559. X
  1560. X    clear_screen();
  1561. X
  1562. X    local_cmdsetopt = cmdsetopt;
  1563. X    local_newgameopt = '-n\0\0';
  1564. X
  1565. X    argc = 0;
  1566. X    argv[argc++] = NULL;
  1567. X    argv[argc++] = (char *) &local_cmdsetopt;
  1568. X    argv[argc++] = (char *) &local_newgameopt;
  1569. X
  1570. X    game_flag = TRUE;
  1571. X    exit_code = NEXT_WAIT;
  1572. X
  1573. X    moria_main(argc, argv);
  1574. X
  1575. X    /* should never get here */
  1576. X    return(NEXT_WAIT);
  1577. X}
  1578. X
  1579. Xint startopen()
  1580. X
  1581. X{
  1582. X    int next;
  1583. X    int argc;
  1584. X    long local_cmdsetopt;
  1585. X    char *argv[2];
  1586. X
  1587. X    if ((next = setjmp(jb)) != 0) return(next);
  1588. X
  1589. X    clear_screen();
  1590. X
  1591. X    if (dogetfile(savefilename, &savefilevol)) {
  1592. X
  1593. X        savefileset = TRUE;
  1594. X
  1595. X        local_cmdsetopt = cmdsetopt;
  1596. X
  1597. X        argc = 0;
  1598. X        argv[argc++] = NULL;
  1599. X        argv[argc++] = (char *) &local_cmdsetopt;
  1600. X
  1601. X        game_flag = TRUE;
  1602. X        exit_code = NEXT_WAIT;
  1603. X
  1604. X        moria_main(argc, argv);
  1605. X
  1606. X    }
  1607. X
  1608. X    /* should not get here unless user cancels standard file dialog */
  1609. X    return(NEXT_WAIT);
  1610. X}
  1611. X
  1612. Xint waitforchoice()
  1613. X
  1614. X{
  1615. X    int next;
  1616. X
  1617. X    if ((next = setjmp(jb)) != 0) return(next);
  1618. X
  1619. X    game_flag = FALSE;
  1620. X
  1621. X    benediction();
  1622. X
  1623. X    do {
  1624. X        idle();
  1625. X    } while(TRUE);
  1626. X
  1627. X    return(NEXT_WAIT);
  1628. X}
  1629. X
  1630. Xvoid dofmnew()
  1631. X
  1632. X{
  1633. X    if (game_flag && character_generated)
  1634. X        savequitorcancel(NEXT_NEW);
  1635. X
  1636. X    else {
  1637. X        HiliteMenu(0);
  1638. X        exit_code = NEXT_NEW;
  1639. X        goback();
  1640. X    }
  1641. X
  1642. X    return;
  1643. X}
  1644. X
  1645. Xvoid dofmopen()
  1646. X
  1647. X{
  1648. X    if (game_flag && character_generated)
  1649. X        savequitorcancel(NEXT_OPEN);
  1650. X
  1651. X    else {
  1652. X        HiliteMenu(0);
  1653. X        exit_code = NEXT_OPEN;
  1654. X        goback();
  1655. X    }
  1656. X
  1657. X    return;
  1658. X}
  1659. X
  1660. Xvoid dofmsave(ask)
  1661. Xint ask;
  1662. X
  1663. X{
  1664. X    if (game_flag && character_generated && total_winner) {
  1665. X        alert_error("Sorry.  Since you are a total winner, you cannot\
  1666. X save this game.  Your character must be retired.");
  1667. X        HiliteMenu(0);
  1668. X    }
  1669. X    else if (game_flag && character_generated && asksavegame(ask)) {
  1670. X        HiliteMenu(0);
  1671. X        (void) strcpy (died_from, "(saved)");
  1672. X        if (save_char(FALSE))
  1673. X            exit_game();
  1674. X        /* Should only get here if save_char fails */
  1675. X        UnloadSeg(save_char);
  1676. X        UnloadSeg(exit_game);
  1677. X        (void) strcpy (died_from, "(alive and well)");
  1678. X    }
  1679. X    else
  1680. X        HiliteMenu(0);
  1681. X
  1682. X    return;
  1683. X}
  1684. X
  1685. Xvoid dofmquit()
  1686. X
  1687. X{
  1688. X    if (game_flag && character_generated)
  1689. X        savequitorcancel(NEXT_QUIT);
  1690. X
  1691. X    else {
  1692. X        HiliteMenu(0);
  1693. X        exit_code = NEXT_QUIT;
  1694. X        goback();
  1695. X    }
  1696. X
  1697. X    return;
  1698. X}
  1699. X
  1700. Xvoid dofilemenu(item)
  1701. Xlong item;
  1702. X
  1703. X{
  1704. X    switch (item) {
  1705. X
  1706. X        case FM_NEW:        dofmnew();
  1707. X                            break;
  1708. X
  1709. X        case FM_OPEN:        dofmopen();
  1710. X                            break;
  1711. X
  1712. X        case FM_SAVE:        dofmsave(FALSE);
  1713. X                            break;
  1714. X
  1715. X        case FM_SAVE_AS:    dofmsave(TRUE);
  1716. X                            break;
  1717. X
  1718. X        case FM_QUIT:        dofmquit();
  1719. X                            break;
  1720. X
  1721. X        case closeBoxItem:    if (file_menu_level > 0) dofmquit();
  1722. X                            break;
  1723. X
  1724. X        default:            HiliteMenu(0);
  1725. X                            break;
  1726. X
  1727. X    }
  1728. X
  1729. X    return;
  1730. X}
  1731. X
  1732. Xvoid doappmenu(item)
  1733. Xlong item;
  1734. X
  1735. X{
  1736. X    switch (item) {
  1737. X
  1738. X        case AM_HELP:        DoMacHelp();
  1739. X                            UnloadSeg(DoMacHelp);
  1740. X                            break;
  1741. X
  1742. X        case AM_CMD_SET:    ConfigScreenMgr(TRUE, CMDSET_TYPE,
  1743. X                            CMDSET_ID, GetCommandSet);
  1744. X                            UnloadSeg(GetCommandSet);
  1745. X                            cmdsetopt = **((long **) GetResource(CMDSET_TYPE, CMDSET_ID));
  1746. X                            HiliteMenu(0);
  1747. X                            break;
  1748. X
  1749. X        case AM_TEXT_ED:    ConfigScreenMgr(TRUE, TE_TYPE, TE_ID, GetTextEditor);
  1750. X                            UnloadSeg(GetTextEditor);
  1751. X                            editor = **((long **) GetResource(TE_TYPE, TE_ID));
  1752. X                            HiliteMenu(0);
  1753. X                            break;
  1754. X
  1755. X        case AM_SCORES:        DoScoresDlg();
  1756. X                            UnloadSeg(DoScoresDlg);
  1757. X                            break;
  1758. X
  1759. X        default:            HiliteMenu(0);
  1760. X                            break;
  1761. X
  1762. X    }
  1763. X
  1764. X    return;
  1765. X}
  1766. X
  1767. Xvoid unloadsegments()
  1768. X
  1769. X{
  1770. X#ifndef THINK_C
  1771. X    extern void create_character(),
  1772. X        creatures(),
  1773. X        exit_game(),
  1774. X        eat(),
  1775. X        file_character(),
  1776. X        generate_cave(),
  1777. X        ident_char(),
  1778. X        cast(),
  1779. X        pray(),
  1780. X        quaff(),
  1781. X        roff_recall(),
  1782. X        save_char(),
  1783. X        read_scroll(),
  1784. X        use(),
  1785. X        store_init(),
  1786. X        aim(),
  1787. X        wizard_light();
  1788. X
  1789. X    UnloadSeg(create_character);            /* Create            */
  1790. X    UnloadSeg(creatures);                    /* Creature            */
  1791. X    UnloadSeg(exit_game);                    /* Death            */
  1792. X    UnloadSeg(eat);                            /* Eat                */
  1793. X    UnloadSeg(file_character);                /* Files            */
  1794. X    UnloadSeg(generate_cave);                /* Generate            */
  1795. X    UnloadSeg(ident_char);                    /* Help                */
  1796. X    UnloadSeg(cast);                        /* Magic            */
  1797. X    UnloadSeg(pray);                        /* Prayer            */
  1798. X    UnloadSeg(quaff);                        /* Potions            */
  1799. X    UnloadSeg(roff_recall);                    /* Recall            */
  1800. X    UnloadSeg(save_char);                    /* Save                */
  1801. X    UnloadSeg(read_scroll);                    /* Scrolls            */
  1802. X    UnloadSeg(use);                            /* Staffs            */
  1803. X    UnloadSeg(store_init);                    /* Store            */
  1804. X    UnloadSeg(aim);                            /* Wands            */
  1805. X    UnloadSeg(wizard_light);                /* Wizard            */
  1806. X#endif
  1807. X
  1808. X    return;
  1809. X}
  1810. X
  1811. Xvoid salutation()
  1812. X
  1813. X{
  1814. X    mac_helpfile(MORIA_MOR, FALSE);
  1815. X}
  1816. X
  1817. Xint main()
  1818. X
  1819. X{
  1820. X    int next, savedgame, restart_flag;
  1821. X#ifndef THINK_C
  1822. X    extern void _DataInit();
  1823. X#endif
  1824. X
  1825. X    checkdebugger();
  1826. X
  1827. X#ifndef THINK_C
  1828. X    UnloadSeg(_DataInit);
  1829. X#endif
  1830. X
  1831. X    getstack(0x7000L);
  1832. X
  1833. X      MaxApplZone();
  1834. X
  1835. X    /* Do this early to prevent fragmentation */
  1836. X    loaddata(FALSE);
  1837. X
  1838. X    InitScreenMgr(SCRN_COLS, SCRN_ROWS,
  1839. X        "Moria", "Moria Config",
  1840. X        MORIA_FCREATOR, CONFIG_FTYPE,
  1841. X        dofilemenu, doappmenu,
  1842. X        twoColor);
  1843. X
  1844. X    /* Get permanently set options */
  1845. X    /* If user has not set them yet, a dialog will be invoked */
  1846. X    /* Otherwise, they will be loaded from the preferences file */
  1847. X
  1848. X    ConfigScreenMgr(FALSE, CMDSET_TYPE, CMDSET_ID, GetCommandSet);
  1849. X#ifndef THINK_C
  1850. X    UnloadSeg(GetCommandSet);
  1851. X#endif
  1852. X    cmdsetopt = **((long **) GetResource(CMDSET_TYPE, CMDSET_ID));
  1853. X
  1854. X    ConfigScreenMgr(FALSE, TE_TYPE, TE_ID, GetTextEditor);
  1855. X#ifndef THINK_C
  1856. X    UnloadSeg(GetTextEditor);
  1857. X#endif
  1858. X    editor = **((long **) GetResource(TE_TYPE, TE_ID));
  1859. X
  1860. X    DefineScreenCursor(attrColorFore, 2, GetCaretTime());
  1861. X    ShowScreenCursor();
  1862. X
  1863. X    /* Save the application volume */
  1864. X    GetVol(NULL, &applvrefnum);
  1865. X
  1866. X    /* These should be based up the menu resources */
  1867. X    setsavecmdstatus(0, TRUE);
  1868. X    setfilemenustatus(1, TRUE);
  1869. X    setappmenustatus(1, TRUE);
  1870. X
  1871. X    restart_flag = FALSE;
  1872. X
  1873. X    initsavedefaults ();
  1874. X
  1875. X    /* Find out if user has started from a saved game */
  1876. X    savedgame = getfinderfile();
  1877. X
  1878. X    if (savedgame) {
  1879. X        enablefilemenu(FALSE);
  1880. X        salutation();
  1881. X        pause_line(23);
  1882. X        enablefilemenu(TRUE);
  1883. X        next = NEXT_FINDER;
  1884. X    }
  1885. X    else {
  1886. X        salutation();
  1887. X        next = NEXT_WAIT;
  1888. X    }
  1889. X
  1890. X    do {
  1891. X        setsavecmdstatus(0, FALSE);
  1892. X        setfilemenustatus(1, FALSE);
  1893. X        setappmenustatus(1, FALSE);
  1894. X        switch (next) {
  1895. X            case NEXT_FINDER:
  1896. X                if (restart_flag) loaddata(TRUE);
  1897. X                next = startfinder();
  1898. X                unloadsegments();
  1899. X                restart_flag = TRUE;
  1900. X                break;
  1901. X            case NEXT_NEW:
  1902. X                if (restart_flag) loaddata(TRUE);
  1903. X                next = startnew();
  1904. X                unloadsegments();
  1905. X                restart_flag = TRUE;
  1906. X                break;
  1907. X            case NEXT_OPEN:
  1908. X                if (restart_flag) loaddata(TRUE);
  1909. X                next = startopen();
  1910. X                unloadsegments();
  1911. X                restart_flag = TRUE;
  1912. X                break;
  1913. X            case NEXT_WAIT:
  1914. X                next = waitforchoice();
  1915. X                break;
  1916. X            default:
  1917. X                msg_print("What was that?");
  1918. X                next = NEXT_WAIT;
  1919. X                break;
  1920. X        }
  1921. X    } while (next != NEXT_QUIT);
  1922. X
  1923. X    CloseScreenMgr();
  1924. X
  1925. X    /* That's all, folks... */
  1926. X    return(0);
  1927. X}
  1928. END_OF_FILE
  1929. if test 30757 -ne `wc -c <'mac/mac.c'`; then
  1930.     echo shar: \"'mac/mac.c'\" unpacked with wrong size!
  1931. fi
  1932. # end of 'mac/mac.c'
  1933. fi
  1934. if test -f 'source/constant.h' -a "${1}" != "-c" ; then 
  1935.   echo shar: Will not clobber existing file \"'source/constant.h'\"
  1936. else
  1937. echo shar: Extracting \"'source/constant.h'\" \(20967 characters\)
  1938. sed "s/^X//" >'source/constant.h' <<'END_OF_FILE'
  1939. X/* source/constant.h: global constants used by Moria
  1940. X
  1941. X   Copyright (c) 1989-92 James E. Wilson, Robert A. Koeneke
  1942. X
  1943. X   This software may be copied and distributed for educational, research, and
  1944. X   not for profit purposes provided that this copyright and statement are
  1945. X   included in all such copies. */
  1946. X
  1947. X/*Note to the Wizard:                    - RAK -     */
  1948. X/*     Tweaking these constants can *GREATLY* change the game. */
  1949. X/*     Two years of constant tuning have generated these     */
  1950. X/*     values.  Minor adjustments are encouraged, but you must */
  1951. X/*     be very careful not to unbalance the game.  Moria was     */
  1952. X/*     meant to be challenging, not a give away.  Many     */
  1953. X/*     adjustments can cause the game to act strangely, or even*/
  1954. X/*     cause errors.                         */
  1955. X
  1956. X/*Addendum:                            - JEW -
  1957. X  I have greatly expanded the number of defined constants.  However, if
  1958. X  you change anything below, without understanding EXACTLY how the game
  1959. X  uses the number, the program may stop working correctly.  Modify the
  1960. X  constants at your own risk. */
  1961. X
  1962. X#define CONSTANT_H_INCLUDED
  1963. X#ifndef CONFIG_H_INCLUDED
  1964. XConstant.h should always be included after config.h, because it uses
  1965. Xsome of the system defines set up there.
  1966. X#endif
  1967. X
  1968. X/* Current version number of Moria                */
  1969. X#define CUR_VERSION_MAJ 5 /* version 5.5 */
  1970. X#define CUR_VERSION_MIN 5
  1971. X#define PATCH_LEVEL 0
  1972. X
  1973. X#ifndef TRUE
  1974. X#define TRUE 1
  1975. X#endif
  1976. X#ifndef FALSE
  1977. X#define FALSE 0
  1978. X#endif
  1979. X
  1980. X#define MAX_UCHAR    255
  1981. X#define MAX_SHORT    32767        /* maximum short/long signed ints */
  1982. X#define MAX_LONG    0x7FFFFFFFL
  1983. X
  1984. X/* Changing values below this line may be hazardous to your health! */
  1985. X
  1986. X/* message line location */
  1987. X#define MSG_LINE  0
  1988. X
  1989. X/* number of messages to save in a buffer */
  1990. X#define MAX_SAVE_MSG   22   /* How many messages to save -CJS- */
  1991. X
  1992. X/* Dungeon size parameters                    */
  1993. X#define MAX_HEIGHT  66        /* Multiple of 11; >= 22 */
  1994. X#define MAX_WIDTH  198      /* Multiple of 33; >= 66 */
  1995. X#define SCREEN_HEIGHT  22
  1996. X#define SCREEN_WIDTH   66
  1997. X#define QUART_HEIGHT (SCREEN_HEIGHT / 4)
  1998. X#define QUART_WIDTH  (SCREEN_WIDTH / 4)
  1999. X
  2000. X/* Dungeon generation values                    */
  2001. X/* Note: The entire design of dungeon can be changed by only     */
  2002. X/*     slight adjustments here.                 */
  2003. X#define DUN_TUN_RND      9   /* 1/Chance of Random direction           */
  2004. X#define DUN_TUN_CHG     70   /* Chance of changing direction (99 max) */
  2005. X#define DUN_TUN_CON     15   /* Chance of extra tunneling           */
  2006. X#define DUN_ROO_MEA     32   /* Mean of # of rooms, standard dev2     */
  2007. X#define DUN_TUN_PEN     25   /* % chance of room doors               */
  2008. X#define DUN_TUN_JCT     15   /* % chance of doors at tunnel junctions */
  2009. X#define DUN_STR_DEN     5    /* Density of streamers               */
  2010. X#define DUN_STR_RNG     2    /* Width of streamers               */
  2011. X#define DUN_STR_MAG     3    /* Number of magma streamers           */
  2012. X#define DUN_STR_MC     90   /* 1/x chance of treasure per magma      */
  2013. X#define DUN_STR_QUA     2    /* Number of quartz streamers           */
  2014. X#define DUN_STR_QC     40   /* 1/x chance of treasure per quartz     */
  2015. X#define DUN_UNUSUAL     300  /* Level/x chance of unusual room           */
  2016. X
  2017. X/* Store constants                        */
  2018. X#define MAX_OWNERS     18   /* Number of owners to choose from       */
  2019. X#define MAX_STORES     6    /* Number of different stores           */
  2020. X#define STORE_INVEN_MAX     24   /* Max number of discrete objs in inven  */
  2021. X#define STORE_CHOICES     26   /* NUMBER of items to choose stock from  */
  2022. X#define STORE_MAX_INVEN     18   /* Max diff objs in stock for auto buy   */
  2023. X#define STORE_MIN_INVEN     10   /* Min diff objs in stock for auto sell  */
  2024. X#define STORE_TURN_AROUND 9   /* Amount of buying and selling normally */
  2025. X#define COST_ADJ     100  /* Adjust prices for buying and selling  */
  2026. X
  2027. X/* Treasure constants                        */
  2028. X#define INVEN_ARRAY_SIZE 34   /* Size of inventory array(Do not change)*/
  2029. X#define MAX_OBJ_LEVEL  50     /* Maximum level of magic in dungeon     */
  2030. X#define OBJ_GREAT      12     /* 1/n Chance of item being a Great Item */
  2031. X/* Note that the following constants are all related, if you change one,
  2032. X   you must also change all succeeding ones.  Also, player_init[] and
  2033. X   store_choice[] may also have to be changed. */
  2034. X#define MAX_OBJECTS    420    /* Number of objects for universe           */
  2035. X#define MAX_DUNGEON_OBJ 344   /* Number of dungeon objects */
  2036. X#define OBJ_OPEN_DOOR    367
  2037. X#define OBJ_CLOSED_DOOR 368
  2038. X#define OBJ_SECRET_DOOR 369
  2039. X#define OBJ_UP_STAIR    370
  2040. X#define OBJ_DOWN_STAIR    371
  2041. X#define OBJ_STORE_DOOR  372
  2042. X#define OBJ_TRAP_LIST    378
  2043. X#define OBJ_RUBBLE    396
  2044. X#define OBJ_MUSH    397
  2045. X#define OBJ_SCARE_MON    398
  2046. X#define OBJ_GOLD_LIST    399
  2047. X#define OBJ_NOTHING    417
  2048. X#define OBJ_RUINED_CHEST 418
  2049. X#define OBJ_WIZARD      419
  2050. X#define OBJECT_IDENT_SIZE 448 /* 7*64, see object_offset() in desc.c,
  2051. X                 could be MAX_OBJECTS o_o() rewritten  */
  2052. X#define MAX_GOLD       18     /* Number of different types of gold     */
  2053. X/* with MAX_TALLOC 150, it is possible to get compacting objects during
  2054. X   level generation, although it is extremely rare */
  2055. X#define MAX_TALLOC     175    /* Max objects per level               */
  2056. X#define MIN_TRIX    1     /* Minimum t_list index used        */
  2057. X#define TREAS_ROOM_ALLOC  7   /* Amount of objects for rooms           */
  2058. X#define TREAS_ANY_ALLOC      2   /* Amount of objects for corridors       */
  2059. X#define TREAS_GOLD_ALLOC  2   /* Amount of gold (and gems)           */
  2060. X
  2061. X/* Magic Treasure Generation constants                */
  2062. X/* Note: Number of special objects, and degree of enchantments     */
  2063. X/*     can be adjusted here.                     */
  2064. X#define OBJ_STD_ADJ     125  /* Adjust STD per level * 100           */
  2065. X#define OBJ_STD_MIN     7    /* Minimum STD                   */
  2066. X#define OBJ_TOWN_LEVEL     7    /* Town object generation level           */
  2067. X#define OBJ_BASE_MAGIC     15   /* Base amount of magic               */
  2068. X#define OBJ_BASE_MAX     70   /* Max amount of magic               */
  2069. X#define OBJ_DIV_SPECIAL     6    /* magic_chance/#     special magic          */
  2070. X#define OBJ_DIV_CURSED     13   /* 10*magic_chance/#  cursed items     */
  2071. X
  2072. X/* Constants describing limits of certain objects        */
  2073. X#define OBJ_LAMP_MAX    15000 /* Maximum amount that lamp can be filled*/
  2074. X#define OBJ_BOLT_RANGE     18   /* Maximum range of bolts and balls      */
  2075. X#define OBJ_RUNE_PROT     3000 /* Rune of protection resistance           */
  2076. X
  2077. X/* Creature constants                        */
  2078. X#define MAX_CREATURES      279 /* Number of creatures defined for univ  */
  2079. X#define N_MONS_ATTS      215 /* Number of monster attack types.    */
  2080. X/* with MAX_MALLOC 101, it is possible to get compacting monsters messages
  2081. X   while breeding/cloning monsters */
  2082. X#define MAX_MALLOC      125 /* Max that can be allocated          */
  2083. X#define MAX_MALLOC_CHANCE 160 /* 1/x chance of new monster each round  */
  2084. X#define MAX_MONS_LEVEL       40 /* Maximum level of creatures           */
  2085. X#define MAX_SIGHT       20 /* Maximum dis a creature can be seen    */
  2086. X#define MAX_SPELL_DIS       20 /* Maximum dis creat. spell can be cast  */
  2087. X#define MAX_MON_MULT       75 /* Maximum reproductions on a level      */
  2088. X#define MON_MULT_ADJ        7 /* High value slows multiplication       */
  2089. X#define MON_NASTY       50 /* 1/x chance of high level creat        */
  2090. X#define MIN_MALLOC_LEVEL   14 /* Minimum number of monsters/level      */
  2091. X#define MIN_MALLOC_TD        4 /* Number of people on town level (day)  */
  2092. X#define MIN_MALLOC_TN        8 /* Number of people on town level (night)*/
  2093. X#define WIN_MON_TOT        2 /* Total number of "win" creatures       */
  2094. X#define WIN_MON_APPEAR       50 /* Level where winning creatures begin   */
  2095. X#define MON_SUMMON_ADJ        2 /* Adjust level of summoned creatures    */
  2096. X#define MON_DRAIN_LIFE        2 /* Percent of player exp drained per hit */
  2097. X#define MAX_MON_NATTACK        4 /* Max num attacks (used in mons memory) -CJS-*/
  2098. X#define MIN_MONIX        2 /* Minimum index in m_list (1 = py, 0 = no mon)*/
  2099. X
  2100. X/* Trap constants                        */
  2101. X#define MAX_TRAP     18  /* Number of defined traps              */
  2102. X
  2103. X#define SCARE_MONSTER    99
  2104. X
  2105. X/* Descriptive constants                    */
  2106. X#define MAX_COLORS     49     /* Used with potions     */
  2107. X#define MAX_MUSH       22     /* Used with mushrooms   */
  2108. X#define MAX_WOODS      25     /* Used with staffs      */
  2109. X#define MAX_METALS     25     /* Used with wands       */
  2110. X#define MAX_ROCKS      32     /* Used with rings       */
  2111. X#define MAX_AMULETS    11     /* Used with amulets     */
  2112. X#define MAX_TITLES     45     /* Used with scrolls     */
  2113. X#define MAX_SYLLABLES  153    /* Used with scrolls     */
  2114. X
  2115. X/* Player constants                        */
  2116. X#define MAX_PLAYER_LEVEL  40  /* Maximum possible character level      */
  2117. X#define MAX_EXP        9999999L  /* Maximum amount of experience -CJS- */
  2118. X#define MAX_RACES      8   /* Number of defined races           */
  2119. X#define MAX_CLASS      6   /* Number of defined classes           */
  2120. X#define USE_DEVICE      3   /* x> Harder devices x< Easier devices   */
  2121. X#define MAX_BACKGROUND      128 /* Number of types of histories for univ */
  2122. X#define PLAYER_FOOD_FULL 10000/* Getting full                   */
  2123. X#define PLAYER_FOOD_MAX     15000/* Maximum food value, beyond is wasted  */
  2124. X#define PLAYER_FOOD_FAINT  300/* Character begins fainting           */
  2125. X#define PLAYER_FOOD_WEAK  1000/* Warn player that he is getting very low*/
  2126. X#define PLAYER_FOOD_ALERT 2000/* Warn player that he is getting low    */
  2127. X#define PLAYER_REGEN_FAINT    33   /* Regen factor*2^16 when fainting     */
  2128. X#define PLAYER_REGEN_WEAK     98   /* Regen factor*2^16 when weak     */
  2129. X#define PLAYER_REGEN_NORMAL  197   /* Regen factor*2^16 when full     */
  2130. X#define PLAYER_REGEN_HPBASE  1442  /* Min amount hp regen*2^16         */
  2131. X#define PLAYER_REGEN_MNBASE  524   /* Min amount mana regen*2^16     */
  2132. X#define PLAYER_WEIGHT_CAP 130 /* "#"*(1/10 pounds) per strength point  */
  2133. X#define PLAYER_EXIT_PAUSE 2   /* Pause time before player can re-roll  */
  2134. X
  2135. X/* class level adjustment constants */
  2136. X#define CLA_BTH        0
  2137. X#define CLA_BTHB    1
  2138. X#define CLA_DEVICE    2
  2139. X#define CLA_DISARM    3
  2140. X#define CLA_SAVE    4
  2141. X/* this depends on the fact that CLA_SAVE values are all the same, if not,
  2142. X   then should add a separate column for this */
  2143. X#define CLA_MISC_HIT    4
  2144. X#define MAX_LEV_ADJ    5
  2145. X
  2146. X/* Base to hit constants                    */
  2147. X#define BTH_PLUS_ADJ     3    /* Adjust BTH per plus-to-hit    */
  2148. X
  2149. X/* magic numbers for players inventory array */
  2150. X#define INVEN_WIELD 22    /* must be first item in equipment list */
  2151. X#define INVEN_HEAD  23
  2152. X#define INVEN_NECK  24
  2153. X#define INVEN_BODY  25
  2154. X#define INVEN_ARM   26
  2155. X#define INVEN_HANDS 27
  2156. X#define INVEN_RIGHT 28
  2157. X#define INVEN_LEFT  29
  2158. X#define INVEN_FEET  30
  2159. X#define INVEN_OUTER 31
  2160. X#define INVEN_LIGHT 32
  2161. X#define INVEN_AUX   33
  2162. X
  2163. X/* Attribute indexes -CJS- */
  2164. X
  2165. X#define A_STR 0
  2166. X#define A_INT 1
  2167. X#define A_WIS 2
  2168. X#define A_DEX 3
  2169. X#define A_CON 4
  2170. X#define A_CHR 5
  2171. X
  2172. X/* some systems have a non-ANSI definition of this, so undef it first */
  2173. X#undef CTRL
  2174. X#define CTRL(x)        (x & 0x1F)
  2175. X#define DELETE        0x7f
  2176. X#ifdef VMS
  2177. X#define ESCAPE        '\032'    /* Use CTRL-Z instead of ESCAPE.  */
  2178. X#else
  2179. X#define ESCAPE          '\033'    /* ESCAPE character -CJS-  */
  2180. X#endif
  2181. X
  2182. X/* This used to be NULL, but that was technically incorrect.  CNIL is used
  2183. X   instead of null to help avoid lint errors.  */
  2184. X#ifndef CNIL
  2185. X#define CNIL (char *)0
  2186. X#endif
  2187. X
  2188. X/* Fval definitions: these describe the various types of dungeon floors and
  2189. X   walls, if numbers above 15 are ever used, then the test against
  2190. X   MIN_CAVE_WALL will have to be changed, also the save routines will have
  2191. X   to be changed. */
  2192. X#define NULL_WALL    0
  2193. X#define DARK_FLOOR    1
  2194. X#define LIGHT_FLOOR    2
  2195. X#define MAX_CAVE_ROOM    2
  2196. X#define CORR_FLOOR    3
  2197. X#define BLOCKED_FLOOR    4 /* a corridor space with cl/st/se door or rubble */
  2198. X#define MAX_CAVE_FLOOR    4
  2199. X
  2200. X#define MAX_OPEN_SPACE  3
  2201. X#define MIN_CLOSED_SPACE 4
  2202. X
  2203. X#define TMP1_WALL    8
  2204. X#define TMP2_WALL    9
  2205. X
  2206. X#define MIN_CAVE_WALL    12
  2207. X#define GRANITE_WALL    12
  2208. X#define MAGMA_WALL    13
  2209. X#define QUARTZ_WALL    14
  2210. X#define BOUNDARY_WALL    15
  2211. X
  2212. X/* Column for stats    */
  2213. X#define STAT_COLUMN    0
  2214. X
  2215. X/* Class spell types */
  2216. X#define NONE    0
  2217. X#define MAGE    1
  2218. X#define PRIEST    2
  2219. X
  2220. X/* offsets to spell names in spell_names[] array */
  2221. X#define SPELL_OFFSET    0
  2222. X#define PRAYER_OFFSET    31
  2223. X
  2224. X/* definitions for the psuedo-normal distribution generation */
  2225. X#define NORMAL_TABLE_SIZE    256
  2226. X#define NORMAL_TABLE_SD        64  /* the standard deviation for the table */
  2227. X
  2228. X/* definitions for the player's status field */
  2229. X#define PY_HUNGRY    0x00000001L
  2230. X#define PY_WEAK        0x00000002L
  2231. X#define PY_BLIND    0x00000004L
  2232. X#define PY_CONFUSED    0x00000008L
  2233. X#define PY_FEAR        0x00000010L
  2234. X#define PY_POISONED    0x00000020L
  2235. X#define PY_FAST        0x00000040L
  2236. X#define PY_SLOW        0x00000080L
  2237. X#define PY_SEARCH    0x00000100L
  2238. X#define PY_REST        0x00000200L
  2239. X#define PY_STUDY    0x00000400L
  2240. X
  2241. X#define PY_INVULN    0x00001000L
  2242. X#define PY_HERO        0x00002000L
  2243. X#define PY_SHERO    0x00004000L
  2244. X#define PY_BLESSED    0x00008000L
  2245. X#define PY_DET_INV    0x00010000L
  2246. X#define PY_TIM_INFRA    0x00020000L
  2247. X#define PY_SPEED    0x00040000L
  2248. X#define PY_STR_WGT    0x00080000L
  2249. X#define PY_PARALYSED    0x00100000L
  2250. X#define PY_REPEAT    0x00200000L
  2251. X#define PY_ARMOR    0x00400000L
  2252. X
  2253. X#define PY_STATS    0x3F000000L
  2254. X#define PY_STR        0x01000000L /* these 6 stat flags must be adjacent */
  2255. X#define PY_INT        0x02000000L
  2256. X#define PY_WIS        0x04000000L
  2257. X#define PY_DEX        0x08000000L
  2258. X#define PY_CON        0x10000000L
  2259. X#define PY_CHR        0x20000000L
  2260. X
  2261. X#define PY_HP        0x40000000L
  2262. X#define PY_MANA        0x80000000L
  2263. X
  2264. X/* definitions for objects that can be worn */
  2265. X#define TR_STATS    0x0000003FL    /* the stats must be the low 6 bits */
  2266. X#define TR_STR        0x00000001L
  2267. X#define TR_INT        0x00000002L
  2268. X#define TR_WIS        0x00000004L
  2269. X#define TR_DEX        0x00000008L
  2270. X#define TR_CON        0x00000010L
  2271. X#define TR_CHR        0x00000020L
  2272. X#define TR_SEARCH    0x00000040L
  2273. X#define TR_SLOW_DIGEST    0x00000080L
  2274. X#define TR_STEALTH    0x00000100L
  2275. X#define TR_AGGRAVATE    0x00000200L
  2276. X#define TR_TELEPORT    0x00000400L
  2277. X#define TR_REGEN    0x00000800L
  2278. X#define TR_SPEED    0x00001000L
  2279. X
  2280. X#define TR_EGO_WEAPON    0x0007E000L
  2281. X#define TR_SLAY_DRAGON    0x00002000L
  2282. X#define TR_SLAY_ANIMAL    0x00004000L
  2283. X#define TR_SLAY_EVIL    0x00008000L
  2284. X#define TR_SLAY_UNDEAD    0x00010000L
  2285. X#define TR_FROST_BRAND    0x00020000L
  2286. X#define TR_FLAME_TONGUE    0x00040000L
  2287. X
  2288. X#define TR_RES_FIRE    0x00080000L
  2289. X#define TR_RES_ACID    0x00100000L
  2290. X#define TR_RES_COLD    0x00200000L
  2291. X#define TR_SUST_STAT    0x00400000L
  2292. X#define TR_FREE_ACT    0x00800000L
  2293. X#define TR_SEE_INVIS    0x01000000L
  2294. X#define TR_RES_LIGHT    0x02000000L
  2295. X#define TR_FFALL    0x04000000L
  2296. X#define TR_BLIND    0x08000000L
  2297. X#define TR_TIMID    0x10000000L
  2298. X#define TR_TUNNEL    0x20000000L
  2299. X#define TR_INFRA    0x40000000L
  2300. X#define TR_CURSED    0x80000000L
  2301. X
  2302. X/* definitions for chests */
  2303. X#define CH_LOCKED    0x00000001L
  2304. X#define CH_TRAPPED    0x000001F0L
  2305. X#define CH_LOSE_STR    0x00000010L
  2306. X#define CH_POISON    0x00000020L
  2307. X#define CH_PARALYSED    0x00000040L
  2308. X#define CH_EXPLODE    0x00000080L
  2309. X#define CH_SUMMON    0x00000100L
  2310. X
  2311. X/* definitions for creatures, cmove field */
  2312. X#define CM_ALL_MV_FLAGS    0x0000003FL
  2313. X#define CM_ATTACK_ONLY    0x00000001L
  2314. X#define CM_MOVE_NORMAL    0x00000002L
  2315. X/* For Quylthulgs, which have no physical movement.  */
  2316. X#define CM_ONLY_MAGIC    0x00000004L
  2317. X
  2318. X#define CM_RANDOM_MOVE    0x00000038L
  2319. X#define CM_20_RANDOM    0x00000008L
  2320. X#define CM_40_RANDOM    0x00000010L
  2321. X#define CM_75_RANDOM    0x00000020L
  2322. X
  2323. X#define CM_SPECIAL    0x003F0000L
  2324. X#define CM_INVISIBLE    0x00010000L
  2325. X#define CM_OPEN_DOOR    0x00020000L
  2326. X#define CM_PHASE    0x00040000L
  2327. X#define CM_EATS_OTHER    0x00080000L
  2328. X#define CM_PICKS_UP    0x00100000L
  2329. X#define CM_MULTIPLY    0x00200000L
  2330. X
  2331. X#define CM_CARRY_OBJ    0x01000000L
  2332. X#define CM_CARRY_GOLD    0x02000000L
  2333. X#define CM_TREASURE    0x7C000000L
  2334. X#define CM_TR_SHIFT    26        /* used for recall of treasure */
  2335. X#define CM_60_RANDOM    0x04000000L
  2336. X#define CM_90_RANDOM    0x08000000L
  2337. X#define CM_1D2_OBJ    0x10000000L
  2338. X#define CM_2D2_OBJ    0x20000000L
  2339. X#define CM_4D2_OBJ    0x40000000L
  2340. X#define CM_WIN        0x80000000L
  2341. X
  2342. X/* creature spell definitions */
  2343. X#define CS_FREQ        0x0000000FL
  2344. X#define CS_SPELLS    0x0001FFF0L
  2345. X#define CS_TEL_SHORT    0x00000010L
  2346. X#define CS_TEL_LONG    0x00000020L
  2347. X#define CS_TEL_TO    0x00000040L
  2348. X#define CS_LGHT_WND    0x00000080L
  2349. X#define CS_SER_WND    0x00000100L
  2350. X#define CS_HOLD_PER    0x00000200L
  2351. X#define CS_BLIND    0x00000400L
  2352. X#define CS_CONFUSE    0x00000800L
  2353. X#define CS_FEAR        0x00001000L
  2354. X#define CS_SUMMON_MON    0x00002000L
  2355. X#define CS_SUMMON_UND    0x00004000L
  2356. X#define CS_SLOW_PER    0x00008000L
  2357. X#define CS_DRAIN_MANA    0x00010000L
  2358. X
  2359. X#define CS_BREATHE    0x00F80000L
  2360. X#define CS_BR_LIGHT    0x00080000L
  2361. X#define CS_BR_GAS    0x00100000L
  2362. X#define CS_BR_ACID    0x00200000L
  2363. X#define CS_BR_FROST    0x00400000L
  2364. X#define CS_BR_FIRE    0x00800000L
  2365. X
  2366. X/* creature defense flags */
  2367. X#define CD_DRAGON    0x0001
  2368. X#define CD_ANIMAL    0x0002
  2369. X#define CD_EVIL        0x0004
  2370. X#define CD_UNDEAD    0x0008
  2371. X#define CD_WEAKNESS    0x03F0
  2372. X#define CD_FROST    0x0010
  2373. X#define CD_FIRE        0x0020
  2374. X#define CD_POISON    0x0040
  2375. X#define CD_ACID        0x0080
  2376. X#define CD_LIGHT    0x0100
  2377. X#define CD_STONE    0x0200
  2378. X
  2379. X#define CD_NO_SLEEP    0x1000
  2380. X#define CD_INFRA    0x2000
  2381. X#define CD_MAX_HP    0x4000
  2382. X
  2383. X/* inventory stacking subvals */
  2384. X/* these never stack */
  2385. X#define ITEM_NEVER_STACK_MIN    0
  2386. X#define ITEM_NEVER_STACK_MAX    63
  2387. X/* these items always stack with others of same subval, always treated as
  2388. X   single objects, must be power of 2 */
  2389. X#define ITEM_SINGLE_STACK_MIN    64
  2390. X#define ITEM_SINGLE_STACK_MAX    192    /* see NOTE below */
  2391. X/* these items stack with others only if have same subval and same p1,
  2392. X   they are treated as a group for wielding, etc. */
  2393. X#define ITEM_GROUP_MIN        192
  2394. X#define ITEM_GROUP_MAX        255
  2395. X/* NOTE: items with subval 192 are treated as single objects, but only stack
  2396. X   with others of same subval if have the same p1 value, only used for
  2397. X   torches */
  2398. X
  2399. X/* id's used for object description, stored in object_ident */
  2400. X#define OD_TRIED    0x1
  2401. X#define OD_KNOWN1    0x2
  2402. X
  2403. X/* id's used for item description, stored in i_ptr->ident */
  2404. X#define ID_MAGIK    0x1
  2405. X#define ID_DAMD        0x2
  2406. X#define ID_EMPTY    0x4
  2407. X#define ID_KNOWN2    0x8
  2408. X#define ID_STOREBOUGHT    0x10
  2409. X#define ID_SHOW_HITDAM    0x20
  2410. X#define ID_NOSHOW_P1    0x40
  2411. X#define ID_SHOW_P1    0x80
  2412. X
  2413. X/* indexes into the special name table */
  2414. X#define SN_NULL            0
  2415. X#define SN_R            1
  2416. X#define SN_RA            2
  2417. X#define SN_RF            3
  2418. X#define SN_RC            4
  2419. X#define SN_RL            5
  2420. X#define SN_HA            6
  2421. X#define SN_DF            7
  2422. X#define SN_SA            8
  2423. X#define SN_SD            9
  2424. X#define SN_SE            10
  2425. X#define SN_SU            11
  2426. X#define SN_FT            12
  2427. X#define SN_FB            13
  2428. X#define SN_FREE_ACTION        14
  2429. X#define SN_SLAYING        15
  2430. X#define SN_CLUMSINESS        16
  2431. X#define SN_WEAKNESS        17
  2432. X#define SN_SLOW_DESCENT        18
  2433. X#define SN_SPEED        19
  2434. X#define SN_STEALTH        20
  2435. X#define SN_SLOWNESS        21
  2436. X#define SN_NOISE        22
  2437. X#define SN_GREAT_MASS        23
  2438. X#define SN_INTELLIGENCE        24
  2439. X#define SN_WISDOM        25
  2440. X#define SN_INFRAVISION        26
  2441. X#define SN_MIGHT        27
  2442. X#define SN_LORDLINESS        28
  2443. X#define SN_MAGI            29
  2444. X#define SN_BEAUTY        30
  2445. X#define SN_SEEING        31
  2446. X#define SN_REGENERATION        32
  2447. X#define SN_STUPIDITY        33
  2448. X#define SN_DULLNESS        34
  2449. X#define SN_BLINDNESS        35
  2450. X#define SN_TIMIDNESS        36
  2451. X#define SN_TELEPORTATION    37
  2452. X#define SN_UGLINESS        38
  2453. X#define SN_PROTECTION        39
  2454. X#define SN_IRRITATION        40
  2455. X#define SN_VULNERABILITY    41
  2456. X#define SN_ENVELOPING        42
  2457. X#define SN_FIRE            43
  2458. X#define SN_SLAY_EVIL        44
  2459. X#define SN_DRAGON_SLAYING    45
  2460. X#define SN_EMPTY        46
  2461. X#define SN_LOCKED        47
  2462. X#define SN_POISON_NEEDLE    48
  2463. X#define SN_GAS_TRAP        49
  2464. X#define SN_EXPLOSION_DEVICE    50
  2465. X#define SN_SUMMONING_RUNES    51
  2466. X#define SN_MULTIPLE_TRAPS    52
  2467. X#define SN_DISARMED        53
  2468. X#define SN_UNLOCKED        54
  2469. X#define SN_SLAY_ANIMAL        55
  2470. X#define SN_ARRAY_SIZE        56 /* must be at end of this list */
  2471. X
  2472. X/* defines for treasure type values (tval) */
  2473. X#define TV_NEVER    -1 /* used by find_range() for non-search */
  2474. X#define TV_NOTHING    0
  2475. X#define TV_MISC        1
  2476. X#define TV_CHEST    2
  2477. X/* min tval for wearable items, all items between TV_MIN_WEAR and TV_MAX_WEAR
  2478. X   use the same flag bits, see the TR_* defines */
  2479. X#define TV_MIN_WEAR    10
  2480. X/* items tested for enchantments, i.e. the MAGIK inscription, see the
  2481. X   enchanted() procedure */
  2482. X#define TV_MIN_ENCHANT    10
  2483. X#define TV_SLING_AMMO    10
  2484. X#define TV_BOLT        11
  2485. X#define TV_ARROW    12
  2486. X#define TV_SPIKE    13
  2487. X#define TV_LIGHT    15
  2488. X#define TV_BOW        20
  2489. X#define TV_HAFTED    21
  2490. X#define TV_POLEARM    22
  2491. X#define TV_SWORD    23
  2492. X#define TV_DIGGING    25
  2493. X#define TV_BOOTS    30
  2494. X#define TV_GLOVES    31
  2495. X#define TV_CLOAK    32
  2496. X#define TV_HELM        33
  2497. X#define TV_SHIELD    34
  2498. X#define TV_HARD_ARMOR    35
  2499. X#define TV_SOFT_ARMOR    36
  2500. X/* max tval that uses the TR_* flags */
  2501. X#define TV_MAX_ENCHANT    39
  2502. X#define TV_AMULET    40
  2503. X#define TV_RING        45
  2504. X/* max tval for wearable items */
  2505. X#define TV_MAX_WEAR    50
  2506. X#define TV_STAFF    55
  2507. X#define TV_WAND        65
  2508. X#define TV_SCROLL1    70
  2509. X#define TV_SCROLL2    71
  2510. X#define TV_POTION1    75
  2511. X#define TV_POTION2    76
  2512. X#define TV_FLASK    77
  2513. X#define TV_FOOD     80
  2514. X#define TV_MAGIC_BOOK    90
  2515. X#define TV_PRAYER_BOOK    91
  2516. X/* objects with tval above this are never picked up by monsters */
  2517. X#define TV_MAX_OBJECT    99
  2518. X#define TV_GOLD        100
  2519. X/* objects with higher tvals can not be picked up */
  2520. X#define TV_MAX_PICK_UP    100
  2521. X#define TV_INVIS_TRAP    101
  2522. X/* objects between TV_MIN_VISIBLE and TV_MAX_VISIBLE are always visible,
  2523. X   i.e. the cave fm flag is set when they are present */
  2524. X#define TV_MIN_VISIBLE    102
  2525. X#define TV_VIS_TRAP    102
  2526. X#define TV_RUBBLE    103
  2527. X/* following objects are never deleted when trying to create another one
  2528. X   during level generation */
  2529. X#define TV_MIN_DOORS    104
  2530. X#define TV_OPEN_DOOR    104
  2531. X#define TV_CLOSED_DOOR    105
  2532. X#define TV_UP_STAIR    107
  2533. X#define TV_DOWN_STAIR    108
  2534. X#define TV_SECRET_DOOR    109
  2535. X#define TV_STORE_DOOR    110
  2536. X#define TV_MAX_VISIBLE    110
  2537. X
  2538. X/* spell types used by get_flags(), breathe(), fire_bolt() and fire_ball() */
  2539. X#define GF_MAGIC_MISSILE 0
  2540. X#define GF_LIGHTNING    1
  2541. X#define GF_POISON_GAS    2
  2542. X#define GF_ACID        3
  2543. X#define GF_FROST    4
  2544. X#define GF_FIRE        5
  2545. X#define GF_HOLY_ORB    6
  2546. X
  2547. X/* Number of entries allowed in the scorefile.  */
  2548. X#define SCOREFILE_SIZE    1000
  2549. END_OF_FILE
  2550. if test 20967 -ne `wc -c <'source/constant.h'`; then
  2551.     echo shar: \"'source/constant.h'\" unpacked with wrong size!
  2552. fi
  2553. # end of 'source/constant.h'
  2554. fi
  2555. echo shar: End of archive 16 \(of 39\).
  2556. cp /dev/null ark16isdone
  2557. MISSING=""
  2558. 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
  2559.     if test ! -f ark${I}isdone ; then
  2560.     MISSING="${MISSING} ${I}"
  2561.     fi
  2562. done
  2563. if test "${MISSING}" = "" ; then
  2564.     echo You have unpacked all 39 archives.
  2565.     echo "Now run "bldfiles.sh" to build split files"
  2566.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2567. else
  2568.     echo You still need to unpack the following archives:
  2569.     echo "        " ${MISSING}
  2570. fi
  2571. ##  End of shell archive.
  2572. exit 0
  2573.