rnd-20060102-1-src
authorHolger Schemel <info@artsoft.org>
Mon, 2 Jan 2006 02:23:53 +0000 (03:23 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:50:12 +0000 (10:50 +0200)
* added option "use artwork from element" for custom player artwork
* added option "use explosion from element" for player explosions
* added possibility for multiple CE changes per frame (experimental)

ChangeLog
src/conftime.h
src/editor.c
src/files.c
src/game.c
src/init.c
src/libgame/system.c
src/libgame/system.h
src/main.h

index fb8552cfb8ddafd3814f69bb3fd76be3ffc8de90..0ed796e24ef4bd498632633c5f28ef14d8913b71 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-01-01
+       * added option "use artwork from element" for custom player artwork
+       * added option "use explosion from element" for player explosions
+
+2005-12-30
+       * added possibility for multiple CE changes per frame (experimental)
+
 2005-12-28
        * uploaded pre-release (test) version 3.2.0-5 binary and source code
 
index 6283844b598b8d697b6a051b8c48dc5e976129cd..ff08dd9a3ad6f5ddf25a7caf921ecda4237754c7 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2005-12-31 02:43]"
+#define COMPILE_DATE_STRING "[2006-01-02 02:52]"
index 2f5154c1d3d444f17d8a8f98fea6da3af95bab6d..e27359015ba8a6212fe5c7fc07e05ef4b9fe7e96 100644 (file)
 #define GADGET_ID_MAGIC_BALL_CONTENT_7 (GADGET_ID_DRAWING_AREA_FIRST + 16)
 #define GADGET_ID_AMOEBA_CONTENT       (GADGET_ID_DRAWING_AREA_FIRST + 17)
 #define GADGET_ID_START_ELEMENT                (GADGET_ID_DRAWING_AREA_FIRST + 18)
-#define GADGET_ID_CUSTOM_GRAPHIC       (GADGET_ID_DRAWING_AREA_FIRST + 19)
-#define GADGET_ID_CUSTOM_CONTENT       (GADGET_ID_DRAWING_AREA_FIRST + 20)
-#define GADGET_ID_CUSTOM_MOVE_ENTER    (GADGET_ID_DRAWING_AREA_FIRST + 21)
-#define GADGET_ID_CUSTOM_MOVE_LEAVE    (GADGET_ID_DRAWING_AREA_FIRST + 22)
-#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 23)
-#define GADGET_ID_CUSTOM_CHANGE_CONTENT        (GADGET_ID_DRAWING_AREA_FIRST + 24)
-#define GADGET_ID_CUSTOM_CHANGE_TRIGGER        (GADGET_ID_DRAWING_AREA_FIRST + 25)
-#define GADGET_ID_GROUP_CONTENT                (GADGET_ID_DRAWING_AREA_FIRST + 26)
-#define GADGET_ID_RANDOM_BACKGROUND    (GADGET_ID_DRAWING_AREA_FIRST + 27)
+#define GADGET_ID_ARTWORK_ELEMENT      (GADGET_ID_DRAWING_AREA_FIRST + 19)
+#define GADGET_ID_EXPLOSION_ELEMENT    (GADGET_ID_DRAWING_AREA_FIRST + 20)
+#define GADGET_ID_CUSTOM_GRAPHIC       (GADGET_ID_DRAWING_AREA_FIRST + 21)
+#define GADGET_ID_CUSTOM_CONTENT       (GADGET_ID_DRAWING_AREA_FIRST + 22)
+#define GADGET_ID_CUSTOM_MOVE_ENTER    (GADGET_ID_DRAWING_AREA_FIRST + 23)
+#define GADGET_ID_CUSTOM_MOVE_LEAVE    (GADGET_ID_DRAWING_AREA_FIRST + 24)
+#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 25)
+#define GADGET_ID_CUSTOM_CHANGE_CONTENT        (GADGET_ID_DRAWING_AREA_FIRST + 26)
+#define GADGET_ID_CUSTOM_CHANGE_TRIGGER        (GADGET_ID_DRAWING_AREA_FIRST + 27)
+#define GADGET_ID_GROUP_CONTENT                (GADGET_ID_DRAWING_AREA_FIRST + 28)
+#define GADGET_ID_RANDOM_BACKGROUND    (GADGET_ID_DRAWING_AREA_FIRST + 29)
 
 /* text input identifiers */
-#define GADGET_ID_TEXT_INPUT_FIRST     (GADGET_ID_DRAWING_AREA_FIRST + 28)
+#define GADGET_ID_TEXT_INPUT_FIRST     (GADGET_ID_DRAWING_AREA_FIRST + 30)
 
 #define GADGET_ID_LEVEL_NAME           (GADGET_ID_TEXT_INPUT_FIRST + 0)
 #define GADGET_ID_LEVEL_AUTHOR         (GADGET_ID_TEXT_INPUT_FIRST + 1)
 #define GADGET_ID_SP_BLOCK_LAST_FIELD  (GADGET_ID_CHECKBUTTON_FIRST + 14)
 #define GADGET_ID_INSTANT_RELOCATION   (GADGET_ID_CHECKBUTTON_FIRST + 15)
 #define GADGET_ID_USE_START_ELEMENT    (GADGET_ID_CHECKBUTTON_FIRST + 16)
-#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 17)
-#define GADGET_ID_CAN_FALL_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 18)
-#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 19)
-#define GADGET_ID_DONT_COLLIDE_WITH    (GADGET_ID_CHECKBUTTON_FIRST + 20)
-#define GADGET_ID_CUSTOM_INDESTRUCTIBLE        (GADGET_ID_CHECKBUTTON_FIRST + 21)
-#define GADGET_ID_CUSTOM_CAN_EXPLODE   (GADGET_ID_CHECKBUTTON_FIRST + 22)
-#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 23)
-#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 24)
-#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 25)
-#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 26)
-#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 27)
-#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 28)
-#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 29)
-#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 30)
-#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 31)
-#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 32)
-#define GADGET_ID_CUSTOM_GRAV_REACHABLE        (GADGET_ID_CHECKBUTTON_FIRST + 33)
-#define GADGET_ID_CUSTOM_USE_LAST_VALUE        (GADGET_ID_CHECKBUTTON_FIRST + 34)
-#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 35)
-#define GADGET_ID_CUSTOM_USE_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 36)
-#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 37)
-#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 38)
-#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 39)
-#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 40)
-#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 41)
-#define GADGET_ID_CHANGE_HAS_ACTION    (GADGET_ID_CHECKBUTTON_FIRST + 42)
-#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 43)
-#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 44)
-#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 45)
+#define GADGET_ID_USE_ARTWORK_ELEMENT  (GADGET_ID_CHECKBUTTON_FIRST + 17)
+#define GADGET_ID_USE_EXPLOSION_ELEMENT        (GADGET_ID_CHECKBUTTON_FIRST + 18)
+#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 19)
+#define GADGET_ID_CAN_FALL_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 20)
+#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 21)
+#define GADGET_ID_DONT_COLLIDE_WITH    (GADGET_ID_CHECKBUTTON_FIRST + 22)
+#define GADGET_ID_CUSTOM_INDESTRUCTIBLE        (GADGET_ID_CHECKBUTTON_FIRST + 23)
+#define GADGET_ID_CUSTOM_CAN_EXPLODE   (GADGET_ID_CHECKBUTTON_FIRST + 24)
+#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 25)
+#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 26)
+#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 27)
+#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 28)
+#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 29)
+#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 30)
+#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 31)
+#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 32)
+#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 33)
+#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 34)
+#define GADGET_ID_CUSTOM_GRAV_REACHABLE        (GADGET_ID_CHECKBUTTON_FIRST + 35)
+#define GADGET_ID_CUSTOM_USE_LAST_VALUE        (GADGET_ID_CHECKBUTTON_FIRST + 36)
+#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 37)
+#define GADGET_ID_CUSTOM_USE_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 38)
+#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 39)
+#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 40)
+#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 41)
+#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 42)
+#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 43)
+#define GADGET_ID_CHANGE_HAS_ACTION    (GADGET_ID_CHECKBUTTON_FIRST + 44)
+#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 45)
+#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 46)
+#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 47)
 
 /* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 46)
+#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 48)
 #define GADGET_ID_ELEMENTLIST_LAST     (GADGET_ID_ELEMENTLIST_FIRST +  \
                                        ED_NUM_ELEMENTLIST_BUTTONS - 1)
 
 #define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD  12
 #define ED_CHECKBUTTON_ID_INSTANT_RELOCATION   13
 #define ED_CHECKBUTTON_ID_USE_START_ELEMENT    14
-#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 15
-#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID   16
-#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   17
-#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH    18
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   19
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE  20
-#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    21
-#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE        22
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE        23
-#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        24
-#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE        25
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      26
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      27
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     28
-#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      29
-#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                30
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE   31
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  32
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 33
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        34
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    35
-#define ED_CHECKBUTTON_ID_CHANGE_DELAY         36
-#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 37
-#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  38
-#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 39
-#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   40
-#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 41
-#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    42
-#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION    43
-
-#define ED_NUM_CHECKBUTTONS                    44
+#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT  15
+#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT        16
+#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 17
+#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID   18
+#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   19
+#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH    20
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   21
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE  22
+#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    23
+#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE        24
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE        25
+#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        26
+#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE        27
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      28
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      29
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     30
+#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      31
+#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                32
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE   33
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  34
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 35
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        36
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    37
+#define ED_CHECKBUTTON_ID_CHANGE_DELAY         38
+#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 39
+#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  40
+#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 41
+#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   42
+#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 43
+#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    44
+#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION    45
+
+#define ED_NUM_CHECKBUTTONS                    46
 
 #define ED_CHECKBUTTON_ID_LEVEL_FIRST  ED_CHECKBUTTON_ID_INITIAL_GRAVITY
 #define ED_CHECKBUTTON_ID_LEVEL_LAST   ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
 #define ED_DRAWING_ID_MAGIC_BALL_CONTENT_7     16
 #define ED_DRAWING_ID_AMOEBA_CONTENT           17
 #define ED_DRAWING_ID_START_ELEMENT            18
-#define ED_DRAWING_ID_CUSTOM_GRAPHIC           19
-#define ED_DRAWING_ID_CUSTOM_CONTENT           20
-#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER                21
-#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE                22
-#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET     23
-#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT    24
-#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER    25
-#define ED_DRAWING_ID_GROUP_CONTENT            26
-#define ED_DRAWING_ID_RANDOM_BACKGROUND                27
+#define ED_DRAWING_ID_ARTWORK_ELEMENT          19
+#define ED_DRAWING_ID_EXPLOSION_ELEMENT                20
+#define ED_DRAWING_ID_CUSTOM_GRAPHIC           21
+#define ED_DRAWING_ID_CUSTOM_CONTENT           22
+#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER                23
+#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE                24
+#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET     25
+#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT    26
+#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER    27
+#define ED_DRAWING_ID_GROUP_CONTENT            28
+#define ED_DRAWING_ID_RANDOM_BACKGROUND                29
 
-#define ED_NUM_DRAWING_AREAS                   28
+#define ED_NUM_DRAWING_AREAS                   30
 
 
 /*
@@ -2426,56 +2434,70 @@ static struct
     "can grow into anything diggable", "grow into more than just sand"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(5),
     GADGET_ID_DOUBLE_SPEED,            GADGET_ID_NONE,
     &level.double_speed,
     NULL,
     "double speed movement",           "set initial movement speed of player"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(5),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(6),
     GADGET_ID_BLOCK_SNAP_FIELD,                GADGET_ID_NONE,
     &level.block_snap_field,
     NULL,
     "block snapped field when snapping", "use snapping delay to show animation"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_BLOCK_LAST_FIELD,                GADGET_ID_NONE,
     &level.block_last_field,
     NULL,
     "block last field when moving",    "player blocks last field when moving"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_SP_BLOCK_LAST_FIELD,     GADGET_ID_NONE,
     &level.sp_block_last_field,
     NULL,
     "block last field when moving",    "player blocks last field when moving"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
     GADGET_ID_INSTANT_RELOCATION,      GADGET_ID_NONE,
     &level.instant_relocation,
     NULL,
     "no scrolling when relocating",    "player gets relocated without delay"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(6),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(7),
     GADGET_ID_USE_START_ELEMENT,       GADGET_ID_NONE,
     &level.use_start_element[0],
     NULL,
     "use level start element:",               "start level at this element's position"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(8),
+    GADGET_ID_USE_ARTWORK_ELEMENT,     GADGET_ID_NONE,
+    &level.use_artwork_element[0],
+    NULL,
+    "use artwork from element:",       "use player artwork from other element"
+  },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(9),
+    GADGET_ID_USE_EXPLOSION_ELEMENT,   GADGET_ID_NONE,
+    &level.use_explosion_element[0],
+    NULL,
+    "use explosion from element:",     "use explosion properties from element"
+  },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
     GADGET_ID_CAN_PASS_TO_WALKABLE,    GADGET_ID_NONE,
     &level.can_pass_to_walkable,
     NULL,
     "can pass to walkable element",    "player can pass to empty or walkable"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_CAN_FALL_INTO_ACID,      GADGET_ID_NONE,
     &custom_element_properties[EP_CAN_MOVE_INTO_ACID],
     NULL,
@@ -2795,12 +2817,30 @@ static struct
   /* ---------- level start element ---------------------------------------- */
 
   {
-    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(6),
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(7),
     GADGET_ID_START_ELEMENT,           GADGET_ID_USE_START_ELEMENT,
     &level.start_element[0],           1, 1,
     NULL, NULL, NULL,                  "level start element"
   },
 
