#define ED_GADGET_DISTANCE 2
#define ED_GADGET_TEXT_DISTANCE (2 * ED_GADGET_DISTANCE)
+#define ED_DRAWINGAREA_TEXT_DISTANCE (ED_GADGET_TEXT_DISTANCE + \
+ MINI_TILEX / 2)
/* values for the setting windows */
#define ED_SETTINGS_XSTART (3 * MINI_TILEX / 2)
#define ED_SETTINGS2_YPOS (ED_SETTINGS1_YPOS + 12 * TILEY - 2)
/* values for counter gadgets */
-#define ED_COUNT_PUSH_DELAY_RND_XPOS (ED_SETTINGS_XPOS(1) + 16 * MINI_TILEX)
-#define ED_COUNT_MOVE_DELAY_RND_XPOS ED_COUNT_PUSH_DELAY_RND_XPOS
-#define ED_COUNT_CHANGE_DELAY_RND_XPOS (ED_SETTINGS_XPOS(1) + 13 * MINI_TILEX)
-
#define ED_COUNTER_YSTART (ED_SETTINGS1_YPOS + 2 * TILEY)
#define ED_COUNTER_YDISTANCE (3 * MINI_TILEY)
#define ED_COUNTER_YPOS(n) (ED_COUNTER_YSTART + \
6 * (n / 4) * MINI_TILEY)
/* custom change target */
-#define ED_AREA_ELEM_CONTENT2_XPOS (20 * MINI_TILEX)
#define ED_AREA_ELEM_CONTENT2_YPOS (ED_SETTINGS_YPOS(2) + \
ED_GADGET_DISTANCE)
/* optional custom graphic */
-#define ED_AREA_ELEM_CONTENT3_XPOS (24 * MINI_TILEX)
#define ED_AREA_ELEM_CONTENT3_YPOS (ED_SETTINGS_YPOS(1) + \
ED_GADGET_DISTANCE)
/* custom element content */
#define ED_AREA_ELEM_CONTENT4_YPOS (ED_SETTINGS_YPOS(12) + \
ED_GADGET_DISTANCE - MINI_TILEY)
/* custom change trigger element */
-#define ED_AREA_ELEM_CONTENT5_XPOS (28 * MINI_TILEX)
#define ED_AREA_ELEM_CONTENT5_YPOS (ED_SETTINGS_YPOS(7) + \
ED_GADGET_DISTANCE)
/* extended custom change target */
ED_GADGET_DISTANCE - MINI_TILEY)
/* values for random placement background drawing area */
-#define ED_AREA_RANDOM_BACKGROUND_XPOS (29 * MINI_TILEX)
#define ED_AREA_RANDOM_BACKGROUND_YPOS (31 * MINI_TILEY)
/* values for scrolling gadgets for drawing area */
#define ED_SELECTBOX_XSIZE ED_WIN_COUNT_XSIZE
#define ED_SELECTBOX_YSIZE ED_WIN_COUNT_YSIZE
+#define ED_SELECTBOX_BUTTON_XSIZE 14
+
#define ED_TEXTBUTTON_XPOS ED_WIN_COUNT_XPOS
#define ED_TEXTBUTTON_YPOS (ED_WIN_COUNT_YPOS + \
4 * (2 + ED_WIN_COUNT_YSIZE))
#define GADGET_ID_ELEMENT_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 24)
#define GADGET_ID_ELEMENT_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 25)
#define GADGET_ID_ELEMENT_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 26)
-#define GADGET_ID_CUSTOM_SCORE_DOWN (GADGET_ID_COUNTER_FIRST + 27)
-#define GADGET_ID_CUSTOM_SCORE_TEXT (GADGET_ID_COUNTER_FIRST + 28)
-#define GADGET_ID_CUSTOM_SCORE_UP (GADGET_ID_COUNTER_FIRST + 29)
-#define GADGET_ID_CUSTOM_GEMCOUNT_DOWN (GADGET_ID_COUNTER_FIRST + 30)
-#define GADGET_ID_CUSTOM_GEMCOUNT_TEXT (GADGET_ID_COUNTER_FIRST + 31)
-#define GADGET_ID_CUSTOM_GEMCOUNT_UP (GADGET_ID_COUNTER_FIRST + 32)
-#define GADGET_ID_PUSH_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 33)
-#define GADGET_ID_PUSH_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 34)
-#define GADGET_ID_PUSH_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 35)
-#define GADGET_ID_PUSH_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 36)
-#define GADGET_ID_PUSH_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 37)
-#define GADGET_ID_PUSH_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 38)
-#define GADGET_ID_MOVE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 39)
-#define GADGET_ID_MOVE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 40)
-#define GADGET_ID_MOVE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 41)
-#define GADGET_ID_MOVE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 42)
-#define GADGET_ID_MOVE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 43)
-#define GADGET_ID_MOVE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 44)
-#define GADGET_ID_CHANGE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 45)
-#define GADGET_ID_CHANGE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 46)
-#define GADGET_ID_CHANGE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 47)
-#define GADGET_ID_CHANGE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 48)
-#define GADGET_ID_CHANGE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 49)
-#define GADGET_ID_CHANGE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 50)
-#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 51)
-#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 52)
-#define GADGET_ID_CHANGE_CONT_RND_UP (GADGET_ID_COUNTER_FIRST + 53)
+#define GADGET_ID_ENVELOPE_XSIZE_DOWN (GADGET_ID_COUNTER_FIRST + 27)
+#define GADGET_ID_ENVELOPE_XSIZE_TEXT (GADGET_ID_COUNTER_FIRST + 28)
+#define GADGET_ID_ENVELOPE_XSIZE_UP (GADGET_ID_COUNTER_FIRST + 29)
+#define GADGET_ID_ENVELOPE_YSIZE_DOWN (GADGET_ID_COUNTER_FIRST + 30)
+#define GADGET_ID_ENVELOPE_YSIZE_TEXT (GADGET_ID_COUNTER_FIRST + 31)
+#define GADGET_ID_ENVELOPE_YSIZE_UP (GADGET_ID_COUNTER_FIRST + 32)
+#define GADGET_ID_CUSTOM_SCORE_DOWN (GADGET_ID_COUNTER_FIRST + 33)
+#define GADGET_ID_CUSTOM_SCORE_TEXT (GADGET_ID_COUNTER_FIRST + 34)
+#define GADGET_ID_CUSTOM_SCORE_UP (GADGET_ID_COUNTER_FIRST + 35)
+#define GADGET_ID_CUSTOM_GEMCOUNT_DOWN (GADGET_ID_COUNTER_FIRST + 36)
+#define GADGET_ID_CUSTOM_GEMCOUNT_TEXT (GADGET_ID_COUNTER_FIRST + 37)
+#define GADGET_ID_CUSTOM_GEMCOUNT_UP (GADGET_ID_COUNTER_FIRST + 38)
+#define GADGET_ID_PUSH_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 39)
+#define GADGET_ID_PUSH_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 40)
+#define GADGET_ID_PUSH_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 41)
+#define GADGET_ID_PUSH_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 42)
+#define GADGET_ID_PUSH_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 43)
+#define GADGET_ID_PUSH_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 44)
+#define GADGET_ID_MOVE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 45)
+#define GADGET_ID_MOVE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 46)
+#define GADGET_ID_MOVE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 47)
+#define GADGET_ID_MOVE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 48)
+#define GADGET_ID_MOVE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 49)
+#define GADGET_ID_MOVE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 50)
+#define GADGET_ID_CHANGE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 51)
+#define GADGET_ID_CHANGE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 52)
+#define GADGET_ID_CHANGE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 53)
+#define GADGET_ID_CHANGE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 54)
+#define GADGET_ID_CHANGE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 55)
+#define GADGET_ID_CHANGE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 56)
+#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 57)
+#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 58)
+#define GADGET_ID_CHANGE_CONT_RND_UP (GADGET_ID_COUNTER_FIRST + 59)
/* drawing area identifiers */
-#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 54)
+#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 60)
#define GADGET_ID_DRAWING_LEVEL (GADGET_ID_DRAWING_AREA_FIRST + 0)
#define GADGET_ID_ELEMENT_CONTENT_0 (GADGET_ID_DRAWING_AREA_FIRST + 1)
#define GADGET_ID_LEVEL_AUTHOR (GADGET_ID_TEXT_INPUT_FIRST + 1)
#define GADGET_ID_ELEMENT_NAME (GADGET_ID_TEXT_INPUT_FIRST + 2)
+/* text area identifiers */
+#define GADGET_ID_TEXT_AREA_FIRST (GADGET_ID_TEXT_INPUT_FIRST + 3)
+
+#define GADGET_ID_ENVELOPE_INFO (GADGET_ID_TEXT_AREA_FIRST + 0)
+
/* selectbox identifiers */
-#define GADGET_ID_SELECTBOX_FIRST (GADGET_ID_TEXT_INPUT_FIRST + 3)
+#define GADGET_ID_SELECTBOX_FIRST (GADGET_ID_TEXT_AREA_FIRST + 1)
#define GADGET_ID_CUSTOM_WALK_TO_ACTION (GADGET_ID_SELECTBOX_FIRST + 0)
#define GADGET_ID_CUSTOM_CONSISTENCY (GADGET_ID_SELECTBOX_FIRST + 1)
#define GADGET_ID_CHANGE_COLLIDE_ACTION (GADGET_ID_SELECTBOX_FIRST + 12)
#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 13)
#define GADGET_ID_CHANGE_POWER (GADGET_ID_SELECTBOX_FIRST + 14)
+#define GADGET_ID_SELECT_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 15)
/* textbutton identifiers */
-#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 15)
+#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 16)
#define GADGET_ID_PROPERTIES_INFO (GADGET_ID_TEXTBUTTON_FIRST + 0)
#define GADGET_ID_PROPERTIES_CONFIG (GADGET_ID_TEXTBUTTON_FIRST + 1)
#define GADGET_ID_PROPERTIES_ADVANCED (GADGET_ID_TEXTBUTTON_FIRST + 2)
#define GADGET_ID_SAVE_AS_TEMPLATE (GADGET_ID_TEXTBUTTON_FIRST + 3)
+#define GADGET_ID_ADD_CHANGE_PAGE (GADGET_ID_TEXTBUTTON_FIRST + 4)
+#define GADGET_ID_DEL_CHANGE_PAGE (GADGET_ID_TEXTBUTTON_FIRST + 5)
+
+/* graphicbutton identifiers */
+#define GADGET_ID_GRAPHICBUTTON_FIRST (GADGET_ID_TEXTBUTTON_FIRST + 6)
+
+#define GADGET_ID_PREV_CHANGE_PAGE (GADGET_ID_GRAPHICBUTTON_FIRST + 0)
+#define GADGET_ID_NEXT_CHANGE_PAGE (GADGET_ID_GRAPHICBUTTON_FIRST + 1)
/* gadgets for scrolling of drawing area */
-#define GADGET_ID_SCROLLING_FIRST (GADGET_ID_TEXTBUTTON_FIRST + 4)
+#define GADGET_ID_SCROLLING_FIRST (GADGET_ID_GRAPHICBUTTON_FIRST + 2)
#define GADGET_ID_SCROLL_UP (GADGET_ID_SCROLLING_FIRST + 0)
#define GADGET_ID_SCROLL_DOWN (GADGET_ID_SCROLLING_FIRST + 1)
#define ED_COUNTER_ID_LEVEL_RANDOM 6
#define ED_COUNTER_ID_ELEMENT_SCORE 7
#define ED_COUNTER_ID_ELEMENT_CONTENT 8
-#define ED_COUNTER_ID_CUSTOM_SCORE 9
-#define ED_COUNTER_ID_CUSTOM_GEMCOUNT 10
-#define ED_COUNTER_ID_PUSH_DELAY_FIX 11
-#define ED_COUNTER_ID_PUSH_DELAY_RND 12
-#define ED_COUNTER_ID_MOVE_DELAY_FIX 13
-#define ED_COUNTER_ID_MOVE_DELAY_RND 14
-#define ED_COUNTER_ID_CHANGE_DELAY_FIX 15
-#define ED_COUNTER_ID_CHANGE_DELAY_RND 16
-#define ED_COUNTER_ID_CHANGE_CONT_RND 17
-
-#define ED_NUM_COUNTERBUTTONS 18
+#define ED_COUNTER_ID_ENVELOPE_XSIZE 9
+#define ED_COUNTER_ID_ENVELOPE_YSIZE 10
+#define ED_COUNTER_ID_CUSTOM_SCORE 11
+#define ED_COUNTER_ID_CUSTOM_GEMCOUNT 12
+#define ED_COUNTER_ID_PUSH_DELAY_FIX 13
+#define ED_COUNTER_ID_PUSH_DELAY_RND 14
+#define ED_COUNTER_ID_MOVE_DELAY_FIX 15
+#define ED_COUNTER_ID_MOVE_DELAY_RND 16
+#define ED_COUNTER_ID_CHANGE_DELAY_FIX 17
+#define ED_COUNTER_ID_CHANGE_DELAY_RND 18
+#define ED_COUNTER_ID_CHANGE_CONT_RND 19
+
+#define ED_NUM_COUNTERBUTTONS 20
#define ED_COUNTER_ID_LEVEL_FIRST ED_COUNTER_ID_LEVEL_XSIZE
#define ED_COUNTER_ID_LEVEL_LAST ED_COUNTER_ID_LEVEL_RANDOM
#define ED_TEXTINPUT_ID_LEVEL_FIRST ED_TEXTINPUT_ID_LEVEL_NAME
#define ED_TEXTINPUT_ID_LEVEL_LAST ED_TEXTINPUT_ID_LEVEL_AUTHOR
+/* values for text area gadgets */
+#define ED_TEXTAREA_ID_ENVELOPE_INFO 0
+
+#define ED_NUM_TEXTAREAS 1
+
+#define ED_TEXTAREA_ID_LEVEL_FIRST ED_TEXTAREA_ID_ENVELOPE
+#define ED_TEXTAREA_ID_LEVEL_LAST ED_TEXTAREA_ID_ENVELOPE
+
/* values for selectbox gadgets */
#define ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE 0
#define ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER 1
#define ED_SELECTBOX_ID_CHANGE_COLLIDE_ACTION 12
#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 13
#define ED_SELECTBOX_ID_CHANGE_POWER 14
+#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE 15
-#define ED_NUM_SELECTBOX 15
+#define ED_NUM_SELECTBOX 16
#define ED_SELECTBOX_ID_CUSTOM_FIRST ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE
#define ED_SELECTBOX_ID_CUSTOM_LAST ED_SELECTBOX_ID_CUSTOM_CONSISTENCY
#define ED_SELECTBOX_ID_CHANGE_FIRST ED_SELECTBOX_ID_CHANGE_TIME_UNITS
-#define ED_SELECTBOX_ID_CHANGE_LAST ED_SELECTBOX_ID_CHANGE_POWER
+#define ED_SELECTBOX_ID_CHANGE_LAST ED_SELECTBOX_ID_SELECT_CHANGE_PAGE
/* values for textbutton gadgets */
#define ED_TEXTBUTTON_ID_PROPERTIES_INFO 0
#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG 1
#define ED_TEXTBUTTON_ID_PROPERTIES_ADVANCED 2
#define ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE 3
+#define ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE 4
+#define ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE 5
+
+#define ED_NUM_TEXTBUTTONS 6
+
+#define ED_TEXTBUTTON_ID_PROPERTIES_FIRST ED_TEXTBUTTON_ID_PROPERTIES_INFO
+#define ED_TEXTBUTTON_ID_PROPERTIES_LAST ED_TEXTBUTTON_ID_PROPERTIES_ADVANCED
+
+#define ED_TEXTBUTTON_ID_CHANGE_FIRST ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE
+#define ED_TEXTBUTTON_ID_CHANGE_LAST ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE
-#define ED_NUM_TEXTBUTTON 4
+/* values for graphicbutton gadgets */
+#define ED_GRAPHICBUTTON_ID_PREV_CHANGE_PAGE 0
+#define ED_GRAPHICBUTTON_ID_NEXT_CHANGE_PAGE 1
+
+#define ED_NUM_GRAPHICBUTTONS 2
+
+#define ED_GRAPHICBUTTON_ID_CHANGE_FIRST ED_GRAPHICBUTTON_ID_PREV_CHANGE_PAGE
+#define ED_GRAPHICBUTTON_ID_CHANGE_LAST ED_GRAPHICBUTTON_ID_NEXT_CHANGE_PAGE
/* values for checkbutton gadgets */
#define ED_CHECKBUTTON_ID_DOUBLE_SPEED 0
/* how many steps can be cancelled */
#define NUM_UNDO_STEPS (10 + 1)
-/* values for elements with score */
+/* values for elements with score for certain actions */
#define MIN_SCORE 0
#define MAX_SCORE 255
-/* values for elements with gem count */
-#define MIN_GEM_COUNT 0
-#define MAX_GEM_COUNT 100
+/* values for elements with count for collecting */
+#define MIN_COLLECT_COUNT 0
+#define MAX_COLLECT_COUNT 100
/* values for random placement */
#define RANDOM_USE_PERCENTAGE 0
static boolean stick_element_properties_window = FALSE;
static boolean custom_element_properties[NUM_ELEMENT_PROPERTIES];
static boolean custom_element_change_events[NUM_CHANGE_EVENTS];
+static struct ElementChangeInfo custom_element_change;
static struct ElementInfo custom_element;
static struct
"playfield size:", NULL, "width",
},
{
- ED_SETTINGS_XPOS(0) + 2 * DXSIZE, ED_COUNTER_YPOS(2),
+ -1, ED_COUNTER_YPOS(2),
MIN_LEV_FIELDY, MAX_LEV_FIELDY,
GADGET_ID_LEVEL_YSIZE_DOWN, GADGET_ID_LEVEL_YSIZE_UP,
GADGET_ID_LEVEL_YSIZE_TEXT, GADGET_ID_LEVEL_XSIZE_UP,
&level.num_yamyam_contents,
NULL, NULL, "number of content areas"
},
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(0),
+ MIN_ENVELOPE_XSIZE, MAX_ENVELOPE_XSIZE,
+ GADGET_ID_ENVELOPE_XSIZE_DOWN, GADGET_ID_ENVELOPE_XSIZE_UP,
+ GADGET_ID_ENVELOPE_XSIZE_TEXT, GADGET_ID_NONE,
+ &level.envelope_xsize,
+ NULL, NULL, "width",
+ },
+ {
+ -1, ED_SETTINGS_YPOS(0),
+ MIN_ENVELOPE_YSIZE, MAX_ENVELOPE_YSIZE,
+ GADGET_ID_ENVELOPE_YSIZE_DOWN, GADGET_ID_ENVELOPE_YSIZE_UP,
+ GADGET_ID_ENVELOPE_YSIZE_TEXT, GADGET_ID_ENVELOPE_XSIZE_UP,
+ &level.envelope_ysize,
+ NULL, " ", "height",
+ },
/* ---------- element settings: configure (custom elements) ------------- */
MIN_SCORE, MAX_SCORE,
GADGET_ID_CUSTOM_SCORE_DOWN, GADGET_ID_CUSTOM_SCORE_UP,
GADGET_ID_CUSTOM_SCORE_TEXT, GADGET_ID_NONE,
- &custom_element.score,
- NULL, "collect score", NULL
+ &custom_element.collect_score,
+ NULL, "score", " "
},
{
- ED_SETTINGS_XPOS(13) + 10, ED_SETTINGS_YPOS(3),
- MIN_GEM_COUNT, MAX_GEM_COUNT,
+ -1, ED_SETTINGS_YPOS(3),
+ MIN_COLLECT_COUNT, MAX_COLLECT_COUNT,
GADGET_ID_CUSTOM_GEMCOUNT_DOWN, GADGET_ID_CUSTOM_GEMCOUNT_UP,
GADGET_ID_CUSTOM_GEMCOUNT_TEXT, GADGET_ID_CUSTOM_SCORE_UP,
- &custom_element.gem_count,
- NULL, "gems", NULL
+ &custom_element.collect_count,
+ NULL, "count", NULL
},
{
ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(4),
NULL, "push delay", NULL
},
{
- ED_COUNT_PUSH_DELAY_RND_XPOS, ED_SETTINGS_YPOS(4),
+ -1, ED_SETTINGS_YPOS(4),
0, 999,
GADGET_ID_PUSH_DELAY_RND_DOWN, GADGET_ID_PUSH_DELAY_RND_UP,
GADGET_ID_PUSH_DELAY_RND_TEXT, GADGET_ID_PUSH_DELAY_FIX_UP,
NULL, "move delay", NULL
},
{
- ED_COUNT_MOVE_DELAY_RND_XPOS, ED_SETTINGS_YPOS(7),
+ -1, ED_SETTINGS_YPOS(7),
0, 999,
GADGET_ID_MOVE_DELAY_RND_DOWN, GADGET_ID_MOVE_DELAY_RND_UP,
GADGET_ID_MOVE_DELAY_RND_TEXT, GADGET_ID_MOVE_DELAY_FIX_UP,
0, 999,
GADGET_ID_CHANGE_DELAY_FIX_DOWN, GADGET_ID_CHANGE_DELAY_FIX_UP,
GADGET_ID_CHANGE_DELAY_FIX_TEXT, GADGET_ID_NONE,
- &custom_element.change.delay_fixed,
+ &custom_element_change.delay_fixed,
NULL, "delay", NULL,
},
{
- ED_COUNT_CHANGE_DELAY_RND_XPOS+20, ED_SETTINGS_YPOS(3),
+ -1, ED_SETTINGS_YPOS(3),
0, 999,
GADGET_ID_CHANGE_DELAY_RND_DOWN, GADGET_ID_CHANGE_DELAY_RND_UP,
GADGET_ID_CHANGE_DELAY_RND_TEXT, GADGET_ID_CHANGE_DELAY_FIX_UP,
- &custom_element.change.delay_random,
+ &custom_element_change.delay_random,
NULL, "+random", NULL
},
{
0, 100,
GADGET_ID_CHANGE_CONT_RND_DOWN, GADGET_ID_CHANGE_CONT_RND_UP,
GADGET_ID_CHANGE_CONT_RND_TEXT, GADGET_ID_NONE,
- &custom_element.change.random,
+ &custom_element_change.random,
NULL, "use random change:", "(%)"
},
};
int gadget_id;
int size;
char *value;
- char *infotext;
+ char *text_above, *infotext;
} textinput_info[ED_NUM_TEXTINPUT] =
{
{
GADGET_ID_LEVEL_NAME,
MAX_LEVEL_NAME_LEN,
level.name,
- "Title"
+ "Title:", "Title"
},
{
ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(1),
GADGET_ID_LEVEL_AUTHOR,
MAX_LEVEL_AUTHOR_LEN,
level.author,
- "Author"
+ "Author:", "Author"
},
{
5 * MINI_TILEX, 5 * MINI_TILEY - ED_BORDER_SIZE,
GADGET_ID_ELEMENT_NAME,
MAX_ELEMENT_NAME_LEN - 2, /* currently 2 chars less editable */
custom_element.description,
- NULL
+ NULL, "Element name"
+ }
+};
+
+static struct
+{
+ int x, y;
+ int gadget_id;
+ int xsize, ysize;
+ char *value;
+ char *text_above, *infotext;
+} textarea_info[ED_NUM_TEXTAREAS] =
+{
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(2),
+ GADGET_ID_ENVELOPE_INFO,
+ MAX_ENVELOPE_XSIZE, MAX_ENVELOPE_YSIZE,
+ level.envelope,
+ "Envelope Info:", "Envelope Info"
}
};
static struct ValueTextInfo options_walk_to_action[] =
{
{ EP_DIGGABLE, "diggable" },
- { EP_COLLECTIBLE, "collectible" },
+ { EP_COLLECTIBLE_ONLY, "collectible" },
+ { EP_DROPPABLE, "collectible & droppable" },
{ EP_PUSHABLE, "pushable" },
{ -1, NULL }
};
static struct ValueTextInfo options_consistency[] =
{
- { EP_CAN_EXPLODE, "can explode" },
+ { EP_CAN_EXPLODE_3X3, "can explode 3x3" },
+ { EP_CAN_EXPLODE_1X1, "can explode 1x1" },
{ EP_INDESTRUCTIBLE, "indestructible" },
{ -1, NULL }
};
static struct ValueTextInfo options_time_units[] =
{
- { 50, "seconds" },
+ { FRAMES_PER_SECOND, "seconds" },
{ 1, "frames" },
{ -1, NULL }
};
{ CE_TOUCHED_BY_PLAYER, "touched" },
{ CE_PRESSED_BY_PLAYER, "pressed" },
{ CE_PUSHED_BY_PLAYER, "pushed" },
+ { CE_DROPPED_BY_PLAYER, "dropped" },
{ -1, NULL }
};
static struct ValueTextInfo options_change_other_action[] =
{
- { CE_OTHER_IS_TOUCHING, "touching" },
- { CE_OTHER_IS_CHANGING, "change of" },
- { CE_OTHER_IS_EXPLODING, "explosion of" },
- { CE_OTHER_GETS_TOUCHED, "player touches" },
- { CE_OTHER_GETS_PRESSED, "player presses" },
- { CE_OTHER_GETS_PUSHED, "player pushes" },
- { CE_OTHER_GETS_COLLECTED, "player collects" },
- { -1, NULL }
+ { CE_OTHER_IS_TOUCHING, "touching" },
+ { CE_OTHER_IS_CHANGING, "change of" },
+ { CE_OTHER_IS_EXPLODING, "explosion of" },
+ { CE_OTHER_GETS_TOUCHED, "player touches" },
+ { CE_OTHER_GETS_PRESSED, "player presses" },
+ { CE_OTHER_GETS_PUSHED, "player pushes" },
+ { CE_OTHER_GETS_COLLECTED, "player collects" },
+ { CE_OTHER_GETS_DROPPED, "player drops" },
+ { -1, NULL }
};
static struct ValueTextInfo options_change_power[] =
{ -1, NULL }
};
+static char options_change_page_strings[MAX_CHANGE_PAGES][10];
+static struct ValueTextInfo options_change_page[MAX_CHANGE_PAGES + 1] =
+{
+ { -1, NULL }
+};
+
static struct
{
int x, y;
"player can", NULL, "type of access to this field"
},
{
- ED_SETTINGS_XPOS(11), ED_SETTINGS_YPOS(1),
+ -1, ED_SETTINGS_YPOS(1),
GADGET_ID_CUSTOM_ACCESS_LAYER, GADGET_ID_CUSTOM_ACCESS_TYPE,
-1,
options_access_layer,
"move/fall speed", NULL, "speed of element movement"
},
{
- ED_SETTINGS_XPOS(7), ED_SETTINGS_YPOS(9),
+ -1, ED_SETTINGS_YPOS(9),
GADGET_ID_CUSTOM_SMASH_TARGETS, GADGET_ID_CUSTOM_CAN_SMASH,
-1,
options_smash_targets,
-1,
options_consistency,
&custom_element.consistency,
- NULL, "explodes to:", "consistency/destructibility"
+ NULL, NULL, "consistency/destructibility"
},
/* ---------- element settings: advanced (custom elements) --------------- */
GADGET_ID_CHANGE_TIME_UNITS, GADGET_ID_NONE,
-1,
options_time_units,
- &custom_element.change.delay_frames,
+ &custom_element_change.delay_frames,
"delay time given in", NULL, "delay time units for change"
},
{
GADGET_ID_CHANGE_PLAYER_ACTION, GADGET_ID_NONE,
-1,
options_change_player_action,
- &custom_element.change_player_action,
+ &custom_element_change.player_action,
NULL, "by player", "type of player contact"
},
{
GADGET_ID_CHANGE_COLLIDE_ACTION, GADGET_ID_NONE,
-1,
options_change_collide_action,
- &custom_element.change_collide_action,
+ &custom_element_change.collide_action,
NULL, NULL, "change after impact or smash"
},
{
GADGET_ID_CHANGE_OTHER_ACTION, GADGET_ID_NONE,
-1,
options_change_other_action,
- &custom_element.change_other_action,
+ &custom_element_change.other_action,
NULL, "element:", "type of other element action"
},
{
GADGET_ID_CHANGE_POWER, GADGET_ID_NONE,
-1,
options_change_power,
- &custom_element.change.power,
+ &custom_element_change.power,
"power:", NULL, "power of extended change"
},
+ {
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(14),
+ GADGET_ID_SELECT_CHANGE_PAGE, GADGET_ID_NONE,
+ 3,
+ options_change_page,
+ &custom_element.current_change_page,
+ NULL, NULL, "element config page"
+ },
};
static struct
int gadget_id;
int gadget_id_align;
int size;
- char *text, *infotext;
-} textbutton_info[ED_NUM_TEXTBUTTON] =
+ char *text;
+ char *text_left, *text_right, *infotext;
+} textbutton_info[ED_NUM_TEXTBUTTONS] =
{
{
ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(1),
GADGET_ID_PROPERTIES_INFO, GADGET_ID_NONE,
- 11, "Information", "Show information about element"
+ 11, "Information",
+ NULL, NULL, "Show information about element"
},
{
ED_SETTINGS_XPOS(0) + 166, ED_COUNTER_YPOS(1),
GADGET_ID_PROPERTIES_CONFIG, GADGET_ID_NONE,
- 11, "Configure", "Configure element properties"
+ 11, "Configure",
+ NULL, NULL, "Configure element properties"
},
{
ED_SETTINGS_XPOS(0) + 332, ED_COUNTER_YPOS(1),
GADGET_ID_PROPERTIES_ADVANCED, GADGET_ID_NONE,
- 11, "Advanced", "Advanced element configuration"
+ 11, "Advanced",
+ NULL, NULL, "Advanced element configuration"
},
{
- ED_SETTINGS_XPOS(0) + 262, ED_SETTINGS_YPOS(13),
+ -1, ED_SETTINGS_YPOS(13),
GADGET_ID_SAVE_AS_TEMPLATE, GADGET_ID_CUSTOM_USE_TEMPLATE,
- -1, "Save as template", "Save current settings as new template"
+ -1, "Save as template",
+ " ", NULL, "Save current settings as new template"
+ },
+ {
+ -1, ED_SETTINGS_YPOS(14),
+ GADGET_ID_ADD_CHANGE_PAGE, GADGET_ID_NEXT_CHANGE_PAGE,
+ -1, "New",
+ " ", NULL, "Add new config page"
+ },
+ {
+ -1, ED_SETTINGS_YPOS(14),
+ GADGET_ID_DEL_CHANGE_PAGE, GADGET_ID_ADD_CHANGE_PAGE,
+ -1, "Delete",
+ NULL, NULL, "Delete current config page"
+ },
+};
+
+static struct
+{
+ int gd_x, gd_y;
+ int x, y;
+ int width, height;
+ int gadget_id;
+ int gadget_id_align;
+ char *text_left, *text_right, *infotext;
+} graphicbutton_info[ED_NUM_GRAPHICBUTTONS] =
+{
+ {
+ ED_BUTTON_MINUS_XPOS, ED_BUTTON_COUNT_YPOS,
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(14),
+ ED_BUTTON_COUNT_XSIZE, ED_BUTTON_COUNT_YSIZE,
+ GADGET_ID_PREV_CHANGE_PAGE, GADGET_ID_NONE,
+ NULL, NULL, "select previous config page"
+ },
+ {
+ ED_BUTTON_PLUS_XPOS, ED_BUTTON_COUNT_YPOS,
+ -1, ED_SETTINGS_YPOS(14),
+ ED_BUTTON_COUNT_XSIZE, ED_BUTTON_COUNT_YSIZE,
+ GADGET_ID_NEXT_CHANGE_PAGE, GADGET_ID_SELECT_CHANGE_PAGE,
+ NULL, "config page", "select next config page"
},
};
},
{
ED_SCROLLBUTTON2_XPOS, ED_SCROLLBUTTON2_YPOS + 1 * ED_SCROLLBUTTON2_YSIZE,
- ED_SCROLL2_DOWN_XPOS, ED_SCROLL2_DOWN_YPOS,
+ ED_SCROLL2_DOWN_XPOS, ED_SCROLL2_DOWN_YPOS,
GADGET_ID_SCROLL_LIST_DOWN,
"scroll element list down ('Page Down')"
- }
+ },
};
static struct
} radiobutton_info[ED_NUM_RADIOBUTTONS] =
{
{
- ED_SETTINGS_XPOS(0) + 160, ED_COUNTER2_YPOS(8),
+ -1, ED_COUNTER2_YPOS(8),
GADGET_ID_RANDOM_PERCENTAGE, GADGET_ID_LEVEL_RANDOM_UP,
RADIO_NR_RANDOM_ELEMENTS,
&random_placement_method, RANDOM_USE_PERCENTAGE,
" ", "percentage", "use percentage for random elements"
},
{
- ED_SETTINGS_XPOS(0) + 340, ED_COUNTER2_YPOS(8),
+ -1, ED_COUNTER2_YPOS(8),
GADGET_ID_RANDOM_QUANTITY, GADGET_ID_RANDOM_PERCENTAGE,
RADIO_NR_RANDOM_ELEMENTS,
&random_placement_method, RANDOM_USE_QUANTITY,
NULL, "double speed movement", "set movement speed of player"
},
{
- ED_SETTINGS_XPOS(0) + 340, ED_COUNTER_YPOS(6) - MINI_TILEY,
+ -1, ED_COUNTER_YPOS(6) - MINI_TILEY,
GADGET_ID_GRAVITY, GADGET_ID_DOUBLE_SPEED,
&level.gravity,
" ", "gravity", "set level gravity"
NULL, "can fall", "element can fall down"
},
{
- ED_SETTINGS_XPOS(6), ED_SETTINGS_YPOS(9),
+ -1, ED_SETTINGS_YPOS(9),
GADGET_ID_CUSTOM_CAN_SMASH, GADGET_ID_CUSTOM_CAN_FALL,
&custom_element_properties[EP_CAN_SMASH],
" ", NULL, "element can smash other elements"
NULL, "by fire", "element can explode by fire/explosion"
},
{
- ED_SETTINGS_XPOS(7), ED_SETTINGS_YPOS(13),
+ -1, ED_SETTINGS_YPOS(13),
GADGET_ID_CUSTOM_EXPLODE_SMASH, GADGET_ID_CUSTOM_EXPLODE_FIRE,
&custom_element.can_explode_smashed,
" ", "smashed", "element can explode when smashed"
},
{
- ED_SETTINGS_XPOS(13), ED_SETTINGS_YPOS(13),
+ -1, ED_SETTINGS_YPOS(13),
GADGET_ID_CUSTOM_EXPLODE_IMPACT, GADGET_ID_CUSTOM_EXPLODE_SMASH,
&custom_element.can_explode_impact,
" ", "impact", "element can explode on impact"
{
ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(2),
GADGET_ID_CUSTOM_CAN_CHANGE, GADGET_ID_NONE,
- &custom_element_properties[EP_CAN_CHANGE],
+ &custom_element_change.can_change,
NULL, "element changes to:", "element can change to other element"
},
{
{
ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(8),
GADGET_ID_CHANGE_USE_EXPLOSION, GADGET_ID_NONE,
- &custom_element.change.explode,
+ &custom_element_change.explode,
NULL, "explode instead of change", "element explodes instead of change"
},
{
ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(9),
GADGET_ID_CHANGE_USE_CONTENT, GADGET_ID_NONE,
- &custom_element.change.use_content,
+ &custom_element_change.use_content,
NULL, "use extended change target:","element changes to more elements"
},
{
ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(11),
GADGET_ID_CHANGE_ONLY_COMPLETE, GADGET_ID_NONE,
- &custom_element.change.only_complete,
+ &custom_element_change.only_complete,
NULL, "only use complete change", "only use complete extended content"
},
{
ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(12),
GADGET_ID_CHANGE_USE_RANDOM, GADGET_ID_NONE,
- &custom_element.change.use_random_change,
+ &custom_element_change.use_random_change,
NULL, NULL, "use random value for new content"
},
{
int area_xsize, area_ysize;
int gadget_id;
int gadget_id_align;
- char *text_left, *text_right;
+ char *text_left, *text_right, *text_below;
} drawingarea_info[ED_NUM_DRAWING_AREAS] =
{
/* ---------- level playfield content ------------------------------------ */
0, 0,
MAX_ED_FIELDX, MAX_ED_FIELDY,
GADGET_ID_DRAWING_LEVEL, GADGET_ID_NONE,
- NULL, NULL
+ NULL, NULL, NULL
},
/* ---------- yam yam content -------------------------------------------- */
ED_AREA_YAMYAM_CONTENT_XPOS(0), ED_AREA_YAMYAM_CONTENT_YPOS(0),
3, 3,
GADGET_ID_ELEMENT_CONTENT_0, GADGET_ID_NONE,
- NULL, NULL
+ NULL, NULL, "1"
},
{
ED_AREA_YAMYAM_CONTENT_XPOS(1), ED_AREA_YAMYAM_CONTENT_YPOS(1),
3, 3,
GADGET_ID_ELEMENT_CONTENT_1, GADGET_ID_NONE,
- NULL, NULL
+ NULL, NULL, "2"
},
{
ED_AREA_YAMYAM_CONTENT_XPOS(2), ED_AREA_YAMYAM_CONTENT_YPOS(2),
3, 3,
GADGET_ID_ELEMENT_CONTENT_2, GADGET_ID_NONE,
- NULL, NULL
+ NULL, NULL, "3"
},
{
ED_AREA_YAMYAM_CONTENT_XPOS(3), ED_AREA_YAMYAM_CONTENT_YPOS(3),
3, 3,
GADGET_ID_ELEMENT_CONTENT_3, GADGET_ID_NONE,
- NULL, NULL
+ NULL, NULL, "4"
},
{
ED_AREA_YAMYAM_CONTENT_XPOS(4), ED_AREA_YAMYAM_CONTENT_YPOS(4),
3, 3,
GADGET_ID_ELEMENT_CONTENT_4, GADGET_ID_NONE,
- NULL, NULL
+ NULL, NULL, "5"
},
{
ED_AREA_YAMYAM_CONTENT_XPOS(5), ED_AREA_YAMYAM_CONTENT_YPOS(5),
3, 3,
GADGET_ID_ELEMENT_CONTENT_5, GADGET_ID_NONE,
- NULL, NULL
+ NULL, NULL, "6"
},
{
ED_AREA_YAMYAM_CONTENT_XPOS(6), ED_AREA_YAMYAM_CONTENT_YPOS(6),
3, 3,
GADGET_ID_ELEMENT_CONTENT_6, GADGET_ID_NONE,
- NULL, NULL
+ NULL, NULL, "7"
},
{
ED_AREA_YAMYAM_CONTENT_XPOS(7), ED_AREA_YAMYAM_CONTENT_YPOS(7),
3, 3,
GADGET_ID_ELEMENT_CONTENT_7, GADGET_ID_NONE,
- NULL, NULL
+ NULL, NULL, "8"
},
/* ---------- amoeba content --------------------------------------------- */
ED_AREA_ELEM_CONTENT_XPOS, ED_AREA_ELEM_CONTENT_YPOS,
1, 1,
GADGET_ID_AMOEBA_CONTENT, GADGET_ID_NONE,
- NULL, NULL
+ NULL, "content of amoeba", NULL
},
/* ---------- custom graphic --------------------------------------------- */
{
- ED_AREA_ELEM_CONTENT3_XPOS, ED_AREA_ELEM_CONTENT3_YPOS,
+ -1, ED_AREA_ELEM_CONTENT3_YPOS,
1, 1,
GADGET_ID_CUSTOM_GRAPHIC, GADGET_ID_CUSTOM_USE_GRAPHIC,
- NULL, NULL
+ NULL, NULL, NULL
},
/* ---------- custom content (when exploding) ---------------------------- */
ED_AREA_ELEM_CONTENT4_XPOS, ED_AREA_ELEM_CONTENT4_YPOS,
3, 3,
GADGET_ID_CUSTOM_CONTENT, GADGET_ID_NONE, /* align three rows */
- NULL, NULL
+ "content:", NULL, NULL
},
/* ---------- custom change target --------------------------------------- */
{
- ED_AREA_ELEM_CONTENT2_XPOS, ED_AREA_ELEM_CONTENT2_YPOS,
+ -1, ED_AREA_ELEM_CONTENT2_YPOS,
1, 1,
GADGET_ID_CUSTOM_CHANGE_TARGET, GADGET_ID_CUSTOM_CAN_CHANGE,
- NULL, "after/when:"
+ NULL, "after/when:", NULL
},
/* ---------- custom change content (extended change target) ------------- */
ED_AREA_ELEM_CONTENT6_XPOS, ED_AREA_ELEM_CONTENT6_YPOS,
3, 3,
GADGET_ID_CUSTOM_CHANGE_CONTENT, GADGET_ID_NONE, /* align three rows */
- NULL, NULL
+ NULL, NULL, NULL
},
/* ---------- custom change trigger (element causing change) ------------- */
{
- ED_AREA_ELEM_CONTENT5_XPOS, ED_AREA_ELEM_CONTENT5_YPOS,
+ -1, ED_AREA_ELEM_CONTENT5_YPOS,
1, 1,
GADGET_ID_CUSTOM_CHANGE_TRIGGER, GADGET_ID_CHANGE_OTHER_ACTION,
- NULL, NULL
+ NULL, NULL, NULL
},
/* ---------- random background (for random painting) -------------------- */
{
- ED_AREA_RANDOM_BACKGROUND_XPOS, ED_AREA_RANDOM_BACKGROUND_YPOS,
+ -1, ED_AREA_RANDOM_BACKGROUND_YPOS,
1, 1,
GADGET_ID_RANDOM_BACKGROUND, GADGET_ID_RANDOM_RESTRICTED,
- NULL, NULL
+ NULL, NULL, NULL
},
};
static void HandleDrawingAreas(struct GadgetInfo *);
static void HandleCounterButtons(struct GadgetInfo *);
static void HandleTextInputGadgets(struct GadgetInfo *);
+static void HandleTextAreaGadgets(struct GadgetInfo *);
static void HandleSelectboxGadgets(struct GadgetInfo *);
static void HandleTextbuttonGadgets(struct GadgetInfo *);
+static void HandleGraphicbuttonGadgets(struct GadgetInfo *);
static void HandleRadiobuttons(struct GadgetInfo *);
static void HandleCheckbuttons(struct GadgetInfo *);
static void HandleControlButtons(struct GadgetInfo *);
EL_STEELWALL,
EL_WALL,
- EL_WALL_CRUMBLED,
+ EL_WALL_SLIPPERY,
EL_MAGIC_WALL,
EL_EMERALD,
EL_LANDMINE,
EL_INVISIBLE_SAND,
- EL_STEELWALL_SLANTED,
+ EL_STEELWALL_SLIPPERY,
EL_EMPTY,
EL_SIGN_EXCLAMATION,
};
static int num_editor_el_custom = SIZEOF_ARRAY_INT(editor_el_custom);
+static int editor_el_custom_more[] =
+{
+ EL_CUSTOM_START + 128,
+ EL_CUSTOM_START + 129,
+ EL_CUSTOM_START + 130,
+ EL_CUSTOM_START + 131,
+
+ EL_CUSTOM_START + 132,
+ EL_CUSTOM_START + 133,
+ EL_CUSTOM_START + 134,
+ EL_CUSTOM_START + 135,
+
+ EL_CUSTOM_START + 136,
+ EL_CUSTOM_START + 137,
+ EL_CUSTOM_START + 138,
+ EL_CUSTOM_START + 139,
+
+ EL_CUSTOM_START + 140,
+ EL_CUSTOM_START + 141,
+ EL_CUSTOM_START + 142,
+ EL_CUSTOM_START + 143,
+
+ EL_CUSTOM_START + 144,
+ EL_CUSTOM_START + 145,
+ EL_CUSTOM_START + 146,
+ EL_CUSTOM_START + 147,
+
+ EL_CUSTOM_START + 148,
+ EL_CUSTOM_START + 149,
+ EL_CUSTOM_START + 150,
+ EL_CUSTOM_START + 151,
+
+ EL_CUSTOM_START + 152,
+ EL_CUSTOM_START + 153,
+ EL_CUSTOM_START + 154,
+ EL_CUSTOM_START + 155,
+
+ EL_CUSTOM_START + 156,
+ EL_CUSTOM_START + 157,
+ EL_CUSTOM_START + 158,
+ EL_CUSTOM_START + 159,
+
+ EL_CUSTOM_START + 160,
+ EL_CUSTOM_START + 161,
+ EL_CUSTOM_START + 162,
+ EL_CUSTOM_START + 163,
+
+ EL_CUSTOM_START + 164,
+ EL_CUSTOM_START + 165,
+ EL_CUSTOM_START + 166,
+ EL_CUSTOM_START + 167,
+
+ EL_CUSTOM_START + 168,
+ EL_CUSTOM_START + 169,
+ EL_CUSTOM_START + 170,
+ EL_CUSTOM_START + 171,
+
+ EL_CUSTOM_START + 172,
+ EL_CUSTOM_START + 173,
+ EL_CUSTOM_START + 174,
+ EL_CUSTOM_START + 175,
+
+ EL_CUSTOM_START + 176,
+ EL_CUSTOM_START + 177,
+ EL_CUSTOM_START + 178,
+ EL_CUSTOM_START + 179,
+
+ EL_CUSTOM_START + 180,
+ EL_CUSTOM_START + 181,
+ EL_CUSTOM_START + 182,
+ EL_CUSTOM_START + 183,
+
+ EL_CUSTOM_START + 184,
+ EL_CUSTOM_START + 185,
+ EL_CUSTOM_START + 186,
+ EL_CUSTOM_START + 187,
+
+ EL_CUSTOM_START + 188,
+ EL_CUSTOM_START + 189,
+ EL_CUSTOM_START + 190,
+ EL_CUSTOM_START + 191,
+
+ EL_CUSTOM_START + 192,
+ EL_CUSTOM_START + 193,
+ EL_CUSTOM_START + 194,
+ EL_CUSTOM_START + 195,
+
+ EL_CUSTOM_START + 196,
+ EL_CUSTOM_START + 197,
+ EL_CUSTOM_START + 198,
+ EL_CUSTOM_START + 199,
+
+ EL_CUSTOM_START + 200,
+ EL_CUSTOM_START + 201,
+ EL_CUSTOM_START + 202,
+ EL_CUSTOM_START + 203,
+
+ EL_CUSTOM_START + 204,
+ EL_CUSTOM_START + 205,
+ EL_CUSTOM_START + 206,
+ EL_CUSTOM_START + 207,
+
+ EL_CUSTOM_START + 208,
+ EL_CUSTOM_START + 209,
+ EL_CUSTOM_START + 210,
+ EL_CUSTOM_START + 211,
+
+ EL_CUSTOM_START + 212,
+ EL_CUSTOM_START + 213,
+ EL_CUSTOM_START + 214,
+ EL_CUSTOM_START + 215,
+
+ EL_CUSTOM_START + 216,
+ EL_CUSTOM_START + 217,
+ EL_CUSTOM_START + 218,
+ EL_CUSTOM_START + 219,
+
+ EL_CUSTOM_START + 220,
+ EL_CUSTOM_START + 221,
+ EL_CUSTOM_START + 222,
+ EL_CUSTOM_START + 223,
+
+ EL_CUSTOM_START + 224,
+ EL_CUSTOM_START + 225,
+ EL_CUSTOM_START + 226,
+ EL_CUSTOM_START + 227,
+
+ EL_CUSTOM_START + 228,
+ EL_CUSTOM_START + 229,
+ EL_CUSTOM_START + 230,
+ EL_CUSTOM_START + 231,
+
+ EL_CUSTOM_START + 232,
+ EL_CUSTOM_START + 233,
+ EL_CUSTOM_START + 234,
+ EL_CUSTOM_START + 235,
+
+ EL_CUSTOM_START + 236,
+ EL_CUSTOM_START + 237,
+ EL_CUSTOM_START + 238,
+ EL_CUSTOM_START + 239,
+
+ EL_CUSTOM_START + 240,
+ EL_CUSTOM_START + 241,
+ EL_CUSTOM_START + 242,
+ EL_CUSTOM_START + 243,
+
+ EL_CUSTOM_START + 244,
+ EL_CUSTOM_START + 245,
+ EL_CUSTOM_START + 246,
+ EL_CUSTOM_START + 247,
+
+ EL_CUSTOM_START + 248,
+ EL_CUSTOM_START + 249,
+ EL_CUSTOM_START + 250,
+ EL_CUSTOM_START + 251,
+
+ EL_CUSTOM_START + 252,
+ EL_CUSTOM_START + 253,
+ EL_CUSTOM_START + 254,
+ EL_CUSTOM_START + 255
+};
+static int num_editor_el_custom_more = SIZEOF_ARRAY_INT(editor_el_custom_more);
+
static int *editor_elements = NULL; /* dynamically allocated */
static int num_editor_elements = 0; /* dynamically determined */
&num_editor_el_chars },
{ &setup.editor.el_custom, editor_el_custom,
&num_editor_el_custom },
+ { &setup.editor.el_custom_more, editor_el_custom_more,
+ &num_editor_el_custom_more },
{ NULL, NULL,
NULL }
};
if (*editor_elements_info[i].setup_value)
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;
}
static void ReinitializeElementListButtons()
return (SXSIZE / getFontWidth(FONT_TEXT_2));
}
-static int getFullTextWidth(char *text)
+static int getTextWidthForGadget(char *text)
{
if (text == NULL)
return 0;
- return (strlen(text) * getFontWidth(FONT_TEXT_1) + ED_GADGET_TEXT_DISTANCE);
+ return (getTextWidth(text, FONT_TEXT_1) + ED_GADGET_TEXT_DISTANCE);
+}
+
+static int getTextWidthForDrawingArea(char *text)
+{
+ if (text == NULL)
+ return 0;
+
+ return (getTextWidth(text, FONT_TEXT_1) + ED_DRAWINGAREA_TEXT_DISTANCE);
}
static int getRightGadgetBorder(struct GadgetInfo *gi, char *text)
{
- return (gi->x + gi->width + getFullTextWidth(text));
+ return (gi->x + gi->width + getTextWidthForGadget(text));
}
static char *getElementInfoText(int element)
return info_text;
}
+static void DrawElementBorder(int dest_x, int dest_y, int width, int height,
+ boolean input)
+{
+ int border_graphic =
+ (input ? IMG_EDITOR_ELEMENT_BORDER_INPUT : IMG_EDITOR_ELEMENT_BORDER);
+ Bitmap *src_bitmap;
+ int src_x, src_y;
+ int num_mini_tilex = width / MINI_TILEX + 1;
+ int num_mini_tiley = width / 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);
+
+ ClearRectangle(drawto, dest_x - 1, dest_y - 1, width + 2, height + 2);
+}
+
+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[x][y]));
+ 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.content[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_ELEMENT_CONTENT_0 &&
+ id <= ED_DRAWING_ID_ELEMENT_CONTENT_7)
+ {
+ int nr = id - ED_DRAWING_ID_ELEMENT_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][x][y]));
+ }
+}
+
static void ScrollMiniLevel(int from_x, int from_y, int scroll)
{
int x,y;
/* determine horizontal offset for leading text */
if (counterbutton_info[i].text_left != NULL)
- x += (getFontWidth(FONT_TEXT_1) * strlen(counterbutton_info[i].text_left)
- + ED_GADGET_TEXT_DISTANCE);
+ x += getTextWidthForGadget(counterbutton_info[i].text_left);
for (j=0; j<2; j++)
{
GDI_INFO_TEXT, "enter counter value",
GDI_X, x,
GDI_Y, y,
- GDI_TYPE, GD_TYPE_TEXTINPUT_NUMERIC,
+ GDI_TYPE, GD_TYPE_TEXT_INPUT_NUMERIC,
GDI_NUMBER_VALUE, 0,
GDI_NUMBER_MIN, counterbutton_info[i].min_value,
GDI_NUMBER_MAX, counterbutton_info[i].max_value,
/* determine horizontal position to the right of specified gadget */
if (drawingarea_info[i].gadget_id_align != GADGET_ID_NONE)
x = (right_gadget_border[drawingarea_info[i].gadget_id_align] +
- ED_GADGET_TEXT_DISTANCE + MINI_TILEX / 2);
+ ED_DRAWINGAREA_TEXT_DISTANCE);
/* determine horizontal offset for leading text */
if (drawingarea_info[i].text_left != NULL)
- x += (getFontWidth(FONT_TEXT_1) * strlen(drawingarea_info[i].text_left) +
- ED_GADGET_TEXT_DISTANCE + MINI_TILEX / 2);
+ x += getTextWidthForDrawingArea(drawingarea_info[i].text_left);
gi = CreateGadget(GDI_CUSTOM_ID, id,
GDI_CUSTOM_TYPE_ID, i,
GDI_INFO_TEXT, infotext,
GDI_X, SX + textinput_info[i].x,
GDI_Y, SY + textinput_info[i].y,
- GDI_TYPE, GD_TYPE_TEXTINPUT_ALPHANUMERIC,
+ GDI_TYPE, GD_TYPE_TEXT_INPUT_ALPHANUMERIC,
GDI_TEXT_VALUE, textinput_info[i].value,
GDI_TEXT_SIZE, textinput_info[i].size,
GDI_TEXT_FONT, FONT_INPUT_1,
}
}
+static void CreateTextAreaGadgets()
+{
+ int max_infotext_len = getMaxInfoTextLength();
+ int i;
+
+ for (i=0; i<ED_NUM_TEXTAREAS; i++)
+ {
+ Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
+ int gd_x, gd_y;
+ struct GadgetInfo *gi;
+ unsigned long event_mask;
+ char infotext[MAX_OUTPUT_LINESIZE + 1];
+ int id = textarea_info[i].gadget_id;
+ int area_xsize = textarea_info[i].xsize;
+ int area_ysize = textarea_info[i].ysize;
+
+ event_mask = GD_EVENT_TEXT_LEAVING;
+
+ gd_x = DOOR_GFX_PAGEX4 + ED_WIN_COUNT_XPOS;
+ gd_y = DOOR_GFX_PAGEY1 + ED_WIN_COUNT_YPOS;
+
+ sprintf(infotext, "Enter %s", textarea_info[i].infotext);
+ infotext[max_infotext_len] = '\0';
+
+ gi = CreateGadget(GDI_CUSTOM_ID, id,
+ GDI_CUSTOM_TYPE_ID, i,
+ GDI_INFO_TEXT, infotext,
+ GDI_X, SX + textarea_info[i].x,
+ GDI_Y, SY + textarea_info[i].y,
+ GDI_TYPE, GD_TYPE_TEXT_AREA,
+ GDI_AREA_SIZE, area_xsize, area_ysize,
+ GDI_TEXT_FONT, FONT_INPUT_1,
+ GDI_TEXT_FONT_ACTIVE, FONT_INPUT_1_ACTIVE,
+ GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x, gd_y,
+ GDI_DESIGN_PRESSED, gd_bitmap, gd_x, gd_y,
+ GDI_BORDER_SIZE, ED_BORDER_SIZE, ED_BORDER_SIZE,
+ GDI_DESIGN_WIDTH, ED_WIN_COUNT_XSIZE,
+ GDI_EVENT_MASK, event_mask,
+ GDI_CALLBACK_INFO, HandleEditorGadgetInfoText,
+ GDI_CALLBACK_ACTION, HandleTextAreaGadgets,
+ GDI_END);
+
+ if (gi == NULL)
+ Error(ERR_EXIT, "cannot create gadget");
+
+ level_editor_gadget[id] = gi;
+ }
+}
+
static void CreateSelectboxGadgets()
{
int max_infotext_len = getMaxInfoTextLength();
/* determine horizontal offset for leading text */
if (selectbox_info[i].text_left != NULL)
- x += (getFontWidth(FONT_TEXT_1) * strlen(selectbox_info[i].text_left) +
- ED_GADGET_TEXT_DISTANCE);
+ x += getTextWidthForGadget(selectbox_info[i].text_left);
sprintf(infotext, "Select %s", selectbox_info[i].infotext);
infotext[max_infotext_len] = '\0';
GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x, gd_y,
GDI_DESIGN_PRESSED, gd_bitmap, gd_x, gd_y,
GDI_BORDER_SIZE, ED_BORDER_SIZE, ED_BORDER_SIZE,
- GDI_BORDER_SIZE_SELECTBUTTON, getFontWidth(FONT_INPUT_1),
+ GDI_BORDER_SIZE_SELECTBUTTON, ED_SELECTBOX_BUTTON_XSIZE,
GDI_DESIGN_WIDTH, ED_WIN_COUNT_XSIZE,
GDI_EVENT_MASK, event_mask,
GDI_CALLBACK_INFO, HandleEditorGadgetInfoText,
int max_infotext_len = getMaxInfoTextLength();
int i;
- for (i=0; i<ED_NUM_TEXTBUTTON; i++)
+ for (i=0; i<ED_NUM_TEXTBUTTONS; i++)
{
Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
int gd_x1, gd_x2, gd_y1, gd_y2;
x = (right_gadget_border[textbutton_info[i].gadget_id_align] +
ED_GADGET_TEXT_DISTANCE);
+ /* determine horizontal offset for leading text */
+ if (textbutton_info[i].text_left != NULL)
+ x += getTextWidthForGadget(textbutton_info[i].text_left);
+
gi = CreateGadget(GDI_CUSTOM_ID, id,
GDI_CUSTOM_TYPE_ID, i,
GDI_INFO_TEXT, infotext,
Error(ERR_EXIT, "cannot create gadget");
level_editor_gadget[id] = gi;
+ right_gadget_border[id] =
+ getRightGadgetBorder(gi, textbutton_info[i].text_right);
+ }
+}
+
+static void CreateGraphicbuttonGadgets()
+{
+ Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
+ struct GadgetInfo *gi;
+ unsigned long event_mask;
+ int i;
+
+ /* create buttons for scrolling of drawing area and element list */
+ for (i=0; i < ED_NUM_GRAPHICBUTTONS; i++)
+ {
+ int id = graphicbutton_info[i].gadget_id;
+ int gd_x1, gd_x2, gd_y1, gd_y2;
+ int x = SX + graphicbutton_info[i].x;
+ int y = SY + graphicbutton_info[i].y;
+
+ event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED;
+
+ gd_x1 = DOOR_GFX_PAGEX4 + graphicbutton_info[i].gd_x;
+ gd_x2 = DOOR_GFX_PAGEX3 + graphicbutton_info[i].gd_x;
+ gd_y1 = DOOR_GFX_PAGEY1 + graphicbutton_info[i].gd_y;
+ gd_y2 = gd_y1;
+
+ /* determine horizontal position to the right of specified gadget */
+ if (graphicbutton_info[i].gadget_id_align != GADGET_ID_NONE)
+ x = (right_gadget_border[graphicbutton_info[i].gadget_id_align] +
+ ED_GADGET_TEXT_DISTANCE);
+
+ /* determine horizontal offset for leading text */
+ if (graphicbutton_info[i].text_left != NULL)
+ x += getTextWidthForGadget(graphicbutton_info[i].text_left);
+
+ gi = CreateGadget(GDI_CUSTOM_ID, id,
+ GDI_CUSTOM_TYPE_ID, i,
+ GDI_INFO_TEXT, graphicbutton_info[i].infotext,
+ GDI_X, x,
+ GDI_Y, y,
+ GDI_WIDTH, graphicbutton_info[i].width,
+ GDI_HEIGHT, graphicbutton_info[i].height,
+ GDI_TYPE, GD_TYPE_NORMAL_BUTTON,
+ GDI_STATE, GD_BUTTON_UNPRESSED,
+ GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y1,
+ GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y2,
+ GDI_EVENT_MASK, event_mask,
+ GDI_CALLBACK_INFO, HandleEditorGadgetInfoText,
+ GDI_CALLBACK_ACTION, HandleGraphicbuttonGadgets,
+ GDI_END);
+
+ if (gi == NULL)
+ Error(ERR_EXIT, "cannot create gadget");
+
+ level_editor_gadget[id] = gi;
+ right_gadget_border[id] =
+ getRightGadgetBorder(gi, graphicbutton_info[i].text_right);
}
}
/* determine horizontal offset for leading text */
if (checkbutton_info[i].text_left != NULL)
- x += (getFontWidth(FONT_TEXT_1) * strlen(checkbutton_info[i].text_left) +
- ED_GADGET_TEXT_DISTANCE);
+ x += getTextWidthForGadget(checkbutton_info[i].text_left);
gi = CreateGadget(GDI_CUSTOM_ID, id,
GDI_CUSTOM_TYPE_ID, i,
/* determine horizontal offset for leading text */
if (radiobutton_info[i].text_left != NULL)
- x += (getFontWidth(FONT_TEXT_1) * strlen(radiobutton_info[i].text_left) +
- ED_GADGET_TEXT_DISTANCE);
+ x += getTextWidthForGadget(radiobutton_info[i].text_left);
gi = CreateGadget(GDI_CUSTOM_ID, id,
GDI_CUSTOM_TYPE_ID, i,
CreateCounterButtons();
CreateRadiobuttonGadgets();
CreateTextInputGadgets();
- CreateTextbuttonGadgets();
+ CreateTextAreaGadgets();
CreateSelectboxGadgets();
+ CreateGraphicbuttonGadgets();
+ CreateTextbuttonGadgets();
CreateDrawingAreas();
game_status = old_game_status;
int xoffset_right = getCounterGadgetWidth();
int yoffset_right = ED_BORDER_SIZE;
#else
- int xoffset_left = getFullTextWidth(counterbutton_info[id].text_left);
+ int xoffset_left = getTextWidthForGadget(counterbutton_info[id].text_left);
int xoffset_right = ED_GADGET_TEXT_DISTANCE;
int yoffset_above = MINI_TILEX + ED_GADGET_DISTANCE;
int yoffset = ED_BORDER_SIZE;
static void MapDrawingArea(int id)
{
- MapGadget(level_editor_gadget[drawingarea_info[id].gadget_id]);
+ struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[id].gadget_id];
+ int area_xsize = gi->drawing.area_xsize;
+ int area_ysize = gi->drawing.area_ysize;
+ int xoffset_left= getTextWidthForDrawingArea(drawingarea_info[id].text_left);
+ int xoffset_below= getTextWidth(drawingarea_info[id].text_below,FONT_TEXT_1);
+ int x_left = gi->x - xoffset_left;
+ int x_right = gi->x + gi->width + ED_DRAWINGAREA_TEXT_DISTANCE;
+ int x_below = gi->x + (gi->width - xoffset_below) / 2;
+ int y_side = gi->y + (gi->height - getFontHeight(FONT_TEXT_1)) / 2;
+ int y_below = gi->y + gi->height + ED_DRAWINGAREA_TEXT_DISTANCE;
+
+ if (drawingarea_info[id].text_left)
+ DrawText(x_left, y_side, drawingarea_info[id].text_left, FONT_TEXT_1);
+
+ if (drawingarea_info[id].text_right)
+ DrawText(x_right, y_side, drawingarea_info[id].text_right, FONT_TEXT_1);
+
+ if (drawingarea_info[id].text_below)
+ DrawText(x_below, y_below, drawingarea_info[id].text_below, FONT_TEXT_1);
+
+ if (id != ED_DRAWING_ID_DRAWING_LEVEL)
+ {
+ DrawElementBorder(gi->x, gi->y,
+ area_xsize * MINI_TILEX, area_ysize * MINI_TILEY, TRUE);
+
+ DrawDrawingArea(id);
+ }
+
+ MapGadget(gi);
}
static void MapTextInputGadget(int id)
{
- char infotext[MAX_OUTPUT_LINESIZE + 1];
- int max_infotext_len = getMaxInfoTextLength();
+ struct GadgetInfo *gi = level_editor_gadget[textinput_info[id].gadget_id];
int xoffset_above = 0;
int yoffset_above = -(MINI_TILEX + ED_GADGET_DISTANCE);
- int x = textinput_info[id].x + xoffset_above;
- int y = textinput_info[id].y + yoffset_above;
+ int x_above = textinput_info[id].x + xoffset_above;
+ int y_above = textinput_info[id].y + yoffset_above;
- if (textinput_info[id].infotext)
- {
- sprintf(infotext, "%s:", textinput_info[id].infotext);
- infotext[max_infotext_len] = '\0';
- DrawTextF(x, y, FONT_TEXT_1, infotext);
- }
+ if (textinput_info[id].text_above)
+ DrawTextF(x_above, y_above, FONT_TEXT_1, textinput_info[id].text_above);
+
+ ModifyGadget(gi, GDI_TEXT_VALUE, textinput_info[id].value, GDI_END);
+
+ MapGadget(gi);
+}
+
+static void MapTextAreaGadget(int id)
+{
+ struct GadgetInfo *gi = level_editor_gadget[textarea_info[id].gadget_id];
+ int xoffset_above = 0;
+ int yoffset_above = -(MINI_TILEX + ED_GADGET_DISTANCE);
+ int x_above = textarea_info[id].x + xoffset_above;
+ int y_above = textarea_info[id].y + yoffset_above;
- ModifyGadget(level_editor_gadget[textinput_info[id].gadget_id],
- GDI_TEXT_VALUE, textinput_info[id].value, GDI_END);
+ if (textarea_info[id].text_above)
+ DrawTextF(x_above, y_above, FONT_TEXT_1, textarea_info[id].text_above);
- MapGadget(level_editor_gadget[textinput_info[id].gadget_id]);
+ ModifyGadget(gi, GDI_TEXT_VALUE, textarea_info[id].value, GDI_END);
+
+ MapGadget(gi);
}
static void MapSelectboxGadget(int id)
{
struct GadgetInfo *gi = level_editor_gadget[selectbox_info[id].gadget_id];
-#if 0
- int xoffset_left = 0;
- int yoffset_left = ED_BORDER_SIZE;
- int xoffset_right = ED_GADGET_TEXT_DISTANCE;
- int yoffset_right = ED_BORDER_SIZE;
- int x = selectbox_info[id].x + xoffset_left;
- int y = selectbox_info[id].y + yoffset_left;
-#else
- int xoffset_left = getFullTextWidth(selectbox_info[id].text_left);
+ int xoffset_left = getTextWidthForGadget(selectbox_info[id].text_left);
int xoffset_right = ED_GADGET_TEXT_DISTANCE;
int yoffset = ED_BORDER_SIZE;
int x_left = gi->x - xoffset_left;
int x_right = gi->x + gi->width + xoffset_right;
int y = gi->y + yoffset;
-#endif
if (selectbox_info[id].text_left)
DrawText(x_left, y, selectbox_info[id].text_left, FONT_TEXT_1);
ModifyEditorSelectbox(id, *selectbox_info[id].value);
- MapGadget(level_editor_gadget[selectbox_info[id].gadget_id]);
+ MapGadget(gi);
}
static void MapTextbuttonGadget(int id)
{
- MapGadget(level_editor_gadget[textbutton_info[id].gadget_id]);
+ struct GadgetInfo *gi = level_editor_gadget[textbutton_info[id].gadget_id];
+ int xoffset_left = getTextWidthForGadget(textbutton_info[id].text_left);
+ int xoffset_right = ED_GADGET_TEXT_DISTANCE;
+ int yoffset = ED_BORDER_SIZE;
+ int x_left = gi->x - xoffset_left;
+ int x_right = gi->x + gi->width + xoffset_right;
+ int y = gi->y + yoffset;
+
+ /* only show button to delete change pages when more than minimum pages */
+ if (id == ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE &&
+ custom_element.num_change_pages == MIN_CHANGE_PAGES)
+ return;
+
+ if (textbutton_info[id].text_left)
+ DrawText(x_left, y, textbutton_info[id].text_left, FONT_TEXT_1);
+
+ if (textbutton_info[id].text_right)
+ DrawText(x_right, y, textbutton_info[id].text_right, FONT_TEXT_1);
+
+ MapGadget(gi);
+}
+
+static void MapGraphicbuttonGadget(int id)
+{
+ struct GadgetInfo *gi= level_editor_gadget[graphicbutton_info[id].gadget_id];
+ int xoffset_left = getTextWidthForGadget(graphicbutton_info[id].text_left);
+ int xoffset_right = ED_GADGET_TEXT_DISTANCE;
+ int yoffset = ED_BORDER_SIZE;
+ int x_left = gi->x - xoffset_left;
+ int x_right = gi->x + gi->width + xoffset_right;
+ int y = gi->y + yoffset;
+
+ if (graphicbutton_info[id].text_left)
+ DrawText(x_left, y, graphicbutton_info[id].text_left, FONT_TEXT_1);
+
+ if (graphicbutton_info[id].text_right)
+ DrawText(x_right, y, graphicbutton_info[id].text_right, FONT_TEXT_1);
+
+ MapGadget(gi);
}
static void MapRadiobuttonGadget(int id)
{
struct GadgetInfo *gi = level_editor_gadget[radiobutton_info[id].gadget_id];
-#if 0
- int xoffset_right = ED_XOFFSET_CHECKBOX;
- int yoffset_right = ED_BORDER_SIZE;
- int x = radiobutton_info[id].x + xoffset_right;
- int y = radiobutton_info[id].y + yoffset_right;
-#else
- int xoffset_left = getFullTextWidth(checkbutton_info[id].text_left);
+ int xoffset_left = getTextWidthForGadget(checkbutton_info[id].text_left);
int xoffset_right = ED_GADGET_TEXT_DISTANCE;
int yoffset = ED_BORDER_SIZE;
int x_left = gi->x - xoffset_left;
int x_right = gi->x + gi->width + xoffset_right;
int y = gi->y + yoffset;
-#endif
boolean checked =
(*radiobutton_info[id].value == radiobutton_info[id].checked_value);
if (radiobutton_info[id].text_right)
DrawText(x_right, y, radiobutton_info[id].text_right, FONT_TEXT_1);
- ModifyGadget(level_editor_gadget[radiobutton_info[id].gadget_id],
- GDI_CHECKED, checked, GDI_END);
+ ModifyGadget(gi, GDI_CHECKED, checked, GDI_END);
- MapGadget(level_editor_gadget[radiobutton_info[id].gadget_id]);
+ MapGadget(gi);
}
static void MapCheckbuttonGadget(int id)
{
struct GadgetInfo *gi = level_editor_gadget[checkbutton_info[id].gadget_id];
-#if 0
- int xoffset_right = ED_XOFFSET_CHECKBOX;
- int yoffset_right = ED_BORDER_SIZE;
- int x = checkbutton_info[id].x + xoffset_right;
- int y = checkbutton_info[id].y + yoffset_right;
-#else
- int xoffset_left = getFullTextWidth(checkbutton_info[id].text_left);
+ int xoffset_left = getTextWidthForGadget(checkbutton_info[id].text_left);
int xoffset_right = ED_GADGET_TEXT_DISTANCE;
int yoffset = ED_BORDER_SIZE;
int x_left = gi->x - xoffset_left;
int x_right = gi->x + gi->width + xoffset_right;
int y = gi->y + yoffset;
-#endif
/* special case needed for "sticky" gadget */
- ModifyGadget(level_editor_gadget[checkbutton_info[id].gadget_id],
- GDI_CHECKED, *checkbutton_info[id].value,
+ ModifyGadget(gi, GDI_CHECKED, *checkbutton_info[id].value,
GDI_Y, SY + checkbutton_info[id].y, GDI_END);
y = gi->y + yoffset;
if (checkbutton_info[id].text_right)
DrawText(x_right, y, checkbutton_info[id].text_right, FONT_TEXT_1);
- MapGadget(level_editor_gadget[checkbutton_info[id].gadget_id]);
+ MapGadget(gi);
}
static void MapMainDrawingArea()
dst[x][y] = src[x][y];
}
+static int setSelectboxValue(int selectbox_id, int new_value)
+{
+ int new_index_value = 0;
+ int i;
+
+ for(i=0; selectbox_info[selectbox_id].options[i].text != NULL; i++)
+ if (selectbox_info[selectbox_id].options[i].value == new_value)
+ new_index_value = i;
+
+ *selectbox_info[selectbox_id].value =
+ selectbox_info[selectbox_id].options[new_index_value].value;
+
+ return new_index_value;
+}
+
static void CopyCustomElementPropertiesToEditor(int element)
{
int i;
+ int current_change_page = element_info[element].current_change_page;
+
+ /* dynamically (re)build selectbox for selecting change page */
+ for (i=0; i < element_info[element].num_change_pages; i++)
+ {
+ sprintf(options_change_page_strings[i], "%d", i + 1);
+
+ options_change_page[i].value = i;
+ options_change_page[i].text = options_change_page_strings[i];
+ }
+
+ options_change_page[i].value = -1;
+ options_change_page[i].text = NULL;
/* needed here to initialize combined element properties */
InitElementPropertiesEngine(level.game_version);
+ element_info[element].change =
+ &element_info[element].change_page[current_change_page];
+
custom_element = element_info[element];
+ custom_element_change = *element_info[element].change;
+
+ /* needed to initially set selectbox value variables to reliable defaults */
+ for (i=0; i < ED_NUM_SELECTBOX; i++)
+ setSelectboxValue(i, *selectbox_info[i].value);
for (i=0; i < NUM_ELEMENT_PROPERTIES; i++)
custom_element_properties[i] = HAS_PROPERTY(element, i);
/* set walk-to-object action selectbox help value */
custom_element.walk_to_action =
(IS_DIGGABLE(element) ? EP_DIGGABLE :
- IS_COLLECTIBLE(element) ? EP_COLLECTIBLE :
+ IS_COLLECTIBLE_ONLY(element) ? EP_COLLECTIBLE_ONLY :
+ IS_DROPPABLE(element) ? EP_DROPPABLE :
IS_PUSHABLE(element) ? EP_PUSHABLE :
custom_element.walk_to_action);
custom_element_properties[EP_WALK_TO_OBJECT] =
(IS_DIGGABLE(element) ||
- IS_COLLECTIBLE(element) ||
+ IS_COLLECTIBLE_ONLY(element) ||
+ IS_DROPPABLE(element) ||
IS_PUSHABLE(element));
/* set smash targets selectbox help value */
/* set consistency selectbox help value */
custom_element.consistency =
(IS_INDESTRUCTIBLE(element) ? EP_INDESTRUCTIBLE :
- CAN_EXPLODE(element) ? EP_CAN_EXPLODE :
+ CAN_EXPLODE_1X1(element) ? EP_CAN_EXPLODE_1X1 :
+ CAN_EXPLODE_3X3(element) ? EP_CAN_EXPLODE_3X3 :
custom_element.consistency);
custom_element_properties[EP_EXPLODE_RESULT] =
(IS_INDESTRUCTIBLE(element) ||
- CAN_EXPLODE(element));
+ CAN_EXPLODE_1X1(element) ||
+ CAN_EXPLODE_3X3(element));
/* special case: sub-settings dependent from main setting */
if (CAN_EXPLODE_BY_FIRE(element))
/* ---------- element settings: advanced (custom elements) --------------- */
/* set change by player selectbox help value */
- custom_element.change_player_action =
- (HAS_CHANGE_EVENT(element, CE_PUSHED_BY_PLAYER) ? CE_PUSHED_BY_PLAYER :
+ custom_element_change.player_action =
+ (HAS_CHANGE_EVENT(element, CE_DROPPED_BY_PLAYER) ? CE_DROPPED_BY_PLAYER :
+ HAS_CHANGE_EVENT(element, CE_PUSHED_BY_PLAYER) ? CE_PUSHED_BY_PLAYER :
HAS_CHANGE_EVENT(element, CE_PRESSED_BY_PLAYER) ? CE_PRESSED_BY_PLAYER :
HAS_CHANGE_EVENT(element, CE_TOUCHED_BY_PLAYER) ? CE_TOUCHED_BY_PLAYER :
- custom_element.change_player_action);
+ custom_element_change.player_action);
/* set change by collision selectbox help value */
- custom_element.change_collide_action =
+ custom_element_change.collide_action =
(HAS_CHANGE_EVENT(element, CE_SMASHED) ? CE_SMASHED :
HAS_CHANGE_EVENT(element, CE_IMPACT) ? CE_IMPACT :
HAS_CHANGE_EVENT(element, CE_COLLISION) ? CE_COLLISION :
- custom_element.change_collide_action);
+ custom_element_change.collide_action);
/* set change by other element action selectbox help value */
- custom_element.change_other_action =
- (HAS_CHANGE_EVENT(element, CE_OTHER_GETS_COLLECTED) ? CE_OTHER_GETS_COLLECTED :
+ custom_element_change.other_action =
+ (HAS_CHANGE_EVENT(element, CE_OTHER_GETS_DROPPED) ? CE_OTHER_GETS_DROPPED :
+ HAS_CHANGE_EVENT(element, CE_OTHER_GETS_COLLECTED) ? CE_OTHER_GETS_COLLECTED :
HAS_CHANGE_EVENT(element, CE_OTHER_GETS_PUSHED) ? CE_OTHER_GETS_PUSHED :
HAS_CHANGE_EVENT(element, CE_OTHER_GETS_PRESSED) ? CE_OTHER_GETS_PRESSED :
HAS_CHANGE_EVENT(element, CE_OTHER_GETS_TOUCHED) ? CE_OTHER_GETS_TOUCHED :
HAS_CHANGE_EVENT(element, CE_OTHER_IS_EXPLODING) ? CE_OTHER_IS_EXPLODING :
HAS_CHANGE_EVENT(element, CE_OTHER_IS_CHANGING) ? CE_OTHER_IS_CHANGING :
HAS_CHANGE_EVENT(element, CE_OTHER_IS_TOUCHING) ? CE_OTHER_IS_TOUCHING :
- custom_element.change_other_action);
+ custom_element_change.other_action);
}
static void CopyCustomElementPropertiesToGame(int element)
int i;
int access_type_and_layer;
+ /* mark that this custom element has been modified */
+ custom_element.modified_settings = TRUE;
+
if (level.use_custom_template)
{
if (Request("Copy and modify level tem- plate ?", REQ_ASK))
}
else
{
- LoadLevelTemplate(-1);
+ LoadLevelTemplate(-1); /* this resets all element modifications ... */
- DrawEditModeWindow();
+ DrawEditModeWindow(); /* ... and copies them to 'custom_element' */
}
}
element_info[element] = custom_element;
+ *element_info[element].change = custom_element_change;
/* ---------- element settings: configure (custom elements) ------------- */
/* set walk-to-object property from checkbox and selectbox */
custom_element_properties[EP_DIGGABLE] = FALSE;
- custom_element_properties[EP_COLLECTIBLE] = FALSE;
+ custom_element_properties[EP_COLLECTIBLE_ONLY] = FALSE;
+ custom_element_properties[EP_DROPPABLE] = FALSE;
custom_element_properties[EP_PUSHABLE] = FALSE;
custom_element_properties[custom_element.walk_to_action] =
custom_element_properties[EP_WALK_TO_OBJECT];
/* set consistency property from checkbox and selectbox */
custom_element_properties[EP_INDESTRUCTIBLE] = FALSE;
- custom_element_properties[EP_CAN_EXPLODE] = FALSE;
+ custom_element_properties[EP_CAN_EXPLODE_1X1] = FALSE;
+ custom_element_properties[EP_CAN_EXPLODE_3X3] = FALSE;
custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] = FALSE;
custom_element_properties[EP_CAN_EXPLODE_SMASHED] = FALSE;
custom_element_properties[EP_CAN_EXPLODE_IMPACT] = FALSE;
custom_element_properties[EP_EXPLODE_RESULT];
/* special case: sub-settings dependent from main setting */
- if (custom_element_properties[EP_CAN_EXPLODE])
+ if (custom_element_properties[EP_CAN_EXPLODE_3X3] ||
+ custom_element_properties[EP_CAN_EXPLODE_1X1])
{
custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] =
custom_element.can_explode_by_fire;
custom_element_change_events[CE_TOUCHED_BY_PLAYER] = FALSE;
custom_element_change_events[CE_PRESSED_BY_PLAYER] = FALSE;
custom_element_change_events[CE_PUSHED_BY_PLAYER] = FALSE;
- custom_element_change_events[custom_element.change_player_action] =
+ custom_element_change_events[CE_DROPPED_BY_PLAYER] = FALSE;
+ custom_element_change_events[custom_element_change.player_action] =
custom_element_change_events[CE_BY_PLAYER];
/* set collision change event from checkbox and selectbox */
custom_element_change_events[CE_COLLISION] = FALSE;
custom_element_change_events[CE_IMPACT] = FALSE;
custom_element_change_events[CE_SMASHED] = FALSE;
- custom_element_change_events[custom_element.change_collide_action] =
+ custom_element_change_events[custom_element_change.collide_action] =
custom_element_change_events[CE_BY_COLLISION];
/* set other element action change event from checkbox and selectbox */
custom_element_change_events[CE_OTHER_GETS_PRESSED] = FALSE;
custom_element_change_events[CE_OTHER_GETS_PUSHED] = FALSE;
custom_element_change_events[CE_OTHER_GETS_COLLECTED] = FALSE;
- custom_element_change_events[custom_element.change_other_action] =
+ custom_element_change_events[CE_OTHER_GETS_DROPPED] = FALSE;
+ custom_element_change_events[custom_element_change.other_action] =
custom_element_change_events[CE_BY_OTHER];
for (i=0; i < NUM_ELEMENT_PROPERTIES; i++)
/* copy change events also to special level editor variable */
custom_element = element_info[element];
+ custom_element_change = *element_info[element].change;
}
void DrawLevelEd()
ModifyGadget(gi, GDI_NUMBER_VALUE, new_value, GDI_END);
if (counter_value != NULL)
- *counter_value = gi->text.number_value;
+ *counter_value = gi->textinput.number_value;
}
static void ModifyEditorCounterLimits(int counter_id, int min, int max)
{
int gadget_id = selectbox_info[selectbox_id].gadget_id;
struct GadgetInfo *gi = level_editor_gadget[gadget_id];
- int new_index_value = 0;
- int i;
-
- for(i=0; selectbox_info[selectbox_id].options[i].text != NULL; i++)
- if (selectbox_info[selectbox_id].options[i].value == new_value)
- new_index_value = i;
-
- *selectbox_info[selectbox_id].value =
- selectbox_info[selectbox_id].options[new_index_value].value;
+ int new_index_value = setSelectboxValue(selectbox_id, new_value);
ModifyGadget(gi, GDI_SELECTBOX_INDEX, new_index_value, GDI_END);
}
MapMainDrawingArea();
}
-static void DrawElementBorder(int dest_x, int dest_y, int width, int height,
- boolean input)
-{
- int border_graphic =
- (input ? IMG_EDITOR_ELEMENT_BORDER_INPUT : IMG_EDITOR_ELEMENT_BORDER);
- Bitmap *src_bitmap;
- int src_x, src_y;
- int num_mini_tilex = width / MINI_TILEX + 1;
- int num_mini_tiley = width / 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);
-
- ClearRectangle(drawto, dest_x - 1, dest_y - 1, width + 2, height + 2);
-}
-
-static void DrawRandomPlacementBackgroundArea()
-{
- struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_RANDOM_BACKGROUND];
-#if 0
- int area_x = ED_AREA_RANDOM_BACKGROUND_XPOS / MINI_TILEX;
- int area_y = ED_AREA_RANDOM_BACKGROUND_YPOS / MINI_TILEY;
- int area_sx = SX + ED_AREA_RANDOM_BACKGROUND_XPOS;
- int area_sy = SY + ED_AREA_RANDOM_BACKGROUND_YPOS;
-#endif
-
- DrawElementBorder(gi->x, gi->y, MINI_TILEX, MINI_TILEY, TRUE);
- DrawMiniElement(gi->x, gi->y, random_placement_background_element);
-
- MapDrawingArea(ED_DRAWING_ID_RANDOM_BACKGROUND);
-}
-
static void DrawLevelInfoWindow()
{
int i;
MapTextInputGadget(i);
/* draw drawing area */
- DrawRandomPlacementBackgroundArea();
-}
-
-static void DrawAmoebaContentArea()
-{
- int area_x = ED_AREA_ELEM_CONTENT_XPOS / MINI_TILEX;
- int area_y = ED_AREA_ELEM_CONTENT_YPOS / MINI_TILEY;
- int area_sx = SX + ED_AREA_ELEM_CONTENT_XPOS;
- int area_sy = SY + ED_AREA_ELEM_CONTENT_YPOS;
-
- DrawElementBorder(area_sx, area_sy, MINI_TILEX, MINI_TILEY, TRUE);
- DrawMiniElement(area_x, area_y, level.amoeba_content);
-
- DrawText(area_sx + TILEX, area_sy + 1, "Content of amoeba", FONT_TEXT_1);
-
- MapDrawingArea(ED_DRAWING_ID_AMOEBA_CONTENT);
-}
-
-static void DrawCustomGraphicElementArea()
-{
- struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_CUSTOM_GRAPHIC];
-#if 0
- int xpos = ED_AREA_ELEM_CONTENT3_XPOS;
- int ypos = ED_AREA_ELEM_CONTENT3_YPOS;
- int area_sx = SX + xpos;
- int area_sy = SY + ypos;
-#endif
-
- if (!IS_CUSTOM_ELEMENT(properties_element))
- {
- /* this should never happen */
- Error(ERR_WARN, "element %d is no custom element", properties_element);
-
- return;
- }
-
- DrawElementBorder(gi->x, gi->y, MINI_TILEX, MINI_TILEY, TRUE);
- DrawMiniGraphicExt(drawto, gi->x, gi->y,
- el2edimg(custom_element.gfx_element));
-
- MapDrawingArea(ED_DRAWING_ID_CUSTOM_GRAPHIC);
+ MapDrawingArea(ED_DRAWING_ID_RANDOM_BACKGROUND);
}
static void DrawCustomContentArea()
{
- struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_CUSTOM_CONTENT];
-#if 0
- int area_sx = SX + ED_AREA_ELEM_CONTENT4_XPOS;
- int area_sy = SY + ED_AREA_ELEM_CONTENT4_YPOS;
-#endif
+ int id = ED_DRAWING_ID_CUSTOM_CONTENT;
+ struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[id].gadget_id];
int x1 = right_gadget_border[GADGET_ID_CUSTOM_DEADLINESS];
int x2 = right_gadget_border[GADGET_ID_CUSTOM_CONSISTENCY];
int x3 = right_gadget_border[GADGET_ID_CUSTOM_EXPLODE_IMPACT];
- int xoffset = ED_GADGET_TEXT_DISTANCE + MINI_TILEX / 2;
- int x, y;
+ int xoffset = ED_DRAWINGAREA_TEXT_DISTANCE;
- if (!IS_CUSTOM_ELEMENT(properties_element))
- {
- /* this should never happen */
- Error(ERR_WARN, "element %d is no custom element", properties_element);
-
- return;
- }
+ /* add distance for potential left text (without drawing area border) */
+ x2 += getTextWidthForGadget(drawingarea_info[id].text_left);
ModifyGadget(gi, GDI_X, MAX(x1, MAX(x2, x3)) + xoffset, GDI_END);
- DrawElementBorder(gi->x, gi->y, 3 * MINI_TILEX, 3 * MINI_TILEY, TRUE);
-
- 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[x][y]));
-
MapDrawingArea(ED_DRAWING_ID_CUSTOM_CONTENT);
}
-static void DrawCustomChangeTargetArea()
-{
- int id = ED_DRAWING_ID_CUSTOM_CHANGE_TARGET;
- int gadget_id = drawingarea_info[id].gadget_id;
- struct GadgetInfo *gi = level_editor_gadget[gadget_id];
-#if 0
- int xpos = ED_AREA_ELEM_CONTENT2_XPOS;
- int ypos = ED_AREA_ELEM_CONTENT2_YPOS;
- int area_sx = SX + xpos;
- int area_sy = SY + ypos;
-#endif
- int xoffset_left = 0;
- int yoffset_left = ED_BORDER_AREA_YSIZE;
- int xoffset_right = ED_GADGET_TEXT_DISTANCE + MINI_TILEX / 2;
- int yoffset_right = ED_BORDER_AREA_YSIZE;
- int x = drawingarea_info[id].x + xoffset_left;
- int y = drawingarea_info[id].y + yoffset_left;
-
- if (!IS_CUSTOM_ELEMENT(properties_element))
- {
- /* this should never happen */
- Error(ERR_WARN, "element %d is no custom element", properties_element);
-
- return;
- }
-
- DrawElementBorder(gi->x, gi->y, MINI_TILEX, MINI_TILEY, TRUE);
- DrawMiniGraphicExt(drawto, gi->x, gi->y,
- el2edimg(custom_element.change.target_element));
-
- MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TARGET);
-
- if (drawingarea_info[id].text_left)
- DrawTextF(x, y, FONT_TEXT_1, drawingarea_info[id].text_left);
-
- if (drawingarea_info[id].text_right)
- {
- x = gi->x + gi->width + xoffset_right;
- y = SY + drawingarea_info[id].y + yoffset_right;
-
- DrawText(x, y, drawingarea_info[id].text_right, FONT_TEXT_1);
- }
-}
-
static void DrawCustomChangeContentArea()
{
- struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_CUSTOM_CHANGE_CONTENT];
-#if 0
- int area_sx = SX + ED_AREA_ELEM_CONTENT6_XPOS;
- int area_sy = SY + ED_AREA_ELEM_CONTENT6_YPOS;
-#endif
+ int id = ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT;
+ struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[id].gadget_id];
int x1 = right_gadget_border[GADGET_ID_CHANGE_USE_CONTENT];
int x2 = right_gadget_border[GADGET_ID_CHANGE_POWER];
int x3 = right_gadget_border[GADGET_ID_CHANGE_ONLY_COMPLETE];
- int xoffset = ED_GADGET_TEXT_DISTANCE + MINI_TILEX / 2;
- int x, y;
-
- if (!IS_CUSTOM_ELEMENT(properties_element))
- {
- /* this should never happen */
- Error(ERR_WARN, "element %d is no custom element", properties_element);
-
- return;
- }
+ int xoffset = ED_DRAWINGAREA_TEXT_DISTANCE;
ModifyGadget(gi, GDI_X, MAX(x1, MAX(x2, x3)) + xoffset, GDI_END);
- DrawElementBorder(gi->x, gi->y, 3 * MINI_TILEX, 3 * MINI_TILEY, TRUE);
-
- 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.content[x][y]));
-
- MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT);
-}
-
-static void DrawCustomChangeTriggerArea()
-{
- struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_CUSTOM_CHANGE_TRIGGER];
-#if 0
- int xpos = ED_AREA_ELEM_CONTENT5_XPOS;
- int ypos = ED_AREA_ELEM_CONTENT5_YPOS;
- int area_sx = SX + xpos;
- int area_sy = SY + ypos;
-#endif
-
- if (!IS_CUSTOM_ELEMENT(properties_element))
- {
- /* this should never happen */
- Error(ERR_WARN, "element %d is no custom element", properties_element);
-
- return;
- }
-
- DrawElementBorder(gi->x, gi->y, MINI_TILEX, MINI_TILEY, TRUE);
- DrawMiniGraphicExt(drawto, gi->x, gi->y,
- el2edimg(custom_element.change.trigger_element));
-
- MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER);
+ MapDrawingArea(id);
}
static void DrawElementContentAreas()
{
- int area_x = ED_AREA_ELEM_CONTENT_XPOS / MINI_TILEX;
- int area_y = ED_AREA_ELEM_CONTENT_YPOS / MINI_TILEY;
- int area_sx = SX + ED_AREA_ELEM_CONTENT_XPOS;
- int area_sy = SY + ED_AREA_ELEM_CONTENT_YPOS;
- int i, x, y;
-
- for (i=0; i<MAX_ELEMENT_CONTENTS; i++)
- UnmapDrawingArea(GADGET_ID_ELEMENT_CONTENT_0 + i);
+ int x = SX + ED_AREA_YAMYAM_CONTENT_XPOS(3) + 4 * MINI_TILEX;
+ int y = SY + ED_AREA_YAMYAM_CONTENT_YPOS(0) + ED_BORDER_AREA_YSIZE;
+ int i;
/* display counter to choose number of element content areas */
MapCounterButtons(ED_COUNTER_ID_ELEMENT_CONTENT);
- /* delete content areas in case of reducing number of them */
- DrawBackground(SX, area_sy - MINI_TILEX, SXSIZE, 12 * MINI_TILEY);
+ for (i=0; i < MAX_ELEMENT_CONTENTS; i++)
+ {
+ int id = ED_DRAWING_ID_ELEMENT_CONTENT_0 + i;
+ int font_height = getFontHeight(FONT_TEXT_1);
- for (i=0; i<level.num_yamyam_contents; i++)
- DrawElementBorder(area_sx + 5 * (i % 4) * MINI_TILEX,
- area_sy + 6 * (i / 4) * MINI_TILEY,
- 3 * MINI_TILEX, 3 * MINI_TILEY, TRUE);
+ if (i < level.num_yamyam_contents)
+ MapDrawingArea(id);
+ else
+ {
+ UnmapDrawingArea(id);
- DrawText(area_sx + (5 * 4 - 1) * MINI_TILEX, area_sy + 0 * MINI_TILEY + 1,
- "Content", FONT_TEXT_1);
- DrawText(area_sx + (5 * 4 - 1) * MINI_TILEX, area_sy + 1 * MINI_TILEY + 1,
- "when", FONT_TEXT_1);
- DrawText(area_sx + (5 * 4 - 1) * MINI_TILEX, area_sy + 2 * MINI_TILEY + 1,
- "smashed", FONT_TEXT_1);
+ /* 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_TILEX + ED_GADGET_TEXT_DISTANCE + font_height);
+ }
+ }
- for (i=0; i<level.num_yamyam_contents; i++)
- {
- for (y=0; y<3; y++)
- for (x=0; x<3; x++)
- DrawMiniElement(area_x + 5 * (i % 4) + x, area_y + 6 * (i / 4) + y,
- level.yamyam_content[i][x][y]);
+ DrawText(x, y + 0 * MINI_TILEY, "content", FONT_TEXT_1);
+ DrawText(x, y + 1 * MINI_TILEY, "when", FONT_TEXT_1);
+ DrawText(x, y + 2 * MINI_TILEY, "smashed", FONT_TEXT_1);
+}
- DrawTextF(area_sx - SX + 5 * (i % 4) * MINI_TILEX + MINI_TILEX + 1,
- area_sy - SY + 6 * (i / 4) * MINI_TILEY + 4 * MINI_TILEY - 4,
- FONT_TEXT_1, "%d", i + 1);
- }
+static void DrawEnvelopeTextArea()
+{
+ int id = ED_TEXTAREA_ID_ENVELOPE_INFO;
+ struct GadgetInfo *gi = level_editor_gadget[textarea_info[id].gadget_id];
- for (i=0; i<level.num_yamyam_contents; i++)
- MapDrawingArea(ED_DRAWING_ID_ELEMENT_CONTENT_0 + i);
+ UnmapGadget(gi);
+ DrawBackground(gi->x, gi->y, gi->width, gi->height);
+
+ ModifyGadget(gi, GDI_AREA_SIZE, level.envelope_xsize, level.envelope_ysize,
+ GDI_END);
+ MapTextAreaGadget(ED_TEXTAREA_ID_ENVELOPE_INFO);
}
char *getElementDescriptionFilename(int element)
properties[] =
{
/* configurable properties */
- { EP_INDESTRUCTIBLE, "- undestructible" },
- { EP_SLIPPERY, "- slippery for falling objects" },
- { EP_EM_SLIPPERY_WALL, "- slippery for some gems (EM style)" },
- { EP_DIGGABLE, "- diggable" },
- { EP_COLLECTIBLE, "- collectible" },
- { EP_PUSHABLE, "- pushable" },
+ { EP_WALKABLE_OVER, "- player can walk over it" },
+ { EP_WALKABLE_INSIDE, "- player can walk inside it" },
+ { EP_WALKABLE_UNDER, "- player can walk under it" },
+ { EP_PASSABLE_OVER, "- player can pass over it" },
+ { EP_PASSABLE_INSIDE, "- player can pass through it" },
+ { EP_PASSABLE_UNDER, "- player can pass under it" },
+
+ { EP_DIGGABLE, "- can be digged away" },
+ { EP_COLLECTIBLE, "- can be collected" },
+ { EP_DROPPABLE, "- can be dropped after collecting" },
+ { EP_PUSHABLE, "- can be pushed" },
{ EP_CAN_MOVE, "- can move" },
{ EP_CAN_FALL, "- can fall" },
-#if 0
- { EP_CAN_SMASH, "- can smash" },
-#endif
+
{ EP_CAN_SMASH_PLAYER, "- can smash player" },
+#if 0
{ EP_CAN_SMASH_ENEMIES, "- can smash good and bad guys" },
+#endif
{ EP_CAN_SMASH_EVERYTHING, "- can smash everything smashable" },
- { EP_CAN_EXPLODE, "- can explode" },
- { EP_CAN_EXPLODE_BY_FIRE, " - by fire or explosions" },
- { EP_CAN_EXPLODE_SMASHED, " - when smashed" },
- { EP_CAN_EXPLODE_IMPACT, " - on impact" },
+
+ { EP_SLIPPERY, "- slippery for falling objects" },
+ { EP_EM_SLIPPERY_WALL, "- slippery for some gems (EM style)" },
{ EP_DONT_RUN_INTO, "- deadly when running into" },
{ EP_DONT_COLLIDE_WITH, "- deadly when colliding with" },
{ EP_DONT_TOUCH, "- deadly when touching" },
- { EP_WALKABLE_OVER, "- player can walk over it" },
- { EP_WALKABLE_INSIDE, "- player can walk inside it" },
- { EP_WALKABLE_UNDER, "- player can walk under it" },
- { EP_PASSABLE_OVER, "- player can pass over it" },
- { EP_PASSABLE_INSIDE, "- player can pass through it" },
- { EP_PASSABLE_UNDER, "- player can pass under it" },
+ { EP_INDESTRUCTIBLE, "- undestructible" },
+
+ { EP_CAN_EXPLODE_BY_FIRE, "- can explode by fire or explosions" },
+ { EP_CAN_EXPLODE_SMASHED, "- can explode when smashed" },
+ { EP_CAN_EXPLODE_IMPACT, "- can explode on impact" },
+
+ { EP_CAN_CHANGE, "- can change to other element" },
/* pre-defined properties */
{ EP_CAN_PASS_MAGIC_WALL, "- can pass magic walls" },
if (IS_GEM(properties_element) ||
IS_CUSTOM_ELEMENT(properties_element) ||
- HAS_CONTENT(properties_element))
+ HAS_CONTENT(properties_element) ||
+ properties_element == EL_ENVELOPE)
return TRUE;
else
for (i=0; elements_with_counter[i].element != -1; i++)
MapCheckbuttonGadget(i);
if (IS_AMOEBOID(properties_element))
- DrawAmoebaContentArea();
+ MapDrawingArea(ED_DRAWING_ID_AMOEBA_CONTENT);
else
DrawElementContentAreas();
}
if (IS_GEM(properties_element))
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS);
+ if (properties_element == EL_ENVELOPE)
+ {
+ /* display counter to choose size of envelope text area */
+ MapCounterButtons(ED_COUNTER_ID_ENVELOPE_XSIZE);
+ MapCounterButtons(ED_COUNTER_ID_ENVELOPE_YSIZE);
+
+ DrawEnvelopeTextArea();
+ }
+
if (IS_CUSTOM_ELEMENT(properties_element))
{
/* draw stickybutton gadget */
static void DrawPropertiesAdvancedDrawingAreas()
{
- DrawCustomGraphicElementArea();
- DrawCustomChangeTargetArea();
- DrawCustomChangeTriggerArea();
+ MapDrawingArea(ED_DRAWING_ID_CUSTOM_GRAPHIC);
+ MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TARGET);
+ MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER);
+
DrawCustomChangeContentArea();
redraw_mask |= REDRAW_FIELD;
MapSelectboxGadget(i);
/* draw textbutton gadgets */
- MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE);
+ for (i=ED_TEXTBUTTON_ID_CHANGE_FIRST; i<=ED_TEXTBUTTON_ID_CHANGE_LAST; i++)
+ MapTextbuttonGadget(i);
+
+ /* draw graphicbutton gadgets */
+ for (i = ED_GRAPHICBUTTON_ID_CHANGE_FIRST;
+ i <= ED_GRAPHICBUTTON_ID_CHANGE_LAST; i++)
+ MapGraphicbuttonGadget(i);
/* draw drawing area gadgets */
DrawPropertiesAdvancedDrawingAreas();
}
else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
{
- custom_element.change.target_element = new_element;
+ custom_element_change.target_element = new_element;
CopyCustomElementPropertiesToGame(properties_element);
}
else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
{
- custom_element.change.content[sx][sy] = new_element;
+ custom_element_change.content[sx][sy] = new_element;
CopyCustomElementPropertiesToGame(properties_element);
}
else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
{
- custom_element.change.trigger_element = new_element;
+ custom_element_change.trigger_element = new_element;
CopyCustomElementPropertiesToGame(properties_element);
}
else if (id == GADGET_ID_CUSTOM_CONTENT)
PickDrawingElement(button, custom_element.content[sx][sy]);
else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
- PickDrawingElement(button, custom_element.change.target_element);
+ PickDrawingElement(button, custom_element_change.target_element);
else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
- PickDrawingElement(button, custom_element.change.content[sx][sy]);
+ PickDrawingElement(button, custom_element_change.content[sx][sy]);
else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
- PickDrawingElement(button, custom_element.change.trigger_element);
+ PickDrawingElement(button, custom_element_change.trigger_element);
else if (id == GADGET_ID_RANDOM_BACKGROUND)
PickDrawingElement(button, random_placement_background_element);
else if (id >= GADGET_ID_ELEMENT_CONTENT_0 &&
}
if (gadget_id == counterbutton_info[counter_id].gadget_id_text)
- *counter_value = gi->text.number_value;
+ *counter_value = gi->textinput.number_value;
else
ModifyEditorCounter(counter_id, *counter_value + step);
DrawElementContentAreas();
break;
+ case ED_COUNTER_ID_ENVELOPE_XSIZE:
+ case ED_COUNTER_ID_ENVELOPE_YSIZE:
+ DrawEnvelopeTextArea();
+ break;
+
case ED_COUNTER_ID_LEVEL_XSIZE:
case ED_COUNTER_ID_LEVEL_YSIZE:
lev_fieldx = level.fieldx;
{
int type_id = gi->custom_type_id;
- strcpy(textinput_info[type_id].value, gi->text.value);
+ strcpy(textinput_info[type_id].value, gi->textinput.value);
if (type_id == ED_TEXTINPUT_ID_ELEMENT_NAME)
{
}
}
+static void HandleTextAreaGadgets(struct GadgetInfo *gi)
+{
+ int type_id = gi->custom_type_id;
+
+ strcpy(textarea_info[type_id].value, gi->textarea.value);
+}
+
static void HandleSelectboxGadgets(struct GadgetInfo *gi)
{
int type_id = gi->custom_type_id;
*selectbox_info[type_id].value =
selectbox_info[type_id].options[gi->selectbox.index].value;
- if ((type_id >= ED_SELECTBOX_ID_CUSTOM_FIRST &&
- type_id <= ED_SELECTBOX_ID_CUSTOM_LAST) ||
- (type_id >= ED_SELECTBOX_ID_CHANGE_FIRST &&
- type_id <= ED_SELECTBOX_ID_CHANGE_LAST))
+ if (type_id == ED_SELECTBOX_ID_SELECT_CHANGE_PAGE)
+ {
+ element_info[properties_element].current_change_page = gi->selectbox.index;
+
+ DrawPropertiesWindow();
+ }
+ else if ((type_id >= ED_SELECTBOX_ID_CUSTOM_FIRST &&
+ type_id <= ED_SELECTBOX_ID_CUSTOM_LAST) ||
+ (type_id >= ED_SELECTBOX_ID_CHANGE_FIRST &&
+ type_id <= ED_SELECTBOX_ID_CHANGE_LAST))
CopyCustomElementPropertiesToGame(properties_element);
}
static void HandleTextbuttonGadgets(struct GadgetInfo *gi)
{
int type_id = gi->custom_type_id;
+ int i;
- if (type_id >= ED_TEXTBUTTON_ID_PROPERTIES_INFO &&
- type_id <= ED_TEXTBUTTON_ID_PROPERTIES_ADVANCED)
+ if (type_id >= ED_TEXTBUTTON_ID_PROPERTIES_FIRST &&
+ type_id <= ED_TEXTBUTTON_ID_PROPERTIES_LAST)
{
edit_mode_properties = gi->custom_type_id;
if (new_template)
Request("Tem- plate saved !", REQ_CONFIRM);
}
+ else if (type_id == ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE &&
+ custom_element.num_change_pages < MAX_CHANGE_PAGES)
+ {
+ struct ElementInfo *ei = &element_info[properties_element];
+
+ setElementChangePages(ei, ei->num_change_pages + 1);
+
+ /* set new change page to be new current change page */
+ ei->current_change_page = ei->num_change_pages - 1;
+ ei->change = &ei->change_page[ei->current_change_page];
+
+ setElementChangeInfoToDefaults(ei->change);
+
+ DrawPropertiesWindow();
+ }
+ else if (type_id == ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE &&
+ custom_element.num_change_pages > MIN_CHANGE_PAGES)
+ {
+ struct ElementInfo *ei = &element_info[properties_element];
+
+ /* copy all change pages after change page to be deleted */
+ for (i = ei->current_change_page; i < ei->num_change_pages - 1; i++)
+ ei->change_page[i] = ei->change_page[i + 1];
+
+ setElementChangePages(ei, ei->num_change_pages - 1);
+
+ DrawPropertiesWindow();
+ }
+}
+
+static void HandleGraphicbuttonGadgets(struct GadgetInfo *gi)
+{
+ int type_id = gi->custom_type_id;
+
+ if (type_id == ED_GRAPHICBUTTON_ID_PREV_CHANGE_PAGE ||
+ type_id == ED_GRAPHICBUTTON_ID_NEXT_CHANGE_PAGE)
+ {
+ struct ElementInfo *ei = &element_info[properties_element];
+ int step = BUTTON_STEPSIZE(gi->event.button);
+
+ step *= (type_id == ED_GRAPHICBUTTON_ID_PREV_CHANGE_PAGE ? -1 : +1);
+ ei->current_change_page += step;
+
+ if (ei->current_change_page < 0)
+ ei->current_change_page = 0;
+ else if (ei->current_change_page >= ei->num_change_pages)
+ ei->current_change_page = ei->num_change_pages - 1;
+
+ DrawPropertiesWindow();
+ }
}
static void HandleRadiobuttons(struct GadgetInfo *gi)
getElementInfoText(custom_element.content[sx][sy]));
else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s",
- getElementInfoText(custom_element.change.target_element));
+ getElementInfoText(custom_element_change.target_element));
else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s",
- getElementInfoText(custom_element.change.content[sx][sy]));
+ getElementInfoText(custom_element_change.content[sx][sy]));
else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s",
- getElementInfoText(custom_element.change.trigger_element));
+ getElementInfoText(custom_element_change.trigger_element));
else if (id == GADGET_ID_RANDOM_BACKGROUND)
DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s",
getElementInfoText(random_placement_background_element));