Merge branch 'master' into releases 3.0.6
authorHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:44:06 +0000 (10:44 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:44:06 +0000 (10:44 +0200)
CHANGES
src/Makefile
src/conftime.h
src/editor.c
src/events.c
src/game.c
src/init.c
src/libgame/toons.c
src/main.c
src/main.h
src/screens.c

diff --git a/CHANGES b/CHANGES
index 247edadc0c5e60b45f2cd05f2f1baa18771565fb..e8a75019597d01315ac6de8dd9d250790933d2fe 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,16 @@
+Release Version 3.0.6 [06 OCT 2003]
+-----------------------------------
+       - fixed bug when initializing font graphic structure
+       - fixed bug with animation mode "pingpong" when using only 1 frame
+       - fixed bug with extended change target introduced in 3.0.5
+       - fixed bug where passing over moving element doubles player speed
+       - fixed bug with elements continuing to move into push direction
+       - fixed bug with duplicated player when dropping bomb with shield on
+       - fixed switching bug (resetting flag when not switching but not idle)
+       - fixed element tokens for certain file elements with ".active" etc.
+       - added "switching" event for custom elements ("pressing" only once)
+       - added support for MP3 music for SDL version through SMPEG library
+
 Release Version 3.0.5 [29 SEP 2003]
 -----------------------------------
        - fixed bug in multiple config pages loader code that caused crashes
index ff28877633b2b653aa14aa87f2e396da2af41c55..3ca01a688fd62799edd80e95058442624e042d60 100644 (file)
@@ -76,8 +76,12 @@ endif
 
 ifeq ($(TARGET),sdl)
 SYS_CFLAGS  = -DTARGET_SDL $(shell sdl-config --cflags)
+ifeq ($(PLATFORM),macosx)
+SYS_LDFLAGS = -lSDL_image -lSDL_mixer -lsmpeg $(shell sdl-config --libs)
+else
 SYS_LDFLAGS = -lSDL_image -lSDL_mixer $(shell sdl-config --libs)
 endif
+endif
 
 ifeq ($(TARGET),allegro)
 SYS_CFLAGS = -DTARGET_ALLEGRO -I$(CROSS_PATH_MSDOS)/include
index e122ef128df5243bf8f178a95ca5e85c3add256b..043d69f5fe6bc9d1308a2f4a4f513aa94333f572 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2003-09-29 00:44]"
+#define COMPILE_DATE_STRING "[2003-10-06 01:34]"
index b3495358db2f6e407f98f830ef620ce45b59dae5..8e9904e7d0d55ad3b27fbab90052fae056c7613a 100644 (file)
@@ -1118,6 +1118,7 @@ static struct ValueTextInfo options_change_direct_action[] =
   { CE_ENTERED_BY_PLAYER,      "entered by player ..."         },
   { CE_LEFT_BY_PLAYER,         "left by player ..."            },
   { CE_DROPPED_BY_PLAYER,      "dropped by player"             },
+  { CE_SWITCHED,               "switched ..."                  },
   { CE_COLLISION,              "collision ..."                 },
   { CE_IMPACT,                 "impact"                        },
   { CE_SMASHED,                        "smashed"                       },
@@ -1135,6 +1136,7 @@ static struct ValueTextInfo options_change_other_action[] =
   { CE_OTHER_GETS_COLLECTED,   "player collects"               },
   { CE_OTHER_GETS_DROPPED,     "player drops"                  },
   { CE_OTHER_IS_TOUCHING,      "touching ..."                  },
+  { CE_OTHER_IS_SWITCHING,     "switch of ..."                 },
   { CE_OTHER_IS_CHANGING,      "change of"                     },
   { CE_OTHER_IS_EXPLODING,     "explosion of"                  },
   { -1,                                NULL                            }
@@ -4593,6 +4595,7 @@ static void CopyCustomElementPropertiesToEditor(int element)
      HAS_CHANGE_EVENT(element, CE_ENTERED_BY_PLAYER) ? CE_ENTERED_BY_PLAYER :
      HAS_CHANGE_EVENT(element, CE_LEFT_BY_PLAYER) ? CE_LEFT_BY_PLAYER :
      HAS_CHANGE_EVENT(element, CE_DROPPED_BY_PLAYER) ? CE_DROPPED_BY_PLAYER :
+     HAS_CHANGE_EVENT(element, CE_SWITCHED) ? CE_SWITCHED :
      HAS_CHANGE_EVENT(element, CE_COLLISION) ? CE_COLLISION :
      HAS_CHANGE_EVENT(element, CE_IMPACT) ? CE_IMPACT :
      HAS_CHANGE_EVENT(element, CE_SMASHED) ? CE_SMASHED :
