rnd-20040928-1-src
[rocksndiamonds.git] / src / main.h
index 7b7342e9f274b304a9ac832169a845cda25efef7..d5afcf7211c8e0d9ae8cf530fe4dcf9cce9e7be3 100644 (file)
@@ -23,6 +23,7 @@
 #include <fcntl.h>
 
 #include "libgame/libgame.h"
+#include "game_em/game_em.h"
 
 #include "conf_gfx.h"  /* include auto-generated data structure definitions */
 #include "conf_snd.h"  /* include auto-generated data structure definitions */
@@ -74,9 +75,9 @@
 #define EP_CAN_SMASH_PLAYER    10
 #define EP_CAN_SMASH_ENEMIES   11
 #define EP_CAN_SMASH_EVERYTHING        12
-#define EP_CAN_EXPLODE_BY_FIRE 13
-#define EP_CAN_EXPLODE_SMASHED 14
-#define EP_CAN_EXPLODE_IMPACT  15
+#define EP_EXPLODES_BY_FIRE    13
+#define EP_EXPLODES_SMASHED    14
+#define EP_EXPLODES_IMPACT     15
 #define EP_WALKABLE_OVER       16
 #define EP_WALKABLE_INSIDE     17
 #define EP_WALKABLE_UNDER      18
 #define EP_PASSABLE_INSIDE     20
 #define EP_PASSABLE_UNDER      21
 #define EP_DROPPABLE           22
-#define EP_CAN_EXPLODE_1X1     23
+#define EP_EXPLODES_1X1_OLD    23
 #define EP_PUSHABLE            24
-#define EP_CAN_EXPLODE_CROSS   25
+#define EP_EXPLODES_CROSS_OLD  25
 #define EP_PROTECTED           26
 #define EP_CAN_MOVE_INTO_ACID  27
 #define EP_THROWABLE           28
+#define EP_CAN_EXPLODE         29
+#define EP_GRAVITY_REACHABLE   30
 
 /* values for pre-defined properties */
 #define EP_PLAYER              32
 #define EP_DRAGONFIRE_PROOF    69
 #define EP_EXPLOSION_PROOF     70
 #define EP_CAN_SMASH           71
-#define EP_CAN_EXPLODE         72
-#define EP_CAN_EXPLODE_3X3     73
-#define EP_SP_PORT             74
-#define EP_CAN_EXPLODE_BY_DRAGONFIRE   75
-#define EP_CAN_EXPLODE_BY_EXPLOSION    76
-#define EP_COULD_MOVE_INTO_ACID                77
-#define EP_MAYBE_DONT_COLLIDE_WITH     78
+#define EP_EXPLODES_3X3_OLD    72
+#define EP_CAN_EXPLODE_BY_FIRE 73
+#define EP_CAN_EXPLODE_SMASHED 74
+#define EP_CAN_EXPLODE_IMPACT  75
+#define EP_SP_PORT             76
+#define EP_CAN_EXPLODE_BY_DRAGONFIRE   77
+#define EP_CAN_EXPLODE_BY_EXPLOSION    78
+#define EP_COULD_MOVE_INTO_ACID                79
+#define EP_MAYBE_DONT_COLLIDE_WITH     80
 
 /* values for internal purpose only (level editor) */
-#define EP_EXPLODE_RESULT      79
-#define EP_WALK_TO_OBJECT      80
-#define EP_DEADLY              81
+#define EP_WALK_TO_OBJECT      81
+#define EP_DEADLY              82
 
-#define NUM_ELEMENT_PROPERTIES 82
+#define NUM_ELEMENT_PROPERTIES 83
 
 #define NUM_EP_BITFIELDS       ((NUM_ELEMENT_PROPERTIES + 31) / 32)
 #define EP_BITFIELD_BASE       0
 #define SLIPPERY_ONLY_LEFT     3
 #define SLIPPERY_ONLY_RIGHT    4
 
+/* values for explosion type for custom elements */
+#define EXPLODES_3X3           0
+#define EXPLODES_1X1           1
+#define EXPLODES_CROSS         2
+
 /* macros for configurable properties */
 #define IS_DIGGABLE(e)         HAS_PROPERTY(e, EP_DIGGABLE)
 #define IS_COLLECTIBLE_ONLY(e) HAS_PROPERTY(e, EP_COLLECTIBLE_ONLY)
 #define CAN_SMASH_PLAYER(e)    HAS_PROPERTY(e, EP_CAN_SMASH_PLAYER)
 #define CAN_SMASH_ENEMIES(e)   HAS_PROPERTY(e, EP_CAN_SMASH_ENEMIES)
 #define CAN_SMASH_EVERYTHING(e)        HAS_PROPERTY(e, EP_CAN_SMASH_EVERYTHING)
