#define GADGET_ID_CUSTOM_MOVE_PATTERN (GADGET_ID_SELECTBOX_FIRST + 3)
#define GADGET_ID_CUSTOM_MOVE_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 4)
#define GADGET_ID_CUSTOM_MOVE_STEPSIZE (GADGET_ID_SELECTBOX_FIRST + 5)
-#define GADGET_ID_CUSTOM_SMASH_TARGETS (GADGET_ID_SELECTBOX_FIRST + 6)
-#define GADGET_ID_CUSTOM_SLIPPERY_TYPE (GADGET_ID_SELECTBOX_FIRST + 7)
-#define GADGET_ID_CUSTOM_ACCESS_TYPE (GADGET_ID_SELECTBOX_FIRST + 8)
-#define GADGET_ID_CUSTOM_ACCESS_LAYER (GADGET_ID_SELECTBOX_FIRST + 9)
-#define GADGET_ID_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 10)
-#define GADGET_ID_CHANGE_DIRECT_ACTION (GADGET_ID_SELECTBOX_FIRST + 11)
-#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 12)
-#define GADGET_ID_CHANGE_SIDES (GADGET_ID_SELECTBOX_FIRST + 13)
-#define GADGET_ID_CHANGE_POWER (GADGET_ID_SELECTBOX_FIRST + 14)
-#define GADGET_ID_SELECT_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 15)
+#define GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE (GADGET_ID_SELECTBOX_FIRST + 6)
+#define GADGET_ID_CUSTOM_SMASH_TARGETS (GADGET_ID_SELECTBOX_FIRST + 7)
+#define GADGET_ID_CUSTOM_SLIPPERY_TYPE (GADGET_ID_SELECTBOX_FIRST + 8)
+#define GADGET_ID_CUSTOM_ACCESS_TYPE (GADGET_ID_SELECTBOX_FIRST + 9)
+#define GADGET_ID_CUSTOM_ACCESS_LAYER (GADGET_ID_SELECTBOX_FIRST + 10)
+#define GADGET_ID_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 11)
+#define GADGET_ID_CHANGE_DIRECT_ACTION (GADGET_ID_SELECTBOX_FIRST + 12)
+#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 13)
+#define GADGET_ID_CHANGE_SIDES (GADGET_ID_SELECTBOX_FIRST + 14)
+#define GADGET_ID_CHANGE_POWER (GADGET_ID_SELECTBOX_FIRST + 15)
+#define GADGET_ID_SELECT_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 16)
+#define GADGET_ID_GROUP_CHOICE_MODE (GADGET_ID_SELECTBOX_FIRST + 17)
/* textbutton identifiers */
-#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 16)
+#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 18)
#define GADGET_ID_PROPERTIES_INFO (GADGET_ID_TEXTBUTTON_FIRST + 0)
#define GADGET_ID_PROPERTIES_CONFIG (GADGET_ID_TEXTBUTTON_FIRST + 1)
#define GADGET_ID_SCROLL_LIST_DOWN (GADGET_ID_SCROLLING_LIST_FIRST + 1)
#define GADGET_ID_SCROLL_LIST_VERTICAL (GADGET_ID_SCROLLING_LIST_FIRST + 2)
-/* checkbuttons for level/element properties */
+/* checkbuttons/radiobuttons for level/element properties */
#define GADGET_ID_CHECKBUTTON_FIRST (GADGET_ID_SCROLLING_LIST_FIRST + 3)
#define GADGET_ID_RANDOM_PERCENTAGE (GADGET_ID_CHECKBUTTON_FIRST + 0)
#define GADGET_ID_GRAVITY (GADGET_ID_CHECKBUTTON_FIRST + 4)
#define GADGET_ID_STICK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 5)
#define GADGET_ID_EM_SLIPPERY_GEMS (GADGET_ID_CHECKBUTTON_FIRST + 6)
-#define GADGET_ID_CUSTOM_EXPLODE_RESULT (GADGET_ID_CHECKBUTTON_FIRST + 7)
-#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 8)
-#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 9)
-#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 10)
-#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 11)
-#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 12)
-#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 13)
-#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 14)
-#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 15)
-#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 16)
-#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 17)
-#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 18)
-#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 19)
-#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 20)
-#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 21)
-#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 22)
-#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 23)
-#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 24)
-#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 25)
-#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 26)
-#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 27)
+#define GADGET_ID_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 7)
+#define GADGET_ID_SP_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 8)
+#define GADGET_ID_CUSTOM_EXPLODE_RESULT (GADGET_ID_CHECKBUTTON_FIRST + 9)
+#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 10)
+#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 11)
+#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 12)
+#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 13)
+#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 14)
+#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 15)
+#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 16)
+#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 17)
+#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 18)
+#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 19)
+#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 20)
+#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 21)
+#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 22)
+#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 23)
+#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 24)
+#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 25)
+#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 26)
+#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 27)
+#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 28)
+#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 29)
/* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 28)
+#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 30)
#define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \
ED_NUM_ELEMENTLIST_BUTTONS - 1)
#define ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN 3
#define ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION 4
#define ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE 5
-#define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS 6
-#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE 7
-#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 8
-#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY 9
-#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 10
-#define ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION 11
-#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 12
-#define ED_SELECTBOX_ID_CHANGE_SIDES 13
-#define ED_SELECTBOX_ID_CHANGE_POWER 14
-#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE 15
-
-#define ED_NUM_SELECTBOX 16
+#define ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE 6
+#define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS 7
+#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE 8
+#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 9
+#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY 10
+#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 11
+#define ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION 12
+#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 13
+#define ED_SELECTBOX_ID_CHANGE_SIDES 14
+#define ED_SELECTBOX_ID_CHANGE_POWER 15
+#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE 16
+#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE 17
+
+#define ED_NUM_SELECTBOX 18
#define ED_SELECTBOX_ID_CUSTOM_FIRST ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE
#define ED_SELECTBOX_ID_CUSTOM_LAST ED_SELECTBOX_ID_CUSTOM_CONSISTENCY
#define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED 2
#define ED_CHECKBUTTON_ID_STICK_ELEMENT 3
#define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS 4
-#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 5
-#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 6
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 7
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 8
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 9
-#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 10
-#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 11
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT 12
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 13
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 14
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 15
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 16
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 17
-#define ED_CHECKBUTTON_ID_CHANGE_DELAY 18
-#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 19
-#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 20
-#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 21
-#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 22
-#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 23
-#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 24
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 25
-
-#define ED_NUM_CHECKBUTTONS 26
+#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 5
+#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 6
+#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 7
+#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 8
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 9
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 10
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 11
+#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 12
+#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 13
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT 14
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 15
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 16
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 17
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 18
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 19
+#define ED_CHECKBUTTON_ID_CHANGE_DELAY 20
+#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 21
+#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 22
+#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 23
+#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 24
+#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 25
+#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 26
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 27
+
+#define ED_NUM_CHECKBUTTONS 28
#define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_DOUBLE_SPEED
#define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
static struct ValueTextInfo options_move_direction[] =
{
- { MV_NO_MOVING, "automatic" },
+ { MV_AUTOMATIC, "automatic" },
{ MV_LEFT, "left" },
{ MV_RIGHT, "right" },
{ MV_UP, "up" },
{ MV_DOWN, "down" },
+ { MV_RANDOM, "random" },
+ { MV_PREVIOUS, "previous" },
{ -1, NULL }
};
{ -1, NULL }
};
+static struct ValueTextInfo options_move_leave_type[] =
+{
+ { LEAVE_TYPE_UNLIMITED, "leave behind" },
+ { LEAVE_TYPE_LIMITED, "change it to" },
+ { -1, NULL }
+};
+
static struct ValueTextInfo options_smash_targets[] =
{
{ EP_CAN_SMASH_PLAYER, "player" },
{ -1, NULL }
};
+static struct ValueTextInfo options_group_choice_mode[] =
+{
+ { ANIM_RANDOM, "random" },
+ { ANIM_LOOP, "loop" },
+ { ANIM_LINEAR, "linear" },
+ { ANIM_PINGPONG, "pingpong" },
+ { ANIM_PINGPONG2, "pingpong 2" },
+ { -1, NULL }
+};
+
static struct
{
int x, y;
&custom_element.move_stepsize,
"move/fall speed", NULL, "speed of element movement"
},
+ {
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(7),
+ GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE, GADGET_ID_NONE,
+ -1,
+ options_move_leave_type,
+ &custom_element.move_leave_type,
+ "can dig: can", ":", "leave behind or change element"
+ },
{
-1, ED_SETTINGS_YPOS(10),
GADGET_ID_CUSTOM_SMASH_TARGETS, GADGET_ID_CUSTOM_CAN_SMASH,
&custom_element.current_change_page,
NULL, NULL, "element config page"
},
+
+ /* ---------- element settings: configure (group elements) --------------- */
+
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(10),
+ GADGET_ID_GROUP_CHOICE_MODE, GADGET_ID_NONE,
+ -1,
+ options_group_choice_mode,
+ &group_element_info.choice_mode,
+ "choice type:", NULL, "type of group element choice"
+ },
};
static struct
NULL,
"slip down from certain flat walls","use EM style slipping behaviour"
},
+ {
+ ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(4),
+ 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_SETTINGS_XPOS(0), ED_COUNTER_YPOS(4),
+ 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"
+ },
/* ---------- element settings: configure (custom elements) ------------- */
GADGET_ID_CUSTOM_MOVE_ENTER, GADGET_ID_NONE,
"can dig:", " ", NULL
},
-
{
-1, ED_AREA_ELEM_CONTENT4b_YPOS,
1, 1,
- GADGET_ID_CUSTOM_MOVE_LEAVE, GADGET_ID_CUSTOM_MOVE_ENTER,
- "can leave behind:", NULL, NULL
+ GADGET_ID_CUSTOM_MOVE_LEAVE, GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE,
+ NULL, NULL, NULL
},
/* ---------- custom change target --------------------------------------- */
EL_BD_FIREFLY,
EL_MOLE_LEFT,
-#if 0
- EL_MAZE_RUNNER,
-#else
EL_EMPTY,
-#endif
EL_MOLE_RIGHT,
EL_PACMAN,
EL_SOKOBAN_OBJECT,
EL_SOKOBAN_FIELD_EMPTY,
EL_SOKOBAN_FIELD_FULL,
- EL_STEELWALL,
+ EL_SOKOBAN_FIELD_PLAYER,
};
static int *editor_hl_sokoban_ptr = editor_hl_sokoban;
static int *editor_el_sokoban_ptr = editor_el_sokoban;
}
};
+static struct
+{
+ short element;
+ short element_mapped;
+}
+forum_sketch_element_mapping[] =
+{
+ { EL_WALL_SLIPPERY, EL_WALL },
+ { EL_EXPANDABLE_WALL, EL_WALL },
+ { EL_EXPANDABLE_WALL_HORIZONTAL, EL_WALL },
+ { EL_EXPANDABLE_WALL_VERTICAL, EL_WALL },
+ { EL_EXPANDABLE_WALL_ANY, EL_WALL },
+ { EL_WALL_EMERALD, EL_WALL },
+ { EL_WALL_DIAMOND, EL_WALL },
+ { EL_WALL_BD_DIAMOND, EL_WALL },
+ { EL_WALL_EMERALD_YELLOW, EL_WALL },
+ { EL_WALL_EMERALD_RED, EL_WALL },
+ { EL_WALL_EMERALD_PURPLE, EL_WALL },
+ { EL_ACID_POOL_TOPLEFT, EL_WALL },
+ { EL_ACID_POOL_TOPRIGHT, EL_WALL },
+ { EL_ACID_POOL_BOTTOMLEFT, EL_WALL },
+ { EL_ACID_POOL_BOTTOM, EL_WALL },
+ { EL_ACID_POOL_BOTTOMRIGHT, EL_WALL },
+ { EL_BD_WALL, EL_WALL },
+
+ { EL_BD_ROCK, EL_ROCK },
+
+ { EL_SP_ZONK, EL_ROCK },
+ { EL_SP_BASE, EL_SAND },
+ { EL_SP_MURPHY, EL_PLAYER_1 },
+ { EL_SP_INFOTRON, EL_EMERALD },
+ { EL_SP_HARDWARE_GRAY, EL_STEELWALL },
+ { EL_SP_EXIT_CLOSED, EL_EXIT_OPEN },
+ { EL_SP_DISK_ORANGE, EL_BOMB },
+ { EL_SP_DISK_RED, EL_BOMB },
+ { EL_SP_DISK_YELLOW, EL_BOMB },
+ { EL_SP_PORT_RIGHT, EL_GATE_1_GRAY },
+ { EL_SP_PORT_DOWN, EL_GATE_1_GRAY },
+ { EL_SP_PORT_LEFT, EL_GATE_1_GRAY },
+ { EL_SP_PORT_UP, EL_GATE_1_GRAY },
+ { EL_SP_GRAVITY_PORT_RIGHT, EL_GATE_1_GRAY },
+ { EL_SP_GRAVITY_PORT_DOWN, EL_GATE_1_GRAY },
+ { EL_SP_GRAVITY_PORT_LEFT, EL_GATE_1_GRAY },
+ { EL_SP_GRAVITY_PORT_UP, EL_GATE_1_GRAY },
+ { EL_SP_PORT_VERTICAL, EL_GATE_1_GRAY },
+ { EL_SP_PORT_HORIZONTAL, EL_GATE_1_GRAY },
+ { EL_SP_PORT_ANY, EL_GATE_1_GRAY },
+ { EL_SP_SNIKSNAK, EL_BUG },
+ { EL_SP_ELECTRON, EL_SPACESHIP },
+ { EL_SP_CHIP_SINGLE, EL_WALL },
+ { EL_SP_CHIP_LEFT, EL_WALL },
+ { EL_SP_CHIP_RIGHT, EL_WALL },
+ { EL_SP_CHIP_TOP, EL_WALL },
+ { EL_SP_CHIP_BOTTOM, EL_WALL },
+ { EL_SP_HARDWARE_BASE_1, EL_STEELWALL },
+ { EL_SP_HARDWARE_GREEN, EL_STEELWALL },
+ { EL_SP_HARDWARE_BLUE, EL_STEELWALL },
+ { EL_SP_HARDWARE_RED, EL_STEELWALL },
+ { EL_SP_HARDWARE_YELLOW, EL_STEELWALL },
+ { EL_SP_HARDWARE_BASE_2, EL_STEELWALL },
+ { EL_SP_HARDWARE_BASE_3, EL_STEELWALL },
+ { EL_SP_HARDWARE_BASE_3, EL_STEELWALL },
+ { EL_SP_HARDWARE_BASE_4, EL_STEELWALL },
+ { EL_SP_HARDWARE_BASE_5, EL_STEELWALL },
+ { EL_SP_HARDWARE_BASE_6, EL_STEELWALL },
+
+ { EL_STEELWALL_SLIPPERY, EL_STEELWALL },
+
+ { EL_EXIT_CLOSED, EL_EXIT_OPEN },
+
+ { EL_DIAMOND, EL_EMERALD },
+ { EL_BD_DIAMOND, EL_EMERALD },
+ { EL_EMERALD_YELLOW, EL_EMERALD },
+ { EL_EMERALD_RED, EL_EMERALD },
+ { EL_EMERALD_PURPLE, EL_EMERALD },
+
+ { EL_AMOEBA_DEAD, EL_AMOEBA },
+ { EL_AMOEBA_DROP, EL_AMOEBA },
+ { EL_AMOEBA_WET, EL_AMOEBA },
+ { EL_AMOEBA_DRY, EL_AMOEBA },
+ { EL_AMOEBA_FULL, EL_AMOEBA },
+ { EL_BD_AMOEBA, EL_AMOEBA },
+ { EL_AMOEBA_TO_DIAMOND, EL_AMOEBA },
+
+ { EL_DYNAMITE_ACTIVE, EL_DYNAMITE },
+
+ { EL_GATE_2_GRAY, EL_GATE_1_GRAY },
+ { EL_GATE_3_GRAY, EL_GATE_1_GRAY },
+ { EL_GATE_4_GRAY, EL_GATE_1_GRAY },
+
+ { EL_EM_KEY_1, EL_KEY_1 },
+ { EL_EM_KEY_2, EL_KEY_2 },
+ { EL_EM_KEY_3, EL_KEY_3 },
+ { EL_EM_KEY_4, EL_KEY_4 },
+
+ { EL_EM_GATE_1, EL_GATE_1 },
+ { EL_EM_GATE_2, EL_GATE_2 },
+ { EL_EM_GATE_3, EL_GATE_3 },
+ { EL_EM_GATE_4, EL_GATE_4 },
+
+ { EL_EM_GATE_1_GRAY, EL_GATE_1_GRAY },
+ { EL_EM_GATE_2_GRAY, EL_GATE_1_GRAY },
+ { EL_EM_GATE_3_GRAY, EL_GATE_1_GRAY },
+ { EL_EM_GATE_4_GRAY, EL_GATE_1_GRAY },
+
+ { EL_INVISIBLE_SAND, EL_EMPTY },
+ { EL_INVISIBLE_WALL, EL_EMPTY },
+ { EL_INVISIBLE_STEELWALL, EL_EMPTY },
+
+ { EL_PACMAN, EL_YAMYAM },
+ { EL_DARK_YAMYAM, EL_YAMYAM },
+
+ { EL_BD_MAGIC_WALL, EL_MAGIC_WALL },
+
+ { EL_DYNABOMB_INCREASE_NUMBER, EL_BOMB },
+ { EL_DYNABOMB_INCREASE_SIZE, EL_BOMB },
+ { EL_DYNABOMB_INCREASE_POWER, EL_BOMB },
+ { EL_BLACK_ORB, EL_BOMB },
+ { EL_DX_SUPABOMB, EL_BOMB },
+
+ { EL_SOKOBAN_OBJECT, EL_KEY_1 },
+ { EL_SOKOBAN_FIELD_EMPTY, EL_GATE_1_GRAY },
+ { EL_SOKOBAN_FIELD_FULL, EL_GATE_1 },
+ { EL_SOKOBAN_FIELD_PLAYER, EL_PLAYER_1 },
+
+ { EL_BD_BUTTERFLY_RIGHT, EL_BD_BUTTERFLY },
+ { EL_BD_BUTTERFLY_UP, EL_BD_BUTTERFLY },
+ { EL_BD_BUTTERFLY_LEFT, EL_BD_BUTTERFLY },
+ { EL_BD_BUTTERFLY_DOWN, EL_BD_BUTTERFLY },
+
+ { EL_BD_FIREFLY_RIGHT, EL_BD_FIREFLY },
+ { EL_BD_FIREFLY_UP, EL_BD_FIREFLY },
+ { EL_BD_FIREFLY_LEFT, EL_BD_FIREFLY },
+ { EL_BD_FIREFLY_DOWN, EL_BD_FIREFLY },
+
+ { EL_PLAYER_2, EL_PLAYER_1 },
+ { EL_PLAYER_3, EL_PLAYER_1 },
+ { EL_PLAYER_4, EL_PLAYER_1 },
+
+ { EL_BUG_RIGHT, EL_BUG },
+ { EL_BUG_UP, EL_BUG },
+ { EL_BUG_LEFT, EL_BUG },
+ { EL_BUG_DOWN, EL_BUG },
+
+ { EL_SPACESHIP_RIGHT, EL_SPACESHIP },
+ { EL_SPACESHIP_UP, EL_SPACESHIP },
+ { EL_SPACESHIP_LEFT, EL_SPACESHIP },
+ { EL_SPACESHIP_DOWN, EL_SPACESHIP },
+
+ { EL_PACMAN_RIGHT, EL_YAMYAM },
+ { EL_PACMAN_UP, EL_YAMYAM },
+ { EL_PACMAN_LEFT, EL_YAMYAM },
+ { EL_PACMAN_DOWN, EL_YAMYAM },
+
+ { -1, -1 }
+};
+
+static struct
+{
+ short element;
+ char *element_string;
+}
+forum_sketch_element_strings[] =
+{
+ { EL_PLAYER_1, "p" },
+ { EL_EMPTY, "_" },
+ { EL_SAND, "s" },
+ { EL_ROCK, "b" },
+ { EL_EMERALD, "e" },
+ { EL_BUG, "u" },
+ { EL_SPACESHIP, "h" },
+ { EL_BD_FIREFLY, "f" },
+ { EL_BD_BUTTERFLY, "b" },
+ { EL_AMOEBA, "a" },
+ { EL_YAMYAM, "y" },
+ { EL_WALL, "w" },
+ { EL_STEELWALL, "t" },
+ { EL_MAGIC_WALL, "m" },
+ { EL_EXIT_OPEN, "x" },
+ { EL_DYNAMITE, "d" },
+ { EL_KEY_1, "1" },
+ { EL_KEY_2, "2" },
+ { EL_KEY_3, "3" },
+ { EL_KEY_4, "4" },
+ { EL_GATE_1, "5" },
+ { EL_GATE_2, "6" },
+ { EL_GATE_3, "7" },
+ { EL_GATE_4, "8" },
+ { EL_GATE_1_GRAY, "9" },
+ { EL_BOMB, "@" },
+ { EL_ROBOT, "r" },
+ { EL_ROBOT_WHEEL, "0" },
+ { EL_NUT, "n" },
+ { EL_CUSTOM_1, "c" },
+ { EL_CHAR_QUESTION, "?" },
+
+ { -1, NULL }
+};
+
/*
-----------------------------------------------------------------------------
static void copy_custom_element_settings(int element_from, int element_to)
{
+#if 1
+ struct ElementInfo ei_to_old = element_info[element_to];
+ struct ElementInfo *ei_from = &element_info[element_from];
+ struct ElementInfo *ei_to = &element_info[element_to];
+ int i;
+
+ /* ---------- copy whole element structure ---------- */
+ *ei_to = *ei_from;
+
+ /* ---------- restore structure pointers which cannot be copied ---------- */
+ ei_to->token_name = ei_to_old.token_name;
+ ei_to->class_name = ei_to_old.class_name;
+ ei_to->editor_description = ei_to_old.editor_description;
+ ei_to->custom_description = ei_to_old.custom_description;
+ ei_to->change_page = ei_to_old.change_page;
+ ei_to->change = ei_to_old.change;
+ ei_to->group = ei_to_old.group;
+
+ /* ---------- copy element base properties ---------- */
+ Properties[element_to][EP_BITFIELD_BASE] =
+ Properties[element_from][EP_BITFIELD_BASE];
+
+ /* ---------- reinitialize and copy change pages ---------- */
+ setElementChangePages(ei_to, ei_to->num_change_pages);
+
+ for (i=0; i < ei_to->num_change_pages; i++)
+ ei_to->change_page[i] = ei_from->change_page[i];
+
+ /* ---------- copy group element info ---------- */
+ if (ei_from->group != NULL && ei_to->group != NULL) /* group or internal */
+ *ei_to->group = *ei_from->group;
+
+#else
+
struct ElementInfo *ei_from = &element_info[element_from];
struct ElementInfo *ei_to = &element_info[element_to];
int i, x, y;
change_to->sides = change_from->sides;
}
+#endif
/* mark this custom element as modified */
ei_to->modified_settings = TRUE;
if (ei->content[x][y] == element_from)
ei->content[x][y] = element_to;
- for (j=0; j < ei->num_change_pages; j++)
+ for (j = 0; j < ei->num_change_pages; j++)
{
struct ElementChangeInfo *change = &ei->change_page[j];
if (change->content[x][y] == element_from)
change->content[x][y] = element_to;
}
+
+ if (ei->group != NULL) /* group or internal */
+ for (j = 0; j < MAX_ELEMENTS_IN_GROUP; j++)
+ if (ei->group->element[j] == element_from)
+ ei->group->element[j] = element_to;
}
}
Feld[x][y] = element_to;
}
-static void CopyCustomElement(int element_old, int element_new, int copy_mode)
+static boolean CopyCustomElement(int element_old, int element_new,
+ int copy_mode)
{
+ if (IS_CUSTOM_ELEMENT(element_old) && !IS_CUSTOM_ELEMENT(element_new))
+ {
+ Request("Please choose custom element !", REQ_CONFIRM);
+
+ return FALSE;
+ }
+ else if (IS_GROUP_ELEMENT(element_old) && !IS_GROUP_ELEMENT(element_new))
+ {
+ Request("Please choose group element !", REQ_CONFIRM);
+
+ return FALSE;
+ }
+
if (copy_mode == GADGET_ID_CUSTOM_COPY_FROM)
{
copy_custom_element_settings(element_new, element_old);
}
else if (copy_mode == GADGET_ID_CUSTOM_EXCHANGE)
{
- copy_custom_element_settings(element_old, EL_DUMMY);
+ copy_custom_element_settings(element_old, EL_INTERNAL_EDITOR);
copy_custom_element_settings(element_new, element_old);
- copy_custom_element_settings(EL_DUMMY, element_new);
+ copy_custom_element_settings(EL_INTERNAL_EDITOR, element_new);
- replace_custom_element_in_settings(element_old, EL_DUMMY);
+ replace_custom_element_in_settings(element_old, EL_INTERNAL_EDITOR);
replace_custom_element_in_settings(element_new, element_old);
- replace_custom_element_in_settings(EL_DUMMY, element_new);
+ replace_custom_element_in_settings(EL_INTERNAL_EDITOR, element_new);
- replace_custom_element_in_playfield(element_old, EL_DUMMY);
+ replace_custom_element_in_playfield(element_old, EL_INTERNAL_EDITOR);
replace_custom_element_in_playfield(element_new, element_old);
- replace_custom_element_in_playfield(EL_DUMMY, element_new);
+ replace_custom_element_in_playfield(EL_INTERNAL_EDITOR, element_new);
}
UpdateCustomElementGraphicGadgets();
DrawPropertiesWindow();
+
+ return TRUE;
}
static void CopyCustomElementPropertiesToEditor(int element)
IS_CUSTOM_ELEMENT(properties_element) ||
IS_GROUP_ELEMENT(properties_element) ||
IS_ENVELOPE(properties_element) ||
+ ELEM_IS_PLAYER(properties_element) ||
HAS_CONTENT(properties_element))
return TRUE;
else
if (IS_GEM(properties_element))
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS);
+ if (ELEM_IS_PLAYER(properties_element))
+ MapCheckbuttonGadget(properties_element == EL_SP_MURPHY ?
+ ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD :
+ ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD);
+
if (IS_ENVELOPE(properties_element))
{
int counter1_id = ED_COUNTER_ID_ENVELOPE_XSIZE;
/* draw counter gadgets */
MapCounterButtons(ED_COUNTER_ID_GROUP_CONTENT);
+ /* draw selectbox gadgets */
+ MapSelectboxGadget(ED_SELECTBOX_ID_GROUP_CHOICE_MODE);
+
/* draw drawing area gadgets */
DrawGroupElementArea(properties_element);
UnmapLevelEditorToolboxDrawingGadgets();
UnmapLevelEditorToolboxCustomGadgets();
- if (IS_CUSTOM_ELEMENT(properties_element))
+ if (IS_CUSTOM_ELEMENT(properties_element) ||
+ IS_GROUP_ELEMENT(properties_element))
MapLevelEditorToolboxCustomGadgets();
SetMainBackgroundImage(IMG_BACKGROUND_EDITOR);
#define CB_BRUSH_TO_CURSOR 1
#define CB_BRUSH_TO_LEVEL 2
#define CB_DELETE_OLD_CURSOR 3
+#define CB_DUMP_BRUSH 4
static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
int button, int mode)
int new_element = BUTTON_ELEMENT(button);
int x, y;
+ if (mode == CB_DUMP_BRUSH)
+ {
+ if (!draw_with_brush)
+ {
+ Error(ERR_WARN, "no brush selected");
+
+ return;
+ }
+
+ for (y = 0; y < brush_height; y++)
+ {
+ for (x = 0; x < brush_width; x++)
+ {
+ int element = brush_buffer[x][y];
+ int element_mapped = element;
+ char *element_string = "?";
+ int k;
+
+ for (k = 0; forum_sketch_element_mapping[k].element != -1; k++)
+ {
+ if (forum_sketch_element_mapping[k].element == element)
+ {
+ element_mapped = forum_sketch_element_mapping[k].element_mapped;
+ break;
+ }
+ }
+
+ if (IS_CUSTOM_ELEMENT(element))
+ element_mapped = EL_CUSTOM_1;
+
+ for (k = 0; forum_sketch_element_strings[k].element != -1; k++)
+ {
+ if (forum_sketch_element_strings[k].element == element_mapped)
+ {
+ element_string = forum_sketch_element_strings[k].element_string;
+ break;
+ }
+ }
+
+ printf("`%s", element_string);
+ }
+
+ printf("\n");
+ }
+
+ return;
+ }
+
if (mode == CB_DELETE_OLD_CURSOR && !delete_old_brush)
return;
CopyBrushExt(0, 0, 0, 0, 0, CB_DELETE_OLD_CURSOR);
}
+void DumpBrush()
+{
+ CopyBrushExt(0, 0, 0, 0, 0, CB_DUMP_BRUSH);
+}
+
static void FloodFill(int from_x, int from_y, int fill_element)
{
int i,x,y;
else if ((type_id >= ED_SELECTBOX_ID_CUSTOM_FIRST &&
type_id <= ED_SELECTBOX_ID_CUSTOM_LAST) ||
(type_id >= ED_SELECTBOX_ID_CHANGE_FIRST &&
- type_id <= ED_SELECTBOX_ID_CHANGE_LAST))
+ type_id <= ED_SELECTBOX_ID_CHANGE_LAST) ||
+ (type_id == ED_SELECTBOX_ID_GROUP_CHOICE_MODE))
CopyElementPropertiesToGame(properties_element);
}
edit_mode = ED_MODE_DRAWING;
}
+ /* element copy mode active, but no element button pressed => deactivate */
+ if (last_custom_copy_mode != -1 && id < ED_NUM_CTRL_BUTTONS)
+ last_custom_copy_mode = -1;
+
switch (id)
{
case GADGET_ID_SCROLL_LEFT:
if (last_custom_copy_mode != -1)
{
- CopyCustomElement(properties_element, new_element,
- last_custom_copy_mode);
-
- ClickOnGadget(level_editor_gadget[last_drawing_function],
- MB_LEFTBUTTON);
+ if (CopyCustomElement(properties_element, new_element,
+ last_custom_copy_mode))
+ {
+ ClickOnGadget(level_editor_gadget[last_drawing_function],
+ MB_LEFTBUTTON);
- last_custom_copy_mode = -1;
+ last_custom_copy_mode = -1;
+ }
break;
}
strncpy(infotext, getElementInfoText(Feld[lx][ly]), max_infotext_len);
else
sprintf(infotext, "Level position: %d, %d", lx, ly);
-
- infotext[max_infotext_len] = '\0';
#else
else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT)
DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2,
}
else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT)
{
+ int element = EL_EMPTY;
+
if (id == GADGET_ID_AMOEBA_CONTENT)
- text = getElementInfoText(level.amoeba_content);
+ element = level.amoeba_content;
else if (id == GADGET_ID_CUSTOM_GRAPHIC)
- text = getElementInfoText(custom_element.gfx_element);
+ element = custom_element.gfx_element;
else if (id == GADGET_ID_CUSTOM_CONTENT)
- text = getElementInfoText(custom_element.content[sx][sy]);
+ element = custom_element.content[sx][sy];
else if (id == GADGET_ID_CUSTOM_MOVE_ENTER)
- text = getElementInfoText(custom_element.move_enter_element);
+ element = custom_element.move_enter_element;
else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE)
- text = getElementInfoText(custom_element.move_leave_element);
+ element = custom_element.move_leave_element;
else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
- text = getElementInfoText(custom_element_change.target_element);
+ element = custom_element_change.target_element;
else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
- text = getElementInfoText(custom_element_change.content[sx][sy]);
+ element = custom_element_change.content[sx][sy];
else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
- text = getElementInfoText(custom_element_change.trigger_element);
+ element = custom_element_change.trigger_element;
else if (id == GADGET_ID_GROUP_CONTENT)
- text = getElementInfoText(group_element_info.element[sx]);
+ element = group_element_info.element[sx];
else if (id == GADGET_ID_RANDOM_BACKGROUND)
- text = getElementInfoText(random_placement_background_element);
+ element = random_placement_background_element;
else if (id >= GADGET_ID_ELEMENT_CONTENT_0 &&
id <= GADGET_ID_ELEMENT_CONTENT_7)
- {
- int i = id - GADGET_ID_ELEMENT_CONTENT_0;
-
- text = getElementInfoText(level.yamyam_content[i][sx][sy]);
- }
+ element = level.yamyam_content[id - GADGET_ID_ELEMENT_CONTENT_0][sx][sy];
- strncpy(infotext, text, max_infotext_len);
- infotext[max_infotext_len] = '\0';
+ strncpy(infotext, getElementInfoText(element), max_infotext_len);
}
else
{
else if (id == GADGET_ID_CUSTOM_CONTENT)
sprintf(infotext, "Custom element content position: %d, %d", sx, sy);
else if (id == GADGET_ID_CUSTOM_MOVE_ENTER)
- strcpy(infotext, "Element that can be digged");
+ strcpy(infotext, "Element that can be digged/collected");
else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE)
- strcpy(infotext, "Element that can be left behind");
+ strcpy(infotext, "Element that will be left behind");
else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
strcpy(infotext, "New element after change");
else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
id - GADGET_ID_ELEMENT_CONTENT_0 + 1, sx, sy);
}
+ infotext[max_infotext_len] = '\0';
+
if (strlen(infotext) > 0)
DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, infotext);
}