fixed bug with frozen zonks when using engine snapshots with Supaplex engine
[rocksndiamonds.git] / src / game_sp / init.c
index 8ac8804e9bea89880af855ede111cd0e09e5245b..e86e3185a4972dad010f28006fd66d0e4e6beb26 100644 (file)
@@ -3,84 +3,97 @@
 #include "global.h"
 
 
-#if 0
-Bitmap *sp_objects;
-
-#endif
-
-Bitmap *screenBitmap;
+char *preceding_playfield_memory[] =
+{
+  "95 89 95 89 95 89 3b 8a  3b 8a 3b 8a 3b 8a 3b 8a",  // |......;.;.;.;.;.|
+  "3b 8a 3b 8a 3b 8a e8 8a  e8 8a e8 8a e8 8a e8 8a",  // |;.;.;...........|
+  "e8 8a e8 8a e8 8a b1 8b  b1 8b b1 8b b1 8b b1 8b",  // |................|
+  "b1 8b b1 8b b1 8b 85 8c  85 8c 85 8c 85 8c 85 8c",  // |................|
+  "85 8c 85 8c 85 8c 5b 8d  5b 8d 5b 8d 5b 8d 5b 8d",  // |......[.[.[.[.[.|
+  "5b 8d 5b 8d 5b 8d 06 8e  06 8e 06 8e 06 8e 06 8e",  // |[.[.[...........|
+  "06 8e 06 8e 06 8e ac 8e  ac 8e ac 8e ac 8e ac 8e",  // |................|
+  "ac 8e ac 8e ac 8e 59 8f  59 8f 59 8f 59 8f 59 8f",  // |......Y.Y.Y.Y.Y.|
+  "59 8f 59 8f 59 8f 00 00  70 13 00 00 00 00 e8 17",  // |Y.Y.Y...p.......|
+  "00 00 00 00 00 00 69 38  00 00 00 00 00 00 00 00",  // |......i8........|
+  "00 00 00 00 00 00 00 00  d0 86 00 00 b2 34 00 00",  // |.............4..|
+  "00 00 00 00 00 00 8f 8b  1d 34 00 00 00 00 00 00",  // |.........4......|
+  "00 00 00 00 23 39 09 09  00 0c 00 08 00 58 00 00",  // |....#9.......X..|
+  "00 00 00 25 77 06 7f 00  00 00 01 00 00 00 00 00",  // |...%w...........|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 ec 06 26 05 00 00 00",  // |...........&....|
+  "00 00 00 01 00 00 00 00  31 32 33 34 35 36 37 38",  // |........12345678|
+  "39 30 2d 00 08 00 51 57  45 52 54 59 55 49 4f 50",  // |90-...QWERTYUIOP|
+  "00 00 0a 00 41 53 44 46  47 48 4a 4b 4c 00 00 00",  // |....ASDFGHJKL...|
+  "00 00 5a 58 43 56 42 4e  4d 00 00 00 00 00 00 20",  // |..ZXCVBNM...... |
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 2e 00  1e 00 31 00 14 00 39 00",  // |..........1...9.|
+  "1f 00 14 00 18 00 ff ff  01 00 01 4c 45 56 45 4c",  // |...........LEVEL|
+  "53 2e 44 41 54 00 00 00  00 00 00 00 00 00 00 00",  // |S.DAT...........|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+  "00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00",  // |................|
+
+  NULL
+};
+
+
+Bitmap *bitmap_db_field_sp;
 
 struct EngineSnapshotInfo_SP engine_snapshot_sp;
 
-static void init_struct_functions()
+void sp_open_all()
 {
-  Stage.Blt           = &DDScrollBuffer_Blt;
-  Stage.ScrollTo      = &DDScrollBuffer_ScrollTo;
-  Stage.ScrollTowards = &DDScrollBuffer_ScrollTowards;
-  Stage.SoftScrollTo  = &DDScrollBuffer_SoftScrollTo;
-
-  // StretchedSprites.BltEx  = &DDSpriteBuffer_BltEx;
-  StretchedSprites.BltImg = &DDSpriteBuffer_BltImg;
+  Form_Load();
 }
 
-static void init_global_values()
+void sp_close_all()
 {
-  menBorder.Checked = False;
-  menPanel.Checked = True;
-  menAutoScroll.Checked = True;
-
-  MainForm.picPane.Width  = picPane.Width  = SCR_FIELDX * TILEX;
-  MainForm.picPane.Height = picPane.Height = SCR_FIELDY * TILEY;
 }
 
-void sp_open_all()
+void InitPrecedingPlayfieldMemory()
 {
-  init_struct_functions();
-  init_global_values();
+  int preceding_buffer_size = 0;
+  int i;
 
-  Form_Load();
+  for (i = 0; preceding_playfield_memory[i] != NULL; i++)
+    preceding_buffer_size += 8;                /* eight 16-bit integer values */
 
-#if 0
-  SetBitmaps_SP(&sp_objects);
-#endif
-
-#if 0
-  /* too small for oversized levels, but too big for graphics performance */
-  /* (the whole playfield is drawn/updated, not only visible/scrolled area) */
-  /* !!! FIX THIS !!! */
-  screenBitmap = CreateBitmap(60 * TILEX, 24 * TILEY,
-                              DEFAULT_DEPTH);
-#else
-  screenBitmap = CreateBitmap(MAX_BUF_XSIZE * TILEX, MAX_BUF_YSIZE * TILEY,
-                              DEFAULT_DEPTH);
-#endif
-
-  DDSpriteBuffer_CreateFromFile("[NONE]", 16, 16);
+  game_sp.preceding_buffer = preceding_playfield_memory;
+  game_sp.preceding_buffer_size = preceding_buffer_size;
 }
 
-void sp_close_all()
+void InitGfxBuffers_SP()
 {
+  ReCreateBitmap(&bitmap_db_field_sp, FXSIZE, FYSIZE);
 }
 
-unsigned int InitEngineRandom_SP(long seed)
+unsigned int InitEngineRandom_SP(int seed)
 {
   if (seed == NEW_RANDOMIZE)
   {
-#if 0
-  printf("::: init.c: InitEngineRandom_SP(): subRandomize()\n");
-#endif
-
     subRandomize();
 
-    seed = (long)RandomSeed;
+    seed = (int)RandomSeed;
   }
 
   RandomSeed = (short)seed;
 
-#if 0
-  printf("::: init.c: InitEngineRandom_SP(): RandomSeed == %d\n", RandomSeed);
-#endif
-
   return (unsigned int) seed;
 }
 
@@ -89,7 +102,7 @@ unsigned int InitEngineRandom_SP(long seed)
 /* Supaplex game engine snapshot handling functions                          */
 /* ------------------------------------------------------------------------- */
 
-void SaveEngineSnapshotValues_SP()
+void SaveEngineSnapshotValues_SP(ListNode **buffers)
 {
   int i;
 
@@ -113,71 +126,68 @@ void SaveEngineSnapshotValues_SP()
 
   /* store special data into engine snapshot buffers */
 
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(FieldWidth));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(FieldHeight));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(FieldMax));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(LevelMax));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(FileMax));
-
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(TimerVar));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(RandomSeed));
-
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(TerminalMaxCycles));
-
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(mScrollX));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(mScrollY));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(mScrollX_last));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(mScrollY_last));
-
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(ScreenScrollXPos));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(ScreenScrollYPos));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(DisplayMinX));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(DisplayMinY));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(DisplayMaxX));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(DisplayMaxY));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(DisplayWidth));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(DisplayHeight));
-
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(InfotronsNeeded));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(KillMurphyFlag));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(MurphyMoveCounter));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(MurphyExplodePos));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(SplitMoveFlag));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(RedDiskReleaseMurphyPos));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(MurphyPosIndex));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(MurphyXPos));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(MurphyYPos));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(MurphyScreenXPos));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(MurphyScreenYPos));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(MurphyVarFaceLeft));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(RedDiskCount));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(RedDiskReleaseFlag));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(MovingPictureSequencePhase));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(RedDiskReleasePhase));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(ScratchGravity));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(GravityFlag));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(SnikSnaksElectronsFrozen));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(UpdateTimeFlag));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(UpdatedFlag));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(YellowDisksExploded));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(YawnSleepCounter));
-
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(LeadOutCounter));
-
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(GfxElementLast));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(GfxGraphicLast));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(GfxGraphic));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(GfxFrame));
-
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(ScrollMinX));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(ScrollMinY));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(ScrollMaxX));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(ScrollMaxY));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(ScrollX));
-  SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(ScrollY));
-
-  SaveEngineSnapshotBuffer(&PlayField16[-game_sp.preceding_buffer_size],
-                          game_sp.preceding_buffer_size * sizeof(int));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(FieldWidth));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(FieldHeight));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(FieldMax));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(LevelMax));
+
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(TimerVar));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(RandomSeed));
+
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(FreezeZonks));
+
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(TerminalMaxCycles));
+
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(mScrollX));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(mScrollY));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(mScrollX_last));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(mScrollY_last));
+
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(ScreenScrollXPos));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(ScreenScrollYPos));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(DisplayMinX));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(DisplayMinY));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(DisplayMaxX));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(DisplayMaxY));
+
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(InfotronsNeeded));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(KillMurphyFlag));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(MurphyMoveCounter));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(MurphyExplodePos));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(SplitMoveFlag));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(RedDiskReleaseMurphyPos));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(MurphyPosIndex));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(MurphyXPos));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(MurphyYPos));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(MurphyScreenXPos));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(MurphyScreenYPos));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(MurphyVarFaceLeft));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(RedDiskCount));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(RedDiskReleaseFlag));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(MovingPictureSequencePhase));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(RedDiskReleasePhase));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(ScratchGravity));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(GravityFlag));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(SnikSnaksElectronsFrozen));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(YellowDisksExploded));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(YawnSleepCounter));
+
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(LeadOutCounter));
+
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(GfxElementLast));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(GfxGraphicLast));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(GfxGraphic));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(GfxFrame));
+
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(ScrollMinX));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(ScrollMinY));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(ScrollMaxX));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(ScrollMaxY));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(ScrollX));
+  SaveSnapshotBuffer(buffers, ARGS_ADDRESS_AND_SIZEOF(ScrollY));
+
+  SaveSnapshotBuffer(buffers, &PlayField16[-game_sp.preceding_buffer_size],
+                    game_sp.preceding_buffer_size * sizeof(int));
 }
 
 void LoadEngineSnapshotValues_SP()