rnd-20030926-1-src
[rocksndiamonds.git] / src / game.c
index 05325ad7ce0fbce0d4fc53dc836f084596552e29..17eaef58990f47d39e4de9920cbbdeedd94b64a0 100644 (file)
@@ -658,10 +658,13 @@ static void InitField(int x, int y, boolean init_game)
       MovDir[x][y] = 1 << RND(4);
       break;
 
+#if 0
     case EL_SP_EMPTY:
       Feld[x][y] = EL_EMPTY;
       break;
+#endif
 
+#if 0
     case EL_EM_KEY_1_FILE:
       Feld[x][y] = EL_EM_KEY_1;
       break;
@@ -674,6 +677,7 @@ static void InitField(int x, int y, boolean init_game)
     case EL_EM_KEY_4_FILE:
       Feld[x][y] = EL_EM_KEY_4;
       break;
+#endif
 
     case EL_CONVEYOR_BELT_1_SWITCH_LEFT:
     case EL_CONVEYOR_BELT_1_SWITCH_MIDDLE:
@@ -802,7 +806,7 @@ static void InitGameEngine()
     ei->change_events = CE_BITMASK_DEFAULT;
     for (j=0; j < NUM_CHANGE_EVENTS; j++)
     {
-      ei->event_page_num[j] = 0;
+      ei->event_page_nr[j] = 0;
       ei->event_page[j] = &ei->change_page[0];
     }
   }
@@ -841,7 +845,7 @@ static void InitGameEngine()
            !(ei->change_events & CH_EVENT_BIT(k)))
        {
          ei->change_events |= CH_EVENT_BIT(k);
-         ei->event_page_num[k] = j;
+         ei->event_page_nr[k] = j;
          ei->event_page[k] = &ei->change_page[j];
        }
       }
@@ -1024,7 +1028,7 @@ void InitGame()
     player->is_digging = FALSE;
     player->is_collecting = FALSE;
 
-    player->show_envelope = FALSE;
+    player->show_envelope = 0;
 
     player->move_delay       = game.initial_move_delay;
     player->move_delay_value = game.initial_move_delay_value;
@@ -1081,6 +1085,8 @@ void InitGame()
   game.balloon_dir = MV_NO_MOVING;
   game.explosions_delayed = TRUE;
 
+  game.envelope_active = FALSE;
+
   for (i=0; i<4; i++)
   {
     game.belt_dir[i] = MV_NO_MOVING;
@@ -2317,10 +2323,10 @@ void Explode(int ex, int ey, int phase, int mode)
 
   if (GfxElement[x][y] == EL_UNDEFINED)
   {
-    printf("\n\n\n");
+    printf("\n\n");
     printf("Explode(): x = %d, y = %d: GfxElement == EL_UNDEFINED\n", x, y);
     printf("Explode(): This should never happen!\n");
-    printf("\n\n\n");
+    printf("\n\n");
 
     GfxElement[x][y] = EL_EMPTY;
   }
@@ -2373,7 +2379,7 @@ void Explode(int ex, int ey, int phase, int mode)
 
     TestIfElementTouchesCustomElement(x, y);
 
-    if (CAN_BE_CRUMBLED(element))
+    if (GFX_CRUMBLED(element))
       DrawLevelFieldCrumbledSandNeighbours(x, y);
 
     if (IS_PLAYER(x, y) && !PLAYERINFO(x,y)->present)
@@ -3824,6 +3830,15 @@ void StartMoving(int x, int y)
 #endif
     }
 #if 1
