rnd-20030419-1-src
authorHolger Schemel <info@artsoft.org>
Sat, 19 Apr 2003 09:38:58 +0000 (11:38 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:41:20 +0000 (10:41 +0200)
src/conftime.h
src/game.c
src/main.c
src/main.h
src/tools.c

index 5f436e4719bfe03efa2963f20ca8c0136a18f57a..373f09480332dd25df61310f3a94cf95fb014892 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2003-04-18 23:00]"
+#define COMPILE_DATE_STRING "[2003-04-19 11:38]"
index 1691c6924bc816d43a101c2c0df6b28d87bd058c..aad2757881fabbc437990a08c68ab047d40e9bcb 100644 (file)
@@ -723,7 +723,7 @@ void InitGame()
     {
       Feld[x][y] = Ur[x][y];
       MovPos[x][y] = MovDir[x][y] = MovDelay[x][y] = 0;
-      Store[x][y] = Store2[x][y] = StorePlayer[x][y] = 0;
+      Store[x][y] = Store2[x][y] = StorePlayer[x][y] = Back[x][y] = 0;
       AmoebaNr[x][y] = 0;
       JustStopped[x][y] = 0;
       Stop[x][y] = FALSE;
@@ -1433,13 +1433,18 @@ void DrawDynamite(int x, int y)
   if (!IN_SCR_FIELD(sx, sy) || IS_PLAYER(x, y))
     return;
 
-  if (Store[x][y])
+  if (IS_WALKABLE_INSIDE(Back[x][y]))
+    return;
+
+  if (Back[x][y])
+    DrawGraphic(sx, sy, el2img(Back[x][y]), 0);
+  else if (Store[x][y])
     DrawGraphic(sx, sy, el2img(Store[x][y]), 0);
 
   frame = getGraphicAnimationFrame(graphic, GfxFrame[x][y]);
 
 #if 1
-  if (Store[x][y])
+  if (Back[x][y] || Store[x][y])
     DrawGraphicThruMask(sx, sy, graphic, frame);
   else
     DrawGraphic(sx, sy, graphic, frame);
@@ -1500,6 +1505,10 @@ void Explode(int ex, int ey, int phase, int mode)
   {
     int center_element = Feld[ex][ey];
 
+    /* remove things displayed in background while burnig dynamite */
+    if (!IS_INDESTRUCTIBLE(Back[x][y]))
+      Back[x][y] = 0;
+
     if (IS_MOVING(ex, ey) || IS_BLOCKED(ex, ey))
     {
       /* put moving element to center field (and let it explode there) */
@@ -1548,17 +1557,24 @@ void Explode(int ex, int ey, int phase, int mode)
        continue;
       }
 
+#if 1
+      /* save walkable background elements while explosion on same tile */
+      if (IS_INDESTRUCTIBLE(element))
+       Back[x][y] = element;
+#endif
+
+      /* ignite explodable elements reached by other explosion */
       if (element == EL_EXPLOSION)
        element = Store2[x][y];
 
-#if 1
-      if (IS_INDESTRUCTIBLE(Store[x][y]))      /* hard element under bomb */
-       element = Store[x][y];
+#if 0
+      else if (IS_INDESTRUCTIBLE(Store2[x][y]))        /* hard element under bomb */
+       element = Store2[x][y];
 #endif
 
 #if 0
-      if (!IS_INDESTRUCTIBLE(Store[x][y]) != !IS_PFORTE(Store[x][y]))
-       printf("\n::: %d\n", Store[x][y]);
+      else if (IS_INDESTRUCTIBLE(Store[x][y])) /* hard element under bomb */
+       element = Store[x][y];
 #endif
 
       if (IS_PLAYER(ex, ey) && !PLAYER_PROTECTED(ex, ey))
@@ -1583,6 +1599,18 @@ void Explode(int ex, int ey, int phase, int mode)
        if (game.emulation == EMU_SUPAPLEX)
          Store[x][y] = EL_EMPTY;
       }
+#if 0
+      else if (IS_INDESTRUCTIBLE(Store[x][y]))
+       ;
+#endif
+#if 0
+      else if (IS_INDESTRUCTIBLE(element))
+       Store[x][y] = element;
+#endif
+#if 0
+      else if (IS_INDESTRUCTIBLE(element) && IS_ACCESSIBLE(element))
+       Store[x][y] = element;
+#endif
       else if (center_element == EL_MOLE)
        Store[x][y] = EL_EMERALD_RED;
       else if (center_element == EL_PENGUIN)
@@ -1614,13 +1642,20 @@ void Explode(int ex, int ey, int phase, int mode)
       else if (element == EL_WALL_CRYSTAL)
        Store[x][y] = EL_CRYSTAL;
 #if 1
+#if 0
+#if 0
       else if (IS_INDESTRUCTIBLE(element) && IS_ACCESSIBLE(element))
        Store[x][y] = element;
+#else
+      else if (IS_INDESTRUCTIBLE(element))
+       Store[x][y] = element;
+#endif
+#endif
       else
        Store[x][y] = EL_EMPTY;
 #else
 
-#if 1
+#if 0
       else if (IS_PFORTE(element))
        Store[x][y] = element;
       else
@@ -1700,6 +1735,13 @@ void Explode(int ex, int ey, int phase, int mode)
 
     element = Feld[x][y] = Store[x][y];
     Store[x][y] = Store2[x][y] = 0;
+
+#if 1
+    if (Back[x][y] && IS_INDESTRUCTIBLE(Back[x][y]))
+      element = Feld[x][y] = Back[x][y];
+    Back[x][y] = 0;
+#endif
+
     MovDir[x][y] = MovPos[x][y] = MovDelay[x][y] = 0;
     InitField(x, y, FALSE);
     if (CAN_MOVE(element) || COULD_MOVE(element))
@@ -1721,17 +1763,17 @@ void Explode(int ex, int ey, int phase, int mode)
       DrawLevelFieldCrumbledSand(x, y);
 
 #if 1
-    if (IS_WALKABLE_OVER(Store[x][y]))
+    if (IS_WALKABLE_OVER(Back[x][y]))
     {
-      DrawLevelElement(x, y, Store[x][y]);
+      DrawLevelElement(x, y, Back[x][y]);
       DrawGraphicThruMask(SCREENX(x), SCREENY(y), graphic, frame);
     }
-    else if (IS_WALKABLE_UNDER(Store[x][y]))
+    else if (IS_WALKABLE_UNDER(Back[x][y]))
     {
       DrawGraphic(SCREENX(x), SCREENY(y), graphic, frame);
-      DrawLevelElementThruMask(x, y, Store[x][y]);
+      DrawLevelElementThruMask(x, y, Back[x][y]);
     }
-    else
+    else if (!IS_WALKABLE_INSIDE(Back[x][y]))
       DrawGraphic(SCREENX(x), SCREENY(y), graphic, frame);
 #else
     if (IS_PFORTE(Store[x][y]))
@@ -6528,7 +6570,13 @@ boolean PlaceBomb(struct PlayerInfo *player)
     return FALSE;
 
   if (element != EL_EMPTY)
+  {
+#if 0
     Store[jx][jy] = element;
+#else
+    Back[jx][jy] = element;
+#endif
+  }
 
   MovDelay[jx][jy] = 96;
 
index dcd6301f1ba7c934f82e3d6ed3c51a71287f7573..836b436fd9b30bc5a2e4adc2f016e42aa081437b 100644 (file)
@@ -47,6 +47,7 @@ short                 MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+short                  Back[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 boolean                        Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
index 6448eb4bed7a296376e6c3549f447d6222485936..796179bce97936ac065269bb96a731c05996dd9a 100644 (file)
@@ -1203,6 +1203,7 @@ extern short                      MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short                   Back[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern boolean                 Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
index ab66bdf21921c5f72f565bc67fea60ec5f2cafbb..5bba1c107785e4bfbb5dc8dc1c70e03ca7037f4a 100644 (file)
@@ -575,9 +575,9 @@ void DrawPlayer(struct PlayerInfo *player)
 
   if (player_is_moving)
   {
-    if (Store[last_jx][last_jy] && IS_DRAWABLE(last_element))
+    if (Back[last_jx][last_jy] && IS_DRAWABLE(last_element))
     {
-      DrawLevelElement(last_jx, last_jy, Store[last_jx][last_jy]);
+      DrawLevelElement(last_jx, last_jy, Back[last_jx][last_jy]);
 
       if (last_element == EL_DYNAMITE_ACTIVE ||
          last_element == EL_SP_DISK_RED_ACTIVE)
@@ -615,8 +615,8 @@ void DrawPlayer(struct PlayerInfo *player)
   /* draw things behind the player, if needed                                */
   /* ----------------------------------------------------------------------- */
 
-  if (Store[jx][jy])
-    DrawLevelElement(jx, jy, Store[jx][jy]);
+  if (Back[jx][jy])
+    DrawLevelElement(jx, jy, Back[jx][jy]);
   else if (IS_ACTIVE_BOMB(element))
     DrawLevelElement(jx, jy, EL_EMPTY);
   else