fixed mapping level file game elements between RND and MM formats
[rocksndiamonds.git] / src / tools.c
index 21f062b41cdc21fb2bfc3c257f08ffbefc87d9f7..fb1fc5ed620303db01503aedfb186a2113a50884 100644 (file)
@@ -358,12 +358,40 @@ static int getLevelFromScreenY_SP(int sy)
   return ly;
 }
 
+static int getLevelFromScreenX_MM(int sx)
+{
+  int level_xsize = level.native_mm_level->fieldx;
+  int full_xsize = level_xsize * TILESIZE_VAR;
+
+  sx -= (full_xsize < SXSIZE ? (SXSIZE - full_xsize) / 2 : 0);
+
+  int px = sx - SX;
+  int lx = px / TILESIZE_VAR;
+
+  return lx;
+}
+
+static int getLevelFromScreenY_MM(int sy)
+{
+  int level_ysize = level.native_mm_level->fieldy;
+  int full_ysize = level_ysize * TILESIZE_VAR;
+
+  sy -= (full_ysize < SYSIZE ? (SYSIZE - full_ysize) / 2 : 0);
+
+  int py = sy - SY;
+  int ly = py / TILESIZE_VAR;
+
+  return ly;
+}
+
 int getLevelFromScreenX(int x)
 {
   if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
     return getLevelFromScreenX_EM(x);
   if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
     return getLevelFromScreenX_SP(x);
+  if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+    return getLevelFromScreenX_MM(x);
   else
     return getLevelFromScreenX_RND(x);
 }
@@ -374,6 +402,8 @@ int getLevelFromScreenY(int y)
     return getLevelFromScreenY_EM(y);
   if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
     return getLevelFromScreenY_SP(y);
+  if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+    return getLevelFromScreenY_MM(y);
   else
     return getLevelFromScreenY_RND(y);
 }
@@ -465,6 +495,8 @@ void RedrawPlayfield()
     RedrawPlayfield_EM(TRUE);
   else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
     RedrawPlayfield_SP(TRUE);
+  else if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+    RedrawPlayfield_MM();
   else if (level.game_engine_type == GAME_ENGINE_TYPE_RND)
     RedrawPlayfield_RND();
 
@@ -611,6 +643,8 @@ void BlitScreenToBitmap(Bitmap *target_bitmap)
     BlitScreenToBitmap_EM(target_bitmap);
   else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
     BlitScreenToBitmap_SP(target_bitmap);
+  else if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+    BlitScreenToBitmap_MM(target_bitmap);
   else if (level.game_engine_type == GAME_ENGINE_TYPE_RND)
     BlitScreenToBitmap_RND(target_bitmap);
 
@@ -7194,6 +7228,60 @@ int map_action_SP_to_RND(int action_sp)
   }
 }
 
+int map_element_RND_to_MM(int element_rnd)
+{
+  return (element_rnd >= EL_CHAR_START &&
+         element_rnd <= EL_CHAR_END ?
+         EL_CHAR_START_NATIVE_MM + element_rnd - EL_CHAR_START :
+
+         element_rnd >= EL_DF_START &&
+         element_rnd <= EL_DF_END ?
+         EL_DF_START_NATIVE_MM + element_rnd - EL_DF_START :
+
+         element_rnd >= EL_MM_START &&
+         element_rnd <= EL_MM_END ?
+         EL_MM_START_NATIVE_MM + element_rnd - EL_MM_START :
+
+         element_rnd >= EL_MM_RUNTIME_START &&
+         element_rnd <= EL_MM_RUNTIME_END ?
+         EL_MM_RUNTIME_START_NATIVE_MM + element_rnd - EL_MM_RUNTIME_START :
+
+         element_rnd >= EL_MM_DUMMY_START &&
+         element_rnd <= EL_MM_DUMMY_END ?
+         EL_MM_DUMMY_START_NATIVE_MM + element_rnd - EL_MM_DUMMY_START :
+
+         EL_EMPTY_NATIVE_MM);
+}
+
+int map_element_MM_to_RND(int element_mm)
+{
+  return (element_mm == EL_EMPTY_NATIVE_MM ||
+         element_mm == EL_DF_EMPTY_NATIVE_MM ?
+         EL_EMPTY :
+
+         element_mm >= EL_CHAR_START_NATIVE_MM &&
+         element_mm <= EL_CHAR_END_NATIVE_MM ?
+         EL_CHAR_START + element_mm - EL_CHAR_START_NATIVE_MM :
+
+         element_mm >= EL_DF_START_NATIVE_MM &&
+         element_mm <= EL_DF_END_NATIVE_MM ?
+         EL_DF_START + element_mm - EL_DF_START_NATIVE_MM :
+
+         element_mm >= EL_MM_START_NATIVE_MM &&
+         element_mm <= EL_MM_END_NATIVE_MM ?
+         EL_MM_START + element_mm - EL_MM_START_NATIVE_MM :
+
+         element_mm >= EL_MM_RUNTIME_START_NATIVE_MM &&
+         element_mm <= EL_MM_RUNTIME_END_NATIVE_MM ?
+         EL_MM_RUNTIME_START + element_mm - EL_MM_RUNTIME_START_NATIVE_MM :
+
+         element_mm >= EL_MM_DUMMY_START_NATIVE_MM &&
+         element_mm <= EL_MM_DUMMY_END_NATIVE_MM ?
+         EL_MM_DUMMY_START + element_mm - EL_MM_DUMMY_START_NATIVE_MM :
+
+         EL_EMPTY);
+}
+
 int get_next_element(int element)
 {
   switch (element)
@@ -7438,6 +7526,8 @@ unsigned int InitRND(int seed)
     return InitEngineRandom_EM(seed);
   else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
     return InitEngineRandom_SP(seed);
+  else if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+    return InitEngineRandom_MM(seed);
   else
     return InitEngineRandom_RND(seed);
 }