-+-+-+-+-+-+-+-+ START OF PART 15 -+-+-+-+-+-+-+-+ X examine_book(); X free_turn_flag = TRUE; X break; X case 'c':`09`09/* (c)lose an object */ X closeobject(); X break; X case 'd':`09`09/* (d)rop something */ X inven_command('d'); X break; X case 'e':`09`09/* (e)quipment list */ X inven_command('e'); X break; X case 't':`09`09/* (t)hrow something`09(f)ire something */ X throw_object(); X break; X case 'i':`09`09/* (i)nventory list */ X inven_command('i'); X break; X case 'S':`09`09/* (S)pike a door`09(j)am a door */ X jamdoor(); X break; X case 'x':`09`09/* e(x)amine surrounds`09(l)ook about */ X look(); X free_turn_flag = TRUE; X break; X case 'm':`09`09/* (m)agic spells */ X cast(); X break; X case 'o':`09`09/* (o)pen something */ X openobject(); X break; X case 'p':`09`09/* (p)ray */ X pray(); X break; X case 'q':`09`09/* (q)uaff */ X quaff(); X break; X case 'r':`09`09/* (r)ead */ X read_scroll(); X break; X case 's':`09`09/* (s)earch for a turn */ X search(char_row, char_col, py.misc.srh); X break; X case 'T':`09`09/* (T)ake off something`09(t)ake off */ X inven_command('t'); X break; X case 'Z':`09`09/* (Z)ap a staff`09(u)se a staff */ X use(); X break; X case 'v':`09`09/* (v)ersion of game */ X helpfile(MORIA_VER); X free_turn_flag = TRUE; X break; X case 'w':`09`09/* (w)ear or wield */ X inven_command('w'); X break; X case 'X':`09`09/* e(X)change weapons`09e(x)change */ X inven_command('x'); X break; X default: X if (wizard) X`09`7B X`09 free_turn_flag = TRUE; /* Wizard commands are free moves*/ X`09 switch(com_val) X`09 `7B X`09 case CTRL('A'):`09/*`5EA = Cure all*/ X`09 (void) remove_curse(); X`09 (void) cure_blindness(); X`09 (void) cure_confusion(); X`09 (void) cure_poison(); X`09 (void) remove_fear(); X`09 (void) res_stat(A_STR); X`09 (void) res_stat(A_INT); X`09 (void) res_stat(A_WIS); X`09 (void) res_stat(A_CON); X`09 (void) res_stat(A_DEX); X`09 (void) res_stat(A_CHR); X`09 f_ptr = &py.flags; X`09 if (f_ptr->slow > 1) X`09`09f_ptr->slow = 1; X`09 if (f_ptr->image > 1) X`09`09f_ptr->image = 1; X`09 break; X`09 case CTRL('E'):`09/*`5EE = wizchar */ X`09 change_character(); X`09 erase_line(MSG_LINE, 0); X`09 break; X`09 case CTRL('F'):`09/*`5EF = genocide*/ X`09 (void) mass_genocide(); X`09 break; X`09 case CTRL('G'):`09/*`5EG = treasure*/ X`09 if (command_count > 0) X`09`09`7B X`09`09 i = command_count; X`09`09 command_count = 0; X`09`09`7D X`09 else X`09`09i = 1; X`09 random_object(char_row, char_col, i); X`09 prt_map(); X`09 break; X`09 case CTRL('D'):`09/*`5ED = up/down */ X`09 if (command_count > 0) X`09`09`7B X`09`09 if (command_count > 99) X`09`09 i = 0; X`09`09 else X`09`09 i = command_count; X`09`09 command_count = 0; X`09`09`7D X`09 else X`09`09`7B X`09`09 prt("Go to which level (0-99) ? ", 0, 0); X`09`09 i = -1; X`09`09 if (get_string(tmp_str, 0, 27, 10)) X`09`09 i = atoi(tmp_str); X`09`09`7D X`09 if (i > -1) X`09`09`7B X`09`09 dun_level = i; X`09`09 if (dun_level > 99) X`09`09 dun_level = 99; X`09`09 new_level_flag = TRUE; X`09`09`7D X`09 else X`09`09erase_line(MSG_LINE, 0); X`09 break; X`09 case CTRL('O'):`09/*`5EO = objects */ X`09 print_objects(); X`09 break; X`09 case '\\': /* \ wizard help */ X`09 if (rogue_like_commands) X`09`09helpfile(MORIA_WIZ_HELP); X`09 else X`09`09helpfile(MORIA_OWIZ_HELP); X`09 break; X`09 case CTRL('I'):`09/*`5EI = identify*/ X`09 (void) ident_spell(); X`09 break; X`09 case '*': X`09 wizard_light(); X`09 break; X`09 case ':': X`09 map_area(); X`09 break; X`09 case CTRL('T'):`09/*`5ET = teleport*/ X`09 teleport(100); X`09 break; X`09 case '+': X`09 if (command_count > 0) X`09`09`7B X`09`09 py.misc.exp = command_count; X`09`09 command_count = 0; X`09`09`7D X`09 else if (py.misc.exp == 0) X`09`09py.misc.exp = 1; X`09 else X`09`09py.misc.exp = py.misc.exp * 2; X`09 prt_experience(); X`09 break; X`09 case '&':`09/*& = summon */ X`09 y = char_row; X`09 x = char_col; X`09 (void) summon_monster(&y, &x, TRUE); X`09 creatures(FALSE); X`09 break; X`09 case '@': X`09 wizard_create(); X`09 break; X`09 default: X`09 if (rogue_like_commands) X`09`09prt("Type '?' or '\\' for help.", 0, 0); X`09 else X`09`09prt("Type '?' or `5EH for help.", 0, 0); X`09 `7D X`09`7D X else X`09`7B X`09 prt("Type '?' for help.", 0, 0); X`09 free_turn_flag = TRUE; X`09`7D X `7D X last_command = com_val; X`7D X X/* Check whether this command will accept a count. -CJS- */ Xstatic int valid_countcommand(c) Xchar c; X`7B X switch(c) X `7B X case 'Q': X case CTRL('W'): X case CTRL('X'): X case '=': X case '`7B': X case '/': X case '<': X case '>': X case '?': X case 'C': X case 'E': X case 'F': X case 'G': X case 'V': X case '#': X case 'z': X case 'P': X case 'c': X case 'd': X case 'e': X case 't': X case 'i': X case 'x': X case 'm': X case 'p': X case 'q': X case 'r': X case 'T': X case 'Z': X case 'v': X case 'w': X case 'W': X case 'X': X case CTRL('A'): X case '\\': X case CTRL('I'): X case '*': X case ':': X case CTRL('T'): X case CTRL('E'): X case CTRL('F'): X case CTRL('S'): X case CTRL('Q'): X return FALSE; X case CTRL('P'): X case ESCAPE: X case ' ': X case '-': X case 'b': X case 'f': X case 'j': X case 'n': X case 'h': X case 'l': X case 'y': X case 'k': X case 'u': X case '.': X case 'B': X case 'J': X case 'N': X case 'H': X case 'L': X case 'Y': X case 'K': X case 'U': X case 'D': X case 'R': X case CTRL('Y'): X case CTRL('K'): X case CTRL('U'): X case CTRL('L'): X case CTRL('N'): X case CTRL('J'): X case CTRL('B'): X case CTRL('H'): X case 'S': X case 'o': X case 's': X case CTRL('D'): X case CTRL('G'): X case '+': X return TRUE; X default: X return FALSE; X `7D X`7D X X X/* Regenerate hit points`09`09`09`09-RAK-`09*/ Xstatic void regenhp(percent) Xint percent; X`7B X register struct misc *p_ptr; X register int32 new_chp, new_chp_frac; X int old_chp; X X p_ptr = &py.misc; X old_chp = p_ptr->chp; X new_chp = ((long)p_ptr->mhp) * percent + PLAYER_REGEN_HPBASE; X p_ptr->chp += new_chp >> 16;`09/* div 65536 */ X /* check for overflow */ X if (p_ptr->chp < 0 && old_chp > 0) X p_ptr->chp = MAX_SHORT; X new_chp_frac = (new_chp & 0xFFFF) + p_ptr->chp_frac; /* mod 65536 */ X if (new_chp_frac >= 0x10000L) X `7B X p_ptr->chp_frac = new_chp_frac - 0x10000L; X p_ptr->chp++; X `7D X else X p_ptr->chp_frac = new_chp_frac; X X /* must set frac to zero even if equal */ X if (p_ptr->chp >= p_ptr->mhp) X `7B X p_ptr->chp = p_ptr->mhp; X p_ptr->chp_frac = 0; X `7D X if (old_chp != p_ptr->chp) X prt_chp(); X`7D X X X/* Regenerate mana points`09`09`09`09-RAK-`09*/ Xstatic void regenmana(percent) Xint percent; X`7B X register struct misc *p_ptr; X register int32 new_mana, new_mana_frac; X int old_cmana; X X p_ptr = &py.misc; X old_cmana = p_ptr->cmana; X new_mana = ((long)p_ptr->mana) * percent + PLAYER_REGEN_MNBASE; X p_ptr->cmana += new_mana >> 16; /* div 65536 */ X /* check for overflow */ X if (p_ptr->cmana < 0 && old_cmana > 0) X p_ptr->cmana = MAX_SHORT; X new_mana_frac = (new_mana & 0xFFFF) + p_ptr->cmana_frac; /* mod 65536 */ X if (new_mana_frac >= 0x10000L) X `7B X p_ptr->cmana_frac = new_mana_frac - 0x10000L; X p_ptr->cmana++; X `7D X else X p_ptr->cmana_frac = new_mana_frac; X X /* must set frac to zero even if equal */ X if (p_ptr->cmana >= p_ptr->mana) X `7B X p_ptr->cmana = p_ptr->mana; X p_ptr->cmana_frac = 0; X `7D X if (old_cmana != p_ptr->cmana) X prt_cmana(); X`7D X X X/* Is an item an enchanted weapon or armor and we don't know? -CJS- */ X/* only returns true if it is a good enchantment */ Xstatic int enchanted (t_ptr) Xregister inven_type *t_ptr; X`7B X#ifdef ATARIST_MWC X int32u holder; X#endif X X if (t_ptr->tval < TV_MIN_ENCHANT `7C`7C t_ptr->tval > TV_MAX_ENCHANT X#ifdef ATARIST_MWC X `7C`7C t_ptr->flags & (holder = TR_CURSED)) X#else X `7C`7C t_ptr->flags & TR_CURSED) X#endif X return FALSE; X if (known2_p(t_ptr)) X return FALSE; X if (t_ptr->ident & ID_MAGIK) X return FALSE; X if (t_ptr->tohit > 0 `7C`7C t_ptr->todam > 0 `7C`7C t_ptr->toac > 0) X return TRUE; X if ((0x4000107fL & t_ptr->flags) && t_ptr->p1 > 0) X return TRUE; X if (0x07ffe980L & t_ptr->flags) X return TRUE; X X return FALSE; X`7D X X X/* Examine a Book`09`09`09`09`09-RAK-`09*/ Xstatic void examine_book() X`7B X int32u j; X int i, k, item_val, flag; X int spell_index`5B31`5D; X register inven_type *i_ptr; X register spell_type *s_ptr; X X if (!find_range(TV_MAGIC_BOOK, TV_PRAYER_BOOK, &i, &k)) X msg_print("You are not carrying any books."); X else if (py.flags.blind > 0) X msg_print("You can't see to read your spell book!"); 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."); X else if (get_item(&item_val, "Which Book?", i, k, CNIL, CNIL)) X `7B X flag = TRUE; X i_ptr = &inventory`5Bitem_val`5D; X if (class`5Bpy.misc.pclass`5D.spell == MAGE) X`09`7B X`09 if (i_ptr->tval != TV_MAGIC_BOOK) X`09 flag = FALSE; X`09`7D X else if (class`5Bpy.misc.pclass`5D.spell == PRIEST) X`09`7B X`09 if (i_ptr->tval != TV_PRAYER_BOOK) X`09 flag = FALSE; X`09`7D X else X`09flag = FALSE; X X if (!flag) X`09msg_print("You do not understand the language."); X else X`09`7B X`09 i = 0; X`09 j = inventory`5Bitem_val`5D.flags; X`09 while (j) X`09 `7B X`09 k = bit_pos(&j); X`09 s_ptr = &magic_spell`5Bpy.misc.pclass-1`5D`5Bk`5D; X`09 if (s_ptr->slevel < 99) X`09`09`7B X`09`09 spell_index`5Bi`5D = k; X`09`09 i++; X`09`09`7D X`09 `7D X`09 save_screen(); X`09 print_spells(spell_index, i, TRUE, -1); X`09 pause_line(0); X`09 restore_screen(); X`09`7D X `7D X`7D X X X/* Go up one level`09`09`09`09`09-RAK-`09*/ Xstatic void go_up() X`7B X register cave_type *c_ptr; X register int no_stairs = FALSE; X X c_ptr = &cave`5Bchar_row`5D`5Bchar_col`5D; X if (c_ptr->tptr != 0) X if (t_list`5Bc_ptr->tptr`5D.tval == TV_UP_STAIR) X `7B X`09dun_level--; X`09new_level_flag = TRUE; X`09msg_print("You enter a maze of up staircases."); X`09msg_print("You pass through a one-way door."); X `7D X else X no_stairs = TRUE; X else X no_stairs = TRUE; X X if (no_stairs) X `7B X msg_print("I see no up staircase here."); X free_turn_flag = TRUE; X `7D X`7D X X X/* Go down one level`09`09`09`09`09-RAK-`09*/ Xstatic void go_down() X`7B X register cave_type *c_ptr; X register int no_stairs = FALSE; X X c_ptr = &cave`5Bchar_row`5D`5Bchar_col`5D; X if (c_ptr->tptr != 0) X if (t_list`5Bc_ptr->tptr`5D.tval == TV_DOWN_STAIR) X `7B X`09dun_level++; X`09new_level_flag = TRUE; X`09msg_print("You enter a maze of down staircases."); X`09msg_print("You pass through a one-way door."); X `7D X else X no_stairs = TRUE; X else X no_stairs = TRUE; X X if (no_stairs) X `7B X msg_print("I see no down staircase here."); X free_turn_flag = TRUE; X `7D X`7D X X X/* Jam a closed door`09`09`09`09`09-RAK-`09*/ Xstatic void jamdoor() X`7B X int y, x, dir, i, j; X register cave_type *c_ptr; X register inven_type *t_ptr, *i_ptr; X char tmp_str`5B80`5D; X X free_turn_flag = TRUE; X y = char_row; X x = char_col; X if (get_dir(CNIL, &dir)) X `7B X (void) mmove(dir, &y, &x); X c_ptr = &cave`5By`5D`5Bx`5D; X if (c_ptr->tptr != 0) X`09`7B X`09 t_ptr = &t_list`5Bc_ptr->tptr`5D; X`09 if (t_ptr->tval == TV_CLOSED_DOOR) X`09 if (c_ptr->cptr == 0) X`09 `7B X`09`09if (find_range(TV_SPIKE, TV_NEVER, &i, &j)) X`09`09 `7B X`09`09 free_turn_flag = FALSE; X`09`09 count_msg_print("You jam the door with a spike."); X`09`09 if (t_ptr->p1 > 0) X`09`09 t_ptr->p1 = -t_ptr->p1;`09/* Make locked to stuck. */ X`09`09 /* Successive spikes have a progressively smaller effect. X`09`09 Series is: 0 20 30 37 43 48 52 56 60 64 67 70 ... */ X`09`09 t_ptr->p1 -= 1 + 190 / (10 - t_ptr->p1); X`09`09 i_ptr = &inventory`5Bi`5D; X`09`09 if (i_ptr->number > 1) X`09`09 `7B X`09`09`09i_ptr->number--; X`09`09`09inven_weight -= i_ptr->weight; X`09`09 `7D X`09`09 else X`09`09 inven_destroy(i); X`09`09 `7D X`09`09else X`09`09 msg_print("But you have no spikes."); X`09 `7D X`09 else X`09 `7B X`09`09free_turn_flag = FALSE; X`09`09(void) sprintf(tmp_str, "The %s is in your way!", X`09`09`09 c_list`5Bm_list`5Bc_ptr->cptr`5D.mptr`5D.name); X`09`09msg_print(tmp_str); X`09 `7D X`09 else if (t_ptr->tval == TV_OPEN_DOOR) X`09 msg_print("The door must be closed first."); X`09 else X`09 msg_print("That isn't a door!"); X`09`7D X else X`09msg_print("That isn't a door!"); X `7D X`7D X X X/* Refill the players lamp`09`09`09`09-RAK-`09*/ Xstatic void refill_lamp() X`7B X int i, j; X register int k; X register inven_type *i_ptr; X X free_turn_flag = TRUE; X k = inventory`5BINVEN_LIGHT`5D.subval; X if (k != 0) X msg_print("But you are not using a lamp."); X else if (!find_range(TV_FLASK, TV_NEVER, &i, &j)) X msg_print("You have no oil."); X else X `7B X free_turn_flag = FALSE; +-+-+-+-+-+-+-+- END OF PART 15 +-+-+-+-+-+-+-+-