Merge branch 'master' into releases 3.0.4
authorHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:43:46 +0000 (10:43 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:43:46 +0000 (10:43 +0200)
CHANGES
src/conftime.h
src/files.c
src/game.c
src/main.h
src/screens.c
src/tools.c

diff --git a/CHANGES b/CHANGES
index 6f704695e25a08524f35fc008135b791b539f084..2939326e4d0b7c526b97257fe8513e6a3d64ec20 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,8 @@
+Release Version 3.0.4 [13 SEP 2003]
+-----------------------------------
+       * fixed bug in multiple config pages code that caused crashes
+       * fixed bug in custom definition of crumbled element graphic
+
 Release Version 3.0.3 [08 SEP 2003]
 -----------------------------------
        - fixed bug (missing array boundary check) which could crash the game
@@ -8,6 +13,7 @@ Release Version 3.0.3 [08 SEP 2003]
        - added envelope content which gets displayed when collecting envelope
        - added multiple change event pages for custom elements
        - added support for loading various music formats through SDL_mixer
+       - added music to Supaplex classic level set
 
 Release Version 3.0.2 [22 AUG 2003]
 -----------------------------------
index bd0e81872db861fd33fb13945c91ee975e635dfd..a5d63c8596f7b8fa7f95836181c1e29d59db05bb 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2003-09-08 00:04]"
+#define COMPILE_DATE_STRING "[2003-09-13 01:34]"
index 0b85e1eba468ddd2e0e3d7f5764181dc368744a3..ac3f0b4b86d92fafaa49f29987038a9ad8c3812f 100644 (file)
@@ -689,6 +689,8 @@ static int LoadLevel_CUS4(FILE *file, int chunk_size, struct LevelInfo *level)
 
   /* read change property values */
 
+  setElementChangePages(ei, ei->num_change_pages);
+
   for (i=0; i < ei->num_change_pages; i++)
   {
     struct ElementChangeInfo *change = &ei->change_page[i];
index 91694d2d7ea0e2ab2fd617081c89a046c14e5105..750c70a91e01a7ddfaeb6f63bf296c168b6bc7e9 100644 (file)
@@ -2285,6 +2285,22 @@ void Explode(int ex, int ey, int phase, int mode)
 
   ExplodePhase[x][y] = (phase < last_phase ? phase + 1 : 0);
 
+#ifdef DEBUG
+
+  /* activate this even in non-DEBUG version until cause for crash in
+     getGraphicAnimationFrame() (see below) is found and eliminated */
+#endif
+#if 1
+
+  if (GfxElement[x][y] == EL_UNDEFINED)
+  {
+    printf("Explode(): x = %d, y = %d: GfxElement == EL_UNDEFINED\n", x, y);
+    printf("Explode(): This should never happen!\n");
+
+    GfxElement[x][y] = EL_EMPTY;
+  }
+#endif
+
   if (phase == first_phase_after_start)
   {
     int element = Store2[x][y];
@@ -5364,10 +5380,13 @@ static void ChangeElementNowExt(int x, int y, int target_element)
     RelocatePlayer(x, y, target_element);
 }
 
-static void ChangeElementNow(int x, int y, int element, int page)
+static boolean ChangeElementNow(int x, int y, int element, int page)
 {
   struct ElementChangeInfo *change = &element_info[element].change_page[page];
 
+  if (Changed[x][y])           /* do not change already changed elements */
+    return FALSE;
+
   Changed[x][y] = TRUE;                /* no more changes in this frame */
 
   CheckTriggeredElementChange(x, y, Feld[x][y], CE_OTHER_IS_CHANGING);
@@ -5375,7 +5394,8 @@ static void ChangeElementNow(int x, int y, int element, int page)
   if (change->explode)
   {
     Bang(x, y);
-    return;
+
+    return TRUE;
   }
 
   if (change->use_content)
@@ -5433,7 +5453,7 @@ static void ChangeElementNow(int x, int y, int element, int page)
 
       if (change->only_complete && change->use_random_change &&
          RND(100) < change->random)
-       return;
+       return FALSE;
 
       for (yy = 0; yy < 3; yy++) for(xx = 0; xx < 3 ; xx++)
       {
@@ -5466,6 +5486,8 @@ static void ChangeElementNow(int x, int y, int element, int page)
 
     PlaySoundLevelElementAction(x, y, element, ACTION_CHANGING);
   }
+
+  return TRUE;
 }
 
 static void ChangeElement(int x, int y, int page)
@@ -5506,10 +5528,11 @@ static void ChangeElement(int x, int y, int page)
       return;
     }
 
-    ChangeElementNow(x, y, element, page);
-
-    if (change->post_change_function)
-      change->post_change_function(x, y);
+    if (ChangeElementNow(x, y, element, page))
+    {
+      if (change->post_change_function)
+       change->post_change_function(x, y);
+    }
   }
 }
 
@@ -5566,8 +5589,10 @@ static boolean CheckTriggeredElementChange(int lx, int ly, int trigger_element,
       if (x == lx && y == ly)  /* do not change trigger element itself */
        continue;
 
+#if 0
       if (Changed[x][y])       /* do not change already changed elements */
        continue;
+#endif
 
       if (Feld[x][y] == element)
       {
index 76be4a459f3c0445c4b6fddd3f36ad1b7ca64a78..69c1c26c8fc7c81f4305dbdddb81b49d27d51402 100644 (file)
 #define MAX_ENVELOPE_YSIZE     20
 #define MAX_ENVELOPE_TEXT_LEN  (MAX_ENVELOPE_XSIZE * MAX_ENVELOPE_YSIZE)
 #define MIN_CHANGE_PAGES       1
-#define MAX_CHANGE_PAGES       10
+#define MAX_CHANGE_PAGES       16
 
 /* values for elements with content */
 #define MIN_ELEMENT_CONTENTS   1
 
 #define PROGRAM_VERSION_MAJOR  3
 #define PROGRAM_VERSION_MINOR  0
-#define PROGRAM_VERSION_PATCH  3
+#define PROGRAM_VERSION_PATCH  4
 #define PROGRAM_VERSION_RELEASE        0
-#define PROGRAM_VERSION_STRING "3.0.3"
+#define PROGRAM_VERSION_STRING "3.0.4"
 
 #define PROGRAM_TITLE_STRING   "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING  "Holger Schemel"
index 0965eb9efcfe60aec3c14658bb3b7e28df351cfa..c119ff7c1eef22da85ce44d37fe4fb76cc8dfeae 100644 (file)
@@ -1812,7 +1812,6 @@ static struct TokenInfo setup_info_editor[] =
   { TYPE_SWITCH,       &setup.editor.el_chars,         "Characters:"   },
   { TYPE_SWITCH,       &setup.editor.el_custom,        "Custom:"       },
   { TYPE_SWITCH,       &setup.editor.el_custom_more,   "More Custom:"  },
-  { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_SWITCH,       &setup.editor.el_headlines,     "Headlines:"    },
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
index 1f0856dcc7b8c3949e8c9b737f9a08ab1602ec15..f8f37ea0c7d3e6e08d8098674b850950d9806610 100644 (file)
@@ -35,6 +35,7 @@
 static void UnmapToolButtons();
 static void HandleToolButtons(struct GadgetInfo *);
 static int el_act_dir2crm(int, int, int);
+static int el_act2crm(int, int);
 
 static struct GadgetInfo *tool_gadget[NUM_TOOL_BUTTONS];
 static int request_gadget_id = -1;
@@ -1217,6 +1218,12 @@ static void DrawLevelFieldCrumbledSandExt(int x, int y, int graphic, int frame)
     { 0, +1 }
   };
 
+#if 0
+  if (x == 0 && y == 7)
+    printf("::: %d, %d [%d]\n", GfxElement[x][y], Feld[x][y],
+          crumbled_border_size);
+#endif
+
   if (!IN_LEV_FIELD(x, y))
     return;
 
@@ -1272,7 +1279,9 @@ static void DrawLevelFieldCrumbledSandExt(int x, int y, int graphic, int frame)
   }
   else         /* crumble neighbour fields */
   {
+#if 0
     getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y);
+#endif
 
     for(i=0; i<4; i++)
     {
@@ -1287,6 +1296,12 @@ static void DrawLevelFieldCrumbledSandExt(int x, int y, int graphic, int frame)
          IS_MOVING(xx, yy))
        continue;
 
+#if 1
+      graphic = el_act2crm(Feld[xx][yy], ACTION_DEFAULT);
+
+      getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y);
+#endif
+
       if (i == 1 || i == 2)
       {
        width = crumbled_border_size;
@@ -1312,7 +1327,18 @@ static void DrawLevelFieldCrumbledSandExt(int x, int y, int graphic, int frame)
 
 void DrawLevelFieldCrumbledSand(int x, int y)
 {
+#if 1
+  int graphic;
+
+  if (!IN_LEV_FIELD(x, y))
+    return;
+
+  graphic = el_act2crm(Feld[x][y], ACTION_DEFAULT);
+
+  DrawLevelFieldCrumbledSandExt(x, y, graphic, 0);
+#else
   DrawLevelFieldCrumbledSandExt(x, y, IMG_SAND_CRUMBLED, 0);
+#endif
 }
 
 void DrawLevelFieldCrumbledSandDigging(int x, int y, int direction,
@@ -2780,6 +2806,13 @@ int el_act2img(int element, int action)
   return element_info[element].graphic[action];
 }
 
+int el_act2crm(int element, int action)
+{
+  element = GFX_ELEMENT(element);
+
+  return element_info[element].crumbled[action];
+}
+
 int el_dir2img(int element, int direction)
 {
   element = GFX_ELEMENT(element);