@@ -4609,6 +4612,7 @@ static void CopyCustomElementPropertiesToEditor(int element)
      HAS_CHANGE_EVENT(element, CE_OTHER_GETS_COLLECTED) ? CE_OTHER_GETS_COLLECTED :
      HAS_CHANGE_EVENT(element, CE_OTHER_GETS_DROPPED) ? CE_OTHER_GETS_DROPPED :
      HAS_CHANGE_EVENT(element, CE_OTHER_IS_TOUCHING) ? CE_OTHER_IS_TOUCHING :
+     HAS_CHANGE_EVENT(element, CE_OTHER_IS_SWITCHING) ? CE_OTHER_IS_SWITCHING :
      HAS_CHANGE_EVENT(element, CE_OTHER_IS_CHANGING) ? CE_OTHER_IS_CHANGING :
      HAS_CHANGE_EVENT(element, CE_OTHER_IS_EXPLODING) ? CE_OTHER_IS_EXPLODING :
      custom_element_change.other_action);
@@ -4709,6 +4713,7 @@ static void CopyCustomElementPropertiesToGame(int element)
   custom_element_change_events[CE_ENTERED_BY_PLAYER] = FALSE;
   custom_element_change_events[CE_LEFT_BY_PLAYER] = FALSE;
   custom_element_change_events[CE_DROPPED_BY_PLAYER] = FALSE;
+  custom_element_change_events[CE_SWITCHED] = FALSE;
   custom_element_change_events[CE_COLLISION] = FALSE;
   custom_element_change_events[CE_IMPACT] = FALSE;
   custom_element_change_events[CE_SMASHED] = FALSE;
@@ -4725,6 +4730,7 @@ static void CopyCustomElementPropertiesToGame(int element)
   custom_element_change_events[CE_OTHER_GETS_COLLECTED] = FALSE;
   custom_element_change_events[CE_OTHER_GETS_DROPPED] = FALSE;
   custom_element_change_events[CE_OTHER_IS_TOUCHING] = FALSE;
+  custom_element_change_events[CE_OTHER_IS_SWITCHING] = FALSE;
   custom_element_change_events[CE_OTHER_IS_CHANGING] = FALSE;
   custom_element_change_events[CE_OTHER_IS_EXPLODING] = FALSE;
   custom_element_change_events[custom_element_change.other_action] =
index f060c0ff1d9ec1aa11df94b283fa994788efcb6e..96f4624df9df575da6d48ab02bf7d83124203812 100644 (file)
@@ -424,6 +424,7 @@ void HandleButton(int mx, int my, int button)
 
          printf("      Feld[%d][%d] == %d ('%s')\n", x,y, Feld[x][y],
                 element_info[Feld[x][y]].token_name);
+         printf("      Back[%d][%d] == %d\n", x,y, Back[x][y]);
          printf("      Store[%d][%d] == %d\n", x,y, Store[x][y]);
          printf("      Store2[%d][%d] == %d\n", x,y, Store2[x][y]);
          printf("      StorePlayer[%d][%d] == %d\n", x,y, StorePlayer[x][y]);
index 3b06f4856fb2cb11b508431468892ff008dde8f8..007b3d14fc18c058b2f7af6f4c482cf5409b4e85 100644 (file)
@@ -1016,6 +1016,9 @@ void InitGame()
     player->Frame = 0;
     player->StepFrame = 0;
 
+    player->switch_x = -1;
+    player->switch_y = -1;
+
     player->use_murphy_graphic = FALSE;
     player->use_disk_red_graphic = FALSE;
 
@@ -2479,7 +2482,11 @@ void Bang(int x, int y)
   int element = Feld[x][y];
 #endif
 
+#if 1
+  if (IS_PLAYER(x, y) && !PLAYER_PROTECTED(x, y))
+#else
   if (IS_PLAYER(x, y))
+#endif
   {
     struct PlayerInfo *player = PLAYERINFO(x, y);
 
@@ -3091,6 +3098,11 @@ void Impact(int x, int y)
        else
        {
          CheckElementChange(x, y + 1, smashed, CE_SMASHED);
+
+         CheckTriggeredElementSideChange(x, y + 1, smashed, CH_SIDE_TOP,
+                                         CE_OTHER_IS_SWITCHING);
+         CheckElementSideChange(x, y + 1, smashed, CH_SIDE_TOP,
+                                CE_SWITCHED, -1);
        }
       }
       else
@@ -4491,6 +4503,12 @@ void ContinueMoving(int x, int y)
 
     Stop[newx][newy] = TRUE;   /* ignore this element until the next frame */
 
+    /* prevent pushed element from moving on in pushed direction */
+    if (pushed && CAN_MOVE(element) &&
+       element_info[element].move_pattern & MV_ANY_DIRECTION &&
+       !(element_info[element].move_pattern & MovDir[newx][newy]))
+      TurnRound(newx, newy);
+
     if (!pushed)       /* special case: moving object pushed by player */
       JustStopped[newx][newy] = 3;
 
@@ -5545,6 +5563,8 @@ static boolean ChangeElementNow(int x, int y, int element, int page)
          if (IS_MOVING(ex, ey) || IS_BLOCKED(ex, ey))
            RemoveMovingField(ex, ey);
 
