rnd-20091030-1-src
[rocksndiamonds.git] / src / game_sp / file.c
index 2aa0ddf5e34e39adff14a286f8874db1dadf28ad..12b52c3a24e7327aac681e8545e081e9e79e407d 100644 (file)
@@ -43,13 +43,18 @@ void setLevelInfoToDefaults_SP()
     port->FreezeEnemies = 0;
   }
 
-  native_sp_level.demo_available = FALSE;
-  native_sp_level.demo_length = 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;
 }
 
 void copyInternalEngineVars_SP()
 {
   int i, x, y;
+  int count;
 
   LInfo = native_sp_level.header;
 
@@ -60,13 +65,33 @@ void copyInternalEngineVars_SP()
   FieldMax = (FieldWidth * FieldHeight) + HeaderSize - 1;
   LevelMax = (FieldWidth * FieldHeight) - 1;
 
-  FileMax = FieldMax + native_sp_level.demo_length;
+  FileMax = FieldMax + native_sp_level.demo.length;
 
   PlayField8 = REDIM_1D(sizeof(byte), 0, FileMax + 1 - 1);
   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
+
+  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,12 +105,16 @@ void copyInternalEngineVars_SP()
     }
   }
 
-  if (native_sp_level.demo_available)
+#endif
+
+  if (native_sp_level.demo.is_available)
   {
     DemoAvailable = True;
 
-    for (i = 0; i < native_sp_level.demo_length; i++)
-      PlayField8[FieldMax + i + 1] = native_sp_level.demo[i];
+    PlayField8[FieldMax + 1] = native_sp_level.demo.level_nr;
+
+    for (i = 0; i < native_sp_level.demo.length; i++)
+      PlayField8[FieldMax + i + 2] = native_sp_level.demo.data[i];
   }
 
   AnimationPosTable = REDIM_1D(sizeof(int), 0, LevelMax - 2 * FieldWidth);
@@ -99,8 +128,18 @@ void copyInternalEngineVars_SP()
   GravityFlag = LInfo.InitialGravity;
   FreezeZonks = LInfo.InitialFreezeZonks;
 
+#if 1
+  /* this is set by main game tape code to native random generator directly */
+#else
+
+#if 1
+  printf("::: file.c: copyInternalEngineVars_SP(): RandomSeed = LInfo.DemoRandomSeed\n");
+#endif
+
   RandomSeed = LInfo.DemoRandomSeed;
 
+#endif
+
   LevelLoaded = True;
 }
 
@@ -191,6 +230,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);
@@ -207,15 +247,29 @@ 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)
   {
+    int level_nr = getFile8Bit(file);
+
+    level_nr &= 0x7f;                  /* clear highest bit */
+    level_nr = (level_nr < 1   ? 1   :
+               level_nr > 111 ? 111 : level_nr);
+
+    native_sp_level.demo.level_nr = level_nr;
+
     for (i = 0; i < SP_MAX_TAPE_LEN && !feof(file); i++)
     {
-      native_sp_level.demo[i] = getFile8Bit(file);
+      native_sp_level.demo.data[i] = getFile8Bit(file);
 
-      if (native_sp_level.demo[i] == 0xff)     /* "end of demo" byte */
+      if (native_sp_level.demo.data[i] == 0xff)        /* "end of demo" byte */
       {
        i++;
 
@@ -223,8 +277,8 @@ static void LoadNativeLevelFromFileStream_SP(FILE *file, boolean demo_available)
       }
     }
 
-    native_sp_level.demo_length = i;
-    native_sp_level.demo_available = (native_sp_level.demo_length > 0);
+    native_sp_level.demo.length = i;
+    native_sp_level.demo.is_available = (native_sp_level.demo.length > 0);
   }
 }