rnd-20090925-1-src
authorHolger Schemel <info@artsoft.org>
Fri, 25 Sep 2009 18:55:35 +0000 (20:55 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:57:38 +0000 (10:57 +0200)
* fixed bug when reading Supaplex single level files (preventing loader
  from seeking to level position like in Supaplex level package files)

ChangeLog
src/conftime.h
src/files.c
src/game_sp/BugsTerminals.c
src/game_sp/Globals.c
src/game_sp/Globals.h
src/game_sp/Murphy.c
src/game_sp/modAnimations.h

index de1e04b407537122697563a790297e17f1af38e1..1e307c07ad4dc7e049e79228883443b230856e2b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2009-09-23
+       * fixed bug when reading Supaplex single level files (preventing loader
+         from seeking to level position like in Supaplex level package files)
+
 2009-08-01
        * first classic Supaplex level running and solved by solution/demo tape
 
index b0b6875e204d31e88cf5ab4b7d1acfafaa5cc95b..847d17c62623cd41f7487e8784f3e904cb3f09ae 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2009-09-19 02:10"
+#define COMPILE_DATE_STRING "2009-09-25 20:53"
index 239b85ec89a51863584162e5c2a7a9f840016854..863ac2036459f5a820f3205435c8a45a5253a234 100644 (file)
@@ -4013,7 +4013,8 @@ static void LoadLevelFromFileInfo_SP(struct LevelInfo *level,
   }
 
   /* position file stream to the requested level inside the level package */
-  if (fseek(file, nr * SP_LEVEL_SIZE, SEEK_SET) != 0)
+  if (level_file_info->packed &&
+      fseek(file, nr * SP_LEVEL_SIZE, SEEK_SET) != 0)
   {
     level->no_valid_file = TRUE;
 
index 4847b92e1a25c843012b5b2032201e2489563e90..4bb27c039dd1db5e7201e02a2274cafddecbf590 100644 (file)
@@ -94,7 +94,11 @@ int subAnimateTerminals(int si)
   int subAnimateTerminals;
 
   // int bl, ax, al, X, Y;
+#if 1
+  short bl, al, X, Y;
+#else
   int bl, al, X, Y;
+#endif
 
   if (LowByte(PlayField16[si]) != fiTerminal)
     return subAnimateTerminals;
@@ -159,6 +163,10 @@ int subRandomize()
   }
 #endif
 
+#if 1
+  printf("::: BugsTerminals.c: ========== subRandomize()\n");
+#endif
+
   return subRandomize;
 } // subRandomize
 
@@ -178,7 +186,12 @@ int subGetRandomNumber()
   if (0x8000 == (RandomSeed & 0x8000))
     RSeed = RSeed | 0x8000;
 
+#if 0
+  /* !!! TEST !!! */
+  Tmp = 0xFFFF & (((0x5E5 * RSeed) & 0xFFFF) + 0x31);
+#else
   Tmp = 0xFFFF & (((0x5E5 * RandomSeed) & 0xFFFF) + 0x31);
+#endif
   RandomSeed = 0x7FFF & Tmp;
   if ((Tmp & 0x8000) != 0)
     RandomSeed = RandomSeed | 0x8000;
@@ -192,6 +205,10 @@ int subGetRandomNumber()
   //  Mov randomseed, ax
   //  shr ax,1
 
+#if 0
+  printf("::: BugsTerminals.c: ---------- subGetRandomNumber(): %d\n",
+        subGetRandomNumber);
+#endif
+
   return subGetRandomNumber;
 } // subGetRandomNumber
-
index 8bd2e450d02fc680bd3860d81b6aa91f0d8e24e1..9dbe3138901d24bd2ee90e58207ab56f4de9f3b1 100644 (file)
@@ -66,7 +66,12 @@ byte *DisPlayField;
 
 // Public DisplayMin%, DisplayMax%, DisplayWidth%, DisplayHeight%
 
-int TimerVar, RandomSeed;
+int TimerVar;
+#if 1
+short RandomSeed;
+#else
+int RandomSeed;
+#endif
 currency DeltaT; // Interval between two frames (in ms)
 long DeltaTPlay, DeltaTDemo;
 boolean BlockingSpeed;
@@ -342,7 +347,15 @@ void ReadLevel()
   CurPath = "/home/aeglos/projects/rocksndiamonds/supaplex_demo_JENS0001.sp";
   LevelNumber = 1;
 #else
+
+#if 0
+  // sprintf(CurPathTEST, "/home/aeglos/projects/rocksndiamonds/levels/TEST_supaplex/test_solutions/%03d.sp", level_nr);
+
+  sprintf(CurPathTEST, "/home/aeglos/projects/Level_Stuff/SUPAPLEX/SUPAPLEX_LEVELS/Set77/77S%03d.SP", level_nr);
+#else
   sprintf(CurPathTEST, "/home/aeglos/projects/Level_Stuff/SUPAPLEX/SUPAPLEX_LEVELS/solve00/JENS%04d.SP", level_nr);
+#endif
+
   CurPath = CurPathTEST;
   LevelNumber = level_nr;
 #endif
@@ -546,24 +559,40 @@ static void ReadDemo()
   printf("::: Globals.c: ReadDemo(): %d / %d\n", GravityFlag, FreezeZonks);
 #endif
 