-#define CAN_EXPLODE_BY_FIRE(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_BY_FIRE)
-#define CAN_EXPLODE_SMASHED(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_SMASHED)
-#define CAN_EXPLODE_IMPACT(e)  HAS_PROPERTY(e, EP_CAN_EXPLODE_IMPACT)
+#define EXPLODES_BY_FIRE(e)    HAS_PROPERTY(e, EP_EXPLODES_BY_FIRE)
+#define EXPLODES_SMASHED(e)    HAS_PROPERTY(e, EP_EXPLODES_SMASHED)
+#define EXPLODES_IMPACT(e)     HAS_PROPERTY(e, EP_EXPLODES_IMPACT)
 #define IS_WALKABLE_OVER(e)    HAS_PROPERTY(e, EP_WALKABLE_OVER)
 #define IS_WALKABLE_INSIDE(e)  HAS_PROPERTY(e, EP_WALKABLE_INSIDE)
 #define IS_WALKABLE_UNDER(e)   HAS_PROPERTY(e, EP_WALKABLE_UNDER)
 #define IS_PASSABLE_INSIDE(e)  HAS_PROPERTY(e, EP_PASSABLE_INSIDE)
 #define IS_PASSABLE_UNDER(e)   HAS_PROPERTY(e, EP_PASSABLE_UNDER)
 #define IS_DROPPABLE(e)                HAS_PROPERTY(e, EP_DROPPABLE)
-#define CAN_EXPLODE_1X1(e)     HAS_PROPERTY(e, EP_CAN_EXPLODE_1X1)
+#define EXPLODES_1X1_OLD(e)    HAS_PROPERTY(e, EP_EXPLODES_1X1_OLD)
 #define IS_PUSHABLE(e)         HAS_PROPERTY(e, EP_PUSHABLE)
-#define CAN_EXPLODE_CROSS(e)   HAS_PROPERTY(e, EP_CAN_EXPLODE_CROSS)
+#define EXPLODES_CROSS_OLD(e)  HAS_PROPERTY(e, EP_EXPLODES_CROSS_OLD)
 #define IS_PROTECTED(e)                HAS_PROPERTY(e, EP_PROTECTED)
 #define CAN_MOVE_INTO_ACID(e)  HAS_PROPERTY(e, EP_CAN_MOVE_INTO_ACID)
 #define IS_THROWABLE(e)                HAS_PROPERTY(e, EP_THROWABLE)
+#define CAN_EXPLODE(e)         HAS_PROPERTY(e, EP_CAN_EXPLODE)
+#define IS_GRAVITY_REACHABLE(e)        HAS_PROPERTY(e, EP_GRAVITY_REACHABLE)
 
 /* macros for special configurable properties */
 #define IS_EM_SLIPPERY_WALL(e) HAS_PROPERTY(e, EP_EM_SLIPPERY_WALL)
 #define IS_DRAGONFIRE_PROOF(e) HAS_PROPERTY(e, EP_DRAGONFIRE_PROOF)
 #define IS_EXPLOSION_PROOF(e)  HAS_PROPERTY(e, EP_EXPLOSION_PROOF)
 #define CAN_SMASH(e)           HAS_PROPERTY(e, EP_CAN_SMASH)
-#define CAN_EXPLODE(e)         HAS_PROPERTY(e, EP_CAN_EXPLODE)
-#define CAN_EXPLODE_3X3(e)     HAS_PROPERTY(e, EP_CAN_EXPLODE_3X3)
+#define EXPLODES_3X3_OLD(e)    HAS_PROPERTY(e, EP_EXPLODES_3X3_OLD)
+#define CAN_EXPLODE_BY_FIRE(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_BY_FIRE)
+#define CAN_EXPLODE_SMASHED(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_SMASHED)
+#define CAN_EXPLODE_IMPACT(e)  HAS_PROPERTY(e, EP_CAN_EXPLODE_IMPACT)
 #define IS_SP_PORT(e)          HAS_PROPERTY(e, EP_SP_PORT)
 #define CAN_EXPLODE_BY_DRAGONFIRE(e)   \
                                HAS_PROPERTY(e, EP_CAN_EXPLODE_BY_DRAGONFIRE)
 #define CAN_EXPLODE_BY_EXPLOSION(e)    \
                                HAS_PROPERTY(e, EP_CAN_EXPLODE_BY_EXPLOSION)
 #define COULD_MOVE_INTO_ACID(e)        HAS_PROPERTY(e, EP_COULD_MOVE_INTO_ACID)
