]> granicus.if.org Git - nethack/commitdiff
fix for / command to find names like "Hachi" via screen
authornhmall <mjnh@persona.ca>
Mon, 15 Feb 2016 03:23:59 +0000 (22:23 -0500)
committernhmall <mjnh@persona.ca>
Mon, 15 Feb 2016 03:23:59 +0000 (22:23 -0500)
 Changes to be committed:
modified:   doc/fixes36.1
modified:   src/pager.c

fix bug bz54; this bug had no web ID

Report:
    For /, asking via cursor can't find special named entries like "Hachi"
    because the entry for the monster type like "dog" gets used instead.

Change:
    Instead of "More info?", when applicable it will now do:
    More info about "hachi"? [yn] (n) n
    More info about "little dog"? [yn] (n)

doc/fixes36.1
src/pager.c

index 8ad6b90d66eee6fa5a6916573fb5cae0cc76be21..6509afc633bb8d437d89a7d428b61501f0bcc2d0 100644 (file)
@@ -155,6 +155,8 @@ jumping while punished could leave ball and chain in the wrong place
 improve Deaf message handling for the minetown watch and shops
 issues with Warning when you're adjacent to an undetected hider; clearly you
        are aware a monster is present so this causes you to search it out
+allow lookup of names like Hachi when selecting monsters from the map
+lookup "More Info?" prompt will now tell you what it will look for on 'y'
 
 
 Platform- and/or Interface-Specific Fixes
index 73b9e0eac4a35d3cbe6a958d69c12692fc19014b..1c4dca30b8702019e32d36df203b5ecbc9df5536 100644 (file)
@@ -382,11 +382,11 @@ struct permonst *pm;
 boolean user_typed_name, without_asking;
 {
     dlb *fp;
-    char buf[BUFSZ], newstr[BUFSZ];
+    char buf[BUFSZ], newstr[BUFSZ], givenname[BUFSZ];
     char *ep, *dbase_str;
     unsigned long txt_offset = 0L;
-    int chk_skip;
-    boolean found_in_file = FALSE, skipping_entry = FALSE;
+    int chk_skip, pass = 1;
+    boolean found_in_file = FALSE, skipping_entry = FALSE, yes_to_moreinfo;
     winid datawin = WIN_ERR;
 
     fp = dlb_fopen(DATAFILE, "r");
@@ -441,8 +441,13 @@ boolean user_typed_name, without_asking;
 
         if ((ep = strstri(dbase_str, " named ")) != 0)
             alt = ep + 7;
-        else
-            ep = strstri(dbase_str, " called ");
+        else if ((ep = strstri(dbase_str, " called ")) != 0) {
+            if (strlen(ep + 8) < BUFSZ - 1) {
+                Strcpy(givenname, ep + 8);
+                givenname[BUFSZ-1] = '\0';
+                alt = &givenname[0];
+            }
+        }
         if (!ep)
             ep = strstri(dbase_str, ", ");
         if (ep && ep > dbase_str)
@@ -459,85 +464,107 @@ boolean user_typed_name, without_asking;
         if (!alt)
             alt = makesingular(dbase_str);
 
-        /* skip first record; read second */
-        txt_offset = 0L;
-        if (!dlb_fgets(buf, BUFSZ, fp) || !dlb_fgets(buf, BUFSZ, fp)) {
-            impossible("can't read 'data' file");
-            (void) dlb_fclose(fp);
-            return;
-        } else if (sscanf(buf, "%8lx\n", &txt_offset) < 1 || txt_offset == 0L)
-            goto bad_data_file;
-
-        /* look for the appropriate entry */
-        while (dlb_fgets(buf, BUFSZ, fp)) {
-            if (*buf == '.')
-                break; /* we passed last entry without success */
-
-            if (digit(*buf)) {
-                /* a number indicates the end of current entry */
-                skipping_entry = FALSE;
-            } else if (!skipping_entry) {
-                if (!(ep = index(buf, '\n')))
-                    goto bad_data_file;
-                (void) strip_newline((ep > buf) ? ep - 1 : ep);
-                /* if we match a key that begins with "~", skip this entry */
-                chk_skip = (*buf == '~') ? 1 : 0;
-                if (pmatch(&buf[chk_skip], dbase_str)
-                    || (alt && pmatch(&buf[chk_skip], alt))) {
-                    if (chk_skip) {
-                        skipping_entry = TRUE;
-                        continue;
-                    } else {
-                        found_in_file = TRUE;
-                        break;
-                    }
-                }
-            }
-        }
-    }
-
-    if (found_in_file) {
-        long entry_offset;
-        int entry_count;
-        int i;
+        if (!strcmp(alt, dbase_str))
+            pass = 0;
 
-        /* skip over other possible matches for the info */
-        do {
-            if (!dlb_fgets(buf, BUFSZ, fp))
-                goto bad_data_file;
-        } while (!digit(*buf));
-        if (sscanf(buf, "%ld,%d\n", &entry_offset, &entry_count) < 2) {
-        bad_data_file:
-            impossible("'data' file in wrong format or corrupted");
-            /* window will exist if we came here from below via 'goto' */
-            if (datawin != WIN_ERR)
-                destroy_nhwindow(datawin);
-            (void) dlb_fclose(fp);
-            return;
-        }
-
-        if (user_typed_name || without_asking || yn("More info?") == 'y') {
-            if (dlb_fseek(fp, (long) txt_offset + entry_offset, SEEK_SET)
-                < 0) {
-                pline("? Seek error on 'data' file!");
-                (void) dlb_fclose(fp);
+        for (; pass >= 0; pass--) {
+            txt_offset = 0L;
+            if (dlb_fseek(fp, txt_offset, SEEK_SET) < 0 ) {
+                impossible("can't get to start of 'data' file");
+                dlb_fclose(fp);
                 return;
             }
-            datawin = create_nhwindow(NHW_MENU);
-            for (i = 0; i < entry_count; i++) {
-                if (!dlb_fgets(buf, BUFSZ, fp))
-                    goto bad_data_file;
-                (void) strip_newline(buf);
-                if (index(buf + 1, '\t') != 0)
-                    (void) tabexpand(buf + 1);
-                putstr(datawin, 0, buf + 1);
+            /* skip first record; read second */
+            if (!dlb_fgets(buf, BUFSZ, fp) || !dlb_fgets(buf, BUFSZ, fp)) {
+                impossible("can't read 'data' file");
+                (void) dlb_fclose(fp);
+                return;
+            } else if (sscanf(buf, "%8lx\n", &txt_offset) < 1 || txt_offset == 0L)
+                goto bad_data_file;
+
+            /* look for the appropriate entry */
+            while (dlb_fgets(buf, BUFSZ, fp)) {
+                if (*buf == '.')
+                    break; /* we passed last entry without success */
+
+                if (digit(*buf)) {
+                    /* a number indicates the end of current entry */
+                    skipping_entry = FALSE;
+                } else if (!skipping_entry) {
+                    if (!(ep = index(buf, '\n')))
+                        goto bad_data_file;
+                    (void) strip_newline((ep > buf) ? ep - 1 : ep);
+                    /* if we match a key that begins with "~", skip this entry */
+                    chk_skip = (*buf == '~') ? 1 : 0;
+                    if ((pass == 0 && pmatch(&buf[chk_skip], dbase_str)) ||
+                        (pass == 1 && alt && pmatch(&buf[chk_skip], alt))) {
+                        if (chk_skip) {
+                            skipping_entry = TRUE;
+                            continue;
+                        } else {
+                            found_in_file = TRUE;
+                            break;
+                        }
+                    }
+                }
             }
-            display_nhwindow(datawin, FALSE);
-            destroy_nhwindow(datawin);
-        }
-    } else if (user_typed_name)
-        pline("I don't have any information on those things.");
+            if (found_in_file) {
+                long entry_offset;
+                int entry_count;
+                int i;
+
+                /* skip over other possible matches for the info */
+                do {
+                    if (!dlb_fgets(buf, BUFSZ, fp))
+                        goto bad_data_file;
+                } while (!digit(*buf));
+                if (sscanf(buf, "%ld,%d\n", &entry_offset, &entry_count) < 2) {
+                bad_data_file:
+                    impossible("'data' file in wrong format or corrupted");
+                    /* window will exist if we came here from below via 'goto' */
+                    if (datawin != WIN_ERR)
+                        destroy_nhwindow(datawin);
+                    (void) dlb_fclose(fp);
+                    return;
+                }
 
+                yes_to_moreinfo = FALSE;
+                if (!user_typed_name && !without_asking) {
+                    unsigned maxt = strlen("More info about \"\"?");
+                    char *entrytext = pass ? alt : dbase_str;
+                    char question[BUFSZ];
+                    if (strlen(entrytext) < BUFSZ - maxt) {
+                        Strcpy(question, "More info about \"");
+                        Strcat(question, entrytext);
+                        Strcat(question, "\"?");
+                    }
+                    if (yn(question) == 'y')
+                        yes_to_moreinfo = TRUE;
+               }
+
+                if (user_typed_name || without_asking || yes_to_moreinfo) {
+                    if (dlb_fseek(fp,
+                        (long) txt_offset + entry_offset, SEEK_SET) < 0) {
+                        pline("? Seek error on 'data' file!");
+                        (void) dlb_fclose(fp);
+                        return;
+                    }
+                    datawin = create_nhwindow(NHW_MENU);
+                    for (i = 0; i < entry_count; i++) {
+                        if (!dlb_fgets(buf, BUFSZ, fp))
+                            goto bad_data_file;
+                        (void) strip_newline(buf);
+                        if (index(buf + 1, '\t') != 0)
+                            (void) tabexpand(buf + 1);
+                        putstr(datawin, 0, buf + 1);
+                    }
+                    display_nhwindow(datawin, FALSE);
+                    destroy_nhwindow(datawin);
+                }
+            } else if (user_typed_name && pass == 0)
+                pline("I don't have any information on those things.");
+        }
+    }
     (void) dlb_fclose(fp);
 }