-+-+-+-+-+-+-+-+ START OF PART 59 -+-+-+-+-+-+-+-+ X rd_short((int16u *)&mon->hp); X rd_short((int16u *)&mon->csleep); X rd_short((int16u *)&mon->cspeed); X rd_short(&mon->mptr); X rd_byte(&mon->fy); X rd_byte(&mon->fx); X rd_byte(&mon->cdis); X rd_byte(&mon->ml); X rd_byte(&mon->stunned); X rd_byte(&mon->confused); X`7D X X/* functions called from death.c to implement the score file */ X X/* set the local fileptr to the scorefile fileptr */ Xvoid set_fileptr(file) XFILE *file; X`7B X fileptr = file; X`7D X Xvoid wr_highscore(score) Xhigh_scores *score; X`7B X DEBUG(logfile = fopen ("IO_LOG", "a")); X DEBUG(fprintf (logfile, "Saving score:\n")); X /* Save the encryption byte for robustness. */ X wr_byte(xor_byte); X X wr_long((int32u) score->points); X wr_long((int32u) score->birth_date); X wr_short((int16u) score->uid); X wr_short((int16u) score->mhp); X wr_short((int16u) score->chp); X wr_byte(score->dun_level); X wr_byte(score->lev); X wr_byte(score->max_dlv); X wr_byte(score->sex); X wr_byte(score->race); X wr_byte(score->class); X wr_bytes((int8u *)score->name, PLAYER_NAME_SIZE); X wr_bytes((int8u *)score->died_from, 25); X DEBUG(fclose (logfile)); X`7D X Xvoid rd_highscore(score) Xhigh_scores *score; X`7B X DEBUG(logfile = fopen ("IO_LOG", "a")); X DEBUG(fprintf (logfile, "Reading score:\n")); X /* Read the encryption byte. */ X rd_byte (&xor_byte); X X rd_long((int32u *)&score->points); X rd_long((int32u *)&score->birth_date); X rd_short((int16u *)&score->uid); X rd_short((int16u *)&score->mhp); X rd_short((int16u *)&score->chp); X rd_byte(&score->dun_level); X rd_byte(&score->lev); X rd_byte(&score->max_dlv); X rd_byte(&score->sex); X rd_byte(&score->race); X rd_byte(&score->class); X rd_bytes((int8u *)score->name, PLAYER_NAME_SIZE); X rd_bytes((int8u *)score->died_from, 25); X DEBUG(fclose (logfile)); X`7D $ CALL UNPACK SAVE.C;1 622083938 $ create 'f' $ CALL UNPACK SCORES.;1 0 $ create 'f' XIDENT "12-JUL-1990 11:05:15 VAX-11 FDL Editor" X XSYSTEM X SOURCE "VAX/VMS" X XFILE X BEST_TRY_CONTIGUOUS no X CLUSTER_SIZE 3 X CONTIGUOUS no X EXTENSION 0 X FILE_MONITORING no X GLOBAL_BUFFER_COUNT 0 X ORGANIZATION sequential X PROTECTION (system:RWED, owner:RWED, group:, world:RW) X XRECORD X BLOCK_SPAN yes X CARRIAGE_CONTROL carriage_return X FORMAT stream_LF $ CALL UNPACK SCORES.FDL;1 1496066880 $ create 'f' X/* source/scrolls.c: scroll 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#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#include X#else X#include X#endif X X/* Scrolls for the reading`09`09`09`09-RAK-`09*/ Xvoid read_scroll() X`7B X int32u i; X int j, k, item_val, y, x; X int tmp`5B6`5D, flag, used_up; X bigvtype out_val, tmp_str; X register int ident, l; X register inven_type *i_ptr; X register struct misc *m_ptr; X#ifdef ATARIST_MWC X int32u holder = TR_CURSED; X#endif X X free_turn_flag = TRUE; X if (py.flags.blind > 0) X msg_print("You can't see to read the scroll."); X else if (no_light()) X msg_print("You have no light to read by."); X else if (py.flags.confused > 0) X msg_print("You are too confused to read a scroll."); X else if (inven_ctr == 0) X msg_print("You are not carrying anything!"); X else if (!find_range(TV_SCROLL1, TV_SCROLL2, &j, &k)) X msg_print ("You are not carrying any scrolls!"); X else if (get_item(&item_val, "Read which scroll?", j, k, CNIL, CNIL)) X `7B X i_ptr = &inventory`5Bitem_val`5D; X free_turn_flag = FALSE; X used_up = TRUE; X i = i_ptr->flags; X ident = FALSE; X X while (i != 0) X`09`7B X`09 j = bit_pos(&i) + 1; X`09 if (i_ptr->tval == TV_SCROLL2) X`09 j += 32; X X`09 /* Scrolls.`09`09`09*/ X`09 switch(j) X`09 `7B X`09 case 1: X`09 i_ptr = &inventory`5BINVEN_WIELD`5D; X`09 if (i_ptr->tval != TV_NOTHING) X`09`09`7B X`09`09 objdes(tmp_str, i_ptr, FALSE); X`09`09 (void) sprintf(out_val, "Your %s glows faintly!", tmp_str); X`09`09 msg_print(out_val); X`09`09 if (enchant(&i_ptr->tohit, 10)) X`09`09 `7B X#ifdef ATARIST_MWC X`09`09 i_ptr->flags &= `7Eholder; X#else X`09`09 i_ptr->flags &= `7ETR_CURSED; X#endif X`09`09 calc_bonuses(); X`09`09 `7D X`09`09 else X`09`09 msg_print("The enchantment fails."); X`09`09 ident = TRUE; X`09`09`7D X`09 break; X`09 case 2: X`09 i_ptr = &inventory`5BINVEN_WIELD`5D; X`09 if (i_ptr->tval != TV_NOTHING) X`09`09`7B X`09`09 objdes(tmp_str, i_ptr, FALSE); X`09`09 (void) sprintf(out_val, "Your %s glows faintly!", tmp_str); X`09`09 msg_print(out_val); X`09`09 if ((i_ptr->tval >= TV_HAFTED)&&(i_ptr->tval <= TV_DIGGING)) X`09`09 j = i_ptr->damage`5B0`5D * i_ptr->damage`5B1`5D; X`09`09 else /* Bows' and arrows' enchantments should not be limited X`09`09`09 by their low base damages */ X`09`09 j = 10;`20 X`09`09 if (enchant(&i_ptr->todam, j)) X`09`09 `7B X#ifdef ATARIST_MWC X`09`09 i_ptr->flags &= `7Eholder; X#else X`09`09 i_ptr->flags &= `7ETR_CURSED; X#endif X`09`09 calc_bonuses (); X`09`09 `7D X`09`09 else X`09`09 msg_print("The enchantment fails."); X`09`09 ident = TRUE; X`09`09`7D X`09 break; X`09 case 3: X`09 k = 0; X`09 l = 0; X`09 if (inventory`5BINVEN_BODY`5D.tval != TV_NOTHING) X`09`09tmp`5Bk++`5D = INVEN_BODY; X`09 if (inventory`5BINVEN_ARM`5D.tval != TV_NOTHING) X`09`09tmp`5Bk++`5D = INVEN_ARM; X`09 if (inventory`5BINVEN_OUTER`5D.tval != TV_NOTHING) X`09`09tmp`5Bk++`5D = INVEN_OUTER; X`09 if (inventory`5BINVEN_HANDS`5D.tval != TV_NOTHING) X`09`09tmp`5Bk++`5D = INVEN_HANDS; X`09 if (inventory`5BINVEN_HEAD`5D.tval != TV_NOTHING) X`09`09tmp`5Bk++`5D = INVEN_HEAD; X`09 /* also enchant boots */ X`09 if (inventory`5BINVEN_FEET`5D.tval != TV_NOTHING) X`09`09tmp`5Bk++`5D = INVEN_FEET; X X`09 if (k > 0) l = tmp`5Brandint(k)-1`5D; X#ifdef ATARIST_MWC X`09 if (holder & inventory`5BINVEN_BODY`5D.flags) X`09`09l = INVEN_BODY; X`09 else if (holder & inventory`5BINVEN_ARM`5D.flags) X`09`09l = INVEN_ARM; X`09 else if (holder & inventory`5BINVEN_OUTER`5D.flags) X`09`09l = INVEN_OUTER; X`09 else if (holder & inventory`5BINVEN_HEAD`5D.flags) X`09`09l = INVEN_HEAD; X`09 else if (holder & inventory`5BINVEN_HANDS`5D.flags) X`09`09l = INVEN_HANDS; X`09 else if (holder & inventory`5BINVEN_FEET`5D.flags) X`09`09l = INVEN_FEET; X#else X`09 if (TR_CURSED & inventory`5BINVEN_BODY`5D.flags) X`09`09l = INVEN_BODY; X`09 else if (TR_CURSED & inventory`5BINVEN_ARM`5D.flags) X`09`09l = INVEN_ARM; X`09 else if (TR_CURSED & inventory`5BINVEN_OUTER`5D.flags) X`09`09l = INVEN_OUTER; X`09 else if (TR_CURSED & inventory`5BINVEN_HEAD`5D.flags) X`09`09l = INVEN_HEAD; X`09 else if (TR_CURSED & inventory`5BINVEN_HANDS`5D.flags) X`09`09l = INVEN_HANDS; X`09 else if (TR_CURSED & inventory`5BINVEN_FEET`5D.flags) X`09`09l = INVEN_FEET; X#endif X X`09 if (l > 0) X`09`09`7B X`09`09 i_ptr = &inventory`5Bl`5D; X`09`09 objdes(tmp_str, i_ptr, FALSE); X`09`09 (void) sprintf(out_val, "Your %s glows faintly!", tmp_str); X`09`09 msg_print(out_val); X`09`09 if (enchant(&i_ptr->toac, 10)) X`09`09 `7B X#ifdef ATARIST_MWC X`09`09 i_ptr->flags &= `7Eholder; X#else X`09`09 i_ptr->flags &= `7ETR_CURSED; X#endif X`09`09 calc_bonuses (); X`09`09 `7D X`09`09 else X`09`09 msg_print("The enchantment fails."); X`09`09 ident = TRUE; X`09`09`7D X`09 break; X`09 case 4: X`09 msg_print("This is an identify scroll."); X`09 ident = TRUE; X`09 used_up = ident_spell(); X X`09 /* The identify may merge objects, causing the identify scroll X`09`09 to move to a different place.`09Check for that here. It can X`09`09 move arbitrarily far if an identify scroll was used on X`09`09 another identify scroll, but it always moves down. */ X`09 while (i_ptr->tval != TV_SCROLL1 `7C`7C i_ptr->flags != 0x00000008) X`09`09`7B X`09`09 item_val--; X`09`09 i_ptr = &inventory`5Bitem_val`5D; X`09`09`7D X`09 break; X`09 case 5: X`09 if (remove_curse()) X`09`09`7B X`09`09 msg_print("You feel as if someone is watching over you."); X`09`09 ident = TRUE; X`09`09`7D X`09 break; X`09 case 6: X`09 ident = light_area(char_row, char_col); X`09 break; X`09 case 7: X`09 for (k = 0; k < randint(3); k++) X`09`09`7B X`09`09 y = char_row; X`09`09 x = char_col; X`09`09 ident `7C= summon_monster(&y, &x, FALSE); X`09`09`7D X`09 break; X`09 case 8: X`09 teleport(10); X`09 ident = TRUE; X`09 break; X`09 case 9: X`09 teleport(100); X`09 ident = TRUE; X`09 break; X`09 case 10: X`09 dun_level += (-3) + 2*randint(2); X`09 if (dun_level < 1) X`09`09dun_level = 1; X`09 new_level_flag = TRUE; X`09 ident = TRUE; X`09 break; X`09 case 11: X`09 if (py.flags.confuse_monster == 0) X`09`09`7B X`09`09 msg_print("Your hands begin to glow."); X`09`09 py.flags.confuse_monster = TRUE; X`09`09 ident = TRUE; X`09`09`7D X`09 break; X`09 case 12: X`09 ident = TRUE; X`09 map_area(); X`09 break; X`09 case 13: X`09 ident = sleep_monsters1(char_row, char_col); X`09 break; X`09 case 14: X`09 ident = TRUE; X`09 warding_glyph(); X`09 break; X`09 case 15: X`09 ident = detect_treasure(); X`09 break; X`09 case 16: X`09 ident = detect_object(); X`09 break; X`09 case 17: X`09 ident = detect_trap(); X`09 break; X`09 case 18: X`09 ident = detect_sdoor(); X`09 break; X`09 case 19: X`09 msg_print("This is a mass genocide scroll."); X`09 ident = mass_genocide(); X`09 break; X`09 case 20: X`09 ident = detect_invisible(); X`09 break; X`09 case 21: X`09 ident = aggravate_monster(20); X`09 if (ident) X`09`09msg_print("There is a high pitched humming noise."); X`09 break; X`09 case 22: X`09 ident = trap_creation(); X`09 break; X`09 case 23: X`09 ident = td_destroy(); X`09 break; X`09 case 24: X`09 ident = door_creation(); X`09 break; X`09 case 25: X`09 msg_print("This is a Recharge-Item scroll."); X`09 ident = TRUE; X`09 used_up = recharge(60); X`09 break; X`09 case 26: X`09 msg_print("This is a genocide scroll."); X`09 ident = genocide(); X`09 break; X`09 case 27: X`09 ident = unlight_area(char_row, char_col); X`09 break; X`09 case 28: X`09 ident = protect_evil(); X`09 break; X`09 case 29: X`09 ident = TRUE; X`09 create_food(); X`09 break; X`09 case 30: X`09 ident = dispel_creature(CD_UNDEAD, 60); X`09 break; X`09 case 33: X`09 i_ptr = &inventory`5BINVEN_WIELD`5D; X`09 if (i_ptr->tval != TV_NOTHING) X`09`09`7B X`09`09 objdes(tmp_str, i_ptr, FALSE); X`09`09 (void) sprintf(out_val, "Your %s glows brightly!", tmp_str); X`09`09 msg_print(out_val); X`09`09 flag = FALSE; X`09`09 for (k = 0; k < randint(2); k++) X`09`09 if (enchant(&i_ptr->tohit, 10)) X`09`09 flag = TRUE; X`09`09 if ((i_ptr->tval >= TV_HAFTED)&&(i_ptr->tval <= TV_DIGGING)) X`09`09 j = i_ptr->damage`5B0`5D * i_ptr->damage`5B1`5D; X`09`09 else /* Bows' and arrows' enchantments should not be limited X`09`09`09 by their low base damages */ X`09`09 j = 10;`20 X`09`09 for (k = 0; k < randint(2); k++) X`09`09 if (enchant(&i_ptr->todam, j)) X`09`09 flag = TRUE; X`09`09 if (flag) X`09`09 `7B X#ifdef ATARIST_MWC X`09`09 i_ptr->flags &= `7Eholder; X#else X`09`09 i_ptr->flags &= `7ETR_CURSED; X#endif X`09`09 calc_bonuses (); X`09`09 `7D X`09`09 else X`09`09 msg_print("The enchantment fails."); X`09`09 ident = TRUE; X`09`09`7D X`09 break; X`09 case 34: X`09 i_ptr = &inventory`5BINVEN_WIELD`5D; X`09 if (i_ptr->tval != TV_NOTHING) X`09`09`7B X`09`09 objdes(tmp_str, i_ptr, FALSE); X`09`09 (void)sprintf(out_val,"Your %s glows black, fades.",tmp_str); X`09`09 msg_print(out_val); X`09`09 unmagic_name(i_ptr); X`09`09 i_ptr->tohit = -randint(5) - randint(5); X`09`09 i_ptr->todam = -randint(5) - randint(5); X`09`09 /* Must call py_bonuses() before set (clear) flags, and X`09`09 must call calc_bonuses() after set (clear) flags, so that X`09`09 all attributes will be properly turned off. */ X`09`09 py_bonuses(i_ptr, -1); X`09`09 i_ptr->flags = TR_CURSED; X`09`09 calc_bonuses (); X`09`09 ident = TRUE; X`09`09`7D X`09 break; X`09 case 35: X`09 k = 0; X`09 l = 0; X`09 if (inventory`5BINVEN_BODY`5D.tval != TV_NOTHING) X`09`09tmp`5Bk++`5D = INVEN_BODY; X`09 if (inventory`5BINVEN_ARM`5D.tval != TV_NOTHING) X`09`09tmp`5Bk++`5D = INVEN_ARM; X`09 if (inventory`5BINVEN_OUTER`5D.tval != TV_NOTHING) X`09`09tmp`5Bk++`5D = INVEN_OUTER; X`09 if (inventory`5BINVEN_HANDS`5D.tval != TV_NOTHING) X`09`09tmp`5Bk++`5D = INVEN_HANDS; X`09 if (inventory`5BINVEN_HEAD`5D.tval != TV_NOTHING) X`09`09tmp`5Bk++`5D = INVEN_HEAD; X`09 /* also enchant boots */ X`09 if (inventory`5BINVEN_FEET`5D.tval != TV_NOTHING) X`09`09tmp`5Bk++`5D = INVEN_FEET; X X`09 if (k > 0) l = tmp`5Brandint(k)-1`5D; X#ifdef ATARIST_MWC X`09 if (holder & inventory`5BINVEN_BODY`5D.flags) X`09`09l = INVEN_BODY; X`09 else if (holder & inventory`5BINVEN_ARM`5D.flags) X`09`09l = INVEN_ARM; X`09 else if (holder & inventory`5BINVEN_OUTER`5D.flags) X`09`09l = INVEN_OUTER; X`09 else if (holder & inventory`5BINVEN_HEAD`5D.flags) X`09`09l = INVEN_HEAD; X`09 else if (holder & inventory`5BINVEN_HANDS`5D.flags) X`09`09l = INVEN_HANDS; +-+-+-+-+-+-+-+- END OF PART 59 +-+-+-+-+-+-+-+-