fixed sound for charging level time (energy) for MM engine
[rocksndiamonds.git] / src / game.c
index 14aac76926d268836c040e861edd09cf2e20d261..de844f4298ca0351fcaceab4ce88082c9c8402c7 100644 (file)
@@ -3330,6 +3330,10 @@ void InitGame()
     player->effective_action = 0;
     player->programmed_action = 0;
 
+    player->mouse_action.lx = 0;
+    player->mouse_action.ly = 0;
+    player->mouse_action.button = 0;
+
     player->score = 0;
     player->score_final = 0;
 
@@ -10970,6 +10974,22 @@ static byte PlayerActions(struct PlayerInfo *player, byte player_action)
   }
 }
 
+static void SetMouseActionFromTapeAction(struct MouseActionInfo *mouse_action,
+                                        byte *tape_action)
+{
+  mouse_action->lx     = tape_action[TAPE_ACTION_LX];
+  mouse_action->ly     = tape_action[TAPE_ACTION_LY];
+  mouse_action->button = tape_action[TAPE_ACTION_BUTTON];
+}
+
+static void SetTapeActionFromMouseAction(byte *tape_action,
+                                        struct MouseActionInfo *mouse_action)
+{
+  tape_action[TAPE_ACTION_LX]     = mouse_action->lx;
+  tape_action[TAPE_ACTION_LY]     = mouse_action->ly;
+  tape_action[TAPE_ACTION_BUTTON] = mouse_action->button;
+}
+
 static void CheckLevelTime()
 {
   int i;
@@ -11297,6 +11317,10 @@ void GameActionsExt()
   /* when playing tape, read previously recorded player input from tape data */
   recorded_player_action = (tape.playing ? TapePlayAction() : NULL);
 
+  if (recorded_player_action != NULL)
+    SetMouseActionFromTapeAction(&local_player->mouse_action,
+                                recorded_player_action);
+
   /* TapePlayAction() may return NULL when toggling to "pause before death" */
   if (tape.pausing)
     return;
@@ -11353,6 +11377,8 @@ void GameActionsExt()
       tape.player_participates[i] = TRUE;
   }
 
+  SetTapeActionFromMouseAction(tape_action, &local_player->mouse_action);
+
   /* only record actions from input devices, but not programmed actions */
   if (tape.recording)
     TapeRecordAction(tape_action);
@@ -11509,14 +11535,9 @@ void GameActions_SP_Main()
 
 void GameActions_MM_Main()
 {
-  byte effective_action[MAX_PLAYERS];
   boolean warp_mode = (tape.playing && tape.warp_forward && !tape.pausing);
-  int i;
-
-  for (i = 0; i < MAX_PLAYERS; i++)
-    effective_action[i] = stored_player[i].effective_action;
 
-  GameActions_MM(effective_action, warp_mode);
+  GameActions_MM(local_player->mouse_action, warp_mode);
 }
 
 void GameActions_RND_Main()
@@ -14674,6 +14695,47 @@ void PlayLevelSound_SP(int xx, int yy, int element_sp, int action_sp)
   PlayLevelSoundElementAction(x, y, element, action);
 }
 
+void PlayLevelSound_MM(int xx, int yy, int element_mm, int action_mm)
+{
+  int element = map_element_MM_to_RND(element_mm);
+  int action = map_action_MM_to_RND(action_mm);
+  int offset = 0;
+  int x = xx - offset;
+  int y = yy - offset;
+
+  PlayLevelSoundElementAction(x, y, element, action);
+}
+
+void PlaySound_MM(int sound_mm)
+{
+  int sound = map_sound_MM_to_RND(sound_mm);
+
+  if (sound == SND_UNDEFINED)
+    return;
+
+  PlaySound(sound);
+}
+
+void PlaySoundLoop_MM(int sound_mm)
+{
+  int sound = map_sound_MM_to_RND(sound_mm);
+
+  if (sound == SND_UNDEFINED)
+    return;
+
+  PlaySoundLoop(sound);
+}
+
+void StopSound_MM(int sound_mm)
+{
+  int sound = map_sound_MM_to_RND(sound_mm);
+
+  if (sound == SND_UNDEFINED)
+    return;
+
+  StopSound(sound);
+}
+
 void RaiseScore(int value)
 {
   local_player->score += value;