Ticket #927: target-help-and-coords.patch

File target-help-and-coords.patch, 10.7 KB (added by rhinocesaurus, 10 years ago)

Should fix both this and #924, with a "Press '?' for help" expanding into a three-line help, and coordinates on the top line. I haven't yet been able to test this with a main window larger than usual. adjust_panel in xtra2.c is now unused, FYI. Output on the top line is still >80 characters in extreme examples but is fine 99% of the time.

  • src/target.c

     
    1919#include "game-cmd.h" 
    2020/*#include "cmds.h"*/ 
    2121 
     22/*  
     23 * Height of the help screen; any higher than 4 will overlap the health 
     24 * bar which we want to keep in targeting mode. 
     25 */ 
     26#define HELP_HEIGHT 3 
    2227 
    2328/*** File-wide variables ***/ 
    2429 
     
    458463 
    459464 
    460465/* 
     466 * Perform the minimum "whole panel" adjustment to ensure that the given 
     467 * location is contained inside the current panel, and return TRUE if any 
     468 * such adjustment was performed. Optionally accounts for the targeting 
     469 * help window. 
     470 */ 
     471bool adjust_panel_help(int y, int x, bool help) 
     472{ 
     473        bool changed = FALSE; 
     474 
     475        int j; 
     476 
     477        int screen_hgt_main = help ? (Term->hgt - ROW_MAP - 3)  
     478                                   : (Term->hgt - ROW_MAP - 1); 
     479 
     480        /* Scan windows */ 
     481        for (j = 0; j < ANGBAND_TERM_MAX; j++) 
     482        { 
     483                int wx, wy; 
     484                int screen_hgt, screen_wid; 
     485 
     486                term *t = angband_term[j]; 
     487 
     488                /* No window */ 
     489                if (!t) continue; 
     490 
     491                /* No relevant flags */ 
     492                if ((j > 0) && !(op_ptr->window_flag[j] & PW_MAP)) continue; 
     493 
     494                wy = t->offset_y; 
     495                wx = t->offset_x; 
     496 
     497                screen_hgt = (j == 0) ? screen_hgt_main : t->hgt; 
     498                screen_wid = (j == 0) ? (Term->wid - COL_MAP - 1) : t->wid; 
     499 
     500                /* Bigtile panels only have half the width */ 
     501                if (use_bigtile) screen_wid = screen_wid / 2; 
     502 
     503                /* Adjust as needed */ 
     504                while (y >= wy + screen_hgt) wy += screen_hgt / 2; 
     505                while (y < wy) wy -= screen_hgt / 2; 
     506 
     507                /* Adjust as needed */ 
     508                while (x >= wx + screen_wid) wx += screen_wid / 2; 
     509                while (x < wx) wx -= screen_wid / 2; 
     510 
     511                /* Use "modify_panel" */ 
     512                if (modify_panel(t, wy, wx)) changed = TRUE; 
     513        } 
     514 
     515        return (changed); 
     516} 
     517 
     518 
     519/* 
     520 * Describe a location relative to the player position. 
     521 * e.g. "12 S 35 W" or "0 N, 33 E" or "0 N, 0 E" 
     522 */ 
     523void coords_desc(char *buf, int size, int y, int x) { 
     524         
     525        char *east_or_west; 
     526        char *north_or_south; 
     527 
     528        int py = p_ptr->py; 
     529        int px = p_ptr->px; 
     530         
     531        if (y > py) 
     532                north_or_south = "S"; 
     533        else 
     534                north_or_south = "N"; 
     535         
     536        if (x < px) 
     537                east_or_west = "W"; 
     538        else 
     539                east_or_west = "E"; 
     540         
     541        strnfmt(buf, size, "%d %s, %d %s", 
     542                ABS(y-py), north_or_south, ABS(x-px), east_or_west); 
     543} 
     544 
     545/* 
     546 * Display targeting help at the bottom of the screen. 
     547 */ 
     548static void target_display_help(bool monster, bool free) 
     549{ 
     550        /* Determine help location */ 
     551        int wid, hgt; 
     552        Term_get_size(&wid, &hgt); 
     553        int help_loc = hgt - HELP_HEIGHT; 
     554         
     555        /* Clear */ 
     556        clear_from(help_loc); 
     557 
     558        /* Prepare help hooks */ 
     559        text_out_hook = text_out_to_screen; 
     560        text_out_indent = 1; 
     561        Term_gotoxy(1, help_loc); 
     562 
     563        /* Display help */ 
     564        text_out_c(TERM_L_GREEN, "<dir>"); 
     565        text_out(" and "); 
     566        text_out_c(TERM_L_GREEN, "<click>"); 
     567        text_out(" look around. '"); 
     568        text_out_c(TERM_L_GREEN, "g"); 
     569        text_out(" moves to the selection. '"); 
     570        text_out_c(TERM_L_GREEN, "p"); 
     571        text_out("' selects the player. '"); 
     572        text_out_c(TERM_L_GREEN, "q"); 
     573        text_out("' exits. '"); 
     574        text_out_c(TERM_L_GREEN, "r"); 
     575        text_out("' displays details. '"); 
     576 
     577        if (free) 
     578        { 
     579                text_out_c(TERM_L_GREEN, "m"); 
     580                text_out("' restricts to interesting places. "); 
     581        } 
     582        else 
     583        { 
     584                text_out_c(TERM_L_GREEN, "+"); 
     585                text_out("' and '"); 
     586                text_out_c(TERM_L_GREEN, "-"); 
     587                text_out("' cycle through interesting places. '"); 
     588                text_out_c(TERM_L_GREEN, "o"); 
     589                text_out("' allows free selection. "); 
     590        } 
     591         
     592        if (monster || free) 
     593        { 
     594                text_out("'"); 
     595                text_out_c(TERM_L_GREEN, "t"); 
     596                text_out("' targets the current selection."); 
     597        } 
     598 
     599        /* Reset */ 
     600        text_out_indent = 0; 
     601} 
     602 
     603/* 
    461604 * Examine a grid, return a keypress. 
    462605 * 
    463606 * The "mode" argument contains the "TARGET_LOOK" bit flag, which 
     
    478621 * 
    479622 * This function must handle blindness/hallucination. 
    480623 */ 
    481 static ui_event_data target_set_interactive_aux(int y, int x, int mode, cptr info) 
     624static ui_event_data target_set_interactive_aux(int y, int x, int mode) 
    482625{ 
    483626        s16b this_o_idx = 0, next_o_idx = 0; 
    484627 
     
    497640 
    498641        char out_val[256]; 
    499642 
     643        char coords[20]; 
     644         
     645        /* Describe the square location */ 
     646        coords_desc(coords, sizeof(coords), y, x); 
     647 
    500648        /* Repeat forever */ 
    501649        while (1) 
    502650        { 
     
    532680                        if (p_ptr->wizard) 
    533681                        { 
    534682                                strnfmt(out_val, sizeof(out_val), 
    535                                         "%s%s%s%s [%s] (%d:%d)", s1, s2, s3, name, info, y, x); 
     683                                        "%s%s%s%s, %s (%d:%d).", s1, s2, s3, name, coords, y, x); 
    536684                        } 
    537685                        else 
    538686                        { 
    539687                                strnfmt(out_val, sizeof(out_val), 
    540                                         "%s%s%s%s [%s]", s1, s2, s3, name, info); 
     688                                        "%s%s%s%s, %s.", s1, s2, s3, name, coords); 
    541689                        } 
    542690 
    543691                        prt(out_val, 0, 0); 
     
    592740                                                /* Recall on screen */ 
    593741                                                screen_roff(m_ptr->r_idx); 
    594742 
    595                                                 /* Hack -- Complete the prompt (again) */ 
    596                                                 Term_addstr(-1, TERM_WHITE, format("  [r,%s]", info)); 
    597  
    598743                                                /* Command */ 
    599744                                                query = inkey_ex(); 
    600745 
     
    614759                                                if (p_ptr->wizard) 
    615760                                                { 
    616761                                                        strnfmt(out_val, sizeof(out_val), 
    617                                                                 "%s%s%s%s (%s) [r,%s] (%d:%d)", 
    618                                                             s1, s2, s3, m_name, buf, info, y, x); 
     762                                                                "%s%s%s%s (%s), %s (%d:%d).", 
     763                                                            s1, s2, s3, m_name, buf, coords, y, x); 
    619764                                                } 
    620765                                                else 
    621766                                                { 
    622767                                                        strnfmt(out_val, sizeof(out_val), 
    623                                                                 "%s%s%s%s (%s) [r,%s]", 
    624                                                                 s1, s2, s3, m_name, buf, info); 
     768                                                                "%s%s%s%s (%s), %s.", 
     769                                                                s1, s2, s3, m_name, buf, coords); 
    625770                                                } 
    626771 
    627772                                                prt(out_val, 0, 0); 
     
    676821                                        if (p_ptr->wizard) 
    677822                                        { 
    678823                                                strnfmt(out_val, sizeof(out_val), 
    679                                                         "%s%s%s%s [%s] (%d:%d)", 
    680                                                         s1, s2, s3, o_name, info, y, x); 
     824                                                        "%s%s%s%s, %s (%d:%d).", 
     825                                                        s1, s2, s3, o_name, coords, y, x); 
    681826                                        } 
    682827                                        else 
    683828                                        { 
    684829                                                strnfmt(out_val, sizeof(out_val), 
    685                                                         "%s%s%s%s [%s]", s1, s2, s3, o_name, info); 
     830                                                        "%s%s%s%s, %s.", s1, s2, s3, o_name, coords); 
    686831                                        } 
    687832 
    688833                                        prt(out_val, 0, 0); 
     
    732877                                if (p_ptr->wizard) 
    733878                                { 
    734879                                        strnfmt(out_val, sizeof(out_val), 
    735                                                 "%s%s%sa pile of %d objects [r,%s] (%d:%d)", 
    736                                                 s1, s2, s3, floor_num, info, y, x); 
     880                                                "%s%s%sa pile of %d objects, %s (%d:%d).", 
     881                                                s1, s2, s3, floor_num, coords, y, x); 
    737882                                } 
    738883                                else 
    739884                                { 
    740885                                        strnfmt(out_val, sizeof(out_val), 
    741                                                 "%s%s%sa pile of %d objects [r,%s]", 
    742                                                 s1, s2, s3, floor_num, info); 
     886                                                "%s%s%sa pile of %d objects, %s.", 
     887                                                s1, s2, s3, floor_num, coords); 
    743888                                } 
    744889 
    745890                                prt(out_val, 0, 0); 
     
    803948                                if (p_ptr->wizard) 
    804949                                { 
    805950                                        strnfmt(out_val, sizeof(out_val), 
    806                                                 "%s%s%s%s [%s] (%d:%d)", 
    807                                                 s1, s2, s3, o_name, info, y, x); 
     951                                                "%s%s%s%s, %s (%d:%d).", 
     952                                                s1, s2, s3, o_name, coords, y, x); 
    808953                                } 
    809954                                else 
    810955                                { 
    811956                                        strnfmt(out_val, sizeof(out_val), 
    812                                                 "%s%s%s%s [%s]", s1, s2, s3, o_name, info); 
     957                                                "%s%s%s%s, %s.", s1, s2, s3, o_name, coords); 
    813958                                } 
    814959 
    815960                                prt(out_val, 0, 0); 
     
    8711016                        if (p_ptr->wizard) 
    8721017                        { 
    8731018                                strnfmt(out_val, sizeof(out_val), 
    874                                         "%s%s%s%s [%s] (%d:%d)", s1, s2, s3, name, info, y, x); 
     1019                                        "%s%s%s%s, %s (%d:%d).", s1, s2, s3, name, coords, y, x); 
    8751020                        } 
    8761021                        else 
    8771022                        { 
    8781023                                strnfmt(out_val, sizeof(out_val), 
    879                                         "%s%s%s%s [%s]", s1, s2, s3, name, info); 
     1024                                        "%s%s%s%s, %s.", s1, s2, s3, name, coords); 
    8801025                        } 
    8811026 
    8821027                        prt(out_val, 0, 0); 
     
    9531098 
    9541099        bool flag = TRUE; 
    9551100 
     1101        bool help = FALSE; 
     1102 
    9561103        ui_event_data query; 
    9571104 
    958         char info[80]; 
    959  
    9601105        /* If we haven't been given an initial location, start on the 
    9611106           player. */ 
    9621107        if (x == -1 || y == -1) 
     
    9781123        /* Cancel tracking */ 
    9791124        /* health_track(0); */ 
    9801125 
     1126        /* Calculate the window location for the help prompt */ 
     1127        int wid, hgt; 
     1128        Term_get_size(&wid, &hgt); 
     1129        int help_prompt_loc = hgt - 1; 
     1130         
     1131        /* Display the help prompt */ 
     1132        prt("Press '?' for help.", help_prompt_loc, 0); 
    9811133 
    9821134        /* Prepare the "temp" array */ 
    9831135        target_set_interactive_prepare(mode); 
     
    9941146                        y = temp_y[m]; 
    9951147                        x = temp_x[m]; 
    9961148 
    997                         /* Allow target */ 
    998                         if ((cave_m_idx[y][x] > 0) && target_able(cave_m_idx[y][x])) 
    999                         { 
    1000                                 my_strcpy(info, "g,q,t,p,o,+,-,<dir>, <click>", sizeof(info)); 
    1001                         } 
    10021149 
    1003                         /* Dis-allow target */ 
    1004                         else 
    1005                         { 
    1006                                 my_strcpy(info, "g,q,p,o,+,-,<dir>, <click>", sizeof(info)); 
    1007                         } 
    1008  
    10091150                        /* Adjust panel if needed */ 
    1010                         if (adjust_panel(y, x)) 
     1151                        if (adjust_panel_help(y, x, help)) 
    10111152                        { 
    10121153                                /* Handle stuff */ 
    10131154                                handle_stuff(); 
    10141155                        } 
     1156                 
     1157                        /* Update help */ 
     1158                        if (help) 
     1159                        { 
     1160                                bool good_target = ((cave_m_idx[y][x] > 0) && 
     1161                                                target_able(cave_m_idx[y][x])); 
     1162                                target_display_help(good_target, !(flag && temp_n)); 
     1163                        } 
    10151164 
    10161165                        /* Describe and Prompt */ 
    1017                         query = target_set_interactive_aux(y, x, mode, info); 
     1166                        query = target_set_interactive_aux(y, x, mode); 
    10181167 
    10191168                        /* Cancel tracking */ 
    10201169                        /* health_track(0); */ 
     
    11091258                                        done = TRUE; 
    11101259                                        break; 
    11111260                                } 
     1261                                 
     1262                                case '?': 
     1263                                { 
     1264                                        help = !help; 
     1265                                         
     1266                                        /* Redraw main window */ 
     1267                                        p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIP); 
     1268                                        Term_clear(); 
     1269                                        handle_stuff(); 
     1270                                        if (!help) 
     1271                                                prt("Press '?' for help.", help_prompt_loc, 0); 
     1272                                         
     1273                                        break; 
     1274                                } 
    11121275 
    11131276                                default: 
    11141277                                { 
     
    11661329                /* Arbitrary grids */ 
    11671330                else 
    11681331                { 
    1169                         /* Default prompt */ 
    1170                         my_strcpy(info, "g,q,t,p,m,+,-,<dir>, <click>", sizeof(info)); 
     1332                        /* Update help */ 
     1333                        if (help) { 
     1334                                bool good_target = ((cave_m_idx[y][x] > 0) && target_able(cave_m_idx[y][x])); 
     1335                                target_display_help(good_target, !(flag && temp_n)); 
     1336                        } 
    11711337 
    11721338                        /* Describe and Prompt (enable "TARGET_LOOK") */ 
    1173                         query = target_set_interactive_aux(y, x, mode | TARGET_LOOK, info); 
     1339                        query = target_set_interactive_aux(y, x, mode | TARGET_LOOK); 
    11741340 
    11751341                        /* Cancel tracking */ 
    11761342                        /* health_track(0); */ 
     
    12911457                                        break; 
    12921458                                } 
    12931459 
     1460                                case '?': 
     1461                                { 
     1462                                        help = !help; 
     1463                                         
     1464                                        /* Redraw main window */ 
     1465                                        p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIP); 
     1466                                        Term_clear(); 
     1467                                        handle_stuff(); 
     1468                                        if (!help) 
     1469                                                prt("Press '?' for help.", help_prompt_loc, 0); 
     1470                                         
     1471                                        break; 
     1472                                } 
     1473 
    12941474                                default: 
    12951475                                { 
    12961476                                        /* Extract a direction */ 
     
    13221502                                else if (y <= 0) y++; 
    13231503 
    13241504                                /* Adjust panel if needed */ 
    1325                                 if (adjust_panel(y, x)) 
     1505                                if (adjust_panel_help(y, x, help)) 
    13261506                                { 
    13271507                                        /* Handle stuff */ 
    13281508                                        handle_stuff(); 
     
    13371517        /* Forget */ 
    13381518        temp_n = 0; 
    13391519 
    1340         /* Clear the top line */ 
    1341         prt("", 0, 0); 
     1520        /* Redraw as necessary */ 
     1521        if (help) 
     1522        { 
     1523                p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIP); 
     1524                Term_clear(); 
     1525        } 
     1526        else 
     1527        { 
     1528                prt("", 0, 0); 
     1529                prt("", help_prompt_loc, 0); 
     1530                p_ptr->redraw |= (PR_DEPTH | PR_STATUS); 
     1531        } 
    13421532 
    13431533        /* Recenter around player */ 
    13441534        verify_panel();