]> granicus.if.org Git - nethack/commitdiff
Remove awful kludges dealing with command counts.
authorBart House <bart@barthouse.com>
Sun, 31 Jan 2021 03:06:27 +0000 (19:06 -0800)
committerBart House <bart@barthouse.com>
Sun, 31 Jan 2021 03:06:27 +0000 (19:06 -0800)
include/decl.h
src/allmain.c
src/cmd.c
src/decl.c
src/dothrow.c
src/hack.c

index b79a61760b276c534fab485937b924ac7fa3cc1f..85f2d38fb50e4395549ce89f735bef046781ab1e 100644 (file)
@@ -701,7 +701,7 @@ struct instance_globals {
     coord clicklook_cc;
     winid en_win;
     boolean en_via_menu;
-    int last_multi;
+    long last_command_count;
 
     /* dbridge.c */
     struct entity occupants[ENTITIES];
@@ -714,6 +714,8 @@ struct instance_globals {
     char chosen_windowtype[WINTYPELEN];
     int bases[MAXOCLASSES + 1];
     int multi;
+    char command_line[COLNO];
+    long command_count;
     const char *multi_reason;
     int nroom;
     int nsubroom;
index c5221ec063b21258401264181f0136894ea2e630..1534b449cfad1400c92d64b2dc5b32648c9c8d65 100644 (file)
@@ -435,7 +435,8 @@ moveloop(boolean resuming)
                 domove();
             } else {
                 --g.multi;
-                rhack(g.save_cm);
+                nhassert(g.command_count != 0);
+                rhack(g.command_line);
             }
         } else if (g.multi == 0) {
 #ifdef MAIL
index ae19b10f61d54d2ce67ebf90d7e4a38aed270ed6..b5a640658165dcf483363b71e58e758538217013 100644 (file)
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -4477,15 +4477,10 @@ get_count(char *allowchars, char inkey,
 static char *
 parse(void)
 {
-#ifdef LINT /* static char in_line[COLNO]; */
-    char in_line[COLNO];
-#else
-    static char in_line[COLNO];
-#endif
     register int foo;
 
     iflags.in_parse = TRUE;
-    g.multi = 0;
+    g.command_count = 0;
     g.context.move = 1;
     flush_screen(1); /* Flush screen buffer. Put the cursor on the hero. */
 
@@ -4493,10 +4488,8 @@ parse(void)
     alt_esc = iflags.altmeta; /* readchar() hack */
 #endif
     if (!g.Cmd.num_pad || (foo = readchar()) == g.Cmd.spkeys[NHKF_COUNT]) {
-        long tmpmulti = g.multi;
-
-        foo = get_count((char *) 0, '\0', LARGEST_INT, &tmpmulti, FALSE);
-        g.last_multi = g.multi = tmpmulti;
+        foo = get_count((char *) 0, '\0', LARGEST_INT, &g.command_count, FALSE);
+        g.last_command_count = g.command_count;
     }
 #ifdef ALTMETA
     alt_esc = FALSE; /* readchar() reset */
@@ -4510,18 +4503,25 @@ parse(void)
 
     if (foo == g.Cmd.spkeys[NHKF_ESC]) { /* esc cancels count (TH) */
         clear_nhwindow(WIN_MESSAGE);
-        g.multi = g.last_multi = 0;
-    } else if ((foo && foo == g.Cmd.spkeys[NHKF_DOAGAIN]) || g.in_doagain) {
-        g.multi = g.last_multi;
+        g.command_count = 0;
+        g.last_command_count = 0;
+    } else if (g.in_doagain) {
+        g.command_count = g.last_command_count;
+    } else if (foo && foo == g.Cmd.spkeys[NHKF_DOAGAIN]) {
+        // g.command_count will be set again when we
+        // re-enter with g.in_doagain set true
+        g.command_count = g.last_command_count;
     } else {
-        g.last_multi = g.multi;
+        g.last_command_count = g.command_count;
         savech(0); /* reset input queue */
         savech((char) foo);
     }
 
+    g.multi = g.command_count;
+
     if (g.multi) {
         g.multi--;
-        g.save_cm = in_line;
+        g.save_cm = g.command_line;
     } else {
         g.save_cm = (char *) 0;
     }
@@ -4546,18 +4546,18 @@ parse(void)
         }
     }
 
-    in_line[0] = foo;
-    in_line[1] = '\0';
+    g.command_line[0] = foo;
+    g.command_line[1] = '\0';
     if (prefix_cmd(foo)) {
         foo = readchar();
         savech((char) foo);
-        in_line[1] = foo;
-        in_line[2] = 0;
+        g.command_line[1] = foo;
+        g.command_line[2] = 0;
     }
     clear_nhwindow(WIN_MESSAGE);
 
     iflags.in_parse = FALSE;
-    return in_line;
+    return g.command_line;
 }
 
 #ifdef HANGUPHANDLING
index 2f019360780bd658ca0a4d3fe8630ca5d1c83f92..f40f9088898be80e13cfe232ab6a73e5874024d5 100644 (file)
@@ -243,7 +243,7 @@ const struct instance_globals g_init = {
     UNDEFINED_VALUES, /* clicklook_cc */
     WIN_ERR, /* en_win */
     FALSE, /* en_via_menu */
-    UNDEFINED_VALUE, /* last_multi */
+    UNDEFINED_VALUE, /* last_command_count */
 
     /* dbridge.c */
     UNDEFINED_VALUES, /* occupants */
@@ -256,7 +256,9 @@ const struct instance_globals g_init = {
     UNDEFINED_VALUES, /* chosen_windowtype */
     DUMMY, /* bases */
     0, /* multi */
-    NULL, /* g.multi_reason */
+    UNDEFINED_VALUES, /* command_line */
+    0, /* command_count */
+    NULL, /* multi_reason */
     0, /* nroom */
     0, /* nsubroom */
     0, /* occtime */
index 0a4c539045ef2b9291fa46a94d402b2522461b5f..8ded43e8236f58f4a10d09bd3f0689ad66eef396 100644 (file)
@@ -246,8 +246,7 @@ throw_obj(struct obj *obj, int shotlimit)
 static boolean
 ok_to_throw(int *shotlimit_p) /* (see dothrow()) */
 {
-    /* kludge to work around parse()'s pre-decrement of `multi' */
-    *shotlimit_p = (g.multi || g.save_cm) ? g.multi + 1 : 0;
+    *shotlimit_p = g.command_count;
     g.multi = 0; /* reset; it's been used up */
 
     if (notake(g.youmonst.data)) {
index 545f1ae7dc7db231ef2f3aa31c28d209b4082771..27a1735b0e0af615b777782c8e43f10043228c5b 100644 (file)
@@ -2753,9 +2753,7 @@ dopickup(void)
 {
     int count, tmpcount, ret;
 
-    /* awful kludge to work around parse()'s pre-decrement */
-    count = (g.multi || (g.save_cm && *g.save_cm == cmd_from_func(dopickup)))
-              ? g.multi + 1 : 0;
+    count = g.command_count;
     g.multi = 0; /* always reset */
 
     if ((ret = pickup_checks()) >= 0) {
@@ -3002,6 +3000,10 @@ end_running(boolean and_travel)
        all clear it too */
     if (and_travel)
         g.context.travel = g.context.travel1 = g.context.mv = 0;
+    
+    // Cancel mutli
+    if (g.multi > 0) 
+        g.multi = 0;
 }
 
 void