+  /* ---------- player artwork element ------------------------------------- */
+
+  {
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(8),
+    GADGET_ID_ARTWORK_ELEMENT,         GADGET_ID_USE_ARTWORK_ELEMENT,
+    &level.artwork_element[0],         1, 1,
+    NULL, NULL, NULL,                  "element for player artwork"
+  },
+
+  /* ---------- player explosion element ----------------------------------- */
+
+  {
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(9),
+    GADGET_ID_EXPLOSION_ELEMENT,       GADGET_ID_USE_EXPLOSION_ELEMENT,
+    &level.explosion_element[0],       1, 1,
+    NULL, NULL, NULL,                  "element for player explosion"
+  },
+
   /* ---------- element settings: configure 1 (custom elements) ----------- */
 
   /* ---------- custom graphic --------------------------------------------- */
@@ -4666,6 +4706,10 @@ static void DrawElementBorder(int dest_x, int dest_y, int width, int height,
   int src_x, src_y;
   int num_mini_tilex = width  / MINI_TILEX + 1;
   int num_mini_tiley = height / MINI_TILEY + 1;
+  int from_x = dest_x - MINI_TILEX / 2;
+  int from_y = dest_y - MINI_TILEY / 2;
+  int to_x = from_x + num_mini_tilex * MINI_TILEX - 1;
+  int to_y = from_y + num_mini_tiley * MINI_TILEY - 1;
   int x, y;
 
   getMiniGraphicSource(border_graphic, &src_bitmap, &src_x, &src_y);
@@ -4673,10 +4717,14 @@ static void DrawElementBorder(int dest_x, int dest_y, int width, int height,
   for (y = 0; y < num_mini_tiley; y++)
     for (x = 0; x < num_mini_tilex; x++)
       BlitBitmap(src_bitmap, drawto, src_x, src_y, MINI_TILEX, MINI_TILEY,
-                dest_x - MINI_TILEX / 2 + x * MINI_TILEX,
-                dest_y - MINI_TILEY / 2 + y * MINI_TILEY);
+                from_x + x * MINI_TILEX, from_y + y * MINI_TILEY);
 
   ClearRectangle(drawto, dest_x - 1, dest_y - 1, width + 2, height + 2);
+
+  DrawSimpleBlackLine(drawto, from_x, from_y, to_x, from_y);
+  DrawSimpleBlackLine(drawto, to_x, from_y, to_x, to_y);
+  DrawSimpleBlackLine(drawto, to_x, to_y, from_x, to_y);
+  DrawSimpleBlackLine(drawto, from_x, to_y, from_x, from_y);
 }
 
 static void DrawDrawingArea(int id)
