home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume16 / nethack31 / part83 < prev    next >
Internet Message Format  |  1993-02-06  |  59KB

  1. Path: uunet!news.tek.com!master!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v16i091:  nethack31 - display oriented dungeons & dragons (Ver. 3.1), Part83/108
  5. Message-ID: <4454@master.CNA.TEK.COM>
  6. Date: 5 Feb 93 19:21:38 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 2245
  9. Approved: billr@saab.CNA.TEK.COM
  10. Xref: uunet comp.sources.games:1642
  11.  
  12. Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller)
  13. Posting-number: Volume 16, Issue 91
  14. Archive-name: nethack31/Part83
  15. Supersedes: nethack3p9: Volume 10, Issue 46-102
  16. Environment: Amiga, Atari, Mac, MS-DOS, OS2, Unix, VMS, X11
  17.  
  18.  
  19.  
  20. #! /bin/sh
  21. # This is a shell archive.  Remove anything before this line, then unpack
  22. # it by saving it into a file and typing "sh file".  To overwrite existing
  23. # files, type "sh file -c".  You can also feed this as standard input via
  24. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  25. # will see the following message at the end:
  26. #        "End of archive 83 (of 108)."
  27. # Contents:  src/do_name.c src/mkobj.c sys/amiga/amirip.c
  28. # Wrapped by billr@saab on Wed Jan 27 16:09:20 1993
  29. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  30. if test -f 'src/do_name.c' -a "${1}" != "-c" ; then 
  31.   echo shar: Will not clobber existing file \"'src/do_name.c'\"
  32. else
  33. echo shar: Extracting \"'src/do_name.c'\" \(17999 characters\)
  34. sed "s/^X//" >'src/do_name.c' <<'END_OF_FILE'
  35. X/*    SCCS Id: @(#)do_name.c    3.1    92/12/29    */
  36. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  37. X/* NetHack may be freely redistributed.  See license for details. */
  38. X
  39. X#include "hack.h"
  40. X
  41. X#ifdef OVLB
  42. X
  43. Xstatic void FDECL(do_oname, (struct obj *));
  44. X
  45. Xvoid
  46. Xgetpos(cc,force,goal)
  47. Xcoord    *cc;
  48. Xboolean force;
  49. Xconst char *goal;
  50. X{
  51. X    register int cx, cy, i, c;
  52. X    int sidx, tx, ty;
  53. X    int lastc, lastx, lasty;
  54. X    const char *sdp = flags.num_pad ? ndir : sdir;
  55. X
  56. X    if(flags.verbose) pline("(For instructions type a ?)");
  57. X    cx = cc->x;
  58. X    cy = cc->y;
  59. X    lastc = -1;
  60. X    lastx = lasty = 0;
  61. X#ifdef CLIPPING
  62. X    cliparound(cx, cy);
  63. X#endif
  64. X    curs(WIN_MAP, cx,cy);
  65. X    flush_screen(0);
  66. X    while((c = nh_poskey(&tx, &ty, &sidx)) != '.') {
  67. X        if(c == '\033') {
  68. X            cc->x = -10;
  69. X        clear_nhwindow(WIN_MESSAGE);
  70. X            return;
  71. X        }
  72. X    if(c == 0) {
  73. X        /* a mouse click event, just assign and return */
  74. X        cx = tx;
  75. X        cy = ty;
  76. X        break;
  77. X    }
  78. X    for(i=0; i<8; i++)
  79. X        if (sdp[i] == c) {
  80. X        if (1 <= cx + xdir[i] && cx + xdir[i] < COLNO)
  81. X            cx += xdir[i];
  82. X        if (0 <= cy + ydir[i] && cy + ydir[i] < ROWNO)
  83. X            cy += ydir[i];
  84. X        goto nxtc;
  85. X        } else if (sdp[i] == lowc((char)c)) {
  86. X        cx += xdir[i]*8;
  87. X        cy += ydir[i]*8;
  88. X        if(cx < 1) cx = 1;
  89. X        if(cx > COLNO-1) cx = COLNO-1;
  90. X        if(cy < 0) cy = 0;
  91. X        if(cy > ROWNO-1) cy = ROWNO-1;
  92. X        goto nxtc;
  93. X        }
  94. X
  95. X    if(c == '?'){
  96. X        char sbuf[80];
  97. X        winid tmpwin = create_nhwindow(NHW_MENU);
  98. X        Sprintf(sbuf, "Use [%s] to move the cursor to %s.",
  99. X          flags.num_pad ? "2468" : "hjkl", goal);
  100. X        putstr(tmpwin, 0, sbuf);
  101. X        putstr(tmpwin, 0,
  102. X           "Use [HJKL] to move the cursor 8 units at a time.");
  103. X        putstr(tmpwin, 0, "Or enter a background symbol (ex. <).");
  104. X        putstr(tmpwin, 0, "Type a . when you are at the right place.");
  105. X        if(!force)
  106. X        putstr(tmpwin, 0, "Type Space or Escape when you're done.");
  107. X        putstr(tmpwin, 0, "");
  108. X        display_nhwindow(tmpwin, TRUE);
  109. X        destroy_nhwindow(tmpwin);
  110. X    } else {
  111. X        if (!index(quitchars, c)) {
  112. X        for(sidx = 1; sidx < sizeof(showsyms); sidx++)
  113. X            if(defsyms[sidx].sym == c) {
  114. X            /* sidx = cmap_to_glyph(sidx); */
  115. X            if(sidx != lastc) {
  116. X                lasty = 0;
  117. X                lastx = 1;
  118. X            }
  119. X            lastc = sidx;
  120. X            loopback:
  121. X            for (ty = lasty; ty < ROWNO; ty++) {
  122. X                for (tx = lastx; tx < COLNO; tx++) {
  123. X                if ((IS_POOL(levl[tx][ty].typ) ||
  124. X                     IS_FURNITURE(levl[tx][ty].typ)) &&
  125. X     defsyms[sidx].sym == defsyms[glyph_to_cmap(levl[tx][ty].glyph)].sym) {
  126. X                    cx = tx;
  127. X                    lastx = tx+1;
  128. X                    cy = ty;
  129. X                    lasty = ty;
  130. X                    goto nxtc;
  131. X                }
  132. X                }
  133. X                lastx = 1;
  134. X            }
  135. X            if(lasty != 0) {
  136. X                lasty = 0;
  137. X                lastx = 1;
  138. X                goto loopback;
  139. X            }
  140. X            pline("Can't find dungeon feature '%c'", c);
  141. X            goto nxtc;
  142. X            }
  143. X
  144. X        pline("Unknown direction: '%s' (%s).",
  145. X              visctrl((char)c),
  146. X              force ?
  147. X              flags.num_pad ? "use 2468 or ." :
  148. X              "use hjkl or ." :
  149. X              "aborted");
  150. X        }
  151. X        if(force) goto nxtc;
  152. X        pline("Done.");
  153. X        cc->x = -1;
  154. X        cc->y = 0;
  155. X        return;
  156. X    }
  157. X    nxtc:    ;
  158. X#ifdef CLIPPING
  159. X    cliparound(cx, cy);
  160. X#endif
  161. X    curs(WIN_MAP,cx,cy);
  162. X    flush_screen(0);
  163. X    }
  164. X    cc->x = cx;
  165. X    cc->y = cy;
  166. X    return;
  167. X}
  168. X
  169. Xstruct monst *
  170. Xchristen_monst(mtmp, name)
  171. Xstruct monst *mtmp;
  172. Xconst char *name;
  173. X{
  174. X    register int lth,i;
  175. X    register struct monst *mtmp2;
  176. X
  177. X    /* dogname and catname are 63-character arrays; the generic naming
  178. X     * function do_mname() below also cut names off at 63 characters */
  179. X    lth = strlen(name)+1;
  180. X    if(lth > 63){
  181. X        lth = 63;
  182. X    }
  183. X    mtmp2 = newmonst(mtmp->mxlth + lth);
  184. X    *mtmp2 = *mtmp;
  185. X    for(i=0; i<mtmp->mxlth; i++)
  186. X        ((char *) mtmp2->mextra)[i] = ((char *) mtmp->mextra)[i];
  187. X    mtmp2->mnamelth = lth;
  188. X    (void)strncpy(NAME(mtmp2), name, lth);
  189. X    NAME(mtmp2)[lth-1] = 0;
  190. X    replmon(mtmp,mtmp2);
  191. X    return(mtmp2);
  192. X}
  193. X
  194. Xint
  195. Xdo_mname()
  196. X{
  197. X    char buf[BUFSZ];
  198. X    coord cc;
  199. X    register int cx,cy;
  200. X    register struct monst *mtmp;
  201. X    register char *curr;
  202. X    boolean blank;
  203. X    char qbuf[QBUFSZ];
  204. X
  205. X    if (Hallucination) {
  206. X        You("would never recognize it anyway.");
  207. X        return 0;
  208. X    }
  209. X    cc.x = u.ux;
  210. X    cc.y = u.uy;
  211. X    getpos(&cc, FALSE, "the monster you want to name");
  212. X    cx = cc.x;
  213. X    cy = cc.y;
  214. X    if(cx < 0) return(0);
  215. X    if (cx == u.ux && cy == u.uy) {
  216. X        pline("This %s creature is called %s and cannot be renamed.",
  217. X        ACURR(A_CHA) > 14 ?
  218. X        (flags.female ? "beautiful" : "handsome") :
  219. X        "ugly",
  220. X        plname);
  221. X        return(0);
  222. X    }
  223. X    mtmp = m_at(cx, cy);
  224. X    if (!mtmp || (!sensemon(mtmp) &&
  225. X            (!cansee(cx,cy) || mtmp->mundetected
  226. X            || mtmp->m_ap_type == M_AP_FURNITURE
  227. X            || mtmp->m_ap_type == M_AP_OBJECT
  228. X            || (mtmp->minvis && !See_invisible)))) {
  229. X        pline("I see no monster there.");
  230. X        return(0);
  231. X    }
  232. X    Sprintf(qbuf, "What do you want to call %s?", x_monnam(mtmp, 0,
  233. X        (char *)0, 1));
  234. X    getlin(qbuf,buf);
  235. X    clear_nhwindow(WIN_MESSAGE);
  236. X    if(!*buf || *buf == '\033') return(0);
  237. X
  238. X    /* unnames monster if all spaces */
  239. X    for (curr = buf, blank = 1; *curr; blank = (*curr++ == ' '));
  240. X    if(blank) *buf = '\0';
  241. X
  242. X     if(type_is_pname(mtmp->data))
  243. X         pline("%s doesn't like being called names!", Monnam(mtmp));
  244. X    else (void) christen_monst(mtmp, buf);
  245. X    return(0);
  246. X}
  247. X
  248. X/*
  249. X * This routine changes the address of obj. Be careful not to call it
  250. X * when there might be pointers around in unknown places. For now: only
  251. X * when obj is in the inventory.
  252. X */
  253. Xstatic
  254. Xvoid
  255. Xdo_oname(obj)
  256. Xregister struct obj *obj;
  257. X{
  258. X    char buf[BUFSZ], qbuf[QBUFSZ];
  259. X    register char *curr;
  260. X
  261. X    Sprintf(qbuf, "What do you want to name %s?", doname(obj));
  262. X    getlin(qbuf, buf);
  263. X    clear_nhwindow(WIN_MESSAGE);
  264. X    if(!*buf || *buf == '\033')    return;
  265. X
  266. X    /* strip trailing spaces; unnames item if all spaces */
  267. X    for (curr = eos(buf); curr > buf; )
  268. X        if (*--curr == ' ') *curr = '\0'; else break;
  269. X
  270. X    if(obj->oartifact)
  271. X        pline("The artifact seems to resist the attempt.");
  272. X    else if (restrict_name(obj, buf) || exist_artifact(obj->otyp, buf)) {
  273. X        int n = rn2((int)strlen(buf));
  274. X        register char c1, c2;
  275. X
  276. X        c1 = lowc(buf[n]);
  277. X        do c2 = 'a' + rn2('z'-'a'); while (c1 == c2);
  278. X        buf[n] = (buf[n] == c1) ? c2 : highc(c2);  /* keep same case */
  279. X        pline("While engraving your %s slips.", body_part(HAND));
  280. X        display_nhwindow(WIN_MESSAGE, FALSE);
  281. X        You("engrave: \"%s\".",buf);
  282. X        (void)oname(obj, buf, 1);
  283. X    }
  284. X    else
  285. X        (void)oname(obj, buf, 1);
  286. X}
  287. X
  288. Xstruct obj *
  289. Xoname(obj, buf, ininv)
  290. Xregister struct obj *obj;
  291. Xconst char    *buf;
  292. Xregister int ininv;
  293. X{
  294. X    register struct obj *otmp, *otmp2;
  295. X    register int    lth;
  296. X
  297. X    lth = *buf ? strlen(buf)+1 : 0;
  298. X    if(lth > 63){
  299. X        lth = 63;
  300. X    }
  301. X    /* if already properly named */
  302. X    if(lth == obj->onamelth && (!lth || !strcmp(ONAME(obj),buf)))
  303. X        return obj;
  304. X
  305. X    /* If named artifact exists in the game, do not create another.
  306. X     * Also trying to create an artifact shouldn't de-artifact
  307. X     * it (e.g. Excalibur from prayer). In this case the object
  308. X     * will retain its current name. */
  309. X    if (obj->oartifact || exist_artifact(obj->otyp, buf))
  310. X        return obj;
  311. X
  312. X    otmp2 = newobj(lth);
  313. X    *otmp2 = *obj;    /* the cobj pointer is copied to otmp2 */
  314. X    otmp2->onamelth = lth;
  315. X    artifact_exists(otmp2, buf, TRUE);
  316. X
  317. X#ifdef __GNUC__
  318. X    /* Avoid an old compiler bug (always gave empty name otherwise). */
  319. X    if (buf) (void)donull();
  320. X#endif
  321. X    if(lth) {
  322. X        (void)strncpy(ONAME(otmp2), buf, lth);
  323. X        ONAME(otmp2)[lth-1] = 0;
  324. X    }
  325. X    if (obj->owornmask) {
  326. X        /* Note: dying by burning in Hell causes problems if you
  327. X         * try doing this when owornmask isn't set.
  328. X         */
  329. X        setworn((struct obj *)0, obj->owornmask);
  330. X        setworn(otmp2, otmp2->owornmask);
  331. X    }
  332. X
  333. X    if (ininv) {
  334. X        /* do freeinv(obj); etc. by hand in order to preserve
  335. X           the position of this object in the inventory */
  336. X        if(obj == invent) invent = otmp2;
  337. X        else for(otmp = invent; ; otmp = otmp->nobj){
  338. X            if(!otmp)
  339. X                panic("oname: cannot find obj.");
  340. X            if(otmp->nobj == obj){
  341. X                otmp->nobj = otmp2;
  342. X                break;
  343. X            }
  344. X        }
  345. X    }
  346. X    /* obfree(obj, otmp2);    /* now unnecessary: no pointers on bill */
  347. X    dealloc_obj(obj);    /* let us hope nobody else saved a pointer */
  348. X    return otmp2;
  349. X}
  350. X
  351. Xstatic const char NEARDATA callable[] = {
  352. X    SCROLL_CLASS, POTION_CLASS, WAND_CLASS, RING_CLASS, AMULET_CLASS,
  353. X    GEM_CLASS, SPBOOK_CLASS, ARMOR_CLASS, TOOL_CLASS, 0 };
  354. X
  355. Xint
  356. Xddocall()
  357. X{
  358. X    register struct obj *obj;
  359. X#ifdef REDO
  360. X    char    ch;
  361. X#endif
  362. X    char allow_all[2];
  363. X
  364. X    switch(
  365. X#ifdef REDO
  366. X        ch = 
  367. X#endif
  368. X        ynq("Name an individual object?")) {
  369. X    case 'q':
  370. X        break;
  371. X    case 'y':
  372. X#ifdef REDO
  373. X        savech(ch);
  374. X#endif
  375. X        allow_all[0] = ALL_CLASSES; allow_all[1] = '\0';
  376. X        obj = getobj(allow_all, "name");
  377. X        if(obj) do_oname(obj);
  378. X        break;
  379. X    default :
  380. X#ifdef REDO
  381. X        savech(ch);
  382. X#endif
  383. X        obj = getobj(callable, "call");
  384. X        if (obj) {
  385. X            if (!obj->dknown) {
  386. X                You("would never recognize another one.");
  387. X                return 0;
  388. X            }
  389. X            docall(obj);
  390. X        }
  391. X        break;
  392. X    }
  393. X    return 0;
  394. X}
  395. X
  396. Xvoid
  397. Xdocall(obj)
  398. Xregister struct obj *obj;
  399. X{
  400. X    char buf[BUFSZ], qbuf[QBUFSZ];
  401. X    struct obj otemp;
  402. X    register char **str1;
  403. X    register char *str;
  404. X    boolean blank;
  405. X
  406. X    if (!obj->dknown) return; /* probably blind */
  407. X    otemp = *obj;
  408. X    otemp.quan = 1L;
  409. X    otemp.onamelth = 0;
  410. X    if (objects[otemp.otyp].oc_class == POTION_CLASS && otemp.corpsenm) {
  411. X        /* kludge, meaning it's sink water */
  412. X        Sprintf(qbuf,"Call a stream of %s fluid:",
  413. X                OBJ_DESCR(objects[otemp.otyp]));
  414. X    } else
  415. X        Sprintf(qbuf, "Call %s:", an(xname(&otemp)));
  416. X    getlin(qbuf, buf);
  417. X    clear_nhwindow(WIN_MESSAGE);
  418. X    if(!*buf || *buf == '\033')
  419. X        return;
  420. X
  421. X    /* clear old name */
  422. X    str1 = &(objects[obj->otyp].oc_uname);
  423. X    if(*str1) free((genericptr_t)*str1);
  424. X
  425. X    /* uncalls item if all spaces */
  426. X    for (str = buf, blank = 1; *str; blank = (*str++ == ' '));
  427. X    if(blank) *buf = '\0';
  428. X    if (!*buf) {
  429. X        if (*str1)    /* had name, so possibly remove from disco[] */
  430. X            undiscover_object(obj->otyp),  *str1 = NULL;
  431. X    } else {
  432. X        *str1 = strcpy((char *) alloc((unsigned)strlen(buf)+1), buf);
  433. X        discover_object(obj->otyp, FALSE); /* possibly add to disco[] */
  434. X    }
  435. X}
  436. X
  437. X#endif /*OVLB*/
  438. X#ifdef OVL0
  439. X
  440. Xstatic const char *ghostnames[] = {
  441. X    /* these names should have length < PL_NSIZ */
  442. X    /* Capitalize the names for aesthetics -dgk */
  443. X    "Adri", "Andries", "Andreas", "Bert", "David", "Dirk", "Emile",
  444. X    "Frans", "Fred", "Greg", "Hether", "Jay", "John", "Jon", "Karnov",
  445. X    "Kay", "Kenny", "Kevin", "Maud", "Michiel", "Mike", "Peter", "Robert",
  446. X    "Ron", "Tom", "Wilmar", "Nick Danger", "Phoenix", "Jiro", "Mizue",
  447. X    "Stephan", "Lance Braccus", "Shadowhawk"
  448. X};
  449. X
  450. X/* Monster naming functions:
  451. X * x_monnam is the generic monster-naming function.
  452. X * mon_nam: the rust monster  it  the invisible orc  Fido
  453. X * l_monnam:  rust monster    it  invisible orc      dog called fido
  454. X * Monnam:    The rust monster    It  The invisible orc  Fido
  455. X * Adjmonnam: The poor rust monster  It   The poor invisible orc  The poor Fido
  456. X * Amonnam:   A rust monster      It  An invisible orc   Fido
  457. X * a_monnam:  a rust monster      it  an invisible orc   Fido
  458. X */
  459. X
  460. Xchar *
  461. Xx_monnam(mtmp, article, adjective, called)
  462. Xregister struct monst *mtmp;
  463. X/* Articles:
  464. X * 0: "the" in front of everything except names and "it"
  465. X * 1: "the" in front of everything except "it"; looks bad for names unless you
  466. X *    are also using an adjective.
  467. X * 2: "a" in front of everything except "it".
  468. X * 3: no article at all.
  469. X */
  470. Xint article, called;
  471. Xconst char *adjective;
  472. X{
  473. X#ifdef LINT    /* static char buf[BUFSZ]; */
  474. X    char buf[BUFSZ];
  475. X#else
  476. X    static char buf[BUFSZ];
  477. X#endif
  478. X    char *name = (mtmp->mnamelth && !Hallucination && !mtmp->isshk) ?
  479. X                              NAME(mtmp) : 0;
  480. X    int force_the = (!Hallucination && mtmp->data ==
  481. X        &mons[PM_WIZARD_OF_YENDOR]);
  482. X
  483. X    buf[0] = '\0';
  484. X    if(mtmp->ispriest || mtmp->isminion) {
  485. X        name = priestname(mtmp);
  486. X        if (article == 3 && !strncmp(name, "the ", 4)) name += 4;
  487. X        return name;
  488. X    }
  489. X    if(!canseemon(mtmp) && !sensemon(mtmp) &&
  490. X                    !(u.uswallow && mtmp == u.ustuck)) {
  491. X        if(!mtmp->wormno || (mtmp != m_at(bhitpos.x, bhitpos.y)) ||
  492. X           !(cansee(bhitpos.x, bhitpos.y) && mon_visible(mtmp))) {
  493. X        Strcpy(buf, "it");
  494. X        return (buf);
  495. X        }
  496. X    }
  497. X    if (mtmp->isshk) {
  498. X        Strcpy(buf, shkname(mtmp));
  499. X        if (mtmp->data == &mons[PM_SHOPKEEPER] && !mtmp->minvis)
  500. X            return(buf);
  501. X        /* For normal shopkeepers, just 'Asidonhopo'.
  502. X         * For unusual ones, 'Asidonhopo the invisible shopkeeper'
  503. X         * or 'Asidonhopo the blue dragon'.
  504. X         */
  505. X        Strcat(buf, " ");
  506. X    }
  507. X    if (force_the ||
  508. X           ((article == 1 || ((!name || called) && article == 0)) &&
  509. X           (Hallucination || !type_is_pname(mtmp->data))))
  510. X        Strcat(buf, "the ");
  511. X    if (adjective) {
  512. X        Strcat(buf, adjective);
  513. X        Strcat(buf, " ");
  514. X    }
  515. X    if (mtmp->minvis)
  516. X        Strcat(buf, "invisible ");
  517. X    if (name && !called) {
  518. X        Strcat(buf, name);
  519. X        goto bot_nam;
  520. X    }
  521. X    if (mtmp->data == &mons[PM_GHOST] && !Hallucination) {
  522. X        register const char *gn = (const char *) mtmp->mextra;
  523. X        if(!*gn) {        /* might also look in scorefile */
  524. X            gn = ghostnames[rn2(SIZE(ghostnames))];
  525. X            Strcpy((char *) mtmp->mextra, !rn2(5) ? 
  526. X                               (const char *)plname : gn);
  527. X        }
  528. X        Sprintf(buf, "%s ghost", s_suffix((char *) mtmp->mextra));
  529. X    } else {
  530. X            if(Hallucination)
  531. X            Strcat(buf, rndmonnam());
  532. X        else {
  533. X            if(is_mplayer(mtmp->data) && !In_endgame(&u.uz)) { 
  534. X                char pbuf[BUFSZ];
  535. X                    Strcpy(pbuf, rank_of((unsigned)mtmp->m_lev,
  536. X                                      highc(mtmp->data->mname[0]), 
  537. X                                  (boolean)mtmp->female));
  538. X            Strcat(buf, lcase(pbuf));
  539. X            } else
  540. X                Strcat(buf, mtmp->data->mname);
  541. X        }
  542. X    }
  543. X    if(name) {
  544. X        Strcat(buf, " called ");
  545. X        Strcat(buf, NAME(mtmp));
  546. X    }
  547. Xbot_nam:
  548. X    if (article == 2 && !force_the && (!name || called) &&
  549. X        (Hallucination || !type_is_pname(mtmp->data)))
  550. X        return an(buf);
  551. X    else
  552. X        return(buf);
  553. X}
  554. X
  555. X#endif /* OVL0 */
  556. X#ifdef OVLB
  557. X
  558. Xchar *
  559. Xl_monnam(mtmp)
  560. Xregister struct monst *mtmp;
  561. X{
  562. X    return(x_monnam(mtmp, 3, (char *)0, 1));
  563. X}
  564. X
  565. X#endif /* OVLB */
  566. X#ifdef OVL0
  567. X
  568. Xchar *
  569. Xmon_nam(mtmp)
  570. Xregister struct monst *mtmp;
  571. X{
  572. X    return(x_monnam(mtmp, 0, (char *)0, 0));
  573. X}
  574. X
  575. Xchar *
  576. XMonnam(mtmp)
  577. Xregister struct monst *mtmp;
  578. X{
  579. X    register char *bp = mon_nam(mtmp);
  580. X
  581. X    *bp = highc(*bp);
  582. X    return(bp);
  583. X}
  584. X
  585. X#endif /* OVL0 */
  586. X#ifdef OVLB
  587. X
  588. Xchar *
  589. XAdjmonnam(mtmp, adj)
  590. Xregister struct monst *mtmp;
  591. Xregister const char *adj;
  592. X{
  593. X    register char *bp = x_monnam(mtmp,1,adj,0);
  594. X
  595. X    *bp = highc(*bp);
  596. X    return(bp);
  597. X}
  598. X
  599. Xchar *
  600. Xa_monnam(mtmp)
  601. Xregister struct monst *mtmp;
  602. X{
  603. X    return x_monnam(mtmp, 2, (char *)0, 0);
  604. X}
  605. X
  606. Xchar *
  607. XAmonnam(mtmp)
  608. Xregister struct monst *mtmp;
  609. X{
  610. X    register char *bp = a_monnam(mtmp);
  611. X
  612. X    *bp = highc(*bp);
  613. X    return(bp);
  614. X}
  615. X
  616. Xstatic const char NEARDATA *bogusmons[] = {
  617. X    "jumbo shrimp", "giant pigmy", "gnu", "killer penguin", 
  618. X    "giant cockroach", "giant slug", "maggot", "pterodactyl",
  619. X    "tyrannosaurus rex", "basilisk", "beholder", "nightmare",
  620. X    "efreeti", "marid", "rot grub", "bookworm", "doppelganger",
  621. X    "shadow", "hologram", "jester", "attorney", "sleazoid",
  622. X    "killer tomato", "amazon", "robot", "battlemech",
  623. X    "rhinovirus", "harpy", "lion-dog", "rat-ant",
  624. X                        /* misc. */
  625. X    "grue", "Christmas-tree monster", "luck sucker", "paskald",
  626. X    "brogmoid", "dornbeast",        /* Quendor (Zork, &c.) */
  627. X    "Ancient Multi-Hued Dragon", "Evil Iggy",
  628. X                        /* Moria */
  629. X    "emu", "kestrel", "xeroc", "venus flytrap",
  630. X                        /* Rogue */
  631. X    "creeping coins",            /* Wizardry */
  632. X    "hydra", "siren",            /* Greek legend */
  633. X    "killer bunny",                /* Monty Python */
  634. X    "rodent of unusual size",        /* The Princess Bride */
  635. X    "Smokey the bear",    /* "Only you can prevent forest fires!" */
  636. X    "Luggage",                /* Discworld */
  637. X    "Ent",                     /* Lord of the Rings */
  638. X    "tangle tree", "nickelpede", "wiggle",    /* Xanth */
  639. X    "white rabbit", "snark",        /* Lewis Carroll */
  640. X    "pushmi-pullyu",            /* Dr. Doolittle */
  641. X    "smurf",                /* The Smurfs */
  642. X    "tribble", "Klingon", "Borg",        /* Star Trek */
  643. X    "Ewok",                 /* Star Wars */
  644. X    "Totoro",                /* Tonari no Totoro */
  645. X    "ohmu",                 /* Nausicaa */
  646. X    "Godzilla", "King Kong",        /* monster movies */
  647. X    "earthquake beast",            /* old L of SH */
  648. X    "Invid",                /* Robotech */
  649. X    "Terminator",                /* The Terminator */
  650. X    "boomer",                /* Bubblegum Crisis */
  651. X    "Dalek",                /* Dr. Who ("Exterminate!") */
  652. X    "microscopic space fleet", "Ravenous Bugblatter Beast of Traal",
  653. X                        /* HGttG */
  654. X    "teenage mutant ninja turtle",        /* TMNT */
  655. X    "samurai rabbit",            /* Usagi Yojimbo */
  656. X    "aardvark",                /* Cerebus */
  657. X    "Audrey II",                /* Little Shop of Horrors */
  658. X    "witch doctor", "one-eyed one-horned flying purple people eater"
  659. X                        /* 50's rock 'n' roll */
  660. X};
  661. X
  662. Xconst char *
  663. Xrndmonnam() {  /* Random name of monster type, if hallucinating */
  664. X    int name;
  665. X
  666. X    do {
  667. X        name = rn2(PM_ARCHEOLOGIST + SIZE(bogusmons));
  668. X        /* archeologist: 1 past last valid monster */
  669. X    } while(name < PM_ARCHEOLOGIST &&
  670. X        (type_is_pname(&mons[name]) || (mons[name].geno & G_NOGEN)));
  671. X    if (name >= PM_ARCHEOLOGIST) return bogusmons[name-PM_ARCHEOLOGIST];
  672. X    return(mons[name].mname);
  673. X}
  674. X
  675. X#ifdef OVL2
  676. X
  677. Xstatic const char NEARDATA *hcolors[] = {
  678. X    "ultraviolet", "infrared", "bluish-orange",
  679. X    "reddish-green", "dark white", "light black", "sky blue-pink",
  680. X    "salty", "sweet", "sour", "bitter",
  681. X    "striped", "spiral", "swirly", "plaid", "checkered", "argyle",
  682. X    "paisley", "blotchy", "guernsey-spotted", "polka-dotted",
  683. X    "square", "round", "triangular",
  684. X    "cabernet", "sangria", "fuchsia", "wisteria",
  685. X    "lemon-lime", "strawberry-banana", "peppermint",
  686. X    "romantic", "incandescent"
  687. X};
  688. X
  689. Xconst char *
  690. Xhcolor()
  691. X{
  692. X    return hcolors[rn2(SIZE(hcolors))];
  693. X}
  694. X#endif /* OVL2 */
  695. X
  696. Xconst char *pronoun_pairs[][2] = {
  697. X    {"him", "her"}, {"Him", "Her"}, {"his", "her"}, {"His", "Her"},
  698. X    {"he", "she"}, {"He", "She"},
  699. X    {0, 0}
  700. X};
  701. X
  702. Xchar *
  703. Xself_pronoun(str, pronoun)
  704. Xconst char *str;
  705. Xconst char *pronoun;
  706. X{
  707. X    static char NEARDATA buf[BUFSZ];
  708. X    register int i;
  709. X
  710. X    for(i=0; pronoun_pairs[i][0]; i++) {
  711. X        if(!strncmp(pronoun, pronoun_pairs[i][0], 3)) {
  712. X            Sprintf(buf, str, pronoun_pairs[i][flags.female]);
  713. X            return buf;
  714. X        }
  715. X    }
  716. X    impossible("never heard of pronoun %s?", pronoun);
  717. X    Sprintf(buf, str, pronoun_pairs[i][0]);
  718. X    return buf;
  719. X}
  720. X
  721. X#ifdef REINCARNATION
  722. Xconst char *
  723. Xroguename() /* Name of a Rogue player */
  724. X{
  725. X    char *i, *opts;
  726. X
  727. X    if(opts = getenv("ROGUEOPTS")) {
  728. X        for(i=opts; *i; i++)
  729. X            if (!strncmp("name=",i,5)) {
  730. X                char *j;
  731. X                if (j=index(i+5,','))
  732. X                    *j = (char)0;
  733. X                return i+5;
  734. X            }
  735. X    }
  736. X    return rn2(3) ? (rn2(2) ? "Michael Toy" : "Kenneth Arnold")
  737. X        : "Glenn Wichman";
  738. X}
  739. X#endif
  740. X
  741. X#endif /* OVLB */
  742. X
  743. X/*do_name.c*/
  744. END_OF_FILE
  745. if test 17999 -ne `wc -c <'src/do_name.c'`; then
  746.     echo shar: \"'src/do_name.c'\" unpacked with wrong size!
  747. fi
  748. # end of 'src/do_name.c'
  749. fi
  750. if test -f 'src/mkobj.c' -a "${1}" != "-c" ; then 
  751.   echo shar: Will not clobber existing file \"'src/mkobj.c'\"
  752. else
  753. echo shar: Extracting \"'src/mkobj.c'\" \(18051 characters\)
  754. sed "s/^X//" >'src/mkobj.c' <<'END_OF_FILE'
  755. X/*    SCCS Id: @(#)mkobj.c    3.1    93/01/17    */
  756. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  757. X/* NetHack may be freely redistributed.  See license for details. */
  758. X
  759. X#include "hack.h"
  760. X#include "artifact.h"
  761. X#include "prop.h"
  762. X
  763. XSTATIC_DCL void FDECL(mkbox_cnts,(struct obj *));
  764. X
  765. Xstruct icp {
  766. X    int  iprob; /* probability of an item type */
  767. X    char ilet;    /* item class */
  768. X};
  769. X
  770. X#ifdef OVL1
  771. X
  772. Xconst struct icp mkobjprobs[] = {
  773. X{10, WEAPON_CLASS},
  774. X{10, ARMOR_CLASS},
  775. X{20, FOOD_CLASS},
  776. X{ 8, TOOL_CLASS},
  777. X{ 8, GEM_CLASS},
  778. X{16, POTION_CLASS},
  779. X{16, SCROLL_CLASS},
  780. X{ 4, SPBOOK_CLASS},
  781. X{ 4, WAND_CLASS},
  782. X{ 3, RING_CLASS},
  783. X{ 1, AMULET_CLASS}
  784. X};
  785. X
  786. Xconst struct icp boxiprobs[] = {
  787. X{18, GEM_CLASS},
  788. X{15, FOOD_CLASS},
  789. X{18, POTION_CLASS},
  790. X{18, SCROLL_CLASS},
  791. X{12, SPBOOK_CLASS},
  792. X{ 7, GOLD_CLASS},
  793. X{ 6, WAND_CLASS},
  794. X{ 5, RING_CLASS},
  795. X{ 1, AMULET_CLASS}
  796. X};
  797. X
  798. X#ifdef REINCARNATION
  799. Xconst struct icp rogueprobs[] = {
  800. X{12, WEAPON_CLASS},
  801. X{12, ARMOR_CLASS},
  802. X{22, FOOD_CLASS},
  803. X{22, POTION_CLASS},
  804. X{22, SCROLL_CLASS},
  805. X{ 5, WAND_CLASS},
  806. X{ 5, RING_CLASS}
  807. X};
  808. X#endif
  809. X
  810. Xconst struct icp hellprobs[] = {
  811. X{20, WEAPON_CLASS},
  812. X{20, ARMOR_CLASS},
  813. X{16, FOOD_CLASS},
  814. X{12, TOOL_CLASS},
  815. X{10, GEM_CLASS},
  816. X{ 1, POTION_CLASS},
  817. X{ 1, SCROLL_CLASS},
  818. X{ 8, WAND_CLASS},
  819. X{ 8, RING_CLASS},
  820. X{ 4, AMULET_CLASS}
  821. X};
  822. X
  823. Xstatic int NEARDATA mksx=0, NEARDATA mksy=0;
  824. X
  825. Xstruct obj *
  826. Xmkobj_at(let,x,y, artif)
  827. Xchar let;
  828. Xint x,y;
  829. Xboolean artif;
  830. X{
  831. X    register struct obj *otmp;
  832. X
  833. X    mksx = x; mksy = y;
  834. X    /* We need to know the X, Y coordinates while creating the object,
  835. X     * to insure shop boxes are empty.
  836. X     * Yes, this is a horrible kludge...
  837. X     */
  838. X    otmp = mkobj(let,artif);
  839. X    otmp->nobj = fobj;
  840. X    fobj = otmp;
  841. X    place_object(otmp, x, y);
  842. X    mksx = mksy = 0;
  843. X    return(otmp);
  844. X}
  845. X
  846. Xstruct obj *
  847. Xmksobj_at(otyp,x,y,init)
  848. Xint otyp,x,y;
  849. Xboolean init;
  850. X{
  851. X    register struct obj *otmp;
  852. X
  853. X    mksx = x; mksy = y;
  854. X    otmp = mksobj(otyp,init,TRUE);
  855. X    otmp->nobj = fobj;
  856. X    place_object(otmp, x, y);
  857. X    mksx = mksy = 0;
  858. X    return((fobj = otmp));
  859. X}
  860. X
  861. Xstruct obj *
  862. Xmkobj(let, artif)
  863. Xchar let;
  864. Xboolean artif;
  865. X{
  866. X    register int tprob, i, prob = rnd(1000);
  867. X
  868. X    if(let == RANDOM_CLASS) {
  869. X        const struct icp *iprobs =
  870. X#ifdef REINCARNATION
  871. X                    (Is_rogue_level(&u.uz)) ?
  872. X                    (const struct icp *)rogueprobs :
  873. X#endif
  874. X                    Inhell ? (const struct icp *)hellprobs :
  875. X                    (const struct icp *)mkobjprobs;
  876. X
  877. X        for(tprob = rnd(100);
  878. X            (tprob -= iprobs->iprob) > 0;
  879. X            iprobs++);
  880. X        let = iprobs->ilet;
  881. X    }
  882. X
  883. X    i = bases[letindex(let)];
  884. X    while((prob -= objects[i].oc_prob) > 0) i++;
  885. X
  886. X    if(objects[i].oc_class != let || !OBJ_NAME(objects[i]))
  887. X        panic("probtype error, let=%c i=%d", let, i);
  888. X
  889. X    return(mksobj(i, TRUE, artif));
  890. X}
  891. X
  892. XSTATIC_OVL void
  893. Xmkbox_cnts(box)
  894. X/* Note: does not check to see if it overloaded the box capacity; usually
  895. X * possible only with corpses in ice boxes.
  896. X */
  897. Xstruct obj *box;
  898. X{
  899. X    register int n;
  900. X    register struct obj *otmp, *gold = 0;
  901. X
  902. X    box->cobj = (struct obj *) 0;
  903. X
  904. X    switch(box->otyp) {
  905. X        case ICE_BOX:        n = 20; break;
  906. X        case CHEST:        n = 5; break;
  907. X        case LARGE_BOX:        n = 3; break;
  908. X        case SACK:
  909. X        case OILSKIN_SACK:
  910. X        case BAG_OF_HOLDING:    n = 1; break;
  911. X        default:        n = 0; break;
  912. X    }
  913. X
  914. X    for (n = rn2(n+1); n > 0; n--) {
  915. X        if (box->otyp == ICE_BOX) {
  916. X        if (!(otmp = mksobj(CORPSE, TRUE, TRUE))) continue;
  917. X        /* Note: setting age to 0 is correct.  Age has a different
  918. X         * from usual meaning for objects stored in ice boxes. -KAA
  919. X         */
  920. X        otmp->age = 0L;
  921. X        } else {
  922. X        register int tprob;
  923. X        const struct icp *iprobs = boxiprobs;
  924. X
  925. X        for (tprob = rnd(100); (tprob -= iprobs->iprob) > 0; iprobs++)
  926. X            ;
  927. X        if (!(otmp = mkobj(iprobs->ilet, TRUE))) continue;
  928. X
  929. X        /* handle a couple of special cases */
  930. X        if (otmp->otyp == GOLD_PIECE) {
  931. X            /* 2.5 x level's usual amount; weight adjusted below */
  932. X            otmp->quan = (long)(rnd(level_difficulty()+2) * rnd(75));
  933. X            if (gold) {            /* gold already in this box */
  934. X            gold->quan += otmp->quan;    /* merge */
  935. X            dealloc_obj(otmp);    /* note: not yet in any chain */
  936. X            continue;
  937. X            } else {
  938. X            gold = otmp;        /* remember this object */
  939. X            }
  940. X        } else while (otmp->otyp == ROCK) {
  941. X            otmp->otyp = rnd_class(DILITHIUM_CRYSTAL, LOADSTONE);
  942. X            if (otmp->quan > 2L) otmp->quan = 1L;
  943. X            otmp->owt = weight(otmp);
  944. X        }
  945. X        if (box->otyp == BAG_OF_HOLDING) {
  946. X            if (Is_mbag(otmp)) {
  947. X            otmp->otyp = SACK;
  948. X            otmp->spe = 0;
  949. X            otmp->owt = weight(otmp);
  950. X            } else while (otmp->otyp == WAN_CANCELLATION)
  951. X                otmp->otyp = rnd_class(WAN_LIGHT, WAN_LIGHTNING);
  952. X        }
  953. X        }
  954. X        otmp->nobj = box->cobj;
  955. X        box->cobj = otmp;
  956. X    }
  957. X    if (gold) gold->owt = weight(gold);    /* quantity was diddled */
  958. X    return;
  959. X}
  960. X
  961. Xint
  962. Xrndmonnum()    /* select a random, common monster type */
  963. X{
  964. X    register struct permonst *ptr;
  965. X    register int    i;
  966. X
  967. X    /* Plan A: get a level-appropriate common monster */
  968. X    ptr = rndmonst();
  969. X    if (ptr) return(monsndx(ptr));
  970. X
  971. X    /* Plan B: get any common monster */
  972. X    do {
  973. X        ptr = &mons[(i = rn2(NUMMONS))];
  974. X    } while((ptr->geno & G_NOGEN) || (!Inhell && (ptr->geno & G_HELL)));
  975. X
  976. X    return(i);
  977. X}
  978. X
  979. X#endif /* OVL1 */
  980. X#ifdef OVLB
  981. Xconst char dknowns[] = { WAND_CLASS, RING_CLASS, POTION_CLASS, SCROLL_CLASS,
  982. X             GEM_CLASS, SPBOOK_CLASS, WEAPON_CLASS, 0};
  983. X
  984. X/*ARGSUSED*/
  985. Xstruct obj *
  986. Xmksobj(otyp, init, artif)
  987. Xint otyp;
  988. Xboolean init;
  989. Xboolean artif;
  990. X{
  991. X    int tryct;
  992. X    struct obj *otmp;
  993. X    char let = objects[otyp].oc_class;
  994. X
  995. X    otmp = newobj(0);
  996. X    *otmp = zeroobj;
  997. X    otmp->age = monstermoves;
  998. X    otmp->o_id = flags.ident++;
  999. X    otmp->quan = 1L;
  1000. X    otmp->oclass = let;
  1001. X    otmp->otyp = otyp;
  1002. X    otmp->dknown = index(dknowns, let) ? 0 : 1;
  1003. X    if (!objects[otmp->otyp].oc_uses_known)
  1004. X        otmp->known = 1;
  1005. X    if (init) switch (let) {
  1006. X    case WEAPON_CLASS:
  1007. X        otmp->quan = (otmp->otyp <= SHURIKEN) ? (long) rn1(6,6) : 1L;
  1008. X        if(!rn2(11)) {
  1009. X            otmp->spe = rne(3);
  1010. X            otmp->blessed = rn2(2);
  1011. X        } else if(!rn2(10)) {
  1012. X            curse(otmp);
  1013. X            otmp->spe = -rne(3);
  1014. X        } else    blessorcurse(otmp, 10);
  1015. X
  1016. X        if (artif && !rn2(20))
  1017. X            otmp = mk_artifact(otmp, (aligntyp)A_NONE);
  1018. X        break;
  1019. X    case FOOD_CLASS:
  1020. X        otmp->oeaten = 0;
  1021. X        switch(otmp->otyp) {
  1022. X        case CORPSE:
  1023. X            /* overridden by mkcorpstat() */
  1024. X            do otmp->corpsenm = rndmonnum();
  1025. X            while (mons[otmp->corpsenm].geno & G_NOCORPSE);
  1026. X            break;
  1027. X        case EGG:
  1028. X            if(!rn2(3)) {        /* "live" eggs */
  1029. X            register struct permonst *ptr;
  1030. X            for(tryct = 0;
  1031. X                (!(ptr = rndmonst()) ||
  1032. X                (!lays_eggs(ptr) && ptr != &mons[PM_KILLER_BEE])) &&
  1033. X                tryct < 100;
  1034. X                tryct++);
  1035. X            if(tryct < 100)    otmp->corpsenm = monsndx(ptr);
  1036. X            else        otmp->corpsenm = -1; /* empty */
  1037. X            } else        otmp->corpsenm = -1; /* empty */
  1038. X            break;
  1039. X        case TIN:
  1040. X            if(!rn2(6)) {
  1041. X            otmp->spe = 1;        /* spinach */
  1042. X            otmp->corpsenm = -1;
  1043. X            } else do {
  1044. X            otmp->corpsenm = rndmonnum();
  1045. X            } while (mons[otmp->corpsenm].geno & G_NOCORPSE);
  1046. X            blessorcurse(otmp, 10);
  1047. X            break;
  1048. X#ifdef TUTTI_FRUTTI
  1049. X        case SLIME_MOLD:
  1050. X            otmp->spe = current_fruit;
  1051. X            break;
  1052. X#endif
  1053. X        }
  1054. X        if (otmp->otyp == CORPSE) break;
  1055. X        /* fall into next case */
  1056. X
  1057. X    case GEM_CLASS:
  1058. X        if (otmp->otyp == LOADSTONE) curse(otmp);
  1059. X        else if (otmp->otyp == ROCK) otmp->quan = (long) rn1(6,6);
  1060. X        else if (otmp->otyp != LUCKSTONE && !rn2(6)) otmp->quan = 2L;
  1061. X        else otmp->quan = 1L;
  1062. X        break;
  1063. X    case TOOL_CLASS:
  1064. X        switch(otmp->otyp) {
  1065. X        case TALLOW_CANDLE:
  1066. X        case WAX_CANDLE:    otmp->spe = 1;
  1067. X                    otmp->age = 20L * /* 400 or 200 */
  1068. X                          (long)objects[otmp->otyp].oc_cost;
  1069. X                    otmp->lamplit = 0;
  1070. X                    otmp->quan = 1L +
  1071. X                          (long)(rn2(2) ? rn2(7) : 0);
  1072. X                    blessorcurse(otmp, 5);
  1073. X                    break;
  1074. X        case BRASS_LANTERN:
  1075. X        case OIL_LAMP:        otmp->spe = 1;
  1076. X                    otmp->age = (long) rn1(500,1000);
  1077. X                    otmp->lamplit = 0;
  1078. X                    blessorcurse(otmp, 5);
  1079. X                    break;
  1080. X        case MAGIC_LAMP:    otmp->spe = 1;
  1081. X                    otmp->lamplit = 0;
  1082. X                    blessorcurse(otmp, 2);
  1083. X                    break;
  1084. X        case CHEST:
  1085. X        case LARGE_BOX:        otmp->olocked = !!(rn2(5));
  1086. X                    otmp->otrapped = !(rn2(10));
  1087. X        case ICE_BOX:
  1088. X        case SACK:
  1089. X        case OILSKIN_SACK:
  1090. X        case BAG_OF_HOLDING:    mkbox_cnts(otmp);
  1091. X                    break;
  1092. X        case MAGIC_MARKER:    otmp->spe = rn1(70,30);
  1093. X                    break;
  1094. X        case CAN_OF_GREASE:    otmp->spe = rnd(25);
  1095. X                    blessorcurse(otmp, 10);
  1096. X                    break;
  1097. X        case CRYSTAL_BALL:    otmp->spe = rnd(5);
  1098. X                    blessorcurse(otmp, 2);
  1099. X                    break;
  1100. X        case HORN_OF_PLENTY:
  1101. X        case BAG_OF_TRICKS:    otmp->spe = rnd(20);
  1102. X                    break;
  1103. X        case FIGURINE:    {    int tryct2 = 0;
  1104. X                    do
  1105. X                        otmp->corpsenm = rndmonnum();
  1106. X                    while(is_human(&mons[otmp->corpsenm])
  1107. X                        && tryct2++ < 30);
  1108. X                    blessorcurse(otmp, 4);
  1109. X                    break;
  1110. X                }
  1111. X        case BELL_OF_OPENING:   otmp->spe = 3;
  1112. X                    break;
  1113. X        case MAGIC_FLUTE:
  1114. X        case MAGIC_HARP:
  1115. X        case FROST_HORN:
  1116. X        case FIRE_HORN:
  1117. X        case DRUM_OF_EARTHQUAKE:
  1118. X                    otmp->spe = rn1(5,4);
  1119. X                    break;
  1120. X        }
  1121. X        break;
  1122. X    case AMULET_CLASS:
  1123. X        if(rn2(10) && (otmp->otyp == AMULET_OF_STRANGULATION ||
  1124. X           otmp->otyp == AMULET_OF_CHANGE ||
  1125. X           otmp->otyp == AMULET_OF_RESTFUL_SLEEP)) {
  1126. X            curse(otmp);
  1127. X        } else    blessorcurse(otmp, 10);
  1128. X    case VENOM_CLASS:
  1129. X    case CHAIN_CLASS:
  1130. X    case BALL_CLASS:
  1131. X        break;
  1132. X    case POTION_CLASS:
  1133. X    case SCROLL_CLASS:
  1134. X#ifdef MAIL
  1135. X        if (otmp->otyp != SCR_MAIL)
  1136. X#endif
  1137. X            blessorcurse(otmp, 4);
  1138. X        break;
  1139. X    case SPBOOK_CLASS:
  1140. X        blessorcurse(otmp, 17);
  1141. X        break;
  1142. X    case ARMOR_CLASS:
  1143. X        if(rn2(10) && (otmp->otyp == FUMBLE_BOOTS ||
  1144. X           otmp->otyp == LEVITATION_BOOTS ||
  1145. X           otmp->otyp == HELM_OF_OPPOSITE_ALIGNMENT ||
  1146. X           otmp->otyp == GAUNTLETS_OF_FUMBLING ||
  1147. X           !rn2(11))) {
  1148. X            curse(otmp);
  1149. X            otmp->spe = -rne(3);
  1150. X        } else if(!rn2(10)) {
  1151. X            otmp->blessed = rn2(2);
  1152. X            otmp->spe = rne(3);
  1153. X        } else    blessorcurse(otmp, 10);
  1154. X        break;
  1155. X    case WAND_CLASS:
  1156. X        if(otmp->otyp == WAN_WISHING) otmp->spe = rnd(3); else
  1157. X        otmp->spe = rn1(5,
  1158. X            (objects[otmp->otyp].oc_dir == NODIR) ? 11 : 4);
  1159. X        blessorcurse(otmp, 17);
  1160. X        otmp->recharged = 0; /* used to control recharging */
  1161. X        break;
  1162. X    case RING_CLASS:
  1163. X        if(objects[otmp->otyp].oc_charged) {
  1164. X            blessorcurse(otmp, 3);
  1165. X            if(rn2(10)) {
  1166. X            if(rn2(10) && bcsign(otmp))
  1167. X                otmp->spe = bcsign(otmp) * rne(3);
  1168. X            else otmp->spe = rn2(2) ? rne(3) : -rne(3);
  1169. X            }
  1170. X            /* make useless +0 rings much less common */
  1171. X            if (otmp->spe == 0) otmp->spe = rn2(4) - rn2(3);
  1172. X            /* negative rings are usually cursed */
  1173. X            if (otmp->spe < 0 && rn2(5)) curse(otmp);
  1174. X        } else if(rn2(10) && (otmp->otyp == RIN_TELEPORTATION ||
  1175. X#ifdef POLYSELF
  1176. X              otmp->otyp == RIN_POLYMORPH ||
  1177. X#endif
  1178. X              otmp->otyp == RIN_AGGRAVATE_MONSTER ||
  1179. X              otmp->otyp == RIN_HUNGER || !rn2(9))) {
  1180. X            curse(otmp);
  1181. X        }
  1182. X        break;
  1183. X    case ROCK_CLASS:
  1184. X        switch (otmp->otyp) {
  1185. X            case STATUE:
  1186. X            if (rn2(level_difficulty()/2 + 10) > 10) {
  1187. X                struct obj *book;
  1188. X                book = mkobj(SPBOOK_CLASS,FALSE);
  1189. X                otmp->cobj = book;
  1190. X            }
  1191. X            /* overridden by mkcorpstat() */
  1192. X            otmp->corpsenm = rndmonnum();
  1193. X        }
  1194. X        break;
  1195. X    case GOLD_CLASS:
  1196. X        break;    /* do nothing */
  1197. X    default:
  1198. X        impossible("impossible mkobj %d, sym '%c'.", otmp->otyp, objects[otmp->otyp].oc_class);
  1199. X        return (struct obj *)0;
  1200. X    }
  1201. X    /* unique objects may have an associated artifact entry */
  1202. X    if (objects[otyp].oc_unique && !otmp->oartifact)
  1203. X        otmp = mk_artifact(otmp, (aligntyp)A_NONE);
  1204. X    otmp->owt = weight(otmp);
  1205. X    return(otmp);
  1206. X}
  1207. X
  1208. Xvoid
  1209. Xbless(otmp)
  1210. Xregister struct obj *otmp;
  1211. X{
  1212. X    otmp->cursed = 0;
  1213. X    otmp->blessed = 1;
  1214. X    if (otmp->otyp == LUCKSTONE
  1215. X        || (otmp->oartifact && spec_ability(otmp, SPFX_LUCK))) {
  1216. X        int luckbon = stone_luck(TRUE);
  1217. X        if(!luckbon && !carrying(LUCKSTONE)) u.moreluck = 0;
  1218. X        else if (luckbon >= 0) u.moreluck = LUCKADD;
  1219. X        else u.moreluck = -LUCKADD;
  1220. X    } else if (otmp->otyp == BAG_OF_HOLDING)
  1221. X        otmp->owt = weight(otmp);
  1222. X    return;
  1223. X}
  1224. X
  1225. Xvoid
  1226. Xunbless(otmp)
  1227. Xregister struct obj *otmp;
  1228. X{
  1229. X    otmp->blessed = 0;
  1230. X    if (otmp->otyp == LUCKSTONE
  1231. X        || (otmp->oartifact && spec_ability(otmp, SPFX_LUCK))) {
  1232. X        int luckbon = stone_luck(TRUE);
  1233. X        if (!luckbon && !carrying(LUCKSTONE)) u.moreluck = 0;
  1234. X        else if (luckbon >= 0) u.moreluck = LUCKADD;
  1235. X        else u.moreluck = -LUCKADD;
  1236. X    } else if (otmp->otyp == BAG_OF_HOLDING)
  1237. X        otmp->owt = weight(otmp);
  1238. X}
  1239. X
  1240. Xvoid
  1241. Xcurse(otmp)
  1242. Xregister struct obj *otmp;
  1243. X{
  1244. X    otmp->blessed = 0;
  1245. X    otmp->cursed = 1;
  1246. X    if (otmp->otyp == LUCKSTONE
  1247. X        || (otmp->oartifact && spec_ability(otmp, SPFX_LUCK))) {
  1248. X        int luckbon = stone_luck(TRUE);
  1249. X        if (!luckbon && !carrying(LUCKSTONE)) u.moreluck = 0;
  1250. X        else if (luckbon >= 0) u.moreluck = LUCKADD;
  1251. X        else u.moreluck = -LUCKADD;
  1252. X    } else if (otmp->otyp == BAG_OF_HOLDING)
  1253. X        otmp->owt = weight(otmp);
  1254. X    return;
  1255. X}
  1256. X
  1257. Xvoid
  1258. Xuncurse(otmp)
  1259. Xregister struct obj *otmp;
  1260. X{
  1261. X    otmp->cursed = 0;
  1262. X    if (otmp->otyp == LUCKSTONE
  1263. X        || (otmp->oartifact && spec_ability(otmp, SPFX_LUCK))) {
  1264. X        int luckbon = stone_luck(TRUE);
  1265. X        if (!luckbon && !carrying(LUCKSTONE)) u.moreluck = 0;
  1266. X        else if (luckbon >= 0) u.moreluck = LUCKADD;
  1267. X        else u.moreluck = -LUCKADD;
  1268. X    } else if (otmp->otyp == BAG_OF_HOLDING)
  1269. X        otmp->owt = weight(otmp);
  1270. X}
  1271. X
  1272. X#endif /* OVLB */
  1273. X#ifdef OVL1
  1274. Xvoid
  1275. Xblessorcurse(otmp, chance)
  1276. Xregister struct obj *otmp;
  1277. Xregister int chance;
  1278. X{
  1279. X    if(otmp->blessed || otmp->cursed) return;
  1280. X
  1281. X    if(!rn2(chance))
  1282. X        if(!rn2(2)) {
  1283. X        curse(otmp);
  1284. X        } else {
  1285. X        bless(otmp);
  1286. X        }
  1287. X    return;
  1288. X}
  1289. X
  1290. X#endif /* OVL1 */
  1291. X#ifdef OVLB
  1292. X
  1293. Xint
  1294. Xbcsign(otmp)
  1295. Xregister struct obj *otmp;
  1296. X{
  1297. X    return(!!otmp->blessed - !!otmp->cursed);
  1298. X}
  1299. X
  1300. X#endif /* OVLB */
  1301. X#ifdef OVL0
  1302. X
  1303. X/*
  1304. X *  Calculate the weight of the given object.  This will recursively follow
  1305. X *  and calculate the weight of any containers.
  1306. X *
  1307. X *  Note:  It is possible to end up with an incorrect weight if some part
  1308. X *       of the code messes with a contained object and doesn't update the
  1309. X *       container's weight.
  1310. X */
  1311. Xint
  1312. Xweight(obj)
  1313. Xregister struct obj *obj;
  1314. X{
  1315. X    int wt = objects[obj->otyp].oc_weight;
  1316. X
  1317. X    if (Is_container(obj) || obj->otyp == STATUE) {
  1318. X        struct obj *contents;
  1319. X        register int cwt = 0;
  1320. X
  1321. X        if (obj->otyp == STATUE && obj->corpsenm > -1)
  1322. X            wt = (int)obj->quan *
  1323. X             ((int)mons[obj->corpsenm].cwt * 3 / 2);
  1324. X
  1325. X        for(contents=obj->cobj; contents; contents=contents->nobj)
  1326. X            cwt += weight(contents);
  1327. X        /*
  1328. X         *  The weight of bags of holding is calculated as the weight
  1329. X         *  of the bag plus the weight of the bag's contents modified
  1330. X         *  as follows:
  1331. X         *
  1332. X         *    Bag status    Weight of contents
  1333. X         *    ----------    ------------------
  1334. X         *    cursed            2x
  1335. X         *    blessed            x/4 + 1
  1336. X         *    otherwise        x/2 + 1
  1337. X         *
  1338. X         *  The macro DELTA_CWT in pickup.c also implements these
  1339. X         *  weight equations.
  1340. X         *
  1341. X         *  Note:  The above checks are performed in the given order.
  1342. X         *       this means that if an object is both blessed and
  1343. X         *       cursed (not supposed to happen), it will be treated
  1344. X         *       as cursed.
  1345. X         */
  1346. X        if (obj->otyp == BAG_OF_HOLDING)
  1347. X            cwt = obj->cursed ? (cwt * 2) :
  1348. X                    (1 + (cwt / (obj->blessed ? 4 : 2)));
  1349. X
  1350. X        return wt + cwt;
  1351. X    }
  1352. X    if (obj->otyp == CORPSE && obj->corpsenm > -1)
  1353. X        return (int)obj->quan * mons[obj->corpsenm].cwt;
  1354. X    else if (obj->otyp == GOLD_PIECE)
  1355. X        return (int)((obj->quan + 500L) / 1000L);
  1356. X    return(wt ? wt*(int)obj->quan : ((int)obj->quan + 1)>>1);
  1357. X}
  1358. X
  1359. X#endif /* OVL0 */
  1360. X#ifdef OVLB
  1361. X
  1362. Xvoid
  1363. Xmkgold(amount, x, y)
  1364. Xlong amount;
  1365. Xint x, y;
  1366. X{
  1367. X    register struct obj *gold = g_at(x,y);
  1368. X
  1369. X    if (amount <= 0L) amount = (long)(1 + rnd(level_difficulty()+2) * rnd(30));
  1370. X    if (gold) {
  1371. X    gold->quan += amount;
  1372. X    } else {
  1373. X    gold = mksobj_at(GOLD_PIECE,x,y,TRUE);
  1374. X    gold->quan = amount;
  1375. X    }
  1376. X    gold->owt = weight(gold);
  1377. X}
  1378. X
  1379. X#endif /* OVLB */
  1380. X#ifdef OVL1
  1381. Xstruct obj *
  1382. Xmkcorpstat(objtype, ptr, x, y, init)
  1383. Xint objtype;    /* CORPSE or STATUE */
  1384. Xregister struct permonst *ptr;
  1385. Xint x, y;
  1386. Xboolean init;
  1387. X{
  1388. X    register struct obj *otmp;
  1389. X
  1390. X    if(objtype != CORPSE && objtype != STATUE)
  1391. X        impossible("making corpstat type %d", objtype);
  1392. X    otmp = mksobj_at(objtype, x, y, init);
  1393. X    if(otmp)  {
  1394. X        if(ptr)    otmp->corpsenm = monsndx(ptr);
  1395. X        else    otmp->corpsenm = rndmonnum();
  1396. X        otmp->owt = weight(otmp);
  1397. X    }
  1398. X    return(otmp);
  1399. X}
  1400. X
  1401. X#endif /* OVL1 */
  1402. X#ifdef OVLB
  1403. Xstruct obj *
  1404. Xmk_tt_object(objtype, x, y)
  1405. Xint objtype; /* CORPSE or STATUE */
  1406. Xregister int x, y;
  1407. X{
  1408. X    register struct obj *otmp;
  1409. X
  1410. X    /* player statues never contain books */
  1411. X    if ((otmp = mksobj_at(objtype,x,y,FALSE)) != 0)
  1412. X        otmp = tt_oname(otmp);
  1413. X    return(otmp);
  1414. X}
  1415. X
  1416. X/* make a new corpse or statue, uninitialized if a statue (i.e. no books) */
  1417. Xstruct obj *
  1418. Xmk_named_object(objtype, ptr, x, y, nm, lth)
  1419. Xint objtype; /* CORPSE or STATUE */
  1420. Xregister struct permonst *ptr;
  1421. Xint x, y;
  1422. Xchar * nm;
  1423. Xregister int lth;
  1424. X{
  1425. X    struct obj *otmp;
  1426. X
  1427. X    otmp = mkcorpstat(objtype,ptr,x,y,(objtype != STATUE));
  1428. X    if (lth > 0) {
  1429. X        /* Note: oname() is safe since otmp is first in both chains */
  1430. X        otmp = oname(otmp, nm, FALSE);
  1431. X        fobj = otmp;
  1432. X        level.objects[x][y] = otmp;
  1433. X        if (is_pool(x,y)) water_damage(otmp,TRUE);
  1434. X    }
  1435. X    return(otmp);
  1436. X}
  1437. X
  1438. Xboolean
  1439. Xis_flammable(otmp)
  1440. Xregister struct obj *otmp;
  1441. X{
  1442. X    int otyp = otmp->otyp;
  1443. X
  1444. X    if (objects[otyp].oc_oprop == FIRE_RES) return FALSE;
  1445. X
  1446. X    return((objects[otyp].oc_material == WOOD ||
  1447. X            objects[otyp].oc_material == 0));
  1448. X
  1449. X}
  1450. X
  1451. X#endif /* OVLB */
  1452. X#ifdef OVL1
  1453. X
  1454. X/*
  1455. X * These routines maintain the single-linked lists headed in level.objects[][]
  1456. X * and threaded through the nexthere fields in the object-instance structure.
  1457. X */
  1458. X
  1459. Xvoid
  1460. Xplace_object(otmp, x, y)
  1461. X/* put an object on top of the pile at the given location */
  1462. Xregister struct obj *otmp;
  1463. Xint x, y;
  1464. X{
  1465. X    register struct obj *otmp2 = level.objects[x][y];
  1466. X
  1467. X    if (otmp->otyp == BOULDER) block_point(x,y);    /* vision */
  1468. X
  1469. X    if (otmp2 && (otmp2->otyp == BOULDER)) {
  1470. X    otmp->nexthere = otmp2->nexthere;
  1471. X    otmp2->nexthere = otmp;
  1472. X    } else {
  1473. X    otmp->nexthere = otmp2;
  1474. X    level.objects[x][y] = otmp;
  1475. X    }
  1476. X    if (is_pool(x,y)) water_damage(otmp,TRUE);
  1477. X
  1478. X    /* set the new object's location */
  1479. X    otmp->ox = x;
  1480. X    otmp->oy = y;
  1481. X}
  1482. X
  1483. X#endif /* OVL1 */
  1484. X#ifdef OVLB
  1485. Xvoid
  1486. Xremove_object(otmp)
  1487. Xregister struct obj *otmp;
  1488. X{
  1489. X    register struct obj *odel;
  1490. X
  1491. X    if (otmp->otyp == BOULDER) unblock_point(otmp->ox,otmp->oy); /* vision */
  1492. X
  1493. X    if (otmp == level.objects[otmp->ox][otmp->oy])
  1494. X    level.objects[otmp->ox][otmp->oy] = otmp->nexthere;
  1495. X    else
  1496. X    for (odel = level.objects[otmp->ox][otmp->oy];
  1497. X                            odel; odel = odel->nexthere)
  1498. X        if (odel->nexthere == otmp) {
  1499. X        odel->nexthere = otmp->nexthere;
  1500. X        break;
  1501. X        }
  1502. X}
  1503. X
  1504. Xvoid
  1505. Xmove_object(otmp, x, y)
  1506. Xregister struct obj *otmp;
  1507. Xint x, y;
  1508. X{
  1509. X    remove_object(otmp);
  1510. X    place_object(otmp, x, y);
  1511. X}
  1512. X
  1513. X#endif /* OVLB */
  1514. X
  1515. X/*mkobj.c*/
  1516. END_OF_FILE
  1517. if test 18051 -ne `wc -c <'src/mkobj.c'`; then
  1518.     echo shar: \"'src/mkobj.c'\" unpacked with wrong size!
  1519. fi
  1520. # end of 'src/mkobj.c'
  1521. fi
  1522. if test -f 'sys/amiga/amirip.c' -a "${1}" != "-c" ; then 
  1523.   echo shar: Will not clobber existing file \"'sys/amiga/amirip.c'\"
  1524. else
  1525. echo shar: Extracting \"'sys/amiga/amirip.c'\" \(17141 characters\)
  1526. sed "s/^X//" >'sys/amiga/amirip.c' <<'END_OF_FILE'
  1527. X/*  SCCS Id: @(#)amirip.c   3.2 93/01/08
  1528. X/* Copyright (c) Kenneth Lorber, Bethesda, Maryland 1991, 1992, 1993. */
  1529. X/* NetHack may be freely redistributed.  See license for details. */
  1530. X
  1531. X#include "hack.h"
  1532. X#include <exec/types.h>
  1533. X#include <exec/io.h>
  1534. X#include <exec/alerts.h>
  1535. X#include <exec/devices.h>
  1536. X#include <devices/console.h>
  1537. X#include <devices/conunit.h>
  1538. X#include <graphics/gfxbase.h>
  1539. X#include <graphics/gfxmacros.h>
  1540. X#include <intuition/intuition.h>
  1541. X#include <libraries/dosextens.h>
  1542. X#include <ctype.h>
  1543. X#include <string.h>
  1544. X#include "winami.h"
  1545. X
  1546. X#undef  NULL
  1547. X#define NULL    0
  1548. X
  1549. X#ifdef AZTEC_C
  1550. X# include <functions.h>
  1551. X#else
  1552. X# include <proto/dos.h>
  1553. X# include <proto/exec.h>
  1554. X# include <proto/console.h>
  1555. X# include <proto/diskfont.h>
  1556. X
  1557. X/* terrible kludge */
  1558. X/* this is why prototypes should have ONLY types in them! */
  1559. X# undef red
  1560. X# undef green
  1561. X# undef blue
  1562. X# undef index
  1563. X# include <proto/graphics.h>
  1564. X
  1565. X# include <proto/intuition.h>
  1566. X#endif /* AZTEC_C */
  1567. X
  1568. Xstatic void grass ( int x , int y );
  1569. Xstatic void strand ( int x , int y , int dir );
  1570. Xstatic void tomb_text ( char *p );
  1571. Xstatic void getret( void );
  1572. Xvoid draw_moon(int phase);
  1573. X
  1574. Xextern char *killed_by_prefix[];
  1575. Xstruct Window *ripwin;
  1576. X
  1577. X#define STONE_LINE_LEN 18   /* # chars that fit on one line
  1578. X                 * (note 1 ' ' border)
  1579. X                 */
  1580. X#define MOONSIZE    30
  1581. X
  1582. Xstatic struct stabstuff
  1583. X{
  1584. X    short x1,y0;
  1585. X}
  1586. Xstab[]=
  1587. X{
  1588. X    {0,0}, {0,1}, {0,2}, {1,3}, {2,4},
  1589. X    {3,5}, {5,6}, {7,7}, {9,8}, {11,9}
  1590. X};
  1591. X
  1592. Xstatic struct
  1593. X{
  1594. X    int x, y;    /* center of moon */
  1595. X}
  1596. Xmoon[]=
  1597. X{
  1598. X/* 0-7, left to right, 4 is full and just right of center
  1599. X0-3 hollow to left, 5-7 hollow to right (DONT GO OFF THE SCREEN EDGE!) */
  1600. X    { 50, 70, },
  1601. X    { 120, 60, },
  1602. X    { 190, 50, },
  1603. X    { 260, 40, },
  1604. X    { 330, 30, },
  1605. X    { 410, 40, },
  1606. X    { 480, 50, },
  1607. X    { 550, 60, },
  1608. X};
  1609. X
  1610. Xunsigned short dirtpat[ 7 ][ 3 ][ 8 ]=
  1611. X{
  1612. X{
  1613. X {0xb8a0, 0xc124, 0xa60f, 0x7894, 0x1152, 0x0ec1, 0x14c0, 0xa921, },
  1614. X {0x4611, 0x365b, 0x5030, 0x0460, 0x44a0, 0xd106, 0x0131, 0x4282, },
  1615. X {0xb9ee, 0xc9a4, 0xafcf, 0xfb9f, 0xbb5f, 0x2ef9, 0xfece, 0xbd7d, },
  1616. X},
  1617. X
  1618. X{
  1619. X {0x1258, 0x1015, 0xd430, 0x0488, 0x1402, 0x1040, 0x22e3, 0x8ce8, },
  1620. X {0x00a4, 0x818a, 0x2a45, 0x6255, 0x49a8, 0xe69a, 0x9118, 0x1215, },
  1621. X {0xff5b, 0x7e75, 0xd5ba, 0x9daa, 0xb657, 0x1965, 0x6ee7, 0xedea, },
  1622. X},
  1623. X
  1624. X{
  1625. X {0x9958, 0x0164, 0x80c8, 0xa660, 0x0412, 0x0025, 0x22ab, 0x2512, },
  1626. X {0x64a4, 0xb292, 0x5525, 0x489d, 0x73c0, 0x7e8a, 0x0514, 0xd2ad, },
  1627. X {0x9b5b, 0x4d6d, 0xaada, 0xb762, 0x8c3f, 0x8175, 0xfaeb, 0x2d52, },
  1628. X},
  1629. X
  1630. X{
  1631. X {0x8f41, 0xca1e, 0x29c2, 0xa4c0, 0x5481, 0x94d8, 0x9702, 0x0914, },
  1632. X {0x608c, 0x05c0, 0x4425, 0x1936, 0x2a3e, 0x4203, 0x4064, 0x54c0, },
  1633. X {0x9f73, 0xfa3f, 0xbbda, 0xe6c9, 0xd5c1, 0xbdfc, 0xbf9b, 0xab3f, },
  1634. X},
  1635. X
  1636. X{
  1637. X {0x4000, 0xd52b, 0x1010, 0x5008, 0x40c1, 0x4057, 0x014a, 0x606c, },
  1638. X {0xa900, 0x2810, 0x0a85, 0x8fc6, 0x3406, 0xbfa0, 0xf020, 0x9d10, },
  1639. X {0x56ff, 0xd7ef, 0xf57a, 0x7039, 0xcbf9, 0x405f, 0x0fdf, 0x62ef, },
  1640. X},
  1641. X
  1642. X{
  1643. X {0x8368, 0x0480, 0x900e, 0xf41f, 0x2e24, 0xfa03, 0x0397, 0x895c, },
  1644. X {0x5814, 0x1022, 0x4ca0, 0x0300, 0x0042, 0x0078, 0xf048, 0x6683, },
  1645. X {0xa7eb, 0xefdd, 0xb35f, 0xfcff, 0xffbd, 0xff87, 0x0fb7, 0x997c, },
  1646. X},
  1647. X
  1648. X{
  1649. X {0x4228, 0x0050, 0xa016, 0x42a3, 0x341c, 0x46a2, 0x23d3, 0x4001, },
  1650. X {0xb515, 0x6383, 0x13c8, 0x8d5c, 0x0822, 0x1149, 0x4400, 0x8728, },
  1651. X {0x4aea, 0x9c7c, 0xec37, 0x72a3, 0xf7dd, 0xeeb6, 0xbbff, 0x78d7, },
  1652. X},
  1653. X};
  1654. X
  1655. Xstatic USHORT stonepat[] =
  1656. X{
  1657. X    0x8242,
  1658. X    0x2421,
  1659. X    0x1888,
  1660. X    0x4112,
  1661. X    0x2444,
  1662. X    0x8218,
  1663. X    0x4181,
  1664. X    0x1824,
  1665. X};
  1666. X
  1667. Xstatic USHORT moundpat[] =
  1668. X{
  1669. X    0x5235,
  1670. X    0xd7c6,
  1671. X    0x1298,
  1672. X    0x34a7,
  1673. X    0x2736,
  1674. X    0x2c54,
  1675. X    0xdc93,
  1676. X    0xc551,
  1677. X};
  1678. X
  1679. X#define DEATH_LINE  10
  1680. X#define YEAR_LINE   15
  1681. X
  1682. Xstatic int horizon;
  1683. Xstatic struct RastPort *rp;
  1684. Xstatic unsigned char tomb_line;
  1685. X
  1686. Xextern struct DisplayDesc *amiIDisplay;
  1687. Xextern struct Screen *HackScreen;
  1688. Xextern unsigned short amii_curmap[];
  1689. Xextern int havelace;
  1690. X
  1691. X#undef  BLACK
  1692. X#undef  WHITE
  1693. X#undef  BROWN
  1694. X#undef  GREEN
  1695. X
  1696. X#define BLACK   0
  1697. X#define WHITE   1
  1698. X#define BROWN   2
  1699. X#define GREY    3
  1700. X#define GREEN   4
  1701. X#define DKGRN   5
  1702. X
  1703. Xstatic unsigned short zeropalette[] = {
  1704. X    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  1705. X};
  1706. Xstatic unsigned short toppalette[] = {
  1707. X    0x0000, 0x0EEF, 0x0730, 0x0778, 0x0082, 0x0573, 0x0000, 0x0000,
  1708. X};
  1709. X
  1710. X#define AREA_SIZE   500
  1711. Xstatic WORD areabuffer[ AREA_SIZE ];
  1712. X
  1713. Xstatic struct NewWindow newwin =
  1714. X{
  1715. X    0,0,640,200,1,0,
  1716. X    MOUSEBUTTONS|VANILLAKEY|NOCAREREFRESH,
  1717. X    BORDERLESS|ACTIVATE|SMART_REFRESH,
  1718. X    NULL,NULL,(UBYTE*)NULL,NULL,NULL,-1,-1,-1,-1,CUSTOMSCREEN
  1719. X};
  1720. X
  1721. Xint wh; /* was local in outrip, but needed for SCALE macro */
  1722. X
  1723. X#define DEPTH ripwin->RPort->BitMap->Depth
  1724. X/*TODO: should use real algorithm to get circles */
  1725. X#define SCALE(x) ((wh<300)?(x):((x)*2))
  1726. X#define MOONSX  MOONSIZE
  1727. X#define MOONSY  ((SCALE(MOONSIZE)/2)-4)
  1728. X
  1729. Xvoid
  1730. Xdraw_moon(int phase)
  1731. X{
  1732. X    int x;
  1733. X    int off_c_x=MOONSX+10;    /* moon center x in srp */
  1734. X    int off_c_y=MOONSY;        /* moon center y in srp */
  1735. X    int blit_urhx=10;        /* upper right hand corner for blit */
  1736. X    int blit_urhy=0;
  1737. X    int blit_width=MOONSX*2;    /* sizes for blit */
  1738. X    int blit_height=MOONSY*2+1;    /* +1 - hmm (rounding? 0 base?)*/
  1739. X
  1740. X    /* set up scratch rastport */
  1741. X    struct BitMap sbm;
  1742. X    struct RastPort srp;
  1743. X    struct AreaInfo ainfo;
  1744. X    short abuf[5];
  1745. X    struct TmpRas atr;
  1746. X    PLANEPTR ap;
  1747. X
  1748. X    /*TODO: sizes here are bigger than needed */
  1749. X    InitBitMap(&sbm,DEPTH,MOONSIZE*4,MOONSIZE*2);
  1750. X    for(x=0;x<DEPTH;x++){
  1751. X    sbm.Planes[x]=(PLANEPTR)AllocRaster(MOONSIZE*2,MOONSIZE*4);
  1752. X    if(!sbm.Planes[x])goto free;
  1753. X    }
  1754. X    InitRastPort(&srp);
  1755. X    srp.BitMap=&sbm;
  1756. X    InitArea(&ainfo,abuf,2);
  1757. X    srp.AreaInfo= &ainfo;
  1758. X    ap=AllocRaster(320,200);
  1759. X    if(!ap)goto free;
  1760. X#ifdef AZTEC_C
  1761. X    /*
  1762. X     * Aztec, in their infinite wisdom, require a char * as the
  1763. X     * second argument.
  1764. X     */
  1765. X    InitTmpRas(&atr, (char *)ap, RASSIZE(320,200));
  1766. X#else
  1767. X    InitTmpRas(&atr,ap,RASSIZE(320,200));
  1768. X#endif
  1769. X    srp.TmpRas = &atr;
  1770. X    SetAfPt(rp,(UWORD *)NULL,0);
  1771. X    SetRast(&srp,BLACK);
  1772. X
  1773. X    switch(phase){
  1774. X    case 0: /* new moon - no image */
  1775. X    break;
  1776. X    case 1: /* waxing crescent */
  1777. X    SetAPen(&srp,WHITE);
  1778. X    AreaEllipse(&srp,off_c_x,off_c_y,MOONSX,MOONSY);
  1779. X    AreaEnd(&srp);
  1780. X    SetAPen(&srp,BLACK);
  1781. X    AreaEllipse(&srp,off_c_x+10,off_c_y,MOONSX,MOONSY);
  1782. X    AreaEnd(&srp);
  1783. X    break;
  1784. X
  1785. X    case 2: /* 1st quarter */
  1786. X    SetAPen(&srp,WHITE);
  1787. X    AreaEllipse(&srp,off_c_x,off_c_y,MOONSX,MOONSY);
  1788. X    AreaEnd(&srp);
  1789. X    SetAPen(&srp,BLACK);
  1790. X    RectFill(&srp,off_c_x,0,MOONSIZE*4-1,MOONSIZE*2-1);
  1791. X    break;
  1792. X    case 3: /* gibbous */
  1793. X    SetAPen(&srp,WHITE);
  1794. X    AreaEllipse(&srp,off_c_x,off_c_y,MOONSX,MOONSY);
  1795. X    AreaEnd(&srp);
  1796. X    SetAPen(&srp,BLACK);
  1797. X    RectFill(&srp,off_c_x,0,MOONSIZE*4-1,MOONSIZE*2-1);
  1798. X    SetAPen(&srp,WHITE);
  1799. X    AreaEllipse(&srp,off_c_x,off_c_y,MOONSX/2,MOONSY);
  1800. X    AreaEnd(&srp);
  1801. X    break;
  1802. X    case 4: /* full */
  1803. X    SetAPen(&srp,WHITE);
  1804. X    AreaEllipse(&srp,off_c_x,off_c_y,MOONSX,MOONSY);
  1805. X    AreaEnd(&srp);
  1806. X    break;
  1807. X    case 5: /* gibbous */
  1808. X    SetAPen(&srp,WHITE);
  1809. X    AreaEllipse(&srp,off_c_x,off_c_y,MOONSX,MOONSY);
  1810. X    AreaEnd(&srp);
  1811. X    SetAPen(&srp,BLACK);
  1812. X    RectFill(&srp,0,0,off_c_x,MOONSIZE*2-1);
  1813. X    SetAPen(&srp,WHITE);
  1814. X    AreaEllipse(&srp,off_c_x,off_c_y,MOONSX/2,MOONSY);
  1815. X    AreaEnd(&srp);
  1816. X    break;
  1817. X    case 6: /* last quarter */
  1818. X    SetAPen(&srp,WHITE);
  1819. X    AreaEllipse(&srp,off_c_x,off_c_y,MOONSX,MOONSY);
  1820. X    AreaEnd(&srp);
  1821. X    SetAPen(&srp,BLACK);
  1822. X    RectFill(&srp,0,0,off_c_x,MOONSIZE*4-1+10);
  1823. X    break;
  1824. X    case 7: /* waning crescent */
  1825. X    SetAPen(&srp,WHITE);
  1826. X    AreaEllipse(&srp,off_c_x,off_c_y,MOONSX,MOONSY);
  1827. X    AreaEnd(&srp);
  1828. X    SetAPen(&srp,BLACK);
  1829. X    AreaEllipse(&srp,off_c_x-10,off_c_y,MOONSX,MOONSY);
  1830. X    AreaEnd(&srp);
  1831. X    break;
  1832. X    }
  1833. X    /*move rastport into window (so that there are no stars "in" the moon)*/
  1834. X    /* draw black circle in window rport */
  1835. X    SetAPen(rp,BLACK);
  1836. X    AreaEllipse( rp, moon[phase].x,moon[phase].y,MOONSX,MOONSY);
  1837. X    AreaEnd(rp);
  1838. X
  1839. X    if(phase != 0){
  1840. X    /*move scratch to window: set all white, ignore black (in src)*/
  1841. X    ClipBlit(&srp,blit_urhx,blit_urhy,
  1842. X      rp,moon[phase].x-(blit_width/2),moon[phase].y-(blit_height/2),
  1843. X      blit_width,blit_height,0xe0);
  1844. X    }
  1845. X
  1846. Xfree:
  1847. X    for(x=0;x<DEPTH;x++)
  1848. X    if(sbm.Planes[x])
  1849. X        FreeRaster(sbm.Planes[x],MOONSIZE*2,MOONSIZE*4);
  1850. X    if(ap)FreeRaster(ap,320,200);
  1851. X}
  1852. X#undef DEPTH
  1853. X
  1854. Xvoid
  1855. Xoutrip( how, tmpwin )
  1856. Xint how;
  1857. Xwinid tmpwin;
  1858. X{
  1859. X    int done, rtxth;
  1860. X    struct IntuiMessage *imsg;
  1861. X    struct AreaInfo areaInfo;
  1862. X    PLANEPTR planeptr;
  1863. X    struct TmpRas tmpRas;
  1864. X    int i;
  1865. X    register char *dpx;
  1866. X    char buf[ 200 ];
  1867. X    register int x;
  1868. X    int line, phase, c, offset, tw, ww;
  1869. X
  1870. X    /* Use the users display size */
  1871. X    newwin.Height = amiIDisplay->ypix - newwin.TopEdge;
  1872. X    newwin.Width = amiIDisplay->xpix;
  1873. X    newwin.Screen = HackScreen;
  1874. X
  1875. X    ripwin = OpenWindow( &newwin );
  1876. X    if( !ripwin ){
  1877. X    return;
  1878. X    }
  1879. X
  1880. X    rp= ripwin->RPort;
  1881. X    wh = ripwin->Height;
  1882. X    ww = ripwin->Width;
  1883. X    if( !( planeptr = AllocRaster( ww, wh ) ) )
  1884. X    return;
  1885. X
  1886. X#ifdef AZTEC_C
  1887. X    InitTmpRas( &tmpRas, (char *) planeptr, RASSIZE( ww, wh ) );
  1888. X#else
  1889. X    InitTmpRas( &tmpRas, planeptr, RASSIZE( ww, wh ) );
  1890. X#endif
  1891. X    rp->TmpRas = &tmpRas;
  1892. X
  1893. X    for( i = 0; i < AREA_SIZE; ++i )
  1894. X    areabuffer[ i ] = 0;
  1895. X    InitArea( &areaInfo, areabuffer, (AREA_SIZE*2)/5);
  1896. X    rp->AreaInfo = &areaInfo;
  1897. X
  1898. X    LoadRGB4( &HackScreen->ViewPort, zeropalette, 8L );
  1899. X
  1900. X    horizon=ripwin->Height*2/3;
  1901. X
  1902. X    /* sky */
  1903. X    SetDrMd(rp,JAM1);
  1904. X    SetAPen( rp, BLACK );
  1905. X    RectFill(rp,0,0,ripwin->Width,horizon);
  1906. X
  1907. X    /* ground */
  1908. X    SetDrMd( rp, JAM2 );
  1909. X    SetAfPt( rp, dirtpat[random()%7], -3 );
  1910. X    SetAPen( rp, 255 );
  1911. X    SetBPen( rp, 0 );
  1912. X    RectFill( rp, 0, horizon+1, ripwin->Width, ripwin->Height );
  1913. X    SetAfPt( rp, (UWORD *)NULL, 0 );
  1914. X
  1915. X    /* stars */
  1916. X    SetAPen(rp,WHITE);
  1917. X    for(c=d(30,40);c;c--)
  1918. X    WritePixel(rp,rn2(ripwin->Width),rn2(horizon));
  1919. X
  1920. X    /* moon (NB destroys area fill pattern) */
  1921. X    phase = phase_of_the_moon() % 8;
  1922. X    draw_moon(phase);
  1923. X
  1924. X    /* grass */
  1925. X    offset=(phase<4)?-1:1;
  1926. X    SetAPen(rp,GREEN);
  1927. X    for( x = 0; x < ripwin->Width; x+=10+rn2(10))
  1928. X    grass(x, horizon+5 );
  1929. X
  1930. X    /* fence - horizontal, then vertical, each with a moonlit side */
  1931. X    SetAPen(rp,GREY);
  1932. X    Move(rp,0,horizon-SCALE(20));
  1933. X    Draw(rp,ripwin->Width,horizon-SCALE(20));
  1934. X    Move(rp,0,horizon+30);
  1935. X    Draw(rp,ripwin->Width,horizon+30);
  1936. X
  1937. X    for(x=30;x<ripwin->Width;x+=50)
  1938. X    {
  1939. X    Move(rp,x,horizon-SCALE(25));
  1940. X    Draw(rp,x,horizon+35);
  1941. X    Move(rp,x-offset,horizon-SCALE(25));
  1942. X    Draw(rp,x-offset,horizon+35);
  1943. X    Move(rp,x-(2*offset),horizon-SCALE(25));
  1944. X    Draw(rp,x-(2*offset),horizon+35);
  1945. X    }
  1946. X
  1947. X
  1948. X    if(phase)SetAPen(rp,WHITE); /* no vertical white if no moon */
  1949. X    Move(rp,0,horizon-SCALE(20)-1);
  1950. X    Draw(rp,ripwin->Width,horizon-SCALE(20)-1);
  1951. X    Move(rp,0,horizon+29);
  1952. X    Draw(rp,ripwin->Width,horizon+29);
  1953. X
  1954. X    if(phase!=0 && phase!=4){
  1955. X    SetAPen(rp,WHITE);
  1956. X    } else {
  1957. X    SetAPen(rp,GREY);   /* no hor. white if no or full moon */
  1958. X    }
  1959. X    for(x=30;x<ripwin->Width;x+=50)
  1960. X    {
  1961. X    Move(rp,x+offset,horizon-SCALE(25));
  1962. X    Draw(rp,x+offset,horizon+35);
  1963. X    Move(rp,x+(2*offset),horizon-SCALE(25));
  1964. X    Draw(rp,x+(2*offset),horizon+35);
  1965. X    }
  1966. X
  1967. X    /* Put together death description */
  1968. X    switch (killer_format) {
  1969. X    default:
  1970. X    impossible("bad killer format?");
  1971. X    case KILLED_BY_AN:
  1972. X    Strcpy(buf, killed_by_prefix[how]);
  1973. X    Strcat(buf, an(killer));
  1974. X    break;
  1975. X    case KILLED_BY:
  1976. X    Strcpy(buf, killed_by_prefix[how]);
  1977. X    Strcat(buf, killer);
  1978. X    break;
  1979. X    case NO_KILLER_PREFIX:
  1980. X    Strcpy(buf, killer);
  1981. X    break;
  1982. X    }
  1983. X
  1984. X    tw = TextLength(rp,buf,STONE_LINE_LEN) + 40;
  1985. X
  1986. X    {
  1987. X    char *p=buf;
  1988. X    int x;
  1989. X    for(x=STONE_LINE_LEN;x;x--)*p++='W';
  1990. X    *p='\0';
  1991. X    tw = max( tw, TextLength(rp,buf,STONE_LINE_LEN) + 40 );
  1992. X    }
  1993. X
  1994. X    SetAPen( rp, phase ? BLACK : GREY );
  1995. X    SetBPen( rp, phase ? WHITE : BLACK );
  1996. X    SetDrMd( rp, JAM2 );
  1997. X    SetAfPt( rp, stonepat, 3 );
  1998. X
  1999. X    /* There are 5 lines of text on the stone. */
  2000. X    rtxth = ripwin->RPort->TxHeight * 5;
  2001. X
  2002. X    /* Do shadow ellipse on stone */
  2003. X    if( phase < 4 )
  2004. X    AreaEllipse(rp,ripwin->Width/2-3,horizon-rtxth,tw/2+3,tw/6);
  2005. X    else if( phase > 4 )
  2006. X    AreaEllipse(rp,ripwin->Width/2+3,horizon-rtxth,tw/2+3,tw/6);
  2007. X    else
  2008. X    AreaEllipse(rp,ripwin->Width/2,horizon-rtxth-2,tw/2+3,tw/6);
  2009. X    AreaEnd( rp );
  2010. X
  2011. X    /* Top ellipse on stone */
  2012. X    SetAPen( rp, BLACK );
  2013. X    SetBPen( rp, GREY );
  2014. X    AreaEllipse(rp,ripwin->Width/2,horizon-rtxth,tw/2,tw/6);
  2015. X    AreaEnd( rp );
  2016. X
  2017. X    /* Body of stone */
  2018. X    RectFill(rp,ripwin->Width/2-tw/2,horizon-rtxth,ripwin->Width/2+tw/2,
  2019. X      horizon-rtxth+15+(rp->TxHeight+1)*8);
  2020. X
  2021. X    SetAPen( rp, phase ? BROWN : GREY );
  2022. X    SetBPen( rp, phase ? GREY : BROWN );
  2023. X    SetAfPt( rp, stonepat, 3 );
  2024. X
  2025. X#if 0
  2026. X    AreaMove( rp, ripwin->Width/2-tw/2, horizon-rtxth+15+(rp->TxHeight+1)*8 );
  2027. X    AreaDraw( rp, ripwin->Width/2-tw/4, horizon-rtxth+((ripwin->Height > 200)
  2028. X      ? 55 : 35)+(rp->TxHeight+1)*8 );
  2029. X    AreaDraw( rp, ripwin->Width/2+tw, horizon-rtxth+((ripwin->Height > 200)
  2030. X      ? 55 : 35)+(rp->TxHeight+1)*8 );
  2031. X    AreaDraw( rp, ripwin->Width/2+tw/2, horizon-rtxth+15+(rp->TxHeight+1)*8 );
  2032. X    AreaEnd( rp );
  2033. X
  2034. X    SetAfPt( rp, stonepat, 3 );
  2035. X
  2036. X#endif
  2037. X    /* Draw shadow on correct side of stone */
  2038. X    SetAPen( rp, phase ? BLACK : GREY );
  2039. X    SetBPen( rp, phase ? WHITE : BLACK );
  2040. X    if( phase < 4 )
  2041. X    {
  2042. X    AreaMove( rp, ripwin->Width/2-tw/2-6, horizon-rtxth );
  2043. X    AreaDraw( rp, ripwin->Width/2-tw/2-6,
  2044. X      horizon-rtxth+15+(rp->TxHeight+1)*8-4 );
  2045. X    AreaDraw( rp, ripwin->Width/2-tw/2-1,
  2046. X      horizon-rtxth+15+(rp->TxHeight+1)*8 );
  2047. X    AreaDraw( rp, ripwin->Width/2-tw/2-1, horizon-rtxth );
  2048. X    }
  2049. X    else if( phase > 4 )
  2050. X    {
  2051. X    AreaMove( rp, ripwin->Width/2+tw/2+6, horizon-rtxth );
  2052. X    AreaDraw( rp, ripwin->Width/2+tw/2+6,
  2053. X      horizon-rtxth+15+(rp->TxHeight+1)*8-4 );
  2054. X    AreaDraw( rp, ripwin->Width/2+tw/2+1,
  2055. X      horizon-rtxth+15+(rp->TxHeight+1)*8 );
  2056. X    AreaDraw( rp, ripwin->Width/2+tw/2+1, horizon-rtxth );
  2057. X    }
  2058. X    AreaEnd( rp );
  2059. X
  2060. X    SetAfPt( rp, (UWORD *)NULL, 0 );
  2061. X    SetDrPt( rp, ~0 );
  2062. X
  2063. X    tomb_line=0;
  2064. X    SetBPen(rp,GREY);
  2065. X    SetDrMd(rp,JAM1);
  2066. X    tomb_text("REST");
  2067. X    tomb_text("IN");
  2068. X    tomb_text("PEACE");
  2069. X
  2070. X    /* Put name on stone */
  2071. X    Sprintf(buf, "%s", plname);
  2072. X    buf[STONE_LINE_LEN] = 0;
  2073. X    tomb_text(buf);
  2074. X
  2075. X    /* Put $ on stone */
  2076. X    Sprintf(buf, "%ld Au", u.ugold);
  2077. X    buf[STONE_LINE_LEN] = 0; /* It could be a *lot* of gold :-) */
  2078. X    tomb_text(buf);
  2079. X
  2080. X    /* Put together death description */
  2081. X    switch (killer_format) {
  2082. X    default:
  2083. X    impossible("bad killer format?");
  2084. X    case KILLED_BY_AN:
  2085. X    Strcpy(buf, killed_by_prefix[how]);
  2086. X    Strcat(buf, an(killer));
  2087. X    break;
  2088. X    case KILLED_BY:
  2089. X    Strcpy(buf, killed_by_prefix[how]);
  2090. X    Strcat(buf, killer);
  2091. X    break;
  2092. X    case NO_KILLER_PREFIX:
  2093. X    Strcpy(buf, killer);
  2094. X    break;
  2095. X    }
  2096. X
  2097. X    /* Put death type on stone */
  2098. X    for (line=DEATH_LINE, dpx = buf; line<YEAR_LINE; line++)
  2099. X    {
  2100. X    register int i,i0;
  2101. X    char tmpchar;
  2102. X
  2103. X    if ( (i0=strlen(dpx)) > STONE_LINE_LEN)
  2104. X    {
  2105. X        for(i=STONE_LINE_LEN;((i0 > STONE_LINE_LEN) && i); i--)
  2106. X        {
  2107. X        if(dpx[i] == ' ')
  2108. X            i0 = i;
  2109. X        }
  2110. X        if(!i)
  2111. X        i0 = STONE_LINE_LEN;
  2112. X    }
  2113. X
  2114. X    tmpchar = dpx[i0];
  2115. X    dpx[i0] = 0;
  2116. X    tomb_text(dpx);
  2117. X
  2118. X    if (tmpchar != ' ')
  2119. X    {
  2120. X        dpx[i0] = tmpchar;
  2121. X        dpx= &dpx[i0];
  2122. X    }
  2123. X    else
  2124. X    {
  2125. X        dpx= &dpx[i0+1];
  2126. X    }
  2127. X    }
  2128. X
  2129. X    /* Put year on stone */
  2130. X    Sprintf(buf, "%4d", getyear());
  2131. X    tomb_text(buf);
  2132. X
  2133. X    LoadRGB4( &HackScreen->ViewPort, toppalette, 8L );
  2134. X
  2135. X    done = 0;
  2136. X    while( !done )
  2137. X    {
  2138. X    WaitPort( ripwin->UserPort );
  2139. X    while( imsg = (struct IntuiMessage *)GetMsg(ripwin->UserPort) )
  2140. X    {
  2141. X        switch( imsg->Class )
  2142. X        {
  2143. X        case MOUSEBUTTONS:
  2144. X        case VANILLAKEY:
  2145. X            done = 1;
  2146. X            break;
  2147. X        }
  2148. X        ReplyMsg( (struct Message *)imsg );
  2149. X    }
  2150. X    }
  2151. X
  2152. X    if( planeptr ) FreeRaster( planeptr, ww, wh );
  2153. X    rp->TmpRas = NULL;
  2154. X    Forbid();
  2155. X    while( imsg = (struct IntuiMessage *)GetMsg( ripwin->UserPort ) )
  2156. X    ReplyMsg( (struct Message *)imsg );
  2157. X    CloseWindow( ripwin );
  2158. X    ripwin = NULL;
  2159. X    Permit();
  2160. X    LoadRGB4( &HackScreen->ViewPort, amii_curmap, 8L );
  2161. X}
  2162. X
  2163. Xstatic void grass(x,y)
  2164. Xregister int x,y;
  2165. X{
  2166. X    register int ct=rn2(5)+3;
  2167. X    register int c;
  2168. X    x-=2;
  2169. X    for(c=ct;c;c--)
  2170. X    {
  2171. X    strand(x,y,(c>ct/2)?1:-1);
  2172. X    x+=2;
  2173. X    }
  2174. X}
  2175. X
  2176. Xstatic void strand(x,y,dir)
  2177. X   register int x,y;
  2178. X   register int dir;    /* which way the wind blows :-) */
  2179. X{
  2180. X    register int i;
  2181. X    register struct RastPort *nrp = rp;
  2182. X    register struct stabstuff *st;
  2183. X    for(i=rn2(10);i>=0;i--)
  2184. X    {
  2185. X    st = &stab[i];
  2186. X    WritePixel(nrp,x+st->x1*dir,y-st->y0);
  2187. X    }
  2188. X}
  2189. X
  2190. Xstatic void tomb_text(p)
  2191. Xchar *p;
  2192. X{
  2193. X    char buf[STONE_LINE_LEN*2];
  2194. X    int l;
  2195. X    /*int i;*/
  2196. X
  2197. X    if( !*p )
  2198. X    return;
  2199. X    sprintf(buf," %s ",p);
  2200. X    l=TextLength(rp,buf,strlen(buf));
  2201. X    ++tomb_line;
  2202. X
  2203. X    SetAPen(rp,WHITE);
  2204. X    Move(rp,(ripwin->Width/2)-(l/2)-1, 
  2205. X      ((tomb_line-6)*(rp->TxHeight+1))+horizon);
  2206. X    Text(rp,buf,strlen(buf));
  2207. X
  2208. X    SetAPen(rp,WHITE);
  2209. X    Move(rp,(ripwin->Width/2)-(l/2)+1,
  2210. X      ((tomb_line-6)*(rp->TxHeight+1))+horizon);
  2211. X    Text(rp,buf,strlen(buf));
  2212. X
  2213. X    SetAPen(rp,WHITE);
  2214. X    Move(rp,(ripwin->Width/2)-(l/2),
  2215. X      ((tomb_line-6)*(rp->TxHeight+1))+horizon - 1);
  2216. X    Text(rp,buf,strlen(buf));
  2217. X
  2218. X    SetAPen(rp,WHITE);
  2219. X    Move(rp,(ripwin->Width/2)-(l/2),
  2220. X      ((tomb_line-6)*(rp->TxHeight+1))+horizon + 1);
  2221. X    Text(rp,buf,strlen(buf));
  2222. X
  2223. X    SetAPen(rp,BLACK);
  2224. X    Move(rp,(ripwin->Width/2)-(l/2),
  2225. X      ((tomb_line-6)*(rp->TxHeight+1))+horizon);
  2226. X    Text(rp,buf,strlen(buf));
  2227. X}
  2228. END_OF_FILE
  2229. if test 17141 -ne `wc -c <'sys/amiga/amirip.c'`; then
  2230.     echo shar: \"'sys/amiga/amirip.c'\" unpacked with wrong size!
  2231. fi
  2232. # end of 'sys/amiga/amirip.c'
  2233. fi
  2234. echo shar: End of archive 83 \(of 108\).
  2235. cp /dev/null ark83isdone
  2236. MISSING=""
  2237. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
  2238. 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \
  2239. 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 \
  2240. 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
  2241. 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 \
  2242. 101 102 103 104 105 106 107 108 ; do
  2243.     if test ! -f ark${I}isdone ; then
  2244.     MISSING="${MISSING} ${I}"
  2245.     fi
  2246. done
  2247. if test "${MISSING}" = "" ; then
  2248.     echo You have unpacked all 108 archives.
  2249.     echo "Now execute 'rebuild.sh'"
  2250.     rm -f ark10[0-8]isdone ark[1-9]isdone ark[1-9][0-9]isdone
  2251. else
  2252.     echo You still need to unpack the following archives:
  2253.     echo "        " ${MISSING}
  2254. fi
  2255. ##  End of shell archive.
  2256. exit 0
  2257.