+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
+ MIN_SCORE, MAX_SCORE,
+ GADGET_ID_ELEMENT_VALUE3_DOWN, GADGET_ID_ELEMENT_VALUE3_UP,
+ GADGET_ID_ELEMENT_VALUE3_TEXT, GADGET_ID_NONE,
+ NULL, /* will be set when used */
+ NULL, NULL, NULL
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3),
+ MIN_SCORE, MAX_SCORE,
+ GADGET_ID_ELEMENT_VALUE4_DOWN, GADGET_ID_ELEMENT_VALUE4_UP,
+ GADGET_ID_ELEMENT_VALUE4_TEXT, GADGET_ID_NONE,
+ NULL, /* will be set when used */
+ NULL, NULL, NULL
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3),
+ MIN_ELEMENT_CONTENTS, MAX_ELEMENT_CONTENTS,
+ GADGET_ID_YAMYAM_CONTENT_DOWN, GADGET_ID_YAMYAM_CONTENT_UP,
+ GADGET_ID_YAMYAM_CONTENT_TEXT, GADGET_ID_NONE,
+ &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,
+ GADGET_ID_ENVELOPE_XSIZE_DOWN, GADGET_ID_ENVELOPE_XSIZE_UP,
+ GADGET_ID_ENVELOPE_XSIZE_TEXT, GADGET_ID_NONE,
+ NULL, /* will be set when used */
+ NULL, NULL, "width",
+ },
+ {
+ -1, ED_ELEMENT_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,
+ NULL, /* will be set when used */
+ NULL, " ", "height",
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
+ MIN_INITIAL_INVENTORY_SIZE, MAX_INITIAL_INVENTORY_SIZE,
+ GADGET_ID_INVENTORY_SIZE_DOWN, GADGET_ID_INVENTORY_SIZE_UP,
+ GADGET_ID_INVENTORY_SIZE_TEXT, GADGET_ID_NONE,
+ &level.initial_inventory_size[0],
+ NULL, NULL, "number of inventory elements"
+ },
+
+ /* ---------- element settings: configure 1 (custom elements) ------------ */
+
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(5),
+ MIN_SCORE, MAX_SCORE,
+ GADGET_ID_CUSTOM_SCORE_DOWN, GADGET_ID_CUSTOM_SCORE_UP,
+ GADGET_ID_CUSTOM_SCORE_TEXT, GADGET_ID_NONE,
+ &custom_element.collect_score_initial,
+ NULL, "CE score", " "
+ },
+ {
+ -1, ED_ELEMENT_SETTINGS_YPOS(5),
+ 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.collect_count_initial,
+ NULL, "CE count", NULL
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10),
+ 0, 9999,
+ GADGET_ID_CUSTOM_VALUE_FIX_DOWN, GADGET_ID_CUSTOM_VALUE_FIX_UP,
+ GADGET_ID_CUSTOM_VALUE_FIX_TEXT, GADGET_ID_NONE,
+ &custom_element.ce_value_fixed_initial,
+ NULL, "CE value", NULL
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10),
+ 0, 9999,
+ GADGET_ID_CUSTOM_VALUE_RND_DOWN, GADGET_ID_CUSTOM_VALUE_RND_UP,
+ GADGET_ID_CUSTOM_VALUE_RND_TEXT, GADGET_ID_CUSTOM_VALUE_FIX_UP,
+ &custom_element.ce_value_random_initial,
+ NULL, "+random", NULL
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(6),
+ 0, 999,
+ GADGET_ID_PUSH_DELAY_FIX_DOWN, GADGET_ID_PUSH_DELAY_FIX_UP,
+ GADGET_ID_PUSH_DELAY_FIX_TEXT, GADGET_ID_NONE,
+ &custom_element.push_delay_fixed,
+ NULL, "push delay", NULL
+ },
+ {
+ -1, ED_ELEMENT_SETTINGS_YPOS(6),
+ 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,
+ &custom_element.push_delay_random,
+ NULL, "+random", NULL
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(7),
+ 0, 999,
+ GADGET_ID_DROP_DELAY_FIX_DOWN, GADGET_ID_DROP_DELAY_FIX_UP,
+ GADGET_ID_DROP_DELAY_FIX_TEXT, GADGET_ID_NONE,
+ &custom_element.drop_delay_fixed,
+ NULL, "drop delay", NULL
+ },
+ {
+ -1, ED_ELEMENT_SETTINGS_YPOS(7),
+ 0, 999,
+ GADGET_ID_DROP_DELAY_RND_DOWN, GADGET_ID_DROP_DELAY_RND_UP,
+ GADGET_ID_DROP_DELAY_RND_TEXT, GADGET_ID_DROP_DELAY_FIX_UP,
+ &custom_element.drop_delay_random,
+ NULL, "+random", NULL
+ },
+
+ /* ---------- element settings: configure 2 (custom elements) ------------ */
+
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(5),
+ 0, 999,
+ GADGET_ID_MOVE_DELAY_FIX_DOWN, GADGET_ID_MOVE_DELAY_FIX_UP,
+ GADGET_ID_MOVE_DELAY_FIX_TEXT, GADGET_ID_NONE,
+ &custom_element.move_delay_fixed,
+ NULL, "move delay", NULL
+ },
+ {
+ -1, ED_ELEMENT_SETTINGS_YPOS(5),
+ 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,
+ &custom_element.move_delay_random,
+ NULL, "+random", NULL
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(12),
+ 0, 999,
+ GADGET_ID_EXPLOSION_DELAY_DOWN, GADGET_ID_EXPLOSION_DELAY_UP,
+ GADGET_ID_EXPLOSION_DELAY_TEXT, GADGET_ID_NONE,
+ &custom_element.explosion_delay,
+ NULL, "explosion delay", NULL
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(13),
+ 0, 999,
+ GADGET_ID_IGNITION_DELAY_DOWN, GADGET_ID_IGNITION_DELAY_UP,
+ GADGET_ID_IGNITION_DELAY_TEXT, GADGET_ID_NONE,
+ &custom_element.ignition_delay,
+ NULL, "ignition delay", "(by fire)"
+ },
+
+ /* ---------- element settings: configure (group elements) --------------- */
+
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3),
+ MIN_ELEMENTS_IN_GROUP, MAX_ELEMENTS_IN_GROUP,
+ GADGET_ID_GROUP_CONTENT_DOWN, GADGET_ID_GROUP_CONTENT_UP,
+ GADGET_ID_GROUP_CONTENT_TEXT, GADGET_ID_NONE,
+ &group_element_info.num_elements,
+ NULL, NULL, "number of elements in group"
+ },
+
+ /* ---------- element settings: advanced (custom elements) --------------- */
+
+ {
+ ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(2),
+ 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,
+ NULL, "CE delay", NULL,
+ },
+ {
+ -1, ED_ELEMENT_SETTINGS_YPOS(2),
+ 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,
+ NULL, "+random", NULL
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(3), ED_ELEMENT_SETTINGS_YPOS(12),
+ 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_percentage,
+ NULL, "use random replace:", "%"
+ },
+};
+
+static struct
+{
+ int x, y;
+ int gadget_id;
+ int size;
+ char *value;
+ char *text_above, *infotext;
+} textinput_info[ED_NUM_TEXTINPUT] =
+{
+ {
+ ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(0),
+ GADGET_ID_LEVEL_NAME,
+ MAX_LEVEL_NAME_LEN,
+ level.name,
+ "Title:", "Title"
+ },
+ {
+ ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(2),
+ GADGET_ID_LEVEL_AUTHOR,
+ MAX_LEVEL_AUTHOR_LEN,
+ level.author,
+ "Author:", "Author"
+ },
+ {
+ -1, -1, /* these values are not constant, but can change at runtime */
+ GADGET_ID_ELEMENT_NAME,
+ MAX_ELEMENT_NAME_LEN - 2, /* currently 2 chars less editable */
+ custom_element.description,
+ 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_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3),
+ GADGET_ID_ENVELOPE_INFO,
+ MAX_ENVELOPE_XSIZE, MAX_ENVELOPE_YSIZE,
+ NULL,
+ "Envelope Content:", "Envelope Content"
+ }
+};
+
+static struct ValueTextInfo options_time_or_steps[] =
+{
+ { 0, "seconds" },
+ { 1, "steps" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_game_engine_type[] =
+{
+ { GAME_ENGINE_TYPE_RND, "Rocks'n'Diamonds" },
+ { GAME_ENGINE_TYPE_EM, "Emerald Mine" },
+ { GAME_ENGINE_TYPE_SP, "Supaplex" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_wind_direction[] =
+{
+ { MV_START_NONE, "none" },
+ { MV_START_LEFT, "left" },
+ { MV_START_RIGHT, "right" },
+ { MV_START_UP, "up" },
+ { MV_START_DOWN, "down" },
+
+ { -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" },
+ { EP_PASSABLE, "passable" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_access_layer[] =
+{
+ { EP_ACCESSIBLE_OVER, "over" },
+ { EP_ACCESSIBLE_INSIDE, "inside" },
+ { EP_ACCESSIBLE_UNDER, "under" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_access_protected[] =
+{
+ { 0, "unprotected" },
+ { 1, "protected" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_access_direction[] =
+{
+ { MV_NO_DIRECTION, "no direction" },
+ { MV_LEFT, "left" },
+ { MV_RIGHT, "right" },
+ { MV_UP, "up" },
+ { MV_DOWN, "down" },
+ { MV_LEFT | MV_UP, "left + up" },
+ { MV_LEFT | MV_DOWN, "left + down" },
+ { MV_RIGHT | MV_UP, "right + up" },
+ { MV_RIGHT | MV_DOWN, "right + down" },
+ { MV_HORIZONTAL, "horizontal" },
+ { MV_VERTICAL, "vertical" },
+ { MV_HORIZONTAL | MV_UP, "horizontal + up" },
+ { MV_HORIZONTAL | MV_DOWN, "horizontal + down" },
+ { MV_VERTICAL | MV_LEFT, "vertical + left" },
+ { MV_VERTICAL | MV_RIGHT, "vertical + right" },
+ { MV_ALL_DIRECTIONS, "all directions" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_walk_to_action[] =
+{
+ { EP_DIGGABLE, "diggable" },
+ { EP_COLLECTIBLE_ONLY, "collectible" },
+ { EP_DROPPABLE, "collectible & droppable" },
+ { EP_THROWABLE, "collectible & throwable" },
+ { EP_PUSHABLE, "pushable" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_move_pattern[] =
+{
+ { MV_LEFT, "left" },
+ { MV_RIGHT, "right" },
+ { MV_UP, "up" },
+ { MV_DOWN, "down" },
+ { MV_HORIZONTAL, "horizontal" },
+ { MV_VERTICAL, "vertical" },
+ { MV_ALL_DIRECTIONS, "all directions" },
+ { MV_WIND_DIRECTION, "wind direction" },
+ { MV_TOWARDS_PLAYER, "towards player" },
+ { MV_AWAY_FROM_PLAYER, "away from player" },
+ { MV_ALONG_LEFT_SIDE, "along left side" },
+ { MV_ALONG_RIGHT_SIDE, "along right side" },
+ { MV_TURNING_LEFT, "turning left" },
+ { MV_TURNING_RIGHT, "turning right" },
+ { MV_TURNING_LEFT_RIGHT, "turning left, right" },
+ { MV_TURNING_RIGHT_LEFT, "turning right, left" },
+ { MV_TURNING_RANDOM, "turning random" },
+ { MV_MAZE_RUNNER, "maze runner style" },
+ { MV_MAZE_HUNTER, "maze hunter style" },
+ { MV_WHEN_PUSHED, "when pushed" },
+ { MV_WHEN_DROPPED, "when dropped/thrown" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_move_direction[] =
+{
+ { MV_START_AUTOMATIC, "automatic" },
+ { MV_START_LEFT, "left" },
+ { MV_START_RIGHT, "right" },
+ { MV_START_UP, "up" },
+ { MV_START_DOWN, "down" },
+ { MV_START_RANDOM, "random" },
+ { MV_START_PREVIOUS, "previous" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_move_stepsize[] =
+{
+ { 0, "not moving" },
+ { 1, "very slow" },
+ { 2, "slow" },
+ { 4, "normal" },
+ { 8, "fast" },
+ { 16, "very fast" },
+ { 32, "even faster" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_move_leave_type[] =
+{
+ { LEAVE_TYPE_UNLIMITED, "leave behind" },
+ { LEAVE_TYPE_LIMITED, "change it to" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_smash_targets[] =
+{
+ { EP_CAN_SMASH_PLAYER, "player" },
+#if 0
+ { EP_CAN_SMASH_ENEMIES, "enemies" },
+#endif
+ { EP_CAN_SMASH_EVERYTHING, "everything" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_slippery_type[] =
+{
+ { SLIPPERY_ANY_RANDOM, "random" },
+ { SLIPPERY_ANY_LEFT_RIGHT, "left, right" },
+ { SLIPPERY_ANY_RIGHT_LEFT, "right, left" },
+ { SLIPPERY_ONLY_LEFT, "only left" },
+ { SLIPPERY_ONLY_RIGHT, "only right" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_deadliness[] =
+{
+ { EP_DONT_RUN_INTO, "running into" },
+ { EP_DONT_COLLIDE_WITH, "colliding with" },
+ { EP_DONT_GET_HIT_BY, "getting hit by" },
+ { EP_DONT_TOUCH, "touching" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_explosion_type[] =
+{
+ { EXPLODES_3X3, "3x3" },
+ { EXPLODES_CROSS, "3+3" },
+ { EXPLODES_1X1, "1x1" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_time_units[] =
+{
+ { 1, "frames" },
+ { FRAMES_PER_SECOND, "seconds" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_change_direct_action[] =
+{
+ { 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_DROPPED_BY_PLAYER, "dropped/thrown by player" },
+ { CE_SWITCHED, "switched" },
+ { CE_HITTING_SOMETHING, "hitting something" },
+ { CE_HIT_BY_SOMETHING, "hit by something" },
+#if 0
+ { CE_BLOCKED, "blocked" },
+#endif
+ { CE_IMPACT, "impact (on something)" },
+ { CE_SMASHED, "smashed (from above)" },
+#if 0
+ { CE_VALUE_CHANGES, "CE value changes" },
+ { CE_SCORE_CHANGES, "CE score changes" },
+#endif
+ { CE_VALUE_GETS_ZERO, "CE value gets 0" },
+ { CE_SCORE_GETS_ZERO, "CE score gets 0" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_change_other_action[] =
+{
+ { 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_DIGS_X, "player digs" },
+ { CE_PLAYER_COLLECTS_X, "player collects" },
+ { 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_CHANGES_OF_X, "CE value changes of" },
+ { CE_SCORE_CHANGES_OF_X, "CE score changes of" },
+ { CE_VALUE_GETS_ZERO_OF_X, "CE value gets 0 of" },
+ { CE_SCORE_GETS_ZERO_OF_X, "CE score gets 0 of" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_change_trigger_side[] =
+{
+ { CH_SIDE_LEFT, "left" },
+ { CH_SIDE_RIGHT, "right" },
+ { CH_SIDE_TOP, "top" },
+ { CH_SIDE_BOTTOM, "bottom" },
+ { CH_SIDE_LEFT_RIGHT, "left/right" },
+ { CH_SIDE_TOP_BOTTOM, "top/bottom" },
+ { CH_SIDE_ANY, "any" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_change_trigger_player[] =
+{
+ { CH_PLAYER_1, "1" },
+ { CH_PLAYER_2, "2" },
+ { CH_PLAYER_3, "3" },
+ { CH_PLAYER_4, "4" },
+ { CH_PLAYER_ANY, "any" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_change_trigger_page[] =
+{
+ { (1 << 0), "1" },
+ { (1 << 1), "2" },
+ { (1 << 2), "3" },
+ { (1 << 3), "4" },
+ { (1 << 4), "5" },
+ { (1 << 5), "6" },
+ { (1 << 6), "7" },
+ { (1 << 7), "8" },
+ { (1 << 8), "9" },
+ { (1 << 9), "10" },
+ { (1 << 10), "11" },
+ { (1 << 11), "12" },
+ { (1 << 12), "13" },
+ { (1 << 13), "14" },
+ { (1 << 14), "15" },
+ { (1 << 15), "16" },
+ { (1 << 16), "17" },
+ { (1 << 17), "18" },
+ { (1 << 18), "19" },
+ { (1 << 19), "20" },
+ { (1 << 20), "21" },
+ { (1 << 21), "22" },
+ { (1 << 22), "23" },
+ { (1 << 23), "24" },
+ { (1 << 24), "25" },
+ { (1 << 25), "26" },
+ { (1 << 26), "27" },
+ { (1 << 27), "28" },
+ { (1 << 28), "29" },
+ { (1 << 29), "30" },
+ { (1 << 30), "31" },
+ { (1 << 31), "32" },
+ { CH_PAGE_ANY, "any" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_change_replace_when[] =
+{
+ { CP_WHEN_EMPTY, "empty" },
+ { CP_WHEN_WALKABLE, "walkable" },
+ { CP_WHEN_DIGGABLE, "diggable" },
+ { CP_WHEN_COLLECTIBLE, "collectible" },
+ { CP_WHEN_REMOVABLE, "removable" },
+ { CP_WHEN_DESTRUCTIBLE, "destructible" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_action_type[] =
+{
+ { CA_NO_ACTION, "no action" },
+ { CA_UNDEFINED, " " },
+ { CA_HEADLINE_LEVEL_ACTIONS, "[level]" },
+ { CA_RESTART_LEVEL, "restart level" },
+ { CA_SHOW_ENVELOPE, "show envelope" },
+ { CA_SET_LEVEL_TIME, "set time" },
+ { CA_SET_LEVEL_SCORE, "set score" },
+ { CA_SET_LEVEL_GEMS, "set gems" },
+ { CA_SET_LEVEL_WIND, "set wind dir." },
+ { CA_SET_LEVEL_RANDOM_SEED, "set rand. seed" },
+ { CA_UNDEFINED, " " },
+ { CA_HEADLINE_PLAYER_ACTIONS, "[player]" },
+ { 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_GRAVITY, "set gravity" },
+ { CA_SET_PLAYER_ARTWORK, "set artwork" },
+ { CA_SET_PLAYER_INVENTORY, "set inventory" },
+ { CA_UNDEFINED, " " },
+ { CA_HEADLINE_CE_ACTIONS, "[CE]" },
+ { CA_SET_CE_VALUE, "set CE value" },
+ { CA_SET_CE_SCORE, "set CE score" },
+ { CA_SET_CE_ARTWORK, "set CE artwork" },
+ { CA_UNDEFINED, " " },
+ { CA_HEADLINE_ENGINE_ACTIONS, "[engine]" },
+ { CA_SET_ENGINE_SCAN_MODE, "set scan mode" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_action_mode_none[] =
+{
+ { CA_MODE_UNDEFINED, " " },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_action_mode_assign[] =
+{
+ { CA_MODE_SET, "=" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_action_mode_add_remove[] =
+{
+ { CA_MODE_ADD, "+" },
+ { CA_MODE_SUBTRACT, "-" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_action_mode_calculate[] =
+{
+ { CA_MODE_SET, "=" },
+ { CA_MODE_ADD, "+" },
+ { CA_MODE_SUBTRACT, "-" },
+ { CA_MODE_MULTIPLY, "*" },
+ { CA_MODE_DIVIDE, "/" },
+ { CA_MODE_MODULO, "%" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_action_arg_none[] =
+{
+ { CA_ARG_UNDEFINED, " " },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_action_arg_player[] =
+{
+ { CA_ARG_PLAYER_HEADLINE, "[player]" },
+ { CA_ARG_PLAYER_1, "1" },
+ { CA_ARG_PLAYER_2, "2" },
+ { CA_ARG_PLAYER_3, "3" },
+ { CA_ARG_PLAYER_4, "4" },
+ { CA_ARG_PLAYER_ANY, "any" },
+ { CA_ARG_PLAYER_TRIGGER, "trigger" },
+ { CA_ARG_PLAYER_ACTION, "action ->" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_action_arg_number[] =
+{
+ { 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_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_VALUE, "CE value" },
+ { CA_ARG_NUMBER_CE_SCORE, "CE score" },
+ { CA_ARG_NUMBER_CE_DELAY, "CE delay" },
+ { 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_TARGET, "target" },
+ { CA_ARG_ELEMENT_CV_TRIGGER, "trigger" },
+ { CA_ARG_ELEMENT_CV_ACTION, "action ->" },
+ { CA_ARG_UNDEFINED, " " },
+ { CA_ARG_ELEMENT_CS_HEADLINE, "[CE score]" },
+ { CA_ARG_ELEMENT_CS_TARGET, "target" },
+ { CA_ARG_ELEMENT_CS_TRIGGER, "trigger" },
+ { CA_ARG_ELEMENT_CS_ACTION, "action ->" },
+
+ { -1, NULL }
+};
+
+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_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_VALUE, "CE value" },
+ { CA_ARG_NUMBER_CE_SCORE, "CE score" },
+ { CA_ARG_NUMBER_CE_DELAY, "CE delay" },
+ { 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_TARGET, "target" },
+ { CA_ARG_ELEMENT_CV_TRIGGER, "trigger" },
+ { CA_ARG_ELEMENT_CV_ACTION, "action ->" },
+ { CA_ARG_UNDEFINED, " " },
+ { CA_ARG_ELEMENT_CS_HEADLINE, "[CE score]" },
+ { CA_ARG_ELEMENT_CS_TARGET, "target" },
+ { CA_ARG_ELEMENT_CS_TRIGGER, "trigger" },
+ { CA_ARG_ELEMENT_CS_ACTION, "action ->" },
+ { CA_ARG_UNDEFINED, " " },
+ { CA_ARG_ELEMENT_NR_HEADLINE, "[element]" },
+ { CA_ARG_ELEMENT_NR_TARGET, "target" },
+ { CA_ARG_ELEMENT_NR_TRIGGER, "trigger" },
+ { CA_ARG_ELEMENT_NR_ACTION, "action ->" },
+
+ { -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" },
+ { CA_ARG_ELEMENT_TRIGGER, "trigger" },
+ { CA_ARG_ELEMENT_ACTION, "action ->" },
+
+ { -1, NULL }
+};
+
+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" },
+ { CA_ARG_ELEMENT_TRIGGER, "trigger" },
+ { CA_ARG_ELEMENT_ACTION, "action ->" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_action_arg_speed[] =
+{
+ { CA_ARG_SPEED_HEADLINE, "[speed]" },
+ { CA_ARG_SPEED_NOT_MOVING, "frozen" },
+ { CA_ARG_SPEED_VERY_SLOW, "very slow" },
+ { CA_ARG_SPEED_SLOW, "slow" },
+ { CA_ARG_SPEED_NORMAL, "normal" },
+ { CA_ARG_SPEED_FAST, "fast" },
+ { CA_ARG_SPEED_VERY_FAST, "very fast" },
+ { CA_ARG_SPEED_EVEN_FASTER, "ultrafast" },
+ { CA_ARG_UNDEFINED, " " },
+ { CA_ARG_SPEED_SLOWER, "slower" },
+ { CA_ARG_SPEED_FASTER, "faster" },
+ { CA_ARG_UNDEFINED, " " },
+ { CA_ARG_SPEED_RESET, "reset" },
+
+ { -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_ELEMENT_ACTION, "action ->" },
+ { CA_ARG_UNDEFINED, " " },
+ { CA_ARG_ELEMENT_RESET, "reset" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_action_arg_gravity[] =
+{
+ { CA_ARG_GRAVITY_HEADLINE, "[gravity]" },
+ { CA_ARG_GRAVITY_ON, "on" },
+ { CA_ARG_GRAVITY_OFF, "off" },
+ { CA_ARG_GRAVITY_TOGGLE, "toggle" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo options_action_arg_direction[] =
+{
+ { CA_ARG_DIRECTION_HEADLINE, "[dir.]" },
+ { CA_ARG_DIRECTION_NONE, "none" },
+ { CA_ARG_DIRECTION_LEFT, "left" },
+ { CA_ARG_DIRECTION_RIGHT, "right" },
+ { CA_ARG_DIRECTION_UP, "up" },
+ { CA_ARG_DIRECTION_DOWN, "down" },
+ { CA_ARG_DIRECTION_TRIGGER, "trigger" },
+ { CA_ARG_DIRECTION_TRIGGER_BACK, "-trigger" },
+
+ { -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 struct ValueTextInfo options_action_arg_inventory[] =
+{
+ { CA_ARG_INVENTORY_HEADLINE, "[add]" },
+ { CA_ARG_ELEMENT_TARGET, "+ target" },
+ { CA_ARG_ELEMENT_TRIGGER, "+ trigger" },
+ { CA_ARG_ELEMENT_ACTION, "+ action" },
+ { CA_ARG_UNDEFINED, " " },
+ { CA_ARG_INVENTORY_RM_HEADLINE,"[remove]" },
+ { CA_ARG_INVENTORY_RM_TARGET, "- target" },
+ { CA_ARG_INVENTORY_RM_TRIGGER,"- trigger" },
+ { CA_ARG_INVENTORY_RM_ACTION, "- action" },
+ { CA_ARG_INVENTORY_RM_FIRST, "- first" },
+ { CA_ARG_INVENTORY_RM_LAST, "- last" },
+ { CA_ARG_INVENTORY_RM_ALL, "- all" },
+ { CA_ARG_UNDEFINED, " " },
+ { CA_ARG_INVENTORY_RESET, "reset" },
+
+ { -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 ValueTextInfo options_group_choice_mode[] =
+{
+ { ANIM_RANDOM, "random" },
+ { ANIM_LOOP, "loop" },
+ { ANIM_LINEAR, "linear" },
+ { ANIM_PINGPONG, "pingpong" },
+ { ANIM_PINGPONG2, "pingpong 2" },
+
+ { -1, NULL }
+};
+
+static struct ValueTextInfo *action_arg_modes[] =
+{
+ options_action_mode_none,
+ options_action_mode_assign,
+ options_action_mode_add_remove,
+ options_action_mode_calculate,
+};
+
+static struct
+{
+ int value;
+ int mode;
+ struct ValueTextInfo *options;
+}
+action_arg_options[] =
+{
+ { CA_NO_ACTION, 0, options_action_arg_none, },
+ { CA_EXIT_PLAYER, 0, options_action_arg_player, },
+ { CA_KILL_PLAYER, 0, options_action_arg_player, },
+ { 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_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_WIND, 1, options_action_arg_direction, },
+ { CA_SET_LEVEL_RANDOM_SEED, 1, options_action_arg_number, },
+ { 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_GRAVITY, 1, options_action_arg_gravity, },
+ { CA_SET_PLAYER_ARTWORK, 1, options_action_arg_artwork, },
+ { CA_SET_PLAYER_INVENTORY, 0, options_action_arg_inventory, },
+ { CA_SET_CE_VALUE, 3, options_action_arg_value, },
+ { CA_SET_CE_SCORE, 3, options_action_arg_value, },
+ { CA_SET_CE_ARTWORK, 1, options_action_arg_artwork, },
+ { CA_SET_ENGINE_SCAN_MODE, 1, options_action_arg_scan_mode, },
+
+ { -1, FALSE, NULL }
+};
+
+static struct
+{
+ int x, y;
+ int gadget_id;
+ int gadget_id_align;
+ int size; /* char size of selectbox or '-1' (dynamically determined) */
+ struct ValueTextInfo *options;
+ int *value;
+ char *text_left, *text_right, *infotext;
+} selectbox_info[ED_NUM_SELECTBOX] =
+{
+ /* ---------- level and editor settings ---------------------------------- */
+
+ {
+ -1, ED_LEVEL_SETTINGS_YPOS(7),
+ GADGET_ID_TIME_OR_STEPS, GADGET_ID_LEVEL_TIMELIMIT_UP,
+ -1,
+ options_time_or_steps,
+ &level.use_step_counter,
+ NULL, "(0 => no limit)", "time or step limit"
+ },
+ {
+ ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(11),
+ GADGET_ID_GAME_ENGINE_TYPE, GADGET_ID_NONE,
+ -1,
+ options_game_engine_type,
+ &level.game_engine_type,
+ "game engine:", NULL, "game engine"
+ },
+ {
+ ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(10),
+ GADGET_ID_WIND_DIRECTION, GADGET_ID_NONE,
+ -1,
+ options_wind_direction,
+ &level.wind_direction_initial,
+ "initial wind direction:", NULL, "initial wind direction"
+ },
+
+ /* ---------- element settings: configure (several elements) ------------- */
+
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(7),
+ GADGET_ID_PLAYER_SPEED, GADGET_ID_NONE,
+ -1,
+ options_player_speed,
+ &level.initial_player_stepsize[0],
+ "initial player speed:", NULL, "initial player speed"
+ },
+
+ /* ---------- element settings: configure 1 (custom elements) ------------ */
+
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(2),
+ GADGET_ID_CUSTOM_ACCESS_TYPE, GADGET_ID_NONE,
+ -1,
+ options_access_type,
+ &custom_element.access_type,
+ NULL, NULL, "type of access to this field"
+ },
+ {
+ -1, ED_ELEMENT_SETTINGS_YPOS(2),
+ GADGET_ID_CUSTOM_ACCESS_LAYER, GADGET_ID_CUSTOM_ACCESS_TYPE,
+ -1,
+ options_access_layer,
+ &custom_element.access_layer,
+ NULL, NULL, "layer of access for this field"
+ },
+ {
+ -1, ED_ELEMENT_SETTINGS_YPOS(2),
+ GADGET_ID_CUSTOM_ACCESS_PROTECTED, GADGET_ID_CUSTOM_ACCESS_LAYER,
+ -1,
+ options_access_protected,
+ &custom_element.access_protected,
+ NULL, NULL, "protected access for this field"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(3),
+ GADGET_ID_CUSTOM_ACCESS_DIRECTION, GADGET_ID_NONE,
+ -1,
+ options_access_direction,
+ &custom_element.access_direction,
+ "from", NULL, "access direction for this field"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(4),
+ GADGET_ID_CUSTOM_WALK_TO_ACTION, GADGET_ID_NONE,
+ -1,
+ options_walk_to_action,
+ &custom_element.walk_to_action,
+ NULL, NULL, "diggable/collectible/pushable"
+ },
+
+ /* ---------- element settings: configure 2 (custom elements) ------------ */
+
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(1),
+ GADGET_ID_CUSTOM_MOVE_PATTERN, GADGET_ID_NONE,
+ -1,
+ options_move_pattern,
+ &custom_element.move_pattern,
+ "can move", NULL, "element move pattern"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(2),
+ GADGET_ID_CUSTOM_MOVE_DIRECTION, GADGET_ID_NONE,
+ -1,
+ options_move_direction,
+ &custom_element.move_direction_initial,
+ "starts moving", NULL, "initial element move direction"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(4),
+ GADGET_ID_CUSTOM_MOVE_STEPSIZE, GADGET_ID_NONE,
+ -1,
+ options_move_stepsize,
+ &custom_element.move_stepsize,
+ "move/fall speed", NULL, "speed of element movement"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(3),
+ GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE, GADGET_ID_NONE,
+ -1,
+ options_move_leave_type,
+ &custom_element.move_leave_type,
+ // left text with leading spaces to place gadget next to "can dig" gadget
+ // (needed because drawing area gadgets created after selectbox gadgets)
+ // "can dig: can", ":", "leave behind or change element"
+ " can", ":", "leave behind or change element"
+ },
+ {
+ -1, ED_ELEMENT_SETTINGS_YPOS(7),
+ GADGET_ID_CUSTOM_SMASH_TARGETS, GADGET_ID_CUSTOM_CAN_SMASH,
+ -1,
+ options_smash_targets,
+ &custom_element.smash_targets,
+ "can smash", NULL, "elements that can be smashed"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(8),
+ GADGET_ID_CUSTOM_SLIPPERY_TYPE, GADGET_ID_NONE,
+ -1,
+ options_slippery_type,
+ &custom_element.slippery_type,
+ "slippery", NULL, "where other elements fall down"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(9),
+ GADGET_ID_CUSTOM_DEADLINESS, GADGET_ID_NONE,
+ -1,
+ options_deadliness,
+ &custom_element.deadliness,
+ "deadly when", NULL, "deadliness of element"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(10),
+ GADGET_ID_CUSTOM_EXPLOSION_TYPE, GADGET_ID_NONE,
+ -1,
+ options_explosion_type,
+ &custom_element.explosion_type,
+ "can explode", NULL, "explosion type"
+ },
+
+ /* ---------- element settings: advanced (custom elements) --------------- */
+
+ {
+ ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(3),
+ GADGET_ID_CHANGE_TIME_UNITS, GADGET_ID_NONE,
+ -1,
+ options_time_units,
+ &custom_element_change.delay_frames,
+ "delay time given in", NULL, "delay time units for change"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(4),
+ GADGET_ID_CHANGE_DIRECT_ACTION, GADGET_ID_NONE,
+ -1,
+ options_change_direct_action,
+ &custom_element_change.direct_action,
+ NULL, NULL, "type of direct action"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(5),
+ GADGET_ID_CHANGE_OTHER_ACTION, GADGET_ID_NONE,
+ -1,
+ options_change_other_action,
+ &custom_element_change.other_action,
+ NULL, "element:", "type of other element action"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(6),
+ GADGET_ID_CHANGE_SIDE, GADGET_ID_NONE,
+ -1,
+ options_change_trigger_side,
+ &custom_element_change.trigger_side,
+ "at", "side", "element side triggering change"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(7),
+ GADGET_ID_CHANGE_PLAYER, GADGET_ID_NONE,
+ -1,
+ options_change_trigger_player,
+ &custom_element_change.trigger_player,
+ "player:", " ", "player that causes change"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(7),
+ GADGET_ID_CHANGE_PAGE, GADGET_ID_CHANGE_PLAYER,
+ -1,
+ options_change_trigger_page,
+ &custom_element_change.trigger_page,
+ "page:", NULL, "change page that causes change"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(10),
+ GADGET_ID_CHANGE_REPLACE_WHEN, GADGET_ID_NONE,
+ -1,
+ options_change_replace_when,
+ &custom_element_change.replace_when,
+ "replace when", NULL, "which elements can be replaced"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(13),
+ GADGET_ID_ACTION_TYPE, GADGET_ID_NONE,
+ -1,
+ options_action_type,
+ &custom_element_change.action_type,
+ NULL, NULL, "action on specified condition"
+ },
+ {
+ -1, ED_ELEMENT_SETTINGS_YPOS(13),
+ GADGET_ID_ACTION_MODE, GADGET_ID_ACTION_TYPE,
+ -1,
+ options_action_mode_none,
+ &custom_element_change.action_mode,
+ NULL, NULL, "action operator"
+ },
+ {
+ -1, ED_ELEMENT_SETTINGS_YPOS(13),
+ GADGET_ID_ACTION_ARG, GADGET_ID_ACTION_MODE,
+ -1,
+ options_action_arg_none,
+ &custom_element_change.action_arg,
+ NULL, NULL, "action parameter"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(14),
+ GADGET_ID_SELECT_CHANGE_PAGE, GADGET_ID_NONE,
+ 3,
+ options_change_page,
+ &custom_element.current_change_page,
+ NULL, NULL, "element change page"
+ },
+
+ /* ---------- element settings: configure (group elements) --------------- */
+
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4),
+ GADGET_ID_GROUP_CHOICE_MODE, GADGET_ID_NONE,
+ -1,
+ options_group_choice_mode,
+ &group_element_info.choice_mode,
+ "choice type:", NULL, "type of group element choice"
+ },
+};
+
+static struct
+{
+ int x, y;
+ int gadget_id;
+ int gadget_id_align;
+ int size;
+ char *text;
+ char *text_left, *text_right, *infotext;
+} textbutton_info[ED_NUM_TEXTBUTTONS] =
+{
+ {
+ ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(0),
+ GADGET_ID_LEVELINFO_LEVEL, GADGET_ID_NONE,
+ 8, "Level",
+ NULL, NULL, "Configure level properties"
+ },
+ {
+ -1, -1,
+ GADGET_ID_LEVELINFO_EDITOR, GADGET_ID_LEVELINFO_LEVEL,
+ 8, "Editor",
+ NULL, NULL, "Configure editor properties"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0),
+ GADGET_ID_PROPERTIES_INFO, GADGET_ID_NONE,
+ 8, "Info",
+ NULL, NULL, "Show information about element"
+ },
+ {
+ -1, -1,
+ GADGET_ID_PROPERTIES_CONFIG, GADGET_ID_PROPERTIES_INFO,
+ 8, "Config",
+ NULL, NULL, "Configure element properties"
+ },
+ {
+ -1, -1,
+ GADGET_ID_PROPERTIES_CONFIG_1, GADGET_ID_PROPERTIES_INFO,
+ 8, "Config 1",
+ NULL, NULL, "Configure element properties, part 1"
+ },
+ {
+ -1, -1,
+ GADGET_ID_PROPERTIES_CONFIG_2, GADGET_ID_PROPERTIES_CONFIG_1,
+ 8, "Config 2",
+ NULL, NULL, "Configure element properties, part 2"
+ },
+ {
+ -1, -1,
+ GADGET_ID_PROPERTIES_CHANGE, GADGET_ID_PROPERTIES_CONFIG_2,
+ 8, "Change",
+ NULL, NULL, "Configure custom element change pages"
+ },
+ {
+ -1, -1,
+ GADGET_ID_SAVE_AS_TEMPLATE, GADGET_ID_CUSTOM_USE_TEMPLATE,
+ -1, "Save",
+ " ", "As Template", "Save current settings as new template"
+ },
+ {
+ -1, -1,
+ GADGET_ID_ADD_CHANGE_PAGE, GADGET_ID_PASTE_CHANGE_PAGE,
+ -1, "New",
+ NULL, NULL, "Add new change page"
+ },
+ {
+ -1, -1,
+ GADGET_ID_DEL_CHANGE_PAGE, GADGET_ID_ADD_CHANGE_PAGE,
+ -1, "Delete",
+ NULL, NULL, "Delete current change page"
+ },
+};
+
+static struct
+{
+ int graphic;
+ int x, y;
+ int gadget_id;
+ int gadget_id_align;
+ char *text_left, *text_right, *infotext;
+} graphicbutton_info[ED_NUM_GRAPHICBUTTONS] =
+{
+ {
+ IMG_EDITOR_COUNTER_DOWN,
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(14),
+ GADGET_ID_PREV_CHANGE_PAGE, GADGET_ID_NONE,
+ NULL, NULL, "select previous change page"
+ },
+ {
+ IMG_EDITOR_COUNTER_UP,
+ -1, ED_ELEMENT_SETTINGS_YPOS(14),
+ GADGET_ID_NEXT_CHANGE_PAGE, GADGET_ID_SELECT_CHANGE_PAGE,
+ NULL, "change page", "select next change page"
+ },
+ {
+ IMG_EDITOR_BUTTON_GFX_CP_COPY,
+ -1, ED_ELEMENT_SETTINGS_YPOS(14),
+ GADGET_ID_COPY_CHANGE_PAGE, GADGET_ID_NEXT_CHANGE_PAGE,
+ " ", NULL, "copy settings from this change page"
+ },
+ {
+ IMG_EDITOR_BUTTON_GFX_CP_PASTE,
+ -1, ED_ELEMENT_SETTINGS_YPOS(14),
+ GADGET_ID_PASTE_CHANGE_PAGE, GADGET_ID_COPY_CHANGE_PAGE,
+ NULL, NULL, "paste settings to this change page"
+ },
+};
+
+static struct
+{
+ int x, y;
+} scrollbutton_pos[ED_NUM_SCROLLBUTTONS];
+
+static struct
+{
+ int graphic;
+ int gadget_id;
+ char *infotext;
+} scrollbutton_info[ED_NUM_SCROLLBUTTONS] =
+{
+ {
+ IMG_EDITOR_PLAYFIELD_SCROLL_UP,
+ GADGET_ID_SCROLL_UP,
+ "scroll level editing area up"
+ },
+ {
+ IMG_EDITOR_PLAYFIELD_SCROLL_DOWN,
+ GADGET_ID_SCROLL_DOWN,
+ "scroll level editing area down"
+ },
+ {
+ IMG_EDITOR_PLAYFIELD_SCROLL_LEFT,
+ GADGET_ID_SCROLL_LEFT,
+ "scroll level editing area left"
+ },
+ {
+ IMG_EDITOR_PLAYFIELD_SCROLL_RIGHT,
+ GADGET_ID_SCROLL_RIGHT,
+ "scroll level editing area right"
+ },
+ {
+ IMG_EDITOR_PALETTE_SCROLL_UP,
+ GADGET_ID_SCROLL_LIST_UP,
+ "scroll element list up ('Page Up')"
+ },
+ {
+ IMG_EDITOR_PALETTE_SCROLL_DOWN,
+ GADGET_ID_SCROLL_LIST_DOWN,
+ "scroll element list down ('Page Down')"
+ },
+};
+
+static struct
+{
+ int x, y;
+ int width, height;
+ int wheel_x, wheel_y;
+ int wheel_width, wheel_height;
+} scrollbar_pos[ED_NUM_SCROLLBARS];
+
+static struct
+{
+ int graphic;
+ int type;
+ int gadget_id;
+ char *infotext;
+} scrollbar_info[ED_NUM_SCROLLBARS] =
+{
+ {
+ IMG_EDITOR_PLAYFIELD_SCROLLBAR,
+ GD_TYPE_SCROLLBAR_HORIZONTAL,
+ GADGET_ID_SCROLL_HORIZONTAL,
+ "scroll level editing area horizontally"
+ },
+ {
+ IMG_EDITOR_PLAYFIELD_SCROLLBAR,
+ GD_TYPE_SCROLLBAR_VERTICAL,
+ GADGET_ID_SCROLL_VERTICAL,
+ "scroll level editing area vertically"
+ },
+ {
+ IMG_EDITOR_PALETTE_SCROLLBAR,
+ GD_TYPE_SCROLLBAR_VERTICAL,
+ GADGET_ID_SCROLL_LIST_VERTICAL,
+ "scroll element list vertically"
+ }
+};
+
+
+static struct
+{
+ int x, y;
+ int gadget_id;
+ int gadget_id_align;
+ int radio_button_nr;
+ int *value;
+ int checked_value;
+ char *text_left, *text_right, *infotext;
+} radiobutton_info[ED_NUM_RADIOBUTTONS] =
+{
+ {
+ -1, ED_LEVEL_SETTINGS_YPOS(0),
+ 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"
+ },
+ {
+ -1, ED_LEVEL_SETTINGS_YPOS(0),
+ GADGET_ID_RANDOM_QUANTITY, GADGET_ID_RANDOM_PERCENTAGE,
+ RADIO_NR_RANDOM_ELEMENTS,
+ &random_placement_method, RANDOM_USE_QUANTITY,
+ " ", "quantity", "use quantity for random elements"
+ }
+};
+
+static struct
+{
+ int x, y;
+ int gadget_id;
+ int gadget_id_align;
+ boolean *value;
+ char *text_left, *text_right, *infotext;
+} checkbutton_info[ED_NUM_CHECKBUTTONS] =
+{
+ /* ---------- level and editor settings ---------------------------------- */
+
+ {
+ ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(1),
+ GADGET_ID_RANDOM_RESTRICTED, GADGET_ID_NONE,
+ &random_placement_background_restricted,
+ NULL,
+ "restrict random placement to:", "set random placement restriction"
+ },
+
+ /* ---------- element settings: configure (various elements) ------------- */
+
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0),
+ GADGET_ID_STICK_ELEMENT, GADGET_ID_NONE,
+ &stick_element_properties_window,
+ NULL,
+ "stick this screen to edit content","stick this screen to edit content"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
+ GADGET_ID_EM_SLIPPERY_GEMS, GADGET_ID_NONE,
+ &level.em_slippery_gems,
+ NULL,
+ "slip down from certain flat walls","use EM/DC style slipping behaviour"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
+ GADGET_ID_EM_EXPLODES_BY_FIRE, GADGET_ID_NONE,
+ &level.em_explodes_by_fire,
+ NULL,
+ "explodes with chain reaction", "use R'n'D style explosion behaviour"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
+ GADGET_ID_USE_SPRING_BUG, GADGET_ID_NONE,
+ &level.use_spring_bug,
+ NULL,
+ "use spring pushing bug", "use odd spring pushing behaviour"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
+ GADGET_ID_USE_TIME_ORB_BUG, GADGET_ID_NONE,
+ &level.use_time_orb_bug,
+ 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,
+ &level.grow_into_diggable,
+ NULL,
+ "can grow into anything diggable", "grow into more than just sand"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0),
+ GADGET_ID_AUTO_EXIT_SOKOBAN, GADGET_ID_NONE,
+ &level.auto_exit_sokoban,
+ NULL,
+ "exit level if all fields solved", "automatically finish Sokoban levels"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9),
+ GADGET_ID_CONTINUOUS_SNAPPING, GADGET_ID_NONE,
+ &level.continuous_snapping,
+ NULL,
+ "continuous snapping", "use snapping without releasing key"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8),
+ GADGET_ID_BLOCK_SNAP_FIELD, GADGET_ID_NONE,
+ &level.block_snap_field,
+ NULL,
+ "block snapped field when snapping", "use snapping delay to show animation"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(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(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(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(4),
+ GADGET_ID_SHIFTED_RELOCATION, GADGET_ID_NONE,
+ &level.shifted_relocation,
+ NULL,
+ "no centering when relocating", "level not centered after relocation"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(5),
+ GADGET_ID_LAZY_RELOCATION, GADGET_ID_NONE,
+ &level.lazy_relocation,
+ NULL,
+ "only redraw off-screen relocation","no redraw if relocation target visible"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10),
+ 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(11),
+ 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(12),
+ 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(13),
+ GADGET_ID_INITIAL_GRAVITY, GADGET_ID_NONE,
+ &level.initial_player_gravity[0],
+ NULL,
+ "use initial gravity", "set initial player gravity"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
+ GADGET_ID_USE_INITIAL_INVENTORY, GADGET_ID_NONE,
+ &level.use_initial_inventory[0],
+ NULL,
+ "use initial inventory:", "use collected elements on level start"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(6),
+ 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(1),
+ GADGET_ID_CAN_FALL_INTO_ACID, GADGET_ID_NONE,
+ &custom_element_properties[EP_CAN_MOVE_INTO_ACID],
+ NULL,
+ "can fall into acid (with gravity)","player can fall into acid pool"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0),
+ GADGET_ID_CAN_MOVE_INTO_ACID, GADGET_ID_NONE,
+ &custom_element_properties[EP_CAN_MOVE_INTO_ACID],
+ NULL,
+ "can move into acid", "element can move into acid pool"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
+ GADGET_ID_DONT_COLLIDE_WITH, GADGET_ID_NONE,
+ &custom_element_properties[EP_DONT_COLLIDE_WITH],
+ NULL,
+ "deadly when colliding with", "element is deadly when hitting player"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
+ GADGET_ID_ENVELOPE_AUTOWRAP, GADGET_ID_NONE,
+ &level.envelope[0].autowrap,
+ NULL,
+ "auto-wrap", "automatically wrap envelope text"
+ },
+ {
+ -1, ED_ELEMENT_SETTINGS_YPOS(1),
+ GADGET_ID_ENVELOPE_CENTERED, GADGET_ID_ENVELOPE_AUTOWRAP,
+ &level.envelope[0].centered,
+ " ",
+ "centered", "automatically center envelope text"
+ },
+
+ /* ---------- element settings: configure 1 (custom elements) ----------- */
+
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
+ GADGET_ID_CUSTOM_USE_GRAPHIC, GADGET_ID_NONE,
+ &custom_element.use_gfx_element,
+ NULL,
+ "use graphic of element:", "use existing element graphic"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(14),
+ GADGET_ID_CUSTOM_USE_TEMPLATE, GADGET_ID_NONE,
+ &level.use_custom_template,
+ NULL,
+ "use template", "use template for custom properties"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
+ GADGET_ID_CUSTOM_ACCESSIBLE, GADGET_ID_NONE,
+ &custom_element_properties[EP_ACCESSIBLE],
+ NULL,
+ NULL, "player can walk to or pass this field"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9),
+ GADGET_ID_CUSTOM_GRAV_REACHABLE, GADGET_ID_NONE,
+ &custom_element_properties[EP_GRAVITY_REACHABLE],
+ NULL,
+ "reachable despite gravity", "player can walk/dig despite gravity"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(11),
+ GADGET_ID_CUSTOM_USE_LAST_VALUE, GADGET_ID_NONE,
+ &custom_element.use_last_ce_value,
+ NULL,
+ "use last CE value after change", "use last CE value after change"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4),
+ GADGET_ID_CUSTOM_WALK_TO_OBJECT, GADGET_ID_NONE,
+ &custom_element_properties[EP_WALK_TO_OBJECT],
+ NULL,
+ NULL, "player can dig/collect/push element"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8),
+ GADGET_ID_CUSTOM_INDESTRUCTIBLE, GADGET_ID_NONE,
+ &custom_element_properties[EP_INDESTRUCTIBLE],
+ NULL,
+ "indestructible", "element is indestructible"
+ },
+
+ /* ---------- element settings: configure 2 (custom elements) ----------- */
+
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
+ GADGET_ID_CUSTOM_CAN_MOVE, GADGET_ID_NONE,
+ &custom_element_properties[EP_CAN_MOVE],
+ NULL,
+ NULL, "element can move with some pattern"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(7),
+ GADGET_ID_CUSTOM_CAN_FALL, GADGET_ID_NONE,
+ &custom_element_properties[EP_CAN_FALL],
+ NULL,
+ "can fall", "element can fall down"
+ },
+ {
+ -1, ED_ELEMENT_SETTINGS_YPOS(7),
+ GADGET_ID_CUSTOM_CAN_SMASH, GADGET_ID_CUSTOM_CAN_FALL,
+ &custom_element_properties[EP_CAN_SMASH],
+ " ",
+ NULL, "element can smash other elements"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8),
+ GADGET_ID_CUSTOM_SLIPPERY, GADGET_ID_NONE,
+ &custom_element_properties[EP_SLIPPERY],
+ NULL,
+ NULL, "other elements can fall down from it"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9),
+ GADGET_ID_CUSTOM_DEADLY, GADGET_ID_NONE,
+ &custom_element_properties[EP_DEADLY],
+ NULL,
+ NULL, "element can kill the player"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10),
+ GADGET_ID_CUSTOM_CAN_EXPLODE, GADGET_ID_NONE,
+ &custom_element_properties[EP_CAN_EXPLODE],
+ NULL,
+ NULL, "element can explode"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(11),
+ GADGET_ID_CUSTOM_EXPLODE_FIRE, GADGET_ID_NONE,
+ &custom_element_properties[EP_EXPLODES_BY_FIRE],
+ NULL,
+ "by fire", "element can explode by fire/explosion"
+ },
+ {
+ -1, ED_ELEMENT_SETTINGS_YPOS(11),
+ GADGET_ID_CUSTOM_EXPLODE_SMASH, GADGET_ID_CUSTOM_EXPLODE_FIRE,
+ &custom_element_properties[EP_EXPLODES_SMASHED],
+ " ",
+ "smashed", "element can explode when smashed"
+ },
+ {
+ -1, ED_ELEMENT_SETTINGS_YPOS(11),
+ GADGET_ID_CUSTOM_EXPLODE_IMPACT, GADGET_ID_CUSTOM_EXPLODE_SMASH,
+ &custom_element_properties[EP_EXPLODES_IMPACT],
+ " ",
+ "impact", "element can explode on impact"
+ },
+
+ /* ---------- element settings: advanced (custom elements) --------------- */
+
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
+ GADGET_ID_CUSTOM_CAN_CHANGE, GADGET_ID_NONE,
+ &custom_element_change.can_change,
+ NULL,
+ "element changes to:", "change element on specified condition"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(2),
+ GADGET_ID_CHANGE_DELAY, GADGET_ID_NONE,
+ &custom_element_change_events[CE_DELAY],
+ NULL,
+ NULL, "element changes after delay"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(4),
+ GADGET_ID_CHANGE_BY_DIRECT_ACT, GADGET_ID_NONE,
+ &custom_element_change_events[CE_BY_DIRECT_ACTION],
+ NULL,
+ NULL, "element changes by direct action"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(5),
+ GADGET_ID_CHANGE_BY_OTHER_ACT, GADGET_ID_NONE,
+ &custom_element_change_events[CE_BY_OTHER_ACTION],
+ NULL,
+ NULL, "element changes by other element"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(8),
+ GADGET_ID_CHANGE_USE_EXPLOSION, GADGET_ID_NONE,
+ &custom_element_change.explode,
+ NULL,
+ "explode instead of change", "element explodes instead of change"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(9),
+ GADGET_ID_CHANGE_USE_CONTENT, GADGET_ID_NONE,
+ &custom_element_change.use_target_content,
+ NULL,
+ "use extended change target:", "element changes to more elements"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(11),
+ GADGET_ID_CHANGE_ONLY_COMPLETE, GADGET_ID_NONE,
+ &custom_element_change.only_if_complete,
+ NULL,
+ "replace all or nothing", "only replace when all can be changed"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(12),
+ GADGET_ID_CHANGE_USE_RANDOM, GADGET_ID_NONE,
+ &custom_element_change.use_random_replace,
+ NULL,
+ NULL, "use percentage for random replace"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(13),
+ GADGET_ID_CHANGE_HAS_ACTION, GADGET_ID_NONE,
+ &custom_element_change.has_action,
+ NULL,
+ NULL, "execute action on specified condition"
+ },
+};
+
+static struct
+{
+ int x, y;
+ int xoffset, yoffset;
+ int gadget_id;
+ int gadget_id_align;
+ 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,
+ 0, 0,
+ GADGET_ID_DRAWING_LEVEL, GADGET_ID_NONE,
+ NULL,
+ -1, -1, /* these values are not constant, but can change at runtime */
+ NULL, NULL, NULL, NULL
+ },
+
+ /* ---------- yam yam content -------------------------------------------- */
+
+ {
+ ED_AREA_YAMYAM_CONTENT_XPOS, ED_AREA_YAMYAM_CONTENT_YPOS,
+ ED_AREA_YAMYAM_CONTENT_XOFF(0), ED_AREA_YAMYAM_CONTENT_YOFF(0),
+ GADGET_ID_YAMYAM_CONTENT_0, GADGET_ID_NONE,
+ &level.yamyam_content[0].e[0][0], 3, 3,
+ NULL, NULL, "1", NULL
+ },
+ {
+ ED_AREA_YAMYAM_CONTENT_XPOS, ED_AREA_YAMYAM_CONTENT_YPOS,
+ ED_AREA_YAMYAM_CONTENT_XOFF(1), ED_AREA_YAMYAM_CONTENT_YOFF(1),
+ GADGET_ID_YAMYAM_CONTENT_1, GADGET_ID_NONE,
+ &level.yamyam_content[1].e[0][0], 3, 3,
+ NULL, NULL, "2", NULL
+ },
+ {
+ ED_AREA_YAMYAM_CONTENT_XPOS, ED_AREA_YAMYAM_CONTENT_YPOS,
+ ED_AREA_YAMYAM_CONTENT_XOFF(2), ED_AREA_YAMYAM_CONTENT_YOFF(2),
+ GADGET_ID_YAMYAM_CONTENT_2, GADGET_ID_NONE,
+ &level.yamyam_content[2].e[0][0], 3, 3,
+ NULL, NULL, "3", NULL
+ },
+ {
+ ED_AREA_YAMYAM_CONTENT_XPOS, ED_AREA_YAMYAM_CONTENT_YPOS,
+ ED_AREA_YAMYAM_CONTENT_XOFF(3), ED_AREA_YAMYAM_CONTENT_YOFF(3),
+ GADGET_ID_YAMYAM_CONTENT_3, GADGET_ID_NONE,
+ &level.yamyam_content[3].e[0][0], 3, 3,
+ NULL, NULL, "4", NULL
+ },
+ {
+ ED_AREA_YAMYAM_CONTENT_XPOS, ED_AREA_YAMYAM_CONTENT_YPOS,
+ ED_AREA_YAMYAM_CONTENT_XOFF(4), ED_AREA_YAMYAM_CONTENT_YOFF(4),
+ GADGET_ID_YAMYAM_CONTENT_4, GADGET_ID_NONE,
+ &level.yamyam_content[4].e[0][0], 3, 3,
+ NULL, NULL, "5", NULL
+ },
+ {
+ ED_AREA_YAMYAM_CONTENT_XPOS, ED_AREA_YAMYAM_CONTENT_YPOS,
+ ED_AREA_YAMYAM_CONTENT_XOFF(5), ED_AREA_YAMYAM_CONTENT_YOFF(5),
+ GADGET_ID_YAMYAM_CONTENT_5, GADGET_ID_NONE,
+ &level.yamyam_content[5].e[0][0], 3, 3,
+ NULL, NULL, "6", NULL
+ },
+ {
+ ED_AREA_YAMYAM_CONTENT_XPOS, ED_AREA_YAMYAM_CONTENT_YPOS,
+ ED_AREA_YAMYAM_CONTENT_XOFF(6), ED_AREA_YAMYAM_CONTENT_YOFF(6),
+ GADGET_ID_YAMYAM_CONTENT_6, GADGET_ID_NONE,
+ &level.yamyam_content[6].e[0][0], 3, 3,
+ NULL, NULL, "7", NULL
+ },
+ {
+ ED_AREA_YAMYAM_CONTENT_XPOS, ED_AREA_YAMYAM_CONTENT_YPOS,
+ ED_AREA_YAMYAM_CONTENT_XOFF(7), ED_AREA_YAMYAM_CONTENT_YOFF(7),
+ GADGET_ID_YAMYAM_CONTENT_7, GADGET_ID_NONE,
+ &level.yamyam_content[7].e[0][0], 3, 3,
+ NULL, NULL, "8", NULL
+ },
+
+ /* ---------- magic ball content ----------------------------------------- */
+
+ {
+ ED_AREA_MAGIC_BALL_CONTENT_XPOS, ED_AREA_MAGIC_BALL_CONTENT_YPOS,
+ ED_AREA_MAGIC_BALL_CONTENT_XOFF(0), ED_AREA_MAGIC_BALL_CONTENT_YOFF(0),
+ GADGET_ID_MAGIC_BALL_CONTENT_0, GADGET_ID_NONE,
+ &level.ball_content[0].e[0][0], 3, 3,
+ NULL, NULL, "1", NULL
+ },
+ {
+ ED_AREA_MAGIC_BALL_CONTENT_XPOS, ED_AREA_MAGIC_BALL_CONTENT_YPOS,
+ ED_AREA_MAGIC_BALL_CONTENT_XOFF(1), ED_AREA_MAGIC_BALL_CONTENT_YOFF(1),
+ GADGET_ID_MAGIC_BALL_CONTENT_1, GADGET_ID_NONE,
+ &level.ball_content[1].e[0][0], 3, 3,
+ NULL, NULL, "2", NULL
+ },
+ {
+ ED_AREA_MAGIC_BALL_CONTENT_XPOS, ED_AREA_MAGIC_BALL_CONTENT_YPOS,
+ ED_AREA_MAGIC_BALL_CONTENT_XOFF(2), ED_AREA_MAGIC_BALL_CONTENT_YOFF(2),
+ GADGET_ID_MAGIC_BALL_CONTENT_2, GADGET_ID_NONE,
+ &level.ball_content[2].e[0][0], 3, 3,
+ NULL, NULL, "3", NULL
+ },
+ {
+ ED_AREA_MAGIC_BALL_CONTENT_XPOS, ED_AREA_MAGIC_BALL_CONTENT_YPOS,
+ ED_AREA_MAGIC_BALL_CONTENT_XOFF(3), ED_AREA_MAGIC_BALL_CONTENT_YOFF(3),
+ GADGET_ID_MAGIC_BALL_CONTENT_3, GADGET_ID_NONE,
+ &level.ball_content[3].e[0][0], 3, 3,
+ NULL, NULL, "4", NULL
+ },
+ {
+ ED_AREA_MAGIC_BALL_CONTENT_XPOS, ED_AREA_MAGIC_BALL_CONTENT_YPOS,
+ ED_AREA_MAGIC_BALL_CONTENT_XOFF(4), ED_AREA_MAGIC_BALL_CONTENT_YOFF(4),
+ GADGET_ID_MAGIC_BALL_CONTENT_4, GADGET_ID_NONE,
+ &level.ball_content[4].e[0][0], 3, 3,
+ NULL, NULL, "5", NULL
+ },
+ {
+ ED_AREA_MAGIC_BALL_CONTENT_XPOS, ED_AREA_MAGIC_BALL_CONTENT_YPOS,
+ ED_AREA_MAGIC_BALL_CONTENT_XOFF(5), ED_AREA_MAGIC_BALL_CONTENT_YOFF(5),
+ GADGET_ID_MAGIC_BALL_CONTENT_5, GADGET_ID_NONE,
+ &level.ball_content[5].e[0][0], 3, 3,
+ NULL, NULL, "6", NULL
+ },
+ {
+ ED_AREA_MAGIC_BALL_CONTENT_XPOS, ED_AREA_MAGIC_BALL_CONTENT_YPOS,
+ ED_AREA_MAGIC_BALL_CONTENT_XOFF(6), ED_AREA_MAGIC_BALL_CONTENT_YOFF(6),
+ GADGET_ID_MAGIC_BALL_CONTENT_6, GADGET_ID_NONE,
+ &level.ball_content[6].e[0][0], 3, 3,
+ NULL, NULL, "7", NULL
+ },
+ {
+ ED_AREA_MAGIC_BALL_CONTENT_XPOS, ED_AREA_MAGIC_BALL_CONTENT_YPOS,
+ ED_AREA_MAGIC_BALL_CONTENT_XOFF(7), ED_AREA_MAGIC_BALL_CONTENT_YOFF(7),
+ GADGET_ID_MAGIC_BALL_CONTENT_7, GADGET_ID_NONE,
+ &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),
+ ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF,
+ 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),
+ ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF,
+ GADGET_ID_AMOEBA_CONTENT, GADGET_ID_NONE,
+ &level.amoeba_content, 1, 1,
+ "content:", NULL, NULL, "amoeba content"
+ },
+
+ /* ---------- level start element ---------------------------------------- */
+
+ {
+ -1, ED_AREA_1X1_SETTINGS_YPOS(10),
+ 0, ED_AREA_1X1_SETTINGS_YOFF,
+ 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(11),
+ 0, ED_AREA_1X1_SETTINGS_YOFF,
+ 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(12),
+ 0, ED_AREA_1X1_SETTINGS_YOFF,
+ GADGET_ID_EXPLOSION_ELEMENT, GADGET_ID_USE_EXPLOSION_ELEMENT,
+ &level.explosion_element[0], 1, 1,
+ NULL, NULL, NULL, "element for player explosion"
+ },
+
+ /* ---------- player initial inventory ----------------------------------- */
+
+ {
+ -1, ED_AREA_1X1_SETTINGS_YPOS(1),
+ 0, ED_AREA_1X1_SETTINGS_YOFF,
+ GADGET_ID_INVENTORY_CONTENT, GADGET_ID_USE_INITIAL_INVENTORY,
+ &level.initial_inventory_content[0][0], MAX_INITIAL_INVENTORY_SIZE, 1,
+ NULL, NULL, NULL, "content for initial inventory"
+ },
+
+ /* ---------- element settings: configure 1 (custom elements) ----------- */
+
+ /* ---------- custom graphic --------------------------------------------- */
+
+ {
+ -1, ED_AREA_1X1_SETTINGS_YPOS(1),
+ 0, ED_AREA_1X1_SETTINGS_YOFF,
+ GADGET_ID_CUSTOM_GRAPHIC, GADGET_ID_CUSTOM_USE_GRAPHIC,
+ &custom_element.gfx_element_initial,1, 1,
+ NULL, NULL, NULL, "custom graphic element"
+ },
+
+ /* ---------- element settings: configure 2 (custom elements) ----------- */
+
+ /* ---------- custom content (when exploding) ---------------------------- */
+
+ {
+ -1, ED_AREA_3X3_SETTINGS_YPOS(10),
+ 0, ED_AREA_3X3_SETTINGS_YOFF,
+ GADGET_ID_CUSTOM_CONTENT, GADGET_ID_NONE, /* align three rows */
+ &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),
+ ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF,
+ GADGET_ID_CUSTOM_MOVE_ENTER, GADGET_ID_NONE,
+ &custom_element.move_enter_element, 1, 1,
+ "can dig:", " ", NULL, "element that can be digged/collected"
+ },
+ {
+ -1, ED_AREA_1X1_SETTINGS_YPOS(3),
+ 0, ED_AREA_1X1_SETTINGS_YOFF,
+ GADGET_ID_CUSTOM_MOVE_LEAVE, GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE,
+ &custom_element.move_leave_element, 1, 1,
+ NULL, NULL, NULL, "element that will be left behind"
+ },
+
+ /* ---------- element settings: advanced (custom elements) --------------- */
+
+ /* ---------- custom change target --------------------------------------- */
+
+ {
+ -1, ED_AREA_1X1_SETTINGS_YPOS(1),
+ 0, ED_AREA_1X1_SETTINGS_YOFF,
+ GADGET_ID_CUSTOM_CHANGE_TARGET, GADGET_ID_CUSTOM_CAN_CHANGE,
+ &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(9),
+ 0, ED_AREA_3X3_SETTINGS_YOFF,
+ GADGET_ID_CUSTOM_CHANGE_CONTENT, GADGET_ID_NONE, /* align three rows */
+ &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),
+ 0, ED_AREA_1X1_SETTINGS_YOFF,
+ GADGET_ID_CUSTOM_CHANGE_TRIGGER, GADGET_ID_CHANGE_OTHER_ACTION,
+ &custom_element_change.initial_trigger_element, 1, 1,
+ NULL, NULL, NULL, "other element triggering change"
+ },
+
+ /* ---------- custom change action (element used for action) ------------- */
+
+ {
+ -1, ED_AREA_1X1_SETTINGS_YPOS(13),
+ 0, ED_AREA_1X1_SETTINGS_YOFF,
+ GADGET_ID_CUSTOM_CHANGE_ACTION, GADGET_ID_ACTION_ARG,
+ &custom_element_change.action_element, 1, 1,
+ NULL, NULL, NULL, "element used as action parameter"
+ },
+
+ /* ---------- group element content -------------------------------------- */
+
+ {
+ ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(2),
+ ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF,
+ GADGET_ID_GROUP_CONTENT, GADGET_ID_NONE,
+ &group_element_info.element[0], MAX_ELEMENTS_IN_GROUP, 1,
+ "content:", NULL, NULL, NULL
+ },
+
+ /* ---------- random background (for random painting) -------------------- */
+
+ {
+ -1, ED_AREA_1X1_LSETTINGS_YPOS(1),
+ 0, ED_AREA_1X1_LSETTINGS_YOFF,
+ GADGET_ID_RANDOM_BACKGROUND, GADGET_ID_RANDOM_RESTRICTED,
+ &random_placement_background_element, 1, 1,
+ NULL, NULL, NULL, "random placement background"
+ },
+};
+
+
+/*
+ -----------------------------------------------------------------------------
+ some internally used variables
+ -----------------------------------------------------------------------------
+*/
+
+/* maximal size of level editor drawing area */
+static int MAX_ED_FIELDX, MAX_ED_FIELDY;
+
+/* actual size of level editor drawing area */
+static int ed_fieldx, ed_fieldy;
+
+/* actual position of level editor drawing area in level playfield */