rnd-20030125-1-src
authorHolger Schemel <info@artsoft.org>
Sat, 25 Jan 2003 02:26:43 +0000 (03:26 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:39:59 +0000 (10:39 +0200)
16 files changed:
src/conf_gfx.c
src/conftime.h
src/editor.c
src/files.c
src/files.h
src/game.c
src/init.c
src/libgame/misc.c
src/libgame/misc.h
src/libgame/system.c
src/libgame/system.h
src/libgame/toons.c
src/main.c
src/main.h
src/tools.c
src/tools.h

index f5b038773203912f5351e8369903a48df6c4a055..9c608bbc805e9ef5621319da5749c75ffee5c3cb 100644 (file)
@@ -37,6 +37,7 @@ struct ConfigInfo image_config_suffix[] =
   { ".mode_random",                    "false",        TYPE_BOOLEAN },
   { ".mode_reverse",                   "false",        TYPE_BOOLEAN },
   { ".global_sync",                    "false",        TYPE_BOOLEAN },
+  { ".name",                           ARG_UNDEFINED,  TYPE_STRING  },
 
   { NULL,                              NULL,           0            }
 };
index a93eb58f014e061e01b84dc6099a6138b117b937..93641032c90e2caa2da6da68d6d85d9b7146f47e 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2003-01-21 03:57]"
+#define COMPILE_DATE_STRING "[2003-01-25 03:22]"
index 688a63b7945d8650c328f2582e849a07d26e2fd1..a1fa7ba138c0271344e878b16f3b193e01aaf04a 100644 (file)
@@ -1563,13 +1563,22 @@ static void ReinitializeElementListButtons()
 
 static char *getElementInfoText(int element)
 {
-  char *info_text = "unknown";
+  char *info_text = NULL;
+
+  if (element < NUM_FILE_ELEMENTS)
+  {
+    if (element_info[element].custom_description != NULL)
+      info_text = element_info[element].custom_description;
+    else if (element_info[element].editor_description != NULL)
+      info_text = element_info[element].editor_description;
+  }
+
+  if (info_text == NULL)
+  {
+    info_text = "unknown";
 
-  if (element < NUM_FILE_ELEMENTS &&
-      element_info[element].editor_description != NULL)
-    info_text = element_info[element].editor_description;
-  else
     Error(ERR_WARN, "no element description for element %d", element);
+  }
 
   return info_text;
 }
@@ -4334,6 +4343,7 @@ void HandleLevelEditorIdle()
 {
   static unsigned long action_delay = 0;
   unsigned long action_delay_value = GameFrameDelay;
+  int graphic = el2img(properties_element);
   int xpos = 1, ypos = 2;
 
   if (edit_mode != ED_MODE_PROPERTIES)
@@ -4343,11 +4353,10 @@ void HandleLevelEditorIdle()
     return;
 
 #if 1
-
   DrawGraphicAnimationExt(drawto,
                          SX + xpos * TILEX,
                          SY + ypos * TILEY + MINI_TILEY / 2,
-                         el2img(properties_element), -1, NO_MASKING);
+                         graphic, -1, NO_MASKING);
 
 #else
   DrawGraphicAnimationExt(drawto,
index 0e26366315a451ed85304ea645f51723c0a95e48..ff594971630ad844ccc80968faa5766a750bdc23 100644 (file)
@@ -1593,3 +1593,35 @@ void SaveSetup()
 
   SetFilePermissions(filename, PERMS_PRIVATE);
 }
+
+void LoadCustomElementDescriptions()
+{
+  char *filename = getCustomArtworkConfigFilename(ARTWORK_TYPE_GRAPHICS);
+  struct SetupFileList *setup_file_list;
+  int i;
+
+  for (i=0; i<NUM_FILE_ELEMENTS; i++)
+  {
+    if (element_info[i].custom_description != NULL)
+    {
+      free(element_info[i].custom_description);
+      element_info[i].custom_description = NULL;
+    }
+  }
+
+  if ((setup_file_list = loadSetupFileList(filename)) == NULL)
+    return;
+
+  for (i=0; i<NUM_FILE_ELEMENTS; i++)
+  {
+    char *token = getStringCat2(element_info[i].token_name, ".name");
+    char *value = getTokenValue(setup_file_list, token);
+
+    if (value != NULL)
+      element_info[i].custom_description = getStringCopy(value);
+
+    free(token);
+  }
+
+  freeSetupFileList(setup_file_list);
+}
index 37066d0858688b7bfcbb462e3c967d75d3a3666b..434e7bd45ae149a509d60f1f0fbc393a53007832 100644 (file)
@@ -32,4 +32,6 @@ void SaveScore(int);
 void LoadSetup(void);
 void SaveSetup(void);
 
+void LoadCustomElementDescriptions();
+
 #endif /* FILES_H */