@@ -7666,13 +7714,21 @@ static void DrawPropertiesConfig()
   {
     int player_nr = GET_PLAYER_NR(properties_element);
 
-    /* this property can be set for every player individually */
+    /* these properties can be set for every player individually */
     drawingarea_info[ED_DRAWING_ID_START_ELEMENT].value =
       &level.start_element[player_nr];
+    drawingarea_info[ED_DRAWING_ID_ARTWORK_ELEMENT].value =
+      &level.artwork_element[player_nr];
+    drawingarea_info[ED_DRAWING_ID_EXPLOSION_ELEMENT].value =
+      &level.explosion_element[player_nr];
 
-    /* this property can be set for every player individually */
+    /* these properties can be set for every player individually */
     checkbutton_info[ED_CHECKBUTTON_ID_USE_START_ELEMENT].value =
       &level.use_start_element[player_nr];
+    checkbutton_info[ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT].value =
+      &level.use_artwork_element[player_nr];
+    checkbutton_info[ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT].value =
+      &level.use_explosion_element[player_nr];
 
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID);
     MapCheckbuttonGadget(properties_element == EL_SP_MURPHY ?
@@ -7681,10 +7737,14 @@ static void DrawPropertiesConfig()
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INSTANT_RELOCATION);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_START_ELEMENT);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_DOUBLE_SPEED);
 
     MapDrawingArea(ED_DRAWING_ID_START_ELEMENT);
+    MapDrawingArea(ED_DRAWING_ID_ARTWORK_ELEMENT);
+    MapDrawingArea(ED_DRAWING_ID_EXPLOSION_ELEMENT);
   }
 
   if (IS_GEM(properties_element))
index 4647c4ef3ca5ccfbfcac6d3014c1b651a77d324f..6db3036e8685a742545a7cc8207e173891701bfc 100644 (file)
 #define CONF_VALUE_INTEGER_2           (CONF_MASK_1_BYTE | 2)
 #define CONF_VALUE_INTEGER_3           (CONF_MASK_1_BYTE | 3)
 #define CONF_VALUE_INTEGER_4           (CONF_MASK_1_BYTE | 4)
-#define CONF_VALUE_BOOLEAN_1           (CONF_MASK_1_BYTE | 5)
-#define CONF_VALUE_BOOLEAN_2           (CONF_MASK_1_BYTE | 6)
-#define CONF_VALUE_BOOLEAN_3           (CONF_MASK_1_BYTE | 7)
-#define CONF_VALUE_BOOLEAN_4           (CONF_MASK_1_BYTE | 8)
+#define CONF_VALUE_INTEGER_5           (CONF_MASK_1_BYTE | 5)
+#define CONF_VALUE_INTEGER_6           (CONF_MASK_1_BYTE | 6)
+#define CONF_VALUE_INTEGER_7           (CONF_MASK_1_BYTE | 7)
+#define CONF_VALUE_INTEGER_8           (CONF_MASK_1_BYTE | 8)
+#define CONF_VALUE_BOOLEAN_1           (CONF_MASK_1_BYTE | 9)
+#define CONF_VALUE_BOOLEAN_2           (CONF_MASK_1_BYTE | 10)
+#define CONF_VALUE_BOOLEAN_3           (CONF_MASK_1_BYTE | 11)
+#define CONF_VALUE_BOOLEAN_4           (CONF_MASK_1_BYTE | 12)
+#define CONF_VALUE_BOOLEAN_5           (CONF_MASK_1_BYTE | 13)
+#define CONF_VALUE_BOOLEAN_6           (CONF_MASK_1_BYTE | 14)
+#define CONF_VALUE_BOOLEAN_7           (CONF_MASK_1_BYTE | 15)
+#define CONF_VALUE_BOOLEAN_8           (CONF_MASK_1_BYTE | 16)
 
 #define CONF_VALUE_ELEMENT_1           (CONF_MASK_2_BYTE | 1)
 #define CONF_VALUE_ELEMENT_2           (CONF_MASK_2_BYTE | 2)
 #define CONF_VALUE_ELEMENT_3           (CONF_MASK_2_BYTE | 3)
 #define CONF_VALUE_ELEMENT_4           (CONF_MASK_2_BYTE | 4)
