rnd-19990610-1-src
[rocksndiamonds.git] / src / tools.c
index 4412ad1f5eeb5c7cef3072f7d1f6e81a50874056..4159ba7e59218f7a3718aa005e0e7c1d243a891e 100644 (file)
@@ -489,7 +489,7 @@ void DrawPlayer(struct PlayerInfo *player)
       DrawLevelElement(last_jx, last_jy, Store[last_jx][last_jy]);
       DrawLevelFieldThruMask(last_jx, last_jy);
     }
-    else if (last_element == EL_DYNAMIT)
+    else if (last_element == EL_DYNAMITE_ACTIVE)
       DrawDynamite(last_jx, last_jy);
     else
       DrawLevelField(last_jx, last_jy);
@@ -518,7 +518,7 @@ void DrawPlayer(struct PlayerInfo *player)
 
   if (Store[jx][jy])
     DrawLevelElement(jx, jy, Store[jx][jy]);
-  else if (element != EL_DYNAMIT && element != EL_DYNABOMB)
+  else if (!IS_ACTIVE_BOMB(element))
     DrawLevelField(jx, jy);
 
   /* draw player himself */
@@ -631,13 +631,13 @@ void DrawPlayer(struct PlayerInfo *player)
     }
   }
 
-  /* draw things in front of player (EL_DYNAMIT or EL_DYNABOMB) */
+  /* draw things in front of player (active dynamite or dynabombs) */
 
-  if (element == EL_DYNAMIT || element == EL_DYNABOMB)
+  if (IS_ACTIVE_BOMB(element))
   {
     graphic = el2gfx(element);
 
-    if (element == EL_DYNAMIT)
+    if (element == EL_DYNAMITE_ACTIVE)
     {
       if ((phase = (96 - MovDelay[jx][jy]) / 12) > 6)
        phase = 6;
@@ -979,6 +979,9 @@ void DrawGraphicShifted(int x,int y, int dx,int dy, int graphic,
   src_pixmap = pix[pixmap_nr];
   drawing_gc = clip_gc[pixmap_nr];
 
+  src_x += cx;
+  src_y += cy;
+
   dest_x = FX + x * TILEX + dx;
   dest_y = FY + y * TILEY + dy;
 
@@ -1110,21 +1113,6 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element,
     }
     else if (element != EL_SP_INFOTRON)
       graphic += phase2;
-
-    /*
-    if (element == EL_SP_ZONK)
-    {
-      if (dir == MV_LEFT)
-       graphic += (4 - phase4) % 4;
-      else if (dir == MV_RIGHT)
-       graphic += phase4;
-      else
-       graphic += phase2 * 2;
-    }
-    else if (element != EL_SP_INFOTRON)
-      graphic += phase2 * (element == EL_FELSBROCKEN ? 2 : 1);
-    */
-
   }
   else if (element == EL_SIEB_LEER || element == EL_SIEB2_LEER ||
           element == EL_SIEB_VOLL || element == EL_SIEB2_VOLL)
@@ -1544,26 +1532,35 @@ static void DrawMicroLevelExt(int xpos, int ypos, int from_x, int from_y)
   redraw_mask |= REDRAW_MICROLEVEL;
 }
 
+#define MICROLABEL_EMPTY               0
+#define MICROLABEL_LEVEL_NAME          1
+#define MICROLABEL_CREATED_BY          2
+#define MICROLABEL_LEVEL_AUTHOR                3
+#define MICROLABEL_IMPORTED_FROM       4
+#define MICROLABEL_LEVEL_IMPORT_INFO   5
+
+#define MAX_MICROLABEL_SIZE            (SXSIZE / FONT4_XSIZE)
+
 static void DrawMicroLevelLabelExt(int mode)
 {
-  char label_text[100];
+  char label_text[MAX_MICROLABEL_SIZE + 1];
 
   XFillRectangle(display, drawto,gc,
                 SX, MICROLABEL_YPOS, SXSIZE, FONT4_YSIZE);
 
-  strcpy(label_text, (mode == 1 ? level.name :
-                     mode == 2 ? "created by" :
-                     mode == 3 ? level.author : ""));
+  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[leveldir_nr].imported_from : ""),
+         MAX_MICROLABEL_SIZE);
+  label_text[MAX_MICROLABEL_SIZE] = '\0';
 
   if (strlen(label_text) > 0)
   {
-    int size, lxpos, lypos;
-
-    label_text[SXSIZE / FONT4_XSIZE] = '\0';
-
-    size = strlen(label_text);
-    lxpos = SX + (SXSIZE - size * FONT4_XSIZE) / 2;
-    lypos = MICROLABEL_YPOS;
+    int lxpos = SX + (SXSIZE - strlen(label_text) * FONT4_XSIZE) / 2;
+    int lypos = MICROLABEL_YPOS;
 
     DrawText(lxpos, lypos, label_text, FS_SMALL, FC_SPECIAL2);
   }
@@ -1642,10 +1639,22 @@ void DrawMicroLevel(int xpos, int ypos, boolean restart)
       strcmp(level.author, leveldir[leveldir_nr].name) != 0 &&
       DelayReached(&label_delay, MICROLEVEL_LABEL_DELAY))
   {
-    label_counter = (label_counter + 1) % 23;
-    label_state = (label_counter >= 0 && label_counter <= 7 ? 1 :
-                  label_counter >= 9 && label_counter <= 12 ? 2 :
-                  label_counter >= 14 && label_counter <= 21 ? 3 : 0);
+    int max_label_counter = 23;
+
+    if (leveldir[leveldir_nr].imported_from != 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 :
+                  label_counter >= 14 && label_counter <= 21 ?
+                  MICROLABEL_LEVEL_AUTHOR :
+                  label_counter >= 23 && label_counter <= 26 ?
+                  MICROLABEL_IMPORTED_FROM :
+                  label_counter >= 28 && label_counter <= 35 ?
+                  MICROLABEL_LEVEL_IMPORT_INFO : MICROLABEL_EMPTY);
     DrawMicroLevelLabelExt(label_state);
   }
 }
@@ -2344,7 +2353,7 @@ int el2gfx(int element)
     case EL_KOKOSNUSS:         return GFX_KOKOSNUSS;
     case EL_LIFE:              return GFX_LIFE;
     case EL_LIFE_ASYNC:                return GFX_LIFE_ASYNC;
-    case EL_DYNAMIT:           return GFX_DYNAMIT;
+    case EL_DYNAMITE_ACTIVE:   return GFX_DYNAMIT;
     case EL_BADEWANNE:         return GFX_BADEWANNE;
     case EL_BADEWANNE1:                return GFX_BADEWANNE1;
     case EL_BADEWANNE2:                return GFX_BADEWANNE2;
@@ -2365,7 +2374,7 @@ int el2gfx(int element)
     case EL_PFORTE2X:          return GFX_PFORTE2X;
     case EL_PFORTE3X:          return GFX_PFORTE3X;
     case EL_PFORTE4X:          return GFX_PFORTE4X;
-    case EL_DYNAMIT_AUS:       return GFX_DYNAMIT_AUS;
+    case EL_DYNAMITE_INACTIVE: return GFX_DYNAMIT_AUS;
     case EL_PACMAN:            return GFX_PACMAN;
     case EL_PACMAN_R:          return GFX_PACMAN_R;
     case EL_PACMAN_O:          return GFX_PACMAN_O;
@@ -2395,7 +2404,10 @@ int el2gfx(int element)
     case EL_SIEB2_LEER:                return GFX_SIEB2_LEER;
     case EL_SIEB2_VOLL:                return GFX_SIEB2_VOLL;
     case EL_SIEB2_TOT:         return GFX_SIEB2_TOT;
-    case EL_DYNABOMB:          return GFX_DYNABOMB;
+    case EL_DYNABOMB_ACTIVE_1: return GFX_DYNABOMB;
+    case EL_DYNABOMB_ACTIVE_2: return GFX_DYNABOMB;
+    case EL_DYNABOMB_ACTIVE_3: return GFX_DYNABOMB;
+    case EL_DYNABOMB_ACTIVE_4: return GFX_DYNABOMB;
     case EL_DYNABOMB_NR:       return GFX_DYNABOMB_NR;
     case EL_DYNABOMB_SZ:       return GFX_DYNABOMB_SZ;
     case EL_DYNABOMB_XL:       return GFX_DYNABOMB_XL;
@@ -2434,6 +2446,53 @@ int el2gfx(int element)
     case EL_EM_KEY_2:          return GFX_EM_KEY_2;
     case EL_EM_KEY_3:          return GFX_EM_KEY_3;
     case EL_EM_KEY_4:          return GFX_EM_KEY_4;
+    case EL_PEARL:             return GFX_PEARL;
+    case EL_CRYSTAL:           return GFX_CRYSTAL;
+    case EL_WALL_PEARL:                return GFX_WALL_PEARL;
+    case EL_WALL_CRYSTAL:      return GFX_WALL_CRYSTAL;
+    case EL_DOOR_WHITE:                return GFX_DOOR_WHITE;
+    case EL_DOOR_WHITE_GRAY:   return GFX_DOOR_WHITE_GRAY;
+    case EL_KEY_WHITE:         return GFX_KEY_WHITE;
+    case EL_FORCE_FIELD:       return GFX_FORCE_FIELD;
+    case EL_EXTRA_TIME:                return GFX_EXTRA_TIME;
+    case EL_SWITCH_GATE_OPEN:  return GFX_SWITCH_GATE_OPEN;
+    case EL_SWITCH_GATE_CLOSED:        return GFX_SWITCH_GATE_CLOSED;
+    case EL_SWITCH_GATE_SWITCH:        return GFX_SWITCH_GATE_SWITCH;
+    case EL_TIME_GATE:         return GFX_TIME_GATE;
+    case EL_TIME_GATE_WHEEL:   return GFX_TIME_GATE_WHEEL;
+    case EL_BELT_GREEN_LEFT:   return GFX_BELT_GREEN_LEFT;
+    case EL_BELT_GREEN_MIDDLE: return GFX_BELT_GREEN_MIDDLE;
+    case EL_BELT_GREEN_RIGHT:  return GFX_BELT_GREEN_RIGHT;
+    case EL_BELT_GREEN_SWITCH: return GFX_BELT_GREEN_SWITCH;
+    case EL_BELT_RED_LEFT:     return GFX_BELT_RED_LEFT;
+    case EL_BELT_RED_MIDDLE:   return GFX_BELT_RED_MIDDLE;
+    case EL_BELT_RED_RIGHT:    return GFX_BELT_RED_RIGHT;
+    case EL_BELT_RED_SWITCH:   return GFX_BELT_RED_SWITCH;
+    case EL_BELT_BLUE_LEFT:    return GFX_BELT_BLUE_LEFT;
+    case EL_BELT_BLUE_MIDDLE:  return GFX_BELT_BLUE_MIDDLE;
+    case EL_BELT_BLUE_RIGHT:   return GFX_BELT_BLUE_RIGHT;
+    case EL_BELT_BLUE_SWITCH:  return GFX_BELT_BLUE_SWITCH;
+    case EL_LANDMINE:          return GFX_LANDMINE;
+    case EL_ENVELOPE:          return GFX_ENVELOPE;
+    case EL_LIGHT_SWITCH:      return GFX_LIGHT_SWITCH;
+    case EL_SIGN_EXCLAMATION:  return GFX_SIGN_EXCLAMATION;
+    case EL_SIGN_RADIOACTIVITY:        return GFX_SIGN_RADIOACTIVITY;
+    case EL_SIGN_STOP:         return GFX_SIGN_STOP;
+    case EL_SIGN_WHEELCHAIR:   return GFX_SIGN_WHEELCHAIR;
+    case EL_SIGN_PARKING:      return GFX_SIGN_PARKING;
+    case EL_SIGN_ONEWAY:       return GFX_SIGN_ONEWAY;
+    case EL_SIGN_HEART:                return GFX_SIGN_HEART;
+    case EL_SIGN_TRIANGLE:     return GFX_SIGN_TRIANGLE;
+    case EL_SIGN_ROUND:                return GFX_SIGN_ROUND;
+    case EL_SIGN_EXIT:         return GFX_SIGN_EXIT;
+    case EL_SIGN_YINYANG:      return GFX_SIGN_YINYANG;
+    case EL_SIGN_OTHER:                return GFX_SIGN_OTHER;
+    case EL_MOLE_LEFT:         return GFX_MOLE_LEFT;
+    case EL_MOLE_RIGHT:                return GFX_MOLE_RIGHT;
+    case EL_MOLE_UP:           return GFX_MOLE_UP;
+    case EL_MOLE_DOWN:         return GFX_MOLE_DOWN;
+    case EL_STEEL_SLANTED:     return GFX_STEEL_SLANTED;
+    case EL_SAND_INVISIBLE:    return GFX_SAND_INVISIBLE;
 
     default:
     {