/* yamyam content */
#define ED_AREA_YAMYAM_CONTENT_XPOS(n) (2 * MINI_TILEX + \
5 * ((n) % 4) * MINI_TILEX)
-#define ED_AREA_YAMYAM_CONTENT_YPOS(n) (17 * MINI_TILEY + \
+#define ED_AREA_YAMYAM_CONTENT_YPOS(n) (11 * ED_SETTINGS_YOFFSET + \
6 * ((n) / 4) * MINI_TILEY)
/* magic ball content */
#define ED_AREA_MAGIC_BALL_CONTENT_XPOS(n) (2 * MINI_TILEX + \
5 * ((n) % 4) * MINI_TILEX)
-#define ED_AREA_MAGIC_BALL_CONTENT_YPOS(n) (17 * MINI_TILEY + \
+#define ED_AREA_MAGIC_BALL_CONTENT_YPOS(n) (12 * ED_SETTINGS_YOFFSET + \
6 * ((n) / 4) * MINI_TILEY)
/* values for scrolling gadgets for drawing area */
#define ED_TEXTBUTTON_XSIZE ED_WIN_COUNT_XSIZE
#define ED_TEXTBUTTON_YSIZE ED_WIN_COUNT_YSIZE
-/* values for ClearEditorGadgetInfoText() and HandleGadgetInfoText() */
+/* values for ClearEditorGadgetInfoText() and HandleEditorGadgetInfoText() */
#define INFOTEXT_XPOS SX
#define INFOTEXT_YPOS (SY + SYSIZE - MINI_TILEX + 2)
#define INFOTEXT_XSIZE SXSIZE
#define GADGET_ID_YAMYAM_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 33)
#define GADGET_ID_YAMYAM_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 34)
#define GADGET_ID_YAMYAM_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 35)
-#define GADGET_ID_ENVELOPE_XSIZE_DOWN (GADGET_ID_COUNTER_FIRST + 36)
-#define GADGET_ID_ENVELOPE_XSIZE_TEXT (GADGET_ID_COUNTER_FIRST + 37)
-#define GADGET_ID_ENVELOPE_XSIZE_UP (GADGET_ID_COUNTER_FIRST + 38)
-#define GADGET_ID_ENVELOPE_YSIZE_DOWN (GADGET_ID_COUNTER_FIRST + 39)
-#define GADGET_ID_ENVELOPE_YSIZE_TEXT (GADGET_ID_COUNTER_FIRST + 40)
-#define GADGET_ID_ENVELOPE_YSIZE_UP (GADGET_ID_COUNTER_FIRST + 41)
-#define GADGET_ID_CUSTOM_SCORE_DOWN (GADGET_ID_COUNTER_FIRST + 42)
-#define GADGET_ID_CUSTOM_SCORE_TEXT (GADGET_ID_COUNTER_FIRST + 43)
-#define GADGET_ID_CUSTOM_SCORE_UP (GADGET_ID_COUNTER_FIRST + 44)
-#define GADGET_ID_CUSTOM_GEMCOUNT_DOWN (GADGET_ID_COUNTER_FIRST + 45)
-#define GADGET_ID_CUSTOM_GEMCOUNT_TEXT (GADGET_ID_COUNTER_FIRST + 46)
-#define GADGET_ID_CUSTOM_GEMCOUNT_UP (GADGET_ID_COUNTER_FIRST + 47)
-#define GADGET_ID_CUSTOM_VALUE_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 48)
-#define GADGET_ID_CUSTOM_VALUE_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 49)
-#define GADGET_ID_CUSTOM_VALUE_FIX_UP (GADGET_ID_COUNTER_FIRST + 50)
-#define GADGET_ID_CUSTOM_VALUE_RND_DOWN (GADGET_ID_COUNTER_FIRST + 51)
-#define GADGET_ID_CUSTOM_VALUE_RND_TEXT (GADGET_ID_COUNTER_FIRST + 52)
-#define GADGET_ID_CUSTOM_VALUE_RND_UP (GADGET_ID_COUNTER_FIRST + 53)
-#define GADGET_ID_PUSH_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 54)
-#define GADGET_ID_PUSH_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 55)
-#define GADGET_ID_PUSH_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 56)
-#define GADGET_ID_PUSH_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 57)
-#define GADGET_ID_PUSH_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 58)
-#define GADGET_ID_PUSH_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 59)
-#define GADGET_ID_DROP_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 60)
-#define GADGET_ID_DROP_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 61)
-#define GADGET_ID_DROP_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 62)
-#define GADGET_ID_DROP_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 63)
-#define GADGET_ID_DROP_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 64)
-#define GADGET_ID_DROP_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 65)
-#define GADGET_ID_MOVE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 66)
-#define GADGET_ID_MOVE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 67)
-#define GADGET_ID_MOVE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 68)
-#define GADGET_ID_MOVE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 69)
-#define GADGET_ID_MOVE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 70)
-#define GADGET_ID_MOVE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 71)
-#define GADGET_ID_EXPLOSION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 72)
-#define GADGET_ID_EXPLOSION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 73)
-#define GADGET_ID_EXPLOSION_DELAY_UP (GADGET_ID_COUNTER_FIRST + 74)
-#define GADGET_ID_IGNITION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 75)
-#define GADGET_ID_IGNITION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 76)
-#define GADGET_ID_IGNITION_DELAY_UP (GADGET_ID_COUNTER_FIRST + 77)
-#define GADGET_ID_CHANGE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 78)
-#define GADGET_ID_CHANGE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 79)
-#define GADGET_ID_CHANGE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 80)
-#define GADGET_ID_CHANGE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 81)
-#define GADGET_ID_CHANGE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 82)
-#define GADGET_ID_CHANGE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 83)
-#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 84)
-#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 85)
-#define GADGET_ID_CHANGE_CONT_RND_UP (GADGET_ID_COUNTER_FIRST + 86)
-#define GADGET_ID_GROUP_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 87)
-#define GADGET_ID_GROUP_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 88)
-#define GADGET_ID_GROUP_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 89)
+#define GADGET_ID_BALL_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 36)
+#define GADGET_ID_BALL_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 37)
+#define GADGET_ID_BALL_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 38)
+#define GADGET_ID_ANDROID_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 39)
+#define GADGET_ID_ANDROID_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 40)
+#define GADGET_ID_ANDROID_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 41)
+#define GADGET_ID_ENVELOPE_XSIZE_DOWN (GADGET_ID_COUNTER_FIRST + 42)
+#define GADGET_ID_ENVELOPE_XSIZE_TEXT (GADGET_ID_COUNTER_FIRST + 43)
+#define GADGET_ID_ENVELOPE_XSIZE_UP (GADGET_ID_COUNTER_FIRST + 44)
+#define GADGET_ID_ENVELOPE_YSIZE_DOWN (GADGET_ID_COUNTER_FIRST + 45)
+#define GADGET_ID_ENVELOPE_YSIZE_TEXT (GADGET_ID_COUNTER_FIRST + 46)
+#define GADGET_ID_ENVELOPE_YSIZE_UP (GADGET_ID_COUNTER_FIRST + 47)
+#define GADGET_ID_CUSTOM_SCORE_DOWN (GADGET_ID_COUNTER_FIRST + 48)
+#define GADGET_ID_CUSTOM_SCORE_TEXT (GADGET_ID_COUNTER_FIRST + 49)
+#define GADGET_ID_CUSTOM_SCORE_UP (GADGET_ID_COUNTER_FIRST + 50)
+#define GADGET_ID_CUSTOM_GEMCOUNT_DOWN (GADGET_ID_COUNTER_FIRST + 51)
+#define GADGET_ID_CUSTOM_GEMCOUNT_TEXT (GADGET_ID_COUNTER_FIRST + 52)
+#define GADGET_ID_CUSTOM_GEMCOUNT_UP (GADGET_ID_COUNTER_FIRST + 53)
+#define GADGET_ID_CUSTOM_VALUE_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 54)
+#define GADGET_ID_CUSTOM_VALUE_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 55)
+#define GADGET_ID_CUSTOM_VALUE_FIX_UP (GADGET_ID_COUNTER_FIRST + 56)
+#define GADGET_ID_CUSTOM_VALUE_RND_DOWN (GADGET_ID_COUNTER_FIRST + 57)
+#define GADGET_ID_CUSTOM_VALUE_RND_TEXT (GADGET_ID_COUNTER_FIRST + 58)
+#define GADGET_ID_CUSTOM_VALUE_RND_UP (GADGET_ID_COUNTER_FIRST + 59)
+#define GADGET_ID_PUSH_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 60)
+#define GADGET_ID_PUSH_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 61)
+#define GADGET_ID_PUSH_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 62)
+#define GADGET_ID_PUSH_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 63)
+#define GADGET_ID_PUSH_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 64)
+#define GADGET_ID_PUSH_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 65)
+#define GADGET_ID_DROP_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 66)
+#define GADGET_ID_DROP_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 67)
+#define GADGET_ID_DROP_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 68)
+#define GADGET_ID_DROP_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 69)
+#define GADGET_ID_DROP_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 70)
+#define GADGET_ID_DROP_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 71)
+#define GADGET_ID_MOVE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 72)
+#define GADGET_ID_MOVE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 73)
+#define GADGET_ID_MOVE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 74)
+#define GADGET_ID_MOVE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 75)
+#define GADGET_ID_MOVE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 76)
+#define GADGET_ID_MOVE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 77)
+#define GADGET_ID_EXPLOSION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 78)
+#define GADGET_ID_EXPLOSION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 79)
+#define GADGET_ID_EXPLOSION_DELAY_UP (GADGET_ID_COUNTER_FIRST + 80)
+#define GADGET_ID_IGNITION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 81)
+#define GADGET_ID_IGNITION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 82)
+#define GADGET_ID_IGNITION_DELAY_UP (GADGET_ID_COUNTER_FIRST + 83)
+#define GADGET_ID_CHANGE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 84)
+#define GADGET_ID_CHANGE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 85)
+#define GADGET_ID_CHANGE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 86)
+#define GADGET_ID_CHANGE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 87)
+#define GADGET_ID_CHANGE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 88)
+#define GADGET_ID_CHANGE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 89)
+#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 90)
+#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 91)
+#define GADGET_ID_CHANGE_CONT_RND_UP (GADGET_ID_COUNTER_FIRST + 92)
+#define GADGET_ID_GROUP_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 93)
+#define GADGET_ID_GROUP_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 94)
+#define GADGET_ID_GROUP_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 95)
/* drawing area identifiers */
-#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 90)
+#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 96)
#define GADGET_ID_DRAWING_LEVEL (GADGET_ID_DRAWING_AREA_FIRST + 0)
#define GADGET_ID_YAMYAM_CONTENT_0 (GADGET_ID_DRAWING_AREA_FIRST + 1)
#define GADGET_ID_MAGIC_BALL_CONTENT_5 (GADGET_ID_DRAWING_AREA_FIRST + 14)
#define GADGET_ID_MAGIC_BALL_CONTENT_6 (GADGET_ID_DRAWING_AREA_FIRST + 15)
#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_CUSTOM_GRAPHIC (GADGET_ID_DRAWING_AREA_FIRST + 18)
-#define GADGET_ID_CUSTOM_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 19)
-#define GADGET_ID_CUSTOM_MOVE_ENTER (GADGET_ID_DRAWING_AREA_FIRST + 20)
-#define GADGET_ID_CUSTOM_MOVE_LEAVE (GADGET_ID_DRAWING_AREA_FIRST + 21)
-#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 22)
-#define GADGET_ID_CUSTOM_CHANGE_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 23)
-#define GADGET_ID_CUSTOM_CHANGE_TRIGGER (GADGET_ID_DRAWING_AREA_FIRST + 24)
-#define GADGET_ID_GROUP_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 25)
-#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 26)
+#define GADGET_ID_ANDROID_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 17)
+#define GADGET_ID_AMOEBA_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 18)
+#define GADGET_ID_START_ELEMENT (GADGET_ID_DRAWING_AREA_FIRST + 19)
+#define GADGET_ID_ARTWORK_ELEMENT (GADGET_ID_DRAWING_AREA_FIRST + 20)
+#define GADGET_ID_EXPLOSION_ELEMENT (GADGET_ID_DRAWING_AREA_FIRST + 21)
+#define GADGET_ID_CUSTOM_GRAPHIC (GADGET_ID_DRAWING_AREA_FIRST + 22)
+#define GADGET_ID_CUSTOM_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 23)
+#define GADGET_ID_CUSTOM_MOVE_ENTER (GADGET_ID_DRAWING_AREA_FIRST + 24)
+#define GADGET_ID_CUSTOM_MOVE_LEAVE (GADGET_ID_DRAWING_AREA_FIRST + 25)
+#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 26)
+#define GADGET_ID_CUSTOM_CHANGE_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 27)
+#define GADGET_ID_CUSTOM_CHANGE_TRIGGER (GADGET_ID_DRAWING_AREA_FIRST + 28)
+#define GADGET_ID_GROUP_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 29)
+#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 30)
/* text input identifiers */
-#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 27)
+#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 31)
#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_TIME_OR_STEPS (GADGET_ID_SELECTBOX_FIRST + 0)
#define GADGET_ID_GAME_ENGINE_TYPE (GADGET_ID_SELECTBOX_FIRST + 1)
#define GADGET_ID_WIND_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 2)
-#define GADGET_ID_CUSTOM_WALK_TO_ACTION (GADGET_ID_SELECTBOX_FIRST + 3)
-#define GADGET_ID_CUSTOM_EXPLOSION_TYPE (GADGET_ID_SELECTBOX_FIRST + 4)
-#define GADGET_ID_CUSTOM_DEADLINESS (GADGET_ID_SELECTBOX_FIRST + 5)
-#define GADGET_ID_CUSTOM_MOVE_PATTERN (GADGET_ID_SELECTBOX_FIRST + 6)
-#define GADGET_ID_CUSTOM_MOVE_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 7)
-#define GADGET_ID_CUSTOM_MOVE_STEPSIZE (GADGET_ID_SELECTBOX_FIRST + 8)
-#define GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE (GADGET_ID_SELECTBOX_FIRST + 9)
-#define GADGET_ID_CUSTOM_SMASH_TARGETS (GADGET_ID_SELECTBOX_FIRST + 10)
-#define GADGET_ID_CUSTOM_SLIPPERY_TYPE (GADGET_ID_SELECTBOX_FIRST + 11)
-#define GADGET_ID_CUSTOM_ACCESS_TYPE (GADGET_ID_SELECTBOX_FIRST + 12)
-#define GADGET_ID_CUSTOM_ACCESS_LAYER (GADGET_ID_SELECTBOX_FIRST + 13)
-#define GADGET_ID_CUSTOM_ACCESS_PROTECTED (GADGET_ID_SELECTBOX_FIRST + 14)
-#define GADGET_ID_CUSTOM_ACCESS_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 15)
-#define GADGET_ID_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 16)
-#define GADGET_ID_CHANGE_DIRECT_ACTION (GADGET_ID_SELECTBOX_FIRST + 17)
-#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 18)
-#define GADGET_ID_CHANGE_SIDE (GADGET_ID_SELECTBOX_FIRST + 19)
-#define GADGET_ID_CHANGE_PLAYER (GADGET_ID_SELECTBOX_FIRST + 20)
-#define GADGET_ID_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 21)
-#define GADGET_ID_CHANGE_REPLACE_WHEN (GADGET_ID_SELECTBOX_FIRST + 22)
-#define GADGET_ID_ACTION_TYPE (GADGET_ID_SELECTBOX_FIRST + 23)
-#define GADGET_ID_ACTION_MODE (GADGET_ID_SELECTBOX_FIRST + 24)
-#define GADGET_ID_ACTION_ARG (GADGET_ID_SELECTBOX_FIRST + 25)
-#define GADGET_ID_SELECT_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 26)
-#define GADGET_ID_GROUP_CHOICE_MODE (GADGET_ID_SELECTBOX_FIRST + 27)
+#define GADGET_ID_PLAYER_SPEED (GADGET_ID_SELECTBOX_FIRST + 3)
+#define GADGET_ID_CUSTOM_WALK_TO_ACTION (GADGET_ID_SELECTBOX_FIRST + 4)
+#define GADGET_ID_CUSTOM_EXPLOSION_TYPE (GADGET_ID_SELECTBOX_FIRST + 5)
+#define GADGET_ID_CUSTOM_DEADLINESS (GADGET_ID_SELECTBOX_FIRST + 6)
+#define GADGET_ID_CUSTOM_MOVE_PATTERN (GADGET_ID_SELECTBOX_FIRST + 7)
+#define GADGET_ID_CUSTOM_MOVE_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 8)
+#define GADGET_ID_CUSTOM_MOVE_STEPSIZE (GADGET_ID_SELECTBOX_FIRST + 9)
+#define GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE (GADGET_ID_SELECTBOX_FIRST + 10)
+#define GADGET_ID_CUSTOM_SMASH_TARGETS (GADGET_ID_SELECTBOX_FIRST + 11)
+#define GADGET_ID_CUSTOM_SLIPPERY_TYPE (GADGET_ID_SELECTBOX_FIRST + 12)
+#define GADGET_ID_CUSTOM_ACCESS_TYPE (GADGET_ID_SELECTBOX_FIRST + 13)
+#define GADGET_ID_CUSTOM_ACCESS_LAYER (GADGET_ID_SELECTBOX_FIRST + 14)
+#define GADGET_ID_CUSTOM_ACCESS_PROTECTED (GADGET_ID_SELECTBOX_FIRST + 15)
+#define GADGET_ID_CUSTOM_ACCESS_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 16)
+#define GADGET_ID_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 17)
+#define GADGET_ID_CHANGE_DIRECT_ACTION (GADGET_ID_SELECTBOX_FIRST + 18)
+#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 19)
+#define GADGET_ID_CHANGE_SIDE (GADGET_ID_SELECTBOX_FIRST + 20)
+#define GADGET_ID_CHANGE_PLAYER (GADGET_ID_SELECTBOX_FIRST + 21)
+#define GADGET_ID_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 22)
+#define GADGET_ID_CHANGE_REPLACE_WHEN (GADGET_ID_SELECTBOX_FIRST + 23)
+#define GADGET_ID_ACTION_TYPE (GADGET_ID_SELECTBOX_FIRST + 24)
+#define GADGET_ID_ACTION_MODE (GADGET_ID_SELECTBOX_FIRST + 25)
+#define GADGET_ID_ACTION_ARG (GADGET_ID_SELECTBOX_FIRST + 26)
+#define GADGET_ID_SELECT_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 27)
+#define GADGET_ID_GROUP_CHOICE_MODE (GADGET_ID_SELECTBOX_FIRST + 28)
/* textbutton identifiers */
-#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 28)
+#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 29)
#define GADGET_ID_PROPERTIES_INFO (GADGET_ID_TEXTBUTTON_FIRST + 0)
#define GADGET_ID_PROPERTIES_CONFIG (GADGET_ID_TEXTBUTTON_FIRST + 1)
#define GADGET_ID_EM_SLIPPERY_GEMS (GADGET_ID_CHECKBUTTON_FIRST + 5)
#define GADGET_ID_USE_SPRING_BUG (GADGET_ID_CHECKBUTTON_FIRST + 6)
#define GADGET_ID_USE_TIME_ORB_BUG (GADGET_ID_CHECKBUTTON_FIRST + 7)
-#define GADGET_ID_GROW_INTO_DIGGABLE (GADGET_ID_CHECKBUTTON_FIRST + 8)
-#define GADGET_ID_DOUBLE_SPEED (GADGET_ID_CHECKBUTTON_FIRST + 9)
-#define GADGET_ID_BLOCK_SNAP_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 10)
-#define GADGET_ID_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 11)
-#define GADGET_ID_SP_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 12)
-#define GADGET_ID_INSTANT_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 13)
-#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 14)
-#define GADGET_ID_CAN_FALL_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 15)
-#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 16)
-#define GADGET_ID_DONT_COLLIDE_WITH (GADGET_ID_CHECKBUTTON_FIRST + 17)
-#define GADGET_ID_CUSTOM_INDESTRUCTIBLE (GADGET_ID_CHECKBUTTON_FIRST + 18)
-#define GADGET_ID_CUSTOM_CAN_EXPLODE (GADGET_ID_CHECKBUTTON_FIRST + 19)
-#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 20)
-#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 21)
-#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 22)
-#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 23)
-#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 24)
-#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 25)
-#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 26)
-#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 27)
-#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 28)
-#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 29)
-#define GADGET_ID_CUSTOM_GRAV_REACHABLE (GADGET_ID_CHECKBUTTON_FIRST + 30)
-#define GADGET_ID_CUSTOM_USE_LAST_VALUE (GADGET_ID_CHECKBUTTON_FIRST + 31)
-#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 32)
-#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 33)
-#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 34)
-#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 35)
-#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 36)
-#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 37)
-#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 38)
-#define GADGET_ID_CHANGE_HAS_ACTION (GADGET_ID_CHECKBUTTON_FIRST + 39)
-#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 40)
-#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 41)
-#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 42)
+#define GADGET_ID_RANDOM_BALL_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 8)
+#define GADGET_ID_INITIAL_BALL_STATE (GADGET_ID_CHECKBUTTON_FIRST + 9)
+#define GADGET_ID_GROW_INTO_DIGGABLE (GADGET_ID_CHECKBUTTON_FIRST + 10)
+#define GADGET_ID_CONTINUOUS_SNAPPING (GADGET_ID_CHECKBUTTON_FIRST + 11)
+#define GADGET_ID_BLOCK_SNAP_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 12)
+#define GADGET_ID_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 13)
+#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_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 + 43)
+#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_COUNTER_ID_ELEMENT_VALUE3 9
#define ED_COUNTER_ID_ELEMENT_VALUE4 10
#define ED_COUNTER_ID_YAMYAM_CONTENT 11
-#define ED_COUNTER_ID_ENVELOPE_XSIZE 12
-#define ED_COUNTER_ID_ENVELOPE_YSIZE 13
-#define ED_COUNTER_ID_CUSTOM_SCORE 14
-#define ED_COUNTER_ID_CUSTOM_GEMCOUNT 15
-#define ED_COUNTER_ID_CUSTOM_VALUE_FIX 16
-#define ED_COUNTER_ID_CUSTOM_VALUE_RND 17
-#define ED_COUNTER_ID_PUSH_DELAY_FIX 18
-#define ED_COUNTER_ID_PUSH_DELAY_RND 19
-#define ED_COUNTER_ID_DROP_DELAY_FIX 20
-#define ED_COUNTER_ID_DROP_DELAY_RND 21
-#define ED_COUNTER_ID_MOVE_DELAY_FIX 22
-#define ED_COUNTER_ID_MOVE_DELAY_RND 23
-#define ED_COUNTER_ID_EXPLOSION_DELAY 24
-#define ED_COUNTER_ID_IGNITION_DELAY 25
-#define ED_COUNTER_ID_GROUP_CONTENT 26
-#define ED_COUNTER_ID_CHANGE_DELAY_FIX 27
-#define ED_COUNTER_ID_CHANGE_DELAY_RND 28
-#define ED_COUNTER_ID_CHANGE_CONT_RND 29
-
-#define ED_NUM_COUNTERBUTTONS 30
+#define ED_COUNTER_ID_BALL_CONTENT 12
+#define ED_COUNTER_ID_ANDROID_CONTENT 13
+#define ED_COUNTER_ID_ENVELOPE_XSIZE 14
+#define ED_COUNTER_ID_ENVELOPE_YSIZE 15
+#define ED_COUNTER_ID_CUSTOM_SCORE 16
+#define ED_COUNTER_ID_CUSTOM_GEMCOUNT 17
+#define ED_COUNTER_ID_CUSTOM_VALUE_FIX 18
+#define ED_COUNTER_ID_CUSTOM_VALUE_RND 19
+#define ED_COUNTER_ID_PUSH_DELAY_FIX 20
+#define ED_COUNTER_ID_PUSH_DELAY_RND 21
+#define ED_COUNTER_ID_DROP_DELAY_FIX 22
+#define ED_COUNTER_ID_DROP_DELAY_RND 23
+#define ED_COUNTER_ID_MOVE_DELAY_FIX 24
+#define ED_COUNTER_ID_MOVE_DELAY_RND 25
+#define ED_COUNTER_ID_EXPLOSION_DELAY 26
+#define ED_COUNTER_ID_IGNITION_DELAY 27
+#define ED_COUNTER_ID_GROUP_CONTENT 28
+#define ED_COUNTER_ID_CHANGE_DELAY_FIX 29
+#define ED_COUNTER_ID_CHANGE_DELAY_RND 30
+#define ED_COUNTER_ID_CHANGE_CONT_RND 31
+
+#define ED_NUM_COUNTERBUTTONS 32
#define ED_COUNTER_ID_LEVEL_FIRST ED_COUNTER_ID_LEVEL_XSIZE
#define ED_COUNTER_ID_LEVEL_LAST ED_COUNTER_ID_LEVEL_RANDOM
#define ED_SELECTBOX_ID_TIME_OR_STEPS 0
#define ED_SELECTBOX_ID_GAME_ENGINE_TYPE 1
#define ED_SELECTBOX_ID_WIND_DIRECTION 2
-#define ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE 3
-#define ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER 4
-#define ED_SELECTBOX_ID_CUSTOM_ACCESS_PROTECTED 5
-#define ED_SELECTBOX_ID_CUSTOM_ACCESS_DIRECTION 6
-#define ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION 7
-#define ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN 8
-#define ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION 9
-#define ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE 10
-#define ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE 11
-#define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS 12
-#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE 13
-#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 14
-#define ED_SELECTBOX_ID_CUSTOM_EXPLOSION_TYPE 15
-#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 16
-#define ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION 17
-#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 18
-#define ED_SELECTBOX_ID_CHANGE_SIDE 19
-#define ED_SELECTBOX_ID_CHANGE_PLAYER 20
-#define ED_SELECTBOX_ID_CHANGE_PAGE 21
-#define ED_SELECTBOX_ID_CHANGE_REPLACE_WHEN 22
-#define ED_SELECTBOX_ID_ACTION_TYPE 23
-#define ED_SELECTBOX_ID_ACTION_MODE 24
-#define ED_SELECTBOX_ID_ACTION_ARG 25
-#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE 26
-#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE 27
-
-#define ED_NUM_SELECTBOX 28
+#define ED_SELECTBOX_ID_PLAYER_SPEED 3
+#define ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE 4
+#define ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER 5
+#define ED_SELECTBOX_ID_CUSTOM_ACCESS_PROTECTED 6
+#define ED_SELECTBOX_ID_CUSTOM_ACCESS_DIRECTION 7
+#define ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION 8
+#define ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN 9
+#define ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION 10
+#define ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE 11
+#define ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE 12
+#define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS 13
+#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE 14
+#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 15
+#define ED_SELECTBOX_ID_CUSTOM_EXPLOSION_TYPE 16
+#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 17
+#define ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION 18
+#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 19
+#define ED_SELECTBOX_ID_CHANGE_SIDE 20
+#define ED_SELECTBOX_ID_CHANGE_PLAYER 21
+#define ED_SELECTBOX_ID_CHANGE_PAGE 22
+#define ED_SELECTBOX_ID_CHANGE_REPLACE_WHEN 23
+#define ED_SELECTBOX_ID_ACTION_TYPE 24
+#define ED_SELECTBOX_ID_ACTION_MODE 25
+#define ED_SELECTBOX_ID_ACTION_ARG 26
+#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE 27
+#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE 28
+
+#define ED_NUM_SELECTBOX 29
#define ED_SELECTBOX_ID_LEVEL_FIRST ED_SELECTBOX_ID_TIME_OR_STEPS
#define ED_SELECTBOX_ID_LEVEL_LAST ED_SELECTBOX_ID_WIND_DIRECTION
#define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS 3
#define ED_CHECKBUTTON_ID_USE_SPRING_BUG 4
#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG 5
-#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE 6
-#define ED_CHECKBUTTON_ID_DOUBLE_SPEED 7
-#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD 8
-#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 9
-#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 10
-#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION 11
-#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 12
-#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID 13
-#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 14
-#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH 15
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 16
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 17
-#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 18
-#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE 19
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE 20
-#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 21
-#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE 22
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 23
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 24
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 25
-#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 26
-#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 27
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE 28
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 29
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 30
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 31
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 32
-#define ED_CHECKBUTTON_ID_CHANGE_DELAY 33
-#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 34
-#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 35
-#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 36
-#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 37
-#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 38
-#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 39
-#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION 40
-
-#define ED_NUM_CHECKBUTTONS 41
+#define ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT 6
+#define ED_CHECKBUTTON_ID_INITIAL_BALL_STATE 7
+#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE 8
+#define ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING 9
+#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD 10
+#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 11
+#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_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_5 14
#define ED_DRAWING_ID_MAGIC_BALL_CONTENT_6 15
#define ED_DRAWING_ID_MAGIC_BALL_CONTENT_7 16
-#define ED_DRAWING_ID_AMOEBA_CONTENT 17
-#define ED_DRAWING_ID_CUSTOM_GRAPHIC 18
-#define ED_DRAWING_ID_CUSTOM_CONTENT 19
-#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER 20
-#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE 21
-#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET 22
-#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT 23
-#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER 24
-#define ED_DRAWING_ID_GROUP_CONTENT 25
-#define ED_DRAWING_ID_RANDOM_BACKGROUND 26
-
-#define ED_NUM_DRAWING_AREAS 27
+#define ED_DRAWING_ID_ANDROID_CONTENT 17
+#define ED_DRAWING_ID_AMOEBA_CONTENT 18
+#define ED_DRAWING_ID_START_ELEMENT 19
+#define ED_DRAWING_ID_ARTWORK_ELEMENT 20
+#define ED_DRAWING_ID_EXPLOSION_ELEMENT 21
+#define ED_DRAWING_ID_CUSTOM_GRAPHIC 22
+#define ED_DRAWING_ID_CUSTOM_CONTENT 23
+#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER 24
+#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE 25
+#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET 26
+#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT 27
+#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER 28
+#define ED_DRAWING_ID_GROUP_CONTENT 29
+#define ED_DRAWING_ID_RANDOM_BACKGROUND 30
+
+#define ED_NUM_DRAWING_AREAS 31
/*
GADGET_ID_LEVEL_TIMESCORE_DOWN, GADGET_ID_LEVEL_TIMESCORE_UP,
GADGET_ID_LEVEL_TIMESCORE_TEXT, GADGET_ID_NONE,
&level.score[SC_TIME_BONUS],
- "score for each 10 sec/steps left:", NULL, NULL
+ "score for each second/step left:", NULL, NULL
},
{
ED_LEVEL_SETTINGS_XPOS(0), ED_COUNTER2_YPOS(8),
&level.num_yamyam_contents,
NULL, NULL, "number of content areas"
},
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4),
+ MIN_ELEMENT_CONTENTS, MAX_ELEMENT_CONTENTS,
+ GADGET_ID_BALL_CONTENT_DOWN, GADGET_ID_BALL_CONTENT_UP,
+ GADGET_ID_BALL_CONTENT_TEXT, GADGET_ID_NONE,
+ &level.num_ball_contents,
+ NULL, NULL, "number of content areas"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4),
+ MIN_ANDROID_ELEMENTS, MAX_ANDROID_ELEMENTS,
+ GADGET_ID_ANDROID_CONTENT_DOWN, GADGET_ID_ANDROID_CONTENT_UP,
+ GADGET_ID_ANDROID_CONTENT_TEXT, GADGET_ID_NONE,
+ &level.num_android_clone_elements,
+ NULL, NULL, "number of clonable elements"
+ },
{
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0),
MIN_ENVELOPE_XSIZE, MAX_ENVELOPE_XSIZE,
{ -1, NULL }
};
+static struct ValueTextInfo options_player_speed[] =
+{
+ { 0, "frozen" },
+ { 1, "very slow" },
+ { 2, "slow" },
+ { 4, "normal" },
+ { 8, "fast" },
+ { 16, "very fast" },
+ { 32, "ultrafast" },
+
+ { -1, NULL }
+};
+
static struct ValueTextInfo options_access_type[] =
{
{ EP_WALKABLE, "walkable" },
{
{ CE_TOUCHED_BY_PLAYER, "touched by player" },
{ CE_PRESSED_BY_PLAYER, "pressed by player" },
+ { CE_SWITCHED_BY_PLAYER, "switched by player" },
+ { CE_SNAPPED_BY_PLAYER, "snapped by player" },
{ CE_PUSHED_BY_PLAYER, "pushed by player" },
{ CE_ENTERED_BY_PLAYER, "entered by player" },
{ CE_LEFT_BY_PLAYER, "left by player" },
{
{ CE_PLAYER_TOUCHES_X, "player touches" },
{ CE_PLAYER_PRESSES_X, "player presses" },
+ { CE_PLAYER_SWITCHES_X, "player switches" },
+ { CE_PLAYER_SNAPS_X, "player snaps" },
{ CE_PLAYER_PUSHES_X, "player pushes" },
{ CE_PLAYER_ENTERS_X, "player enters" },
{ CE_PLAYER_LEAVES_X, "player leaves" },
{ CE_PLAYER_DROPS_X, "player drops/throws" },
{ CE_TOUCHING_X, "touching" },
{ CE_HITTING_X, "hitting" },
+ { CE_DIGGING_X, "digging" },
{ CE_HIT_BY_X, "hit by" },
{ CE_SWITCH_OF_X, "switch of" },
{ CE_CHANGE_OF_X, "change by page of" },
{ CE_EXPLOSION_OF_X, "explosion of" },
+ { CE_MOVE_OF_X, "move of" },
+ { CE_CREATION_OF_X, "creation of" },
{ CE_VALUE_GETS_ZERO_OF_X, "CE value gets 0 of" },
{ -1, NULL }
static struct ValueTextInfo options_action_type[] =
{
{ CA_NO_ACTION, "no action" },
- { CA_EXIT_PLAYER, "exit player" },
- { CA_KILL_PLAYER, "kill player" },
- { CA_MOVE_PLAYER, "move player" },
+ { CA_UNDEFINED, " " },
+ { CA_HEADLINE_LEVEL_ACTIONS, "[level actions]" },
{ CA_RESTART_LEVEL, "restart level" },
{ CA_SHOW_ENVELOPE, "show envelope" },
- { CA_SET_TIME, "set level time" },
- { CA_SET_GEMS, "set needed gems" },
- { CA_SET_SCORE, "set level score" },
- { CA_SET_KEYS, "set player keys" },
- { CA_SET_SPEED, "set player speed" },
- { CA_SET_GRAVITY, "set gravity" },
- { CA_SET_WIND, "set wind dir." },
+ { CA_SET_LEVEL_TIME, "set time" },
+ { CA_SET_LEVEL_SCORE, "set score" },
+ { CA_SET_LEVEL_GEMS, "set needed gems" },
+ { CA_SET_LEVEL_GRAVITY, "set gravity" },
+ { CA_SET_LEVEL_WIND, "set wind dir." },
+ { CA_UNDEFINED, " " },
+ { CA_HEADLINE_PLAYER_ACTIONS, "[player actions]" },
+ { CA_MOVE_PLAYER, "move player" },
+ { CA_EXIT_PLAYER, "exit player" },
+ { CA_KILL_PLAYER, "kill player" },
+ { CA_SET_PLAYER_KEYS, "set keys" },
+ { CA_SET_PLAYER_SPEED, "set speed" },
+ { CA_SET_PLAYER_SHIELD, "set shield" },
+ { CA_SET_PLAYER_ARTWORK, "set artwork" },
+ { CA_UNDEFINED, " " },
+ { CA_HEADLINE_CE_ACTIONS, "[CE actions]" },
{ CA_SET_CE_SCORE, "set CE score" },
{ CA_SET_CE_VALUE, "set CE value" },
-#if 0
- { CA_SET_DYNABOMB_NUMBER, "set bomb number" },
- { CA_SET_DYNABOMB_SIZE, "set bomb size" },
- { CA_SET_DYNABOMB_POWER, "set bomb power" },
-#endif
+ { CA_UNDEFINED, " " },
+ { CA_HEADLINE_ENGINE_ACTIONS, "[engine actions]" },
+ { CA_SET_ENGINE_SCAN_MODE, "set scan mode" },
{ -1, NULL }
};
{ CA_ARG_NUMBER_CE_SCORE, "CE score" },
{ CA_ARG_NUMBER_CE_VALUE, "CE value" },
{ CA_ARG_UNDEFINED, " " },
- { CA_ARG_ELEMENT_HEADLINE, "[CE value" },
- { CA_ARG_ELEMENT_HEADLINE, " of" },
- { CA_ARG_ELEMENT_HEADLINE, " element]" },
- { CA_ARG_ELEMENT_TARGET, "target" },
- { CA_ARG_ELEMENT_TRIGGER, "trigger" },
+ { CA_ARG_NUMBER_LEVEL_TIME, "time" },
+ { CA_ARG_NUMBER_LEVEL_GEMS, "gems" },
+ { CA_ARG_NUMBER_LEVEL_SCORE, "score" },
+ { CA_ARG_UNDEFINED, " " },
+ { CA_ARG_ELEMENT_CV_HEADLINE, "[CE value" },
+ { CA_ARG_ELEMENT_CV_HEADLINE, " of" },
+ { CA_ARG_ELEMENT_CV_HEADLINE, " element]" },
+ { CA_ARG_ELEMENT_CV_TARGET, "target" },
+ { CA_ARG_ELEMENT_CV_TRIGGER, "trigger" },
{ -1, NULL }
};
-static struct ValueTextInfo options_action_arg_key[] =
+static struct ValueTextInfo options_action_arg_value[] =
{
{ CA_ARG_NUMBER_HEADLINE, "[number]" },
+ { CA_ARG_0, "0" },
{ CA_ARG_1, "1" },
{ CA_ARG_2, "2" },
{ CA_ARG_3, "3" },
{ CA_ARG_4, "4" },
{ CA_ARG_5, "5" },
- { CA_ARG_6, "6" },
- { CA_ARG_7, "7" },
- { CA_ARG_8, "8" },
+ { CA_ARG_10, "10" },
+ { CA_ARG_100, "100" },
+ { CA_ARG_1000, "1000" },
+ { CA_ARG_UNDEFINED, " " },
+ { CA_ARG_NUMBER_MIN, "min" },
+ { CA_ARG_NUMBER_MAX, "max" },
+ { CA_ARG_UNDEFINED, " " },
+ { CA_ARG_NUMBER_RESET, "reset" },
+ { CA_ARG_UNDEFINED, " " },
+ { CA_ARG_NUMBER_CE_DELAY, "CE delay" },
+ { CA_ARG_NUMBER_CE_SCORE, "CE score" },
+ { CA_ARG_NUMBER_CE_VALUE, "CE value" },
+ { CA_ARG_UNDEFINED, " " },
+ { CA_ARG_NUMBER_LEVEL_TIME, "time" },
+ { CA_ARG_NUMBER_LEVEL_GEMS, "gems" },
+ { CA_ARG_NUMBER_LEVEL_SCORE, "score" },
+ { CA_ARG_UNDEFINED, " " },
+ { CA_ARG_ELEMENT_CV_HEADLINE, "[CE value" },
+ { CA_ARG_ELEMENT_CV_HEADLINE, " of" },
+ { CA_ARG_ELEMENT_CV_HEADLINE, " element]" },
+ { CA_ARG_ELEMENT_CV_TARGET, "target" },
+ { CA_ARG_ELEMENT_CV_TRIGGER, "trigger" },
+ { CA_ARG_UNDEFINED, " " },
+ { CA_ARG_ELEMENT_NR_HEADLINE, "[element]" },
+ { CA_ARG_ELEMENT_NR_TARGET, "target" },
+ { CA_ARG_ELEMENT_NR_TRIGGER, "trigger" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_action_arg_envelope[] =
+{
+ { CA_ARG_NUMBER_HEADLINE, "[number]" },
+ { CA_ARG_1, "1" },
+ { CA_ARG_2, "2" },
+ { CA_ARG_3, "3" },
+ { CA_ARG_4, "4" },
{ CA_ARG_UNDEFINED, " " },
{ CA_ARG_ELEMENT_HEADLINE, "[element]" },
{ CA_ARG_ELEMENT_TARGET, "target" },
{ -1, NULL }
};
-static struct ValueTextInfo options_action_arg_envelope[] =
+static struct ValueTextInfo options_action_arg_key[] =
{
{ CA_ARG_NUMBER_HEADLINE, "[number]" },
{ CA_ARG_1, "1" },
{ CA_ARG_2, "2" },
{ CA_ARG_3, "3" },
{ CA_ARG_4, "4" },
+ { CA_ARG_5, "5" },
+ { CA_ARG_6, "6" },
+ { CA_ARG_7, "7" },
+ { CA_ARG_8, "8" },
{ CA_ARG_UNDEFINED, " " },
{ CA_ARG_ELEMENT_HEADLINE, "[element]" },
{ CA_ARG_ELEMENT_TARGET, "target" },
{ -1, NULL }
};
+static struct ValueTextInfo options_action_arg_shield[] =
+{
+ { CA_ARG_SHIELD_HEADLINE, "[shield]" },
+ { CA_ARG_SHIELD_OFF, "off" },
+ { CA_ARG_SHIELD_NORMAL, "normal" },
+ { CA_ARG_SHIELD_DEADLY, "deadly" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_action_arg_artwork[] =
+{
+ { CA_ARG_ELEMENT_HEADLINE, "[element]" },
+ { CA_ARG_ELEMENT_TARGET, "target" },
+ { CA_ARG_ELEMENT_TRIGGER, "trigger" },
+ { CA_ARG_UNDEFINED, " " },
+ { CA_ARG_ELEMENT_RESET, "reset" },
+
+ { -1, NULL }
+};
+
static struct ValueTextInfo options_action_arg_gravity[] =
{
{ CA_ARG_GRAVITY_HEADLINE, "[gravity]" },
{ -1, NULL }
};
+static struct ValueTextInfo options_action_arg_scan_mode[] =
+{
+ { CA_ARG_SCAN_MODE_HEADLINE, "[mode]" },
+ { CA_ARG_SCAN_MODE_NORMAL, "normal" },
+ { CA_ARG_SCAN_MODE_REVERSE, "reverse" },
+
+ { -1, NULL }
+};
+
static char options_change_page_strings[MAX_CHANGE_PAGES][10];
static struct ValueTextInfo options_change_page[MAX_CHANGE_PAGES + 1] =
{
{ CA_MOVE_PLAYER, 0, options_action_arg_direction, },
{ CA_RESTART_LEVEL, 0, options_action_arg_none, },
{ CA_SHOW_ENVELOPE, 0, options_action_arg_envelope, },
- { CA_SET_TIME, 3, options_action_arg_number, },
- { CA_SET_GEMS, 3, options_action_arg_number, },
- { CA_SET_SCORE, 3, options_action_arg_number, },
- { CA_SET_KEYS, 2, options_action_arg_key, },
- { CA_SET_SPEED, 1, options_action_arg_speed, },
- { CA_SET_GRAVITY, 1, options_action_arg_gravity, },
- { CA_SET_WIND, 1, options_action_arg_direction, },
- { CA_SET_CE_SCORE, 3, options_action_arg_number, },
- { CA_SET_CE_VALUE, 3, options_action_arg_number, },
+ { CA_SET_LEVEL_TIME, 3, options_action_arg_number, },
+ { CA_SET_LEVEL_GEMS, 3, options_action_arg_number, },
+ { CA_SET_LEVEL_SCORE, 3, options_action_arg_number, },
+ { CA_SET_LEVEL_GRAVITY, 1, options_action_arg_gravity, },
+ { CA_SET_LEVEL_WIND, 1, options_action_arg_direction, },
+ { CA_SET_PLAYER_KEYS, 2, options_action_arg_key, },
+ { CA_SET_PLAYER_SPEED, 1, options_action_arg_speed, },
+ { CA_SET_PLAYER_SHIELD, 1, options_action_arg_shield, },
+ { CA_SET_PLAYER_ARTWORK, 1, options_action_arg_artwork, },
+ { CA_SET_CE_SCORE, 3, options_action_arg_value, },
+ { CA_SET_CE_VALUE, 3, options_action_arg_value, },
+ { CA_SET_ENGINE_SCAN_MODE, 1, options_action_arg_scan_mode, },
{ -1, FALSE, NULL }
};
/* ---------- element settings: configure (several elements) ------------- */
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(5),
+ GADGET_ID_PLAYER_SPEED, GADGET_ID_NONE,
+ -1,
+ options_player_speed,
+ &level.initial_player_stepsize,
+ "initial player speed:", NULL, "initial player speed"
+ },
+
/* ---------- element settings: configure 1 (custom elements) ------------ */
{
"slip down from certain flat walls","use EM style slipping behaviour"
},
{
- ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
GADGET_ID_USE_SPRING_BUG, GADGET_ID_NONE,
&level.use_spring_bug,
NULL,
NULL,
"use time orb bug", "use odd time orb behaviour"
},
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
+ GADGET_ID_RANDOM_BALL_CONTENT, GADGET_ID_NONE,
+ &level.ball_random,
+ NULL,
+ "create single random element", "only create one element from content"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
+ GADGET_ID_INITIAL_BALL_STATE, GADGET_ID_NONE,
+ &level.ball_state_initial,
+ NULL,
+ "magic ball initially activated", "activate magic ball after level start"
+ },
{
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0),
GADGET_ID_GROW_INTO_DIGGABLE, GADGET_ID_NONE,
"can grow into anything diggable", "grow into more than just sand"
},
{
- ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4),
- GADGET_ID_DOUBLE_SPEED, GADGET_ID_NONE,
- &level.double_speed,
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(7),
+ GADGET_ID_CONTINUOUS_SNAPPING, GADGET_ID_NONE,
+ &level.continuous_snapping,
NULL,
- "double speed movement", "set initial movement speed of player"
+ "continuos snapping", "use snapping without releasing key"
},
{
- 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 snap field when snapping", "use snapping delay to show animation"
+ "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(3),
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8),
+ 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(9),
+ 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(10),
+ 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,
static struct
{
int x, y;
- int area_xsize, area_ysize;
int gadget_id;
int gadget_id_align;
- char *text_left, *text_right, *text_below;
+ int *value;
+ int area_xsize, area_ysize;
+ char *text_left, *text_right, *text_below, *infotext;
} drawingarea_info[ED_NUM_DRAWING_AREAS] =
{
/* ---------- level playfield content ------------------------------------ */
{
- 0, 0,
- MAX_ED_FIELDX, MAX_ED_FIELDY,
+ 0, 0,
GADGET_ID_DRAWING_LEVEL, GADGET_ID_NONE,
- NULL, NULL, NULL
+ NULL, MAX_ED_FIELDX, MAX_ED_FIELDY,
+ NULL, NULL, NULL, NULL
},
/* ---------- yam yam content -------------------------------------------- */
{
ED_AREA_YAMYAM_CONTENT_XPOS(0), ED_AREA_YAMYAM_CONTENT_YPOS(0),
- 3, 3,
GADGET_ID_YAMYAM_CONTENT_0, GADGET_ID_NONE,
- NULL, NULL, "1"
+ &level.yamyam_content[0].e[0][0], 3, 3,
+ NULL, NULL, "1", NULL
},
{
ED_AREA_YAMYAM_CONTENT_XPOS(1), ED_AREA_YAMYAM_CONTENT_YPOS(1),
- 3, 3,
GADGET_ID_YAMYAM_CONTENT_1, GADGET_ID_NONE,
- NULL, NULL, "2"
+ &level.yamyam_content[1].e[0][0], 3, 3,
+ NULL, NULL, "2", NULL
},
{
ED_AREA_YAMYAM_CONTENT_XPOS(2), ED_AREA_YAMYAM_CONTENT_YPOS(2),
- 3, 3,
GADGET_ID_YAMYAM_CONTENT_2, GADGET_ID_NONE,
- NULL, NULL, "3"
+ &level.yamyam_content[2].e[0][0], 3, 3,
+ NULL, NULL, "3", NULL
},
{
ED_AREA_YAMYAM_CONTENT_XPOS(3), ED_AREA_YAMYAM_CONTENT_YPOS(3),
- 3, 3,
GADGET_ID_YAMYAM_CONTENT_3, GADGET_ID_NONE,
- NULL, NULL, "4"
+ &level.yamyam_content[3].e[0][0], 3, 3,
+ NULL, NULL, "4", NULL
},
{
ED_AREA_YAMYAM_CONTENT_XPOS(4), ED_AREA_YAMYAM_CONTENT_YPOS(4),
- 3, 3,
GADGET_ID_YAMYAM_CONTENT_4, GADGET_ID_NONE,
- NULL, NULL, "5"
+ &level.yamyam_content[4].e[0][0], 3, 3,
+ NULL, NULL, "5", NULL
},
{
ED_AREA_YAMYAM_CONTENT_XPOS(5), ED_AREA_YAMYAM_CONTENT_YPOS(5),
- 3, 3,
GADGET_ID_YAMYAM_CONTENT_5, GADGET_ID_NONE,
- NULL, NULL, "6"
+ &level.yamyam_content[5].e[0][0], 3, 3,
+ NULL, NULL, "6", NULL
},
{
ED_AREA_YAMYAM_CONTENT_XPOS(6), ED_AREA_YAMYAM_CONTENT_YPOS(6),
- 3, 3,
GADGET_ID_YAMYAM_CONTENT_6, GADGET_ID_NONE,
- NULL, NULL, "7"
+ &level.yamyam_content[6].e[0][0], 3, 3,
+ NULL, NULL, "7", NULL
},
{
ED_AREA_YAMYAM_CONTENT_XPOS(7), ED_AREA_YAMYAM_CONTENT_YPOS(7),
- 3, 3,
GADGET_ID_YAMYAM_CONTENT_7, GADGET_ID_NONE,
- NULL, NULL, "8"
+ &level.yamyam_content[7].e[0][0], 3, 3,
+ NULL, NULL, "8", NULL
},
/* ---------- magic ball content ----------------------------------------- */
{
ED_AREA_MAGIC_BALL_CONTENT_XPOS(0), ED_AREA_MAGIC_BALL_CONTENT_YPOS(0),
- 3, 3,
GADGET_ID_MAGIC_BALL_CONTENT_0, GADGET_ID_NONE,
- NULL, NULL, "1"
+ &level.ball_content[0].e[0][0], 3, 3,
+ NULL, NULL, "1", NULL
},
{
ED_AREA_MAGIC_BALL_CONTENT_XPOS(1), ED_AREA_MAGIC_BALL_CONTENT_YPOS(1),
- 3, 3,
GADGET_ID_MAGIC_BALL_CONTENT_1, GADGET_ID_NONE,
- NULL, NULL, "2"
+ &level.ball_content[1].e[0][0], 3, 3,
+ NULL, NULL, "2", NULL
},
{
ED_AREA_MAGIC_BALL_CONTENT_XPOS(2), ED_AREA_MAGIC_BALL_CONTENT_YPOS(2),
- 3, 3,
GADGET_ID_MAGIC_BALL_CONTENT_2, GADGET_ID_NONE,
- NULL, NULL, "3"
+ &level.ball_content[2].e[0][0], 3, 3,
+ NULL, NULL, "3", NULL
},
{
ED_AREA_MAGIC_BALL_CONTENT_XPOS(3), ED_AREA_MAGIC_BALL_CONTENT_YPOS(3),
- 3, 3,
GADGET_ID_MAGIC_BALL_CONTENT_3, GADGET_ID_NONE,
- NULL, NULL, "4"
+ &level.ball_content[3].e[0][0], 3, 3,
+ NULL, NULL, "4", NULL
},
{
ED_AREA_MAGIC_BALL_CONTENT_XPOS(4), ED_AREA_MAGIC_BALL_CONTENT_YPOS(4),
- 3, 3,
GADGET_ID_MAGIC_BALL_CONTENT_4, GADGET_ID_NONE,
- NULL, NULL, "5"
+ &level.ball_content[4].e[0][0], 3, 3,
+ NULL, NULL, "5", NULL
},
{
ED_AREA_MAGIC_BALL_CONTENT_XPOS(5), ED_AREA_MAGIC_BALL_CONTENT_YPOS(5),
- 3, 3,
GADGET_ID_MAGIC_BALL_CONTENT_5, GADGET_ID_NONE,
- NULL, NULL, "6"
+ &level.ball_content[5].e[0][0], 3, 3,
+ NULL, NULL, "6", NULL
},
{
ED_AREA_MAGIC_BALL_CONTENT_XPOS(6), ED_AREA_MAGIC_BALL_CONTENT_YPOS(6),
- 3, 3,
GADGET_ID_MAGIC_BALL_CONTENT_6, GADGET_ID_NONE,
- NULL, NULL, "7"
+ &level.ball_content[6].e[0][0], 3, 3,
+ NULL, NULL, "7", NULL
},
{
ED_AREA_MAGIC_BALL_CONTENT_XPOS(7), ED_AREA_MAGIC_BALL_CONTENT_YPOS(7),
- 3, 3,
GADGET_ID_MAGIC_BALL_CONTENT_7, GADGET_ID_NONE,
- NULL, NULL, "8"
+ &level.ball_content[7].e[0][0], 3, 3,
+ NULL, NULL, "8", NULL
+ },
+
+ /* ---------- android content -------------------------------------------- */
+
+ {
+ ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(5),
+ GADGET_ID_ANDROID_CONTENT, GADGET_ID_NONE,
+ &level.android_clone_element[0], MAX_ANDROID_ELEMENTS, 1,
+ "elements:", NULL, NULL, "elements android can clone"
},
/* ---------- amoeba content --------------------------------------------- */
{
ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(3),
- 1, 1,
GADGET_ID_AMOEBA_CONTENT, GADGET_ID_NONE,
- "content:", NULL, NULL
+ &level.amoeba_content, 1, 1,
+ "content:", NULL, NULL, "amoeba content"
+ },
+
+ /* ---------- level start element ---------------------------------------- */
+
+ {
+ -1, ED_AREA_1X1_SETTINGS_YPOS(8),
+ 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(9),
+ 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(10),
+ 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) ----------- */
{
-1, ED_AREA_1X1_SETTINGS_YPOS(1),
- 1, 1,
GADGET_ID_CUSTOM_GRAPHIC, GADGET_ID_CUSTOM_USE_GRAPHIC,
- NULL, NULL, NULL
+ &custom_element.gfx_element, 1, 1,
+ NULL, NULL, NULL, "custom graphic element"
},
/* ---------- element settings: configure 2 (custom elements) ----------- */
{
-1, ED_AREA_3X3_SETTINGS_YPOS(10),
- 3, 3,
GADGET_ID_CUSTOM_CONTENT, GADGET_ID_NONE, /* align three rows */
- "content:", NULL, NULL
+ &custom_element.content.e[0][0], 3, 3,
+ "content:", NULL, NULL, NULL
},
/* ---------- custom enter and leave element (when moving) --------------- */
{
ED_AREA_1X1_SETTINGS_XPOS(1), ED_AREA_1X1_SETTINGS_YPOS(3),
- 1, 1,
GADGET_ID_CUSTOM_MOVE_ENTER, GADGET_ID_NONE,
- "can dig:", " ", NULL
+ &custom_element.move_enter_element, 1, 1,
+ "can dig:", " ", NULL, "element that can be digged/collected"
},
{
-1, ED_AREA_1X1_SETTINGS_YPOS(3),
- 1, 1,
GADGET_ID_CUSTOM_MOVE_LEAVE, GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE,
- NULL, NULL, NULL
+ &custom_element.move_leave_element, 1, 1,
+ NULL, NULL, NULL, "element that will be left behind"
},
/* ---------- element settings: advanced (custom elements) --------------- */
{
-1, ED_AREA_1X1_SETTINGS_YPOS(1),
- 1, 1,
GADGET_ID_CUSTOM_CHANGE_TARGET, GADGET_ID_CUSTOM_CAN_CHANGE,
- NULL, "after/when:", NULL
+ &custom_element_change.target_element, 1, 1,
+ NULL, "after/when:", NULL, "new target element after change"
},
/* ---------- custom change content (extended change target) ------------- */
{
-1, ED_AREA_3X3_SETTINGS_YPOS(10),
- 3, 3,
GADGET_ID_CUSTOM_CHANGE_CONTENT, GADGET_ID_NONE, /* align three rows */
- NULL, NULL, NULL
+ &custom_element_change.target_content.e[0][0], 3, 3,
+ NULL, NULL, NULL, "new extended elements after change"
},
/* ---------- custom change trigger (element causing change) ------------- */
{
-1, ED_AREA_1X1_SETTINGS_YPOS(5),
- 1, 1,
GADGET_ID_CUSTOM_CHANGE_TRIGGER, GADGET_ID_CHANGE_OTHER_ACTION,
- NULL, NULL, NULL
+ &custom_element_change.trigger_element, 1, 1,
+ NULL, NULL, NULL, "other element triggering change"
},
/* ---------- group element content -------------------------------------- */
{
ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(4),
- MAX_ELEMENTS_IN_GROUP, 1,
GADGET_ID_GROUP_CONTENT, GADGET_ID_NONE,
- "content:", NULL, NULL
+ &group_element_info.element[0], MAX_ELEMENTS_IN_GROUP, 1,
+ "content:", NULL, NULL, NULL
},
/* ---------- random background (for random painting) -------------------- */
{
-1, ED_ELEMENT_SETTINGS_YPOS(14),
- 1, 1,
GADGET_ID_RANDOM_BACKGROUND, GADGET_ID_RANDOM_RESTRICTED,
- NULL, NULL, NULL
+ &random_placement_background_element, 1, 1,
+ NULL, NULL, NULL, "random placement background"
},
};
static void ModifyEditorSelectboxOptions(int, struct ValueTextInfo *);
static void ModifyEditorDrawingArea(int, int, int);
static void ModifyEditorElementList();
+static void AdjustElementListScrollbar();
static void RedrawDrawingElements();
static void DrawDrawingWindow();
static void DrawLevelInfoWindow();
static void HandleCheckbuttons(struct GadgetInfo *);
static void HandleControlButtons(struct GadgetInfo *);
static void HandleDrawingAreaInfo(struct GadgetInfo *);
+static void PrintEditorGadgetInfoText(struct GadgetInfo *);
static struct GadgetInfo *level_editor_gadget[NUM_EDITOR_GADGETS];
static int right_gadget_border[NUM_EDITOR_GADGETS];
static int editor_hl_boulderdash[] =
{
+ EL_INTERNAL_CASCADE_BD_ACTIVE,
+ EL_CHAR('B'),
+ EL_CHAR('D'),
+ EL_EMPTY,
+
+#if 0
EL_CHAR('B'),
EL_CHAR('O'),
EL_CHAR('U'),
EL_CHAR('A'),
EL_CHAR('S'),
EL_CHAR('H'),
+#endif
};
static int editor_el_boulderdash[] =
static int editor_hl_emerald_mine[] =
{
+ EL_INTERNAL_CASCADE_EM_ACTIVE,
+ EL_CHAR('E'),
+ EL_CHAR('M'),
+ EL_EMPTY,
+
+#if 0
EL_CHAR('E'),
EL_CHAR('M'),
EL_CHAR('E'),
EL_CHAR('I'),
EL_CHAR('N'),
EL_CHAR('E'),
+#endif
};
static int editor_el_emerald_mine[] =
static int editor_hl_emerald_mine_club[] =
{
+ EL_INTERNAL_CASCADE_EMC_ACTIVE,
+ EL_CHAR('E'),
+ EL_CHAR('M'),
+ EL_CHAR('C'),
+
+#if 0
EL_CHAR('E'),
EL_CHAR('M'),
EL_CHAR('E'),
EL_CHAR('L'),
EL_CHAR('U'),
EL_CHAR('B'),
+#endif
};
static int editor_el_emerald_mine_club[] =
EL_EMC_WALL_11,
EL_EMC_WALL_12,
-#if RELEASE_3_1_2
- EL_EMPTY,
-#else
EL_EMC_ANDROID,
-#endif
EL_BALLOON,
EL_BALLOON_SWITCH_ANY,
-#if RELEASE_3_1_2
- EL_EMPTY,
-#else
EL_BALLOON_SWITCH_NONE,
-#endif
EL_BALLOON_SWITCH_LEFT,
EL_BALLOON_SWITCH_RIGHT,
EL_EMC_GRASS,
EL_EMC_PLANT,
-#if RELEASE_3_1_2
- EL_EMPTY,
- EL_EMPTY,
-#else
EL_EMC_LENSES,
EL_EMC_MAGNIFIER,
-#endif
-#if RELEASE_3_1_2
- EL_EMPTY,
- EL_EMPTY,
-#else
EL_EMC_MAGIC_BALL,
EL_EMC_MAGIC_BALL_SWITCH,
-#endif
EL_SPRING,
-#if RELEASE_3_1_2
- EL_EMPTY,
-#else
EL_EMC_SPRING_BUMPER,
-#endif
-#if RELEASE_3_1_2
- EL_EMPTY,
-#else
EL_EMC_DRIPPER,
-#endif
EL_EMC_FAKE_GRASS,
EL_EMPTY,
EL_EMPTY,
+
+ EL_EM_DYNAMITE,
+ EL_EM_DYNAMITE_ACTIVE,
+ EL_EMPTY,
+ EL_EMPTY,
+
+ EL_YAMYAM_LEFT,
+ EL_YAMYAM_RIGHT,
+ EL_YAMYAM_UP,
+ EL_YAMYAM_DOWN,
};
static int *editor_hl_emerald_mine_club_ptr = editor_hl_emerald_mine_club;
static int *editor_el_emerald_mine_club_ptr = editor_el_emerald_mine_club;
static int editor_hl_more[] =
{
+ EL_INTERNAL_CASCADE_RND_ACTIVE,
+ EL_CHAR('R'),
+ EL_CHAR('N'),
+ EL_CHAR('D'),
+
+#if 0
EL_CHAR('M'),
EL_CHAR('O'),
EL_CHAR('R'),
EL_CHAR('E'),
+#endif
};
static int editor_el_more[] =
static int editor_hl_sokoban[] =
{
+ EL_INTERNAL_CASCADE_SB_ACTIVE,
+ EL_CHAR('S'),
+ EL_CHAR('B'),
+ EL_EMPTY,
+
+#if 0
EL_CHAR('S'),
EL_CHAR('O'),
EL_CHAR('K'),
EL_CHAR('B'),
EL_CHAR('A'),
EL_CHAR('N'),
+#endif
};
static int editor_el_sokoban[] =
static int editor_hl_supaplex[] =
{
+ EL_INTERNAL_CASCADE_SP_ACTIVE,
+ EL_CHAR('S'),
+ EL_CHAR('P'),
+ EL_EMPTY,
+
+#if 0
EL_CHAR('S'),
EL_CHAR('U'),
EL_CHAR('P'),
EL_CHAR('L'),
EL_CHAR('E'),
EL_CHAR('X'),
+#endif
};
static int editor_el_supaplex[] =
static int editor_hl_diamond_caves[] =
{
+ EL_INTERNAL_CASCADE_DC_ACTIVE,
+ EL_CHAR('D'),
+ EL_CHAR('C'),
+ EL_CHAR('2'),
+
+#if 0
EL_CHAR('D'),
EL_CHAR('I'),
EL_CHAR('A'),
EL_CHAR(' '),
EL_CHAR('I'),
EL_CHAR('I'),
+#endif
};
static int editor_el_diamond_caves[] =
static int editor_hl_dx_boulderdash[] =
{
+ EL_INTERNAL_CASCADE_DX_ACTIVE,
+ EL_CHAR('D'),
+ EL_CHAR('X'),
+ EL_EMPTY,
+
+#if 0
EL_CHAR('D'),
EL_CHAR('X'),
EL_CHAR('-'),
EL_CHAR('A'),
EL_CHAR('S'),
EL_CHAR('H'),
+#endif
};
static int editor_el_dx_boulderdash[] =
static int editor_hl_chars[] =
{
+ EL_INTERNAL_CASCADE_CHARS_ACTIVE,
+ EL_CHAR('T'),
+ EL_CHAR('X'),
+ EL_CHAR('T'),
+
+#if 0
EL_CHAR('T'),
EL_CHAR('E'),
EL_CHAR('X'),
EL_CHAR('T'),
+#endif
};
static int editor_el_chars[] =
static int editor_hl_custom[] =
{
+ EL_INTERNAL_CASCADE_CE_ACTIVE,
+ EL_CHAR('C'),
+ EL_CHAR('E'),
+ EL_EMPTY,
+
+#if 0
EL_CHAR('C'),
EL_CHAR('U'),
EL_CHAR('S'),
EL_CHAR('N'),
EL_CHAR('T'),
EL_CHAR('S'),
+#endif
};
static int editor_el_custom[] =
EL_CUSTOM_START + 124,
EL_CUSTOM_START + 125,
EL_CUSTOM_START + 126,
- EL_CUSTOM_START + 127
-};
-static int *editor_hl_custom_ptr = editor_hl_custom;
-static int *editor_el_custom_ptr = editor_el_custom;
-static int num_editor_hl_custom = SIZEOF_ARRAY_INT(editor_hl_custom);
-static int num_editor_el_custom = SIZEOF_ARRAY_INT(editor_el_custom);
-
-static int editor_hl_custom_more[] =
-{
-};
+ EL_CUSTOM_START + 127,
-static int editor_el_custom_more[] =
-{
EL_CUSTOM_START + 128,
EL_CUSTOM_START + 129,
EL_CUSTOM_START + 130,
EL_CUSTOM_START + 252,
EL_CUSTOM_START + 253,
EL_CUSTOM_START + 254,
- EL_CUSTOM_START + 255
-};
-static int *editor_hl_custom_more_ptr = editor_hl_custom_more;
-static int *editor_el_custom_more_ptr = editor_el_custom_more;
-static int num_editor_hl_custom_more = SIZEOF_ARRAY_INT(editor_hl_custom_more);
-static int num_editor_el_custom_more = SIZEOF_ARRAY_INT(editor_el_custom_more);
-
-static int editor_hl_custom_special[] =
-{
-};
+ EL_CUSTOM_START + 255,
-static int editor_el_custom_special[] =
-{
- EL_TRIGGER_ELEMENT,
EL_TRIGGER_PLAYER,
- EL_EMPTY,
+ EL_TRIGGER_ELEMENT,
+ EL_TRIGGER_CE_VALUE,
EL_EMPTY
};
-static int *editor_hl_custom_special_ptr = editor_hl_custom_special;
-static int *editor_el_custom_special_ptr = editor_el_custom_special;
-static int num_editor_hl_custom_special = SIZEOF_ARRAY_INT(editor_hl_custom_special);
-static int num_editor_el_custom_special = SIZEOF_ARRAY_INT(editor_el_custom_special);
+static int *editor_hl_custom_ptr = editor_hl_custom;
+static int *editor_el_custom_ptr = editor_el_custom;
+static int num_editor_hl_custom = SIZEOF_ARRAY_INT(editor_hl_custom);
+static int num_editor_el_custom = SIZEOF_ARRAY_INT(editor_el_custom);
static int editor_hl_group[] =
{
+ EL_INTERNAL_CASCADE_GE_ACTIVE,
+ EL_CHAR('G'),
+ EL_CHAR('E'),
+ EL_EMPTY,
+
+#if 0
EL_CHAR('G'),
EL_CHAR('R'),
EL_CHAR('O'),
EL_CHAR('N'),
EL_CHAR('T'),
EL_CHAR('S'),
+#endif
};
static int editor_el_group[] =
EL_GROUP_START + 12,
EL_GROUP_START + 13,
EL_GROUP_START + 14,
- EL_GROUP_START + 15
-};
-static int *editor_hl_group_ptr = editor_hl_group;
-static int *editor_el_group_ptr = editor_el_group;
-static int num_editor_hl_group = SIZEOF_ARRAY_INT(editor_hl_group);
-static int num_editor_el_group = SIZEOF_ARRAY_INT(editor_el_group);
+ EL_GROUP_START + 15,
-static int editor_hl_group_more[] =
-{
-};
-
-static int editor_el_group_more[] =
-{
EL_GROUP_START + 16,
EL_GROUP_START + 17,
EL_GROUP_START + 18,
EL_GROUP_START + 30,
EL_GROUP_START + 31
};
-static int *editor_hl_group_more_ptr = editor_hl_group_more;
-static int *editor_el_group_more_ptr = editor_el_group_more;
-static int num_editor_hl_group_more = SIZEOF_ARRAY_INT(editor_hl_group_more);
-static int num_editor_el_group_more = SIZEOF_ARRAY_INT(editor_el_group_more);
+static int *editor_hl_group_ptr = editor_hl_group;
+static int *editor_el_group_ptr = editor_el_group;
+static int num_editor_hl_group = SIZEOF_ARRAY_INT(editor_hl_group);
+static int num_editor_el_group = SIZEOF_ARRAY_INT(editor_el_group);
static int editor_hl_user_defined[] =
{
+ EL_INTERNAL_CASCADE_USER_ACTIVE,
+ EL_CHAR('M'),
+ EL_CHAR('Y'),
+ EL_EMPTY,
+
+#if 0
EL_CHAR('U'),
EL_CHAR('S'),
EL_CHAR('E'),
EL_CHAR('N'),
EL_CHAR('E'),
EL_CHAR('D'),
+#endif
};
static int *editor_hl_user_defined_ptr = editor_hl_user_defined;
static int num_editor_hl_user_defined=SIZEOF_ARRAY_INT(editor_hl_user_defined);
static int num_editor_el_user_defined = 0;
+static int editor_hl_dynamic[] =
+{
+ EL_INTERNAL_CASCADE_DYNAMIC_ACTIVE,
+ EL_CHAR('U'),
+ EL_CHAR('S'),
+ EL_CHAR('E'),
+};
+
+static int *editor_hl_dynamic_ptr = editor_hl_dynamic;
+static int *editor_el_dynamic_ptr = NULL;
+static int num_editor_hl_dynamic = SIZEOF_ARRAY_INT(editor_hl_dynamic);
+static int num_editor_el_dynamic = 0;
+
static int editor_hl_empty[] = { };
static int editor_el_empty[ED_NUM_ELEMENTLIST_BUTTONS];
static struct
{
boolean *setup_value;
+ boolean *setup_cascade_value;
int **headline_list;
int *headline_list_size;
{
{
&setup.editor.el_boulderdash,
+ &setup.editor_cascade.el_bd,
&editor_hl_boulderdash_ptr, &num_editor_hl_boulderdash,
&editor_el_boulderdash_ptr, &num_editor_el_boulderdash
},
{
&setup.editor.el_emerald_mine,
+ &setup.editor_cascade.el_em,
&editor_hl_emerald_mine_ptr, &num_editor_hl_emerald_mine,
&editor_el_emerald_mine_ptr, &num_editor_el_emerald_mine
},
{
&setup.editor.el_emerald_mine_club,
+ &setup.editor_cascade.el_emc,
&editor_hl_emerald_mine_club_ptr, &num_editor_hl_emerald_mine_club,
&editor_el_emerald_mine_club_ptr, &num_editor_el_emerald_mine_club
},
{
&setup.editor.el_more,
+ &setup.editor_cascade.el_rnd,
&editor_hl_more_ptr, &num_editor_hl_more,
&editor_el_more_ptr, &num_editor_el_more
},
{
&setup.editor.el_sokoban,
+ &setup.editor_cascade.el_sb,
&editor_hl_sokoban_ptr, &num_editor_hl_sokoban,
&editor_el_sokoban_ptr, &num_editor_el_sokoban
},
{
&setup.editor.el_supaplex,
+ &setup.editor_cascade.el_sp,
&editor_hl_supaplex_ptr, &num_editor_hl_supaplex,
&editor_el_supaplex_ptr, &num_editor_el_supaplex
},
{
&setup.editor.el_diamond_caves,
+ &setup.editor_cascade.el_dc,
&editor_hl_diamond_caves_ptr, &num_editor_hl_diamond_caves,
&editor_el_diamond_caves_ptr, &num_editor_el_diamond_caves
},
{
&setup.editor.el_dx_boulderdash,
+ &setup.editor_cascade.el_dx,
&editor_hl_dx_boulderdash_ptr, &num_editor_hl_dx_boulderdash,
&editor_el_dx_boulderdash_ptr, &num_editor_el_dx_boulderdash
},
{
&setup.editor.el_chars,
+ &setup.editor_cascade.el_chars,
&editor_hl_chars_ptr, &num_editor_hl_chars,
&editor_el_chars_ptr, &num_editor_el_chars
},
{
&setup.editor.el_custom,
+ &setup.editor_cascade.el_ce,
&editor_hl_custom_ptr, &num_editor_hl_custom,
&editor_el_custom_ptr, &num_editor_el_custom
},
- {
- &setup.editor.el_custom_more,
- &editor_hl_custom_more_ptr, &num_editor_hl_custom_more,
- &editor_el_custom_more_ptr, &num_editor_el_custom_more
- },
- {
- &setup.editor.el_custom,
- &editor_hl_custom_special_ptr, &num_editor_hl_custom_special,
- &editor_el_custom_special_ptr, &num_editor_el_custom_special
- },
{
&setup.editor.el_custom,
+ &setup.editor_cascade.el_ge,
&editor_hl_group_ptr, &num_editor_hl_group,
&editor_el_group_ptr, &num_editor_el_group
},
- {
- &setup.editor.el_custom_more,
- &editor_hl_group_more_ptr, &num_editor_hl_group_more,
- &editor_el_group_more_ptr, &num_editor_el_group_more
- },
{
&setup.editor.el_user_defined,
+ &setup.editor_cascade.el_user,
&editor_hl_user_defined_ptr, &num_editor_hl_user_defined,
&editor_el_user_defined_ptr, &num_editor_el_user_defined
},
{
+ &setup.editor.el_dynamic,
+ &setup.editor_cascade.el_dynamic,
+ &editor_hl_dynamic_ptr, &num_editor_hl_dynamic,
+ &editor_el_dynamic_ptr, &num_editor_el_dynamic,
+ },
+ {
+ &use_el_empty,
&use_el_empty,
&editor_hl_empty_ptr, &num_editor_hl_empty,
&editor_el_empty_ptr, &num_editor_el_empty,
},
{
+ NULL,
NULL,
NULL, NULL,
NULL, NULL
{
char *info_text = NULL;
+#if 1
+ if (element < MAX_NUM_ELEMENTS)
+#else
if (element < NUM_FILE_ELEMENTS)
+#endif
{
if (strlen(element_info[element].description) > 0)
info_text = element_info[element].description;
return info_text;
}
+static void InitDynamicEditorElementList(int **elements, int *num_elements)
+{
+ boolean element_found[NUM_FILE_ELEMENTS];
+ int i, x, y;
+
+ /* initialize list of used elements to "not used" */
+ for (i = 0; i < NUM_FILE_ELEMENTS; i++)
+ element_found[i] = FALSE;
+
+ /* find all elements used in current level */
+ for (y = 0; y < lev_fieldy; y++)
+ for (x = 0; x < lev_fieldx; x++)
+ if (Feld[x][y] < NUM_FILE_ELEMENTS) /* should always be true */
+ element_found[Feld[x][y]] = TRUE;
+
+ *num_elements = 0;
+
+ /* count number of elements used in current level */
+ for (i = 0; i < NUM_FILE_ELEMENTS; i++)
+ if (element_found[i])
+ (*num_elements)++;
+
+ /* add space for up to 3 more elements for padding that may be needed */
+ *num_elements += 3;
+
+ /* free memory for old list of elements, if needed */
+ checked_free(*elements);
+
+ /* allocate memory for new list of elements */
+ *elements = checked_malloc(*num_elements * sizeof(int));
+
+ *num_elements = 0;
+
+ /* add all elements used in current level (non-custom/group elements) */
+ for (i = 0; i < NUM_FILE_ELEMENTS; i++)
+ if (element_found[i] && !(IS_CUSTOM_ELEMENT(i) || IS_GROUP_ELEMENT(i)))
+ (*elements)[(*num_elements)++] = i;
+
+ /* add all elements used in current level (custom/group elements) */
+ for (i = 0; i < NUM_FILE_ELEMENTS; i++)
+ if (element_found[i] && (IS_CUSTOM_ELEMENT(i) || IS_GROUP_ELEMENT(i)))
+ (*elements)[(*num_elements)++] = i;
+
+ while (*num_elements % 4) /* pad with empty elements, if needed */
+ (*elements)[(*num_elements)++] = EL_EMPTY;
+}
+
static void ReinitializeElementList()
{
+ static boolean initialization_needed = TRUE;
int pos = 0;
int i, j;
+ if (initialization_needed)
+ {
+ LoadSetup_EditorCascade(); /* load last editor cascade state */
+
+ /* initialize editor cascade element from saved cascade state */
+ for (i = 0; editor_elements_info[i].setup_value != NULL; i++)
+ {
+ int *cascade_element = &(*editor_elements_info[i].headline_list)[0];
+ boolean cascade_value = *editor_elements_info[i].setup_cascade_value;
+
+ if (IS_EDITOR_CASCADE(*cascade_element))
+ *cascade_element =
+ (cascade_value ? EL_CASCADE_ACTIVE(*cascade_element) :
+ EL_CASCADE_INACTIVE(*cascade_element));
+ }
+
+ initialization_needed = FALSE;
+ }
+
checked_free(editor_elements);
/* reload optional user defined element list for each invocation of editor */
LoadUserDefinedEditorElementList(&editor_el_user_defined_ptr,
&num_editor_el_user_defined);
+ /* initialize dynamic level element list for each invocation of editor */
+ InitDynamicEditorElementList(&editor_el_dynamic_ptr,
+ &num_editor_el_dynamic);
+
/* initialize list of empty elements (used for padding, if needed) */
for (i = 0; i < ED_NUM_ELEMENTLIST_BUTTONS; i++)
editor_el_empty[i] = EL_EMPTY;
/* determine size of element list */
for (i = 0; editor_elements_info[i].setup_value != NULL; i++)
{
+ boolean found_inactive_cascade = FALSE;
+
if (*editor_elements_info[i].setup_value)
{
if (setup.editor.el_headlines)
+ {
num_editor_elements += *editor_elements_info[i].headline_list_size;
+ for (j = 0; j < *editor_elements_info[i].headline_list_size; j++)
+ {
+ int element = (*editor_elements_info[i].headline_list)[j];
+
+ if (IS_EDITOR_CASCADE_INACTIVE(element))
+ found_inactive_cascade = TRUE;
+ }
+ }
+
+ if (found_inactive_cascade)
+ continue;
+
num_editor_elements += *editor_elements_info[i].element_list_size;
}
}
/* fill element list */
for (i = 0; editor_elements_info[i].setup_value != NULL; i++)
{
+ boolean found_inactive_cascade = FALSE;
+
if (*editor_elements_info[i].setup_value)
{
if (setup.editor.el_headlines)
+ {
for (j = 0; j < *editor_elements_info[i].headline_list_size; j++)
- editor_elements[pos++] = (*editor_elements_info[i].headline_list)[j];
+ {
+ int element = (*editor_elements_info[i].headline_list)[j];
+
+ editor_elements[pos++] = element;
+
+ if (IS_EDITOR_CASCADE_INACTIVE(element))
+ found_inactive_cascade = TRUE;
+ }
+ }
+
+ if (found_inactive_cascade)
+ continue;
for (j = 0; j < *editor_elements_info[i].element_list_size; j++)
editor_elements[pos++] = (*editor_elements_info[i].element_list)[j];
}
}
- /* correct position of element list scrollbar */
- if (element_shift < 0)
- element_shift = 0;
- if (element_shift > num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS)
- element_shift = num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS;
+ /* (this function is also called before editor gadgets are initialized!) */
+ AdjustElementListScrollbar();
}
void PrintEditorElementList()
for (i = 0; editor_elements_info[i].setup_value != stop; i++)
{
+ int cascade_element = (*editor_elements_info[i].headline_list)[0];
+
+ if (IS_EDITOR_CASCADE(cascade_element))
+ {
+ int cascade_element_show = EL_CASCADE_INACTIVE(cascade_element);
+ char *headline = element_info[cascade_element_show].editor_description;
+
+ printf_line_with_prefix("# ", "-", 77);
+ printf("# %s\n", headline);
+ printf_line_with_prefix("# ", "-", 77);
+ }
+
for (j = 0; j < *editor_elements_info[i].headline_list_size; j++)
{
int element = (*editor_elements_info[i].headline_list)[j];
+ if (IS_EDITOR_CASCADE(element))
+ element = EL_CHAR_MINUS;
+
printf("# %s\n", element_info[element].token_name);
}
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);
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)
struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[id].gadget_id];
int x, y;
- if (id == ED_DRAWING_ID_RANDOM_BACKGROUND)
- DrawMiniGraphicExt(drawto, gi->x, gi->y,
- el2edimg(random_placement_background_element));
- else if (id == ED_DRAWING_ID_AMOEBA_CONTENT)
- DrawMiniGraphicExt(drawto, gi->x, gi->y, el2edimg(level.amoeba_content));
- else if (id == ED_DRAWING_ID_CUSTOM_GRAPHIC)
- DrawMiniGraphicExt(drawto, gi->x, gi->y,
- el2edimg(custom_element.gfx_element));
- else if (id == ED_DRAWING_ID_CUSTOM_CONTENT)
- for (y = 0; y < 3; y++)
- for (x = 0; x < 3; x++)
- DrawMiniGraphicExt(drawto,
- gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY,
- el2edimg(custom_element.content.e[x][y]));
- else if (id == ED_DRAWING_ID_CUSTOM_MOVE_ENTER)
- DrawMiniGraphicExt(drawto, gi->x, gi->y,
- el2edimg(custom_element.move_enter_element));
- else if (id == ED_DRAWING_ID_CUSTOM_MOVE_LEAVE)
- DrawMiniGraphicExt(drawto, gi->x, gi->y,
- el2edimg(custom_element.move_leave_element));
- else if (id == ED_DRAWING_ID_CUSTOM_CHANGE_TARGET)
- DrawMiniGraphicExt(drawto, gi->x, gi->y,
- el2edimg(custom_element_change.target_element));
- else if (id == ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT)
- for (y = 0; y < 3; y++)
- for (x = 0; x < 3; x++)
- DrawMiniGraphicExt(drawto,
- gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY,
- el2edimg(custom_element_change.target_content.e[x][y]));
- else if (id == ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER)
- DrawMiniGraphicExt(drawto, gi->x, gi->y,
- el2edimg(custom_element_change.trigger_element));
- else if (id == ED_DRAWING_ID_GROUP_CONTENT)
- for (x = 0; x < group_element_info.num_elements; x++)
- DrawMiniGraphicExt(drawto, gi->x + x * MINI_TILEX, gi->y,
- el2edimg(group_element_info.element[x]));
- else if (id >= ED_DRAWING_ID_YAMYAM_CONTENT_0 &&
- id <= ED_DRAWING_ID_YAMYAM_CONTENT_7)
- {
- int nr = id - ED_DRAWING_ID_YAMYAM_CONTENT_0;
-
- for (y = 0; y < 3; y++)
- for (x = 0; x < 3; x++)
- DrawMiniGraphicExt(drawto,
- gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY,
- el2edimg(level.yamyam_content[nr].e[x][y]));
- }
- else if (id >= ED_DRAWING_ID_MAGIC_BALL_CONTENT_0 &&
- id <= ED_DRAWING_ID_MAGIC_BALL_CONTENT_7)
- {
- int nr = id - ED_DRAWING_ID_MAGIC_BALL_CONTENT_0;
+ int *value = drawingarea_info[id].value;
+ int area_xsize = drawingarea_info[id].area_xsize;
+ int area_ysize = drawingarea_info[id].area_ysize;
- for (y = 0; y < 3; y++)
- for (x = 0; x < 3; x++)
- DrawMiniGraphicExt(drawto,
- gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY,
- el2edimg(level.ball_content[nr].e[x][y]));
- }
+ for (x = 0; x < area_xsize; x++)
+ for (y = 0; y < area_ysize; y++)
+ DrawMiniGraphicExt(drawto,
+ gi->x + x * MINI_TILEX,
+ gi->y + y * MINI_TILEY,
+ el2edimg(value[x * area_ysize + y]));
}
static void ScrollMiniLevel(int from_x, int from_y, int scroll)
int i;
for (i = 0; i < NUM_EDITOR_GADGETS; i++)
+ {
FreeGadget(level_editor_gadget[i]);
+
+ level_editor_gadget[i] = NULL;
+ }
}
static void MapCounterButtons(int id)
/* map buttons to select level */
counter_id = ED_COUNTER_ID_SELECT_LEVEL;
- ModifyEditorCounterLimits(counter_id,
- leveldir_current->first_level,
- leveldir_current->last_level);
+ counterbutton_info[counter_id].min_value = leveldir_current->first_level;
+ counterbutton_info[counter_id].max_value = leveldir_current->last_level;
MapCounterButtons(counter_id);
}
return TRUE; /* !!! CURRENTLY DEACTIVATED !!! */
- for (y = 0; y < lev_fieldy; y++)
- for (x = 0; x < lev_fieldx; x++)
- if (Feld[x][y] == EL_PLAYER_1 ||
- Feld[x][y] == EL_SP_MURPHY)
- player_found = TRUE;
+ for (y = 0; y < lev_fieldy; y++) for (x = 0; x < lev_fieldx; x++)
+ {
+ if (Feld[x][y] == EL_PLAYER_1 ||
+ Feld[x][y] == EL_SP_MURPHY)
+ player_found = TRUE;
+ }
return player_found;
}
return new_index_value;
}
+static void setSelectboxSpecialActionVariablesIfNeeded()
+{
+ int i;
+
+ /* change action mode and arg variables according to action type variable */
+ for (i = 0; action_arg_options[i].value != -1; i++)
+ {
+ if (action_arg_options[i].value == custom_element_change.action_type)
+ {
+ int mode = action_arg_options[i].mode;
+
+ /* only change if corresponding selectbox has changed */
+ if (selectbox_info[ED_SELECTBOX_ID_ACTION_MODE].options !=
+ action_arg_modes[mode])
+ custom_element_change.action_mode = -1;
+
+ /* only change if corresponding selectbox has changed */
+ if (selectbox_info[ED_SELECTBOX_ID_ACTION_ARG].options !=
+ action_arg_options[i].options)
+ custom_element_change.action_arg = -1;
+
+ break;
+ }
+ }
+}
+
static void setSelectboxSpecialActionOptions()
{
int i;
action_arg_options[i].options);
ModifyEditorSelectboxValue(ED_SELECTBOX_ID_ACTION_ARG,
custom_element_change.action_arg);
+ break;
}
}
}
ei_to->description[i] = ei_from->description[i];
/* ---------- copy element base properties ---------- */
+#if 1
+ ei_to->properties[EP_BITFIELD_BASE] = ei_from->properties[EP_BITFIELD_BASE];
+#else
Properties[element_to][EP_BITFIELD_BASE] =
Properties[element_from][EP_BITFIELD_BASE];
+#endif
/* ---------- copy custom property values ---------- */
custom_element_change.direct_action =
(HAS_CHANGE_EVENT(element, CE_TOUCHED_BY_PLAYER) ? CE_TOUCHED_BY_PLAYER :
HAS_CHANGE_EVENT(element, CE_PRESSED_BY_PLAYER) ? CE_PRESSED_BY_PLAYER :
+ HAS_CHANGE_EVENT(element, CE_SWITCHED_BY_PLAYER) ? CE_SWITCHED_BY_PLAYER :
+ HAS_CHANGE_EVENT(element, CE_SNAPPED_BY_PLAYER) ? CE_SNAPPED_BY_PLAYER :
HAS_CHANGE_EVENT(element, CE_PUSHED_BY_PLAYER) ? CE_PUSHED_BY_PLAYER :
HAS_CHANGE_EVENT(element, CE_ENTERED_BY_PLAYER) ? CE_ENTERED_BY_PLAYER :
HAS_CHANGE_EVENT(element, CE_LEFT_BY_PLAYER) ? CE_LEFT_BY_PLAYER :
custom_element_change.other_action =
(HAS_CHANGE_EVENT(element, CE_PLAYER_TOUCHES_X) ? CE_PLAYER_TOUCHES_X :
HAS_CHANGE_EVENT(element, CE_PLAYER_PRESSES_X) ? CE_PLAYER_PRESSES_X :
+ HAS_CHANGE_EVENT(element, CE_PLAYER_SWITCHES_X) ? CE_PLAYER_SWITCHES_X :
+ HAS_CHANGE_EVENT(element, CE_PLAYER_SNAPS_X) ? CE_PLAYER_SNAPS_X :
HAS_CHANGE_EVENT(element, CE_PLAYER_PUSHES_X) ? CE_PLAYER_PUSHES_X :
HAS_CHANGE_EVENT(element, CE_PLAYER_ENTERS_X) ? CE_PLAYER_ENTERS_X :
HAS_CHANGE_EVENT(element, CE_PLAYER_LEAVES_X) ? CE_PLAYER_LEAVES_X :
HAS_CHANGE_EVENT(element, CE_PLAYER_DROPS_X) ? CE_PLAYER_DROPS_X :
HAS_CHANGE_EVENT(element, CE_TOUCHING_X) ? CE_TOUCHING_X :
HAS_CHANGE_EVENT(element, CE_HITTING_X) ? CE_HITTING_X :
+ HAS_CHANGE_EVENT(element, CE_DIGGING_X) ? CE_DIGGING_X :
HAS_CHANGE_EVENT(element, CE_HIT_BY_X) ? CE_HIT_BY_X :
HAS_CHANGE_EVENT(element, CE_SWITCH_OF_X) ? CE_SWITCH_OF_X :
HAS_CHANGE_EVENT(element, CE_CHANGE_OF_X) ? CE_CHANGE_OF_X :
HAS_CHANGE_EVENT(element, CE_EXPLOSION_OF_X) ? CE_EXPLOSION_OF_X :
+ HAS_CHANGE_EVENT(element, CE_MOVE_OF_X) ? CE_MOVE_OF_X :
+ HAS_CHANGE_EVENT(element, CE_CREATION_OF_X) ? CE_CREATION_OF_X :
HAS_CHANGE_EVENT(element, CE_VALUE_GETS_ZERO_OF_X) ? CE_VALUE_GETS_ZERO_OF_X :
custom_element_change.other_action);
}
/* set player change event from checkbox and selectbox */
custom_element_change_events[CE_TOUCHED_BY_PLAYER] = FALSE;
custom_element_change_events[CE_PRESSED_BY_PLAYER] = FALSE;
+ custom_element_change_events[CE_SWITCHED_BY_PLAYER] = FALSE;
+ custom_element_change_events[CE_SNAPPED_BY_PLAYER] = FALSE;
custom_element_change_events[CE_PUSHED_BY_PLAYER] = FALSE;
custom_element_change_events[CE_ENTERED_BY_PLAYER] = FALSE;
custom_element_change_events[CE_LEFT_BY_PLAYER] = FALSE;
/* set other element action change event from checkbox and selectbox */
custom_element_change_events[CE_PLAYER_TOUCHES_X] = FALSE;
custom_element_change_events[CE_PLAYER_PRESSES_X] = FALSE;
+ custom_element_change_events[CE_PLAYER_SWITCHES_X] = FALSE;
+ custom_element_change_events[CE_PLAYER_SNAPS_X] = FALSE;
custom_element_change_events[CE_PLAYER_PUSHES_X] = FALSE;
custom_element_change_events[CE_PLAYER_ENTERS_X] = FALSE;
custom_element_change_events[CE_PLAYER_LEAVES_X] = FALSE;
custom_element_change_events[CE_PLAYER_DROPS_X] = FALSE;
custom_element_change_events[CE_TOUCHING_X] = FALSE;
custom_element_change_events[CE_HITTING_X] = FALSE;
+ custom_element_change_events[CE_DIGGING_X] = FALSE;
custom_element_change_events[CE_HIT_BY_X] = FALSE;
custom_element_change_events[CE_SWITCH_OF_X] = FALSE;
custom_element_change_events[CE_CHANGE_OF_X] = FALSE;
custom_element_change_events[CE_EXPLOSION_OF_X] = FALSE;
+ custom_element_change_events[CE_MOVE_OF_X] = FALSE;
+ custom_element_change_events[CE_CREATION_OF_X] = FALSE;
custom_element_change_events[CE_VALUE_GETS_ZERO_OF_X] = FALSE;
custom_element_change_events[custom_element_change.other_action] =
custom_element_change_events[CE_BY_OTHER_ACTION];
redraw_mask |= REDRAW_ALL;
+ ReinitializeElementList(); /* update dynamic level element list */
ReinitializeElementListButtons(); /* custom element may look different */
UnmapTapeButtons();
GDI_SCROLLBAR_ITEM_POSITION, item_position, GDI_END);
}
+static void AdjustElementListScrollbar()
+{
+ struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL];
+ int items_max, items_visible, item_position;
+
+ /* correct position of element list scrollbar */
+ if (element_shift < 0)
+ element_shift = 0;
+ if (element_shift > num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS)
+ element_shift = num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS;
+
+ items_max = num_editor_elements / ED_ELEMENTLIST_BUTTONS_HORIZ;
+ items_visible = ED_ELEMENTLIST_BUTTONS_VERT;
+ item_position = element_shift / ED_ELEMENTLIST_BUTTONS_HORIZ;
+
+ ModifyGadget(gi, GDI_SCROLLBAR_ITEMS_MAX, items_max,
+ GDI_SCROLLBAR_ITEMS_VISIBLE, items_visible,
+ GDI_SCROLLBAR_ITEM_POSITION, item_position, GDI_END);
+}
+
static void ModifyEditorCounterValue(int counter_id, int new_value)
{
int *counter_value = counterbutton_info[counter_id].value;
int gadget_id = drawingarea_info[drawingarea_id].gadget_id;
struct GadgetInfo *gi = level_editor_gadget[gadget_id];
+ drawingarea_info[drawingarea_id].area_xsize = xsize;
+ drawingarea_info[drawingarea_id].area_ysize = ysize;
+
ModifyGadget(gi, GDI_AREA_SIZE, xsize, ysize, GDI_END);
}
int element = editor_elements[element_shift + i];
UnmapGadget(gi);
+
getMiniGraphicSource(el2edimg(element), &gd->bitmap, &gd->x, &gd->y);
ModifyGadget(gi, GDI_INFO_TEXT, getElementInfoText(element), GDI_END);
+
MapGadget(gi);
}
}
ClearWindow();
UnmapLevelEditorWindowGadgets();
+#if 0
+ DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Level Settings");
+ DrawTextSCentered(ED_SETTINGS2_YPOS, FONT_TITLE_1, "Editor Settings");
+#else
DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS1_YPOS,
"Level Settings", FONT_TITLE_1);
DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS2_YPOS,
"Editor Settings", FONT_TITLE_1);
+#endif
/* draw counter gadgets */
for (i = ED_COUNTER_ID_LEVEL_FIRST; i <= ED_COUNTER_ID_LEVEL_LAST; i++)
int y = SY + ED_AREA_MAGIC_BALL_CONTENT_YPOS(0) + ED_BORDER_AREA_YSIZE;
int i;
+ /* display counter to choose number of element content areas */
+ MapCounterButtons(ED_COUNTER_ID_BALL_CONTENT);
+
for (i = 0; i < MAX_ELEMENT_CONTENTS; i++)
- MapDrawingArea(ED_DRAWING_ID_MAGIC_BALL_CONTENT_0 + i);
+ {
+ int id = ED_DRAWING_ID_MAGIC_BALL_CONTENT_0 + i;
+
+ if (i < level.num_ball_contents)
+ {
+ MapDrawingArea(id);
+ }
+ else
+ {
+ int font_height = getFontHeight(FONT_TEXT_1);
+
+ UnmapDrawingArea(id);
+
+ /* delete content areas in case of reducing number of them */
+ DrawBackground(SX + drawingarea_info[id].x - MINI_TILEX / 2,
+ SY + drawingarea_info[id].y - MINI_TILEY / 2,
+ 4 * MINI_TILEX,
+ 4 * MINI_TILEY + ED_GADGET_TEXT_DISTANCE + font_height);
+ }
+ }
DrawText(x, y + 0 * MINI_TILEY, "generated", FONT_TEXT_1);
DrawText(x, y + 1 * MINI_TILEY, "when", FONT_TEXT_1);
DrawText(x, y + 2 * MINI_TILEY, "active", FONT_TEXT_1);
}
+static void DrawAndroidElementArea(int element)
+{
+ int num_elements = level.num_android_clone_elements;
+ int id = ED_DRAWING_ID_ANDROID_CONTENT;
+ int sx = SX + drawingarea_info[id].x - MINI_TILEX / 2;
+ int sy = SY + drawingarea_info[id].y - MINI_TILEY / 2;
+ int xsize = MAX_ANDROID_ELEMENTS;
+ int ysize = 1;
+
+ /* display counter to choose number of element areas */
+ MapCounterButtons(ED_COUNTER_ID_ANDROID_CONTENT);
+
+ if (drawingarea_info[id].text_left != NULL)
+ sx += getTextWidthForDrawingArea(drawingarea_info[id].text_left);
+
+ UnmapDrawingArea(id);
+
+ ModifyEditorDrawingArea(id, num_elements, 1);
+
+ /* delete content areas in case of reducing number of them */
+ DrawBackground(sx, sy, (xsize + 1) * MINI_TILEX, (ysize + 1) * MINI_TILEY);
+
+ MapDrawingArea(id);
+}
+
static void DrawGroupElementArea(int element)
{
int num_elements = group_element_info.num_elements;
/* pre-defined properties */
{ EP_CAN_PASS_MAGIC_WALL, "- can pass magic walls" },
{ EP_SWITCHABLE, "- can be switched" },
- { EP_HAS_CONTENT, "- can contain other elements" },
+#if 0
+ { EP_HAS_EDITOR_CONTENT, "- can contain other elements" },
+#endif
{ -1, NULL }
};
#define TEXT_COLLECTING "Score for collecting"
#define TEXT_SMASHING "Score for smashing"
-#define TEXT_SLURPING "Score for slurping"
+#define TEXT_SLURPING "Score for slurping robot"
#define TEXT_CRACKING "Score for cracking"
#define TEXT_AMOEBA_SPEED "Speed of amoeba growth"
#define TEXT_DURATION "Duration when activated"
{ EL_BD_FIREFLY_DOWN, &level.score[SC_SPACESHIP], TEXT_SMASHING },
{ EL_SP_SNIKSNAK, &level.score[SC_SPACESHIP], TEXT_SMASHING },
{ EL_YAMYAM, &level.score[SC_YAMYAM], TEXT_SMASHING },
+ { EL_YAMYAM_LEFT, &level.score[SC_YAMYAM], TEXT_SMASHING },
+ { EL_YAMYAM_RIGHT, &level.score[SC_YAMYAM], TEXT_SMASHING },
+ { EL_YAMYAM_UP, &level.score[SC_YAMYAM], TEXT_SMASHING },
+ { EL_YAMYAM_DOWN, &level.score[SC_YAMYAM], TEXT_SMASHING },
{ EL_DARK_YAMYAM, &level.score[SC_YAMYAM], TEXT_SMASHING },
{ EL_ROBOT, &level.score[SC_ROBOT], TEXT_SMASHING },
{ EL_PACMAN, &level.score[SC_PACMAN], TEXT_SMASHING },
{ EL_PACMAN_DOWN, &level.score[SC_PACMAN], TEXT_SMASHING },
{ EL_NUT, &level.score[SC_NUT], TEXT_CRACKING },
{ EL_DYNAMITE, &level.score[SC_DYNAMITE], TEXT_COLLECTING },
+ { EL_EM_DYNAMITE, &level.score[SC_DYNAMITE], TEXT_COLLECTING },
{ EL_DYNABOMB_INCREASE_NUMBER,&level.score[SC_DYNAMITE],TEXT_COLLECTING },
{ EL_DYNABOMB_INCREASE_SIZE, &level.score[SC_DYNAMITE],TEXT_COLLECTING },
{ EL_DYNABOMB_INCREASE_POWER, &level.score[SC_DYNAMITE],TEXT_COLLECTING },
{ EL_SHIELD_NORMAL, &level.score[SC_SHIELD], TEXT_COLLECTING },
{ EL_SHIELD_DEADLY, &level.score[SC_SHIELD], TEXT_COLLECTING },
- { EL_EXTRA_TIME, &level.score[SC_TIME_BONUS], TEXT_COLLECTING },
+ { EL_EXTRA_TIME, &level.extra_time_score, TEXT_COLLECTING },
{ EL_KEY_1, &level.score[SC_KEY], TEXT_COLLECTING },
{ EL_KEY_2, &level.score[SC_KEY], TEXT_COLLECTING },
{ EL_KEY_3, &level.score[SC_KEY], TEXT_COLLECTING },
{ EL_AMOEBA_DRY, &level.amoeba_speed, TEXT_AMOEBA_SPEED },
{ EL_AMOEBA_FULL, &level.amoeba_speed, TEXT_AMOEBA_SPEED },
{ EL_BD_AMOEBA, &level.amoeba_speed, TEXT_AMOEBA_SPEED },
+ { EL_EMC_DRIPPER, &level.amoeba_speed, TEXT_AMOEBA_SPEED },
{ EL_MAGIC_WALL, &level.time_magic_wall, TEXT_DURATION },
{ EL_BD_MAGIC_WALL, &level.time_magic_wall, TEXT_DURATION },
{ EL_ROBOT_WHEEL, &level.time_wheel, TEXT_DURATION },
{ EL_EMC_MAGIC_BALL, &level.ball_time, TEXT_BALL_DELAY },
{ EL_EMC_LENSES, &level.lenses_score, TEXT_COLLECTING },
{ EL_EMC_MAGNIFIER, &level.magnify_score, TEXT_COLLECTING },
- { EL_ROBOT, &level.slurp_score, TEXT_SLURPING },
+ { EL_SPRING, &level.slurp_score, TEXT_SLURPING },
{ EL_EMC_LENSES, &level.lenses_time, TEXT_DURATION },
{ EL_EMC_MAGNIFIER, &level.magnify_time, TEXT_DURATION },
#endif
IS_GROUP_ELEMENT(element) ||
IS_ENVELOPE(element) ||
ELEM_IS_PLAYER(element) ||
- HAS_CONTENT(element) ||
+ HAS_EDITOR_CONTENT(element) ||
CAN_GROW(element) ||
COULD_MOVE_INTO_ACID(element) ||
MAYBE_DONT_COLLIDE_WITH(element))
int counter_id = ED_COUNTER_ID_ELEMENT_VALUE1 + num_element_counters;
counterbutton_info[counter_id].y =
- ED_ELEMENT_SETTINGS_YPOS((HAS_CONTENT(properties_element) ? 1 : 0) +
- (CAN_GROW(properties_element) ? 1 : 0) +
- (COULD_MOVE_INTO_ACID(properties_element) ? 1 : 0) +
- (MAYBE_DONT_COLLIDE_WITH(properties_element) ? 1 : 0)+
- num_element_counters);
+ ED_ELEMENT_SETTINGS_YPOS(
+ (HAS_EDITOR_CONTENT(properties_element) ? 1 : 0) +
+ (CAN_GROW(properties_element) ? 1 : 0) +
+ (COULD_MOVE_INTO_ACID(properties_element) ? 1 : 0) +
+ (MAYBE_DONT_COLLIDE_WITH(properties_element) ? 1 : 0) +
+ (properties_element == EL_EMC_MAGIC_BALL ? 2 : 0) +
+ num_element_counters);
counterbutton_info[counter_id].value = elements_with_counter[i].value;
counterbutton_info[counter_id].text_right= elements_with_counter[i].text;
}
}
- if (HAS_CONTENT(properties_element))
+ if (HAS_EDITOR_CONTENT(properties_element))
{
/* draw stickybutton gadget */
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT);
if (IS_AMOEBOID(properties_element))
MapDrawingArea(ED_DRAWING_ID_AMOEBA_CONTENT);
- else if (properties_element == EL_YAMYAM)
+ else if (properties_element == EL_YAMYAM ||
+ properties_element == EL_YAMYAM_LEFT ||
+ properties_element == EL_YAMYAM_RIGHT ||
+ properties_element == EL_YAMYAM_UP ||
+ properties_element == EL_YAMYAM_DOWN)
DrawYamYamContentAreas();
- }
+ else if (properties_element == EL_EMC_MAGIC_BALL)
+ {
+ DrawMagicBallContentAreas();
- if (properties_element == EL_EMC_MAGIC_BALL)
- DrawMagicBallContentAreas();
+ MapCheckbuttonGadget(ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT);
+ MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INITIAL_BALL_STATE);
+ }
+ else if (properties_element == EL_EMC_ANDROID)
+ DrawAndroidElementArea(properties_element);
+ }
if (ELEM_IS_PLAYER(properties_element))
{
+ int player_nr = GET_PLAYER_NR(properties_element);
+
+ /* 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];
+
+ /* 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 ?
ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD :
ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD);
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD);
+ MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING);
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);
+
+ MapSelectboxGadget(ED_SELECTBOX_ID_PLAYER_SPEED);
}
if (IS_GEM(properties_element))
ED_ELEMENT_SETTINGS_XPOS(IS_CUSTOM_ELEMENT(properties_element) ? 1 : 0);
checkbutton_info[ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID].y =
ED_ELEMENT_SETTINGS_YPOS(IS_CUSTOM_ELEMENT(properties_element) ? 6 :
- HAS_CONTENT(properties_element) ? 1 : 0);
+ HAS_EDITOR_CONTENT(properties_element) ? 1 : 0);
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID);
}
if (CAN_GROW(properties_element))
{
checkbutton_info[ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE].y =
- ED_ELEMENT_SETTINGS_YPOS(HAS_CONTENT(properties_element) ? 1 : 0);
+ ED_ELEMENT_SETTINGS_YPOS(HAS_EDITOR_CONTENT(properties_element) ? 1 : 0);
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE);
}
DrawPropertiesChangeDrawingAreas();
}
-static void DrawElementName(int x, int y, int element)
+static void DrawEditorElementAnimation(int x, int y)
+{
+ int graphic = el2img(properties_element);
+ int frame = (ANIM_MODE(graphic) == ANIM_CE_VALUE ?
+ custom_element.ce_value_fixed_initial :
+ ANIM_MODE(graphic) == ANIM_CE_SCORE ?
+ custom_element.collect_score_initial : FrameCounter);
+
+ DrawGraphicAnimationExt(drawto, x, y, graphic, frame, NO_MASKING);
+}
+
+static void DrawEditorElementName(int x, int y, int element)
{
char *element_name = getElementInfoText(element);
int font_nr = FONT_TEXT_1;
SetMainBackgroundImage(IMG_BACKGROUND_EDITOR);
ClearWindow();
+#if 0
+ DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Element Settings");
+#else
DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS1_YPOS,
"Element Settings", FONT_TITLE_1);
+#endif
+
+#if 1
+ FrameCounter = 0; /* restart animation frame counter */
+#endif
DrawElementBorder(SX + xstart * MINI_TILEX,
SY + ystart * MINI_TILEY + MINI_TILEY / 2,
TILEX, TILEY, FALSE);
+#if 1
+ DrawEditorElementAnimation(SX + xstart * MINI_TILEX,
+ SY + ystart * MINI_TILEY + MINI_TILEY / 2);
+#else
DrawGraphicAnimationExt(drawto,
SX + xstart * MINI_TILEX,
SY + ystart * MINI_TILEY + MINI_TILEY / 2,
el2img(properties_element), -1, NO_MASKING);
+#endif
+#if 0
FrameCounter = 0; /* restart animation frame counter */
+#endif
- DrawElementName((xstart + 3) * MINI_TILEX + 1, (ystart + 1) * MINI_TILEY + 1,
- properties_element);
+ DrawEditorElementName((xstart + 3) * MINI_TILEX + 1,
+ (ystart + 1) * MINI_TILEY + 1,
+ properties_element);
DrawPropertiesTabulatorGadgets();
}
else
{
+ int type_id = gi->custom_type_id;
+ int pos = sx * drawingarea_info[type_id].area_ysize + sy;
+
if (item_xsize == MINI_TILEX && item_ysize == MINI_TILEY)
DrawMiniGraphicExt(drawto,
gi->x + sx * MINI_TILEX,
gi->y + sy * TILEY,
el2img(new_element), 0);
- if (id == GADGET_ID_AMOEBA_CONTENT)
- level.amoeba_content = new_element;
- else if (id == GADGET_ID_CUSTOM_GRAPHIC)
- {
+ if (id == GADGET_ID_CUSTOM_GRAPHIC)
new_element = GFX_ELEMENT(new_element);
- custom_element.gfx_element = new_element;
-
- CopyElementPropertiesToGame(properties_element);
-
- UpdateCustomElementGraphicGadgets();
-
- FrameCounter = 0; /* restart animation frame counter */
- }
- else if (id == GADGET_ID_CUSTOM_CONTENT)
- {
- custom_element.content.e[sx][sy] = new_element;
-
- CopyCustomElementPropertiesToGame(properties_element);
- }
- else if (id == GADGET_ID_CUSTOM_MOVE_ENTER)
- {
- custom_element.move_enter_element = new_element;
-
- CopyCustomElementPropertiesToGame(properties_element);
- }
- else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE)
- {
- custom_element.move_leave_element = new_element;
-
- CopyCustomElementPropertiesToGame(properties_element);
- }
- else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
- {
- custom_element_change.target_element = new_element;
- CopyCustomElementPropertiesToGame(properties_element);
- }
- else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
- {
- custom_element_change.target_content.e[sx][sy] = new_element;
+ drawingarea_info[type_id].value[pos] = new_element;
- CopyCustomElementPropertiesToGame(properties_element);
- }
- else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
- {
- custom_element_change.trigger_element = new_element;
+ CopyElementPropertiesToGame(properties_element);
- CopyCustomElementPropertiesToGame(properties_element);
- }
- else if (id == GADGET_ID_GROUP_CONTENT)
+ if (id == GADGET_ID_CUSTOM_GRAPHIC)
{
- group_element_info.element[sx] = new_element;
+ UpdateCustomElementGraphicGadgets();
- CopyGroupElementPropertiesToGame(properties_element);
+ FrameCounter = 0; /* restart animation frame counter */
}
- else if (id == GADGET_ID_RANDOM_BACKGROUND)
- random_placement_background_element = new_element;
- else if (id >= GADGET_ID_YAMYAM_CONTENT_0 &&
- id <= GADGET_ID_YAMYAM_CONTENT_7)
- level.yamyam_content[id - GADGET_ID_YAMYAM_CONTENT_0].e[sx][sy] =
- new_element;
- else if (id >= GADGET_ID_MAGIC_BALL_CONTENT_0 &&
- id <= GADGET_ID_MAGIC_BALL_CONTENT_7)
- level.ball_content[id - GADGET_ID_MAGIC_BALL_CONTENT_0].e[sx][sy] =
- new_element;
}
break;
MB_LEFTBUTTON);
else if (draw_level)
PickDrawingElement(button, Feld[lx][ly]);
- else if (id == GADGET_ID_AMOEBA_CONTENT)
- PickDrawingElement(button, level.amoeba_content);
- else if (id == GADGET_ID_CUSTOM_GRAPHIC)
- PickDrawingElement(button, custom_element.gfx_element);
- else if (id == GADGET_ID_CUSTOM_CONTENT)
- PickDrawingElement(button, custom_element.content.e[sx][sy]);
- else if (id == GADGET_ID_CUSTOM_MOVE_ENTER)
- PickDrawingElement(button, custom_element.move_enter_element);
- else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE)
- PickDrawingElement(button, custom_element.move_leave_element);
- else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
- PickDrawingElement(button, custom_element_change.target_element);
- else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
- PickDrawingElement(button, custom_element_change.target_content.e[sx][sy]);
- else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
- PickDrawingElement(button, custom_element_change.trigger_element);
- else if (id == GADGET_ID_GROUP_CONTENT)
- PickDrawingElement(button, group_element_info.element[sx]);
- else if (id == GADGET_ID_RANDOM_BACKGROUND)
- PickDrawingElement(button, random_placement_background_element);
- else if (id >= GADGET_ID_YAMYAM_CONTENT_0 &&
- id <= GADGET_ID_YAMYAM_CONTENT_7)
- {
- int i = id - GADGET_ID_YAMYAM_CONTENT_0;
-
- PickDrawingElement(button, level.yamyam_content[i].e[sx][sy]);
- }
- else if (id >= GADGET_ID_MAGIC_BALL_CONTENT_0 &&
- id <= GADGET_ID_MAGIC_BALL_CONTENT_7)
+ else
{
- int i = id - GADGET_ID_MAGIC_BALL_CONTENT_0;
+ int type_id = gi->custom_type_id;
+ int pos = sx * drawingarea_info[type_id].area_ysize + sy;
- PickDrawingElement(button, level.ball_content[i].e[sx][sy]);
+ PickDrawingElement(button, drawingarea_info[type_id].value[pos]);
}
break;
DrawYamYamContentAreas();
break;
+ case ED_COUNTER_ID_BALL_CONTENT:
+ DrawMagicBallContentAreas();
+ break;
+
+ case ED_COUNTER_ID_ANDROID_CONTENT:
+ DrawAndroidElementArea(properties_element);
+ break;
+
case ED_COUNTER_ID_GROUP_CONTENT:
DrawGroupElementArea(properties_element);
CopyGroupElementPropertiesToGame(properties_element);
{
if (type_id == ED_SELECTBOX_ID_ACTION_TYPE)
{
- /* when changing action type, reset action mode and action arg */
+ /* when changing action type, also check action mode and action arg */
if (value_old != value_new)
{
+#if 1
+ setSelectboxSpecialActionVariablesIfNeeded();
+#else
custom_element_change.action_mode = -1;
custom_element_change.action_arg = -1;
+#endif
}
DrawPropertiesChange();
int element_position = id - GADGET_ID_ELEMENTLIST_FIRST;
int new_element = editor_elements[element_position + element_shift];
+ if (IS_EDITOR_CASCADE(new_element))
+ {
+ int i;
+
+ for (i = 0; editor_elements_info[i].setup_value != NULL; i++)
+ {
+ int *cascade_element= &(*editor_elements_info[i].headline_list)[0];
+ boolean *cascade_value=editor_elements_info[i].setup_cascade_value;
+
+ if (*cascade_element == new_element)
+ {
+ *cascade_element = EL_CASCADE_TOGGLE(*cascade_element);
+ *cascade_value = IS_EDITOR_CASCADE_ACTIVE(*cascade_element);
+
+ /* update element selection list */
+ ReinitializeElementList();
+ ModifyEditorElementList();
+
+ /* update cascading gadget info text */
+ PrintEditorGadgetInfoText(level_editor_gadget[id]);
+
+ /* save current editor cascading state */
+ SaveSetup_EditorCascade();
+
+ break;
+ }
+ }
+
+ break;
+ }
+
if (last_custom_copy_mode != -1)
{
if (CopyCustomElement(properties_element, new_element,
button = MB_RIGHTBUTTON;
break;
+ case KSYM_Home:
+ case KSYM_End:
+ element_shift = (key == KSYM_Home ? 0 :
+ num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS);
+
+ ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL],
+ GDI_SCROLLBAR_ITEM_POSITION,
+ element_shift / ED_ELEMENTLIST_BUTTONS_HORIZ, GDI_END);
+
+ ModifyEditorElementList();
+
+ break;
+
case KSYM_Escape:
if (edit_mode == ED_MODE_DRAWING)
{
- RequestExitLevelEditor(setup.ask_on_escape);
+ RequestExitLevelEditor(setup.ask_on_escape_editor);
}
else if (edit_mode == ED_MODE_INFO)
{
if (!DelayReached(&action_delay, action_delay_value))
return;
+#if 1
+ DrawEditorElementAnimation(SX + xpos * TILEX,
+ SY + ypos * TILEY + MINI_TILEY / 2);
+#else
DrawGraphicAnimationExt(drawto,
SX + xpos * TILEX,
SY + ypos * TILEY + MINI_TILEY / 2,
el2img(properties_element), -1, NO_MASKING);
+#endif
MarkTileDirty(xpos, ypos);
MarkTileDirty(xpos, ypos + 1);
DrawBackground(INFOTEXT_XPOS, INFOTEXT_YPOS, INFOTEXT_XSIZE, INFOTEXT_YSIZE);
}
+void PrintEditorGadgetInfoText(struct GadgetInfo *gi)
+{
+ char infotext[MAX_OUTPUT_LINESIZE + 1];
+ char shortcut[MAX_OUTPUT_LINESIZE + 1];
+ int max_infotext_len = getMaxInfoTextLength();
+
+ if (gi == NULL || gi->info_text == NULL)
+ return;
+
+ strncpy(infotext, gi->info_text, max_infotext_len);
+ infotext[max_infotext_len] = '\0';
+
+ if (gi->custom_id < ED_NUM_CTRL_BUTTONS)
+ {
+ int key = control_info[gi->custom_id].shortcut;
+
+ if (key)
+ {
+ if (gi->custom_id == GADGET_ID_SINGLE_ITEMS) /* special case 1 */
+ sprintf(shortcut, " ('.' or '%c')", key);
+ else if (gi->custom_id == GADGET_ID_PICK_ELEMENT) /* special case 2 */
+ sprintf(shortcut, " ('%c' or 'Ctrl')", key);
+ else if (gi->custom_id == GADGET_ID_TEST) /* special case 3 */
+ sprintf(shortcut, " ('Enter' or 'Shift-%c')", key);
+ else /* normal case */
+ sprintf(shortcut, " ('%s%c')",
+ (key >= 'A' && key <= 'Z' ? "Shift-" : ""), key);
+
+ if (strlen(infotext) + strlen(shortcut) <= max_infotext_len)
+ strcat(infotext, shortcut);
+ }
+ }
+
+ DrawText(INFOTEXT_XPOS, INFOTEXT_YPOS, infotext, FONT_TEXT_2);
+}
+
void HandleEditorGadgetInfoText(void *ptr)
{
struct GadgetInfo *gi = (struct GadgetInfo *)ptr;
+#if 0
char infotext[MAX_OUTPUT_LINESIZE + 1];
char shortcut[MAX_OUTPUT_LINESIZE + 1];
int max_infotext_len = getMaxInfoTextLength();
+#endif
if (game_status != GAME_MODE_EDITOR)
return;
ClearEditorGadgetInfoText();
- if (gi->event.type == GD_EVENT_INFO_LEAVING)
+ if (gi == NULL || gi->event.type == GD_EVENT_INFO_LEAVING)
return;
/* misuse this function to delete brush cursor, if needed */
if (edit_mode == ED_MODE_DRAWING && draw_with_brush)
DeleteBrushFromCursor();
+#if 1
+ PrintEditorGadgetInfoText(gi);
+#else
if (gi == NULL || gi->info_text == NULL)
return;
}
DrawText(INFOTEXT_XPOS, INFOTEXT_YPOS, infotext, FONT_TEXT_2);
+#endif
}
static void HandleDrawingAreaInfo(struct GadgetInfo *gi)
{
static int start_lx, start_ly;
int id = gi->custom_id;
+ int type_id = gi->custom_type_id;
int sx = gi->event.x;
int sy = gi->event.y;
int lx = sx + level_xpos;
}
else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT)
{
- int element = EL_EMPTY;
-
- if (id == GADGET_ID_AMOEBA_CONTENT)
- element = level.amoeba_content;
- else if (id == GADGET_ID_CUSTOM_GRAPHIC)
- element = custom_element.gfx_element;
- else if (id == GADGET_ID_CUSTOM_CONTENT)
- element = custom_element.content.e[sx][sy];
- else if (id == GADGET_ID_CUSTOM_MOVE_ENTER)
- element = custom_element.move_enter_element;
- else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE)
- element = custom_element.move_leave_element;
- else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
- element = custom_element_change.target_element;
- else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
- element = custom_element_change.target_content.e[sx][sy];
- else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
- element = custom_element_change.trigger_element;
- else if (id == GADGET_ID_GROUP_CONTENT)
- element = group_element_info.element[sx];
- else if (id == GADGET_ID_RANDOM_BACKGROUND)
- element = random_placement_background_element;
- else if (id >= GADGET_ID_YAMYAM_CONTENT_0 &&
- id <= GADGET_ID_YAMYAM_CONTENT_7)
- element = level.yamyam_content[id -GADGET_ID_YAMYAM_CONTENT_0].e[sx][sy];
- else if (id >= GADGET_ID_MAGIC_BALL_CONTENT_0 &&
- id <= GADGET_ID_MAGIC_BALL_CONTENT_7)
- element =level.ball_content[id-GADGET_ID_MAGIC_BALL_CONTENT_0].e[sx][sy];
+ int pos = sx * drawingarea_info[type_id].area_ysize + sy;
+ int element = drawingarea_info[type_id].value[pos];
strncpy(infotext, getElementInfoText(element), max_infotext_len);
}
else
{
- if (id == GADGET_ID_AMOEBA_CONTENT)
- strcpy(infotext, "Amoeba content");
- else if (id == GADGET_ID_CUSTOM_GRAPHIC)
- strcpy(infotext, "Custom graphic element");
- 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/collected");
- else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE)
- strcpy(infotext, "Element that will be left behind");
- else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
- strcpy(infotext, "New target element after change");
- else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
- strcpy(infotext, "New extended elements after change");
- else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
- strcpy(infotext, "Other element triggering change");
+ if (id == GADGET_ID_CUSTOM_CONTENT)
+ sprintf(infotext, "custom element content position: %d, %d", sx, sy);
else if (id == GADGET_ID_GROUP_CONTENT)
- sprintf(infotext, "Group element position: %d", sx + 1);
- else if (id == GADGET_ID_RANDOM_BACKGROUND)
- strcpy(infotext, "Random placement background");
+ sprintf(infotext, "group element position: %d", sx + 1);
else if (id >= GADGET_ID_YAMYAM_CONTENT_0 &&
id <= GADGET_ID_YAMYAM_CONTENT_7)
- sprintf(infotext, "Content area %d position: %d, %d",
+ sprintf(infotext, "content area %d position: %d, %d",
id - GADGET_ID_YAMYAM_CONTENT_0 + 1, sx, sy);
else if (id >= GADGET_ID_MAGIC_BALL_CONTENT_0 &&
id <= GADGET_ID_MAGIC_BALL_CONTENT_7)
- sprintf(infotext, "Content area %d position: %d, %d",
+ sprintf(infotext, "content area %d position: %d, %d",
id - GADGET_ID_MAGIC_BALL_CONTENT_0 + 1, sx, sy);
+ else if (id == GADGET_ID_ANDROID_CONTENT)
+ sprintf(infotext, "android element position: %d", sx + 1);
+ else if (drawingarea_info[type_id].infotext != NULL)
+ strcpy(infotext, drawingarea_info[type_id].infotext);
}
infotext[max_infotext_len] = '\0';