rnd-20060402-2-src
authorHolger Schemel <info@artsoft.org>
Sun, 2 Apr 2006 19:46:05 +0000 (21:46 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:51:24 +0000 (10:51 +0200)
* fixed bug when creating GE with walkable element under the player

ChangeLog
src/conftime.h
src/game.c
src/game_em/synchro_1.c

index a57b005d77d2f72fc2636c497ee618d198f2ca2c..33a18543d4d648ab0adc76c1e5a796ce070520d9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,6 @@
 2006-04-02
        * fixed handling of over-large selectboxes (less error-prone now)
+       * fixed bug when creating GE with walkable element under the player
 
 2006-04-01
        * added use of "Insert" and "Delete" keys to navigate element list in
index ad07cdb08e05c8abc4297319c52998415d028bf8..dfbc5f2c584997825d330a24c9a6c4e48bf3a69d 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2006-04-02 12:38]"
+#define COMPILE_DATE_STRING "[2006-04-02 20:00]"
index 9aab37fc95a4a740b86b9079c833d87707cf37c7..4f3b21efbe945297eb8dda2778220deadcc5e6cc 100644 (file)
@@ -866,6 +866,32 @@ static int getBeltDirFromBeltSwitchElement(int element)
   return belt_move_dir[belt_dir_nr];
 }
 
+static int get_element_from_group_element(int element)
+{
+  if (IS_GROUP_ELEMENT(element))
+  {
+    struct ElementGroupInfo *group = element_info[element].group;
+    int last_anim_random_frame = gfx.anim_random_frame;
+    int element_pos;
+
+    if (group->choice_mode == ANIM_RANDOM)
+      gfx.anim_random_frame = RND(group->num_elements_resolved);
+
+    element_pos = getAnimationFrame(group->num_elements_resolved, 1,
+                                   group->choice_mode, 0,
+                                   group->choice_pos);
+
+    if (group->choice_mode == ANIM_RANDOM)
+      gfx.anim_random_frame = last_anim_random_frame;
+
+    group->choice_pos++;
+
+    element = group->element_resolved[element_pos];
+  }
+
+  return element;
+}
+
 static void InitPlayerField(int x, int y, int element, boolean init_game)
 {
   if (element == EL_SP_MURPHY)
@@ -1128,6 +1154,11 @@ static void InitField(int x, int y, boolean init_game)
 #endif
       else if (IS_GROUP_ELEMENT(element))
       {
+#if 1
+       Feld[x][y] = get_element_from_group_element(element);
+
+       InitField(x, y, init_game);
+#else
        struct ElementGroupInfo *group = element_info[element].group;
        int last_anim_random_frame = gfx.anim_random_frame;
        int element_pos;
@@ -1147,6 +1178,7 @@ static void InitField(int x, int y, boolean init_game)
        Feld[x][y] = group->element_resolved[element_pos];
 
        InitField(x, y, init_game);
+#endif
       }
       break;
   }
@@ -8250,22 +8282,26 @@ 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 previous_move_direction = MovDir[x][y];
 #if USE_NEW_CUSTOM_VALUE
   int last_ce_value = CustomValue[x][y];
 #endif
-  boolean add_player = (ELEM_IS_PLAYER(element) &&
-                       IS_WALKABLE(Feld[x][y]));
+  boolean add_player = (ELEM_IS_PLAYER(new_element) &&
+                       IS_WALKABLE(old_element));
 
+#if 0
   /* check if element under player changes from accessible to unaccessible
      (needed for special case of dropping element which then changes) */
   if (IS_PLAYER(x, y) && !PLAYER_EXPLOSION_PROTECTED(x, y) &&
-      IS_ACCESSIBLE(Feld[x][y]) && !IS_ACCESSIBLE(element))
+      IS_ACCESSIBLE(old_element) && !IS_ACCESSIBLE(new_element))
   {
     Bang(x, y);
 
     return;
   }
+#endif
 
   if (!add_player)
   {
@@ -8274,30 +8310,44 @@ static void CreateFieldExt(int x, int y, int element, boolean is_change)
     else
       RemoveField(x, y);
 
-    Feld[x][y] = element;
+    Feld[x][y] = new_element;
 
     ResetGfxAnimation(x, y);
     ResetRandomAnimationValue(x, y);
 
-    if (element_info[Feld[x][y]].move_direction_initial == MV_START_PREVIOUS)
+    if (element_info[new_element].move_direction_initial == MV_START_PREVIOUS)
       MovDir[x][y] = previous_move_direction;
 
 #if USE_NEW_CUSTOM_VALUE
-    if (element_info[Feld[x][y]].use_last_ce_value)
+    if (element_info[new_element].use_last_ce_value)
       CustomValue[x][y] = last_ce_value;
 #endif
 
     InitField_WithBug1(x, y, FALSE);
 
+    new_element = Feld[x][y];  /* element may have changed */
+
     DrawLevelField(x, y);
 
-    if (GFX_CRUMBLED(Feld[x][y]))
+    if (GFX_CRUMBLED(new_element))
       DrawLevelFieldCrumbledSandNeighbours(x, y);
   }
 
+#if 1
+  /* check if element under player changes from accessible to unaccessible
+     (needed for special case of dropping element which then changes) */
+  if (IS_PLAYER(x, y) && !PLAYER_EXPLOSION_PROTECTED(x, y) &&
+      IS_ACCESSIBLE(old_element) && !IS_ACCESSIBLE(new_element))
+  {
+    Bang(x, y);
+
+    return;
+  }
+#endif
+
   /* "ChangeCount" not set yet to allow "entered by player" change one time */
-  if (ELEM_IS_PLAYER(element))
-    RelocatePlayer(x, y, element);
+  if (ELEM_IS_PLAYER(new_element))
+    RelocatePlayer(x, y, new_element);
 
   if (is_change)
     ChangeCount[x][y]++;       /* count number of changes in the same frame */
index b45330149723e044c168e83d1ed99bf46bbdbe85..5f0929875b67b59ca711d4c89839cfd2da4eec6d 100644 (file)
@@ -12,6 +12,8 @@
 extern int centered_player_nr;
 #endif
 
+#define USE_CHANGED_ACID_STUFF         1
+
 extern boolean checkIfAllPlayersFitToScreen();
 
 static void check_player(struct PLAYER *);
@@ -421,7 +423,7 @@ static void kill_player(struct PLAYER *ply)
 
   switch(Cave[y][x])
   {
-#if 1
+#if USE_CHANGED_ACID_STUFF
     case Xacid_1:
     case Xacid_2:
     case Xacid_3:
@@ -684,7 +686,7 @@ static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
        ply->y = y;
        break;
 
-#if 1
+#if USE_CHANGED_ACID_STUFF
       case Xacid_1:
       case Xacid_2:
       case Xacid_3:
@@ -693,12 +695,12 @@ static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
       case Xacid_6:
       case Xacid_7:
       case Xacid_8:
-#endif
        if (Cave[y-1][x+1] == Xblank)
          Cave[y-1][x+1] = Yacid_splash_eB;
        if (Cave[y-1][x-1] == Xblank)
          Cave[y-1][x-1] = Yacid_splash_wB;
        play_element_sound(x, y, SAMPLE_acid, Xacid_1);
+#endif
 
       case Xboom_android:
       case Xboom_1:
@@ -718,7 +720,8 @@ static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
       case Xtank_goe:
       case Xtank_gos:
       case Xtank_gow:
-#if 0
+
+#if !USE_CHANGED_ACID_STUFF
       case Xacid_1:
       case Xacid_2:
       case Xacid_3: