rnd-20050202-1-src
authorHolger Schemel <info@artsoft.org>
Wed, 2 Feb 2005 02:16:18 +0000 (03:16 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:48:45 +0000 (10:48 +0200)
* fixed bug on level selection screen when dragging scrollbar

ChangeLog
src/conftime.h
src/libgame/gadgets.c
src/libgame/gadgets.h
src/libgame/setup.c
src/libgame/setup.h
src/libgame/system.h
src/main.h
src/screens.c
src/tools.c

index 0b4402a56edc581d2f01023c7eb3097d527e9406..8272f962f5f358aa1a9986d7da923f437e1679bb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2005-02-01
+       * fixed bug on level selection screen when dragging scrollbar
+
 2005-01-19
        * fixed bug which caused broken tapes when appending to EM engine tapes
 
index ef86812f640c4faff87ba6a65a699f7a47c87c4a..cc7d4af4a0aa8e700898ad2a485f87e9d7c262a7 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2005-01-29 01:36]"
+#define COMPILE_DATE_STRING "[2005-02-01 23:09]"
index 57de63e72a36c581eb0a818a86fe301794d1817c..50dc853129dd107128b5a6f103520758cb46c763 100644 (file)
@@ -1316,21 +1316,33 @@ void RemapAllGadgets()
   MultiMapGadgets(MULTIMAP_ALL | MULTIMAP_REMAP);
 }
 
-static boolean anyTextInputGadgetActive()
+boolean anyTextInputGadgetActive()
 {
   return (last_gi && (last_gi->type & GD_TYPE_TEXT_INPUT) && last_gi->mapped);
 }
 
-static boolean anyTextAreaGadgetActive()
+boolean anyTextAreaGadgetActive()
 {
   return (last_gi && (last_gi->type & GD_TYPE_TEXT_AREA) && last_gi->mapped);
 }
 
-static boolean anySelectboxGadgetActive()
+boolean anySelectboxGadgetActive()
 {
   return (last_gi && (last_gi->type & GD_TYPE_SELECTBOX) && last_gi->mapped);
 }
 
+boolean anyScrollbarGadgetActive()
+{
+  return (last_gi && (last_gi->type & GD_TYPE_SCROLLBAR) && last_gi->mapped);
+}
+
+boolean anyTextGadgetActive()
+{
+  return (anyTextInputGadgetActive() ||
+         anyTextAreaGadgetActive() ||
+         anySelectboxGadgetActive());
+}
+
 static boolean insideSelectboxLine(struct GadgetInfo *gi, int mx, int my)
 {
   return(gi != NULL &&
@@ -1347,13 +1359,6 @@ static boolean insideSelectboxArea(struct GadgetInfo *gi, int mx, int my)
         my >= gi->selectbox.y && my < gi->selectbox.y + gi->selectbox.height);
 }
 
-boolean anyTextGadgetActive()
-{
-  return (anyTextInputGadgetActive() ||
-         anyTextAreaGadgetActive() ||
-         anySelectboxGadgetActive());
-}
-
 void ClickOnGadget(struct GadgetInfo *gi, int button)
 {
   if (!gi->mapped)
index ec03d0b724f349a8e65d1c9f27ab36e99e1ac85e..d69c40170c8d65d488dcad56ac876c9415c16961 100644 (file)
@@ -250,6 +250,10 @@ void UnmapGadget(struct GadgetInfo *);
 void UnmapAllGadgets();
 void RemapAllGadgets();
 
+boolean anyTextInputGadgetActive();
+boolean anyTextAreaGadgetActive();
+boolean anySelectboxGadgetActive();
+boolean anyScrollbarGadgetActive();
 boolean anyTextGadgetActive();
 
 void ClickOnGadget(struct GadgetInfo *, int);
index d63bc561997645c6416b1c9746202a55dce411b8..16cb1f0fbd88ad6667b9cd1aeedcce41a65e47f7 100644 (file)
@@ -41,10 +41,11 @@ static char *levelclass_desc[NUM_LEVELCLASS_DESC] =
 
 #define LEVELCOLOR(n)  (IS_LEVELCLASS_TUTORIAL(n) ?            FC_BLUE :    \
                         IS_LEVELCLASS_CLASSICS(n) ?            FC_RED :     \
-                        IS_LEVELCLASS_BD(n) ?                  FC_GREEN :   \
+                        IS_LEVELCLASS_BD(n) ?                  FC_YELLOW :  \
                         IS_LEVELCLASS_EM(n) ?                  FC_YELLOW :  \
-                        IS_LEVELCLASS_SP(n) ?                  FC_GREEN :   \
+                        IS_LEVELCLASS_SP(n) ?                  FC_YELLOW :  \
                         IS_LEVELCLASS_DX(n) ?                  FC_YELLOW :  \
+                        IS_LEVELCLASS_SB(n) ?                  FC_YELLOW :  \
                         IS_LEVELCLASS_CONTRIB(n) ?             FC_GREEN :   \
                         IS_LEVELCLASS_PRIVATE(n) ?             FC_RED :     \
                         FC_BLUE)
@@ -55,14 +56,15 @@ static char *levelclass_desc[NUM_LEVELCLASS_DESC] =
                         IS_LEVELCLASS_EM(n) ?                  3 :     \
                         IS_LEVELCLASS_SP(n) ?                  4 :     \
                         IS_LEVELCLASS_DX(n) ?                  5 :     \
-                        IS_LEVELCLASS_CONTRIB(n) ?             6 :     \
-                        IS_LEVELCLASS_PRIVATE(n) ?             7 :     \
+                        IS_LEVELCLASS_SB(n) ?                  6 :     \
+                        IS_LEVELCLASS_CONTRIB(n) ?             7 :     \
+                        IS_LEVELCLASS_PRIVATE(n) ?             8 :     \
                         9)
 
 #define ARTWORKCOLOR(n)        (IS_ARTWORKCLASS_CLASSICS(n) ?          FC_RED :     \
-                        IS_ARTWORKCLASS_CONTRIB(n) ?           FC_YELLOW :  \
+                        IS_ARTWORKCLASS_CONTRIB(n) ?           FC_GREEN :   \
                         IS_ARTWORKCLASS_PRIVATE(n) ?           FC_RED :     \
-                        IS_ARTWORKCLASS_LEVEL(n) ?             FC_GREEN :   \
+                        IS_ARTWORKCLASS_LEVEL(n) ?             FC_YELLOW :  \
                         FC_BLUE)
 
 #define ARTWORKSORTING(n) (IS_ARTWORKCLASS_CLASSICS(n) ?       0 :     \
@@ -1578,20 +1580,21 @@ void checkSetupFileHashIdentifier(SetupFileHash *setup_file_hash,
 #define LEVELINFO_TOKEN_NAME_SORTING   2
 #define LEVELINFO_TOKEN_AUTHOR         3
 #define LEVELINFO_TOKEN_IMPORTED_FROM  4
-#define LEVELINFO_TOKEN_LEVELS         5
-#define LEVELINFO_TOKEN_FIRST_LEVEL    6
-#define LEVELINFO_TOKEN_SORT_PRIORITY  7
-#define LEVELINFO_TOKEN_LATEST_ENGINE  8
-#define LEVELINFO_TOKEN_LEVEL_GROUP    9
-#define LEVELINFO_TOKEN_READONLY       10
-#define LEVELINFO_TOKEN_GRAPHICS_SET   11
-#define LEVELINFO_TOKEN_SOUNDS_SET     12
-#define LEVELINFO_TOKEN_MUSIC_SET      13
-#define LEVELINFO_TOKEN_FILENAME       14
-#define LEVELINFO_TOKEN_FILETYPE       15
-#define LEVELINFO_TOKEN_HANDICAP       16
-
-#define NUM_LEVELINFO_TOKENS           17
+#define LEVELINFO_TOKEN_IMPORTED_BY    5
+#define LEVELINFO_TOKEN_LEVELS         6
+#define LEVELINFO_TOKEN_FIRST_LEVEL    7
+#define LEVELINFO_TOKEN_SORT_PRIORITY  8
+#define LEVELINFO_TOKEN_LATEST_ENGINE  9
+#define LEVELINFO_TOKEN_LEVEL_GROUP    10
+#define LEVELINFO_TOKEN_READONLY       11
+#define LEVELINFO_TOKEN_GRAPHICS_SET   12
+#define LEVELINFO_TOKEN_SOUNDS_SET     13
+#define LEVELINFO_TOKEN_MUSIC_SET      14
+#define LEVELINFO_TOKEN_FILENAME       15
+#define LEVELINFO_TOKEN_FILETYPE       16
+#define LEVELINFO_TOKEN_HANDICAP       17
+
+#define NUM_LEVELINFO_TOKENS           18
 
 static LevelDirTree ldi;
 
@@ -1603,6 +1606,7 @@ static struct TokenInfo levelinfo_tokens[] =
   { TYPE_STRING,       &ldi.name_sorting,      "name_sorting"  },
   { TYPE_STRING,       &ldi.author,            "author"        },
   { TYPE_STRING,       &ldi.imported_from,     "imported_from" },
+  { TYPE_STRING,       &ldi.imported_by,       "imported_by"   },
   { TYPE_INTEGER,      &ldi.levels,            "levels"        },
   { TYPE_INTEGER,      &ldi.first_level,       "first_level"   },
   { TYPE_INTEGER,      &ldi.sort_priority,     "sort_priority" },
@@ -1652,6 +1656,7 @@ static void setTreeInfoToDefaults(TreeInfo *ldi, int type)
   if (ldi->type == TREE_TYPE_LEVEL_DIR)
   {
     ldi->imported_from = NULL;
+    ldi->imported_by = NULL;
 
     ldi->graphics_set = NULL;
     ldi->sounds_set = NULL;
@@ -1715,6 +1720,7 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent)
   if (ldi->type == TREE_TYPE_LEVEL_DIR)
   {
     ldi->imported_from = getStringCopy(parent->imported_from);
+    ldi->imported_by = getStringCopy(parent->imported_by);
 
     ldi->graphics_set = NULL;
     ldi->sounds_set = NULL;
@@ -1756,6 +1762,7 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent)
   ldi->author = getStringCopy(parent->author);
 
   ldi->imported_from = getStringCopy(parent->imported_from);
+  ldi->imported_by = getStringCopy(parent->imported_by);
   ldi->class_desc = getStringCopy(parent->class_desc);
 
   ldi->graphics_set = NULL;
@@ -1792,6 +1799,7 @@ static void freeTreeInfo(TreeInfo *ldi)
   if (ldi->type == TREE_TYPE_LEVEL_DIR)
   {
     checked_free(ldi->imported_from);
+    checked_free(ldi->imported_by);
 
     checked_free(ldi->graphics_set);
     checked_free(ldi->sounds_set);
@@ -2639,6 +2647,7 @@ static void SaveUserLevelInfo()
     if (i != LEVELINFO_TOKEN_IDENTIFIER &&
        i != LEVELINFO_TOKEN_NAME_SORTING &&
        i != LEVELINFO_TOKEN_IMPORTED_FROM &&
+       i != LEVELINFO_TOKEN_IMPORTED_BY &&
        i != LEVELINFO_TOKEN_FILENAME &&
        i != LEVELINFO_TOKEN_FILETYPE)
       fprintf(file, "%s\n", getSetupLine(levelinfo_tokens, "", i));
index 6e0636ea2a0d99f035f82722866d904cf3c2cec5..67a4c28287dc997a173b487e758dcc71a96cd805 100644 (file)
@@ -103,9 +103,11 @@ typedef struct hashtable     SetupFileHash;
 #define LEVELCLASS_SP_END              699
 #define LEVELCLASS_DX_START            700
 #define LEVELCLASS_DX_END              799
+#define LEVELCLASS_SB_START            800
+#define LEVELCLASS_SB_END              899
 
 #define LEVELCLASS_PREDEFINED_START    LEVELCLASS_TUTORIAL_START
-#define LEVELCLASS_PREDEFINED_END      LEVELCLASS_DX_END
+#define LEVELCLASS_PREDEFINED_END      LEVELCLASS_SB_END
 
 #define LEVELCLASS_TUTORIAL            LEVELCLASS_TUTORIAL_START
 #define LEVELCLASS_CLASSICS            LEVELCLASS_CLASSICS_START
@@ -115,6 +117,7 @@ typedef struct hashtable     SetupFileHash;
 #define LEVELCLASS_EM                  LEVELCLASS_EM_START
 #define LEVELCLASS_SP                  LEVELCLASS_SP_START
 #define LEVELCLASS_DX                  LEVELCLASS_DX_START
+#define LEVELCLASS_SB                  LEVELCLASS_SB_START
 
 #define LEVELCLASS_UNDEFINED           999
 
@@ -142,6 +145,9 @@ typedef struct hashtable     SetupFileHash;
 #define IS_LEVELCLASS_DX(p)                                            \
        ((p)->sort_priority >= LEVELCLASS_DX_START &&                   \
         (p)->sort_priority <= LEVELCLASS_DX_END)
+#define IS_LEVELCLASS_SB(p)                                            \
+       ((p)->sort_priority >= LEVELCLASS_SB_START &&                   \
+        (p)->sort_priority <= LEVELCLASS_SB_END)
 #define IS_LEVELCLASS_UNDEFINED(p)                                     \
        ((p)->sort_priority < LEVELCLASS_PREDEFINED_START ||            \
         (p)->sort_priority > LEVELCLASS_PREDEFINED_END)
@@ -154,6 +160,7 @@ typedef struct hashtable     SetupFileHash;
                         IS_LEVELCLASS_EM(n) ? LEVELCLASS_EM :             \
                         IS_LEVELCLASS_SP(n) ? LEVELCLASS_SP :             \
                         IS_LEVELCLASS_DX(n) ? LEVELCLASS_DX :             \
+                        IS_LEVELCLASS_SB(n) ? LEVELCLASS_SB :             \
                         LEVELCLASS_UNDEFINED)
 
 /* sort priorities of artwork */
index 98b508606d7d85f33b6126edff2e335eef30eae5..c0fc43600c3cec35618f05c17ba64fae3c7eefee 100644 (file)
@@ -640,6 +640,7 @@ struct TreeInfo
   char *name_sorting;  /* optional sorting name for correct name sorting */
   char *author;                /* level or artwork author name */
   char *imported_from; /* optional comment for imported levels or artwork */
+  char *imported_by;   /* optional comment for imported levels or artwork */
 
   char *graphics_set;  /* optional custom graphics set (level tree only) */
   char *sounds_set;    /* optional custom sounds set (level tree only) */
index d6124be35ef2f7caa1c6497bda231dde00583f10..e16c8b6795fd22f4a06a3614f14b35db7efed84e 100644 (file)
 #define EYSIZE                 (VYSIZE + 44)
 #define FULL_SXSIZE            (2 + SXSIZE + 2)
 #define FULL_SYSIZE            (2 + SYSIZE + 2)
-#define MICROLEV_XSIZE         ((STD_LEV_FIELDX + 2) * MICRO_TILEX)
-#define MICROLEV_YSIZE         ((STD_LEV_FIELDY + 2) * MICRO_TILEY)
-#define MICROLEV_XPOS          (SX + (SXSIZE - MICROLEV_XSIZE) / 2)
-#define MICROLEV_YPOS          (SX + 12 * TILEY - MICRO_TILEY)
-#define MICROLABEL_YPOS                (MICROLEV_YPOS + MICROLEV_YSIZE + 7)
+#define MICROLEVEL_XSIZE       ((STD_LEV_FIELDX + 2) * MICRO_TILEX)
+#define MICROLEVEL_YSIZE       ((STD_LEV_FIELDY + 2) * MICRO_TILEY)
+#define MICROLEVEL_XPOS                (SX + (SXSIZE - MICROLEVEL_XSIZE) / 2)
+#define MICROLEVEL_YPOS                (SX + 12 * TILEY - MICRO_TILEY)
+#define MICROLABEL1_YPOS       (MICROLEVEL_YPOS - 36)
+#define MICROLABEL2_YPOS       (MICROLEVEL_YPOS + MICROLEVEL_YSIZE + 7)
 
 
 /* score for elements */
index d6c84d81a4495eb03e19eedd99ae849bfc2c4cf2..6e48ea83955fab48cdd92f65c20050a10fbef4b9 100644 (file)
@@ -308,7 +308,7 @@ void DrawMainMenu()
   DrawText(mSX + level_width + 5 * 32, mSY + 3*32, int2str(level_nr,3),
           FONT_VALUE_1);
 
-  DrawMicroLevel(MICROLEV_XPOS, MICROLEV_YPOS, TRUE);
+  DrawMicroLevel(MICROLEVEL_XPOS, MICROLEVEL_YPOS, TRUE);
 
   DrawTextF(mSX + 32 + level_width - 2, mSY + 3*32 + 1, FONT_TEXT_3, "%d-%d",
            leveldir_current->first_level, leveldir_current->last_level);
@@ -427,7 +427,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
               FONT_VALUE_1);
 
       LoadLevel(level_nr);
-      DrawMicroLevel(MICROLEV_XPOS, MICROLEV_YPOS, TRUE);
+      DrawMicroLevel(MICROLEVEL_XPOS, MICROLEVEL_YPOS, TRUE);
 
       TapeErase();
       LoadTape(level_nr);
@@ -524,7 +524,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
 
   if (game_status == GAME_MODE_MAIN)
   {
-    DrawMicroLevel(MICROLEV_XPOS, MICROLEV_YPOS, FALSE);
+    DrawMicroLevel(MICROLEVEL_XPOS, MICROLEVEL_YPOS, FALSE);
     DoAnimation();
   }
 }
@@ -1481,6 +1481,7 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
   int num_entries = numTreeInfoInGroup(ti);
   int num_page_entries;
   int last_game_status = game_status;  /* save current game status */
+  boolean position_set_by_scrollbar = (dx == 999);
 
   /* force LEVELS draw offset on choose level and artwork setup screen */
   game_status = GAME_MODE_LEVELS;
@@ -1512,7 +1513,7 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
       ti->cl_cursor = entry_pos - ti->cl_first;
     }
 
-    if (dx == 999)     /* first entry is set by scrollbar position */
+    if (position_set_by_scrollbar)
       ti->cl_first = dy;
     else
       AdjustChooseTreeScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL,
@@ -1634,7 +1635,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
     return;
   }
 
-  if (IN_VIS_FIELD(x, y) &&
+  if (!anyScrollbarGadgetActive() &&
+      IN_VIS_FIELD(x, y) &&
       mx < screen_gadget[SCREEN_CTRL_ID_SCROLL_VERTICAL]->x &&
       y >= 0 && y < num_page_entries)
   {
index 3e346c882c4e4c8d231d57e3ecad6ea162dabd11..794de36ea7f860ad80e9e5c06cd3f3767ec9f79b 100644 (file)
@@ -1509,7 +1509,7 @@ static void DrawMicroLevelExt(int xpos, int ypos, int from_x, int from_y)
 {
   int x, y;
 
-  DrawBackground(xpos, ypos, MICROLEV_XSIZE, MICROLEV_YSIZE);
+  DrawBackground(xpos, ypos, MICROLEVEL_XSIZE, MICROLEVEL_YSIZE);
 
   if (lev_fieldx < STD_LEV_FIELDX)
     xpos += (STD_LEV_FIELDX - lev_fieldx) / 2 * MICRO_TILEX;
@@ -1540,10 +1540,12 @@ static void DrawMicroLevelExt(int xpos, int ypos, int from_x, int from_y)
 
 #define MICROLABEL_EMPTY               0
 #define MICROLABEL_LEVEL_NAME          1
-#define MICROLABEL_CREATED_BY          2
+#define MICROLABEL_LEVEL_AUTHOR_HEAD   2
 #define MICROLABEL_LEVEL_AUTHOR                3
-#define MICROLABEL_IMPORTED_FROM       4
-#define MICROLABEL_LEVEL_IMPORT_INFO   5
+#define MICROLABEL_IMPORTED_FROM_HEAD  4
+#define MICROLABEL_IMPORTED_FROM       5
+#define MICROLABEL_IMPORTED_BY_HEAD    6
+#define MICROLABEL_IMPORTED_BY         7
 
 static void DrawMicroLevelLabelExt(int mode)
 {
@@ -1551,26 +1553,30 @@ static void DrawMicroLevelLabelExt(int mode)
   int max_len_label_text;
   int font_nr = FONT_TEXT_2;
 
-  if (mode == MICROLABEL_CREATED_BY || mode == MICROLABEL_IMPORTED_FROM)
+  if (mode == MICROLABEL_LEVEL_AUTHOR_HEAD ||
+      mode == MICROLABEL_IMPORTED_FROM_HEAD ||
+      mode == MICROLABEL_IMPORTED_BY_HEAD)
     font_nr = FONT_TEXT_3;
 
   max_len_label_text = SXSIZE / getFontWidth(font_nr);
 
-  DrawBackground(SX, MICROLABEL_YPOS, SXSIZE, getFontHeight(font_nr));
+  DrawBackground(SX, MICROLABEL2_YPOS, SXSIZE, getFontHeight(font_nr));
 
-  strncpy(label_text, (mode == MICROLABEL_LEVEL_NAME ? level.name :
-                      mode == MICROLABEL_CREATED_BY ? "created by" :
-                      mode == MICROLABEL_LEVEL_AUTHOR ? level.author :
-                      mode == MICROLABEL_IMPORTED_FROM ? "imported from" :
-                      mode == MICROLABEL_LEVEL_IMPORT_INFO ?
-                      leveldir_current->imported_from : ""),
+  strncpy(label_text,
+         (mode == MICROLABEL_LEVEL_NAME ? level.name :
+          mode == MICROLABEL_LEVEL_AUTHOR_HEAD ? "created by" :
+          mode == MICROLABEL_LEVEL_AUTHOR ? level.author :
+          mode == MICROLABEL_IMPORTED_FROM_HEAD ? "imported from" :
+          mode == MICROLABEL_IMPORTED_FROM ? leveldir_current->imported_from :
+          mode == MICROLABEL_IMPORTED_BY_HEAD ? "imported by" :
+          mode == MICROLABEL_IMPORTED_BY ? leveldir_current->imported_by :""),
          max_len_label_text);
   label_text[max_len_label_text] = '\0';
 
   if (strlen(label_text) > 0)
   {
     int lxpos = SX + (SXSIZE - getTextWidth(label_text, font_nr)) / 2;
-    int lypos = MICROLABEL_YPOS;
+    int lypos = MICROLABEL2_YPOS;
 
     DrawText(lxpos, lypos, label_text, font_nr);
   }
@@ -1605,11 +1611,18 @@ void DrawMicroLevel(int xpos, int ypos, boolean restart)
 
     if (leveldir_current->name)
     {
-      int text_width = getTextWidth(leveldir_current->name, FONT_TEXT_1);
-      int lxpos = SX + (SXSIZE - text_width) / 2;
-      int lypos = SY + 352;
+      char label_text[MAX_OUTPUT_LINESIZE + 1];
+      int font_nr = FONT_TEXT_1;
+      int max_len_label_text = SXSIZE / getFontWidth(font_nr);
+      int lxpos, lypos;
 
-      DrawText(lxpos, lypos, leveldir_current->name, FONT_TEXT_1);
+      strncpy(label_text, leveldir_current->name, max_len_label_text);
+      label_text[max_len_label_text] = '\0';
+
+      lxpos = SX + (SXSIZE - getTextWidth(label_text, font_nr)) / 2;
+      lypos = SY + MICROLABEL1_YPOS;
+
+      DrawText(lxpos, lypos, label_text, font_nr);
     }
 
     game_status = last_game_status;    /* restore current game status */
@@ -1658,6 +1671,7 @@ void DrawMicroLevel(int xpos, int ypos, boolean restart)
     DrawMicroLevelExt(xpos, ypos, from_x, from_y);
   }
 
+  /* !!! THIS ALL SUCKS -- SHOULD BE CLEANLY REWRITTEN !!! */
   /* redraw micro level label, if needed */
   if (strcmp(level.name, NAMELESS_LEVEL_NAME) != 0 &&
       strcmp(level.author, ANONYMOUS_NAME) != 0 &&
@@ -1668,18 +1682,31 @@ void DrawMicroLevel(int xpos, int ypos, boolean restart)
 
     if (leveldir_current->imported_from != NULL)
       max_label_counter += 14;
+    if (leveldir_current->imported_by != NULL)
+      max_label_counter += 14;
 
     label_counter = (label_counter + 1) % max_label_counter;
     label_state = (label_counter >= 0 && label_counter <= 7 ?
                   MICROLABEL_LEVEL_NAME :
                   label_counter >= 9 && label_counter <= 12 ?
-                  MICROLABEL_CREATED_BY :
+                  MICROLABEL_LEVEL_AUTHOR_HEAD :
                   label_counter >= 14 && label_counter <= 21 ?
                   MICROLABEL_LEVEL_AUTHOR :
                   label_counter >= 23 && label_counter <= 26 ?
-                  MICROLABEL_IMPORTED_FROM :
+                  MICROLABEL_IMPORTED_FROM_HEAD :
                   label_counter >= 28 && label_counter <= 35 ?
-                  MICROLABEL_LEVEL_IMPORT_INFO : MICROLABEL_EMPTY);
+                  MICROLABEL_IMPORTED_FROM :
+                  label_counter >= 37 && label_counter <= 40 ?
+                  MICROLABEL_IMPORTED_BY_HEAD :
+                  label_counter >= 42 && label_counter <= 49 ?
+                  MICROLABEL_IMPORTED_BY : MICROLABEL_EMPTY);
+
+    if (leveldir_current->imported_from == NULL &&
+       (label_state == MICROLABEL_IMPORTED_FROM_HEAD ||
+        label_state == MICROLABEL_IMPORTED_FROM))
+      label_state = (label_state == MICROLABEL_IMPORTED_FROM_HEAD ?
+                    MICROLABEL_IMPORTED_BY_HEAD : MICROLABEL_IMPORTED_BY);
+
     DrawMicroLevelLabelExt(label_state);
   }