rnd-20091028-1-src
[rocksndiamonds.git] / src / files.c
index e71ca2a26a34b72b86c04e5b0684e4135db4efbb..05dfd5bd6e9dd1a05a0d2fa14838531e83181276 100644 (file)
@@ -4157,11 +4157,12 @@ static void LoadLevelFromFileInfo_SP(struct LevelInfo *level,
 
 void CopyNativeLevel_RND_to_SP(struct LevelInfo *level)
 {
-  LevelInfoType *header = &native_sp_level.header;
+  struct LevelInfo_SP *level_sp = level->native_sp_level;
+  LevelInfoType *header = &level_sp->header;
   int i, x, y;
 
-  native_sp_level.width = level->fieldx;
-  native_sp_level.height = level->fieldy;
+  level_sp->width = level->fieldx;
+  level_sp->height = level->fieldy;
 
   for (x = 0; x < level->fieldx; x++)
   {
@@ -4173,12 +4174,14 @@ void CopyNativeLevel_RND_to_SP(struct LevelInfo *level)
       if (element_old >= EL_SP_START &&
          element_old <= EL_SP_END)
        element_new = element_old - EL_SP_START;
+      else if (element_old == EL_EMPTY_SPACE)
+       element_new = 0x00;
       else if (element_old == EL_INVISIBLE_WALL)
        element_new = 0x28;
       else
-       element_new = EL_SP_HARDWARE_YELLOW;    /* unknown to Supaplex engine */
+       element_new = 0x20;     /* map unknown elements to yellow "hardware" */
 
-      native_sp_level.playfield[x][y] = element_new;
+      level_sp->playfield[x][y] = element_new;
     }
   }
 
@@ -4195,17 +4198,18 @@ void CopyNativeLevel_RND_to_SP(struct LevelInfo *level)
 
 void CopyNativeLevel_SP_to_RND(struct LevelInfo *level)
 {
-  LevelInfoType *header = &native_sp_level.header;
+  struct LevelInfo_SP *level_sp = level->native_sp_level;
+  LevelInfoType *header = &level_sp->header;
   int i, x, y;
 
-  level->fieldx = native_sp_level.width;
-  level->fieldy = native_sp_level.height;
+  level->fieldx = level_sp->width;
+  level->fieldy = level_sp->height;
 
   for (x = 0; x < level->fieldx; x++)
   {
     for (y = 0; y < level->fieldy; y++)
     {
-      int element_old = native_sp_level.playfield[x][y];
+      int element_old = level_sp->playfield[x][y];
       int element_new;
 
       if (element_old <= 0x27)
@@ -4297,6 +4301,35 @@ void CopyNativeLevel_SP_to_RND(struct LevelInfo *level)
        level->yamyam_content[i].e[x][y] = EL_EMPTY;
 }
 
+static void setTapeInfoToDefaults();
+
+static void CopyNativeTape_SP_to_RND(struct LevelInfo *level)
+{
+  struct LevelInfo_SP *level_sp = level->native_sp_level;
+  struct DemoInfo_SP *demo = &level_sp->demo;
+  int i;
+
+  /* always start with reliable default values */
+  setTapeInfoToDefaults();
+
+  tape.level_nr = demo->level_nr;      /* (currently not used) */
+  tape.length = demo->length - 1;      /* without "end of demo" byte */
+  tape.random_seed = level_sp->header.DemoRandomSeed;
+
+  // tape.date = <SET FROM FILE DATE OF *.SP FILE>
+
+  for (i = 0; i < demo->length - 1; i++)
+  {
+    int demo_action = demo->data[i] & 0x0f;
+    int demo_repeat = (demo->data[i] & 0xf0) >> 4;
+
+    tape.pos[i].action[0] = map_key_SP_to_RND(demo_action);
+    tape.pos[i].delay = demo_repeat + 1;
+  }
+
+  tape.length_seconds = GetTapeLength();
+}
+
 
 /* ------------------------------------------------------------------------- */
 /* functions for loading DC level                                            */
@@ -8014,6 +8047,13 @@ void LoadSolutionTape(int nr)
   char *filename = getSolutionTapeFilename(nr);
 
   LoadTapeFromFilename(filename);
+
+#if 1
+  if (TAPE_IS_EMPTY(tape) &&
+      level.game_engine_type == GAME_ENGINE_TYPE_SP &&
+      level.native_sp_level->demo.is_available)
+    CopyNativeTape_SP_to_RND(&level);
+#endif
 }
 
 static void SaveTape_VERS(FILE *file, struct TapeInfo *tape)