rnd-20070306-1-src
authorHolger Schemel <info@artsoft.org>
Tue, 6 Mar 2007 01:29:21 +0000 (02:29 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:54:42 +0000 (10:54 +0200)
src/conftime.h
src/editor.c
src/game.c
src/game.h
src/init.c
src/init.h
src/libgame/misc.c

index ef368f3cc2fd6d20a12329020177d748f1b3d21f..c39bf07062f8b818e1a0395be5274311018e796b 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2007-03-05 22:24"
+#define COMPILE_DATE_STRING "2007-03-06 02:28"
index f16d5aa39f8755591ea1635e77f5a99f90bf3919..9f2ec7853cce559b5dd2b0144a6a3a3595e9eb8e 100644 (file)
@@ -9091,6 +9091,26 @@ static void SetElementIntelliDraw(int x, int y, int new_element,
     new_element = (nr == 0 ? EL_SP_HARDWARE_GREEN :
                   nr == 1 ? EL_SP_HARDWARE_BLUE : EL_SP_HARDWARE_RED);
   }
+  else if (IS_GROUP_ELEMENT(new_element))
+  {
+    boolean connected_drawing = FALSE;
+    int i;
+
+    for (i = 0; i < NUM_DIRECTIONS; i++)
+    {
+      int xx = x + xy[i][0];
+      int yy = y + xy[i][1];
+
+      if (last_x == xx && last_y == yy && IN_LEV_FIELD(last_x, last_y) &&
+         IS_IN_GROUP_EL(IntelliDrawBuffer[last_x][last_y], new_element))
+       connected_drawing = TRUE;
+    }
+
+    if (!connected_drawing)
+      ResolveGroupElement(new_element);
+
+    new_element = GetElementFromGroupElement(new_element);
+  }
   else if (IS_BELT_SWITCH(old_element))
   {
     int belt_nr = getBeltNrFromBeltSwitchElement(old_element);
@@ -9862,6 +9882,10 @@ static void RandomPlacement(int new_element)
   int num_percentage, num_elements;
   int x, y;
 
+#if 1
+  ResetIntelliDraw();
+#endif
+
   /* determine number of free positions for randomly placing the new element */
   for (x = 0; x < lev_fieldx; x++) for (y = 0; y < lev_fieldy; y++)
   {
@@ -9885,7 +9909,11 @@ static void RandomPlacement(int new_element)
     for (x = 0; x < lev_fieldx; x++)
       for (y = 0; y < lev_fieldy; y++)
        if (free_position[x][y])
+#if 1
+         SetElement(x, y, new_element);
+#else
          Feld[x][y] = new_element;
+#endif
   }
   else
   {
@@ -9898,7 +9926,11 @@ static void RandomPlacement(int new_element)
       if (free_position[x][y])
       {
        free_position[x][y] = FALSE;
+#if 1
+       SetElement(x, y, new_element);
+#else
        Feld[x][y] = new_element;
+#endif
        num_elements--;
       }
     }
index a52780cbc7e63762ac4fc04c86c170a9984224cf..104b6e4dbc164dc11b213b1feae0ef2b2821c91b 100644 (file)
@@ -942,7 +942,7 @@ void GetPlayerConfig()
   InitJoysticks();
 }
 
-static int get_element_from_group_element(int element)
+int GetElementFromGroupElement(int element)
 {
   if (IS_GROUP_ELEMENT(element))
   {
@@ -1240,7 +1240,7 @@ static void InitField(int x, int y, boolean init_game)
       }
       else if (IS_GROUP_ELEMENT(element))
       {
-       Feld[x][y] = get_element_from_group_element(element);
+       Feld[x][y] = GetElementFromGroupElement(element);
 
        InitField(x, y, init_game);
       }
@@ -8732,7 +8732,7 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page)
 static void CreateFieldExt(int x, int y, int element, boolean is_change)
 {
   int old_element = Feld[x][y];
-  int new_element = get_element_from_group_element(element);
+  int new_element = GetElementFromGroupElement(element);
   int previous_move_direction = MovDir[x][y];
 #if USE_NEW_CUSTOM_VALUE
   int last_ce_value = CustomValue[x][y];
@@ -9064,12 +9064,13 @@ static void HandleElementChange(int x, int y, int page)
 
     if (change->can_change)
     {
-#if 0
+#if 1
       /* !!! not clear why graphic animation should be reset at all here !!! */
+      /* !!! UPDATE: but is needed for correct Snake Bite tail animation !!! */
 #if USE_GFX_RESET_WHEN_NOT_MOVING
       /* when a custom element is about to change (for example by change delay),
         do not reset graphic animation when the custom element is moving */
-      if (IS_MOVING(x, y))
+      if (!IS_MOVING(x, y))
 #endif
       {
        ResetGfxAnimation(x, y);
@@ -10782,14 +10783,19 @@ void ScrollLevel(int dx, int dy)
   int i, x, y;
 #endif
 
+#if 0
+  /* !!! THIS IS APPARENTLY WRONG FOR PLAYER RELOCATION !!! */
   /* only horizontal XOR vertical scroll direction allowed */
   if ((dx == 0 && dy == 0) || (dx != 0 && dy != 0))
     return;
+#endif
 
 #if 1
   if (bitmap_db_field2 == NULL)
     bitmap_db_field2 = CreateBitmap(FXSIZE, FYSIZE, DEFAULT_DEPTH);
 
+  /* needed when blitting directly to same bitmap -- should not be needed with
+     recent SDL libraries, but apparently does not work in 1.2.11 directly */
   BlitBitmap(drawto_field, bitmap_db_field2,
             FX + TILEX * (dx == -1) - softscroll_offset,
             FY + TILEY * (dy == -1) - softscroll_offset,
@@ -10808,6 +10814,7 @@ void ScrollLevel(int dx, int dy)
 #else
 
 #if 1
+  /* !!! DOES NOT WORK FOR DIAGONAL PLAYER RELOCATION !!! */
   int xsize = (BX2 - BX1 + 1);
   int ysize = (BY2 - BY1 + 1);
   int start = (dx != 0 ? (dx == -1 ? BX1 : BX2) : (dy == -1 ? BY1 : BY2));
index 92ab3451d4a3d65fe75d15d5bf95d41d90bda541..a18b3f0cb56df50a12bda57a4b10044d68e393bf 100644 (file)
@@ -229,6 +229,7 @@ void DEBUG_SetMaximumDynamite();
 #endif
 
 void GetPlayerConfig(void);
+int GetElementFromGroupElement(int);
 
 void DrawGameValue_Time(int);
 void DrawGameDoorValues(void);
index 4e715dff4ab4c80abc3e19cc4cfc1cf35d6c9ab7..9b9497f4172af42590ced741f1a9cc589cf1a90b 100644 (file)
@@ -1965,7 +1965,7 @@ boolean getBitfieldProperty(int *bitfield, int property_bit_nr, int element)
   return FALSE;
 }
 
-static void resolve_group_element(int group_element, int recursion_depth)
+static void ResolveGroupElementExt(int group_element, int recursion_depth)
 {
   static int group_nr;
   static struct ElementGroupInfo *group;
@@ -1989,10 +1989,13 @@ static void resolve_group_element(int group_element, int recursion_depth)
   if (recursion_depth == 0)                    /* initialization */
   {
     group = actual_group;
-    group_nr = group_element - EL_GROUP_START;
+    group_nr = GROUP_NR(group_element);
 
     group->num_elements_resolved = 0;
     group->choice_pos = 0;
+
+    for (i = 0; i < MAX_NUM_ELEMENTS; i++)
+      element_info[i].in_group[group_nr] = FALSE;
   }
 
   for (i = 0; i < actual_group->num_elements; i++)
@@ -2003,7 +2006,7 @@ static void resolve_group_element(int group_element, int recursion_depth)
       break;
 
     if (IS_GROUP_ELEMENT(element))
-      resolve_group_element(element, recursion_depth + 1);
+      ResolveGroupElementExt(element, recursion_depth + 1);
     else
     {
       group->element_resolved[group->num_elements_resolved++] = element;
@@ -2012,6 +2015,11 @@ static void resolve_group_element(int group_element, int recursion_depth)
   }
 }
 
+void ResolveGroupElement(int group_element)
+{
+  ResolveGroupElementExt(group_element, 0);
+}
+
 void InitElementPropertiesStatic()
 {
   static int ep_diggable[] =
@@ -4023,14 +4031,9 @@ void InitElementPropertiesEngine(int engine_version)
      property (which means that conditional property changes must be set to
      a reliable default value before) */
 
-  /* ---------- recursively resolve group elements ------------------------- */
-
-  for (i = 0; i < MAX_NUM_ELEMENTS; i++)
-    for (j = 0; j < NUM_GROUP_ELEMENTS; j++)
-      element_info[i].in_group[j] = FALSE;
-
+  /* resolve group elements */
   for (i = 0; i < NUM_GROUP_ELEMENTS; i++)
-    resolve_group_element(EL_GROUP_START + i, 0);
+    ResolveGroupElement(EL_GROUP_START + i);
 
   /* set all special, combined or engine dependent element properties */
   for (i = 0; i < MAX_NUM_ELEMENTS; i++)
index 165c2a787b3c86345ee05c3cfb026376b49d9ad5..3df39d265cb852d02c3d5f2325124f7c1ee75970 100644 (file)
@@ -32,6 +32,7 @@
 void setBitfieldProperty(int *, int, int, boolean);
 boolean getBitfieldProperty(int *, int, int);
 
+void ResolveGroupElement(int);
 void InitElementPropertiesStatic(void);
 void InitElementPropertiesEngine(int);
 void InitElementPropertiesAfterLoading(int);
index e0e8a0ffb30c0e915a64d1fc6ebc339d49032ef3..eb3e7a0f6ba58faa9b0b105fe46edcf9d3edcf1f 100644 (file)
@@ -2806,7 +2806,7 @@ void NotifyUserAboutErrorFile()
 #if DEBUG
 
 #define DEBUG_NUM_TIMESTAMPS           3
-#define DEBUG_TIME_IN_MICROSECONDS     1
+#define DEBUG_TIME_IN_MICROSECONDS     0
 
 #if DEBUG_TIME_IN_MICROSECONDS
 static double Counter_Microseconds()