+         ChangeEvent[ex][ey] = ChangeEvent[x][y];
+
          ChangeElementNowExt(ex, ey, change->content[xx][yy]);
 
          something_has_changed = TRUE;
@@ -6238,7 +6258,7 @@ void GameActions()
     }
   }
 
-  if (TimeFrames >= (1000 / GameFrameDelay))
+  if (TimeFrames >= FRAMES_PER_SECOND)
   {
     TimeFrames = 0;
     TimePlayed++;
@@ -6696,6 +6716,10 @@ boolean MoveFigure(struct PlayerInfo *player, int dx, int dy)
 #if 1
     player->snapped = FALSE;
 #endif
+
+#if 1
+    player->Switching = FALSE;
+#endif
   }
   else
   {
@@ -7399,6 +7423,7 @@ int DigField(struct PlayerInfo *player,
 
   switch (element)
   {
+#if 0
     case EL_ROBOT_WHEEL:
       Feld[x][y] = EL_ROBOT_WHEEL_ACTIVE;
       ZX = x;
@@ -7407,7 +7432,9 @@ int DigField(struct PlayerInfo *player,
       PlaySoundLevel(x, y, SND_ROBOT_WHEEL_ACTIVATING);
       return MF_ACTION;
       break;
+#endif
 
+#if 0
     case EL_SP_TERMINAL:
       {
        int xx, yy;
@@ -7428,7 +7455,9 @@ int DigField(struct PlayerInfo *player,
        return MF_ACTION;
       }
       break;
+#endif
 
+#if 0
     case EL_CONVEYOR_BELT_1_SWITCH_LEFT:
     case EL_CONVEYOR_BELT_1_SWITCH_MIDDLE:
     case EL_CONVEYOR_BELT_1_SWITCH_RIGHT:
@@ -7441,31 +7470,56 @@ int DigField(struct PlayerInfo *player,
     case EL_CONVEYOR_BELT_4_SWITCH_LEFT:
     case EL_CONVEYOR_BELT_4_SWITCH_MIDDLE:
     case EL_CONVEYOR_BELT_4_SWITCH_RIGHT:
+#if 1
+      if (!PLAYER_SWITCHING(player, x, y))
+#else
       if (!player->Switching)
+#endif
       {
        player->Switching = TRUE;
+       player->switch_x = x;
+       player->switch_y = y;
+
        ToggleBeltSwitch(x, y);
        PlaySoundLevel(x, y, SND_CLASS_CONVEYOR_BELT_SWITCH_ACTIVATING);
       }
       return MF_ACTION;
       break;
+#endif
 
+#if 0
     case EL_SWITCHGATE_SWITCH_UP:
     case EL_SWITCHGATE_SWITCH_DOWN:
+#if 1
+      if (!PLAYER_SWITCHING(player, x, y))
+#else
       if (!player->Switching)
+#endif
       {
        player->Switching = TRUE;
+       player->switch_x = x;
+       player->switch_y = y;
+
        ToggleSwitchgateSwitch(x, y);
        PlaySoundLevel(x, y, SND_CLASS_SWITCHGATE_SWITCH_ACTIVATING);
       }
       return MF_ACTION;
       break;
+#endif
 
+#if 0
     case EL_LIGHT_SWITCH:
     case EL_LIGHT_SWITCH_ACTIVE:
+#if 1
+      if (!PLAYER_SWITCHING(player, x, y))
+#else
       if (!player->Switching)
+#endif
       {
        player->Switching = TRUE;
+       player->switch_x = x;
+       player->switch_y = y;
+
        ToggleLightSwitch(x, y);
        PlaySoundLevel(x, y, element == EL_LIGHT_SWITCH ?
                       SND_LIGHT_SWITCH_ACTIVATING :
@@ -7473,14 +7527,18 @@ int DigField(struct PlayerInfo *player,
       }
       return MF_ACTION;
       break;
+#endif
 
+#if 0
     case EL_TIMEGATE_SWITCH:
       ActivateTimegateSwitch(x, y);
       PlaySoundLevel(x, y, SND_TIMEGATE_SWITCH_ACTIVATING);
 
       return MF_ACTION;
       break;
+#endif
 
+#if 0
     case EL_BALLOON_SWITCH_LEFT:
     case EL_BALLOON_SWITCH_RIGHT:
     case EL_BALLOON_SWITCH_UP:
@@ -7498,6 +7556,7 @@ int DigField(struct PlayerInfo *player,
 
       return MF_ACTION;
       break;
+#endif
 
     case EL_SP_PORT_LEFT:
     case EL_SP_PORT_RIGHT:
@@ -7590,6 +7649,7 @@ int DigField(struct PlayerInfo *player,
       }
       break;
 
+#if 0
     case EL_LAMP:
       Feld[x][y] = EL_LAMP_ACTIVE;
       local_player->lights_still_needed--;
@@ -7597,7 +7657,9 @@ int DigField(struct PlayerInfo *player,
       PlaySoundLevel(x, y, SND_LAMP_ACTIVATING);
       return MF_ACTION;
       break;
+#endif
 
+#if 0
     case EL_TIME_ORB_FULL:
       Feld[x][y] = EL_TIME_ORB_EMPTY;
       TimeLeft += 10;
@@ -7606,6 +7668,7 @@ int DigField(struct PlayerInfo *player,
       PlaySoundStereo(SND_TIME_ORB_FULL_COLLECTING, SOUND_MIDDLE);
       return MF_ACTION;
       break;
+#endif
 
     default:
 
@@ -7645,6 +7708,11 @@ int DigField(struct PlayerInfo *player,
        if (!IN_LEV_FIELD(nextx, nexty) || !IS_FREE(nextx, nexty))
          return MF_NO_ACTION;
 
+#if 1
+       if (CAN_MOVE(element))  /* only fixed elements can be passed! */
+         return MF_NO_ACTION;
+#endif
+
        if (element >= EL_EM_GATE_1 && element <= EL_EM_GATE_4)
        {
          if (!player->key[element - EL_EM_GATE_1])
@@ -7797,13 +7865,6 @@ int DigField(struct PlayerInfo *player,
          return MF_NO_ACTION;
 
 #if 1
-       /*
-       printf("::: %d [%d,%d,%d => %d]\n", MovDir[x][y],
-              CAN_MOVE(element), move_direction, getElementMoveStepsize(x, y),
-              (CAN_MOVE(element) && MovDir[x][y] == move_direction &&
-               getElementMoveStepsize(x, y) > MOVE_STEPSIZE_NORMAL) );
-       */
-
        /* do not push elements already moving away faster than player */
        if (CAN_MOVE(element) && MovDir[x][y] == move_direction &&
            ABS(getElementMoveStepsize(x, y)) > MOVE_STEPSIZE_NORMAL)
@@ -7896,17 +7957,175 @@ int DigField(struct PlayerInfo *player,
 
        break;
       }
+      else if (IS_SWITCHABLE(element))
+      {
+       if (PLAYER_SWITCHING(player, x, y))
+         return MF_ACTION;
+
+#if 1
+       PlaySoundLevelElementAction(x, y, element, ACTION_ACTIVATING);
+#endif
+
+       if (element == EL_ROBOT_WHEEL)
+       {
+         Feld[x][y] = EL_ROBOT_WHEEL_ACTIVE;
+         ZX = x;
+         ZY = y;
+
+         DrawLevelField(x, y);
+
+#if 0
+         PlaySoundLevel(x, y, SND_ROBOT_WHEEL_ACTIVATING);
+#endif
+       }
+       else if (element == EL_SP_TERMINAL)
+       {
+         int xx, yy;
+
+#if 0
+         PlaySoundLevel(x, y, SND_SP_TERMINAL_ACTIVATING);
+#endif
+
+         for (yy=0; yy<lev_fieldy; yy++)
+         {
+           for (xx=0; xx<lev_fieldx; xx++)
+           {
+             if (Feld[xx][yy] == EL_SP_DISK_YELLOW)
+               Bang(xx, yy);
+             else if (Feld[xx][yy] == EL_SP_TERMINAL)
+               Feld[xx][yy] = EL_SP_TERMINAL_ACTIVE;
+           }
+         }
+       }
+       else if (IS_BELT_SWITCH(element))
+       {
+#if 0
+         if (!PLAYER_SWITCHING(player, x, y))
+#endif
+         {
+           player->Switching = TRUE;
+           player->switch_x = x;
+           player->switch_y = y;
+
+           ToggleBeltSwitch(x, y);
+
+#if 0
+           PlaySoundLevel(x, y, SND_CLASS_CONVEYOR_BELT_SWITCH_ACTIVATING);
+#endif
+         }
+       }
+       else if (element == EL_SWITCHGATE_SWITCH_UP ||
+                element == EL_SWITCHGATE_SWITCH_DOWN)
+       {
+#if 0
+         if (!PLAYER_SWITCHING(player, x, y))
+#endif
+         {
+           player->Switching = TRUE;
+           player->switch_x = x;
+           player->switch_y = y;
+
+           ToggleSwitchgateSwitch(x, y);
+
+#if 0
+           PlaySoundLevel(x, y, SND_CLASS_SWITCHGATE_SWITCH_ACTIVATING);
+#endif
+         }
+       }
+       else if (element == EL_LIGHT_SWITCH ||
+                element == EL_LIGHT_SWITCH_ACTIVE)
+       {
+#if 0
+         if (!PLAYER_SWITCHING(player, x, y))
+#endif
+         {
+           player->Switching = TRUE;
+           player->switch_x = x;
+           player->switch_y = y;
+
+           ToggleLightSwitch(x, y);
+
+#if 0
+           PlaySoundLevel(x, y, element == EL_LIGHT_SWITCH ?
+                          SND_LIGHT_SWITCH_ACTIVATING :
+                          SND_LIGHT_SWITCH_DEACTIVATING);
+#endif
+         }
+       }
+       else if (element == EL_TIMEGATE_SWITCH)
+       {
+         ActivateTimegateSwitch(x, y);
+
+#if 0
+         PlaySoundLevel(x, y, SND_TIMEGATE_SWITCH_ACTIVATING);
+#endif
+       }
+       else if (element == EL_BALLOON_SWITCH_LEFT ||
+                element == EL_BALLOON_SWITCH_RIGHT ||
+                element == EL_BALLOON_SWITCH_UP ||
+                element == EL_BALLOON_SWITCH_DOWN ||
+                element == EL_BALLOON_SWITCH_ANY)
+       {
+         if (element == EL_BALLOON_SWITCH_ANY)
+           game.balloon_dir = move_direction;
+         else
+           game.balloon_dir = (element == EL_BALLOON_SWITCH_LEFT  ? MV_LEFT :
+                               element == EL_BALLOON_SWITCH_RIGHT ? MV_RIGHT :
+                               element == EL_BALLOON_SWITCH_UP    ? MV_UP :
+                               element == EL_BALLOON_SWITCH_DOWN  ? MV_DOWN :
+                               MV_NO_MOVING);
+
+#if 0
+         PlaySoundLevel(x, y, SND_CLASS_BALLOON_SWITCH_ACTIVATING);
+#endif
+       }
+       else if (element == EL_LAMP)
+       {
+         Feld[x][y] = EL_LAMP_ACTIVE;
+         local_player->lights_still_needed--;
+
+         DrawLevelField(x, y);
+
+#if 0
+         PlaySoundLevel(x, y, SND_LAMP_ACTIVATING);
+#endif
+       }
+       else if (element == EL_TIME_ORB_FULL)
+       {
+         Feld[x][y] = EL_TIME_ORB_EMPTY;
+         TimeLeft += 10;
+         DrawText(DX_TIME, DY_TIME, int2str(TimeLeft, 3), FONT_TEXT_2);
+
+         DrawLevelField(x, y);
+
+#if 0
+         PlaySoundStereo(SND_TIME_ORB_FULL_COLLECTING, SOUND_MIDDLE);
+#endif
+       }
+
+       return MF_ACTION;
+      }
       else
       {
 #if 1
+       if (!PLAYER_SWITCHING(player, x, y))
+#else
+       if (!player->Switching)
+#endif
+       {
+         player->Switching = TRUE;
+         player->switch_x = x;
+         player->switch_y = y;
+
+         CheckTriggeredElementSideChange(x, y, element, dig_side,
+                                         CE_OTHER_IS_SWITCHING);
+         CheckElementSideChange(x, y, element, dig_side, CE_SWITCHED, -1);
+       }
+
        CheckTriggeredElementSideChange(x, y, element, dig_side,
-                                   CE_OTHER_GETS_PRESSED);
+                                       CE_OTHER_GETS_PRESSED);
        CheckElementSideChange(x, y, element, dig_side,
                               CE_PRESSED_BY_PLAYER, -1);
-#else
-       CheckTriggeredElementChange(x, y, element, CE_OTHER_GETS_PRESSED);
-       CheckElementChange(x, y, element, CE_PRESSED_BY_PLAYER);
-#endif
       }
 
       return MF_NO_ACTION;
index 8ec25b1df7d3436fa1c9d795f10d50a8d03a9a36..c7a199118fea2390f170d8c2bbdc212910a0a1a8 100644 (file)
@@ -291,8 +291,13 @@ void InitFontGraphicInfo()
   /* ---------- initialize font graphic definitions ---------- */
 
   /* always start with reliable default values (normal font graphics) */
+#if 1
+  for (i=0; i < NUM_FONTS; i++)
+    font_info[i].graphic = IMG_FONT_INITIAL_1;
+#else
   for (i=0; i < NUM_FONTS; i++)
     font_info[i].graphic = FONT_INITIAL_1;
+#endif
 
   /* initialize normal font/graphic mapping from static configuration */
   for (i=0; font_to_graphic[i].font_nr > -1; i++)
@@ -665,6 +670,34 @@ void InitElementGraphicInfo()
     }
   }
 
+#if 1
+  /* set animation mode to "none" for each graphic with only 1 frame */
+  for (i=0; i<MAX_NUM_ELEMENTS; i++)
+  {
+    for (act=0; act<NUM_ACTIONS; act++)
+    {
+      int graphic = element_info[i].graphic[act];
+      int crumbled = element_info[i].crumbled[act];
+
+      if (graphic_info[graphic].anim_frames == 1)
+       graphic_info[graphic].anim_mode = ANIM_NONE;
+      if (graphic_info[crumbled].anim_frames == 1)
+       graphic_info[crumbled].anim_mode = ANIM_NONE;
+
+      for (dir=0; dir<NUM_DIRECTIONS; dir++)
+      {
+       graphic = element_info[i].direction_graphic[act][dir];
+       crumbled = element_info[i].direction_crumbled[act][dir];
+
+       if (graphic_info[graphic].anim_frames == 1)
+         graphic_info[graphic].anim_mode = ANIM_NONE;
+       if (graphic_info[crumbled].anim_frames == 1)
+         graphic_info[crumbled].anim_mode = ANIM_NONE;
+      }
+    }
+  }
+#endif
+
 #if 0
 #if DEBUG
   if (options.verbose)
@@ -842,6 +875,10 @@ static void set_graphic_parameters(int graphic, char **parameter_raw)
     graphic_info[graphic].anim_delay = 1;
 
   graphic_info[graphic].anim_mode = parameter[GFX_ARG_ANIM_MODE];
+#if 0
+  if (graphic_info[graphic].anim_frames == 1)
+    graphic_info[graphic].anim_mode = ANIM_NONE;
+#endif
 
   /* automatically determine correct start frame, if not defined */
   if (parameter[GFX_ARG_START_FRAME] == ARG_UNDEFINED_VALUE)
index 048696f6cd365fb4322959f5d7da4fcced91bfed..2d0a355014bd05595f2413d6f60d4b31a188da79 100644 (file)
@@ -48,7 +48,11 @@ int getAnimationFrame(int num_frames, int delay, int mode, int start_frame,
   }
   else if (mode & ANIM_PINGPONG)       /* oscillate (border frames once) */
   {
+#if 1
+    int max_anim_frames = (num_frames > 1 ? 2 * num_frames - 2 : 1);
+#else
     int max_anim_frames = 2 * num_frames - 2;
+#endif
 
     frame = (sync_frame % (delay * max_anim_frames)) / delay;
     frame = (frame < num_frames ? frame : max_anim_frames - frame);
index 8498052e14a4ebccaf179c4ddcd1b8e8b21f308b..7f42c44b33f6fd060fbf059e3c50ba88a85a2f91 100644 (file)
@@ -254,7 +254,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "biomaze"
   },
   {
-    "dynamite_active",
+    "dynamite.active",
     "dynamite",
     "burning dynamite"
   },
@@ -269,7 +269,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "magic wheel"
   },
   {
-    "robot_wheel_active",
+    "robot_wheel.active",
     "robot_wheel",
     "magic wheel (running)"
   },
@@ -351,7 +351,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "lamp (off)"
   },
   {
-    "lamp_active",
+    "lamp.active",
     "lamp",
     "lamp (on)"
   },
@@ -461,39 +461,39 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "sokoban field with object"
   },
   {
-    "bd_butterfly_right",
+    "bd_butterfly.right",
     "bd_butterfly",
     "butterfly (starts moving right)"},
   {
-    "bd_butterfly_up",
+    "bd_butterfly.up",
     "bd_butterfly",
     "butterfly (starts moving up)"
   },
   {
-    "bd_butterfly_left",
+    "bd_butterfly.left",
     "bd_butterfly",
     "butterfly (starts moving left)"},
   {
-    "bd_butterfly_down",
+    "bd_butterfly.down",
     "bd_butterfly",
     "butterfly (starts moving down)"},
   {
-    "bd_firefly_right",
+    "bd_firefly.right",
     "bd_firefly",
     "firefly (starts moving right)"
   },
   {
-    "bd_firefly_up",
+    "bd_firefly.up",
     "bd_firefly",
     "firefly (starts moving up)"
   },
   {
-    "bd_firefly_left",
+    "bd_firefly.left",
     "bd_firefly",
     "firefly (starts moving left)"
   },
   {
-    "bd_firefly_down",
+    "bd_firefly.down",
     "bd_firefly",
     "firefly (starts moving down)"
   },
@@ -528,59 +528,59 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "blue player"
   },
   {
-    "bug_right",
+    "bug.right",
     "bug",
     "bug (starts moving right)"
   },
   {
-    "bug_up",
+    "bug.up",
     "bug",
     "bug (starts moving up)"
   },
   {
-    "bug_left",
+    "bug.left",
     "bug",
     "bug (starts moving left)"
   },
   {
-    "bug_down",
+    "bug.down",
     "bug",
     "bug (starts moving down)"
   },
   {
-    "spaceship_right",
+    "spaceship.right",
     "spaceship",
     "spaceship (starts moving right)"},
   {
-    "spaceship_up",
+    "spaceship.up",
     "spaceship",
     "spaceship (starts moving up)"
   },
   {
-    "spaceship_left",
+    "spaceship.left",
     "spaceship",
     "spaceship (starts moving left)"},
   {
-    "spaceship_down",
+    "spaceship.down",
     "spaceship",
     "spaceship (starts moving down)"},
   {
-    "pacman_right",
+    "pacman.right",
     "pacman",
     "pac man (starts moving right)"
   },
   {
-    "pacman_up",
+    "pacman.up",
     "pacman",
     "pac man (starts moving up)"
   },
   {
-    "pacman_left",
+    "pacman.left",
     "pacman",
     "pac man (starts moving left)"
   },
   {
-    "pacman_down",
+    "pacman.down",
     "pacman",
     "pac man (starts moving down)"
   },
@@ -1595,7 +1595,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "light switch (off)"
   },
   {
-    "light_switch_active",
+    "light_switch.active",
     "light_switch",
     "light switch (on)"
   },
@@ -1660,22 +1660,22 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "sign (other)"
   },
   {
-    "mole_left",
+    "mole.left",
     "mole",
     "mole (starts moving left)"
   },
   {
-    "mole_right",
+    "mole.right",
     "mole",
     "mole (starts moving right)"
   },
   {
-    "mole_up",
+    "mole.up",
     "mole",
     "mole (starts moving up)"
   },
   {
-    "mole_down",
+    "mole.down",
     "mole",
     "mole (starts moving down)"
   },
@@ -1725,7 +1725,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "time gate (closed)"
   },
   {
-    "timegate_switch_active",
+    "timegate_switch.active",
     "timegate_switch",
     "switch for time gate"
   },
@@ -3230,142 +3230,142 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
   /* ----------------------------------------------------------------------- */
 
   {
-    "dynabomb_player_1_active",
+    "dynabomb_player_1.active",
     "dynabomb",
     "-"
   },
   {
-    "dynabomb_player_2_active",
+    "dynabomb_player_2.active",
     "dynabomb",
     "-"
   },
   {
-    "dynabomb_player_3_active",
+    "dynabomb_player_3.active",
     "dynabomb",
     "-"
   },
   {
-    "dynabomb_player_4_active",
+    "dynabomb_player_4.active",
     "dynabomb",
     "-"
   },
   {
-    "sp_disk_red_active",
+    "sp_disk_red.active",
     "dynamite",
     "-"
   },
   {
-    "switchgate_opening",
+    "switchgate.opening",
     "switchgate",
     "-"
   },
   {
-    "switchgate_closing",
+    "switchgate.closing",
     "switchgate",
     "-"
   },
   {
-    "timegate_opening",
+    "timegate.opening",
     "timegate",
     "-"
   },
   {
-    "timegate_closing",
+    "timegate.closing",
     "timegate",
     "-"
   },
   {
-    "pearl_breaking",
+    "pearl.breaking",
     "pearl",
     "-"
   },
   {
-    "trap_active",
+    "trap.active",
     "trap",
     "-"
   },
   {
-    "invisible_steelwall_active",
+    "invisible_steelwall.active",
     "wall",
     "-"
   },
   {
-    "invisible_wall_active",
+    "invisible_wall.active",
     "wall",
     "-"
   },
   {
-    "invisible_sand_active",
+    "invisible_sand.active",
     "sand",
     "-"
   },
   {
-    "conveyor_belt_1_left_active",
+    "conveyor_belt_1_left.active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt_1_middle_active",
+    "conveyor_belt_1_middle.active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt_1_right_active",
+    "conveyor_belt_1_right.active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt_2_left_active",
+    "conveyor_belt_2_left.active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt_2_middle_active",
+    "conveyor_belt_2_middle.active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt_2_right_active",
+    "conveyor_belt_2_right.active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt_3_left_active",
+    "conveyor_belt_3_left.active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt_3_middle_active",
+    "conveyor_belt_3_middle.active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt_3_right_active",
+    "conveyor_belt_3_right.active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt_4_left_active",
+    "conveyor_belt_4_left.active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt_4_middle_active",
+    "conveyor_belt_4_middle.active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt_4_right_active",
+    "conveyor_belt_4_right.active",
     "conveyor_belt",
     "-"
   },
   {
-    "exit_opening",
+    "exit.opening",
     "exit",
     "-"
   },
   {
-    "exit_closing",
+    "exit.closing",
     "exit",
     "-"
   },
@@ -3375,17 +3375,17 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "-"
   },
   {
-    "sp_terminal_active",
+    "sp_terminal.active",
     "sp_terminal",
     "-"
   },
   {
-    "sp_buggy_base_activating",
+    "sp_buggy_base.activating",
     "sp_buggy_base",
     "-"
   },
   {
-    "sp_buggy_base_active",
+    "sp_buggy_base.active",
     "sp_buggy_base",
     "-"
   },
@@ -3395,22 +3395,22 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "-"
   },
   {
-    "amoeba_dropping",
+    "amoeba.dropping",
     "amoeba",
     "-"
   },
   {
-    "quicksand_emptying",
+    "quicksand.emptying",
     "quicksand",
     "-"
   },
   {
-    "magic_wall_active",
+    "magic_wall.active",
     "magic_wall",
     "-"
   },
   {
-    "bd_magic_wall_active",
+    "bd_magic_wall.active",
     "magic_wall",
     "-"
   },
@@ -3425,12 +3425,12 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "-"
   },
   {
-    "magic_wall_emptying",
+    "magic_wall.emptying",
     "magic_wall",
     "-"
   },
   {
-    "bd_magic_wall_emptying",
+    "bd_magic_wall.emptying",
     "magic_wall",
     "-"
   },
@@ -3490,7 +3490,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "-"
   },
   {
-    "expandable_wall_growing",
+    "expandable_wall.growing",
     "-",
     "-"
   },