-  RandomSeed = LInfo.DemoRandomSeed;
+
+
+#if 0
+  /* !!! TESTING BIG / LITTLE ENDIAN STUFF !!! */
+  LInfo.DemoRandomSeed =
+    LowByte(LInfo.DemoRandomSeed) << 8 |
+    HighByte(LInfo.DemoRandomSeed);
+  for (i = 0; i < 10; i++)
+    LInfo.SpecialPort[i].PortLocation =
+      LowByte(LInfo.SpecialPort[i].PortLocation) << 8 |
+      HighByte(LInfo.SpecialPort[i].PortLocation);
+
+  printf("::: swapping file bytes for DemoRandomSeed etc.\n");
+#else
+  printf("::: keeping file bytes in (maybe wrong) 'native' order.\n");
+#endif
 
 #if 1
+  printf("::: LInfo.DemoRandomSeed == %d\n", LInfo.DemoRandomSeed);
+#endif
+
+  RandomSeed = LInfo.DemoRandomSeed;
+
+#if 0
+  printf("::: SpeedByte == %d\n", LInfo.SpeedByte);
+  printf("::: CheckSumByte == %d\n", LInfo.CheckSumByte);
   printf("::: RandomSeed == %d\n", RandomSeed);
 
-#if 1
+#if 0
   {
     int i;
 
     for (i = 0; i < 10; i++)
       printf("::: TEST random number: %d\n", subGetRandomNumber());
-
-    int buffer, value = -3;
-
-    MovHighByte(&buffer, value);
-    value = SgnHighByte(buffer);
-
-    printf("::: TEST: 0x%08x / %d\n", value, value);
   }
 #endif
 
index f705fd530f948b8c3eb513533ff02ab542129c91..7a618ed9d6588618979f1f126eb5e0beff0143a7 100644 (file)
@@ -175,7 +175,8 @@ extern int FieldWidth;
 extern int FreezeZonks;
 extern int HeaderSize;
 extern int LevelNumber;
-extern int TimerVar, RandomSeed;
+extern int TimerVar;
+extern short RandomSeed;
 extern long DeltaTPlay, DeltaTDemo;
 extern long FileMax;
 extern long SignatureDelay;
index a646978b61b1fb617845c383ae5c8700c698acfd..bfe6854a6264ffac33e667d0b9f2da128b2b6e5a 100644 (file)
@@ -932,7 +932,7 @@ loc_g_6756:
     return subAnimateMurphy;
 
 #if 1
-  printf("::: Murphy.c: !!!!!!!!!! GAME SOLVED !!!!!!!!!!\n");
+  printf("::: Murphy.c: !!!!!!!!!! LEVEL %d SOLVED !!!!!!!!!!\n", LevelNumber);
 #endif
 
   subSoundFXExit();
@@ -2328,6 +2328,28 @@ int subSpPortTest(int si)
 
   int i, cx, bx;
 
+#if 1
+  cx = LInfo.SpecialPortCount; // number of special ports
+
+  for (i = 0; i < cx; i++)
+  {
+    bx = HighByte(LInfo.SpecialPort[i].PortLocation);
+    MovHighByte(&bx, LowByte(LInfo.SpecialPort[i].PortLocation));
+
+    if (bx / 2 == si)
+    {
+      GravityFlag = LInfo.SpecialPort[i].Gravity;
+      FreezeZonks = LInfo.SpecialPort[i].FreezeZonks;
+      SnikSnaksElectronsFrozen = LInfo.SpecialPort[i].FreezeEnemies;
+
+      // RandomTime = RandomTime Xor RandomSeed 'is RandomTime used at all? no!
+
+      break;
+    }
+  }
+
+#else
+
   cx = LInfo.SpecialPortCount; // number of special ports
   for (i = 1; i <= cx; i++)
   {
@@ -2342,9 +2364,9 @@ int subSpPortTest(int si)
         //        RandomTime = RandomTime Xor RandomSeed 'is RandomTime used at all? no!
         i = cx + 1;
       }
-
     }
   }
+#endif
 
   return subSpPortTest;
 } // subSpPortTest
index 13e6db665451098a734270b10e92d62e67ab84bc..38325dc0fb7f75db9942bfc330b52375e6765523 100644 (file)
 #ifndef HAS_SpecialPortType
 typedef struct
 {
+#if 1
+  short PortLocation; // = 2*(x+(y*60))
+#else
   int PortLocation; // = 2*(x+(y*60))
+#endif
   byte Gravity; // 1 = turn on, anything else (0) = turn off
   byte FreezeZonks; // 2 = turn on, anything else (0) = turn off  (1=off!)
   byte FreezeEnemies; // 1 = turn on, anything else (0) = turn off
@@ -38,10 +42,14 @@ typedef struct
   // amount of Infotrons in the level, and use the low byte of that number.
   // (A multiple of 256 Infotrons will then result in 0-to-eat, etc.!)
   byte SpecialPortCount; // Maximum 10 allowed!
-  SpecialPortType SpecialPort[10 + 1];
+  SpecialPortType SpecialPort[10];
   byte SpeedByte; // = Speed XOR Highbyte(RandomSeed)
   byte CheckSumByte; // = CheckSum XOR SpeedByte
+#if 1
+  short DemoRandomSeed;
+#else
   int DemoRandomSeed;
+#endif
 } LevelInfoType;
 #define HAS_LevelInfoType
 #endif