rnd-20091101-1-src
[rocksndiamonds.git] / src / game_sp / file.c
index 7a0c2c87127196c573babc546a153170b350c216..2a657fccc732077c0b7380d98a0f641fdd0ab1d9 100644 (file)
@@ -43,6 +43,10 @@ void setLevelInfoToDefaults_SP()
     port->FreezeEnemies = 0;
   }
 
+  /* set raw header bytes (used for subsequent buffer zone) to "hardware" */
+  for (i = 0; i < SP_HEADER_SIZE; i++)
+    native_sp_level.header_raw_bytes[i] = 0x20;
+
   native_sp_level.demo.is_available = FALSE;
   native_sp_level.demo.length = 0;
 }
@@ -50,6 +54,7 @@ void setLevelInfoToDefaults_SP()
 void copyInternalEngineVars_SP()
 {
   int i, x, y;
+  int count;
 
   LInfo = native_sp_level.header;
 
@@ -66,7 +71,33 @@ void copyInternalEngineVars_SP()
   DisPlayField = REDIM_1D(sizeof(byte), 0, FieldMax + 1 - 1);
   PlayField16 = REDIM_1D(sizeof(int), -FieldWidth, FieldMax);
 
-  for (i = 0, y = 0; y < native_sp_level.height; y++)
+#if 1
+
+#if 0
+  /* fill preceding playfield buffer zone with (indestructible) "hardware" */
+  for (i = -FieldWidth; i < 0; i++)
+    PlayField16[i] = 0x20;
+#endif
+
+  count = 0;
+  for (y = 0; y < native_sp_level.height; y++)
+    for (x = 0; x < native_sp_level.width; x++)
+      PlayField8[count++] = native_sp_level.playfield[x][y];
+
+  /* add raw header bytes to subsequent playfield buffer zone */
+  for (i = 0; i < SP_HEADER_SIZE; i++)
+    PlayField8[count++] = native_sp_level.header_raw_bytes[i];
+
+  for (i = 0; i < count; i++)
+  {
+    PlayField16[i] = PlayField8[i];
+    DisPlayField[i] = PlayField8[i];
+    PlayField8[i] = 0;
+  }
+
+#else
+
+  for (i = 0; y = 0; y < native_sp_level.height; y++)
   {
     for (x = 0; x < native_sp_level.width; x++)
     {
@@ -80,6 +111,8 @@ void copyInternalEngineVars_SP()
     }
   }
 
+#endif
+
   if (native_sp_level.demo.is_available)
   {
     DemoAvailable = True;
@@ -102,7 +135,7 @@ void copyInternalEngineVars_SP()
   FreezeZonks = LInfo.InitialFreezeZonks;
 
 #if 1
-  /* set by main game tape code directly */
+  /* this is set by main game tape code to native random generator directly */
 #else
 
 #if 1
@@ -203,6 +236,7 @@ static void LoadNativeLevelFromFileStream_SP(FILE *file, boolean demo_available)
 
   /* random seed used for recorded demos */
   header->DemoRandomSeed = getFile16BitLE(file);       /* yes, little endian */
+  // header->DemoRandomSeed = getFile16BitBE(file);    /* !!! TEST ONLY !!! */
 
 #if 0
   printf("::: file.c: DemoRandomSeed == %d\n", header->DemoRandomSeed);
@@ -219,6 +253,12 @@ static void LoadNativeLevelFromFileStream_SP(FILE *file, boolean demo_available)
     header->InfotronsNeeded &= 0xff;   /* only use low byte -- see above */
   }
 
+  /* read raw level header bytes (96 bytes) */
+
+  fseek(file, -(SP_HEADER_SIZE), SEEK_CUR);    /* rewind file */
+  for (i = 0; i < SP_HEADER_SIZE; i++)
+    native_sp_level.header_raw_bytes[i] = fgetc(file);
+
   /* also load demo tape, if available */
 
   if (demo_available)
@@ -307,13 +347,20 @@ boolean LoadNativeLevel_SP(char *filename, int pos)
       ((name_first == '?' || name_first == '1') &&
        (name_last  == '?' || name_last  == '1'));
 
-    /* correct leading multipart level meta information in level name */
-    for (i = 0; i < SP_LEVEL_NAME_LEN && header->LevelTitle[i] == name_first; i++)
-      header->LevelTitle[i] = '-';
-
-    /* correct trailing multipart level meta information in level name */
-    for (i = SP_LEVEL_NAME_LEN - 1; i >= 0 && header->LevelTitle[i] == name_last; i--)
-      header->LevelTitle[i] = '-';
+    if (is_multipart_level)
+    {
+      /* correct leading multipart level meta information in level name */
+      for (i = 0;
+          i < SP_LEVEL_NAME_LEN && header->LevelTitle[i] == name_first;
+          i++)
+       header->LevelTitle[i] = '-';
+
+      /* correct trailing multipart level meta information in level name */
+      for (i = SP_LEVEL_NAME_LEN - 1;
+          i >= 0 && header->LevelTitle[i] == name_last;
+          i--)
+       header->LevelTitle[i] = '-';
+    }
 
     /* ---------- check for normal single level ---------- */