-#define MAYBE_DONT_COLLIDE_WITH(e)  HAS_PROPERTY(e, EP_MAYBE_DONT_COLLIDE_WITH)
+#define MAYBE_DONT_COLLIDE_WITH(e) HAS_PROPERTY(e, EP_MAYBE_DONT_COLLIDE_WITH)
 
 /* special macros used in game engine */
 #define IS_CUSTOM_ELEMENT(e)   ((e) >= EL_CUSTOM_START &&              \
 #define GFX_ELEMENT(e)         (element_info[e].use_gfx_element ?      \
                                 element_info[e].gfx_element : e)
 
+/* !!! "use sound" deactivated due to problems with level "bug machine" !!! */
+/* (solution: add separate "use sound of element" to level file and editor) */
+#if 0
+#define SND_ELEMENT(e)         GFX_ELEMENT(e)
+#else
+#define SND_ELEMENT(e)         (e)
+#endif
+
 #define IS_PLAYER(x, y)                (ELEM_IS_PLAYER(StorePlayer[x][y]))
 
 #define IS_FREE(x, y)          (Feld[x][y] == EL_EMPTY && !IS_PLAYER(x, y))
 #define EL_TRIGGER_ELEMENT             657
 #define EL_TRIGGER_PLAYER              658
 
-#define NUM_FILE_ELEMENTS              659
+#define EL_SP_GRAVITY_ON_PORT_RIGHT    659
+#define EL_SP_GRAVITY_ON_PORT_DOWN     660
+#define EL_SP_GRAVITY_ON_PORT_LEFT     661
+#define EL_SP_GRAVITY_ON_PORT_UP       662
+#define EL_SP_GRAVITY_OFF_PORT_RIGHT   663
+#define EL_SP_GRAVITY_OFF_PORT_DOWN    664
+#define EL_SP_GRAVITY_OFF_PORT_LEFT    665
+#define EL_SP_GRAVITY_OFF_PORT_UP      666
+
+
+/* the following EMC style elements are currently not implemented in R'n'D */
+#define EL_BALLOON_SWITCH_NONE         667
+#define EL_EMC_LEVEL_BORDER            668
+#define EL_EMC_ANDROID                 669
+#define EL_EMC_ANDROID_RIGHT           670
+#define EL_EMC_ANDROID_UP              671
+#define EL_EMC_ANDROID_LEFT            672
+#define EL_EMC_ANDROID_DOWN            673
+#define EL_EMC_ANDROID_LEFT_UP         674
+#define EL_EMC_ANDROID_LEFT_DOWN       675
+#define EL_EMC_ANDROID_RIGHT_UP                676
+#define EL_EMC_ANDROID_RIGHT_DOWN      677
+#define EL_EMC_GRASS                   678
+#define EL_EMC_GENERATOR_BALL          679
+#define EL_EMC_GATE_1                  680
+#define EL_EMC_GATE_2                  681
+#define EL_EMC_GATE_3                  682
+#define EL_EMC_GATE_4                  683
+#define EL_EMC_GATE_5                  684
+#define EL_EMC_GATE_6                  685
+#define EL_EMC_GATE_7                  686
+#define EL_EMC_GATE_8                  687
+#define EL_EMC_GATE_1_GRAY             688
+#define EL_EMC_GATE_2_GRAY             689
+#define EL_EMC_GATE_3_GRAY             690
+#define EL_EMC_GATE_4_GRAY             691
+#define EL_EMC_GATE_5_GRAY             692
+#define EL_EMC_GATE_6_GRAY             693
+#define EL_EMC_GATE_7_GRAY             694
+#define EL_EMC_GATE_8_GRAY             695
+#define EL_EMC_KEY_1                   696
+#define EL_EMC_KEY_2                   697
+#define EL_EMC_KEY_3                   698
+#define EL_EMC_KEY_4                   799
+#define EL_EMC_KEY_5                   700
+#define EL_EMC_KEY_6                   701
+#define EL_EMC_KEY_7                   702
+#define EL_EMC_KEY_8                   703
+#define EL_EMC_BUMPER                  704
+#define EL_EMC_PLANT                   705
+#define EL_EMC_LENSES                  706
+#define EL_EMC_MAGNIFIER               707
+
+#define NUM_FILE_ELEMENTS              708
 
 
 /* "real" (and therefore drawable) runtime elements */
 #define GFX_ARG_POST_DELAY_FIXED               28
 #define GFX_ARG_POST_DELAY_RANDOM              29
 #define GFX_ARG_NAME                           30