+
+#if 0
+    /* TEST: bug where player gets not killed by falling rock ... */
+    else if (CAN_SMASH(element) &&
+            (Feld[x][y + 1] == EL_BLOCKED ||
+             IS_PLAYER(x, y + 1)) &&
+            JustStopped[x][y] && !Pushed[x][y + 1])
+
+#else
 #if 1
     else if (game.engine_version < RELEASE_IDENT(2,2,0,7) &&
             CAN_SMASH(element) && Feld[x][y + 1] == EL_BLOCKED &&
@@ -3832,6 +3847,8 @@ void StartMoving(int x, int y)
     else if (CAN_SMASH(element) && Feld[x][y + 1] == EL_BLOCKED &&
             JustStopped[x][y])
 #endif
+#endif
+
     {
       /* calling "Impact()" here is not only completely unneccessary
         (because it already gets called from "ContinueMoving()" in
@@ -5409,7 +5426,7 @@ static void ChangeElementNowExt(int x, int y, int target_element)
 
   DrawLevelField(x, y);
 
-  if (CAN_BE_CRUMBLED(Feld[x][y]))
+  if (GFX_CRUMBLED(Feld[x][y]))
     DrawLevelFieldCrumbledSandNeighbours(x, y);
 
   TestIfBadThingTouchesHero(x, y);
@@ -5545,6 +5562,19 @@ static void ChangeElement(int x, int y, int page)
   int element = MovingOrBlocked2Element(x, y);
   struct ElementChangeInfo *change = &element_info[element].change_page[page];
 
+#if 0
+#ifdef DEBUG
+  if (!CAN_CHANGE(element))
+  {
+    printf("\n\n");
+    printf("ChangeElement(): %d,%d: element = %d ('%s')\n",
+          x, y, element, element_info[element].token_name);
+    printf("ChangeElement(): This should never happen!\n");
+    printf("\n\n");
+  }
+#endif
+#endif
+
   if (ChangeDelay[x][y] == 0)          /* initialize element change */
   {
     ChangeDelay[x][y] = (    change->delay_fixed  * change->delay_frames +
@@ -5663,7 +5693,7 @@ static boolean CheckElementSideChange(int x, int y, int element, int side,
   }
 
   if (page < 0)
-    page = element_info[element].event_page_num[trigger_event];
+    page = element_info[element].event_page_nr[trigger_event];
 
   if (!(element_info[element].change_page[page].sides & side))
     return FALSE;
@@ -5946,7 +5976,7 @@ void GameActions()
     /* this may take place after moving, so 'element' may have changed */
     if (IS_CHANGING(x, y))
     {
-      ChangeElement(x, y, element_info[element].event_page_num[CE_DELAY]);
+      ChangeElement(x, y, element_info[element].event_page_nr[CE_DELAY]);
       element = Feld[x][y];
       graphic = el_act_dir2img(element, GfxAction[x][y], MovDir[x][y]);
     }
@@ -6284,11 +6314,11 @@ void GameActions()
 #endif
 
 #if 1
-  if (local_player->show_envelope && local_player->MovPos == 0)
+  if (local_player->show_envelope != 0 && local_player->MovPos == 0)
   {
-    ShowEnvelope();
+    ShowEnvelope(local_player->show_envelope - EL_ENVELOPE_1);
 
-    local_player->show_envelope = FALSE;
+    local_player->show_envelope = 0;
   }
 #endif
 }
@@ -7610,7 +7640,7 @@ int DigField(struct PlayerInfo *player,
          GfxElement[x][y] = GFX_ELEMENT(element);
 #else
          GfxElement[x][y] =
-           (CAN_BE_CRUMBLED(element) ? EL_SAND : GFX_ELEMENT(element));
+           (GFX_CRUMBLED(element) ? EL_SAND : GFX_ELEMENT(element));
 #endif
          player->is_digging = TRUE;
        }
@@ -7681,12 +7711,12 @@ int DigField(struct PlayerInfo *player,
                             el2edimg(EL_KEY_1 + key_nr));
          redraw_mask |= REDRAW_DOOR_1;
        }
-       else if (element == EL_ENVELOPE)
+       else if (IS_ENVELOPE(element))
        {
 #if 1
-         player->show_envelope = TRUE;
+         player->show_envelope = element;
 #else
-         ShowEnvelope();
+         ShowEnvelope(element - EL_ENVELOPE_1);
 #endif
        }
        else if (IS_DROPPABLE(element)) /* can be collected and dropped */