From 63f41483ea7866802a7f6382c1d1b7135a1cd86a Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Mon, 2 Jan 2006 03:23:53 +0100 Subject: [PATCH] rnd-20060102-1-src * 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 | 7 ++ src/conftime.h | 2 +- src/editor.c | 248 +++++++++++++++++++++++++++---------------- src/files.c | 88 +++++++++++++-- src/game.c | 149 ++++++++++++++++++++++---- src/init.c | 5 + src/libgame/system.c | 10 ++ src/libgame/system.h | 1 + src/main.h | 6 ++ 9 files changed, 392 insertions(+), 124 deletions(-) diff --git a/ChangeLog b/ChangeLog index fb8552cf..0ed796e2 100644 --- 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 diff --git a/src/conftime.h b/src/conftime.h index 6283844b..ff08dd9a 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "[2005-12-31 02:43]" +#define COMPILE_DATE_STRING "[2006-01-02 02:52]" diff --git a/src/editor.c b/src/editor.c index 2f5154c1..e2735901 100644 --- a/src/editor.c +++ b/src/editor.c @@ -443,18 +443,20 @@ #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) @@ -554,38 +556,40 @@ #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) @@ -775,37 +779,39 @@ #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 @@ -849,17 +855,19 @@ #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)) diff --git a/src/files.c b/src/files.c index 4647c4ef..6db3036e 100644 --- a/src/files.c +++ b/src/files.c @@ -64,24 +64,36 @@ #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 ------------------------------------------ */ { diff --git a/src/game.c b/src/game.c index 3eff842e..55ffb998 100644 --- a/src/game.c +++ b/src/game.c @@ -50,13 +50,14 @@ #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; diff --git a/src/init.c b/src/init.c index b4b78259..6b00cb90 100644 --- a/src/init.c +++ b/src/init.c @@ -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, diff --git a/src/libgame/system.c b/src/libgame/system.c index 364394f1..cd24b134 100644 --- a/src/libgame/system.c +++ b/src/libgame/system.c @@ -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) { diff --git a/src/libgame/system.h b/src/libgame/system.h index 32f4ee6a..51746bc6 100644 --- a/src/libgame/system.h +++ b/src/libgame/system.h @@ -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); diff --git a/src/main.h b/src/main.h index 736d1c73..929b37f5 100644 --- a/src/main.h +++ b/src/main.h @@ -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; -- 2.34.1