+#define GFX_ARG_SCALE_UP_FACTOR                        31
 
-#define NUM_GFX_ARGS                           31
+#define NUM_GFX_ARGS                           32
 
 
 /* values for sound configuration suffixes */
 #define SND_ARG_MODE_LOOP                      0
+#define SND_ARG_VOLUME                         1
+#define SND_ARG_PRIORITY                       2
 
-#define NUM_SND_ARGS                           1
+#define NUM_SND_ARGS                           3
 
 
 /* values for music configuration suffixes */
 
 #define PROGRAM_VERSION_MAJOR  3
 #define PROGRAM_VERSION_MINOR  1
-#define PROGRAM_VERSION_PATCH  0
-#define PROGRAM_VERSION_BUILD  3
+#define PROGRAM_VERSION_PATCH  1
+#define PROGRAM_VERSION_BUILD  0
 
 #define PROGRAM_TITLE_STRING   "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING  "Holger Schemel"
-#define PROGRAM_COPYRIGHT_STRING "Copyright ©1995-2003 by Holger Schemel"
+#define PROGRAM_COPYRIGHT_STRING "Copyright ©1995-2004 by Holger Schemel"
 
 #define ICON_TITLE_STRING      PROGRAM_TITLE_STRING
 #define COOKIE_PREFIX          "ROCKSNDIAMONDS"
@@ -1352,6 +1429,8 @@ struct PlayerInfo
   boolean use_murphy_graphic;
 
   boolean block_last_field;
+  int block_delay;
+
   boolean can_fall_into_acid;
 
   boolean LevelSolved, GameOver;
@@ -1388,13 +1467,23 @@ struct PlayerInfo
 
   int show_envelope;
 
+#if 1  /* USE_NEW_MOVE_DELAY */
+  int move_delay;
+  int move_delay_value;
+#else
   unsigned long move_delay;
   int move_delay_value;
+#endif
 
   int move_delay_reset_counter;
 
+#if 1  /* USE_NEW_PUSH_DELAY */
+  int push_delay;
+  int push_delay_value;
+#else
   unsigned long push_delay;
   unsigned long push_delay_value;
+#endif
 
   unsigned long actual_frame_counter;
 
@@ -1433,6 +1522,13 @@ struct LevelFileInfo
 
 struct LevelInfo
 {
+  struct LevelFileInfo file_info;
+
+  /* level stored in native format for the native game engines */
+  struct LevelInfo_EM *native_em_level;
+
+  int game_engine_type;
+
   int file_version;    /* file format version the level is stored with    */
   int game_version;    /* game release version the level was created with */
 
@@ -1470,13 +1566,16 @@ struct LevelInfo
   boolean double_speed;
   boolean initial_gravity;
   boolean em_slippery_gems;    /* EM style "gems slip from wall" behaviour */
-  boolean block_last_field;    /* player blocks previous field while moving */
-  boolean sp_block_last_field; /* player blocks previous field while moving */
   boolean use_spring_bug;      /* for compatibility with old levels */
   boolean instant_relocation;  /* no visual delay when relocating player */
   boolean can_pass_to_walkable;        /* player can pass to empty or walkable tile */
   boolean grow_into_diggable;  /* amoeba can grow into anything diggable */
 
+  boolean block_last_field;    /* player blocks previous field while moving */
+  boolean sp_block_last_field; /* player blocks previous field while moving */
+  int block_delay;             /* delay for blocking previous field */
+  int sp_block_delay;          /* delay for blocking previous field */
+
   /* ('int' instead of 'boolean' because used as selectbox value in editor) */
   int use_step_counter;                /* count steps instead of seconds for level */
 
@@ -1485,6 +1584,8 @@ struct LevelInfo
   boolean use_custom_template; /* use custom properties from template file */
 
   boolean no_valid_file;       /* set when level file missing or invalid */
+
+  boolean changed;             /* set when level was changed in the editor */
 };
 
 struct TapeInfo
@@ -1536,6 +1637,10 @@ struct GameInfo
   int initial_move_delay_value;
   int initial_push_delay_value;
 
