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

  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: v16i028:  nethack31 - display oriented dungeons & dragons (Ver. 3.1), Part28/108
  5. Message-ID: <4316@master.CNA.TEK.COM>
  6. Date: 29 Jan 93 20:45:33 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 1983
  9. Approved: billr@saab.CNA.TEK.COM
  10. Xref: uunet comp.sources.games:1585
  11.  
  12. Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller)
  13. Posting-number: Volume 16, Issue 28
  14. Archive-name: nethack31/Part28
  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 28 (of 108)."
  27. # Contents:  src/pray.c sys/amiga/amiwbench.c
  28. # Wrapped by billr@saab on Wed Jan 27 16:08:57 1993
  29. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  30. if test -f 'src/pray.c' -a "${1}" != "-c" ; then 
  31.   echo shar: Will not clobber existing file \"'src/pray.c'\"
  32. else
  33. echo shar: Extracting \"'src/pray.c'\" \(41023 characters\)
  34. sed "s/^X//" >'src/pray.c' <<'END_OF_FILE'
  35. X/*    SCCS Id: @(#)pray.c    3.1    92/12/10    */
  36. X/* Copyright (c) Benson I. Margulies, Mike Stephenson, Steve Linhart, 1989. */
  37. X/* NetHack may be freely redistributed.  See license for details. */
  38. X
  39. X#include "hack.h"
  40. X#include "epri.h"
  41. X
  42. XSTATIC_PTR int NDECL(prayer_done);
  43. Xstatic int NDECL(in_trouble);
  44. Xstatic void FDECL(fix_worst_trouble,(int));
  45. Xstatic void FDECL(angrygods,(ALIGNTYP_P));
  46. Xstatic void FDECL(pleased,(ALIGNTYP_P));
  47. Xstatic void FDECL(godvoice,(ALIGNTYP_P,const char*));
  48. Xstatic void FDECL(gods_angry,(ALIGNTYP_P));
  49. Xstatic void FDECL(gods_upset,(ALIGNTYP_P));
  50. Xstatic void FDECL(consume_offering,(struct obj *));
  51. Xstatic boolean FDECL(water_prayer,(BOOLEAN_P));
  52. X
  53. X/*
  54. X * Logic behind deities and altars and such:
  55. X * + prayers are made to your god if not on an altar, and to the altar's god
  56. X *   if you are on an altar
  57. X * + If possible, your god answers all prayers, which is why bad things happen
  58. X *   if you try to pray on another god's altar
  59. X * + sacrifices work basically the same way, but the other god may decide to
  60. X *   accept your allegiance, after which they are your god.  If rejected,
  61. X *   your god takes over with your punishment.
  62. X * + if you're in Gehennom, all messages come from the chaotic god
  63. X */
  64. Xstatic
  65. Xstruct ghods {
  66. X    char    classlet;
  67. X    const char *law, *balance, *chaos;
  68. X}  gods[] = {
  69. X{'A', /* Central American */    "Quetzalcoatl", "Camaxtli", "Huhetotl"},
  70. X{'B', /* Hyborian */        "Mitra", "Crom", "Set"},
  71. X{'C', /* Babylonian */        "Anu", "Ishtar", "Anshar"},
  72. X{'E', /* Elven */        "Solonor Thelandira",
  73. X                    "Aerdrie Faenya", "Erevan Ilesere"},
  74. X{'H', /* Greek */        "Athena", "Hermes", "Poseidon"},
  75. X{'K', /* Celtic */        "Lugh", "Brigit", "Macannan Mac Lir"},
  76. X{'P', /* Chinese */        "Shan Lai Ching", "Chih Sung-tzu", "Huan Ti"},
  77. X{'R', /* Nehwon */        "Issek", "Mog", "Kos"},
  78. X{'S', /* Japanese */        "Amaterasu Omikami", "Raiden", "Susanowo"},
  79. X#ifdef TOURIST
  80. X{'T', /* Discworld */        "Blind Io", "The Lady", "Offler"},
  81. X#endif
  82. X{'V', /* Norse */        "Tyr", "Odin", "Loki"},
  83. X{'W', /* Egyptian */        "Ptah", "Thoth", "Anhur"},
  84. X{0,0,0,0}
  85. X};
  86. X
  87. X/*
  88. X *    Moloch, who dwells in Gehennom, is the "renegade" cruel god
  89. X *    responsible for the theft of the Amulet from Marduk, the Creator.
  90. X *    Moloch is unaligned.
  91. X */
  92. Xstatic const char    *Moloch = "Moloch";
  93. X
  94. Xstatic const char *godvoices[] = {
  95. X    "booms out",
  96. X    "thunders",
  97. X    "rings out",
  98. X    "booms",
  99. X};
  100. X
  101. X/* values calculated when prayer starts, and used when completed */
  102. Xstatic aligntyp p_aligntyp;
  103. Xstatic int p_trouble;
  104. Xstatic int p_type; /* (-1)-3: (-1)=really naughty, 3=really good */
  105. X
  106. X#define PIOUS 20
  107. X#define DEVOUT 14
  108. X#define FERVENT 9
  109. X#define STRIDENT 4
  110. X
  111. X#define TROUBLE_STONED 10
  112. X#define TROUBLE_STRANGLED 9
  113. X#define TROUBLE_LAVA 8
  114. X#define TROUBLE_SICK 7
  115. X#define TROUBLE_STARVING 6
  116. X#define TROUBLE_HIT 5
  117. X#define TROUBLE_LYCANTHROPE 4
  118. X#define TROUBLE_STUCK_IN_WALL 3
  119. X#define TROUBLE_CURSED_BLINDFOLD 2
  120. X#define TROUBLE_CURSED_LEVITATION 1
  121. X
  122. X#define TROUBLE_PUNISHED (-1)
  123. X#define TROUBLE_CURSED_ITEMS (-2)
  124. X#define TROUBLE_BLIND (-3)
  125. X#define TROUBLE_HUNGRY (-4)
  126. X#define TROUBLE_POISONED (-5)
  127. X#define TROUBLE_WOUNDED_LEGS (-6)
  128. X#define TROUBLE_STUNNED (-7)
  129. X#define TROUBLE_CONFUSED (-8)
  130. X#define TROUBLE_HALLUCINATION (-9)
  131. X
  132. X/* We could force rehumanize of polyselfed people, but we can't tell
  133. X   unintentional shape changes from the other kind. Oh well. */
  134. X
  135. X/* Return 0 if nothing particular seems wrong, positive numbers for
  136. X   serious trouble, and negative numbers for comparative annoyances. This
  137. X   returns the worst problem. There may be others, and the gods may fix
  138. X   more than one.
  139. X
  140. XThis could get as bizarre as noting surrounding opponents, (or hostile dogs),
  141. Xbut that's really hard.
  142. X */
  143. X
  144. X#define ugod_is_angry() (u.ualign.record < 0)
  145. X#define on_altar()    IS_ALTAR(levl[u.ux][u.uy].typ)
  146. X#define on_shrine()    ((levl[u.ux][u.uy].altarmask & AM_SHRINE) != 0)
  147. X#define a_align(x,y)    ((aligntyp)Amask2align(levl[x][y].altarmask & ~AM_SHRINE))
  148. X
  149. Xstatic int
  150. Xin_trouble()
  151. X{
  152. X    register struct obj *otmp;
  153. X    int i, j, count=0;
  154. X
  155. X/* Borrowed from eat.c */
  156. X
  157. X#define    SATIATED    0
  158. X#define NOT_HUNGRY    1
  159. X#define    HUNGRY        2
  160. X#define    WEAK        3
  161. X#define    FAINTING    4
  162. X#define FAINTED        5
  163. X#define STARVED        6
  164. X
  165. X    if(Stoned) return(TROUBLE_STONED);
  166. X    if(Strangled) return(TROUBLE_STRANGLED);
  167. X    if(u.utrap && u.utraptype == TT_LAVA) return(TROUBLE_LAVA);
  168. X    if(Sick) return(TROUBLE_SICK);
  169. X    if(u.uhs >= WEAK) return(TROUBLE_STARVING);
  170. X    if(u.uhp < 5 || (u.uhp*7 < u.uhpmax)) return(TROUBLE_HIT);
  171. X#ifdef POLYSELF
  172. X    if(u.ulycn >= 0) return(TROUBLE_LYCANTHROPE);
  173. X#endif
  174. X    for (i= -1; i<=1; i++) for(j= -1; j<=1; j++) {
  175. X        if (!i && !j) continue;
  176. X        if (!isok(u.ux+i, u.uy+j) || IS_ROCK(levl[u.ux+i][u.uy+j].typ))
  177. X            count++;
  178. X    }
  179. X    if(count==8
  180. X#ifdef POLYSELF
  181. X        && !passes_walls(uasmon)
  182. X#endif
  183. X        ) return(TROUBLE_STUCK_IN_WALL);
  184. X    if((uarmf && uarmf->otyp==LEVITATION_BOOTS && uarmf->cursed) ||
  185. X        (uleft && uleft->otyp==RIN_LEVITATION && uleft->cursed) ||
  186. X        (uright && uright->otyp==RIN_LEVITATION && uright->cursed))
  187. X        return(TROUBLE_CURSED_LEVITATION);
  188. X    if(ublindf && ublindf->cursed) return(TROUBLE_CURSED_BLINDFOLD);
  189. X
  190. X    if(Punished) return(TROUBLE_PUNISHED);
  191. X    for(otmp=invent; otmp; otmp=otmp->nobj)
  192. X        if((otmp->otyp==LOADSTONE || otmp->otyp==LUCKSTONE) &&
  193. X            otmp->cursed)
  194. X            return(TROUBLE_CURSED_ITEMS);
  195. X    if((uarmh && uarmh->cursed) ||    /* helmet */
  196. X       (uarms && uarms->cursed) ||    /* shield */
  197. X       (uarmg && uarmg->cursed) ||    /* gloves */
  198. X       (uarm && uarm->cursed) ||    /* armor */
  199. X       (uarmc && uarmc->cursed) ||    /* cloak */
  200. X       (uarmf && uarmf->cursed && uarmf->otyp != LEVITATION_BOOTS) ||
  201. X                    /* boots */
  202. X#ifdef TOURIST
  203. X       (uarmu && uarmu->cursed) ||  /* shirt */
  204. X#endif
  205. X       (welded(uwep)) ||
  206. X       (uleft && uleft->cursed && uleft->otyp != RIN_LEVITATION) ||
  207. X       (uright && uright->cursed && uright->otyp != RIN_LEVITATION) ||
  208. X       (uamul && uamul->cursed))
  209. X
  210. X       return(TROUBLE_CURSED_ITEMS);
  211. X
  212. X    if(Blinded > 1) return(TROUBLE_BLIND);
  213. X    if(u.uhs >= HUNGRY) return(TROUBLE_HUNGRY);
  214. X    for(i=0; i<A_MAX; i++)
  215. X        if(ABASE(i) < AMAX(i)) return(TROUBLE_POISONED);
  216. X    if(Wounded_legs) return (TROUBLE_WOUNDED_LEGS);
  217. X    if(HStun) return (TROUBLE_STUNNED);
  218. X    if(HConfusion) return (TROUBLE_CONFUSED);
  219. X    if(Hallucination) return(TROUBLE_HALLUCINATION);
  220. X
  221. X    return(0);
  222. X}
  223. X
  224. Xconst char leftglow[] = "left ring softly glows";
  225. Xconst char rightglow[] = "right ring softly glows";
  226. X
  227. Xstatic void
  228. Xfix_worst_trouble(trouble)
  229. Xregister int trouble;
  230. X{
  231. X    int i;
  232. X    struct obj *otmp;
  233. X    const char *what = NULL;
  234. X
  235. X    u.ublesscnt += rnz(100);
  236. X    switch (trouble) {
  237. X        case TROUBLE_STONED:
  238. X            You("feel more limber.");
  239. X            Stoned = 0;
  240. X            break;
  241. X        case TROUBLE_STRANGLED:
  242. X            You("can breathe again.");
  243. X            Strangled = 0;
  244. X            break;
  245. X        case TROUBLE_LAVA:
  246. X            You("are back on solid ground.");
  247. X            /* teleport should always succeed, but if not,
  248. X             * just untrap them.
  249. X             */
  250. X            if(!safe_teleds())
  251. X            u.utrap = 0;
  252. X            break;
  253. X        case TROUBLE_STARVING:
  254. X            losestr(-1);
  255. X            /* fall into... */
  256. X        case TROUBLE_HUNGRY:
  257. X            Your("stomach feels content.");
  258. X            init_uhunger ();
  259. X            flags.botl = 1;
  260. X            break;
  261. X        case TROUBLE_SICK:
  262. X            You("feel better.");
  263. X            make_sick(0L,FALSE);
  264. X            break;
  265. X        case TROUBLE_HIT:
  266. X            You("feel much better.");
  267. X            if (u.uhpmax < u.ulevel * 5 + 11)
  268. X            u.uhp = u.uhpmax += rnd(5);
  269. X            else
  270. X            u.uhp = u.uhpmax;
  271. X            flags.botl = 1;
  272. X            break;
  273. X        case TROUBLE_STUCK_IN_WALL:
  274. X            Your("surroundings change.");
  275. X            tele();
  276. X            break;
  277. X        case TROUBLE_CURSED_LEVITATION:
  278. X            if (uarmf && uarmf->otyp==LEVITATION_BOOTS
  279. X                        && uarmf->cursed)
  280. X            otmp = uarmf;
  281. X            else if (uleft && uleft->otyp==RIN_LEVITATION
  282. X                        && uleft->cursed) {
  283. X            otmp = uleft;
  284. X            what = leftglow;
  285. X            } else {
  286. X            otmp = uright;
  287. X            what = rightglow;
  288. X            }
  289. X            goto decurse;
  290. X        case TROUBLE_CURSED_BLINDFOLD:
  291. X            otmp = ublindf;
  292. X            goto decurse;
  293. X        case TROUBLE_PUNISHED:
  294. X            Your("chain disappears.");
  295. X            unpunish();
  296. X            break;
  297. X#ifdef POLYSELF
  298. X        case TROUBLE_LYCANTHROPE:
  299. X            You("feel purified.");
  300. X            if(uasmon == &mons[u.ulycn] && !Polymorph_control)
  301. X            rehumanize();
  302. X            u.ulycn = -1;       /* now remove the curse */
  303. X            break;
  304. X#endif
  305. X        case TROUBLE_CURSED_ITEMS:
  306. X            if (uarmh && uarmh->cursed)        /* helmet */
  307. X                otmp = uarmh;
  308. X            else if (uarms && uarms->cursed)    /* shield */
  309. X                otmp = uarms;
  310. X            else if (uarmg && uarmg->cursed)    /* gloves */
  311. X                otmp = uarmg;
  312. X            else if (uarm && uarm->cursed)    /* armor */
  313. X                otmp = uarm;
  314. X            else if (uarmc && uarmc->cursed)    /* cloak */
  315. X                otmp = uarmc;
  316. X            else if (uarmf && uarmf->cursed)    /* boots */
  317. X                otmp = uarmf;
  318. X#ifdef TOURIST
  319. X            else if (uarmu && uarmu->cursed)    /* shirt */
  320. X                otmp = uarmu;
  321. X#endif
  322. X            else if (uleft && uleft->cursed) {
  323. X                otmp = uleft;
  324. X                what = leftglow;
  325. X            } else if (uright && uright->cursed) {
  326. X                otmp = uright;
  327. X                what = rightglow;
  328. X            } else if (uamul && uamul->cursed) /* amulet */
  329. X                otmp = uamul;
  330. X            else if (welded(uwep)) otmp = uwep;
  331. X            else {
  332. X                for(otmp=invent; otmp; otmp=otmp->nobj)
  333. X                if ((otmp->otyp==LOADSTONE ||
  334. X                     otmp->otyp==LUCKSTONE) && otmp->cursed)
  335. X                    break;
  336. X            }
  337. Xdecurse:
  338. X            uncurse(otmp);
  339. X            otmp->bknown = TRUE;
  340. X            if (!Blind)
  341. X                Your("%s %s.",
  342. X                 what ? what :
  343. X                 (const char *)aobjnam (otmp, "softly glow"),
  344. X                 Hallucination ? hcolor() : amber);
  345. X            break;
  346. X        case TROUBLE_HALLUCINATION:
  347. X            pline ("Looks like you are back in Kansas.");
  348. X            make_hallucinated(0L,FALSE,0L);
  349. X            break;
  350. X        case TROUBLE_BLIND:
  351. X            Your("%s feel better.", makeplural(body_part(EYE)));
  352. X            make_blinded(0L,FALSE);
  353. X            break;
  354. X        case TROUBLE_POISONED:
  355. X            if (Hallucination)
  356. X            pline("There's a tiger in your tank.");
  357. X            else
  358. X            You("feel in good health again.");
  359. X            for(i=0; i<A_MAX; i++) {
  360. X            if(ABASE(i) < AMAX(i)) {
  361. X                ABASE(i) = AMAX(i);
  362. X                flags.botl = 1;
  363. X            }
  364. X            }
  365. X            break;
  366. X        case TROUBLE_WOUNDED_LEGS:
  367. X            heal_legs();
  368. X            break;
  369. X        case TROUBLE_STUNNED:
  370. X            make_stunned(0L,TRUE);
  371. X            break;
  372. X        case TROUBLE_CONFUSED:
  373. X            make_confused(0L,TRUE);
  374. X            break;
  375. X    }
  376. X}
  377. X
  378. Xstatic void
  379. Xangrygods(resp_god)
  380. Xaligntyp resp_god;
  381. X{
  382. X    register int    maxanger;
  383. X
  384. X    if(Inhell) resp_god = A_NONE;
  385. X    u.ublessed = 0;
  386. X
  387. X    /* changed from tmp = u.ugangr + abs (u.uluck) -- rph */
  388. X    /* added test for alignment diff -dlc */
  389. X    if(resp_god != u.ualign.type)
  390. X        maxanger =  u.ualign.record/2 + (Luck > 0 ? -Luck/3 : -Luck);
  391. X    else
  392. X        maxanger =  3*u.ugangr +
  393. X        ((Luck > 0 || u.ualign.record >= STRIDENT) ? -Luck/3 : -Luck);
  394. X    if (maxanger < 0) maxanger = 0; /* possible if bad align & good luck */
  395. X    maxanger =  (maxanger > 15 ? 15 : maxanger);  /* be reasonable */
  396. X    switch (maxanger ? rn2(maxanger): 0) {
  397. X
  398. X        case 0:
  399. X        case 1:    You("feel that %s is %s.", align_gname(resp_god),
  400. X                Hallucination ? "bummed" : "displeased");
  401. X            break;
  402. X        case 2:
  403. X        case 3:
  404. X            godvoice(resp_god,NULL);
  405. X# ifdef POLYSELF
  406. X            pline("\"Thou %s, %s.\"",
  407. X                  ugod_is_angry() ? "hast strayed from the path" :
  408. X                        "art arrogant",
  409. X                  u.usym == S_HUMAN ? "mortal" : "creature");
  410. X# else
  411. X            pline("\"Thou %s, mortal.\"",
  412. X                  ugod_is_angry() ? "hast strayed from the path" :
  413. X                        "art arrogant");
  414. X# endif
  415. X            verbalize("Thou must relearn thy lessons!");
  416. X            (void) adjattrib(A_WIS, -1, FALSE);
  417. X            if (u.ulevel > 1) {
  418. X                losexp();
  419. X                if(u.uhp < 1) u.uhp = 1;
  420. X                if(u.uhpmax < 1) u.uhpmax = 1;
  421. X            } else  {
  422. X                u.uexp = 0;
  423. X                flags.botl = 1;
  424. X            }
  425. X            break;
  426. X        case 6:    if (!Punished) {
  427. X                gods_angry(resp_god);
  428. X                punish((struct obj *)0);
  429. X                break;
  430. X            } /* else fall thru */
  431. X        case 4:
  432. X        case 5:    gods_angry(resp_god);
  433. X            if (!Blind && !Antimagic)
  434. X                pline("%s glow surrounds you.",
  435. X                  An(Hallucination ? hcolor() : Black));
  436. X            rndcurse();
  437. X            break;
  438. X        case 7:
  439. X        case 8:    godvoice(resp_god,NULL);
  440. X            verbalize("Thou durst %s me?",
  441. X                  (on_altar() &&
  442. X                   (a_align(u.ux,u.uy) != resp_god)) ?
  443. X                  "scorn":"call upon");
  444. X# ifdef POLYSELF
  445. X            pline("\"Then die, %s!\"",
  446. X                  u.usym == S_HUMAN ? "mortal" : "creature");
  447. X# else
  448. X            verbalize("Then die, mortal!");
  449. X# endif
  450. X
  451. X            summon_minion(resp_god, FALSE);
  452. X            break;
  453. X
  454. X        default:    gods_angry(resp_god);
  455. X            pline("Suddenly, a bolt of lightning strikes you!");
  456. X            if (Reflecting) {
  457. X                shieldeff(u.ux, u.uy);
  458. X                if (Blind)
  459. X                pline("For some reason you're unaffected.");
  460. X                else {
  461. X                if (Reflecting & W_AMUL) {
  462. X                    pline("It reflects from your medallion.");
  463. X                    makeknown(AMULET_OF_REFLECTION);
  464. X                } else {
  465. X                    pline("It reflects from your shield.");
  466. X                    makeknown(SHIELD_OF_REFLECTION);
  467. X                }
  468. X                }
  469. X                goto ohno;
  470. X            } else if (Shock_resistance) {
  471. X                shieldeff(u.ux, u.uy);
  472. X                pline("It seems not to affect you.");
  473. Xohno:
  474. X                pline("%s is not deterred...",
  475. X                  align_gname(resp_god));
  476. X                pline("A wide-angle disintegration beam hits you!");
  477. X                if (Disint_resistance) {
  478. X                You("bask in its %s glow for a minute...",
  479. X                    Black);
  480. X                godvoice(resp_god, "I believe it not!");
  481. X                break;
  482. X                }
  483. X            }
  484. X            {
  485. X                char killerbuf[64];
  486. X                You("fry to a crisp.");
  487. X                killer_format = KILLED_BY;
  488. X                Sprintf(killerbuf, "the wrath of %s",
  489. X                    align_gname(resp_god));
  490. X                killer = killerbuf;
  491. X                done(DIED);
  492. X            }
  493. X            break;
  494. X    }
  495. X    u.ublesscnt = rnz(300);
  496. X    return;
  497. X}
  498. X
  499. Xstatic void
  500. Xpleased(g_align)
  501. X    aligntyp g_align;
  502. X{
  503. X    int trouble = p_trouble;    /* what's your worst difficulty? */
  504. X    int pat_on_head = 0;
  505. X
  506. X    You("feel that %s is %s.", align_gname(g_align),
  507. X        u.ualign.record >= DEVOUT ?
  508. X        Hallucination ? "pleased as punch" : "well-pleased" :
  509. X        u.ualign.record >= STRIDENT ?
  510. X        Hallucination ? "ticklish" : "pleased" :
  511. X        Hallucination ? "full" : "satisfied");
  512. X
  513. X    /* not your deity */
  514. X    if (on_altar() && p_aligntyp != u.ualign.type) {
  515. X        adjalign(-1);
  516. X        return;
  517. X    } else if (u.ualign.record < 2) adjalign(1);
  518. X
  519. X    /* depending on your luck & align level, the god you prayed to will:
  520. X       - fix your worst problem if it's major.
  521. X       - fix all your major problems.
  522. X       - fix your worst problem if it's minor.
  523. X       - fix all of your problems.
  524. X       - do you a gratuitous favor.
  525. X
  526. X       if you make it to the the last category, you roll randomly again
  527. X       to see what they do for you.
  528. X
  529. X       If your luck is at least 0, then you are guaranteed rescued
  530. X       from your worst major problem. */
  531. X
  532. X    if (!trouble && u.ualign.record >= DEVOUT) pat_on_head = 1;
  533. X    else {
  534. X        int action = rn1(on_altar() ? 3 + on_shrine() : 2, Luck+1);
  535. X
  536. X        if (!on_altar()) action = max(action,2);
  537. X        if (u.ualign.record < STRIDENT)
  538. X        action = (u.ualign.record > 0 || !rnl(2)) ? 1 : 0;
  539. X
  540. X        switch(min(action,5)) {
  541. X        case 5: pat_on_head = 1;
  542. X        case 4: do fix_worst_trouble(trouble);
  543. X            while ((trouble = in_trouble()) != 0);
  544. X            break;
  545. X
  546. X        case 3: fix_worst_trouble(trouble);
  547. X        case 2: while ((trouble = in_trouble()) > 0)
  548. X            fix_worst_trouble(trouble);
  549. X            break;
  550. X
  551. X        case 1: if (trouble > 0) fix_worst_trouble(trouble);
  552. X        case 0: break; /* your god blows you off, too bad */
  553. X        }
  554. X    }
  555. X
  556. X    if(pat_on_head)
  557. X    switch(rn2((Luck + 6)>>1)) {
  558. X    case 0:    break;
  559. X    case 1:
  560. X        if (uwep && (welded(uwep) || uwep->oclass == WEAPON_CLASS ||
  561. X             uwep->otyp == PICK_AXE) && (!uwep->blessed)) {
  562. X        if (uwep->cursed) {
  563. X            uwep->cursed = FALSE;
  564. X            uwep->bknown = TRUE;
  565. X            if (!Blind)
  566. X            Your("%s %s.", aobjnam(uwep, "softly glow"),
  567. X                 Hallucination ? hcolor() : amber);
  568. X            else You("feel the power of %s over your %s.",
  569. X            u_gname(), xname(uwep));
  570. X        } else if(uwep->otyp < BOW) {
  571. X            uwep->blessed = uwep->bknown = TRUE;
  572. X            if (!Blind)
  573. X            Your("%s with %s aura.",
  574. X                 aobjnam(uwep, "softly glow"),
  575. X                 an(Hallucination ? hcolor() : light_blue));
  576. X            else You("feel the blessing of %s over your %s.",
  577. X            u_gname(), xname(uwep));
  578. X        }
  579. X        }
  580. X        break;
  581. X    case 3:
  582. X        /* takes 2 hints to get the music to enter the stronghold */
  583. X        if (flags.soundok && !u.uevent.uopened_dbridge) {
  584. X        if(u.uevent.uheard_tune < 1) {
  585. X            godvoice(g_align,NULL);
  586. X#ifdef POLYSELF
  587. X            verbalize("Hark, %s!",
  588. X              u.usym == S_HUMAN ? "mortal" : "creature");
  589. X#else
  590. X            verbalize("Hark, mortal!");
  591. X#endif
  592. X            verbalize(
  593. X            "To enter the castle, thou must play the right tune!");
  594. X            u.uevent.uheard_tune++;
  595. X            break;
  596. X        } else if (u.uevent.uheard_tune < 2) {
  597. X            You(Hallucination ? "hear a funeral march..." : "hear a divine music...");
  598. X            pline("It sounds like:  \"%s\".", tune);
  599. X            u.uevent.uheard_tune++;
  600. X            break;
  601. X        }
  602. X        }
  603. X        /* Otherwise, falls into next case */
  604. X    case 2:
  605. X        if (!Blind)
  606. X        You("are surrounded by %s glow.",
  607. X            an(Hallucination ? hcolor() : golden));
  608. X        u.uhp = u.uhpmax += 5;
  609. X        ABASE(A_STR) = AMAX(A_STR);
  610. X        if (u.uhunger < 900)    init_uhunger();
  611. X        if (u.uluck < 0)    u.uluck = 0;
  612. X        make_blinded(0L,TRUE);
  613. X        flags.botl = 1;
  614. X        break;
  615. X    case 4: {
  616. X        register struct obj *otmp;
  617. X
  618. X        if (Blind)
  619. X        You("feel the power of %s.", u_gname());
  620. X        else You("are surrounded by %s aura.",
  621. X             an(Hallucination ? hcolor() : light_blue));
  622. X        for(otmp=invent; otmp; otmp=otmp->nobj) {
  623. X        if (otmp->cursed) {
  624. X            uncurse(otmp);
  625. X            if (!Blind) {
  626. X            Your("%s %s.", aobjnam(otmp, "softly glow"),
  627. X                 Hallucination ? hcolor() : amber);
  628. X            otmp->bknown = TRUE;
  629. X            }
  630. X        }
  631. X        }
  632. X        break;
  633. X    }
  634. X    case 5: {
  635. X        const char *msg="\"and thus I grant thee the gift of %s!\"";
  636. X        godvoice(u.ualign.type, "Thou hast pleased me with thy progress,");
  637. X        if (!(HTelepat & INTRINSIC))  {
  638. X        HTelepat |= FROMOUTSIDE;
  639. X        pline(msg, "Telepathy");
  640. X        if (Blind) see_monsters();
  641. X        } else if (!(Fast & INTRINSIC))  {
  642. X        Fast |= FROMOUTSIDE;
  643. X        pline(msg, "Speed");
  644. X        } else if (!(Stealth & INTRINSIC))  {
  645. X        Stealth |= FROMOUTSIDE;
  646. X        pline(msg, "Stealth");
  647. X        } else {
  648. X        if (!(Protection & INTRINSIC))  {
  649. X            Protection |= FROMOUTSIDE;
  650. X            if (!u.ublessed)  u.ublessed = rn1(3, 2);
  651. X        } else u.ublessed++;
  652. X        pline(msg, "my protection");
  653. X        }
  654. X        verbalize("Use it wisely in my name!");
  655. X        break;
  656. X    }
  657. X    case 7:
  658. X    case 8:
  659. X#ifdef ELBERETH
  660. X        if (u.ualign.record >= PIOUS && !u.uevent.uhand_of_elbereth) {
  661. X        register struct obj *obj = uwep;    /* to be blessed */
  662. X        boolean already_exists, in_hand;
  663. X
  664. X        u.uevent.uhand_of_elbereth = TRUE;
  665. X        HSee_invisible |= FROMOUTSIDE;
  666. X        HFire_resistance |= FROMOUTSIDE;
  667. X        HCold_resistance |= FROMOUTSIDE;
  668. X        HPoison_resistance |= FROMOUTSIDE;
  669. X        godvoice(u.ualign.type,NULL);
  670. X
  671. X        switch(u.ualign.type) {
  672. X        case A_LAWFUL:
  673. X            verbalize("I crown thee...      The Hand of Elbereth!");
  674. X            if (obj && (obj->otyp == LONG_SWORD) && !obj->oartifact)
  675. X            obj = oname(obj, artiname(ART_EXCALIBUR), 1);
  676. X            break;
  677. X        case A_NEUTRAL:
  678. X            verbalize("Thou shalt be my Envoy of Balance!");
  679. X            if (uwep && uwep->oartifact == ART_VORPAL_BLADE) {
  680. X            obj = uwep;    /* to be blessed and rustproofed */
  681. X            Your("%s goes snicker-snack!", xname(obj));
  682. X            obj->dknown = TRUE;
  683. X            } else if (!exist_artifact(LONG_SWORD,
  684. X                        artiname(ART_VORPAL_BLADE))) {
  685. X                obj = mksobj(LONG_SWORD, FALSE, FALSE);
  686. X            obj = oname(obj, artiname(ART_VORPAL_BLADE), 0);
  687. X                pline("%s %s %s your %s!", Blind ? "Something" : "A",
  688. X                  Blind ? "lands" : "sword appears",
  689. X                  Levitation ? "beneath" : "at",
  690. X                  makeplural(body_part(FOOT)));
  691. X            obj->spe = 1;
  692. X            dropy(obj);
  693. X            }
  694. X            break;
  695. X        case A_CHAOTIC:
  696. X            /* This does the same damage as Excalibur.
  697. X             * Disadvantages: doesn't do bonuses to undead;
  698. X             *   doesn't aid searching.
  699. X             * Advantage: part of that bonus is a level drain.
  700. X             * Disadvantage: player cannot start with a +5 weapon and
  701. X             * turn it into a Stormbringer.
  702. X             * Advantage: they don't need to already have a sword of
  703. X             *   the right type to get it...
  704. X             * However, if Stormbringer already exists in the game, an
  705. X             * ordinary good broadsword is given and the messages are
  706. X             * a bit different.
  707. X             */
  708. X            in_hand = (uwep && uwep->oartifact == ART_STORMBRINGER);
  709. X            already_exists = exist_artifact(RUNESWORD,
  710. X                        artiname(ART_STORMBRINGER));
  711. X            verbalize("Thou art chosen to %s for My Glory!",
  712. X                  already_exists && !in_hand ?
  713. X                  "take lives" : "steal souls");
  714. X            if (in_hand) {
  715. X            obj = uwep;    /* to be blessed and rustproofed */
  716. X            } else if (!already_exists) {
  717. X                obj = mksobj(RUNESWORD, FALSE, FALSE);
  718. X            obj = oname(obj, artiname(ART_STORMBRINGER), 0);
  719. X                pline("%s %s %s your %s!", Blind ? "Something" :
  720. X                  An(Hallucination ? hcolor() : Black),
  721. X                  Blind ? "lands" : "sword appears",
  722. X                  Levitation ? "beneath" : "at",
  723. X                  makeplural(body_part(FOOT)));
  724. X            obj->spe = 1;
  725. X            dropy(obj);
  726. X            }
  727. X            break;
  728. X        default:
  729. X            obj = 0;    /* lint */
  730. X            break;
  731. X        }
  732. X        /* enhance weapon regardless of alignment or artifact status */
  733. X        if (obj && (obj->oclass == WEAPON_CLASS)) {
  734. X            bless(obj);
  735. X            obj->oeroded = 0;
  736. X            obj->oerodeproof = TRUE;
  737. X            obj->bknown = obj->rknown = TRUE;
  738. X            if (obj->spe < 1) obj->spe = 1;
  739. X        } else    /* opportunity knocked, but there was nobody home... */
  740. X            You("feel unworthy.");
  741. X        break;
  742. X        }
  743. X#endif
  744. X
  745. X    case 6:    pline ("An object appears at your %s!",
  746. X               makeplural(body_part(FOOT)));
  747. X        bless(mkobj_at(SPBOOK_CLASS, u.ux, u.uy, TRUE));
  748. X        break;
  749. X
  750. X    default:    impossible("Confused deity!");
  751. X        break;
  752. X    }
  753. X    u.ublesscnt = rnz(350);
  754. X#ifndef ELBERETH
  755. X    u.ublesscnt += (u.uevent.udemigod * rnz(1000));
  756. X#else
  757. X    u.ublesscnt += ((u.uevent.udemigod + u.uevent.uhand_of_elbereth)
  758. X                            * rnz(1000));
  759. X#endif
  760. X    return;
  761. X}
  762. X
  763. X/* either blesses or curses water on the altar,
  764. X * returns true if it found any water here.
  765. X */
  766. Xstatic boolean
  767. Xwater_prayer(bless_water)
  768. X    boolean bless_water;
  769. X{
  770. X    register struct obj* otmp;
  771. X    register long changed = 0;
  772. X    boolean other = FALSE;
  773. X
  774. X    for(otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp->nexthere) {
  775. X    /* turn water into (un)holy water */
  776. X    if (otmp->otyp == POT_WATER) {
  777. X        otmp->blessed = bless_water;
  778. X        otmp->cursed = !bless_water;
  779. X        otmp->bknown = !Blind;
  780. X        changed += otmp->quan;
  781. X    } else if(otmp->oclass == POTION_CLASS)
  782. X        other = TRUE;
  783. X    }
  784. X    if(!Blind && changed) {
  785. X    pline("%s potion%s on the altar glow%s %s for a moment.",
  786. X          ((other && changed > 1L) ? "Some of the" : (other ? "A" : "The")),
  787. X          (changed > 1L ? "s" : ""), (changed > 1L ? "" : "s"),
  788. X          (bless_water ? amber : Black));
  789. X    }
  790. X    return (changed > 0L);
  791. X}
  792. X
  793. Xstatic void
  794. Xgodvoice(g_align, words)
  795. X    aligntyp g_align;
  796. X    const char *words;
  797. X{
  798. X    const char *quot = "";
  799. X    if(words)
  800. X    quot = "\"";
  801. X    else
  802. X    words = "";
  803. X
  804. X    pline("The voice of %s %s: %s%s%s", align_gname(g_align),
  805. X      godvoices[rn2(SIZE(godvoices))], quot, words, quot);
  806. X}
  807. X
  808. Xstatic void
  809. Xgods_angry(g_align)
  810. X    aligntyp g_align;
  811. X{
  812. X    godvoice(g_align, "Thou hast angered me.");
  813. X}
  814. X
  815. X/* The g_align god is upset with you. */
  816. Xstatic void
  817. Xgods_upset(g_align)
  818. X    aligntyp g_align;
  819. X{
  820. X    if(g_align == u.ualign.type) u.ugangr++;
  821. X    else if(u.ugangr) u.ugangr--;
  822. X    angrygods(g_align);
  823. X}
  824. X
  825. Xstatic const char NEARDATA sacrifice_types[] = { FOOD_CLASS, AMULET_CLASS, 0 };
  826. X
  827. Xstatic void
  828. Xconsume_offering(otmp)
  829. Xregister struct obj *otmp;
  830. X{
  831. X    if (Hallucination)
  832. X    switch (rn2(3)) {
  833. X        case 0:
  834. X        Your("sacrifice sprouts wings and a propeller and roars away!");
  835. X        break;
  836. X        case 1:
  837. X        Your("sacrifice puffs up, swelling bigger and bigger, and pops!");
  838. X        break;
  839. X        case 2:
  840. X        Your("sacrifice collapses into a cloud of dancing particles and fades away!");
  841. X        break;
  842. X    }
  843. X    else if (Blind && u.ualign.type == A_LAWFUL)
  844. X    Your("sacrifice disappears!");
  845. X    else Your("sacrifice is consumed in a %s!",
  846. X          u.ualign.type == A_LAWFUL ? "flash of light" : "burst of flame");
  847. X    if (carried(otmp)) useup(otmp);
  848. X    else useupf(otmp);
  849. X    exercise(A_WIS, TRUE);
  850. X}
  851. X
  852. Xint
  853. Xdosacrifice()
  854. X{
  855. X    register struct obj *otmp;
  856. X    int value = 0;
  857. X    aligntyp altaralign = a_align(u.ux,u.uy);
  858. X
  859. X    if (!on_altar()) {
  860. X    You("are not standing on an altar.");
  861. X    return 0;
  862. X    }
  863. X
  864. X    if (In_endgame(&u.uz)) {
  865. X    if (!(otmp = getobj(sacrifice_types, "sacrifice"))) return 0;
  866. X    } else
  867. X    if (!(otmp = floorfood("sacrifice", 0))) return 0;
  868. X
  869. X    /*
  870. X      Was based on nutritional value and aging behavior (< 50 moves).
  871. X      Sacrificing a food ration got you max luck instantly, making the
  872. X      gods as easy to please as an angry dog!
  873. X
  874. X      Now only accepts corpses, based on the games evaluation of their
  875. X      toughness.  Human sacrifice, as well as sacrificing unicorns of
  876. X      your alignment, is strongly discouraged.  (We can't tell whether
  877. X      a pet corpse was tame, so you can still sacrifice it.)
  878. X     */
  879. X
  880. X#define MAXVALUE 24 /* Highest corpse value (besides Wiz) */
  881. X
  882. X    if (otmp->otyp == CORPSE) {
  883. X    register struct permonst *ptr = &mons[otmp->corpsenm];
  884. X    extern int monstr[];
  885. X
  886. X    if (otmp->corpsenm == PM_ACID_BLOB || (monstermoves <= otmp->age + 50))
  887. X        value = monstr[otmp->corpsenm] + 1;
  888. X    if (otmp->oeaten)
  889. X        value = eaten_stat(value, otmp);
  890. X
  891. X    if ((pl_character[0]=='E') ? is_elf(ptr) : is_human(ptr)) {
  892. X#ifdef POLYSELF
  893. X        if (is_demon(uasmon)) {
  894. X        You("find the idea very satisfying.");
  895. X        exercise(A_WIS, TRUE);
  896. X        } else
  897. X#endif
  898. X        if (u.ualign.type != A_CHAOTIC) {
  899. X            pline("You'll regret this infamous offense!");
  900. X            exercise(A_WIS, FALSE);
  901. X        }
  902. X
  903. X        if (altaralign != A_CHAOTIC) {
  904. X        /* curse the lawful/neutral altar */
  905. X        pline("The altar is stained with %sn blood.",
  906. X              (pl_character[0]=='E') ? "elve" : "huma");
  907. X        levl[u.ux][u.uy].altarmask = AM_CHAOTIC;
  908. X        angry_priest();
  909. X        } else {
  910. X        register struct monst *dmon;
  911. X        /* Human sacrifice on a chaotic altar is equivalent */
  912. X        /* to demon summoning */
  913. X        if(u.ualign.type != A_CHAOTIC) {
  914. X        pline("The blood floods the altar, which vanishes in %s cloud!",
  915. X              an(Hallucination ? hcolor() : Black));
  916. X            levl[u.ux][u.uy].typ = ROOM;
  917. X            levl[u.ux][u.uy].altarmask = 0;
  918. X            if(Invisible) newsym(u.ux, u.uy);
  919. X        } else {
  920. X            pline("The blood covers the altar!");
  921. X            change_luck(2);
  922. X        }
  923. X        if ((dmon = makemon(&mons[dlord()], u.ux, u.uy)) != 0) {
  924. X            You("have summoned %s!", a_monnam(dmon));
  925. X            if (u.ualign.type == A_CHAOTIC)
  926. X            dmon->mpeaceful = TRUE;
  927. X            You("are terrified, and unable to move.");
  928. X            nomul(-3);
  929. X        } else pline("The cloud dissipates.");
  930. X        }
  931. X
  932. X        if (u.ualign.type != A_CHAOTIC) {
  933. X        adjalign(-5);
  934. X        u.ugangr += 3;
  935. X        (void) adjattrib(A_WIS, -1, TRUE);
  936. X        if (!Inhell) angrygods(u.ualign.type);
  937. X        change_luck(-5);
  938. X        } else adjalign(5);
  939. X        if (carried(otmp)) useup(otmp);
  940. X        else useupf(otmp);
  941. X        return(1);
  942. X    } else if (is_undead(ptr)) { /* Not demons--no demon corpses */
  943. X        if (u.ualign.type != A_CHAOTIC)
  944. X        value += 1;
  945. X    } else if (ptr->mlet == S_UNICORN) {
  946. X        int unicalign = sgn(ptr->maligntyp);
  947. X
  948. X        /* If same as altar, always a very bad action. */
  949. X        if (unicalign == altaralign) {
  950. X        pline("Such an action is an insult to %s!",
  951. X              (unicalign == A_CHAOTIC)
  952. X              ? "chaos" : unicalign ? "law" : "balance");
  953. X        (void) adjattrib(A_WIS, -1, TRUE);
  954. X        value = -5;
  955. X        } else if (u.ualign.type == altaralign) {
  956. X        /* If different from altar, and altar is same as yours, */
  957. X        /* it's a very good action */
  958. X        if (u.ualign.record < ALIGNLIM)
  959. X            You("feel appropriately %s.", align_str(u.ualign.type));
  960. X        else You("feel you are thoroughly on the right path.");
  961. X        adjalign(5);
  962. X        value += 3;
  963. X        } else
  964. X        /* If sacrificing unicorn of your alignment to altar not of */
  965. X        /* your alignment, your god gets angry and it's a conversion */
  966. X        if (unicalign == u.ualign.type) {
  967. X            u.ualign.record = -1;
  968. X            value = 1;
  969. X        } else value += 3;
  970. X    }
  971. X    }
  972. X
  973. X    if (otmp->otyp == AMULET_OF_YENDOR) {
  974. X    if (!In_endgame(&u.uz)) {
  975. X        if (Hallucination)
  976. X            You("feel homesick.");
  977. X        else
  978. X            You("feel an urge to return to the surface.");
  979. X        return 1;
  980. X    } else {
  981. X        /* The final Test.    Did you win? */
  982. X        if(uamul == otmp) Amulet_off();
  983. X        if(carried(otmp)) useup(otmp); /* well, it's gone now */
  984. X        else useupf(otmp);
  985. X        You("offer the Amulet of Yendor to %s...", a_gname());
  986. X        if (u.ualign.type != altaralign) {
  987. X        /* And the opposing team picks you up and
  988. X           carries you off on their shoulders */
  989. X        adjalign(-99);
  990. X        pline("%s accepts your gift, and gains dominion over %s...",
  991. X              a_gname(), u_gname());
  992. X        pline("%s is enraged...", u_gname());
  993. X        pline("Fortunately, %s permits you to live...", a_gname());
  994. X        pline("A cloud of %s smoke surrounds you...",
  995. X              Hallucination ? hcolor() : (const char *)"orange");
  996. X        done(ESCAPED);
  997. X        } else { /* super big win */
  998. X        adjalign(10);
  999. Xpline("An invisible choir sings, and you are bathed in radiance...");
  1000. X        godvoice(altaralign, "Congratulations, mortal!");
  1001. X        display_nhwindow(WIN_MESSAGE, FALSE);
  1002. Xverbalize("In return for thy service, I grant thee the gift of Immortality!");
  1003. X        You("ascend to the status of Demigod%s...",
  1004. X            flags.female ? "dess" : "");
  1005. X        done(ASCENDED);
  1006. X        }
  1007. X    }
  1008. X    }
  1009. X
  1010. X    if (otmp->otyp == FAKE_AMULET_OF_YENDOR) {
  1011. X        if (flags.soundok)
  1012. X        You("hear a nearby thunderclap.");
  1013. X        if (!otmp->known) {
  1014. X        You("realize you have made a %s.",
  1015. X            Hallucination ? "boo-boo" : "mistake");
  1016. X        otmp->known = TRUE;
  1017. X        change_luck(-1);
  1018. X        return 1;
  1019. X        } else {
  1020. X        /* don't you dare try to fool the gods */
  1021. X        change_luck(-3);
  1022. X        adjalign(-1);
  1023. X        u.ugangr += 3;
  1024. X        value = -3;
  1025. X        }
  1026. X    }
  1027. X
  1028. X    if (value == 0) {
  1029. X    pline(nothing_happens);
  1030. X    return (1);
  1031. X    }
  1032. X
  1033. X    if (value < 0) /* I don't think the gods are gonna like this... */
  1034. X    gods_upset(altaralign);
  1035. X    else {
  1036. X    int saved_anger = u.ugangr;
  1037. X    int saved_cnt = u.ublesscnt;
  1038. X    int saved_luck = u.uluck;
  1039. X
  1040. X    /* Sacrificing at an altar of a different alignment */
  1041. X    if (u.ualign.type != altaralign) {
  1042. X        /* Is this a conversion ? */
  1043. X        if(ugod_is_angry()) {
  1044. X        if(u.ualignbase[0] == u.ualignbase[1] &&
  1045. X           altaralign != A_NONE) {
  1046. X            You("have a strong feeling that %s is angry...", u_gname());
  1047. X            consume_offering(otmp);
  1048. X            pline("%s accepts your allegiance.", a_gname());
  1049. X            You("have a sudden sense of a new direction.");
  1050. X
  1051. X            /* The player wears a helm of opposite alignment? */
  1052. X            if (uarmh && uarmh->otyp == HELM_OF_OPPOSITE_ALIGNMENT)
  1053. X            u.ualignbase[0] = altaralign;
  1054. X            else
  1055. X            u.ualign.type = u.ualignbase[0] = altaralign;
  1056. X            flags.botl = 1;
  1057. X            /* Beware, Conversion is costly */
  1058. X            change_luck(-3);
  1059. X            u.ublesscnt += 300;
  1060. X            adjalign((int)(u.ualignbase[1] * (ALIGNLIM / 2)));
  1061. X        } else {
  1062. X            pline("%s rejects your sacrifice!", a_gname());
  1063. X            godvoice(altaralign, "Suffer, infidel!");
  1064. X            adjalign(-5);
  1065. X            u.ugangr += 3;
  1066. X            (void) adjattrib(A_WIS, -2, TRUE);
  1067. X            if (!Inhell) angrygods(u.ualign.type);
  1068. X            change_luck(-5);
  1069. X        }
  1070. X        return(1);
  1071. X        } else {
  1072. X        consume_offering(otmp);
  1073. X        You("sense a conflict between %s and %s.",
  1074. X            u_gname(), a_gname());
  1075. X        if (rn2(8 + (int)u.ulevel) > 5) {
  1076. X            struct monst *pri;
  1077. X            You("feel the power of %s increase.", u_gname());
  1078. X            exercise(A_WIS, TRUE);
  1079. X            change_luck(1);
  1080. X            /* Yes, this is supposed to be &=, not |= */
  1081. X            levl[u.ux][u.uy].altarmask &= AM_SHRINE;
  1082. X            /* the following accommodates stupid compilers */
  1083. X            levl[u.ux][u.uy].altarmask =
  1084. X            levl[u.ux][u.uy].altarmask | (Align2amask(u.ualign.type));
  1085. X            if (!Blind)
  1086. X            pline("The altar glows %s.",
  1087. X                  Hallucination ? hcolor() :
  1088. X                  u.ualign.type == A_LAWFUL ? White :
  1089. X                  u.ualign.type ? Black : (const char *)"gray");
  1090. X
  1091. X            if(rnl((int)u.ulevel) > 6 && u.ualign.record > 0 &&
  1092. X               rnd(u.ualign.record) > (3*ALIGNLIM)/4)
  1093. X            summon_minion(altaralign, TRUE);
  1094. X            /* anger priest; test handles bones files */
  1095. X            if((pri = findpriest(temple_occupied(u.urooms))) &&
  1096. X               !p_coaligned(pri))
  1097. X            angry_priest();
  1098. X        } else {
  1099. X            pline("Unluckily, you feel the power of %s decrease.",
  1100. X              u_gname());
  1101. X            change_luck(-1);
  1102. X            exercise(A_WIS, FALSE);
  1103. X            if(rnl((int)u.ulevel) > 6 && u.ualign.record > 0 &&
  1104. X               rnd(u.ualign.record) > (7*ALIGNLIM)/8)
  1105. X            summon_minion(altaralign, TRUE);
  1106. X        }
  1107. X        return(1);
  1108. X        }
  1109. X    }
  1110. X
  1111. X    consume_offering(otmp);
  1112. X    /* OK, you get brownie points. */
  1113. X    if(u.ugangr) {
  1114. X        u.ugangr -=
  1115. X        ((value * (u.ualign.type == A_CHAOTIC ? 2 : 3)) / MAXVALUE);
  1116. X        if(u.ugangr < 0) u.ugangr = 0;
  1117. X        if(u.ugangr != saved_anger) {
  1118. X        if (u.ugangr) {
  1119. X            pline("%s seems %s.", u_gname(),
  1120. X              Hallucination ? "groovy" : "slightly mollified");
  1121. X
  1122. X            if ((int)u.uluck < 0) change_luck(1);
  1123. X        } else {
  1124. X            pline("%s seems %s.", u_gname(), Hallucination ?
  1125. X              "cosmic (not a new fact)" : "mollified");
  1126. X
  1127. X            if ((int)u.uluck < 0) u.uluck = 0;
  1128. X        }
  1129. X        } else { /* not satisfied yet */
  1130. X        if (Hallucination)
  1131. X            pline("The gods seem tall.");
  1132. X        else You("have a feeling of inadequacy.");
  1133. X        }
  1134. X    } else if(ugod_is_angry()) {
  1135. X        if(value > MAXVALUE) value = MAXVALUE;
  1136. X        if(value > -u.ualign.record) value = -u.ualign.record;
  1137. X        adjalign(value);
  1138. X        You("feel partially absolved.");
  1139. X    } else if (u.ublesscnt > 0) {
  1140. X        u.ublesscnt -=
  1141. X        ((value * (u.ualign.type == A_CHAOTIC ? 500 : 300)) / MAXVALUE);
  1142. X        if(u.ublesscnt < 0) u.ublesscnt = 0;
  1143. X        if(u.ublesscnt != saved_cnt) {
  1144. X        if (u.ublesscnt) {
  1145. X            if (Hallucination)
  1146. X            You("realize that the gods are not like you and I.");
  1147. X            else
  1148. X            You("have a hopeful feeling.");
  1149. X            if ((int)u.uluck < 0) change_luck(1);
  1150. X        } else {
  1151. X            if (Hallucination)
  1152. X            pline("Overall, there is a smell of fried onions.");
  1153. X            else
  1154. X            You("have a feeling of reconciliation.");
  1155. X            if ((int)u.uluck < 0) u.uluck = 0;
  1156. X        }
  1157. X        }
  1158. X    } else {
  1159. X        int nartifacts = nartifact_exist();
  1160. X
  1161. X        /* you were already in pretty good standing */
  1162. X        /* The player can gain an artifact */
  1163. X        /* The chance goes down as the number of artifacts goes up */
  1164. X        if (u.ulevel > 2 && !rn2(10 + (2 * nartifacts * nartifacts))) {
  1165. X        otmp = mk_artifact((struct obj *)0, a_align(u.ux,u.uy));
  1166. X        if (otmp) {
  1167. X            if (otmp->spe < 0) otmp->spe = 0;
  1168. X            if (otmp->cursed) uncurse(otmp);
  1169. X            dropy(otmp);
  1170. X            pline("An object appears at your %s!",
  1171. X              makeplural(body_part(FOOT)));
  1172. X            godvoice(u.ualign.type, "Use my gift wisely!");
  1173. X            u.ublesscnt = rnz(300 + (50 * nartifacts));
  1174. X            exercise(A_WIS, TRUE);
  1175. X            return(1);
  1176. X        }
  1177. X        }
  1178. X        change_luck((value * LUCKMAX) / (MAXVALUE * 2));
  1179. X        if (u.uluck != saved_luck) {
  1180. X        if (Blind)
  1181. X            You("think something brushed your %s.", body_part(FOOT));
  1182. X        else You(Hallucination ?
  1183. X            "see crabgrass at your %s.  A funny thing in a dungeon." :
  1184. X            "glimpse a four-leaf clover at your %s.",
  1185. X            makeplural(body_part(FOOT)));
  1186. X        }
  1187. X    }
  1188. X    }
  1189. X    return(1);
  1190. X}
  1191. X
  1192. Xint
  1193. Xdopray()
  1194. X{
  1195. X    int alignment;
  1196. X
  1197. X    p_aligntyp = on_altar() ? a_align(u.ux,u.uy) : u.ualign.type;
  1198. X    p_trouble = in_trouble();
  1199. X
  1200. X#ifdef POLYSELF
  1201. X    if (is_demon(uasmon) && (p_aligntyp != A_CHAOTIC)) {
  1202. X    pline("The very idea of praying to a %s god is repugnant to you.",
  1203. X          p_aligntyp ? "lawful" : "neutral");
  1204. X    return(0);
  1205. X    }
  1206. X#endif
  1207. X
  1208. X    if (u.ualign.type && u.ualign.type == -p_aligntyp)
  1209. X    alignment = -u.ualign.record;
  1210. X    /* Opposite alignment altar */
  1211. X    else if (u.ualign.type != p_aligntyp) alignment = u.ualign.record / 2;
  1212. X    /* Different (but non-opposite) alignment altar */
  1213. X    else alignment = u.ualign.record;
  1214. X
  1215. X    You("begin praying to %s.", align_gname(p_aligntyp));
  1216. X    if ((!p_trouble && (u.ublesscnt > 0)) ||
  1217. X    ((p_trouble < 0) && (u.ublesscnt > 100)) || /* minor difficulties */
  1218. X    ((p_trouble > 0) && (u.ublesscnt > 200))) /* big trouble */
  1219. X    p_type = 0;
  1220. X    else if ((int)Luck < 0 || u.ugangr || alignment < 0)
  1221. X    p_type = 1;
  1222. X    else /* alignment >= 0 */ {
  1223. X    if(on_altar() && u.ualign.type != p_aligntyp)
  1224. X        p_type = 2;
  1225. X    else
  1226. X        p_type = 3;
  1227. X    }
  1228. X
  1229. X#ifdef POLYSELF
  1230. X    if (is_undead(uasmon) && !Inhell &&
  1231. X    (p_aligntyp == A_LAWFUL || (p_aligntyp == A_NEUTRAL && !rn2(10))))
  1232. X    p_type = -1;
  1233. X#endif
  1234. X
  1235. X#ifdef WIZARD
  1236. X    if (wizard && p_type >= 0) {
  1237. X    if (yn("Force the gods to be pleased?") == 'y') {
  1238. X        u.ublesscnt = 0;
  1239. X        if (u.uluck < 0) u.uluck = 0;
  1240. X        u.ugangr = 0;
  1241. X        if(p_type < 2) p_type = 3;
  1242. X    }
  1243. X    }
  1244. X#endif
  1245. X    nomul(-3);
  1246. X    nomovemsg = "You finish your prayer.";
  1247. X    afternmv = prayer_done;
  1248. X
  1249. X    if(p_type == 3 && !Inhell) {
  1250. X    /* if you've been true to your god you can't die while you pray */
  1251. X    if (!Blind)
  1252. X        You("are surrounded by a shimmering light.");
  1253. X    u.uinvulnerable = TRUE;
  1254. X    }
  1255. X
  1256. X    return(1);
  1257. X}
  1258. X
  1259. XSTATIC_PTR int
  1260. Xprayer_done()        /* M. Stephenson (1.0.3b) */
  1261. X{
  1262. X    aligntyp alignment = p_aligntyp;
  1263. X
  1264. X#ifdef POLYSELF
  1265. X    if(p_type == -1) {
  1266. X    godvoice(alignment,
  1267. X         alignment == A_LAWFUL ?
  1268. X         "Vile creature, thou durst call upon me?" :
  1269. X         "Walk no more, perversion of nature!");
  1270. X    You("feel like you are falling apart.");
  1271. X    rehumanize();
  1272. X    losehp(rnd(20), "residual undead turning effect", KILLED_BY_AN);
  1273. X    exercise(A_CON, FALSE);
  1274. X    return(1);
  1275. X    }
  1276. X#endif
  1277. X    if (Inhell) {
  1278. X    pline("Since you are in Gehennom, %s won't help you.",
  1279. X          align_gname(alignment));
  1280. X    if(rnl(u.ualign.record)) /* yes, this is the right sense */
  1281. X        angrygods(u.ualign.type);
  1282. X    return(0);
  1283. X    }
  1284. X
  1285. X    if (p_type == 0) {
  1286. X    if(on_altar() && u.ualign.type != alignment)
  1287. X        (void) water_prayer(FALSE);
  1288. X    u.ublesscnt += rnz(250);
  1289. X    change_luck(-3);
  1290. X    gods_upset(u.ualign.type);
  1291. X    } else if(p_type == 1) {
  1292. X    if(on_altar() && u.ualign.type != alignment)
  1293. X        (void) water_prayer(FALSE);
  1294. X    angrygods(u.ualign.type);    /* naughty */
  1295. X    } else if(p_type == 2) {
  1296. X    if(water_prayer(FALSE)) {
  1297. X        /* attempted water prayer on a non-coaligned altar */
  1298. X        u.ublesscnt += rnz(250);
  1299. X        change_luck(-3);
  1300. X        gods_upset(u.ualign.type);
  1301. X    } else pleased(alignment);
  1302. X    } else {
  1303. X    u.uinvulnerable = FALSE;
  1304. X    /* coaligned */
  1305. X    if(on_altar())
  1306. X        (void) water_prayer(TRUE);
  1307. X    pleased(alignment); /* nice */
  1308. X    }
  1309. X    return(1);
  1310. X}
  1311. X
  1312. Xint
  1313. Xdoturn()
  1314. X{    /* Knights & Priest(esse)s only please */
  1315. X
  1316. X    register struct monst *mtmp;
  1317. X    register int    xlev = 6;
  1318. X
  1319. X    if((pl_character[0] != 'P') &&
  1320. X       (pl_character[0] != 'K')) {
  1321. X        /* Try to use turn undead spell. */
  1322. X        if (objects[SPE_TURN_UNDEAD].oc_name_known) {
  1323. X            register int sp_no;
  1324. X            for (sp_no = 0; sp_no < MAXSPELL &&
  1325. X             spl_book[sp_no].sp_id != NO_SPELL &&
  1326. X             spl_book[sp_no].sp_id != SPE_TURN_UNDEAD; sp_no++);
  1327. X
  1328. X            if (sp_no < MAXSPELL &&
  1329. X            spl_book[sp_no].sp_id == SPE_TURN_UNDEAD)
  1330. X                return spelleffects(++sp_no, TRUE);
  1331. X        }
  1332. X
  1333. X        You("don't know how to turn undead!");
  1334. X        return(0);
  1335. X    }
  1336. X    if (
  1337. X#  ifdef POLYSELF
  1338. X        (u.ualign.type != A_CHAOTIC &&
  1339. X            (is_demon(uasmon) || is_undead(uasmon))) ||
  1340. X#  endif
  1341. X        u.ugangr > 6 /* "Die, mortal!" */) {
  1342. X
  1343. X        pline("For some reason, %s seems to ignore you.", u_gname());
  1344. X        aggravate();
  1345. X        exercise(A_WIS, FALSE);
  1346. X        return(0);
  1347. X    }
  1348. X
  1349. X    if (Inhell) {
  1350. X        pline("Since you are in Gehennom, %s won't help you.", u_gname());
  1351. X        aggravate();
  1352. X        return(0);
  1353. X    }
  1354. X    pline("Calling upon %s, you chant an arcane formula.", u_gname());
  1355. X    exercise(A_WIS, TRUE);
  1356. X    for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
  1357. X        if(cansee(mtmp->mx,mtmp->my)) {
  1358. X        if(!mtmp->mpeaceful && (is_undead(mtmp->data) ||
  1359. X           (is_demon(mtmp->data) && (u.ulevel > (MAXULEV/2))))) {
  1360. X
  1361. X            if(Confusion) {
  1362. X            pline("Unfortunately, your voice falters.");
  1363. X            mtmp->mflee = mtmp->mfrozen = mtmp->msleep = FALSE;
  1364. X            mtmp->mcanmove = TRUE;
  1365. X            } else if (! resist(mtmp, '\0', 0, TELL))
  1366. X            switch (mtmp->data->mlet) {
  1367. X                /* this is intentional, lichs are tougher
  1368. X                   than zombies. */
  1369. X            case S_LICH:    xlev += 2;
  1370. X            case S_GHOST:   xlev += 2;
  1371. X            case S_VAMPIRE: xlev += 2;
  1372. X            case S_WRAITH:  xlev += 2;
  1373. X            case S_MUMMY:   xlev += 2;
  1374. X            case S_ZOMBIE:
  1375. X                mtmp->mflee = TRUE; /* at least */
  1376. X                if(u.ulevel >= xlev &&
  1377. X                   !resist(mtmp, '\0', 0, NOTELL)) {
  1378. X                if(u.ualign.type == A_CHAOTIC) {
  1379. X                    mtmp->mpeaceful = TRUE;
  1380. X                } else { /* damn them */
  1381. X                    You("destroy %s!", mon_nam(mtmp));
  1382. X                    mondied(mtmp);
  1383. X                }
  1384. X                }
  1385. X                break;
  1386. X            default:    mtmp->mflee = TRUE;
  1387. X                break;
  1388. X            }
  1389. X           }
  1390. X        }
  1391. X    nomul(-5);
  1392. X    return(1);
  1393. X}
  1394. X
  1395. Xconst char *
  1396. Xa_gname()
  1397. X{
  1398. X    return(a_gname_at(u.ux, u.uy));
  1399. X}
  1400. X
  1401. Xconst char *
  1402. Xa_gname_at(x,y)     /* returns the name of an altar's deity */
  1403. Xxchar x, y;
  1404. X{
  1405. X    if(!IS_ALTAR(levl[x][y].typ)) return((char *)0);
  1406. X
  1407. X    return align_gname(a_align(x,y));
  1408. X}
  1409. X
  1410. Xconst char *
  1411. Xu_gname()  /* returns the name of the player's deity */
  1412. X{
  1413. X    return align_gname(u.ualign.type);
  1414. X}
  1415. X
  1416. Xconst char *
  1417. Xalign_gname(alignment)
  1418. X    register aligntyp alignment;
  1419. X{
  1420. X    register struct ghods *aghod;
  1421. X
  1422. X    if(alignment == A_NONE) return(Moloch);
  1423. X
  1424. X    for(aghod=gods; aghod->classlet; aghod++)
  1425. X        if(aghod->classlet == pl_character[0])
  1426. X        switch(alignment) {
  1427. X        case A_CHAOTIC:    return(aghod->chaos);
  1428. X        case A_NEUTRAL:    return(aghod->balance);
  1429. X        case A_LAWFUL:    return(aghod->law);
  1430. X        default: impossible("unknown alignment.");
  1431. X             return("Balance");
  1432. X        }
  1433. X    impossible("unknown character's god?");
  1434. X    return("someone");
  1435. X}
  1436. X
  1437. Xvoid
  1438. Xaltar_wrath(x, y)
  1439. Xregister int x, y;
  1440. X{
  1441. X    aligntyp altaralign = a_align(x,y);
  1442. X
  1443. X    if(!strcmp(align_gname(altaralign), u_gname())) {
  1444. X    godvoice(altaralign, "How darest thou desecrate my altar!");
  1445. X    (void) adjattrib(A_WIS, -1, FALSE);
  1446. X    } else {
  1447. X    pline("A voice (could it be %s?) whispers:",
  1448. X          align_gname(altaralign));
  1449. X    verbalize("Thou shalt pay, infidel!");
  1450. X    change_luck(-1);
  1451. X    }
  1452. X}
  1453. X
  1454. X/*pray.c*/
  1455. END_OF_FILE
  1456. if test 41023 -ne `wc -c <'src/pray.c'`; then
  1457.     echo shar: \"'src/pray.c'\" unpacked with wrong size!
  1458. fi
  1459. # end of 'src/pray.c'
  1460. fi
  1461. if test -f 'sys/amiga/amiwbench.c' -a "${1}" != "-c" ; then 
  1462.   echo shar: Will not clobber existing file \"'sys/amiga/amiwbench.c'\"
  1463. else
  1464. echo shar: Extracting \"'sys/amiga/amiwbench.c'\" \(12565 characters\)
  1465. sed "s/^X//" >'sys/amiga/amiwbench.c' <<'END_OF_FILE'
  1466. X/*    SCCS Id: @(#)amiwbench.c      3.1   93/01/08
  1467. X/*    Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1990, 1992, 1993 */
  1468. X/* NetHack may be freely redistributed.  See license for details. */
  1469. X
  1470. X/*  Amiga Workbench interface  */
  1471. X
  1472. X#include "hack.h"
  1473. X
  1474. X/* Have to #undef CLOSE, because it's used in display.h and intuition.h */
  1475. X#undef CLOSE
  1476. X
  1477. X#ifdef __SASC
  1478. X# undef COUNT
  1479. X# include <proto/exec.h>
  1480. X# include <proto/dos.h>
  1481. X# include <proto/icon.h>
  1482. X#endif
  1483. X
  1484. X#include <workbench/startup.h>
  1485. X#include <workbench/workbench.h>
  1486. X#include <exec/memory.h>
  1487. X#include <ctype.h>
  1488. X
  1489. X#ifdef __SASC
  1490. X# include <string.h>
  1491. X# undef strlen          /* grrr */
  1492. X#endif
  1493. X
  1494. X#define ALLOC_SIZE      ((long)sizeof(struct FileInfoBlock))
  1495. X
  1496. X#ifdef AZTEC_C
  1497. X# include <functions.h>
  1498. Xextern struct Library *IconBase;
  1499. X#endif
  1500. X
  1501. Xextern int FDECL(parse_config_line, (FILE *, char *, char *, char *));
  1502. X
  1503. Xint ami_argc;           /* global argc */
  1504. Xchar **ami_argv;        /* global argv */
  1505. Xboolean FromWBench=0;       /* how did we get started? */
  1506. Xboolean FromCLI=0;      /* via frontend and INTERNALCLI */
  1507. Xstatic BOOL FromTool=0;     /* or from Project (ergo nothing to restore) */
  1508. Xstatic char argline[80];    /* fake command line from ToolTypes */
  1509. Xstatic BOOL TTparse=0;      /* parsing tooltypes? */
  1510. Xstatic BOOL KillIcon=FALSE; /* delayed expunge of user's icon */
  1511. Xstatic char iconname[PATHLEN+5];
  1512. Xstatic char origicon[PATHLEN+5];
  1513. Xstatic char savefname[PL_NSIZ];     /* name from name of save file */
  1514. X
  1515. Xextern int bigscreen;
  1516. Xextern const char *classes; /* liberated from pcmain */
  1517. Xextern char PATH[];
  1518. X
  1519. X/* Called after NetHack.cnf (and maybe NETHACKOPTIONS) are read.
  1520. X * If this is a request to show the score file, do it here and quit.
  1521. X */
  1522. Xvoid ami_wbench_init()
  1523. X{
  1524. X    struct WBStartup *wbs=(struct WBStartup *)ami_argv;
  1525. X    struct WBArg *wa;
  1526. X    int ia;         /* arg of active icon */
  1527. X    int x,doscore=0;
  1528. X    char    *p,*lp;
  1529. X    BPTR    olddir;         /* starting directory */
  1530. X    struct DiskObject *dobj;
  1531. X    char    *scorearg, *t;
  1532. X    char    tmp_levels[PATHLEN];
  1533. X
  1534. X    FromWBench=(ami_argc==0);
  1535. X    if(!FromWBench)return;          /* nothing if from CLI */
  1536. X
  1537. X    /*
  1538. X     * "NULL" out arrays
  1539. X     */
  1540. X    tmp_levels[0]  = '\0';
  1541. X
  1542. X    IconBase=OpenLibrary("icon.library",33L);
  1543. X    if(!IconBase)error("icon.library missing!");
  1544. X
  1545. X    wa=wbs->sm_ArgList;
  1546. X    if(wbs->sm_NumArgs>2)error("You can only play one game at a time!");
  1547. X    ia=wbs->sm_NumArgs-1;
  1548. X
  1549. X    if(strcmp("NewGame",wa[ia].wa_Name)){
  1550. X    strcpy(savefname,wa[ia].wa_Name);
  1551. X    strcpy(plname,wa[ia].wa_Name);
  1552. X    }
  1553. X
  1554. X    if( ( t = strrchr( plname, '.' ) ) && strcmp( t, ".sav" ) == 0 )
  1555. X    *t = 0;
  1556. X
  1557. X    olddir=CurrentDir(wa[ia].wa_Lock);   /* where the icon is */
  1558. X
  1559. X    dobj=GetDiskObject(wa[ia].wa_Name);
  1560. X    (void)CurrentDir(olddir);       /* and back */
  1561. X    if(!dobj){
  1562. X    error("Sorry, I can't find your icon!");
  1563. X    }
  1564. X
  1565. X    FromTool=(dobj->do_Type==WBTOOL)?1:
  1566. X    (dobj->do_Type==WBPROJECT)?0:
  1567. X    (error("Sorry, I don't recognize this icon type!"),1);
  1568. X
  1569. X    if(index(savefname,'.') && !strncmp(index(savefname,'.'),".sav",4)){
  1570. X    *index(savefname,'.')='\0';
  1571. X    } else {
  1572. X    savefname[0]='\0';  /* don't override if not save file */
  1573. X    FromTool = 1;
  1574. X    }
  1575. X
  1576. X    argline[0]='\0';
  1577. X    if( p = FindToolType( dobj->do_ToolTypes, "SCREEN" ) )
  1578. X    {
  1579. X    extern int bigscreen;
  1580. X    if( MatchToolValue( p, "NOLACE" ) )
  1581. X        bigscreen = -1;
  1582. X    else if( MatchToolValue( p, "LACE" ) )
  1583. X        bigscreen = 1;
  1584. X    }
  1585. X    if(dobj->do_ToolTypes)for(x=0;p=dobj->do_ToolTypes[x];x++){
  1586. X    lp=index(p,'=');
  1587. X    if( !lp++ || strncmp(p, "SCORE", 5 ) == 0 ){
  1588. X        if((strncmp(p,"SCORES",6)==0) || (strncmp(p,"SCORE",5)==0)){
  1589. X        if( !lp ) lp = "";
  1590. X        doscore=1;
  1591. X        scorearg=(char *)alloc(strlen(lp)+1);
  1592. X        strcpy(scorearg,lp);
  1593. X        } else {
  1594. X        TTparse=TRUE;
  1595. X        parseoptions(p,(boolean)TRUE,(boolean)FALSE);
  1596. X        TTparse=FALSE;
  1597. X        }
  1598. X    } else {
  1599. X        TTparse=TRUE;
  1600. X        /* new things */
  1601. X        if((strncmp(p,"CMDLINE",7)==0)||
  1602. X          (strncmp(p,"COMMANDLINE",11)==0)||
  1603. X          (strncmp(p,"INTERNALCLI",11)==0)){
  1604. X            strncpy(argline,lp,79);
  1605. X        if(*p=='I'){
  1606. X            FromTool=0; /* ugly hack bugfix */
  1607. X            FromCLI=1;  /* frontend ICLI only */
  1608. X        }
  1609. X        }
  1610. X        else if( strncmp( p, "SCREEN",6 ) )
  1611. X        {
  1612. X        if (!parse_config_line((FILE *)0, p, 0, tmp_levels)){
  1613. X            raw_printf("Bad ToolTypes line: '%s'\n",p);
  1614. X            getreturn("to continue");
  1615. X        }
  1616. X        }
  1617. X    TTparse=FALSE;
  1618. X    }
  1619. X    }
  1620. X    /* cleanup - from files.c, except we only change things
  1621. X     * that are explicitly changed, since we already
  1622. X     * did this once to get the defaults (in amidos.c)  */
  1623. X    if(plname[0]){
  1624. X    plnamesuffix(); /* from files.c */
  1625. X    set_savefile_name();
  1626. X    }
  1627. X    if(tmp_levels[0])strcpy(permbones,tmp_levels);
  1628. X    if(tmp_levels[0]){
  1629. X    strcpy(levels,tmp_levels);
  1630. X    strcpy(bones,levels);
  1631. X    }
  1632. X    FreeDiskObject(dobj);   /* we'll get it again later if we need it */
  1633. X
  1634. X    if(doscore){
  1635. X    long ac;
  1636. X    char *p;
  1637. X    char **av=calloc(1,50*sizeof(char *));
  1638. X#ifdef CHDIR
  1639. X    chdirx(hackdir,0);
  1640. X#endif
  1641. X    av[0]="NetHack";            /* why not? */
  1642. X    av[1]="-s";             /* why not? */
  1643. X    for(ac=2,p=scorearg;*p;ac++){
  1644. X        av[ac]=p;
  1645. X        while(*p && !isspace(*p))p++;
  1646. X        if(!*p)break;
  1647. X        *p++='\0';
  1648. X        while(*p && isspace(*p))p++;
  1649. X    }
  1650. X    prscore(ac+1,av);
  1651. X    free( av );
  1652. X    exit(0);        /* overloaded */
  1653. X    }
  1654. X
  1655. X        /* if the user started us from the tool icon,
  1656. X         * we can't save the game in the same place
  1657. X         * we started from, so pick up the plname
  1658. X         * and hope for the best.
  1659. X         */
  1660. X    if(FromTool){
  1661. X    set_savefile_name();
  1662. X    }
  1663. X}
  1664. X
  1665. X/* Simulate the command line (-s is already done, although this is
  1666. X * not exactly the way it should be). Note that we do not handle the
  1667. X * entire range of standard NetHack flags.
  1668. X */
  1669. Xvoid ami_wbench_args(){
  1670. X    char *p=argline;
  1671. X
  1672. X    if(!FromWBench) return;
  1673. X
  1674. X    while(*p){
  1675. X    switch(*p++){
  1676. X    case ' ':
  1677. X    case '-':   break;
  1678. X#ifdef NEWS
  1679. X    case 'n':   flags.news = FALSE;
  1680. X#endif
  1681. X#if defined(WIZARD) || defined(EXPLORE_MODE)
  1682. X# ifndef EXPLORE_MODE
  1683. X    case 'X':
  1684. X# endif
  1685. X    case 'D':
  1686. X# ifdef WIZARD
  1687. X#  ifdef KR1ED
  1688. X        if(!strcmp(plname,WIZARD_NAME))
  1689. X#  else
  1690. X        if(!strcmp(plname,WIZARD))
  1691. X#  endif
  1692. X        {
  1693. X        wizard=TRUE;break;
  1694. X        }
  1695. X        /* else fall through */
  1696. X# endif
  1697. X# ifdef EXPLORE_MODE
  1698. X    case 'X':   discover=TRUE;
  1699. X# endif
  1700. X        break;
  1701. X#endif
  1702. X    case 'L':   /* interlaced screen */
  1703. X        bigscreen = 1;
  1704. X        break;
  1705. X    case 'l':   /* No interlaced screen */
  1706. X        bigscreen = -1;
  1707. X        break;
  1708. X    case 'u':
  1709. X        {
  1710. X        char *c,*dest;
  1711. X        while(*p && isascii(*p) && isspace(*p))p++;
  1712. X        c=p;
  1713. X        dest=plname;
  1714. X        for(;*p && isascii(*p) && !isspace(*p);){
  1715. X        if(dest-plname>=(sizeof(plname)-1))break;
  1716. X        *dest++=*p++;
  1717. X        }
  1718. X        *dest='\0';
  1719. X        if(c==dest)
  1720. X        raw_print("Player name expected after -u");
  1721. X        }
  1722. X        strcpy(savefname,plname);
  1723. X        set_savefile_name();
  1724. X        break;
  1725. X    default:
  1726. X        p--;
  1727. X        if(index(classes,toupper(*p))){
  1728. X        char *t=pl_character;
  1729. X        int cnt=sizeof(pl_character)-1;
  1730. X        while(cnt && *p && !isspace(*p))*t++=*p++,cnt--;
  1731. X        *t=0;
  1732. X        break;
  1733. X        }
  1734. X        raw_printf("Unknown switch: %s\n",p);
  1735. X        /* FALL THROUGH */
  1736. X    case '?':
  1737. X        {
  1738. X        char buf[77];
  1739. X
  1740. X        raw_printf("Usage: %s -s [-[%s]] [maxrank] [name]...",
  1741. X          hname, classes);
  1742. X        raw_print("       or");
  1743. X        sprintf(buf,"       %s [-u name] [-[%s]]", hname, classes);
  1744. X#if defined(WIZARD) || defined(EXPLORE_MODE)
  1745. X        strcat(buf," [-[DX]]");
  1746. X#endif
  1747. X#ifdef NEWS
  1748. X        strcat(buf," [-n]");
  1749. X#endif
  1750. X#ifdef MFLOPPY
  1751. X# ifndef AMIGA
  1752. X        strcat(" [-r]");
  1753. X# endif
  1754. X#endif
  1755. X        raw_print(buf);
  1756. X        exit(0);
  1757. X        }
  1758. X    }
  1759. X    }
  1760. X}
  1761. X
  1762. X
  1763. X/* IF (from workbench) && (currently parsing ToolTypes)
  1764. X * THEN print error message and return 0
  1765. X * ELSE return 1
  1766. X */
  1767. Xami_wbench_badopt(oopsline)
  1768. Xconst char *oopsline;
  1769. X{
  1770. X    if(!FromWBench)return 1;
  1771. X    if(!TTparse)return 1;
  1772. X
  1773. X    raw_printf("Bad Syntax in OPTIONS in ToolTypes: %s.",oopsline);
  1774. X    return 0;
  1775. X}
  1776. X
  1777. X/* Construct (if necessary) and fill in icon for given save file */
  1778. Xvoid ami_wbench_iconwrite(base)
  1779. Xchar *base;
  1780. X{
  1781. X    BPTR lock;
  1782. X    char tmp[PATHLEN+5];
  1783. X    struct DiskObject *dobj;
  1784. X    char **savtp, *ourtools[ 21 ];
  1785. X#define CHARACTER   0
  1786. X#define PENS        1
  1787. X    char types[ 4 ][ 80 ];  /* Buffer space for tooltypes until written */
  1788. X    int i, j;
  1789. X
  1790. X    if(!FromWBench)return;
  1791. X    if(FromCLI)return;
  1792. X
  1793. X    strcpy(tmp,base);
  1794. X    strcat(tmp,".info");
  1795. X    if(FromTool){               /* user clicked on main icon */
  1796. X    (void)CopyFile(DEFAULT_ICON,tmp);
  1797. X    } else {                /* from project */
  1798. X    lock=Lock(tmp,ACCESS_READ);
  1799. X    if(lock==0){    /* maybe our name changed - try to get
  1800. X         * original icon */
  1801. X        if(!Rename(origicon,tmp)){
  1802. X        /* nope, build a new icon */
  1803. X        lock=Lock(DEFAULT_ICON,ACCESS_READ);
  1804. X        if(lock==0)return;      /* no icon today */
  1805. X        UnLock(lock);
  1806. X        (void)CopyFile(DEFAULT_ICON,tmp);
  1807. X        }
  1808. X    } else UnLock(lock);
  1809. X    }
  1810. X    KillIcon=FALSE;
  1811. X
  1812. X    dobj=GetDiskObject(base);
  1813. X
  1814. X    /* Save the current pointer */
  1815. X
  1816. X    savtp = (char **)dobj->do_ToolTypes;
  1817. X
  1818. X    /* Copy the old and set new entries for the WorkBench. */
  1819. X
  1820. X    for( i = 0; savtp[i]; ++i )
  1821. X    {
  1822. X    /* Ignore any current settings of these values */
  1823. X
  1824. X    if( strncmpi( savtp[ i ], "CHARACTER=", 10 ) == 0 ||
  1825. X        strncmpi( savtp[ i ], "PENS=", 5 ) == 0 )
  1826. X    {
  1827. X        continue;
  1828. X    }
  1829. X
  1830. X    ourtools[ i ] = savtp[ i ];
  1831. X    }
  1832. X
  1833. X    /* Fill in the needed values. */
  1834. X
  1835. X    ourtools[ i++ ] = types[ CHARACTER ];
  1836. X    sprintf( types[ CHARACTER ], "CHARACTER=%c", *pl_character );
  1837. X
  1838. X    ourtools[ i++ ] = types[ PENS ];
  1839. X    strcpy( types[ PENS ], "PENS=" );
  1840. X
  1841. X    /* Put in the pen colors... */
  1842. X    for( j = 0; j < (1L << DEPTH); ++j )
  1843. X    {
  1844. X    extern unsigned short amii_curmap[];
  1845. X    sprintf( types[ PENS ] + strlen( types[ PENS ] ),
  1846. X      "%03x,", amii_curmap[ j ] );
  1847. X    }
  1848. X
  1849. X    /* Remove trailing comma */
  1850. X    types[ PENS ][ strlen( types[ PENS ] ) - 1 ] = 0;
  1851. X
  1852. X    ourtools[ i ] = NULL;
  1853. X
  1854. X    /* Set the tools pointer to the temporary copy */
  1855. X
  1856. X    dobj->do_ToolTypes = (void *)ourtools;
  1857. X    PutDiskObject(base,dobj);
  1858. X
  1859. X    /* Restore the pointer and free the structures */
  1860. X
  1861. X    dobj->do_ToolTypes = (void *)savtp;
  1862. X    FreeDiskObject(dobj);
  1863. X}
  1864. X
  1865. X/* How much disk space will we need for the icon? */
  1866. Xint ami_wbench_iconsize(base)
  1867. Xchar *base;
  1868. X{
  1869. X    struct FileInfoBlock *fib;
  1870. X    BPTR lock;
  1871. X    int rv;
  1872. X    char tmp[PATHLEN+5];
  1873. X
  1874. X    if(!FromWBench)return(0);
  1875. X    if(FromCLI)return(0);
  1876. X
  1877. X    strcpy(tmp,base);
  1878. X    strcat(tmp,".info");
  1879. X    lock=Lock(tmp,ACCESS_READ);
  1880. X    if(lock==0){    /* check the default */
  1881. X    lock=Lock(DEFAULT_ICON,ACCESS_READ);
  1882. X    if(lock==0)return(0);
  1883. X    }
  1884. X    fib = (struct FileInfoBlock *)AllocMem(ALLOC_SIZE, MEMF_CLEAR);
  1885. X    if(!Examine(lock,fib)){
  1886. X    UnLock(lock);
  1887. X    FreeMem(fib, ALLOC_SIZE);
  1888. X    return(0);          /* if no icon, there never will be one */
  1889. X    }
  1890. X    rv=fib->fib_Size+strlen(plname);    /* guessing */
  1891. X    UnLock(lock);
  1892. X    FreeMem(fib, ALLOC_SIZE);
  1893. X    return(rv);
  1894. X}
  1895. X
  1896. X/* Delete the icon associated with the given file (NOT the file itself! */
  1897. X/* (Don't worry if the icon doesn't exist */
  1898. Xvoid ami_wbench_unlink(base)
  1899. Xchar *base;
  1900. X{
  1901. X    if(!FromWBench)return;
  1902. X    if(FromCLI)return;
  1903. X
  1904. X    strcpy(iconname,base);
  1905. X    strcat(iconname,".info");
  1906. X    KillIcon=TRUE;          /* don't do it now - this way the user
  1907. X                 * gets back whatever picture we had
  1908. X                 * when we started if the game is
  1909. X                 * saved again           */
  1910. X}
  1911. X
  1912. Xstatic int preserved=0;        /* wizard mode && saved save file */
  1913. X
  1914. Xpreserve_icon(){
  1915. X    preserved=1;
  1916. X}
  1917. Xclear_icon(){
  1918. X    if(!FromWBench)return;
  1919. X    if(FromCLI)return;
  1920. X    if(preserved)return;
  1921. X    if(!KillIcon)return;
  1922. X
  1923. X    DeleteFile(iconname);
  1924. X}
  1925. X
  1926. X/* Check for a saved game.
  1927. XIF not a saved game -> -1
  1928. XIF can't open SAVEF -> -1
  1929. XELSE -> fd for reading SAVEF */
  1930. Xint ami_wbench_getsave(mode)
  1931. Xint mode;
  1932. X{
  1933. X    BPTR lock;
  1934. X    struct FileInfoBlock *fib;
  1935. X
  1936. X    if(!FromWBench)return(open(SAVEF,mode));
  1937. X        /* if the file will be created anyway, skip the
  1938. X         * checks and just do it            */
  1939. X    if(mode & O_CREAT)return(open(SAVEF,mode));
  1940. X    if(FromTool)return(-1);    /* otherwise, by definition, there
  1941. X                 * isn't a save file (even if a
  1942. X                 * file of the right name exists) */
  1943. X    if(savefname[0])
  1944. X    strncpy(plname,savefname,PL_NSIZ-1); /* restore poly'd name */
  1945. X    lock=Lock(SAVEF,ACCESS_READ);
  1946. X    fib = (struct FileInfoBlock *)AllocMem(ALLOC_SIZE, MEMF_CLEAR);
  1947. X    if(lock && Examine(lock,fib)){
  1948. X    if(fib->fib_Size>100){  /* random number << save file size */
  1949. X        UnLock(lock);
  1950. X        FreeMem(fib,ALLOC_SIZE);
  1951. X        return(open(SAVEF,mode));
  1952. X    } else {
  1953. X        /* this is a dummy file we need because
  1954. X         * workbench won't duplicate an icon with no
  1955. X         * "real" data attached - try to get rid of it.
  1956. X         */
  1957. X        UnLock(lock);
  1958. X        unlink(SAVEF);
  1959. X        FreeMem(fib,ALLOC_SIZE);
  1960. X        return(-1);
  1961. X    }
  1962. X    }
  1963. X    FreeMem(fib,ALLOC_SIZE);
  1964. X    return(-1);     /* give up */
  1965. X}
  1966. END_OF_FILE
  1967. if test 12565 -ne `wc -c <'sys/amiga/amiwbench.c'`; then
  1968.     echo shar: \"'sys/amiga/amiwbench.c'\" unpacked with wrong size!
  1969. fi
  1970. # end of 'sys/amiga/amiwbench.c'
  1971. fi
  1972. echo shar: End of archive 28 \(of 108\).
  1973. cp /dev/null ark28isdone
  1974. MISSING=""
  1975. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
  1976. 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \
  1977. 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 \
  1978. 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
  1979. 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 \
  1980. 101 102 103 104 105 106 107 108 ; do
  1981.     if test ! -f ark${I}isdone ; then
  1982.     MISSING="${MISSING} ${I}"
  1983.     fi
  1984. done
  1985. if test "${MISSING}" = "" ; then
  1986.     echo You have unpacked all 108 archives.
  1987.     echo "Now execute 'rebuild.sh'"
  1988.     rm -f ark10[0-8]isdone ark[1-9]isdone ark[1-9][0-9]isdone
  1989. else
  1990.     echo You still need to unpack the following archives:
  1991.     echo "        " ${MISSING}
  1992. fi
  1993. ##  End of shell archive.
  1994. exit 0
  1995.