Add breadcrumbs for grammar debugging.
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index c837fe69bf0a3f9a58f14c1e6515e83bb06f11b2..2b0d292b2d5132fa1d58f7fd4f13859ef248d426 100644 (file)
--- a/main.c
+++ b/main.c
@@ -970,8 +970,6 @@ static bool do_command()
 {
     static struct command_t command;
 
-    command.verb = 0;
-
     /*  Can't leave cave once it's closing (except by main office). */
     if (OUTSID(game.newloc) && game.newloc != 0 && game.closng) {
         rspeak(EXIT_CLOSED);
@@ -1052,11 +1050,32 @@ Lclearobj:
         if (game.knfloc > 0 && game.knfloc != game.loc)
             game.knfloc = 0;
 
-        // Get command input from user
+       /* Preserve state from last command for reuse when required */
+       struct command_t preserve;
+       memcpy(&preserve, &command, sizeof(struct command_t));
+
+       // Get command input from user
         if (!get_command_input(&command))
             return false;
 
-        ++game.turns;
+#ifdef GDEBUG
+       printf("Preserve: type1 = %u, id1 = %ld, type2 = %u id2 = %ld\n",
+              preserve.type1, preserve.id1, preserve.type2, preserve.id2);
+       printf("Command: type1 = %u, id1 = %ld, type2 = %u id2 = %ld\n",
+              command.type1, command.id1, command.type2, command.id2);
+#endif
+
+       /* Handling of objectless action followed by actionless object */
+       if (preserve.type1 == ACTION && preserve.type2 == NO_WORD_TYPE && command.id2 == 0)
+           command.verb = preserve.verb;
+
+#ifdef BROKEN
+       /* Handling of actionless object followed by objectless action */
+       if (preserve.type1 == OBJECT && preserve.type2 == NO_WORD_TYPE && command.id2 == 0)
+           command.obj = preserve.obj;
+#endif
+
+       ++game.turns;
 
         if (closecheck()) {
             if (game.closed)
@@ -1134,15 +1153,12 @@ Lookup:
                 command.part = intransitive;
             command.verb = command.id1;
             break;
-        case SPECIAL:
-            speak(specials[command.id1].message);
-            goto Lclearobj;
-        case NUMERIC:
+        case NUMERIC: // LCOV_EXCL_LINE
         default: // LCOV_EXCL_LINE
             BUG(VOCABULARY_TYPE_N_OVER_1000_NOT_BETWEEN_0_AND_3); // LCOV_EXCL_LINE
         }
 
-        switch (action(&command)) {
+        switch (action(command)) {
         case GO_TERMINATE:
             return true;
         case GO_MOVE: