rnd-20030105-1-src
[rocksndiamonds.git] / src / main.h
index 458c7e188ffbceec80a2506a81265b56a2f2fa80..37fcb08bc6ca75734a5f16832f52554813a55bc7 100644 (file)
 #include "conf_gfx.h"
 #include "conf_snd.h"
 
-#define IMG_EMPTY      IMG_EMPTY_SPACE
-#define IMG_SP_EMPTY   IMG_SP_EMPTY_SPACE
-#define IMG_CHAR_START IMG_CHAR_SPACE
+#define IMG_EMPTY              IMG_EMPTY_SPACE
+#define IMG_SP_EMPTY           IMG_SP_EMPTY_SPACE
+#define IMG_CHAR_START         IMG_CHAR_SPACE
+#define IMG_CUSTOM_START       IMG_CUSTOM_0
 
 #define WIN_XSIZE      672
 #define WIN_YSIZE      560
 #define TAPE_IS_STOPPED(x)     (!(x).recording && !(x).playing)
 
 #define PLAYERINFO(x,y)                (&stored_player[StorePlayer[x][y]-EL_PLAYER1])
-#define SHIELD_ON(p)           ((p)->shield_passive_time_left > 0)
+#define SHIELD_ON(p)           ((p)->shield_normal_time_left > 0)
 #define PROTECTED_FIELD(x,y)   (IS_TUBE(Feld[x][y]))
 #define PLAYER_PROTECTED(x,y)  (SHIELD_ON(PLAYERINFO(x, y)) ||         \
                                 PROTECTED_FIELD(x, y))
 
+#define PLAYER_NR_GFX(g,i)     ((g) + i * (IMG_PLAYER2 - IMG_PLAYER1))
+
+
+#if 0
+
+/* Bitmaps with graphic file */
+#define PIX_BACK               0
+#define PIX_DOOR               1
+#define PIX_TOONS              2
+#define PIX_FONT_BIG           3
+#define PIX_FONT_SMALL         4
+#define PIX_FONT_MEDIUM                5
+#define PIX_FONT_EM            6
+/* Bitmaps without graphic file */
+#define PIX_DB_DOOR            7
+#define PIX_DB_FIELD           8
+
+#define NUM_PICTURES           7
+#define NUM_BITMAPS            9
+
+#else
+
 /* Bitmaps with graphic file */
 #define PIX_BACK               0
 #define PIX_ELEMENTS           1
 #define NUM_PICTURES           12
 #define NUM_BITMAPS            14
 
+#endif
+
 /* boundaries of arrays etc. */
 #define MAX_LEVEL_NAME_LEN     32
 #define MAX_LEVEL_AUTHOR_LEN   32
 #define VXSIZE                 DXSIZE
 #define VYSIZE                 100
 #define EXSIZE                 DXSIZE
-#define EYSIZE                 (VXSIZE + 44)
+#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 EL_CHAR_START                  120
 #define EL_CHAR_ASCII0                 (EL_CHAR_START  - 32)
+#define EL_CHAR_ASCII0_START           (EL_CHAR_ASCII0 + 32)
 #define EL_CHAR_EXCLAM                 (EL_CHAR_ASCII0 + 33)
 #define EL_CHAR_QUOTEDBL               (EL_CHAR_ASCII0 + 34)
 #define EL_CHAR_NUMBERSIGN             (EL_CHAR_ASCII0 + 35)
 #define EL_CHAR_OE                     (EL_CHAR_ASCII0 + 92)
 #define EL_CHAR_UE                     (EL_CHAR_ASCII0 + 93)
 #define EL_CHAR_COPYRIGHT              (EL_CHAR_ASCII0 + 94)
+#define EL_CHAR_UNDERSCORE             (EL_CHAR_ASCII0 + 95)
+#define EL_CHAR_EMPTY                  (EL_CHAR_ASCII0 + 96)
+#define EL_CHAR_DEGREE                 (EL_CHAR_ASCII0 + 97)
+#define EL_CHAR_TM                     (EL_CHAR_ASCII0 + 98)
+#define EL_CHAR_CURSOR                 (EL_CHAR_ASCII0 + 99)
+#define EL_CHAR_ASCII0_END             (EL_CHAR_ASCII0 + 111)
 #define EL_CHAR_END                    (EL_CHAR_START  + 79)
 
-#define EL_CHAR(x)                     ((x) == 'Ä' ? EL_CHAR_AE : \
-                                        (x) == 'Ö' ? EL_CHAR_OE : \
-                                        (x) == 'Ü' ? EL_CHAR_UE : \
+#define EL_CHAR(x)                     ((x) == 'Ä' ? EL_CHAR_AE         : \
+                                        (x) == 'Ö' ? EL_CHAR_OE         : \
+                                        (x) == 'Ü' ? EL_CHAR_UE         : \
+                                        (x) == '^' ? EL_CHAR_COPYRIGHT  : \
+                                        (x) == '_' ? EL_CHAR_UNDERSCORE : \
+                                        (x) == '°' ? EL_CHAR_DEGREE     : \
+                                        (x) == '´' ? EL_CHAR_TM         : \
+                                        (x) == '|' ? EL_CHAR_CURSOR     : \
                                         EL_CHAR_A + (x) - 'A')
 
 #define EL_WALL_GROWING_X              200
 #define EL_TRAP                                356
 #define EL_DX_SUPABOMB                 357
 
-#define NUM_FILE_ELEMENTS              358
+#define EL_UNUSED_358                  358
+#define EL_UNUSED_359                  359
+
+#define EL_CUSTOM_START                        360
+#define EL_CUSTOM_0                    (EL_CUSTOM_START + 0)
+#define EL_CUSTOM_31                   (EL_CUSTOM_START + 127)
+#define EL_CUSTOM_END                  (EL_CUSTOM_START + 127)
+
+#define NUM_FILE_ELEMENTS              488
 
 
 /* "real" (and therefore drawable) runtime elements */
 #define EL_TIMEGATE_CLOSING            (EL_FIRST_RUNTIME_REAL + 20)
 #define EL_PEARL_BREAKING              (EL_FIRST_RUNTIME_REAL + 21)
 #define EL_TRAP_ACTIVE                 (EL_FIRST_RUNTIME_REAL + 22)
-#define EL_SPRING_MOVING               (EL_FIRST_RUNTIME_REAL + 23)
-#define EL_SP_MURPHY_CLONE             (EL_FIRST_RUNTIME_REAL + 24)
-#define EL_QUICKSAND_EMPTYING          (EL_FIRST_RUNTIME_REAL + 25)
-#define EL_MAGIC_WALL_EMPTYING         (EL_FIRST_RUNTIME_REAL + 26)
-#define EL_BD_MAGIC_WALL_EMPTYING      (EL_FIRST_RUNTIME_REAL + 27)
-#define EL_AMOEBA_DRIPPING             (EL_FIRST_RUNTIME_REAL + 28)
-#define EL_SP_EXIT_OPEN                        (EL_FIRST_RUNTIME_REAL + 29)
-#define EL_INVISIBLE_STEELWALL_ACTIVE  (EL_FIRST_RUNTIME_REAL + 30)
-#define EL_INVISIBLE_SAND_ACTIVE       (EL_FIRST_RUNTIME_REAL + 31)
-#define EL_INVISIBLE_WALL_ACTIVE       (EL_FIRST_RUNTIME_REAL + 32)
-#define EL_CONVEYOR_BELT1_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 33)
-#define EL_CONVEYOR_BELT1_MIDDLE_ACTIVE        (EL_FIRST_RUNTIME_REAL + 34)
-#define EL_CONVEYOR_BELT1_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 35)
-#define EL_CONVEYOR_BELT2_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 36)
-#define EL_CONVEYOR_BELT2_MIDDLE_ACTIVE        (EL_FIRST_RUNTIME_REAL + 37)
-#define EL_CONVEYOR_BELT2_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 38)
-#define EL_CONVEYOR_BELT3_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 39)
-#define EL_CONVEYOR_BELT3_MIDDLE_ACTIVE        (EL_FIRST_RUNTIME_REAL + 40)
-#define EL_CONVEYOR_BELT3_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 41)
-#define EL_CONVEYOR_BELT4_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 42)
-#define EL_CONVEYOR_BELT4_MIDDLE_ACTIVE        (EL_FIRST_RUNTIME_REAL + 43)
-#define EL_CONVEYOR_BELT4_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 44)
+#define EL_SP_MURPHY_CLONE             (EL_FIRST_RUNTIME_REAL + 23)
+#define EL_QUICKSAND_EMPTYING          (EL_FIRST_RUNTIME_REAL + 24)
+#define EL_MAGIC_WALL_EMPTYING         (EL_FIRST_RUNTIME_REAL + 25)
+#define EL_BD_MAGIC_WALL_EMPTYING      (EL_FIRST_RUNTIME_REAL + 26)
+#define EL_AMOEBA_DRIPPING             (EL_FIRST_RUNTIME_REAL + 27)
+#define EL_SP_EXIT_OPEN                        (EL_FIRST_RUNTIME_REAL + 28)
+#define EL_INVISIBLE_STEELWALL_ACTIVE  (EL_FIRST_RUNTIME_REAL + 29)
+#define EL_INVISIBLE_SAND_ACTIVE       (EL_FIRST_RUNTIME_REAL + 30)
+#define EL_INVISIBLE_WALL_ACTIVE       (EL_FIRST_RUNTIME_REAL + 31)
+#define EL_CONVEYOR_BELT1_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 32)
+#define EL_CONVEYOR_BELT1_MIDDLE_ACTIVE        (EL_FIRST_RUNTIME_REAL + 33)
+#define EL_CONVEYOR_BELT1_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 34)
+#define EL_CONVEYOR_BELT2_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 35)
+#define EL_CONVEYOR_BELT2_MIDDLE_ACTIVE        (EL_FIRST_RUNTIME_REAL + 36)
+#define EL_CONVEYOR_BELT2_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 37)
+#define EL_CONVEYOR_BELT3_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 38)
+#define EL_CONVEYOR_BELT3_MIDDLE_ACTIVE        (EL_FIRST_RUNTIME_REAL + 39)
+#define EL_CONVEYOR_BELT3_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 40)
+#define EL_CONVEYOR_BELT4_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 41)
+#define EL_CONVEYOR_BELT4_MIDDLE_ACTIVE        (EL_FIRST_RUNTIME_REAL + 42)
+#define EL_CONVEYOR_BELT4_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 43)
 
 /* "unreal" (and therefore not drawable) runtime elements */
-#define EL_FIRST_RUNTIME_UNREAL                (EL_FIRST_RUNTIME_REAL + 45)
+#define EL_FIRST_RUNTIME_UNREAL                (EL_FIRST_RUNTIME_REAL + 44)
 
 #define EL_BLOCKED                     (EL_FIRST_RUNTIME_UNREAL + 0)
 #define EL_EXPLOSION                   (EL_FIRST_RUNTIME_UNREAL + 1)
-#define EL_CRACKINGNUT                 (EL_FIRST_RUNTIME_UNREAL + 2)
-#define EL_ACID_SPLASHING_LEFT         (EL_FIRST_RUNTIME_UNREAL + 3)
-#define EL_ACID_SPLASHING_RIGHT                (EL_FIRST_RUNTIME_UNREAL + 4)
+#define EL_NUT_CRACKING                        (EL_FIRST_RUNTIME_UNREAL + 2)
+#define EL_ACID_SPLASH_LEFT            (EL_FIRST_RUNTIME_UNREAL + 3)
+#define EL_ACID_SPLASH_RIGHT           (EL_FIRST_RUNTIME_UNREAL + 4)
 #define EL_AMOEBA_CREATING             (EL_FIRST_RUNTIME_UNREAL + 5)
 #define EL_AMOEBA_SHRINKING            (EL_FIRST_RUNTIME_UNREAL + 6)
 #define EL_WALL_GROWING_ACTIVE         (EL_FIRST_RUNTIME_UNREAL + 7)
 #define GFX_ACTION_PASSING             8
 #define GFX_ACTION_IMPACT              9
 #define GFX_ACTION_CRACKING            10
-#define GFX_ACTION_ACTIVATING          11
-#define GFX_ACTION_EATING              12
-#define GFX_ACTION_ATTACKING           13
-#define GFX_ACTION_GROWING             14
-#define GFX_ACTION_OTHER               15
-
-#define NUM_GFX_ACTIONS                        16
+#define GFX_ACTION_BREAKING            11
+#define GFX_ACTION_ACTIVATING          12
+#define GFX_ACTION_OPENING             13
+#define GFX_ACTION_CLOSING             14
+#define GFX_ACTION_EATING              15
+#define GFX_ACTION_ATTACKING           16
+#define GFX_ACTION_GROWING             17
+#define GFX_ACTION_SHRINKING           18
+#define GFX_ACTION_OTHER               19
+
+#define NUM_GFX_ACTIONS                        20
 #define NUM_GFX_ACTIONS_MAPPED         8
 
 
 #define GFX_ARG_YPOS                           1
 #define GFX_ARG_OFFSET                         2
 #define GFX_ARG_VERTICAL                       3
-#define GFX_ARG_FRAMES                         4
-#define GFX_ARG_DELAY                          5
-#define GFX_ARG_MODE_LOOP                      6
-#define GFX_ARG_MODE_LINEAR                    7
-#define GFX_ARG_MODE_PINGPONG                  8
-#define GFX_ARG_MODE_PINGPONG2                 9
-#define GFX_ARG_MODE_REVERSE                   10
-#define GFX_ARG_GLOBAL_SYNC                    11
+#define GFX_ARG_XOFFSET                                4
+#define GFX_ARG_YOFFSET                                5
+#define GFX_ARG_FRAMES                         6
+#define GFX_ARG_START_FRAME                    7
+#define GFX_ARG_DELAY                          8
+#define GFX_ARG_MODE_LOOP                      9
+#define GFX_ARG_MODE_LINEAR                    10
+#define GFX_ARG_MODE_PINGPONG                  11
+#define GFX_ARG_MODE_PINGPONG2                 12
+#define GFX_ARG_MODE_REVERSE                   13
+#define GFX_ARG_GLOBAL_SYNC                    14
+
+#define NUM_GFX_ARGS                           15
+
+#define GFX_ARG_UNDEFINED                      "-1000000"
+#define GFX_ARG_UNDEFINED_VALUE                        (atoi(GFX_ARG_UNDEFINED))
+
 
 /* values for sound configuration suffixes */
 /* (currently none) */
 #define SETUP                  8
 
 #define PROGRAM_VERSION_MAJOR  2
-#define PROGRAM_VERSION_MINOR  1
-#define PROGRAM_VERSION_PATCH  2
-#define PROGRAM_VERSION_STRING "2.1.2"
+#define PROGRAM_VERSION_MINOR  2
+#define PROGRAM_VERSION_PATCH  0
+#define PROGRAM_VERSION_STRING "2.2.0rc2"
 
 #define PROGRAM_TITLE_STRING   "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING  "Holger Schemel"
@@ -1471,8 +1528,8 @@ struct PlayerInfo
   int key[4];
   int dynamite;
   int dynabomb_count, dynabomb_size, dynabombs_left, dynabomb_xl;
-  int shield_passive_time_left;
-  int shield_active_time_left;
+  int shield_normal_time_left;
+  int shield_deadly_time_left;
 };
 
 struct LevelInfo
@@ -1502,6 +1559,8 @@ struct LevelInfo
   boolean double_speed;
   boolean gravity;
   boolean em_slippery_gems;    /* EM style "gems slip from wall" behaviour */
+
+  boolean no_level_file;
 };
 
 struct TapeInfo
@@ -1521,6 +1580,8 @@ struct TapeInfo
   boolean recording, playing, pausing;
   boolean fast_forward;
   boolean index_search;
+  boolean auto_play;
+  boolean auto_play_level_solved;
   boolean quick_resume;
   boolean single_step;
   boolean changed;
@@ -1557,6 +1618,9 @@ struct GameInfo
 
 struct GlobalInfo
 {
+  char *autoplay_leveldir;
+  int autoplay_level_nr;
+
   float frames_per_second;
   boolean fps_slowdown;
   int fps_slowdown_factor;
@@ -1586,13 +1650,22 @@ struct NewGraphicInfo
   int src_x, src_y;            /* derived from (tile sized) .xpos/.ypos */
   int offset_x, offset_y;      /* x/y offset to next animation frame */
   int anim_frames;
+  int anim_start_frame;
   int anim_delay;              /* important: delay of 1 means "no delay"! */
   int anim_mode;
   boolean anim_global_sync;
+
+#if defined(TARGET_X11_NATIVE)
+  Pixmap clip_mask;            /* single-graphic-only clip mask for X11 */
+  GC clip_gc;                  /* single-graphic-only clip gc for X11 */
+#endif
 };
 
 extern GC              tile_clip_gc;
+#if 0
 extern Bitmap         *pix[];
+#endif
+extern Bitmap         *bitmap_db_field, *bitmap_db_door;
 extern Pixmap          tile_clipmask[];
 extern DrawBuffer      *fieldbuffer;
 extern DrawBuffer      *drawto_field;