-+-+-+-+-+-+-+-+ START OF PART 10 -+-+-+-+-+-+-+-+ X`09 (void) fseek(highscore_fp, (long)ftell(highscore_fp), L_SET); X#else X`09 (void) fseek(highscore_fp, (long)0, L_INCR); X#endif X#else X`09 (void) fseek(highscore_fp, (off_t)0, L_INCR); X#endif X`09 curpos = ftell (highscore_fp); X`09 rd_highscore(&old_entry); X`09`7D X if (feof(highscore_fp)) X`09`7B X#ifndef BSD4_3 X`09 (void) fseek (highscore_fp, curpos, L_SET); X#else X`09 (void) fseek (highscore_fp, (off_t)curpos, L_SET); X#endif X`09 wr_highscore(&entry); X`09`7D X `7D X X#if !defined(VMS) && !defined(MSDOS) && !defined(AMIGA) && !defined(MAC) X#ifdef ATARIST_TC X /* Flock never called for Atari ST with TC. */ X#else X (void) flock((int)fileno(highscore_fp), LOCK_UN); X#endif X#else X (void) fclose (highscore_fp); X#endif X`7D X X X/* Change the player into a King!`09`09`09-RAK-`09 */ Xstatic void kingly() X`7B X register struct misc *p_ptr; X register char *p; X X /* Change the character attributes.`09`09 */ X dun_level = 0; X (void) strcpy(died_from, "Ripe Old Age"); X p_ptr = &py.misc; X (void) restore_level (); X p_ptr->lev += MAX_PLAYER_LEVEL; X p_ptr->au += 250000L; X p_ptr->max_exp += 5000000L; X p_ptr->exp = p_ptr->max_exp; X X /* Let the player know that he did good.`09 */ X clear_screen(); X put_buffer("#", 1, 34); X put_buffer("#####", 2, 32); X put_buffer("#", 3, 34); X put_buffer(",,, $$$ ,,,", 4, 28); X put_buffer(",,=$ \"$$$$$\" $=,,", 5, 24); X put_buffer(",$$ $$$ $$,", 6, 22); X put_buffer("*> <*> <*", 7, 22); X put_buffer("$$ $$$ $$", 8, 22); X put_buffer("\"$$ $$$ $$\"", 9, 22); X put_buffer("\"$$ $$$ $$\"", 10, 23); X p = "*#########*#########*"; X put_buffer(p, 11, 24); X put_buffer(p, 12, 24); X put_buffer("Veni, Vidi, Vici!", 15, 26); X put_buffer("I came, I saw, I conquered!", 16, 21); X if (p_ptr->male) X put_buffer("All Hail the Mighty King!", 17, 22); X else X put_buffer("All Hail the Mighty Queen!", 17, 22); X flush(); X pause_line(23); X`7D X X X/* Handles the gravestone end top-twenty routines`09-RAK-`09 */ Xvoid exit_game () X`7B X#ifdef MAC X /* Prevent strange things from happening */ X enablefilemenu(FALSE); X#endif X X /* What happens upon dying.`09`09`09`09-RAK-`09 */ X msg_print(CNIL); X flush (); /* flush all input */ X nosignals ();`09 /* Can't interrupt or suspend. */ X /* If the game has been saved, then save sets turn back to -1, which X inhibits the printing of the tomb.`09 */ X if (turn >= 0) X `7B X if (total_winner) X`09kingly(); X print_tomb(); X `7D X if (character_generated && !character_saved) X#ifdef MAC X (void) save_char (TRUE);`09`09/* Save the memory at least. */ X#else X (void) save_char ();`09`09/* Save the memory at least. */ X#endif X /* add score to scorefile if applicable */ X if (character_generated) X `7B X /* Clear character_saved, strange thing to do, but it prevents inkey() X`09 from recursively calling exit_game() when there has been an eof X`09 on stdin detected. */ X character_saved = FALSE; X highscores(); X display_scores (TRUE); X `7D X erase_line (23, 0); X restore_term (); X#ifdef MAC X /* Undo what has been done */ X enablefilemenu(TRUE); X /* Long jump back into the Mac wrapper, in lieu of exit () */ X goback(); X#else X exit (0); X#endif X`7D $ CALL UNPACK DEATH.C;1 3231087 $ create 'f' Xcflags = /NOOPT/DEBUG Xlinkflags = /DEBUG XMORIA.EXE : MAIN.OBJ, CREATE.OBJ, CREATURE.OBJ, DEATH.OBJ, - X DESC.OBJ, DUNGEON.OBJ, EAT.OBJ, FILES.OBJ, GENERATE.OBJ, - X GETCH.OBJ, HELP.OBJ, IO.OBJ, MAGIC.OBJ, MAIN.OBJ, MISC1.OBJ, - X MISC2.OBJ, MISC3.OBJ, MISC4.OBJ, MONSTERS.OBJ, MORIA1.OBJ, - X MORIA2.OBJ, MORIA3.OBJ, MORIA4.OBJ, PLAYER.OBJ, - X POTIONS.OBJ, PRAYER.OBJ, RECALL.OBJ, RND.OBJ, SAVE.OBJ, SCROLLS.OBJ, - X SETS.OBJ, SIGNALS.OBJ, SPELLS.OBJ, STAFFS.OBJ, STORE1.OBJ, - X STORE2.OBJ, TABLES.OBJ, TREASURE.OBJ, UEXIT.OBJ, - X VARIABLE.OBJ, WANDS.OBJ, WIZARD.OBJ X - $(link) $(linkflags) MORIA.OPT/opt X Xcreate.obj : constant.h, types.h, externs.h, config.h Xcreature.obj : constant.h, types.h, externs.h, config.h Xdeath.obj : constant.h, types.h, externs.h, config.h Xdesc.obj : constant.h, types.h, externs.h, config.h Xdungeon.obj : constant.h, types.h, externs.h, config.h Xeat.obj : constant.h, types.h, externs.h, config.h Xfiles.obj : constant.h, types.h, externs.h, config.h Xgenerate.obj : constant.h, types.h, externs.h, config.h Xhelp.obj : constant.h, types.h, externs.h, config.h Xio.obj : constant.h, types.h, externs.h, config.h Xmagic.obj : constant.h, types.h, externs.h, config.h Xmain.obj : constant.h, types.h, externs.h, config.h Xmisc1.obj : constant.h, types.h, externs.h, config.h Xmisc2.obj : constant.h, types.h, externs.h, config.h Xmisc3.obj : constant.h, types.h, externs.h, config.h Xmisc4.obj : constant.h, types.h, externs.h, config.h Xmonsters.obj : constant.h, types.h, config.h Xmoria1.obj : constant.h, types.h, externs.h, config.h Xmoria2.obj : constant.h, types.h, externs.h, config.h Xmoria3.obj : constant.h, types.h, externs.h, config.h Xmoria4.obj : constant.h, types.h, externs.h, config.h Xplayer.obj : constant.h, types.h, config.h Xpotions.obj : constant.h, types.h, externs.h, config.h Xprayer.obj : constant.h, types.h, externs.h, config.h Xrecall.obj : constant.h, config.h, types.h, externs.h Xrnd.obj : constant.h, types.h Xsave.obj : constant.h, types.h, externs.h, config.h Xscrolls.obj : constant.h, types.h, externs.h, config.h Xsets.obj : constant.h, config.h Xsignals.obj : constant.h, types.h, externs.h, config.h Xspells.obj : constant.h, types.h, externs.h, config.h Xstaffs.obj : constant.h, types.h, externs.h, config.h Xstore1.obj : constant.h, types.h, externs.h, config.h Xstore2.obj : constant.h, types.h, externs.h, config.h Xtables.obj : constant.h, types.h, config.h Xtreasure.obj : constant.h, types.h, config.h Xvariable.obj : constant.h, types.h, config.h Xwands.obj : constant.h, types.h, externs.h, config.h Xwizard.obj : constant.h, types.h, externs.h, config.h $ CALL UNPACK DEBUG.MMS;1 1547776288 $ create 'f' X/* source/desc.c: handle object descriptions, mostly string handling code X X Copyright (c) 1989-92 James E. Wilson, Robert A. Koeneke X X This software may be copied and distributed for educational, research, an Vd X not for profit purposes provided that this copyright and statement are X included in all such copies. */ X X#ifdef __TURBOC__ X#include`09 X#include`09 X#endif /* __TURBOC__ */ X`20 X#include "config.h" X#include "constant.h" X#include "types.h" X#include "externs.h" X X#ifdef USG X#ifndef ATARIST_MWC X#include X#endif X#else X#include X#endif X X#if defined(LINT_ARGS) Xstatic void unsample(struct inven_type *); X#else Xstatic void unsample(); X#endif X X#ifdef ATARIST_TC X/* Include this to get prototypes for standard library functions. */ X#include X#endif X Xchar titles`5BMAX_TITLES`5D`5B10`5D; X X/* Object descriptor routines`09`09`09`09`09*/ X Xint is_a_vowel(ch) Xchar ch; X`7B X switch(ch) X `7B X case 'a': case 'e': case 'i': case 'o': case 'u': X case 'A': case 'E': case 'I': case 'O': case 'U': X return(TRUE); X default: X return(FALSE); X `7D X`7D X X/* Initialize all Potions, wands, staves, scrolls, etc.`09*/ Xvoid magic_init() X`7B X register int h, i, j, k; X register char *tmp; X vtype string; X X set_seed(randes_seed); X X /* The first 3 entries for colors are fixed, (slime & apple juice, water) V */ X for (i = 3; i < MAX_COLORS; i++) X `7B X j = randint(MAX_COLORS - 3) + 2; X tmp = colors`5Bi`5D; X colors`5Bi`5D = colors`5Bj`5D; X colors`5Bj`5D = tmp; X `7D X for (i = 0; i < MAX_WOODS; i++) X `7B X j = randint(MAX_WOODS) - 1; X tmp = woods`5Bi`5D; X woods`5Bi`5D = woods`5Bj`5D; X woods`5Bj`5D = tmp; X `7D X for (i = 0; i < MAX_METALS; i++) X `7B X j = randint(MAX_METALS) - 1; X tmp = metals`5Bi`5D; X metals`5Bi`5D = metals`5Bj`5D; X metals`5Bj`5D = tmp; X `7D X for (i = 0; i < MAX_ROCKS; i++) X `7B X j = randint(MAX_ROCKS) - 1; X tmp = rocks`5Bi`5D; X rocks`5Bi`5D = rocks`5Bj`5D; X rocks`5Bj`5D = tmp; X `7D X for (i = 0; i < MAX_AMULETS; i++) X `7B X j = randint(MAX_AMULETS) - 1; X tmp = amulets`5Bi`5D; X amulets`5Bi`5D = amulets`5Bj`5D; X amulets`5Bj`5D = tmp; X `7D X for (i = 0; i < MAX_MUSH; i++) X `7B X j = randint(MAX_MUSH) - 1; X tmp = mushrooms`5Bi`5D; X mushrooms`5Bi`5D = mushrooms`5Bj`5D; X mushrooms`5Bj`5D = tmp; X `7D X for (h = 0; h < MAX_TITLES; h++) X `7B X string`5B0`5D = '\0'; X k = randint(2) + 1; X for (i = 0; i < k; i++) X`09`7B X`09 for (j = randint(2); j > 0; j--) X`09 (void) strcat(string, syllables`5Brandint(MAX_SYLLABLES) - 1`5D); X`09 if (i < k-1) X`09 (void) strcat(string, " "); X`09`7D X if (string`5B8`5D == ' ') X`09string`5B8`5D = '\0'; X else X`09string`5B9`5D = '\0'; X (void) strcpy(titles`5Bh`5D, string); X `7D X reset_seed(); X`7D X Xint16 object_offset(t_ptr) Xinven_type *t_ptr; X`7B X switch (t_ptr->tval) X `7B X case TV_AMULET:`09return(0); X case TV_RING:`09return(1); X case TV_STAFF:`09return(2); X case TV_WAND:`09return(3); X case TV_SCROLL1: X case TV_SCROLL2:`09return(4); X case TV_POTION1: X case TV_POTION2:`09return(5); X case TV_FOOD: X if ((t_ptr->subval & (ITEM_SINGLE_STACK_MIN - 1)) < MAX_MUSH) X`09return(6); X return(-1); X default: return(-1); X `7D X`7D X X/* Remove "Secret" symbol for identity of object`09`09`09*/ Xvoid known1(i_ptr) Xinven_type *i_ptr; X`7B X int16 offset; X int8u indexx; X X if ((offset = object_offset(i_ptr)) < 0) X return; X offset <<= 6; X indexx = i_ptr->subval & (ITEM_SINGLE_STACK_MIN - 1); X object_ident`5Boffset + indexx`5D `7C= OD_KNOWN1; X /* clear the tried flag, since it is now known */ X object_ident`5Boffset + indexx`5D &= `7EOD_TRIED; X`7D X Xint known1_p(i_ptr) Xinven_type *i_ptr; X`7B X int16 offset; X int8u indexx; X X /* Items which don't have a 'color' are always known1, so that they can X be carried in order in the inventory. */ X if ((offset = object_offset(i_ptr)) < 0) X return OD_KNOWN1; X if (store_bought_p(i_ptr)) X return OD_KNOWN1; X offset <<= 6; X indexx = i_ptr->subval & (ITEM_SINGLE_STACK_MIN - 1); X return(object_ident`5Boffset + indexx`5D & OD_KNOWN1); X`7D X X/* Remove "Secret" symbol for identity of plusses`09`09`09*/ Xvoid known2(i_ptr) Xinven_type *i_ptr; X`7B X unsample(i_ptr); X i_ptr->ident `7C= ID_KNOWN2; X`7D X Xint known2_p(i_ptr) Xinven_type *i_ptr; X`7B X return (i_ptr->ident & ID_KNOWN2); X`7D X Xvoid clear_known2(i_ptr) Xinven_type *i_ptr; X`7B X i_ptr->ident &= `7EID_KNOWN2; X`7D X Xvoid clear_empty(i_ptr) Xinven_type *i_ptr; X`7B X i_ptr->ident &= `7EID_EMPTY; X`7D X Xvoid store_bought(i_ptr) Xinven_type *i_ptr; X`7B X i_ptr->ident `7C= ID_STOREBOUGHT; X known2(i_ptr); X`7D X Xint store_bought_p(i_ptr) Xinven_type *i_ptr; X`7B X return (i_ptr->ident & ID_STOREBOUGHT); X`7D X X/*`09Remove an automatically generated inscription.`09-CJS- */ Xstatic void unsample(i_ptr) Xinven_type *i_ptr; X`7B X int16 offset; X int8u indexx; X X /* used to clear ID_DAMD flag, but I think it should remain set */ X i_ptr->ident &= `7E(ID_MAGIK`7CID_EMPTY); X if ((offset = object_offset(i_ptr)) < 0) X return; X offset <<= 6; X indexx = i_ptr->subval & (ITEM_SINGLE_STACK_MIN - 1); X object_ident`5Boffset + indexx`5D &= `7EOD_TRIED; X`7D X X/* unquote() is no longer needed */ X X/* Somethings been sampled -CJS- */ Xvoid sample (i_ptr) Xinven_type *i_ptr; X`7B X int16 offset; X int8u indexx; X X if ((offset = object_offset(i_ptr)) < 0) X return; X offset <<= 6; X indexx = i_ptr->subval & (ITEM_SINGLE_STACK_MIN - 1); X object_ident`5Boffset + indexx`5D `7C= OD_TRIED; X`7D X X/* Somethings been identified`09`09`09`09`09*/ X/* extra complexity by CJS so that it can merge store/dungeon objects X when appropriate */ Xvoid identify(item) Xint *item; X`7B X register int i, x1, x2; X int j; X register inven_type *i_ptr, *t_ptr; X#ifdef ATARIST_MWC X int32u holder; X#endif X X i_ptr = &inventory`5B*item`5D; X X#ifdef ATARIST_MWC X if (i_ptr->flags & (holder = TR_CURSED)) X#else X if (i_ptr->flags & TR_CURSED) X#endif X add_inscribe(i_ptr, ID_DAMD); X X if (!known1_p(i_ptr)) X `7B X known1(i_ptr); X x1 = i_ptr->tval; X x2 = i_ptr->subval; X if (x2 < ITEM_SINGLE_STACK_MIN `7C`7C x2 >= ITEM_GROUP_MIN) X`09/* no merging possible */ X`09; X else X`09for (i = 0; i < inven_ctr; i++) X`09 `7B X`09 t_ptr = &inventory`5Bi`5D; X`09 if (t_ptr->tval == x1 && t_ptr->subval == x2 && i != *item X`09`09&& ((int)t_ptr->number + (int)i_ptr->number < 256)) X`09 `7B X`09`09/* make *item the smaller number */ X`09`09if (*item > i) X`09`09 `7B X`09`09 j = *item; *item = i; i = j; X`09`09 `7D X`09 msg_print ("You combine similar objects from the shop and dungeon."); X X`09`09inventory`5B*item`5D.number += inventory`5Bi`5D.number; X`09`09inven_ctr--; X`09`09for (j = i; j < inven_ctr; j++) X`09`09 inventory`5Bj`5D = inventory`5Bj+1`5D; X`09`09invcopy(&inventory`5Bj`5D, OBJ_NOTHING); X`09 `7D X`09 `7D X `7D X`7D X X/* If an object has lost magical properties, X * remove the appropriate portion of the name.`09 -CJS- X */ Xvoid unmagic_name(i_ptr) Xinven_type *i_ptr; X`7B X i_ptr->name2 = SN_NULL; X`7D X X/* defines for p1_use, determine how the p1 field is printed */ X#define IGNORED 0 X#define CHARGES 1 X#define PLUSSES 2 X#define LIGHT 3 X#define FLAGS 4 X#define Z_PLUSSES 5 X X/* Returns a description of item for inventory`09`09`09*/ X/* pref indicates that there should be an article added (prefix) */ X/* note that since out_val can easily exceed 80 characters, objdes must X always be called with a bigvtype as the first paramter */ Xvoid objdes(out_val, i_ptr, pref) Xchar *out_val; +-+-+-+-+-+-+-+- END OF PART 10 +-+-+-+-+-+-+-+-