+#define CONF_VALUE_ELEMENT_5           (CONF_MASK_2_BYTE | 5)
+#define CONF_VALUE_ELEMENT_6           (CONF_MASK_2_BYTE | 6)
+#define CONF_VALUE_ELEMENT_7           (CONF_MASK_2_BYTE | 7)
+#define CONF_VALUE_ELEMENT_8           (CONF_MASK_2_BYTE | 8)
 
 #define CONF_VALUE_CONTENT_1           (CONF_MASK_MULTI_BYTES | 1)
 #define CONF_VALUE_CONTENT_8           (CONF_MASK_MULTI_BYTES | 2)
 
 #define CONF_VALUE_INTEGER(x)          ((x) >= CONF_VALUE_INTEGER_1 && \
-                                        (x) <= CONF_VALUE_INTEGER_4)
+                                        (x) <= CONF_VALUE_INTEGER_8)
 
 #define CONF_VALUE_BOOLEAN(x)          ((x) >= CONF_VALUE_BOOLEAN_1 && \
-                                        (x) <= CONF_VALUE_BOOLEAN_4)
+                                        (x) <= CONF_VALUE_BOOLEAN_8)
 
 #define CONF_VALUE_NUM_BYTES(x)                ((x) == CONF_MASK_1_BYTE ? 1 :  \
                                         (x) == CONF_MASK_2_BYTE ? 2 :  \
@@ -223,6 +235,38 @@ static struct
     EL_PLAYER_4,                       CONF_VALUE_BOOLEAN_2,
     &li.use_start_element[3],          FALSE
   },
+  {
+    EL_PLAYER_1,                       CONF_VALUE_BOOLEAN_3,
+    &li.use_artwork_element[0],                FALSE
+  },
+  {
+    EL_PLAYER_2,                       CONF_VALUE_BOOLEAN_3,
+    &li.use_artwork_element[1],                FALSE
+  },
+  {
+    EL_PLAYER_3,                       CONF_VALUE_BOOLEAN_3,
+    &li.use_artwork_element[2],                FALSE
+  },
+  {
+    EL_PLAYER_4,                       CONF_VALUE_BOOLEAN_3,
+    &li.use_artwork_element[3],                FALSE
+  },
+  {
+    EL_PLAYER_1,                       CONF_VALUE_BOOLEAN_4,
+    &li.use_explosion_element[0],      FALSE
+  },
+  {
+    EL_PLAYER_2,                       CONF_VALUE_BOOLEAN_4,
+    &li.use_explosion_element[1],      FALSE
+  },
+  {
+    EL_PLAYER_3,                       CONF_VALUE_BOOLEAN_4,
+    &li.use_explosion_element[2],      FALSE
+  },
+  {
+    EL_PLAYER_4,                       CONF_VALUE_BOOLEAN_4,
+    &li.use_explosion_element[3],      FALSE
+  },
   {
     EL_EMC_MAGIC_BALL,                 CONF_VALUE_INTEGER_1,
     &li.ball_time,                     10
@@ -257,6 +301,38 @@ static struct
     EL_PLAYER_4,                       CONF_VALUE_ELEMENT_1,
     &li.start_element[3],              EL_PLAYER_4
   },
+  {
+    EL_PLAYER_1,                       CONF_VALUE_ELEMENT_2,
+    &li.artwork_element[0],            EL_PLAYER_1
+  },
+  {
+    EL_PLAYER_2,                       CONF_VALUE_ELEMENT_2,
+    &li.artwork_element[1],            EL_PLAYER_2
+  },
+  {
+    EL_PLAYER_3,                       CONF_VALUE_ELEMENT_2,
+    &li.artwork_element[2],            EL_PLAYER_3
+  },
+  {
+    EL_PLAYER_4,                       CONF_VALUE_ELEMENT_2,
+    &li.artwork_element[3],            EL_PLAYER_4
+  },
+  {
+    EL_PLAYER_1,                       CONF_VALUE_ELEMENT_3,
+    &li.explosion_element[0],          EL_PLAYER_1
+  },
+  {
+    EL_PLAYER_2,                       CONF_VALUE_ELEMENT_3,
+    &li.explosion_element[1],          EL_PLAYER_2
+  },
+  {
+    EL_PLAYER_3,                       CONF_VALUE_ELEMENT_3,
+    &li.explosion_element[2],          EL_PLAYER_3
+  },
+  {
+    EL_PLAYER_4,                       CONF_VALUE_ELEMENT_3,
+    &li.explosion_element[3],          EL_PLAYER_4
+  },
 
   /* ---------- multi-byte values ------------------------------------------ */
   {
index 3eff842eb44ece2ed7c4c5efd98b0db1f0c1fc88..55ffb998d9285bf24dc928e1f7bec7e8fcf7e13a 100644 (file)
 #define SCROLL_INIT            0
 #define SCROLL_GO_ON           1
 
-/* for Explode() */
+/* for Bang()/Explode() */
 #define EX_PHASE_START         0
 #define EX_TYPE_NONE           0
 #define EX_TYPE_NORMAL         (1 << 0)
 #define EX_TYPE_CENTER         (1 << 1)
 #define EX_TYPE_BORDER         (1 << 2)
 #define EX_TYPE_CROSS          (1 << 3)
+#define EX_TYPE_DYNA           (1 << 4)
 #define EX_TYPE_SINGLE_TILE    (EX_TYPE_CENTER | EX_TYPE_BORDER)
 
 /* special positions in the game control window (relative to control window) */
@@ -1138,7 +1139,7 @@ static void resolve_group_element(int group_element, int recursion_depth)
 
 static void InitGameEngine()
 {
-  int i, j, k, l;
+  int i, j, k, l, x, y;
 
   /* set game engine from tape file when re-playing, else from level file */
   game.engine_version = (tape.playing ? tape.engine_version :
@@ -1505,6 +1506,40 @@ static void InitGameEngine()
   for (i = 0; access_direction_list[i].element != EL_UNDEFINED; i++)
     element_info[access_direction_list[i].element].access_direction =
       access_direction_list[i].direction;
+
+  /* ---------- initialize explosion content ------------------------------- */
+  for (i = 0; i < MAX_NUM_ELEMENTS; i++)
+  {
+    if (IS_CUSTOM_ELEMENT(i))
+      continue;
+
+    for (y = 0; y < 3; y++) for (x = 0; x < 3; x++)
+    {
+      /* (content for EL_YAMYAM set at run-time with game.yamyam_content_nr) */
+
+      element_info[i].content.e[x][y] =
+       (i == EL_PLAYER_1 ? EL_EMERALD_YELLOW :
+        i == EL_PLAYER_2 ? EL_EMERALD_RED :
+        i == EL_PLAYER_3 ? EL_EMERALD :
+        i == EL_PLAYER_4 ? EL_EMERALD_PURPLE :
+        i == EL_MOLE ? EL_EMERALD_RED :
+        i == EL_PENGUIN ? EL_EMERALD_PURPLE :
+        i == EL_BUG ? (x == 1 && y == 1 ? EL_DIAMOND : EL_EMERALD) :
+        i == EL_BD_BUTTERFLY ? EL_BD_DIAMOND :
+        i == EL_SP_ELECTRON ? EL_SP_INFOTRON :
+        i == EL_AMOEBA_TO_DIAMOND ? level.amoeba_content :
+        i == EL_YAMYAM ? EL_UNDEFINED :
+        i == EL_WALL_EMERALD ? EL_EMERALD :
+        i == EL_WALL_DIAMOND ? EL_DIAMOND :
+        i == EL_WALL_BD_DIAMOND ? EL_BD_DIAMOND :
+        i == EL_WALL_EMERALD_YELLOW ? EL_EMERALD_YELLOW :
+        i == EL_WALL_EMERALD_RED ? EL_EMERALD_RED :
+        i == EL_WALL_EMERALD_PURPLE ? EL_EMERALD_PURPLE :
+        i == EL_WALL_PEARL ? EL_PEARL :
+        i == EL_WALL_CRYSTAL ? EL_CRYSTAL :
+        EL_EMPTY);
+    }
+  }
 }
 
 int get_num_special_action(int element, int action_first, int action_last)
@@ -1588,7 +1623,9 @@ void InitGame()
     player->StepFrame = 0;
 
     player->use_murphy = FALSE;
-    player->artwork_element = player->element_nr;
+    player->artwork_element =
+      (level.use_artwork_element[i] ? level.artwork_element[i] :
+       player->element_nr);
 
     player->block_last_field = FALSE;  /* initialized in InitPlayerField() */
     player->block_delay_adjustment = 0;        /* initialized in InitPlayerField() */
@@ -3026,6 +3063,21 @@ void Explode(int ex, int ey, int phase, int mode)
   if (phase == EX_PHASE_START)         /* initialize 'Store[][]' field */
   {
     int center_element = Feld[ex][ey];
+    int artwork_element = center_element;      /* for custom player artwork */
+    int explosion_element = center_element;    /* for custom player artwork */
+
+    if (IS_PLAYER(ex, ey))
+    {
+      int player_nr = GET_PLAYER_NR(StorePlayer[ex][ey]);
+
+      artwork_element = stored_player[player_nr].artwork_element;
+
+      if (level.use_explosion_element[player_nr])
+      {
+       explosion_element = level.explosion_element[player_nr];
+       artwork_element = explosion_element;
+      }
+    }
 
 #if 0
     /* --- This is only really needed (and now handled) in "Impact()". --- */
@@ -3039,7 +3091,7 @@ void Explode(int ex, int ey, int phase, int mode)
     if (mode == EX_TYPE_NORMAL ||
        mode == EX_TYPE_CENTER ||
        mode == EX_TYPE_CROSS)
-      PlayLevelSoundAction(ex, ey, ACTION_EXPLODING);
+      PlayLevelSoundElementAction(ex, ey, artwork_element, ACTION_EXPLODING);
 
     /* remove things displayed in background while burning dynamite */
     if (Back[ex][ey] != EL_EMPTY && !IS_INDESTRUCTIBLE(Back[ex][ey]))
@@ -3053,7 +3105,7 @@ void Explode(int ex, int ey, int phase, int mode)
       Feld[ex][ey] = center_element;
     }
 
-    last_phase = element_info[center_element].explosion_delay + 1;
+    last_phase = element_info[explosion_element].explosion_delay + 1;
 
     for (y = ey - 1; y <= ey + 1; y++) for (x = ex - 1; x <= ex + 1; x++)
     {
@@ -3126,6 +3178,11 @@ void Explode(int ex, int ey, int phase, int mode)
 
       if (IS_PLAYER(ex, ey) && !PLAYER_EXPLOSION_PROTECTED(ex, ey))
       {
+       int player_nr = StorePlayer[ex][ey] - EL_PLAYER_1;
+
+       Store[x][y] = EL_PLAYER_IS_EXPLODING_1 + player_nr;
+
+#if 0
        switch(StorePlayer[ex][ey])
        {
          case EL_PLAYER_2:
@@ -3142,10 +3199,21 @@ void Explode(int ex, int ey, int phase, int mode)
            Store[x][y] = EL_PLAYER_IS_EXPLODING_1;
            break;
        }
+#endif
 
        if (PLAYERINFO(ex, ey)->use_murphy)
          Store[x][y] = EL_EMPTY;
       }
+#if 1
+      else if (center_element == EL_YAMYAM)
+       Store[x][y] = level.yamyam_content[game.yamyam_content_nr].e[xx][yy];
+      else if (element_info[center_element].content.e[xx][yy] != EL_EMPTY)
+       Store[x][y] = element_info[center_element].content.e[xx][yy];
+      else if (!CAN_EXPLODE(element))
+       Store[x][y] = element_info[element].content.e[1][1];
+      else
+       Store[x][y] = EL_EMPTY;
+#else
       else if (center_element == EL_MOLE)
        Store[x][y] = EL_EMERALD_RED;
       else if (center_element == EL_PENGUIN)
@@ -3183,13 +3251,14 @@ void Explode(int ex, int ey, int phase, int mode)
        Store[x][y] = element_info[element].content.e[1][1];
       else
        Store[x][y] = EL_EMPTY;
+#endif
 
       if (x != ex || y != ey || mode == EX_TYPE_BORDER ||
          center_element == EL_AMOEBA_TO_DIAMOND)
        Store2[x][y] = element;
 
       Feld[x][y] = EL_EXPLOSION;
-      GfxElement[x][y] = center_element;
+      GfxElement[x][y] = artwork_element;
 
       ExplodePhase[x][y] = 1;
       ExplodeDelay[x][y] = last_phase;
@@ -3283,12 +3352,30 @@ void Explode(int ex, int ey, int phase, int mode)
     /* player can escape from explosions and might therefore be still alive */
     if (element >= EL_PLAYER_IS_EXPLODING_1 &&
        element <= EL_PLAYER_IS_EXPLODING_4)
-      Feld[x][y] = (stored_player[element - EL_PLAYER_IS_EXPLODING_1].active ?
-                   EL_EMPTY :
-                   element == EL_PLAYER_IS_EXPLODING_1 ? EL_EMERALD_YELLOW :
-                   element == EL_PLAYER_IS_EXPLODING_2 ? EL_EMERALD_RED :
-                   element == EL_PLAYER_IS_EXPLODING_3 ? EL_EMERALD :
-                   EL_EMERALD_PURPLE);
+    {
+      static int player_death_elements[] =
+      {
+       EL_EMERALD_YELLOW,
+       EL_EMERALD_RED,
+       EL_EMERALD,
+       EL_EMERALD_PURPLE
+      };
+      int player_nr = element - EL_PLAYER_IS_EXPLODING_1;
+      int player_death_element = player_death_elements[player_nr];
+
+      if (level.use_explosion_element[player_nr])
+      {
+       int explosion_element = level.explosion_element[player_nr];
+       int xx = MIN(MAX(0, x - stored_player[player_nr].jx + 1), 2);
+       int yy = MIN(MAX(0, y - stored_player[player_nr].jy + 1), 2);
+
+       player_death_element =
+         element_info[explosion_element].content.e[xx][yy];
+      }
+
+      Feld[x][y] = (stored_player[player_nr].active ? EL_EMPTY :
+                   player_death_element);
+    }
 
     /* restore probably existing indestructible background element */
     if (Back[x][y] && IS_INDESTRUCTIBLE(Back[x][y]))
@@ -3396,6 +3483,7 @@ void DynaExplode(int ex, int ey)
 void Bang(int x, int y)
 {
   int element = MovingOrBlocked2Element(x, y);
+  int explosion_type = EX_TYPE_NORMAL;
 
   if (IS_PLAYER(x, y) && !PLAYER_EXPLOSION_PROTECTED(x, y))
   {
@@ -3403,6 +3491,16 @@ void Bang(int x, int y)
 
     element = Feld[x][y] = (player->use_murphy ? EL_SP_MURPHY :
                            player->element_nr);
+
+    if (level.use_explosion_element[player->index_nr])
+    {
+      int explosion_element = level.explosion_element[player->index_nr];
+
+      if (element_info[explosion_element].explosion_type == EXPLODES_CROSS)
+       explosion_type = EX_TYPE_CROSS;
+      else if (element_info[explosion_element].explosion_type == EXPLODES_1X1)
+       explosion_type = EX_TYPE_CENTER;
+    }
   }
 
   switch(element)
@@ -3417,8 +3515,8 @@ void Bang(int x, int y)
     case EL_PACMAN:
     case EL_MOLE:
       RaiseScoreElement(element);
-      Explode(x, y, EX_PHASE_START, EX_TYPE_NORMAL);
       break;
+
     case EL_DYNABOMB_PLAYER_1_ACTIVE:
     case EL_DYNABOMB_PLAYER_2_ACTIVE:
     case EL_DYNABOMB_PLAYER_3_ACTIVE:
@@ -3426,27 +3524,30 @@ void Bang(int x, int y)
     case EL_DYNABOMB_INCREASE_NUMBER:
     case EL_DYNABOMB_INCREASE_SIZE:
     case EL_DYNABOMB_INCREASE_POWER:
-      DynaExplode(x, y);
+      explosion_type = EX_TYPE_DYNA;
       break;
+
     case EL_PENGUIN:
     case EL_LAMP:
     case EL_LAMP_ACTIVE:
     case EL_AMOEBA_TO_DIAMOND:
-      if (IS_PLAYER(x, y))
-       Explode(x, y, EX_PHASE_START, EX_TYPE_NORMAL);
-      else
-       Explode(x, y, EX_PHASE_START, EX_TYPE_CENTER);
+      if (!IS_PLAYER(x, y))    /* penguin and player may be at same field */
+       explosion_type = EX_TYPE_CENTER;
       break;
+
     default:
       if (element_info[element].explosion_type == EXPLODES_CROSS)
-       Explode(x, y, EX_PHASE_START, EX_TYPE_CROSS);
+       explosion_type = EX_TYPE_CROSS;
       else if (element_info[element].explosion_type == EXPLODES_1X1)
-       Explode(x, y, EX_PHASE_START, EX_TYPE_CENTER);
-      else
-       Explode(x, y, EX_PHASE_START, EX_TYPE_NORMAL);
+       explosion_type = EX_TYPE_CENTER;
       break;
   }
 
+  if (explosion_type == EX_TYPE_DYNA)
+    DynaExplode(x, y);
+  else
+    Explode(x, y, EX_PHASE_START, explosion_type);
+
   CheckTriggeredElementChange(x, y, element, CE_EXPLOSION_OF_X);
 }
 
@@ -7042,7 +7143,9 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page)
          int artwork_element = action_arg_element;
 
          if (action_arg == CA_ARG_ELEMENT_RESET)
-           artwork_element = stored_player[i].element_nr;
+           artwork_element =
+             (level.use_artwork_element[i] ? level.artwork_element[i] :
+              stored_player[i].element_nr);
 
          stored_player[i].artwork_element = artwork_element;
 
index b4b78259e4db2b48151bad954c48574df729b3c2..6b00cb9077bd8a7b1119e36c58d3e2882bb0c381 100644 (file)
@@ -3137,6 +3137,11 @@ void InitElementPropertiesStatic()
 
   static int ep_has_content[] =
   {
+    EL_PLAYER_1,
+    EL_PLAYER_2,
+    EL_PLAYER_3,
+    EL_PLAYER_4,
+    EL_SP_MURPHY,
     EL_YAMYAM,
     EL_AMOEBA_WET,
     EL_AMOEBA_DRY,
index 364394f10f0ba74e9388e845647473f730b1ad58..cd24b1340b005722068bd252a58e64c381c46b22 100644 (file)
@@ -515,6 +515,16 @@ inline void BlitBitmapOnBackground(Bitmap *src_bitmap, Bitmap *dst_bitmap,
               dst_x, dst_y);
 }
 
+inline void DrawSimpleBlackLine(Bitmap *bitmap, int from_x, int from_y,
+                               int to_x, int to_y)
+{
+#if defined(TARGET_SDL)
+  SDLDrawSimpleLine(bitmap, from_x, from_y, to_x, to_y, BLACK_PIXEL);
+#else
+  X11DrawSimpleLine(bitmap, from_x, from_y, to_x, to_y, BLACK_PIXEL);
+#endif
+}
+
 inline void DrawSimpleWhiteLine(Bitmap *bitmap, int from_x, int from_y,
                                int to_x, int to_y)
 {
index 32f4ee6a36b916f1b5b78a587ca8fa5ac2dfbb3f..51746bc6b24e75be45b6cb8c422c4479e363ba0a 100644 (file)
@@ -909,6 +909,7 @@ inline void BlitBitmapMasked(Bitmap *, Bitmap *, int, int, int, int, int, int);
 inline boolean DrawingOnBackground(int, int);
 inline void BlitBitmapOnBackground(Bitmap *, Bitmap *, int, int, int, int, int,
                                   int);
+inline void DrawSimpleBlackLine(Bitmap *, int, int, int, int);
 inline void DrawSimpleWhiteLine(Bitmap *, int, int, int, int);
 inline void DrawLines(Bitmap *, struct XY *, int, Pixel);
 inline Pixel GetPixel(Bitmap *, int, int);
index 736d1c73dad3f1ab4eced01ae79b0a6e33c30b6c..929b37f57a2e9bfff2ed22408367324644a6dd75 100644 (file)
@@ -1885,6 +1885,12 @@ struct LevelInfo
   int start_element[MAX_PLAYERS];
   boolean use_start_element[MAX_PLAYERS];
 
+  int artwork_element[MAX_PLAYERS];
+  boolean use_artwork_element[MAX_PLAYERS];
+
+  int explosion_element[MAX_PLAYERS];
+  boolean use_explosion_element[MAX_PLAYERS];
+
 #if 1
   /* values for the new EMC elements */
   int android_move_time;