-+-+-+-+-+-+-+-+ START OF PART 14 -+-+-+-+-+-+-+-+ X`09 /* but first move the cursor onto the player, for aesthetics */ X`09 move_cursor_relative (char_row, char_col); X`09 put_qio (); X`09`7D X X /* Teleport?`09`09 */ X if (teleport_flag) teleport(100); X /* Move the creatures`09 */ X if (!new_level_flag) creatures(TRUE); X /* Exit when new_level_flag is set */ X `7D X while (!new_level_flag && !eof_flag); X`7D X X Xstatic char original_commands(com_val) Xchar com_val; X`7B X int dir_val; X X switch(com_val) X `7B X case CTRL('K'):`09/*`5EK = exit */ X com_val = 'Q'; X break; X case CTRL('J'): X case CTRL('M'): X com_val = '+'; X break; X case CTRL('P'):`09/*`5EP = repeat */ X case CTRL('W'):`09/*`5EW = password*/ X case CTRL('X'):`09/*`5EX = save */ X case ' ': X case '!': X case '$': X break; X case '.': X if (get_dir(CNIL, &dir_val)) X`09switch (dir_val) X`09 `7B X`09 case 1: com_val = 'B'; break; X`09 case 2: com_val = 'J'; break; X`09 case 3: com_val = 'N'; break; X`09 case 4: com_val = 'H'; break; X`09 case 6: com_val = 'L'; break; X`09 case 7: com_val = 'Y'; break; X`09 case 8: com_val = 'K'; break; X`09 case 9: com_val = 'U'; break; X`09 default: com_val = ' '; break; X`09 `7D X else X`09com_val = ' '; X break; X case '/': X case '<': X case '>': X case '-': X case '=': X case '`7B': X case '?': X case 'A': X break; X case '1': X com_val = 'b'; X break; X case '2': X com_val = 'j'; X break; X case '3': X com_val = 'n'; X break; X case '4': X com_val = 'h'; X break; X case '5':`09/* Rest one turn */ X com_val = '.'; X break; X case '6': X com_val = 'l'; X break; X case '7': X com_val = 'y'; X break; X case '8': X com_val = 'k'; X break; X case '9': X com_val = 'u'; X break; X case 'B': X com_val = 'f'; X break; X case 'C': X case 'D': X case 'E': X case 'F': X case 'G': X break; X case 'L': X com_val = 'W'; X break; X case 'M': X break; X case 'R': X break; X case 'S': X com_val = '#'; X break; X case 'T': X if (get_dir(CNIL, &dir_val)) X`09switch (dir_val) X`09 `7B X`09 case 1: com_val = CTRL('B'); break; X`09 case 2: com_val = CTRL('J'); break; X`09 case 3: com_val = CTRL('N'); break; X`09 case 4: com_val = CTRL('H'); break; X`09 case 6: com_val = CTRL('L'); break; X`09 case 7: com_val = CTRL('Y'); break; X`09 case 8: com_val = CTRL('K'); break; X`09 case 9: com_val = CTRL('U'); break; X`09 default: com_val = ' ';`09 break; X`09 `7D X else X`09com_val = ' '; X break; X case 'V': X break; X case 'a': X com_val = 'z'; X break; X case 'b': X com_val = 'P'; X break; X case 'c': X case 'd': X case 'e': X break; X case 'f': X com_val = 't'; X break; X case 'h': X com_val = '?'; X break; X case 'i': X break; X case 'j': X com_val = 'S'; X break; X case 'l': X com_val = 'x'; X break; X case 'm': X case 'o': X case 'p': X case 'q': X case 'r': X case 's': X break; X case 't': X com_val = 'T'; X break; X case 'u': X com_val = 'Z'; X break; X case 'v': X case 'w': X break; X case 'x': X com_val = 'X'; X break; X X /* wizard mode commands follow */ X case CTRL('A'): /*`5EA = cure all */ X break; X case CTRL('B'):`09/*`5EB = objects */ X com_val = CTRL('O'); X break; X case CTRL('D'):`09/*`5ED = up/down */ X break; X case CTRL('H'):`09/*`5EH = wizhelp */ X com_val = '\\'; X break; X case CTRL('I'):`09/*`5EI = identify*/ X break; X case CTRL('L'):`09/*`5EL = wizlight*/ X com_val = '*'; X break; X case ':': X case CTRL('T'):`09/*`5ET = teleport*/ X case CTRL('E'):`09/*`5EE = wizchar */ X case CTRL('F'):`09/*`5EF = genocide*/ X case CTRL('G'):`09/*`5EG = treasure*/ X case '@': X case '+': X break; X case CTRL('U'):`09/*`5EU = summon */ X com_val = '&'; X break; X default: X com_val = '`7E'; /* Anything illegal. */ X break; X `7D X return com_val; X`7D X X Xstatic void do_command(com_val) Xchar com_val; X`7B X int dir_val, do_pickup; X int y, x, i, j; X vtype out_val, tmp_str; X register struct flags *f_ptr; X X /* hack for move without pickup. Map '-' to a movement command. */ X if (com_val == '-') X `7B X do_pickup = FALSE; X i = command_count; X if (get_dir(CNIL, &dir_val)) X`09`7B X`09 command_count = i; X`09 switch (dir_val) X`09 `7B X`09 case 1: com_val = 'b';`09 break; X`09 case 2: com_val = 'j';`09 break; X`09 case 3: com_val = 'n';`09 break; X`09 case 4: com_val = 'h';`09 break; X`09 case 6: com_val = 'l';`09 break; X`09 case 7: com_val = 'y';`09 break; X`09 case 8: com_val = 'k';`09 break; X`09 case 9: com_val = 'u';`09 break; X`09 default: com_val = '`7E';`09 break; X`09 `7D X`09`7D X else X`09com_val = ' '; X `7D X else X do_pickup = TRUE; X X switch(com_val) X `7B X case 'Q':`09/* (Q)uit`09`09(`5EK)ill */ X flush(); X if (get_check("Do you really want to quit?")) X`09`7B X`09 new_level_flag = TRUE; X`09 death = TRUE; X`09 (void) strcpy(died_from, "Quitting"); X`09`7D X free_turn_flag = TRUE; X break; X case CTRL('P'):`09/* (`5EP)revious message. */ X if (command_count > 0) X`09`7B X`09 i = command_count; X`09 if (i > MAX_SAVE_MSG) X`09 i = MAX_SAVE_MSG; X`09 command_count = 0; X`09`7D X else if (last_command != CTRL('P')) X`09i = 1; X else X`09i = MAX_SAVE_MSG; X j = last_msg; X if (i > 1) X`09`7B X`09 save_screen(); X`09 x = i; X`09 while (i > 0) X`09 `7B X`09 i--; X`09 prt(old_msg`5Bj`5D, i, 0); X`09 if (j == 0) X`09`09j = MAX_SAVE_MSG-1; X`09 else X`09`09j--; X`09 `7D X`09 erase_line (x, 0); X`09 pause_line(x); X`09 restore_screen(); X`09`7D X else X`09`7B X`09 /* Distinguish real and recovered messages with a '>'. -CJS- */ X`09 put_buffer(">", 0, 0); X`09 prt(old_msg`5Bj`5D, 0, 1); X`09`7D X free_turn_flag = TRUE; X break; X case CTRL('W'):`09/* (`5EW)izard mode */ X if (wizard) X`09`7B X`09 wizard = FALSE; X`09 msg_print("Wizard mode off."); X`09`7D X else if (enter_wiz_mode()) X`09msg_print("Wizard mode on."); X prt_winner(); X free_turn_flag = TRUE; X break; X case CTRL('X'):`09/* e(`5EX)it and save */ X if (total_winner) X`09`7B X msg_print("You are a Total Winner, your character must be retired.") V; X`09 if (rogue_like_commands) X`09 msg_print("Use 'Q' to when you are ready to quit."); X`09 else X`09 msg_print ("Use -K when you are ready to quit."); X`09`7D X else X`09`7B X`09 (void) strcpy (died_from, "(saved)"); X`09 msg_print ("Saving game..."); X#ifdef MAC X`09 if (save_char (TRUE)) X`09 exit_game(); X#else X`09 if (save_char ()) X`09 exit_game(); X#endif X`09 (void) strcpy (died_from, "(alive and well)"); X`09`7D X free_turn_flag = TRUE; X break; X case '=':`09`09/* (=) set options */ X save_screen(); X set_options(); X restore_screen(); X free_turn_flag = TRUE; X break; X case '`7B':`09`09/* (`7B) inscribe an object */ X scribe_object (); X free_turn_flag = TRUE; X break; X case '!':`09`09/* (!) escape to the shell */ X case '$': X#ifdef SECURE X msg_print("Sorry, inferior shells are not allowed from Moria."); X#else X shell_out(); X#endif X free_turn_flag = TRUE; X break; X case ESCAPE:`09/* (ESC) do nothing. */ X case ' ':`09`09/* (space) do nothing. */ X free_turn_flag = TRUE; X break; X case 'b':`09`09/* (b) down, left`09(1) */ X move_char(1, do_pickup); X break; X case 'j':`09`09/* (j) down`09`09(2) */ X move_char(2, do_pickup); X break; X case 'n':`09`09/* (n) down, right`09(3) */ X move_char(3, do_pickup); X break; X case 'h':`09`09/* (h) left`09`09(4) */ X move_char(4, do_pickup); X break; X case 'l':`09`09/* (l) right`09`09(6) */ X move_char(6, do_pickup); X break; X case 'y':`09`09/* (y) up, left`09`09(7) */ X move_char(7, do_pickup); X break; X case 'k':`09`09/* (k) up`09`09(8) */ X move_char(8, do_pickup); X break; X case 'u':`09`09/* (u) up, right`09(9) */ X move_char(9, do_pickup); X break; X case 'B':`09`09/* (B) run down, left`09(. 1) */ X find_init(1); X break; X case 'J':`09`09/* (J) run down`09`09(. 2) */ X find_init(2); X break; X case 'N':`09`09/* (N) run down, right`09(. 3) */ X find_init(3); X break; X case 'H':`09`09/* (H) run left`09`09(. 4) */ X find_init(4); X break; X case 'L':`09`09/* (L) run right`09(. 6) */ X find_init(6); X break; X case 'Y':`09`09/* (Y) run up, left`09(. 7) */ X find_init(7); X break; X case 'K':`09`09/* (K) run up`09`09(. 8) */ X find_init(8); X break; X case 'U':`09`09/* (U) run up, right`09(. 9) */ X find_init(9); X break; X case '/':`09`09/* (/) identify a symbol */ X ident_char(); X free_turn_flag = TRUE; X break; X case '.':`09`09/* (.) stay in one place (5) */ X move_char (5, do_pickup); X if (command_count > 1) X`09`7B X`09 command_count--; X`09 rest(); X`09`7D X break; X case '<':`09`09/* (<) go down a staircase */ X go_up(); X break; X case '>':`09`09/* (>) go up a staircase */ X go_down(); X break; X case '?':`09`09/* (?) help with commands */ X if (rogue_like_commands) X`09helpfile(MORIA_HELP); X else X`09helpfile(MORIA_ORIG_HELP); X free_turn_flag = TRUE; X break; X case 'f':`09`09/* (f)orce`09`09(B)ash */ X bash(); X break; X case 'C':`09`09/* (C)haracter description */ X save_screen(); X change_name(); X restore_screen(); X free_turn_flag = TRUE; X break; X case 'D':`09`09/* (D)isarm trap */ X disarm_trap(); X break; X case 'E':`09`09/* (E)at food */ X eat(); X break; X case 'F':`09`09/* (F)ill lamp */ X refill_lamp(); X break; X case 'G':`09`09/* (G)ain magic spells */ X gain_spells(); X break; X case 'V':`09`09/* (V)iew scores */ X if (last_command != 'V') X`09i = TRUE; X else X`09i = FALSE; X save_screen(); X display_scores(i); X restore_screen(); X free_turn_flag = TRUE; X break; X case 'W':`09`09/* (W)here are we on the map`09(L)ocate on map */ X if ((py.flags.blind > 0) `7C`7C no_light()) X`09msg_print("You can't see your map."); X else X`09`7B X`09 int cy, cx, p_y, p_x; X X`09 y = char_row; X`09 x = char_col; X`09 if (get_panel(y, x, TRUE)) X`09 prt_map(); X`09 cy = panel_row; X`09 cx = panel_col; X`09 for(;;) X`09 `7B X`09 p_y = panel_row; X`09 p_x = panel_col; X`09 if (p_y == cy && p_x == cx) X`09`09tmp_str`5B0`5D = '\0'; X`09 else X`09`09(void) sprintf(tmp_str, "%s%s of", X`09`09`09 p_y < cy ? " North" : p_y > cy ? " South" : "", X`09`09`09 p_x < cx ? " West" : p_x > cx ? " East" : ""); X`09 (void) sprintf(out_val, X`09 "Map sector `5B%d,%d`5D, which is%s your sector. Look which direction? V", X`09`09`09 p_y, p_x, tmp_str); X`09 if (!get_dir(out_val, &dir_val)) X`09`09break; X/*`09`09`09`09`09`09`09`09 -CJS- X// Should really use the move function, but what the hell. This X// is nicer, as it moves exactly to the same place in another X// section. The direction calculation is not intuitive. Sorry. X*/ X`09 for(;;)`7B X`09`09x += ((dir_val-1)%3 - 1) * SCREEN_WIDTH/2; X`09`09y -= ((dir_val-1)/3 - 1) * SCREEN_HEIGHT/2; X`09`09if (x < 0 `7C`7C y < 0 `7C`7C x >= cur_width `7C`7C y >= cur_width) X`09`09 `7B X`09`09 msg_print("You've gone past the end of your map."); X`09`09 x -= ((dir_val-1)%3 - 1) * SCREEN_WIDTH/2; X`09`09 y += ((dir_val-1)/3 - 1) * SCREEN_HEIGHT/2; X`09`09 break; X`09`09 `7D X`09`09if (get_panel(y, x, TRUE)) X`09`09 `7B X`09`09 prt_map(); X`09`09 break; X`09`09 `7D X`09 `7D X`09 `7D X`09 /* Move to a new panel - but only if really necessary. */ X`09 if (get_panel(char_row, char_col, FALSE)) X`09 prt_map(); X`09`7D X free_turn_flag = TRUE; X break; X case 'R':`09`09/* (R)est a while */ X rest(); X break; X case '#':`09`09/* (#) search toggle`09(S)earch toggle */ X if (py.flags.status & PY_SEARCH) X`09search_off(); X else X`09search_on(); X free_turn_flag = TRUE; X break; X case CTRL('B'):`09`09/* (`5EB) tunnel down left`09(T 1) */ X tunnel(1); X break; X case CTRL('M'):`09`09/* cr must be treated same as lf. */ X case CTRL('J'):`09`09/* (`5EJ) tunnel down`09`09(T 2) */ X tunnel(2); X break; X case CTRL('N'):`09`09/* (`5EN) tunnel down right`09(T 3) */ X tunnel(3); X break; X case CTRL('H'):`09`09/* (`5EH) tunnel left`09`09(T 4) */ X tunnel(4); X break; X case CTRL('L'):`09`09/* (`5EL) tunnel right`09`09(T 6) */ X tunnel(6); X break; X case CTRL('Y'):`09`09/* (`5EY) tunnel up left`09`09(T 7) */ X tunnel(7); X break; X case CTRL('K'):`09`09/* (`5EK) tunnel up`09`09(T 8) */ X tunnel(8); X break; X case CTRL('U'):`09`09/* (`5EU) tunnel up right`09`09(T 9) */ X tunnel(9); X break; X case 'z':`09`09/* (z)ap a wand`09`09(a)im a wand */ X aim(); X break; X case 'M': X screen_map(); X free_turn_flag = TRUE; X break; X case 'P':`09`09/* (P)eruse a book`09(B)rowse in a book */ +-+-+-+-+-+-+-+- END OF PART 14 +-+-+-+-+-+-+-+-