replaced graphics based element masks with pre-calculated array (MM engine)
[rocksndiamonds.git] / src / game.c
index cc6f27d69459e037abb378f3082755cd6564607e..96b3ca1ad6ea9388480a65c67d5152605c233725 100644 (file)
@@ -3334,6 +3334,10 @@ void InitGame()
     player->mouse_action.ly = 0;
     player->mouse_action.button = 0;
 
+    player->effective_mouse_action.lx = 0;
+    player->effective_mouse_action.ly = 0;
+    player->effective_mouse_action.button = 0;
+
     player->score = 0;
     player->score_final = 0;
 
@@ -10977,6 +10981,9 @@ static byte PlayerActions(struct PlayerInfo *player, byte player_action)
 static void SetMouseActionFromTapeAction(struct MouseActionInfo *mouse_action,
                                         byte *tape_action)
 {
+  if (!tape.use_mouse)
+    return;
+
   mouse_action->lx     = tape_action[TAPE_ACTION_LX];
   mouse_action->ly     = tape_action[TAPE_ACTION_LY];
   mouse_action->button = tape_action[TAPE_ACTION_BUTTON];
@@ -10985,6 +10992,9 @@ static void SetMouseActionFromTapeAction(struct MouseActionInfo *mouse_action,
 static void SetTapeActionFromMouseAction(byte *tape_action,
                                         struct MouseActionInfo *mouse_action)
 {
+  if (!tape.use_mouse)
+    return;
+
   tape_action[TAPE_ACTION_LX]     = mouse_action->lx;
   tape_action[TAPE_ACTION_LY]     = mouse_action->ly;
   tape_action[TAPE_ACTION_BUTTON] = mouse_action->button;
@@ -11317,8 +11327,10 @@ void GameActionsExt()
   /* when playing tape, read previously recorded player input from tape data */
   recorded_player_action = (tape.playing ? TapePlayAction() : NULL);
 
+  local_player->effective_mouse_action = local_player->mouse_action;
+
   if (recorded_player_action != NULL)
-    SetMouseActionFromTapeAction(&local_player->mouse_action,
+    SetMouseActionFromTapeAction(&local_player->effective_mouse_action,
                                 recorded_player_action);
 
   /* TapePlayAction() may return NULL when toggling to "pause before death" */
@@ -11377,7 +11389,8 @@ void GameActionsExt()
       tape.player_participates[i] = TRUE;
   }
 
-  SetTapeActionFromMouseAction(tape_action, &local_player->mouse_action);
+  SetTapeActionFromMouseAction(tape_action,
+                              &local_player->effective_mouse_action);
 
   /* only record actions from input devices, but not programmed actions */
   if (tape.recording)
@@ -11537,7 +11550,7 @@ void GameActions_MM_Main()
 {
   boolean warp_mode = (tape.playing && tape.warp_forward && !tape.pausing);
 
-  GameActions_MM(local_player->mouse_action, warp_mode);
+  GameActions_MM(local_player->effective_mouse_action, warp_mode);
 }
 
 void GameActions_RND_Main()
@@ -14695,6 +14708,50 @@ 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;
+
+  if (!IS_MM_ELEMENT(element))
+    element = EL_MM_DEFAULT;
+
+  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;