fixed saving snapshots (step, move and collect mode) to MM game engine
authorHolger Schemel <info@artsoft.org>
Thu, 21 Dec 2017 17:37:10 +0000 (18:37 +0100)
committerHolger Schemel <info@artsoft.org>
Fri, 23 Mar 2018 22:21:17 +0000 (23:21 +0100)
src/engines.h
src/game_mm/export.h
src/game_mm/mm_game.c
src/tools.c

index 9983d559b1b6a28b4eabf5af9a363e0e987c769a..f47cc62ae8e73a863a76c1902c20ccd43d6fcbb6 100644 (file)
@@ -60,7 +60,7 @@ void SetDrawtoField(int);
 
 int el2img_mm(int);
 
-void CheckSingleStepMode_MM(boolean);
+void CheckSingleStepMode_MM(boolean, boolean);
 
 void getGraphicSource(int, int, Bitmap **, int *, int *);
 void getMiniGraphicSource(int, Bitmap **, int *, int *);
index 5e6f6d40ce16be02fc6269e4a563d86911640921..2647e829e0c15cd18e95d79dab664ff0884cd34a 100644 (file)
@@ -232,7 +232,7 @@ extern void GameActions_MM(struct MouseActionInfo, boolean);
 
 extern void DrawLaser_MM();
 
-extern void ClickElement(int, int, int);
+extern boolean ClickElement(int, int, int);
 
 extern unsigned int InitEngineRandom_MM(int);
 
index d34eec08eed4c2c22c2813f252c48de01edafd10..96be05c4f977ec5c56f52d8eed335ed0d85f862e 100644 (file)
@@ -1541,6 +1541,8 @@ boolean HitElement(int element, int hit_mask)
       if (game_mm.kettles_still_needed > 0)
        game_mm.kettles_still_needed--;
 
+      game.snapshot.collected_item = TRUE;
+
       if (game_mm.kettles_still_needed == 0)
       {
        CheckExitMM();
@@ -2731,11 +2733,12 @@ static void ContinueMoving_MM(int x, int y)
   laser.redraw = TRUE;
 }
 
-void ClickElement(int x, int y, int button)
+boolean ClickElement(int x, int y, int button)
 {
   static unsigned int click_delay = 0;
   static int click_delay_value = CLICK_DELAY;
   static boolean new_button = TRUE;
+  boolean element_clicked = FALSE;
   int element;
 
   if (button == -1)
@@ -2745,12 +2748,12 @@ void ClickElement(int x, int y, int button)
     click_delay_value = CLICK_DELAY;
     new_button = TRUE;
 
-    return;
+    return FALSE;
   }
 
   /* do not rotate objects hit by the laser after the game was solved */
   if (game_mm.level_solved && Hit[x][y])
-    return;
+    return FALSE;
 
   if (button == MB_RELEASED)
   {
@@ -2760,20 +2763,20 @@ void ClickElement(int x, int y, int button)
     /* release eventually hold auto-rotating mirror */
     RotateMirror(x, y, MB_RELEASED);
 
-    return;
+    return FALSE;
   }
 
   if (!FrameReached(&click_delay, click_delay_value) && !new_button)
-    return;
+    return FALSE;
 
   if (button == MB_MIDDLEBUTTON)       /* middle button has no function */
-    return;
+    return FALSE;
 
   if (!IN_LEV_FIELD(x, y))
-    return;
+    return FALSE;
 
   if (Feld[x][y] == EL_EMPTY)
-    return;
+    return FALSE;
 
   element = Feld[x][y];
 