@@ -3505,17 +3505,17 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "-"
   },
   {
-    "quicksand_filling",
+    "quicksand.filling",
     "quicksand",
     "-"
   },
   {
-    "magic_wall_filling",
+    "magic_wall.filling",
     "-",
     "-"
   },
   {
-    "bd_magic_wall_filling",
+    "bd_magic_wall.filling",
     "-",
     "-"
   },
@@ -3590,7 +3590,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "-"
   },
   {
-    "dynabomb_active",
+    "dynabomb.active",
     "-",
     "-"
   },
@@ -3615,12 +3615,12 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "-"
   },
   {
-    "shield_normal_active",
+    "shield_normal.active",
     "-",
     "-"
   },
   {
-    "shield_deadly_active",
+    "shield_deadly.active",
     "-",
     "-"
   },
index 27d2290217924810e5dfab10aaf8d2a2b2dcf3f4..985014bad0090e53a9d3630cc049b2795584c605 100644 (file)
 #define CE_LEFT_BY_PLAYER      22
 #define CE_OTHER_GETS_ENTERED  23
 #define CE_OTHER_GETS_LEFT     24
+#define CE_SWITCHED            25
+#define CE_OTHER_IS_SWITCHING  26
 
-/* values for derived change events (determined from properties above) */
-#define CE_TOUCHING_SOME_SIDE  25      /* summarized left/right/up/down/any */
-
-#define NUM_CHANGE_EVENTS      26
+#define NUM_CHANGE_EVENTS      27
 
 #define CE_BITMASK_DEFAULT     0
 
 #define PLAYER_PROTECTED(x,y)  (SHIELD_ON(PLAYERINFO(x, y)) ||         \
                                 PROTECTED_FIELD(x, y))
 
