From: Bart House Date: Sun, 31 Jan 2021 03:06:27 +0000 (-0800) Subject: Remove awful kludges dealing with command counts. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a54a8c685429561b1bf249cd9ecb07eea19054ca;p=nethack Remove awful kludges dealing with command counts. --- diff --git a/include/decl.h b/include/decl.h index b79a61760..85f2d38fb 100644 --- a/include/decl.h +++ b/include/decl.h @@ -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; diff --git a/src/allmain.c b/src/allmain.c index c5221ec06..1534b449c 100644 --- a/src/allmain.c +++ b/src/allmain.c @@ -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 diff --git a/src/cmd.c b/src/cmd.c index ae19b10f6..b5a640658 100644 --- 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 diff --git a/src/decl.c b/src/decl.c index 2f0193607..f40f90888 100644 --- a/src/decl.c +++ b/src/decl.c @@ -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 */ diff --git a/src/dothrow.c b/src/dothrow.c index 0a4c53904..8ded43e82 100644 --- a/src/dothrow.c +++ b/src/dothrow.c @@ -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)) { diff --git a/src/hack.c b/src/hack.c index 545f1ae7d..27a1735b0 100644 --- a/src/hack.c +++ b/src/hack.c @@ -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