+  /* flags to handle bugs in and changes between different engine versions */
+  /* (for the latest engine version, these flags should always be "FALSE") */
+  boolean use_bug_change_when_pushing;
+
   /* variable within running game */
   int yamyam_content_nr;
   boolean magic_wall_active;
@@ -1562,6 +1667,9 @@ struct GlobalInfo
   char *autoplay_leveldir;
   int autoplay_level_nr;
 
+  char *convert_leveldir;
+  int convert_level_nr;
+
   int num_toons;
 
   float frames_per_second;
@@ -1630,6 +1738,15 @@ struct ElementGroupInfo
   int choice_pos;              /* current element choice position */
 };
 
+struct ElementNameInfo
+{
+  /* ---------- token and description strings ---------- */
+
+  char *token_name;            /* element token used in config files */
+  char *class_name;            /* element class used in config files */
+  char *editor_description;    /* pre-defined description for level editor */
+};
+
 struct ElementInfo
 {
   /* ---------- token and description strings ---------- */
@@ -1675,6 +1792,7 @@ struct ElementInfo
   int move_pattern;            /* direction movable element moves to */
   int move_direction_initial;  /* initial direction element moves to */
   int move_stepsize;           /* step size element moves with */
+
   int move_enter_element;      /* element that can be entered (and removed) */
   int move_leave_element;      /* element that can be left behind */
   int move_leave_type;         /* change (limited) or leave (unlimited) */
@@ -1683,6 +1801,7 @@ struct ElementInfo
 
   int content[3][3];           /* new elements after explosion */
 
+  int explosion_type;          /* type of explosion, like 3x3, 3+3 or 1x1 */
   int explosion_delay;         /* duration of explosion of this element */
   int ignition_delay;          /* delay for explosion by other explosion */
 
@@ -1716,7 +1835,6 @@ struct ElementInfo
   int walk_to_action;          /* diggable/collectible/pushable */
   int smash_targets;           /* can smash player/enemies/everything */
   int deadliness;              /* deadly when running/colliding/touching */
-  int consistency;             /* indestructible/can explode */
 
   boolean can_explode_by_fire; /* element explodes by fire */
   boolean can_explode_smashed; /* element explodes when smashed */
@@ -1751,6 +1869,7 @@ struct GraphicInfo
   int crumbled_like;           /* element for cloning crumble graphics */
   int diggable_like;           /* element for cloning digging graphics */
   int border_size;             /* border size for "crumbled" graphics */
+  int scale_up_factor;         /* optional factor for scaling image up */
 
   int anim_delay_fixed;                /* optional delay values for bored and   */
   int anim_delay_random;       /* sleeping player animations (animation */
@@ -1773,6 +1892,8 @@ struct GraphicInfo
 struct SoundInfo
 {
   boolean loop;
+  int volume;
+  int priority;
 };
 
 struct MusicInfo
@@ -1849,6 +1970,11 @@ extern int                       game_status;
 extern boolean                 level_editor_test_game;
 extern boolean                 network_playing;
 
+#if defined(TARGET_SDL)
+extern boolean                 network_server;
+extern SDL_Thread             *server_thread;
+#endif
+
 extern int                     key_joystick_mapping;
 
 extern boolean                 redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
@@ -1923,6 +2049,7 @@ extern struct GlobalInfo  global;
 extern struct MenuInfo         menu;
 extern struct DoorInfo         door_1, door_2;
 extern struct ElementInfo      element_info[];
+extern struct ElementNameInfo  element_name_info[];
 extern struct ElementActionInfo        element_action_info[];
 extern struct ElementDirectionInfo element_direction_info[];
 extern struct SpecialSuffixInfo special_suffix_info[];
@@ -1935,12 +2062,12 @@ extern struct MusicInfo        *music_info;
 extern struct MusicFileInfo    *music_file_info;
 extern struct HelpAnimInfo     *helpanim_info;
 extern SetupFileHash           *helptext_info;
+extern struct ConfigTypeInfo   image_config_suffix[];
+extern struct ConfigTypeInfo   sound_config_suffix[];
+extern struct ConfigTypeInfo   music_config_suffix[];
 extern struct ConfigInfo       image_config[];
 extern struct ConfigInfo       sound_config[];
 extern struct ConfigInfo       music_config[];
-extern struct ConfigInfo       image_config_suffix[];
-extern struct ConfigInfo       sound_config_suffix[];
-extern struct ConfigInfo       music_config_suffix[];
 extern struct ConfigInfo       helpanim_config[];
 extern struct ConfigInfo       helptext_config[];