@@ -2785,6 +2788,8 @@ void ClickElement(int x, int y, int button)
       IS_DF_MIRROR_AUTO(element))
   {
     RotateMirror(x, y, button);
+
+    element_clicked = TRUE;
   }
   else if (IS_MCDUFFIN(element))
   {
@@ -2811,17 +2816,21 @@ void ClickElement(int x, int y, int button)
 
     if (!laser.fuse_off)
       ScanLaser();
+
+    element_clicked = TRUE;
   }
   else if (element == EL_FUSE_ON && laser.fuse_off)
   {
     if (x != laser.fuse_x || y != laser.fuse_y)
-      return;
+      return FALSE;
 
     laser.fuse_off = FALSE;
     laser.fuse_x = laser.fuse_y = -1;
 
     DrawGraphic_MM(x, y, IMG_MM_FUSE_ACTIVE);
     ScanLaser();
+
+    element_clicked = TRUE;
   }
   else if (element == EL_FUSE_ON && !laser.fuse_off && new_button)
   {
@@ -2832,16 +2841,22 @@ void ClickElement(int x, int y, int button)
 
     DrawLaser(0, DL_LASER_DISABLED);
     DrawGraphic_MM(x, y, IMG_MM_FUSE);
+
+    element_clicked = TRUE;
   }
   else if (element == EL_LIGHTBALL)
   {
     Bang_MM(x, y);
     RaiseScoreElement_MM(element);
     DrawLaser(0, DL_LASER_ENABLED);
+
+    element_clicked = TRUE;
   }
 
   click_delay_value = (new_button ? CLICK_DELAY_FIRST : CLICK_DELAY);
   new_button = FALSE;
+
+  return element_clicked;
 }
 
 void RotateMirror(int x, int y, int button)
@@ -3744,11 +3759,12 @@ static void GameActions_MM_Ext(struct MouseActionInfo action, boolean warp_mode)
 
 void GameActions_MM(struct MouseActionInfo action, boolean warp_mode)
 {
-  ClickElement(action.lx, action.ly, action.button);
+  boolean element_clicked = ClickElement(action.lx, action.ly, action.button);
+  boolean button_released = (action.button == MB_RELEASED);
 
   GameActions_MM_Ext(action, warp_mode);
 
-  CheckSingleStepMode_MM(action.button == MB_RELEASED);
+  CheckSingleStepMode_MM(element_clicked, button_released);
 }
 
 void MovePacMen()
index 777a1a08c833bcde707f13a322b04767195a82f3..dc847065c0916b414429cc4aae6af7373c946f88 100644 (file)
@@ -8747,9 +8747,21 @@ void CheckSaveEngineSnapshot_SP(boolean murphy_is_waiting,
   }
 }
 
-void CheckSaveEngineSnapshot_MM(boolean button_released)
+void CheckSaveEngineSnapshot_MM(boolean element_clicked,
+                               boolean button_released)
 {
-  CheckSaveEngineSnapshotToList();
+  if (button_released)
+  {
+    if (game.snapshot.mode == SNAPSHOT_MODE_EVERY_MOVE)
+      CheckSaveEngineSnapshotToList();
+  }
+  else if (element_clicked)
+  {
+    if (game.snapshot.mode != SNAPSHOT_MODE_EVERY_MOVE)
+      CheckSaveEngineSnapshotToList();
+
+    game.snapshot.changed_action = TRUE;
+  }
 }
 
 void CheckSingleStepMode_EM(byte action[MAX_PLAYERS], int frame,
@@ -8782,13 +8794,14 @@ void CheckSingleStepMode_SP(boolean murphy_is_waiting,
   CheckSaveEngineSnapshot_SP(murphy_is_waiting, murphy_is_dropping);
 }
 
-void CheckSingleStepMode_MM(boolean button_released)
+void CheckSingleStepMode_MM(boolean element_clicked,
+                           boolean button_released)
 {
   if (tape.single_step && tape.recording && !tape.pausing)
     if (button_released)
       TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
 
-  CheckSaveEngineSnapshot_MM(button_released);
+  CheckSaveEngineSnapshot_MM(element_clicked, button_released);
 }
 
 void getGraphicSource_SP(struct GraphicInfo_SP *g_sp,