+#define PLAYER_SWITCHING(p,x,y)        ((p)->Switching &&                      \
+                                (p)->switch_x == (x) && (p)->switch_y == (y))
+
 #define PLAYER_NR_GFX(g,i)     ((g) + i * (IMG_PLAYER_2 - IMG_PLAYER_1))
 
 #define ANIM_FRAMES(g)         (graphic_info[g].anim_frames)
 
 #define PROGRAM_VERSION_MAJOR  3
 #define PROGRAM_VERSION_MINOR  0
-#define PROGRAM_VERSION_PATCH  5
+#define PROGRAM_VERSION_PATCH  6
 #define PROGRAM_VERSION_RELEASE        0
-#define PROGRAM_VERSION_STRING "3.0.5"
+#define PROGRAM_VERSION_STRING "3.0.6"
 
 #define PROGRAM_TITLE_STRING   "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING  "Holger Schemel"
@@ -1139,6 +1141,8 @@ struct PlayerInfo
   boolean LevelSolved, GameOver;
   boolean snapped;
 
+  int switch_x, switch_y;
+
   int last_move_dir;
   boolean is_moving;
   boolean is_waiting;
index 54ba6a4110cc4863aec45fd9e0f4e1f96d076ba2..90085a467a6c7ae39371790a4484b4ad97c3c006 100644 (file)
@@ -1241,12 +1241,6 @@ static void drawChooseTreeList(int first_entry, int num_page_entries,
   int yoffset = (ti->type == TREE_TYPE_LEVEL_DIR ? 0 : yoffset_setup);
   int last_game_status = game_status;  /* save current game status */
 
-#if 1
-  DrawBackground(mSX, mSY, SXSIZE - 32 + menu.scrollbar_xoffset, SYSIZE);
-#else
-  DrawBackground(SX, SY, SXSIZE - 32, SYSIZE);
-#endif
-
   title_string =
     (ti->type == TREE_TYPE_LEVEL_DIR ? "Level Directories" :
      ti->type == TREE_TYPE_GRAPHICS_DIR ? "Custom Graphics" :
@@ -1258,6 +1252,10 @@ static void drawChooseTreeList(int first_entry, int num_page_entries,
   /* force LEVELS font on artwork setup screen */
   game_status = GAME_MODE_LEVELS;
 
+  /* clear tree list area, but not title or scrollbar */
+  DrawBackground(mSX, mSY + MENU_SCREEN_START_YPOS * 32,
+                SXSIZE - 32 + menu.scrollbar_xoffset, SYSIZE);
+
   for(i=0; i<num_page_entries; i++)
   {
     TreeInfo *node, *node_first;