added new change action "move player new" to CE change actions
authorHolger Schemel <info@artsoft.org>
Fri, 17 Apr 2020 22:40:17 +0000 (00:40 +0200)
committerHolger Schemel <info@artsoft.org>
Tue, 19 May 2020 16:21:18 +0000 (18:21 +0200)
The difference to the already existing change action "move player" is
that "move player new" only moves the player if this starts a "new"
movement (that is, the player is either not moving at all yet, or has
just finished moving to the next tile).

This is useful to prevent the case of an apparent "two-step movement"
caused by moving the player right after a movement has just started,
which then adds a "second" movement after the "first" movement.

src/editor.c
src/game.c
src/main.h

index 838a898daaaa6170505afd35893051939941cbf2..7931d89665ee533c75f9b6346322840ac4a597c9 100644 (file)
@@ -2092,10 +2092,11 @@ static struct ValueTextInfo options_action_type[] =
   { CA_SET_LEVEL_SCORE,                "set score"                     },
   { CA_SET_LEVEL_GEMS,         "set gems"                      },
   { CA_SET_LEVEL_WIND,         "set wind dir."                 },
-  { CA_SET_LEVEL_RANDOM_SEED,  "set rand. seed"                },
+  { CA_SET_LEVEL_RANDOM_SEED,  "set random seed"               },
   { CA_UNDEFINED,              " "                             },
   { CA_HEADLINE_PLAYER_ACTIONS,        "[player]"                      },
   { CA_MOVE_PLAYER,            "move player"                   },
+  { CA_MOVE_PLAYER_NEW,                "move player new"               },
   { CA_EXIT_PLAYER,            "exit player"                   },
   { CA_KILL_PLAYER,            "kill player"                   },
   { CA_SET_PLAYER_KEYS,                "set keys"                      },
@@ -2421,6 +2422,7 @@ action_arg_options[] =
   { CA_EXIT_PLAYER,            0,      options_action_arg_player,      },
   { CA_KILL_PLAYER,            0,      options_action_arg_player,      },
   { CA_MOVE_PLAYER,            0,      options_action_arg_direction,   },
+  { CA_MOVE_PLAYER_NEW,                0,      options_action_arg_direction,   },
   { CA_RESTART_LEVEL,          0,      options_action_arg_none,        },
   { CA_SHOW_ENVELOPE,          0,      options_action_arg_envelope,    },
   { CA_SET_LEVEL_TIME,         3,      options_action_arg_number,      },
@@ -2673,7 +2675,7 @@ static struct
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(13),
     GADGET_ID_ACTION_TYPE,             GADGET_ID_NONE,
-    -1,
+    15,
     options_action_type,
     &custom_element_change.action_type,
     NULL, NULL, NULL,                  "action on specified condition"
index fd1bdc53d936c6a821c8639b66a331d09ccd6750..d73efcfba0f89ab7495599b0eba0636e1777d1e9 100644 (file)
@@ -9880,11 +9880,14 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page)
     // ---------- player actions  ---------------------------------------------
 
     case CA_MOVE_PLAYER:
+    case CA_MOVE_PLAYER_NEW:
     {
       // automatically move to the next field in specified direction
       for (i = 0; i < MAX_PLAYERS; i++)
        if (trigger_player_bits & (1 << i))
-         stored_player[i].programmed_action = action_arg_direction;
+         if (action_type == CA_MOVE_PLAYER ||
+             stored_player[i].MovPos == 0)
+           stored_player[i].programmed_action = action_arg_direction;
 
       break;
     }
index 41af237ffb501ad04bde6d07b49cfa6ea4ee2a30..75ed2ee83d63b996b7eaade707a59523321359fe 100644 (file)
 #define CA_SET_PLAYER_INVENTORY                18
 #define CA_SET_CE_ARTWORK              19
 #define CA_SET_LEVEL_RANDOM_SEED       20
+#define CA_MOVE_PLAYER_NEW             21
 
 #define CA_HEADLINE_LEVEL_ACTIONS      250
 #define CA_HEADLINE_PLAYER_ACTIONS     251