index 0ae6ce5159a9821c9740e9d404a1280ba808a3b1..09ea5e2ec74455bfe11eaf8e99f6ef2198c3d255 100644 (file)
@@ -161,6 +161,9 @@ static struct ChangingElementInfo changing_element_list[] =
   { EL_TIMEGATE_OPENING,       EL_TIMEGATE_OPEN,       29, NULL, NULL, NULL },
   { EL_TIMEGATE_CLOSING,       EL_TIMEGATE_CLOSED,     29, NULL, NULL, NULL },
 
+  { EL_ACID_SPLASH_LEFT,       EL_EMPTY,                8, NULL, NULL, NULL },
+  { EL_ACID_SPLASH_RIGHT,      EL_EMPTY,                8, NULL, NULL, NULL },
+
   { EL_SP_BUGGY_BASE,          EL_SP_BUGGY_BASE_ACTIVATING, 0,
     InitBuggyBase, NULL, NULL },
   { EL_SP_BUGGY_BASE_ACTIVATING,EL_SP_BUGGY_BASE_ACTIVE, 0,
@@ -187,60 +190,6 @@ static struct ChangingElementInfo changing_element[MAX_NUM_ELEMENTS];
 #define IS_AUTO_CHANGING(e)  (changing_element[e].base_element != EL_UNDEFINED)
 
 
-
-#ifdef DEBUG
-#if 0
-static unsigned int getStateCheckSum(int counter)
-{
-  int x, y;
-  unsigned int mult = 1;
-  unsigned int checksum = 0;
-  /*
-  static short lastFeld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-  */
-  static boolean first_game = TRUE;
-
-  for (y=0; y<lev_fieldy; y++) for(x=0; x<lev_fieldx; x++)
-  {
-    /*
-    if (counter == 3)
-    {
-      if (first_game)
-       lastFeld[x][y] = Feld[x][y];
-      else if (lastFeld[x][y] != Feld[x][y])
-       printf("DIFF: [%d][%d]: lastFeld == %d != %d == Feld\n",
-              x, y, lastFeld[x][y], Feld[x][y]);
-    }
-    */
-
-    checksum += mult++ * Ur[x][y];
-    checksum += mult++ * Feld[x][y];
-
-    /*
-    checksum += mult++ * MovPos[x][y];
-    checksum += mult++ * MovDir[x][y];
-    checksum += mult++ * MovDelay[x][y];
-    checksum += mult++ * Store[x][y];
-    checksum += mult++ * Store2[x][y];
-    checksum += mult++ * StorePlayer[x][y];
-    checksum += mult++ * ExplodePhase[x][y];
-    checksum += mult++ * AmoebaNr[x][y];
-    checksum += mult++ * JustStopped[x][y];
-    checksum += mult++ * Stop[x][y];
-    */
-  }
-
-  if (counter == 3 && first_game)
-    first_game = FALSE;
-
-  return checksum;
-}
-#endif
-#endif
-
-
-
-
 void GetPlayerConfig()
 {
   if (!audio.sound_available)
@@ -773,6 +722,7 @@ void InitGame()
 
       GfxFrame[x][y] = 0;
       GfxAction[x][y] = ACTION_DEFAULT;
+      GfxRandom[x][y] = SimpleRND(1000000);
     }
   }
 
@@ -1460,7 +1410,9 @@ void DrawDynamite(int x, int y)
 
 void CheckDynamite(int x, int y)
 {
+#if 0
   int element = Feld[x][y];
+#endif
 
   if (MovDelay[x][y] != 0)     /* dynamite is still waiting to explode */
   {
@@ -1468,7 +1420,9 @@ void CheckDynamite(int x, int y)
 
     if (MovDelay[x][y] != 0)
     {
+#if 0
       if (checkDrawLevelGraphicAnimation(x, y, el2img(element)))
+#endif
        DrawDynamite(x, y);
 
       PlaySoundLevelAction(x, y, ACTION_ACTIVE);
@@ -1802,27 +1756,27 @@ void Bang(int x, int y)
   }
 }
 
-void Blurb(int x, int y)
+void SplashAcid(int x, int y)
 {
   int element = Feld[x][y];
 
   if (element != EL_ACID_SPLASH_LEFT &&
-      element != EL_ACID_SPLASH_RIGHT) /* start */
+      element != EL_ACID_SPLASH_RIGHT)
   {
     PlaySoundLevel(x, y, SND_ACID_SPLASHING);
+
     if (IN_LEV_FIELD(x-1, y) && IS_FREE(x-1, y) &&
        (!IN_LEV_FIELD(x-1, y-1) ||
         !CAN_FALL(MovingOrBlocked2Element(x-1, y-1))))
-    {
       Feld[x-1][y] = EL_ACID_SPLASH_LEFT;
-    }
+
     if (IN_LEV_FIELD(x+1, y) && IS_FREE(x+1, y) &&
        (!IN_LEV_FIELD(x+1, y-1) ||
         !CAN_FALL(MovingOrBlocked2Element(x+1, y-1))))
-    {
       Feld[x+1][y] = EL_ACID_SPLASH_RIGHT;
-    }
   }
+
+#if 0
   else                                                         /* go on */
   {
     int graphic = (element == EL_ACID_SPLASH_LEFT ?
@@ -1849,6 +1803,7 @@ void Blurb(int x, int y)
       }
     }
   }
+#endif
 }
 
 static void InitBeltMovement()
@@ -2171,7 +2126,7 @@ void Impact(int x, int y)
 
   if (!lastline && smashed == EL_ACID) /* element falls into acid */
   {
-    Blurb(x, y);
+    SplashAcid(x, y);
     return;
   }
 
@@ -2905,7 +2860,7 @@ void StartMoving(int x, int y)
     }
     else if (CAN_SMASH(element) && Feld[x][y+1] == EL_ACID)
     {
-      Blurb(x, y);
+      SplashAcid(x, y);
 
       InitMovingField(x, y, MV_DOWN);
       started_moving = TRUE;
@@ -3044,8 +2999,12 @@ void StartMoving(int x, int y)
       MovDelay[x][y]--;
 
       if (element == EL_ROBOT ||
-         element == EL_YAMYAM || element == EL_DARK_YAMYAM)
+         element == EL_YAMYAM ||
+         element == EL_DARK_YAMYAM)
       {
+#if 1
+       ContinueLevelElementAnimation(x, y, element);
+#else
        if (IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
        {
          int graphic = el2img(element);
@@ -3053,7 +3012,11 @@ void StartMoving(int x, int y)
 
          DrawGraphic(SCREENX(x), SCREENY(y), graphic, frame);
        }
+#endif
 
+#if 1
+       PlaySoundLevelAction(x, y, ACTION_WAITING);
+#else
        if (MovDelay[x][y] % 4 == 3)
        {
          if (element == EL_YAMYAM)
@@ -3061,9 +3024,10 @@ void StartMoving(int x, int y)
          else if (element == EL_DARK_YAMYAM)
            PlaySoundLevel(x, y, SND_DARK_YAMYAM_WAITING);
        }
+#endif
       }
       else if (element == EL_SP_ELECTRON)
-       DrawLevelElementAnimation(x, y, element);
+       ContinueLevelElementAnimation(x, y, element);
       else if (element == EL_DRAGON)
       {
        int i;
@@ -3140,7 +3104,7 @@ void StartMoving(int x, int y)
             IN_LEV_FIELD(newx, newy) &&
             MovDir[x][y] == MV_DOWN && Feld[newx][newy] == EL_ACID)
     {
-      Blurb(x, y);
+      SplashAcid(x, y);
       Store[x][y] = EL_ACID;
     }
     else if (element == EL_PENGUIN && IN_LEV_FIELD(newx, newy))
@@ -3321,11 +3285,11 @@ void StartMoving(int x, int y)
               element == EL_SP_SNIKSNAK || element == EL_MOLE)
        DrawLevelField(x, y);
       else if (element == EL_BD_BUTTERFLY || element == EL_BD_FIREFLY)
-       DrawLevelElementAnimation(x, y, element);
+       ContinueLevelElementAnimation(x, y, element);
       else if (element == EL_SATELLITE)
-       DrawLevelElementAnimation(x, y, element);
+       ContinueLevelElementAnimation(x, y, element);
       else if (element == EL_SP_ELECTRON)
-       DrawLevelElementAnimation(x, y, element);
+       ContinueLevelElementAnimation(x, y, element);
 
       if (DONT_TOUCH(element))
        TestIfBadThingTouchesHero(x, y);
@@ -3461,6 +3425,7 @@ void ContinueMoving(int x, int y)
     MovDelay[newx][newy] = 0;
 
     GfxAction[newx][newy] = GfxAction[x][y];   /* keep action one frame */
+    GfxRandom[newx][newy] = GfxRandom[x][y];   /* keep same random value */
     GfxAction[x][y] = ACTION_DEFAULT;
 
 #if 0
@@ -3999,38 +3964,6 @@ static void StopRobotWheel(int x, int y)
     ZX = ZY = -1;
 }
 
-#if 1
-void RobotWheel(int x, int y)
-{
-  if (!MovDelay[x][y])         /* next animation frame */
-    MovDelay[x][y] = level.time_wheel * FRAMES_PER_SECOND;
-
-  if (MovDelay[x][y])          /* wait some time before next frame */
-  {
-    MovDelay[x][y]--;
-    if (MovDelay[x][y])
-    {
-      if (IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
-      {
-       int frame = getGraphicAnimationFrame(IMG_ROBOT_WHEEL_ACTIVE, -1);
-
-       DrawGraphic(SCREENX(x), SCREENY(y), IMG_ROBOT_WHEEL_ACTIVE, frame);
-      }
-
-      PlaySoundLevel(x, y, SND_ROBOT_WHEEL_ACTIVE);
-
-      return;
-    }
-  }
-
-  Feld[x][y] = EL_ROBOT_WHEEL;
-  DrawLevelField(x, y);
-
-  if (ZX == x && ZY == y)
-    ZX = ZY = -1;
-}
-#endif
-
 static void InitTimegateWheel(int x, int y)
 {
   MovDelay[x][y] = level.time_wheel * FRAMES_PER_SECOND;
@@ -4041,104 +3974,11 @@ static void RunTimegateWheel(int x, int y)
   PlaySoundLevel(x, y, SND_TIMEGATE_SWITCH_ACTIVE);
 }
 
-#if 1
-void TimegateWheel(int x, int y)
-{
-  if (!MovDelay[x][y])         /* next animation frame */
-    MovDelay[x][y] = level.time_wheel * FRAMES_PER_SECOND;
-
-  if (MovDelay[x][y])          /* wait some time before next frame */
-  {
-    MovDelay[x][y]--;
-    if (MovDelay[x][y])
-    {
-      if (IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
-      {
-       int frame = getGraphicAnimationFrame(IMG_TIMEGATE_SWITCH_ACTIVE, -1);
-
-       DrawGraphic(SCREENX(x), SCREENY(y), IMG_TIMEGATE_SWITCH_ACTIVE, frame);
-      }
-
-      PlaySoundLevel(x, y, SND_TIMEGATE_SWITCH_ACTIVE);
-
-      return;
-    }
-  }
-
-  Feld[x][y] = EL_TIMEGATE_SWITCH;
-  DrawLevelField(x, y);
-
-  /* THIS HAS NO EFFECT AT ALL! */
-#if 1
-  /* !!! THIS LOOKS WRONG !!! */
-  if (ZX == x && ZY == y)
-    ZX = ZY = -1;
-#endif
-
-}
-#endif
-
-#if 1
-void NussKnacken(int x, int y)
-{
-  if (!MovDelay[x][y])         /* next animation frame */
-    MovDelay[x][y] = 7;
-
-  if (MovDelay[x][y])          /* wait some time before next frame */
-  {
-    MovDelay[x][y]--;
-    if (MovDelay[x][y])
-    {
-      if (IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
-      {
-       int frame = getGraphicAnimationFrame(IMG_NUT_CRACKING,
-                                            6 - MovDelay[x][y]);
-
-       DrawGraphic(SCREENX(x), SCREENY(y), IMG_NUT_CRACKING, frame);
-      }
-
-      return;
-    }
-  }
-
-  Feld[x][y] = EL_EMERALD;
-  DrawLevelField(x, y);
-}
-#endif
-
-#if 1
-void BreakingPearl(int x, int y)
-{
-  if (!MovDelay[x][y])         /* next animation frame */
-    MovDelay[x][y] = 9;
-
-  if (MovDelay[x][y])          /* wait some time before next frame */
-  {
-    MovDelay[x][y]--;
-    if (MovDelay[x][y])
-    {
-      if (IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
-      {
-       int frame = getGraphicAnimationFrame(IMG_PEARL_BREAKING,
-                                            8 - MovDelay[x][y]);
-
-       DrawGraphic(SCREENX(x), SCREENY(y), IMG_PEARL_BREAKING, frame);
-      }
-
-      return;
-    }
-  }
-
-  Feld[x][y] = EL_EMPTY;
-  DrawLevelField(x, y);
-}
-#endif
-
 void SiebAktivieren(int x, int y, int type)
 {
   int graphic = (type == 1 ? IMG_MAGIC_WALL_FULL : IMG_BD_MAGIC_WALL_FULL);
 
-  DrawLevelGraphicAnimation(x, y, graphic);
+  ContinueLevelGraphicAnimation(x, y, graphic);
 }
 
 void CheckExit(int x, int y)
@@ -4163,169 +4003,6 @@ void CheckExitSP(int x, int y)
   PlaySoundLevelNearest(x, y, SND_SP_EXIT_OPENING);
 }
 
-#if 1
-void AusgangstuerOeffnen(int x, int y)
-{
-  int delay = 6;
-
-  if (!MovDelay[x][y])         /* next animation frame */
-    MovDelay[x][y] = 5 * delay;
-
-  if (MovDelay[x][y])          /* wait some time before next frame */
-  {
-    int tuer;
-
-    MovDelay[x][y]--;
-    tuer = MovDelay[x][y] / delay;
-
-    if (!(MovDelay[x][y] % delay))
-    {
-      if (IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
-      {
-       int frame = getGraphicAnimationFrame(IMG_EXIT_OPENING,
-                                            29 - MovDelay[x][y]);
-
-       DrawGraphic(SCREENX(x), SCREENY(y), IMG_EXIT_OPENING, frame);
-      }
-    }
-
-    if (MovDelay[x][y])
-      return;
-  }
-
-  Feld[x][y] = EL_EXIT_OPEN;
-  DrawLevelField(x, y);
-}
-#endif
-
-#if 1
-void OpenSwitchgate(int x, int y)
-{
-  int delay = 6;
-
-  if (!MovDelay[x][y])         /* next animation frame */
-    MovDelay[x][y] = 5 * delay;
-
-  if (MovDelay[x][y])          /* wait some time before next frame */
-  {
-    MovDelay[x][y]--;
-
-    if (!(MovDelay[x][y] % delay))
-    {
-      if (IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
-      {
-       int frame = getGraphicAnimationFrame(IMG_SWITCHGATE_OPENING,
-                                            29 - MovDelay[x][y]);
-
-       DrawGraphic(SCREENX(x), SCREENY(y), IMG_SWITCHGATE_OPENING, frame);
-      }
-    }
-
-    if (MovDelay[x][y])
-      return;
-  }
-
-  Feld[x][y] = EL_SWITCHGATE_OPEN;
-  DrawLevelField(x, y);
-}
-#endif
-
-#if 1
-void CloseSwitchgate(int x, int y)
-{
-  int delay = 6;
-
-  if (!MovDelay[x][y])         /* next animation frame */
-    MovDelay[x][y] = 5 * delay;
-
-  if (MovDelay[x][y])          /* wait some time before next frame */
-  {
-    MovDelay[x][y]--;
-
-    if (!(MovDelay[x][y] % delay))
-    {
-      if (IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
-      {
-       int frame = getGraphicAnimationFrame(IMG_SWITCHGATE_CLOSING,
-                                            29 - MovDelay[x][y]);
-
-       DrawGraphic(SCREENX(x), SCREENY(y), IMG_SWITCHGATE_CLOSING, frame);
-      }
-    }
-
-    if (MovDelay[x][y])
-      return;
-  }
-
-  Feld[x][y] = EL_SWITCHGATE_CLOSED;
-  DrawLevelField(x, y);
-}
-#endif
-
-#if 1
-void OpenTimegate(int x, int y)
-{
-  int delay = 6;
-
-  if (!MovDelay[x][y])         /* next animation frame */
-    MovDelay[x][y] = 5 * delay;
-
-  if (MovDelay[x][y])          /* wait some time before next frame */
-  {
-    MovDelay[x][y]--;
-
-    if (!(MovDelay[x][y] % delay))
-    {
-      if (IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
-      {
-       int frame = getGraphicAnimationFrame(IMG_TIMEGATE_OPENING,
-                                            29 - MovDelay[x][y]);
-
-       DrawGraphic(SCREENX(x), SCREENY(y), IMG_TIMEGATE_OPENING, frame);
-      }
-    }
-
-    if (MovDelay[x][y])
-      return;
-  }
-
-  Feld[x][y] = EL_TIMEGATE_OPEN;
-  DrawLevelField(x, y);
-}
-#endif
-
-#if 1
-void CloseTimegate(int x, int y)
-{
-  int delay = 6;
-
-  if (!MovDelay[x][y])         /* next animation frame */
-    MovDelay[x][y] = 5 * delay;
-
-  if (MovDelay[x][y])          /* wait some time before next frame */
-  {
-    MovDelay[x][y]--;
-
-    if (!(MovDelay[x][y] % delay))
-    {
-      if (IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
-      {
-       int frame = getGraphicAnimationFrame(IMG_TIMEGATE_CLOSING,
-                                            29 - MovDelay[x][y]);
-
-       DrawGraphic(SCREENX(x), SCREENY(y), IMG_TIMEGATE_CLOSING, frame);
-      }
-    }
-
-    if (MovDelay[x][y])
-      return;
-  }
-
-  Feld[x][y] = EL_TIMEGATE_CLOSED;
-  DrawLevelField(x, y);
-}
-#endif
-
 static void CloseAllOpenTimegates()
 {
   int x, y;
@@ -4634,79 +4311,6 @@ static void WarnBuggyBase(int x, int y)
   }
 }
 
-#if 1
-void CheckBuggyBase(int x, int y)
-{
-  int element = Feld[x][y];
-
-  if (element == EL_SP_BUGGY_BASE)
-  {
-    if (MovDelay[x][y] == 0)   /* wait some time before activating base */
-    {
-      GfxFrame[x][y] = 0;
-
-      InitBuggyBase(x, y);
-    }
-
-    MovDelay[x][y]--;
-
-    if (MovDelay[x][y] != 0)
-    {
-      DrawLevelElementAnimation(x, y, element);
-    }
-    else
-    {
-      Feld[x][y] = EL_SP_BUGGY_BASE_ACTIVATING;
-      DrawLevelField(x, y);
-    }
-  }
-  else if (element == EL_SP_BUGGY_BASE_ACTIVATING)
-  {
-    if (MovDelay[x][y] == 0)   /* display activation warning of buggy base */
-    {
-      GfxFrame[x][y] = 0;
-
-      InitBuggyBase(x, y);
-    }
-
-    MovDelay[x][y]--;
-
-    if (MovDelay[x][y] != 0)
-    {
-      DrawLevelElementAnimation(x, y, element);
-    }
-    else
-    {
-      Feld[x][y] = EL_SP_BUGGY_BASE_ACTIVE;
-      DrawLevelField(x, y);
-    }
-  }
-  else if (element == EL_SP_BUGGY_BASE_ACTIVE)
-  {
-    if (MovDelay[x][y] == 0)   /* start activating buggy base */
-    {
-      GfxFrame[x][y] = 0;
-
-      InitBuggyBase(x, y);
-    }
-
-    MovDelay[x][y]--;
-
-    if (MovDelay[x][y] != 0)
-    {
-      DrawLevelElementAnimation(x, y, element);
-
-      WarnBuggyBase(x, y);
-    }
-    else
-    {
-      Feld[x][y] = EL_SP_BUGGY_BASE;
-      DrawLevelField(x, y);
-    }
-  }
-}
-#endif
-
 static void InitTrap(int x, int y)
 {
   MovDelay[x][y] = 2 * FRAMES_PER_SECOND + RND(5 * FRAMES_PER_SECOND);
@@ -4727,71 +4331,6 @@ static void ChangeActiveTrap(int x, int y)
       DrawCrumbledSand(SCREENX(x), SCREENY(y));
 }
 
-#if 1
-void CheckTrap(int x, int y)
-{
-  int element = Feld[x][y];
-
-  if (element == EL_TRAP)
-  {
-    if (MovDelay[x][y] == 0)   /* wait some time before activating trap */
-      MovDelay[x][y] = 2 * FRAMES_PER_SECOND + RND(5 * FRAMES_PER_SECOND);
-
-    MovDelay[x][y]--;
-
-    if (MovDelay[x][y] != 0)
-    {
-      /* do nothing while waiting */
-    }
-    else
-    {
-      Feld[x][y] = EL_TRAP_ACTIVE;
-      PlaySoundLevel(x, y, SND_TRAP_ACTIVATING);
-    }
-  }
-  else if (element == EL_TRAP_ACTIVE)
-  {
-    int delay = 4;
-    int num_frames = 8;
-
-    if (MovDelay[x][y] == 0)   /* start activating trap */
-    {
-      MovDelay[x][y] = num_frames * delay;
-      GfxFrame[x][y] = 0;
-    }
-
-    MovDelay[x][y]--;
-
-    if (MovDelay[x][y] != 0)
-    {
-      if (DrawLevelElementAnimation(x, y, element))
-       DrawCrumbledSand(SCREENX(x), SCREENY(y));
-    }
-    else
-    {
-      Feld[x][y] = EL_TRAP;
-      DrawLevelField(x, y);
-    }
-  }
-}
-#endif
-
-#if 1
-static void DrawBeltAnimation(int x, int y, int element)
-{
-  int belt_nr = getBeltNrFromBeltActiveElement(element);
-  int belt_dir = game.belt_dir[belt_nr];
-
-  if (belt_dir != MV_NO_MOVING)
-  {
-    DrawLevelElementAnimation(x, y, element);
-
-    if (!(FrameCounter % 2))
-      PlaySoundLevelAction(x, y, ACTION_ACTIVE);
-  }
-}
-#endif
-
 static void ChangeElement(int x, int y)
 {
   int element = Feld[x][y];
@@ -4810,7 +4349,7 @@ static void ChangeElement(int x, int y)
   if (MovDelay[x][y] != 0)             /* continue element change */
   {
     if (IS_ANIMATED(el2img(element)))
-      DrawLevelElementAnimation(x, y, element);
+      ContinueLevelElementAnimation(x, y, element);
 
     if (changing_element[element].change_function)
       changing_element[element].change_function(x, y);
@@ -5110,12 +4649,14 @@ void GameActions()
     element = Feld[x][y];
     graphic = el2img(element);
 
+    SetRandomAnimationValue(x, y);
+
     if (IS_INACTIVE(element))
     {
 
 #if 1
       if (IS_ANIMATED(graphic))
-       DrawLevelGraphicAnimation(x, y, graphic);
+       ContinueLevelGraphicAnimation(x, y, graphic);
 #endif
 
       continue;
@@ -5130,11 +4671,11 @@ void GameActions()
       if (Feld[x][y] == EL_EMERALD &&
          IS_ANIMATED(graphic) &&
          !IS_MOVING(x, y))
-       DrawLevelGraphicAnimation(x, y, graphic);
+       ContinueLevelGraphicAnimation(x, y, graphic);
 #else
       if (IS_ANIMATED(graphic) &&
          !IS_MOVING(x, y))
-       DrawLevelGraphicAnimation(x, y, graphic);
+       ContinueLevelGraphicAnimation(x, y, graphic);
 #endif
 #endif
 
@@ -5152,7 +4693,7 @@ void GameActions()
              element == EL_SHIELD_NORMAL ||
              element == EL_SHIELD_DEADLY) &&
             IS_ANIMATED(graphic))
-      DrawLevelGraphicAnimation(x, y, graphic);
+      ContinueLevelGraphicAnimation(x, y, graphic);
 #endif
 
     else if (IS_MOVING(x, y))
@@ -5181,9 +4722,11 @@ void GameActions()
     else if (element == EL_TIMEGATE_SWITCH_ACTIVE)
       TimegateWheel(x, y);
 #endif
+#if 0
     else if (element == EL_ACID_SPLASH_LEFT ||
             element == EL_ACID_SPLASH_RIGHT)
-      Blurb(x, y);
+      SplashAcid(x, y);
+#endif
 #if 0
     else if (element == EL_NUT_CRACKING)
       NussKnacken(x, y);
@@ -5234,7 +4777,7 @@ void GameActions()
     else if (element == EL_EXPLOSION)
       ;        /* drawing of correct explosion animation is handled separately */
     else if (IS_ANIMATED(graphic))
-      DrawLevelGraphicAnimation(x, y, graphic);
+      ContinueLevelGraphicAnimation(x, y, graphic);
 #endif
 
     if (IS_BELT_ACTIVE(element))
@@ -5588,7 +5131,7 @@ boolean MoveFigureOneStep(struct PlayerInfo *player,
   {
     if (element == EL_ACID && dx == 0 && dy == 1)
     {
-      Blurb(jx, jy);
+      SplashAcid(jx, jy);
       Feld[jx][jy] = EL_PLAYER1;
       InitMovingField(jx, jy, MV_DOWN);
       Store[jx][jy] = EL_ACID;
index 6365f42f26be32f947f1a7bb2029b3deac75c7f2..2f0998ae79618051cb856a06e29f75cbd9daf4cf 100644 (file)
@@ -191,6 +191,9 @@ static void InitArtworkConfig()
   static char *dummy[1] = { NULL };
   int i;
 
+  for (i=0; i<MAX_NUM_ELEMENTS; i++)
+    element_info[i].custom_description = NULL;
+
   for (i=0; i<MAX_NUM_ELEMENTS + 1; i++)
     element_prefix[i] = element_info[i].token_name;
   for (i=0; i<MAX_NUM_ELEMENTS + 1; i++)
@@ -275,6 +278,8 @@ static void InitImages()
 {
   ReloadCustomImages();
   ReinitializeGraphics();
+
+  LoadCustomElementDescriptions();
 }
 
 static void InitSound()
@@ -619,6 +624,8 @@ void ReloadCustomArtwork()
     ReloadCustomImages();
     ReinitializeGraphics();
 
+    LoadCustomElementDescriptions();
+
     FreeTileClipmasks();
     InitTileClipmasks();
 
index 42c7616c03257bef1e575160592782eb89870bdd..1473bc30e95d11935ad0d720bae82af0fd315996 100644 (file)
@@ -442,7 +442,7 @@ char *getPath3(char *path1, char *path2, char *path3)
   return complete_path;
 }
 
-static char *getStringCat2(char *s1, char *s2)
+char *getStringCat2(char *s1, char *s2)
 {
   char *complete_string = checked_malloc(strlen(s1) + strlen(s2) + 1);
 
@@ -1800,7 +1800,7 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info)
   for (i=0; i<num_file_list_entries; i++)
     read_token_parameters(setup_file_list, suffix_list, &file_list[i]);
 
-  /* set some additional tokens to "known" */
+  /* set all known tokens to "known" keyword */
   setTokenValue(setup_file_list, "name", known_token_value);
   setTokenValue(setup_file_list, "sort_priority", known_token_value);
 
index 8ce6b8c190ea86609770c2d6487d3a385f4a4621..21c184df59c689475e25ee45e9f2b658947a4e5d 100644 (file)
@@ -75,6 +75,7 @@ char *getHomeDir(void);
 
 char *getPath2(char *, char *);
 char *getPath3(char *, char *, char*);
+char *getStringCat2(char *, char *);
 char *getStringCopy(char *);
 char *getStringToLower(char *);
 
index 3c4613fbe76f704cb3fce24ca92ec2763e7651ff..301cb271d28c69b065bd17ead43b8b544d3ba4a7 100644 (file)
@@ -37,6 +37,7 @@ struct VideoSystemInfo        video;
 struct AudioSystemInfo audio;
 struct GfxInfo         gfx;
 struct FontInfo                font;
+struct AnimInfo                anim;
 struct ArtworkInfo     artwork;
 struct JoystickInfo    joystick;
 struct SetupInfo       setup;
index 423f49c5d56f1540924991a660d5b679f153a887..0b014e8c268cb239312806696c03dce1db370c2a 100644 (file)
@@ -316,6 +316,11 @@ struct FontInfo
   Bitmap *bitmap_tile;
 };
 
+struct AnimInfo
+{
+  int simple_random_value;
+};
+
 struct JoystickInfo
 {
   int status;
@@ -567,6 +572,7 @@ extern struct VideoSystemInfo       video;
 extern struct AudioSystemInfo  audio;
 extern struct GfxInfo          gfx;
 extern struct FontInfo         font;
+extern struct AnimInfo         anim;
 extern struct ArtworkInfo      artwork;
 extern struct JoystickInfo     joystick;
 extern struct SetupInfo                setup;
index 5dc74a99f6ad5d779ca30d2c01671404add0b0e1..8ecc0d5d6672b1a1181fc4fab9f279763bcaba35 100644 (file)
@@ -64,7 +64,7 @@ int getAnimationFrame(int num_frames, int delay, int mode, int start_frame,
   {
     /* note: expect different frames for the same delay cycle! */
 
-    frame = SimpleRND(num_frames);
+    frame = anim.simple_random_value % num_frames;
   }
 
   if (mode & ANIM_REVERSE)             /* use reverse animation direction */
index df8b8f62724e32b17ce9b35eafefadcb232d1123..f32e6f351ecf9897e5510d01c51e71c466c44253 100644 (file)
@@ -58,7 +58,8 @@ unsigned long         Properties1[MAX_NUM_ELEMENTS];
 unsigned long          Properties2[MAX_NUM_ELEMENTS];
 
 int                    GfxFrame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-short                  GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+int                    GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+int                    GfxRandom[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 
 int                    lev_fieldx, lev_fieldy;
 int                    scroll_x, scroll_y;
index af8c540fbc2b6c52b2f50558abaddea2953fbe54..637d0f6eb75b86e0edf5b313fb701ea00e3078e9 100644 (file)
@@ -1034,6 +1034,7 @@ struct ElementInfo
   char *token_name;            /* element token prefix used in config files */
   char *sound_class_name;      /* classification for custom sound effects */
   char *editor_description;    /* short description for level editor */
+  char *custom_description;    /* custom description for level editor */
 
   int graphic[NUM_ACTIONS];    /* default graphics for several actions */
                                /* special graphics for left/right/up/down */
@@ -1116,7 +1117,8 @@ extern unsigned long              Properties1[MAX_NUM_ELEMENTS];
 extern unsigned long           Properties2[MAX_NUM_ELEMENTS];
 
 extern int                     GfxFrame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short                   GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern int                     GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern int                     GfxRandom[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 
 extern int                     lev_fieldx, lev_fieldy;
 extern int                     scroll_x, scroll_y;
index c67561320bc43da6b4552d4ebac636bc904efc0f..7e24e5016f0ac0dc049e8e2154ae62b1bdddef33 100644 (file)
@@ -455,6 +455,11 @@ static int getGraphicAnimationPhase(int frames, int delay, int mode)
   return phase;
 }
 
+void SetRandomAnimationValue(int x, int y)
+{
+  anim.simple_random_value = GfxRandom[x][y];
+}
+
 inline int getGraphicAnimationFrame(int graphic, int sync_frame)
 {
   /* animation synchronized with global frame counter, not move position */
@@ -497,8 +502,13 @@ inline boolean DrawGraphicAnimation(int x, int y, int graphic)
 {
   int lx = LEVELX(x), ly = LEVELY(y);
 
+#if 0
   if (!checkDrawGraphicAnimation(x, y, graphic))
     return FALSE;
+#else
+  if (!IN_SCR_FIELD(x, y))
+    return FALSE;
+#endif
 
   DrawGraphicAnimationExt(drawto_field, FX + x * TILEX, FY + y * TILEY,
                          graphic, GfxFrame[lx][ly], NO_MASKING);
@@ -517,6 +527,19 @@ boolean DrawLevelElementAnimation(int x, int y, int element)
   return DrawGraphicAnimation(SCREENX(x), SCREENY(y), el2img(element));
 }
 
+inline void ContinueLevelGraphicAnimation(int x, int y, int graphic)
+{
+  if (GfxFrame[x][y] % graphic_info[graphic].anim_delay != 0)
+    return;
+
+  DrawGraphicAnimation(SCREENX(x), SCREENY(y), graphic);
+}
+
+void ContinueLevelElementAnimation(int x, int y, int element)
+{
+  ContinueLevelGraphicAnimation(x, y, el2img(element));
+}
+
 void DrawAllPlayers()
 {
   int i;
@@ -1173,6 +1196,8 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element,
     int move_pos = getFramePosition(ux, uy);
     int gfx_action = getGfxAction(ux, uy);
 
+    SetRandomAnimationValue(ux, uy);
+
     graphic = el_dir_act2img(element, move_dir, gfx_action);
     frame = getGraphicAnimationFrame(graphic, move_pos);
   }
index 63523b49e565b931f54b4585107ea81b87a6d677..4313f9b1e275f6500ad173dda2a9dfb9c109f935 100644 (file)
@@ -70,6 +70,7 @@ void DrawBackground(int, int, int, int);
 void MarkTileDirty(int, int);
 void SetBorderElement();
 
+void SetRandomAnimationValue(int, int);
 int getGraphicAnimationFrame(int, int);
 void DrawGraphicAnimationExt(DrawBuffer *, int, int, int, int, int);
 boolean checkDrawGraphicAnimation(int, int, int);
@@ -77,6 +78,8 @@ boolean checkDrawLevelGraphicAnimation(int, int, int);
 boolean DrawGraphicAnimation(int, int, int);
 boolean DrawLevelGraphicAnimation(int, int, int);
 boolean DrawLevelElementAnimation(int, int, int);
+void ContinueLevelGraphicAnimation(int, int, int);
+void ContinueLevelElementAnimation(int, int, int);
 
 void DrawAllPlayers(void);
 void DrawPlayerField(int, int);