GADGET_ID_PICK_ELEMENT,
GADGET_ID_UNDO,
- GADGET_ID_INFO,
+ GADGET_ID_CONF,
GADGET_ID_SAVE,
GADGET_ID_CLEAR,
GADGET_ID_TEST,
GADGET_ID_LEVELSET_NUM_LEVELS_DOWN,
GADGET_ID_LEVELSET_NUM_LEVELS_TEXT,
GADGET_ID_LEVELSET_NUM_LEVELS_UP,
+ GADGET_ID_BD_CYCLE_DELAY_MS_DOWN,
+ GADGET_ID_BD_CYCLE_DELAY_MS_TEXT,
+ GADGET_ID_BD_CYCLE_DELAY_MS_UP,
+ GADGET_ID_BD_CYCLE_DELAY_C64_DOWN,
+ GADGET_ID_BD_CYCLE_DELAY_C64_TEXT,
+ GADGET_ID_BD_CYCLE_DELAY_C64_UP,
+ GADGET_ID_BD_HATCHING_DELAY_CYCLES_DOWN,
+ GADGET_ID_BD_HATCHING_DELAY_CYCLES_TEXT,
+ GADGET_ID_BD_HATCHING_DELAY_CYCLES_UP,
+ GADGET_ID_BD_HATCHING_DELAY_SECONDS_DOWN,
+ GADGET_ID_BD_HATCHING_DELAY_SECONDS_TEXT,
+ GADGET_ID_BD_HATCHING_DELAY_SECONDS_UP,
+ GADGET_ID_BD_PUSHING_PROB_DOWN,
+ GADGET_ID_BD_PUSHING_PROB_TEXT,
+ GADGET_ID_BD_PUSHING_PROB_UP,
+ GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_DOWN,
+ GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_TEXT,
+ GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_UP,
GADGET_ID_ELEMENT_VALUE1_DOWN,
GADGET_ID_ELEMENT_VALUE1_TEXT,
GADGET_ID_ELEMENT_VALUE1_UP,
GADGET_ID_TIME_OR_STEPS,
GADGET_ID_TIME_SCORE_BASE,
GADGET_ID_GAME_ENGINE_TYPE,
+ GADGET_ID_BD_SCHEDULING_TYPE,
GADGET_ID_LEVELSET_SAVE_MODE,
GADGET_ID_WIND_DIRECTION,
GADGET_ID_PLAYER_SPEED,
// textbutton identifiers
- GADGET_ID_LEVELINFO_LEVEL,
- GADGET_ID_LEVELINFO_LEVELSET,
- GADGET_ID_LEVELINFO_EDITOR,
+ GADGET_ID_LEVELCONFIG_LEVEL,
+ GADGET_ID_LEVELCONFIG_LEVELSET,
+ GADGET_ID_LEVELCONFIG_EDITOR,
+ GADGET_ID_LEVELCONFIG_ENGINE,
GADGET_ID_PROPERTIES_INFO,
GADGET_ID_PROPERTIES_CONFIG,
GADGET_ID_PROPERTIES_CONFIG_1,
GADGET_ID_RANDOM_PERCENTAGE,
GADGET_ID_RANDOM_QUANTITY,
GADGET_ID_RANDOM_RESTRICTED,
+ GADGET_ID_BD_INTERMISSION,
+ GADGET_ID_BD_PAL_TIMING,
+ GADGET_ID_BD_LINE_SHIFTING_BORDERS,
+ GADGET_ID_BD_SCAN_FIRST_AND_LAST_ROW,
+ GADGET_ID_BD_SHORT_EXPLOSIONS,
+ GADGET_ID_BD_GRAVITY_AFFECTS_ALL,
GADGET_ID_STICK_ELEMENT,
GADGET_ID_EM_SLIPPERY_GEMS,
GADGET_ID_EM_EXPLODES_BY_FIRE,
GADGET_ID_CAN_FALL_INTO_ACID,
GADGET_ID_CAN_MOVE_INTO_ACID,
GADGET_ID_DONT_COLLIDE_WITH,
+ GADGET_ID_BD_DIAGONAL_MOVEMENTS,
+ GADGET_ID_BD_TOPMOST_PLAYER_ACTIVE,
+ GADGET_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET,
GADGET_ID_ENVELOPE_AUTOWRAP,
GADGET_ID_ENVELOPE_CENTERED,
GADGET_ID_MM_LASER_RED,
ED_COUNTER_ID_LEVEL_RANDOM_SEED,
ED_COUNTER_ID_LEVELSET_NUM_LEVELS,
ED_COUNTER_ID_LEVEL_RANDOM,
+ ED_COUNTER_ID_BD_CYCLE_DELAY_MS,
+ ED_COUNTER_ID_BD_CYCLE_DELAY_C64,
+ ED_COUNTER_ID_BD_HATCHING_DELAY_CYCLES,
+ ED_COUNTER_ID_BD_HATCHING_DELAY_SECONDS,
+ ED_COUNTER_ID_BD_PUSHING_PROB,
+ ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET,
ED_COUNTER_ID_ELEMENT_VALUE1,
ED_COUNTER_ID_ELEMENT_VALUE2,
ED_COUNTER_ID_ELEMENT_VALUE3,
ED_SELECTBOX_ID_TIME_OR_STEPS,
ED_SELECTBOX_ID_TIME_SCORE_BASE,
ED_SELECTBOX_ID_GAME_ENGINE_TYPE,
+ ED_SELECTBOX_ID_BD_SCHEDULING_TYPE,
ED_SELECTBOX_ID_LEVELSET_SAVE_MODE,
ED_SELECTBOX_ID_WIND_DIRECTION,
ED_SELECTBOX_ID_PLAYER_SPEED,
#define ED_SELECTBOX_ID_LEVELSET_FIRST ED_SELECTBOX_ID_LEVELSET_SAVE_MODE
#define ED_SELECTBOX_ID_LEVELSET_LAST ED_SELECTBOX_ID_LEVELSET_SAVE_MODE
+#define ED_SELECTBOX_ID_ENGINE_FIRST ED_SELECTBOX_ID_BD_SCHEDULING_TYPE
+#define ED_SELECTBOX_ID_ENGINE_LAST ED_SELECTBOX_ID_BD_SCHEDULING_TYPE
+
#define ED_SELECTBOX_ID_CUSTOM1_FIRST ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE
#define ED_SELECTBOX_ID_CUSTOM1_LAST ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION
#define ED_SELECTBOX_ID_CUSTOM2_FIRST ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN
// values for textbutton gadgets
enum
{
- ED_TEXTBUTTON_ID_LEVELINFO_LEVEL,
- ED_TEXTBUTTON_ID_LEVELINFO_LEVELSET,
- ED_TEXTBUTTON_ID_LEVELINFO_EDITOR,
+ ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL,
+ ED_TEXTBUTTON_ID_LEVELCONFIG_LEVELSET,
+ ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR,
+ ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE,
ED_TEXTBUTTON_ID_PROPERTIES_INFO,
ED_TEXTBUTTON_ID_PROPERTIES_CONFIG,
ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_1,
ED_NUM_TEXTBUTTONS
};
-#define ED_TAB_BUTTON_ID_LEVELINFO_FIRST ED_TEXTBUTTON_ID_LEVELINFO_LEVEL
-#define ED_TAB_BUTTON_ID_LEVELINFO_LAST ED_TEXTBUTTON_ID_LEVELINFO_EDITOR
+#define ED_TAB_BUTTON_ID_LEVELCONFIG_FIRST ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL
+#define ED_TAB_BUTTON_ID_LEVELCONFIG_LAST ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE
#define ED_TAB_BUTTON_ID_PROPERTIES_FIRST ED_TEXTBUTTON_ID_PROPERTIES_INFO
#define ED_TAB_BUTTON_ID_PROPERTIES_LAST ED_TEXTBUTTON_ID_PROPERTIES_CHANGE
ED_CHECKBUTTON_ID_RANDOM_RESTRICTED,
ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_3,
ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2,
+ ED_CHECKBUTTON_ID_BD_INTERMISSION,
+ ED_CHECKBUTTON_ID_BD_PAL_TIMING,
+ ED_CHECKBUTTON_ID_BD_LINE_SHIFTING_BORDERS,
+ ED_CHECKBUTTON_ID_BD_SCAN_FIRST_AND_LAST_ROW,
+ ED_CHECKBUTTON_ID_BD_SHORT_EXPLOSIONS,
+ ED_CHECKBUTTON_ID_BD_GRAVITY_AFFECTS_ALL,
ED_CHECKBUTTON_ID_STICK_ELEMENT,
ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS,
ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE,
ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID,
ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID,
ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH,
+ ED_CHECKBUTTON_ID_BD_DIAGONAL_MOVEMENTS,
+ ED_CHECKBUTTON_ID_BD_TOPMOST_PLAYER_ACTIVE,
+ ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET,
ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP,
ED_CHECKBUTTON_ID_ENVELOPE_CENTERED,
ED_CHECKBUTTON_ID_MM_LASER_RED,
#define ED_CHECKBUTTON_ID_EDITOR_FIRST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
#define ED_CHECKBUTTON_ID_EDITOR_LAST ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2
+#define ED_CHECKBUTTON_ID_ENGINE_FIRST ED_CHECKBUTTON_ID_BD_INTERMISSION
+#define ED_CHECKBUTTON_ID_ENGINE_LAST ED_CHECKBUTTON_ID_BD_GRAVITY_AFFECTS_ALL
+
#define ED_CHECKBUTTON_ID_CUSTOM1_FIRST ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC
#define ED_CHECKBUTTON_ID_CUSTOM1_LAST ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE
#define ED_CHECKBUTTON_ID_CUSTOM2_FIRST ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE
// screens in the level editor
#define ED_MODE_DRAWING 0
-#define ED_MODE_INFO 1
+#define ED_MODE_LEVELCONFIG 1
#define ED_MODE_PROPERTIES 2
#define ED_MODE_PALETTE 3
// sub-screens in the global settings section
-#define ED_MODE_LEVELINFO_LEVEL ED_TEXTBUTTON_ID_LEVELINFO_LEVEL
-#define ED_MODE_LEVELINFO_LEVELSET ED_TEXTBUTTON_ID_LEVELINFO_LEVELSET
-#define ED_MODE_LEVELINFO_EDITOR ED_TEXTBUTTON_ID_LEVELINFO_EDITOR
+#define ED_MODE_LEVELCONFIG_LEVEL ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL
+#define ED_MODE_LEVELCONFIG_LEVELSET ED_TEXTBUTTON_ID_LEVELCONFIG_LEVELSET
+#define ED_MODE_LEVELCONFIG_EDITOR ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR
+#define ED_MODE_LEVELCONFIG_ENGINE ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE
// sub-screens in the element properties section
#define ED_MODE_PROPERTIES_INFO ED_TEXTBUTTON_ID_PROPERTIES_INFO
"undo/redo last operation", 'u'
},
{
- IMG_GFX_EDITOR_BUTTON_CONF, GADGET_ID_INFO,
+ IMG_GFX_EDITOR_BUTTON_CONF, GADGET_ID_CONF,
&editor.button.conf, GD_TYPE_NORMAL_BUTTON,
- "properties of level", 'I'
+ "level and editor settings", 'I'
},
{
IMG_GFX_EDITOR_BUTTON_SAVE, GADGET_ID_SAVE,
static struct
{
+ int gadget_type_id;
int x, y;
int min_value, max_value;
int gadget_id_down, gadget_id_up;
// ---------- current level number ------------------------------------------
{
+ ED_COUNTER_ID_SELECT_LEVEL,
-1, -1, // these values are not constant, but can change at runtime
1, 100,
GADGET_ID_SELECT_LEVEL_DOWN, GADGET_ID_SELECT_LEVEL_UP,
// ---------- level and editor settings -------------------------------------
{
+ ED_COUNTER_ID_LEVEL_XSIZE,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(4),
MIN_LEV_FIELDX, MAX_LEV_FIELDX,
GADGET_ID_LEVEL_XSIZE_DOWN, GADGET_ID_LEVEL_XSIZE_UP,
"playfield size:", NULL, "width",
},
{
+ ED_COUNTER_ID_LEVEL_YSIZE,
-1, ED_LEVEL_SETTINGS_YPOS(4),
MIN_LEV_FIELDY, MAX_LEV_FIELDY,
GADGET_ID_LEVEL_YSIZE_DOWN, GADGET_ID_LEVEL_YSIZE_UP,
NULL, " ", "height",
},
{
+ ED_COUNTER_ID_LEVEL_GEMSLIMIT,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(5),
0, 999,
GADGET_ID_LEVEL_GEMSLIMIT_DOWN, GADGET_ID_LEVEL_GEMSLIMIT_UP,
NULL, "number of gems to collect:", NULL
},
{
+ ED_COUNTER_ID_LEVEL_TIMELIMIT,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(8),
0, 9999,
GADGET_ID_LEVEL_TIMELIMIT_DOWN, GADGET_ID_LEVEL_TIMELIMIT_UP,
"time or step limit to solve level:", NULL, NULL
},
{
+ ED_COUNTER_ID_LEVEL_TIMESCORE,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(10),
0, 999,
GADGET_ID_LEVEL_TIMESCORE_DOWN, GADGET_ID_LEVEL_TIMESCORE_UP,
"score for time or steps left:", NULL, NULL
},
{
+ ED_COUNTER_ID_LEVEL_RANDOM_SEED,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(13),
0, 9999,
GADGET_ID_LEVEL_RANDOM_SEED_DOWN, GADGET_ID_LEVEL_RANDOM_SEED_UP,
NULL, "random seed:", "(0 => random)"
},
{
+ ED_COUNTER_ID_LEVELSET_NUM_LEVELS,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(4),
1, MAX_LEVELS,
GADGET_ID_LEVELSET_NUM_LEVELS_DOWN, GADGET_ID_LEVELSET_NUM_LEVELS_UP,
"number of levels:", NULL, NULL,
},
{
+ ED_COUNTER_ID_LEVEL_RANDOM,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(0),
1, 100,
GADGET_ID_LEVEL_RANDOM_DOWN, GADGET_ID_LEVEL_RANDOM_UP,
&random_placement_value,
"random element placement:", NULL, "in"
},
+ {
+ ED_COUNTER_ID_BD_CYCLE_DELAY_MS,
+ ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(3),
+ 50, 500,
+ GADGET_ID_BD_CYCLE_DELAY_MS_DOWN, GADGET_ID_BD_CYCLE_DELAY_MS_UP,
+ GADGET_ID_BD_CYCLE_DELAY_MS_TEXT, GADGET_ID_NONE,
+ &level.bd_cycle_delay_ms,
+ NULL, NULL, "game cycle delay (ms)"
+ },
+ {
+ ED_COUNTER_ID_BD_CYCLE_DELAY_C64,
+ ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(3),
+ 0, 32,
+ GADGET_ID_BD_CYCLE_DELAY_C64_DOWN, GADGET_ID_BD_CYCLE_DELAY_C64_UP,
+ GADGET_ID_BD_CYCLE_DELAY_C64_TEXT, GADGET_ID_NONE,
+ &level.bd_cycle_delay_c64,
+ NULL, NULL, "game cycle delay (C64-style)"
+ },
+ {
+ ED_COUNTER_ID_BD_HATCHING_DELAY_CYCLES,
+ ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(4),
+ 1, 40,
+ GADGET_ID_BD_HATCHING_DELAY_CYCLES_DOWN, GADGET_ID_BD_HATCHING_DELAY_CYCLES_UP,
+ GADGET_ID_BD_HATCHING_DELAY_CYCLES_TEXT, GADGET_ID_NONE,
+ &level.bd_hatching_delay_cycles,
+ NULL, NULL, "hatching delay (cycles)"
+ },
+ {
+ ED_COUNTER_ID_BD_HATCHING_DELAY_SECONDS,
+ ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(4),
+ 1, 40,
+ GADGET_ID_BD_HATCHING_DELAY_SECONDS_DOWN, GADGET_ID_BD_HATCHING_DELAY_SECONDS_UP,
+ GADGET_ID_BD_HATCHING_DELAY_SECONDS_TEXT, GADGET_ID_NONE,
+ &level.bd_hatching_delay_seconds,
+ NULL, NULL, "hatching delay (seconds)"
+ },
// ---------- element settings: configure (various elements) ----------------
{
+ ED_COUNTER_ID_BD_PUSHING_PROB,
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
+ 0, 100,
+ GADGET_ID_BD_PUSHING_PROB_DOWN, GADGET_ID_BD_PUSHING_PROB_UP,
+ GADGET_ID_BD_PUSHING_PROB_TEXT, GADGET_ID_NONE,
+ &level.bd_pushing_prob,
+ NULL, NULL, "push probability"
+ },
+ {
+ ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET,
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3),
+ 0, 100,
+ GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_DOWN, GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_UP,
+ GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_TEXT, GADGET_ID_NONE,
+ &level.bd_pushing_prob_with_sweet,
+ NULL, NULL, "push probability with sweet"
+ },
+ {
+ ED_COUNTER_ID_ELEMENT_VALUE1,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0),
MIN_SCORE, MAX_SCORE,
GADGET_ID_ELEMENT_VALUE1_DOWN, GADGET_ID_ELEMENT_VALUE1_UP,
NULL, NULL, NULL
},
{
+ ED_COUNTER_ID_ELEMENT_VALUE2,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
MIN_SCORE, MAX_SCORE,
GADGET_ID_ELEMENT_VALUE2_DOWN, GADGET_ID_ELEMENT_VALUE2_UP,
NULL, NULL, NULL
},
{
+ ED_COUNTER_ID_ELEMENT_VALUE3,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
MIN_SCORE, MAX_SCORE,
GADGET_ID_ELEMENT_VALUE3_DOWN, GADGET_ID_ELEMENT_VALUE3_UP,
NULL, NULL, NULL
},
{
+ ED_COUNTER_ID_ELEMENT_VALUE4,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3),
MIN_SCORE, MAX_SCORE,
GADGET_ID_ELEMENT_VALUE4_DOWN, GADGET_ID_ELEMENT_VALUE4_UP,
NULL, NULL, NULL
},
{
+ ED_COUNTER_ID_YAMYAM_CONTENT,
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,
NULL, NULL, "number of content areas"
},
{
+ ED_COUNTER_ID_BALL_CONTENT,
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,
NULL, NULL, "number of content areas"
},
{
+ ED_COUNTER_ID_ANDROID_CONTENT,
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,
NULL, NULL, "number of clonable elements"
},
{
+ ED_COUNTER_ID_ENVELOPE_XSIZE,
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,
NULL, NULL, "width",
},
{
+ ED_COUNTER_ID_ENVELOPE_YSIZE,
-1, ED_ELEMENT_SETTINGS_YPOS(0),
MIN_ENVELOPE_YSIZE, MAX_ENVELOPE_YSIZE,
GADGET_ID_ENVELOPE_YSIZE_DOWN, GADGET_ID_ENVELOPE_YSIZE_UP,
NULL, " ", "height",
},
{
+ ED_COUNTER_ID_INVENTORY_SIZE,
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,
NULL, NULL, "number of inventory elements"
},
{
+ ED_COUNTER_ID_MM_BALL_CONTENT,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3),
MIN_ELEMENTS_IN_GROUP, MAX_MM_BALL_CONTENTS,
GADGET_ID_MM_BALL_CONTENT_DOWN, GADGET_ID_MM_BALL_CONTENT_UP,
// ---------- element settings: configure 1 (custom elements) ---------------
{
+ ED_COUNTER_ID_CUSTOM_SCORE,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(5),
MIN_SCORE, MAX_SCORE,
GADGET_ID_CUSTOM_SCORE_DOWN, GADGET_ID_CUSTOM_SCORE_UP,
NULL, "CE score", " "
},
{
+ ED_COUNTER_ID_CUSTOM_GEMCOUNT,
-1, ED_ELEMENT_SETTINGS_YPOS(5),
MIN_COLLECT_COUNT, MAX_COLLECT_COUNT,
GADGET_ID_CUSTOM_GEMCOUNT_DOWN, GADGET_ID_CUSTOM_GEMCOUNT_UP,
NULL, "CE count", NULL
},
{
+ ED_COUNTER_ID_CUSTOM_VALUE_FIX,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10),
0, 9999,
GADGET_ID_CUSTOM_VALUE_FIX_DOWN, GADGET_ID_CUSTOM_VALUE_FIX_UP,
NULL, "CE value", NULL
},
{
+ ED_COUNTER_ID_CUSTOM_VALUE_RND,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10),
0, 9999,
GADGET_ID_CUSTOM_VALUE_RND_DOWN, GADGET_ID_CUSTOM_VALUE_RND_UP,
NULL, "+random", NULL
},
{
+ ED_COUNTER_ID_PUSH_DELAY_FIX,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(6),
0, 999,
GADGET_ID_PUSH_DELAY_FIX_DOWN, GADGET_ID_PUSH_DELAY_FIX_UP,
NULL, "push delay", NULL
},
{
+ ED_COUNTER_ID_PUSH_DELAY_RND,
-1, ED_ELEMENT_SETTINGS_YPOS(6),
0, 999,
GADGET_ID_PUSH_DELAY_RND_DOWN, GADGET_ID_PUSH_DELAY_RND_UP,
NULL, "+random", NULL
},
{
+ ED_COUNTER_ID_DROP_DELAY_FIX,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(7),
0, 999,
GADGET_ID_DROP_DELAY_FIX_DOWN, GADGET_ID_DROP_DELAY_FIX_UP,
NULL, "drop delay", NULL
},
{
+ ED_COUNTER_ID_DROP_DELAY_RND,
-1, ED_ELEMENT_SETTINGS_YPOS(7),
0, 999,
GADGET_ID_DROP_DELAY_RND_DOWN, GADGET_ID_DROP_DELAY_RND_UP,
// ---------- element settings: configure 2 (custom elements) ---------------
{
+ ED_COUNTER_ID_MOVE_DELAY_FIX,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(5),
0, 999,
GADGET_ID_MOVE_DELAY_FIX_DOWN, GADGET_ID_MOVE_DELAY_FIX_UP,
NULL, "move delay", NULL
},
{
+ ED_COUNTER_ID_MOVE_DELAY_RND,
-1, ED_ELEMENT_SETTINGS_YPOS(5),
0, 999,
GADGET_ID_MOVE_DELAY_RND_DOWN, GADGET_ID_MOVE_DELAY_RND_UP,
NULL, "+random", NULL
},
{
+ ED_COUNTER_ID_STEP_DELAY_FIX,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(6),
0, 999,
GADGET_ID_STEP_DELAY_FIX_DOWN, GADGET_ID_STEP_DELAY_FIX_UP,
NULL, "step delay", NULL
},
{
+ ED_COUNTER_ID_STEP_DELAY_RND,
-1, ED_ELEMENT_SETTINGS_YPOS(6),
0, 999,
GADGET_ID_STEP_DELAY_RND_DOWN, GADGET_ID_STEP_DELAY_RND_UP,
NULL, "+random", NULL
},
{
+ ED_COUNTER_ID_EXPLOSION_DELAY,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(13),
0, 999,
GADGET_ID_EXPLOSION_DELAY_DOWN, GADGET_ID_EXPLOSION_DELAY_UP,
NULL, "explosion delay", NULL
},
{
+ ED_COUNTER_ID_IGNITION_DELAY,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(14),
0, 999,
GADGET_ID_IGNITION_DELAY_DOWN, GADGET_ID_IGNITION_DELAY_UP,
// ---------- element settings: configure (group elements) ------------------
{
+ ED_COUNTER_ID_GROUP_CONTENT,
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,
// ---------- element settings: advanced (custom elements) ------------------
{
+ ED_COUNTER_ID_CHANGE_DELAY_FIX,
ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(2),
0, 999,
GADGET_ID_CHANGE_DELAY_FIX_DOWN, GADGET_ID_CHANGE_DELAY_FIX_UP,
NULL, "CE delay", NULL,
},
{
+ ED_COUNTER_ID_CHANGE_DELAY_RND,
-1, ED_ELEMENT_SETTINGS_YPOS(2),
0, 999,
GADGET_ID_CHANGE_DELAY_RND_DOWN, GADGET_ID_CHANGE_DELAY_RND_UP,
NULL, "+random", NULL
},
{
+ ED_COUNTER_ID_CHANGE_CONT_RND,
ED_ELEMENT_SETTINGS_XPOS(3), ED_ELEMENT_SETTINGS_YPOS(12),
0, 100,
GADGET_ID_CHANGE_CONT_RND_DOWN, GADGET_ID_CHANGE_CONT_RND_UP,
static struct
{
+ int gadget_type_id;
int x, y;
int gadget_id;
int size;
} textinput_info[ED_NUM_TEXTINPUT] =
{
{
+ ED_TEXTINPUT_ID_LEVEL_NAME,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(0),
GADGET_ID_LEVEL_NAME,
MAX_LEVEL_NAME_LEN,
"Title:", "Title for this level"
},
{
+ ED_TEXTINPUT_ID_LEVEL_AUTHOR,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(2),
GADGET_ID_LEVEL_AUTHOR,
MAX_LEVEL_AUTHOR_LEN,
"Author:", "Author for this level"
},
{
+ ED_TEXTINPUT_ID_LEVELSET_NAME,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(0),
GADGET_ID_LEVELSET_NAME,
MAX_LEVEL_NAME_LEN,
"Title:", "Title for this or new level set"
},
{
+ ED_TEXTINPUT_ID_LEVELSET_AUTHOR,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(2),
GADGET_ID_LEVELSET_AUTHOR,
MAX_LEVEL_AUTHOR_LEN,
"Author:", "Author for this or new level set"
},
{
+ ED_TEXTINPUT_ID_ELEMENT_NAME,
-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
static struct
{
+ int gadget_type_id;
int x, y;
int gadget_id;
int xsize, ysize;
} textarea_info[ED_NUM_TEXTAREAS] =
{
{
+ ED_TEXTAREA_ID_ENVELOPE_INFO,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3),
GADGET_ID_ENVELOPE_INFO,
MAX_ENVELOPE_XSIZE, MAX_ENVELOPE_YSIZE,
static struct ValueTextInfo options_game_engine_type[] =
{
{ GAME_ENGINE_TYPE_RND, "Rocks'n'Diamonds" },
+ { GAME_ENGINE_TYPE_BD, "Boulder Dash" },
{ GAME_ENGINE_TYPE_EM, "Emerald Mine" },
{ GAME_ENGINE_TYPE_SP, "Supaplex" },
{ GAME_ENGINE_TYPE_MM, "Mirror Magic" },
{ ANIM_LINEAR, "linear" },
{ ANIM_PINGPONG, "pingpong" },
{ ANIM_PINGPONG2, "pingpong 2" },
+ { ANIM_LEVEL_NR, "level number" },
{ -1, NULL }
};
+static struct ValueTextInfo options_bd_scheduling_type[] =
+{
+ { GD_SCHEDULING_MILLISECONDS, "Milliseconds" },
+ { GD_SCHEDULING_BD1, "BD1" },
+ { GD_SCHEDULING_BD2, "BD2" },
+ { GD_SCHEDULING_PLCK, "Construction Kit" },
+ { GD_SCHEDULING_CRDR, "Crazy Dream 7" },
+ { GD_SCHEDULING_BD1_ATARI, "Atari BD1" },
+ { GD_SCHEDULING_BD2_PLCK_ATARI, "Atari BD2 / PLCK" },
+
+ { -1, NULL }
+};
+
static struct ValueTextInfo *action_arg_modes[] =
{
options_action_mode_none,
static struct
{
+ int gadget_type_id;
int x, y;
int gadget_id;
int gadget_id_align;
// ---------- level and editor settings -------------------------------------
{
+ ED_SELECTBOX_ID_TIME_OR_STEPS,
-1, ED_LEVEL_SETTINGS_YPOS(8),
GADGET_ID_TIME_OR_STEPS, GADGET_ID_LEVEL_TIMELIMIT_UP,
-1,
NULL, NULL, "(0 => no limit)", "time or step limit"
},
{
+ ED_SELECTBOX_ID_TIME_SCORE_BASE,
-1, ED_LEVEL_SETTINGS_YPOS(10),
GADGET_ID_TIME_SCORE_BASE, GADGET_ID_LEVEL_TIMESCORE_UP,
-1,
NULL, NULL, NULL, "time score for 1 or 10 seconds/steps"
},
{
+ ED_SELECTBOX_ID_GAME_ENGINE_TYPE,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(12),
GADGET_ID_GAME_ENGINE_TYPE, GADGET_ID_NONE,
-1,
NULL, "game engine:", NULL, "game engine"
},
{
+ ED_SELECTBOX_ID_BD_SCHEDULING_TYPE,
+ ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(1),
+ GADGET_ID_BD_SCHEDULING_TYPE, GADGET_ID_NONE,
+ -1,
+ options_bd_scheduling_type,
+ &level.bd_scheduling_type,
+ NULL, "scheduling type:", NULL, "level timing"
+ },
+ {
+ ED_SELECTBOX_ID_LEVELSET_SAVE_MODE,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(10),
GADGET_ID_LEVELSET_SAVE_MODE, GADGET_ID_NONE,
-1,
// ---------- element settings: configure (several elements) ----------------
{
+ ED_SELECTBOX_ID_WIND_DIRECTION,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0),
GADGET_ID_WIND_DIRECTION, GADGET_ID_NONE,
-1,
NULL, "initial wind direction:", NULL, "initial wind direction"
},
{
+ ED_SELECTBOX_ID_PLAYER_SPEED,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(7),
GADGET_ID_PLAYER_SPEED, GADGET_ID_NONE,
-1,
NULL, "initial player speed:", NULL, "initial player speed"
},
{
+ ED_SELECTBOX_ID_MM_BALL_CHOICE_MODE,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4),
GADGET_ID_MM_BALL_CHOICE_MODE, GADGET_ID_NONE,
-1,
// ---------- element settings: configure 1 (custom elements) ---------------
{
+ ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(2),
GADGET_ID_CUSTOM_ACCESS_TYPE, GADGET_ID_NONE,
-1,
NULL, NULL, NULL, "type of access to this field"
},
{
+ ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER,
-1, ED_ELEMENT_SETTINGS_YPOS(2),
GADGET_ID_CUSTOM_ACCESS_LAYER, GADGET_ID_CUSTOM_ACCESS_TYPE,
-1,
NULL, NULL, NULL, "layer of access for this field"
},
{
+ ED_SELECTBOX_ID_CUSTOM_ACCESS_PROTECTED,
-1, ED_ELEMENT_SETTINGS_YPOS(2),
GADGET_ID_CUSTOM_ACCESS_PROTECTED, GADGET_ID_CUSTOM_ACCESS_LAYER,
-1,
NULL, NULL, NULL, "protected access for this field"
},
{
+ ED_SELECTBOX_ID_CUSTOM_ACCESS_DIRECTION,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(3),
GADGET_ID_CUSTOM_ACCESS_DIRECTION, GADGET_ID_NONE,
-1,
NULL, "from", NULL, "access direction for this field"
},
{
+ ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(4),
GADGET_ID_CUSTOM_WALK_TO_ACTION, GADGET_ID_NONE,
-1,
// ---------- element settings: configure 2 (custom elements) ---------------
{
+ ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(1),
GADGET_ID_CUSTOM_MOVE_PATTERN, GADGET_ID_NONE,
-1,
NULL, "can move", NULL, "element move pattern"
},
{
+ ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(2),
GADGET_ID_CUSTOM_MOVE_DIRECTION, GADGET_ID_NONE,
-1,
NULL, "starts moving", NULL, "initial element move direction"
},
{
+ ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(4),
GADGET_ID_CUSTOM_MOVE_STEPSIZE, GADGET_ID_NONE,
-1,
NULL, "move/fall speed", NULL, "speed of element movement"
},
{
+ ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(3),
GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE, GADGET_ID_NONE,
-1,
NULL, " can", ":", "leave behind or change element"
},
{
+ ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS,
-1, ED_ELEMENT_SETTINGS_YPOS(8),
GADGET_ID_CUSTOM_SMASH_TARGETS, GADGET_ID_CUSTOM_CAN_SMASH,
-1,
NULL, "can smash", NULL, "elements that can be smashed"
},
{
+ ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(9),
GADGET_ID_CUSTOM_SLIPPERY_TYPE, GADGET_ID_NONE,
-1,
NULL, "slippery", NULL, "where other elements fall down"
},
{
+ ED_SELECTBOX_ID_CUSTOM_DEADLINESS,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(10),
GADGET_ID_CUSTOM_DEADLINESS, GADGET_ID_NONE,
-1,
NULL, "deadly when", NULL, "deadliness of element"
},
{
+ ED_SELECTBOX_ID_CUSTOM_EXPLOSION_TYPE,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(11),
GADGET_ID_CUSTOM_EXPLOSION_TYPE, GADGET_ID_NONE,
-1,
// ---------- element settings: advanced (custom elements) ------------------
{
+ ED_SELECTBOX_ID_CHANGE_TIME_UNITS,
ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(3),
GADGET_ID_CHANGE_TIME_UNITS, GADGET_ID_NONE,
-1,
NULL, "delay time given in", NULL, "delay time units for change"
},
{
+ ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION,
ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(4),
GADGET_ID_CHANGE_DIRECT_ACTION, GADGET_ID_NONE,
-1,
NULL, NULL, NULL, "type of direct action"
},
{
+ ED_SELECTBOX_ID_CHANGE_OTHER_ACTION,
ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(5),
GADGET_ID_CHANGE_OTHER_ACTION, GADGET_ID_NONE,
-1,
NULL, NULL, "element:", "type of other element action"
},
{
+ ED_SELECTBOX_ID_CHANGE_SIDE,
ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(6),
GADGET_ID_CHANGE_SIDE, GADGET_ID_NONE,
-1,
NULL, "at", "side", "element side triggering change"
},
{
+ ED_SELECTBOX_ID_CHANGE_PLAYER,
ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(7),
GADGET_ID_CHANGE_PLAYER, GADGET_ID_NONE,
-1,
NULL, "player:", " ", "player that causes change"
},
{
+ ED_SELECTBOX_ID_CHANGE_PAGE,
ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(7),
GADGET_ID_CHANGE_PAGE, GADGET_ID_CHANGE_PLAYER,
-1,
NULL, "page:", NULL, "change page that causes change"
},
{
+ ED_SELECTBOX_ID_CHANGE_REPLACE_WHEN,
ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(10),
GADGET_ID_CHANGE_REPLACE_WHEN, GADGET_ID_NONE,
-1,
NULL, "replace when", NULL, "which elements can be replaced"
},
{
+ ED_SELECTBOX_ID_ACTION_TYPE,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(13),
GADGET_ID_ACTION_TYPE, GADGET_ID_NONE,
15,
NULL, NULL, NULL, "action on specified condition"
},
{
+ ED_SELECTBOX_ID_ACTION_MODE,
-1, ED_ELEMENT_SETTINGS_YPOS(13),
GADGET_ID_ACTION_MODE, GADGET_ID_ACTION_TYPE,
-1,
NULL, NULL, NULL, "action operator"
},
{
+ ED_SELECTBOX_ID_ACTION_ARG,
-1, ED_ELEMENT_SETTINGS_YPOS(13),
GADGET_ID_ACTION_ARG, GADGET_ID_ACTION_MODE,
-1,
NULL, NULL, NULL, "action parameter"
},
{
+ ED_SELECTBOX_ID_SELECT_CHANGE_PAGE,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(14),
GADGET_ID_SELECT_CHANGE_PAGE, GADGET_ID_NONE,
3,
// ---------- element settings: configure (group elements) ------------------
{
+ ED_SELECTBOX_ID_GROUP_CHOICE_MODE,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4),
GADGET_ID_GROUP_CHOICE_MODE, GADGET_ID_NONE,
-1,
static struct
{
+ int gadget_type_id;
int x, y;
int gadget_id;
int gadget_id_align;
// ---------- level and editor settings (tabs) ------------------------------
{
+ ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL,
ED_LEVEL_TABS_XPOS(0), ED_LEVEL_TABS_YPOS(0),
- GADGET_ID_LEVELINFO_LEVEL, GADGET_ID_NONE,
+ GADGET_ID_LEVELCONFIG_LEVEL, GADGET_ID_NONE,
8, "Level",
- NULL, NULL, NULL, "Configure level properties"
+ NULL, NULL, NULL, "Configure level settings"
},
{
+ ED_TEXTBUTTON_ID_LEVELCONFIG_LEVELSET,
-1, -1,
- GADGET_ID_LEVELINFO_LEVELSET, GADGET_ID_LEVELINFO_LEVEL,
+ GADGET_ID_LEVELCONFIG_LEVELSET, GADGET_ID_LEVELCONFIG_LEVEL,
8, "Levelset",
NULL, NULL, NULL, "Update this or create new level set"
},
{
+ ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR,
-1, -1,
- GADGET_ID_LEVELINFO_EDITOR, GADGET_ID_LEVELINFO_LEVELSET,
+ GADGET_ID_LEVELCONFIG_EDITOR, GADGET_ID_LEVELCONFIG_LEVELSET,
8, "Editor",
- NULL, NULL, NULL, "Configure editor properties"
+ NULL, NULL, NULL, "Configure editor settings"
+ },
+ {
+ ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE,
+ -1, -1,
+ GADGET_ID_LEVELCONFIG_ENGINE, GADGET_ID_LEVELCONFIG_EDITOR,
+ 8, "Engine",
+ NULL, NULL, NULL, "Configure engine settings"
},
// ---------- element settings (tabs) ---------------------------------------
{
+ ED_TEXTBUTTON_ID_PROPERTIES_INFO,
ED_ELEMENT_TABS_XPOS(0), ED_ELEMENT_TABS_YPOS(0),
GADGET_ID_PROPERTIES_INFO, GADGET_ID_NONE,
8, "Info",
NULL, NULL, NULL, "Show information about element"
},
{
+ ED_TEXTBUTTON_ID_PROPERTIES_CONFIG,
-1, -1,
GADGET_ID_PROPERTIES_CONFIG, GADGET_ID_PROPERTIES_INFO,
8, "Config",
NULL, NULL, NULL, "Configure element properties"
},
{
+ ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_1,
-1, -1,
GADGET_ID_PROPERTIES_CONFIG_1, GADGET_ID_PROPERTIES_INFO,
8, "Config 1",
NULL, NULL, NULL, "Configure element properties, part 1"
},
{
+ ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_2,
-1, -1,
GADGET_ID_PROPERTIES_CONFIG_2, GADGET_ID_PROPERTIES_CONFIG_1,
8, "Config 2",
NULL, NULL, NULL, "Configure element properties, part 2"
},
{
+ ED_TEXTBUTTON_ID_PROPERTIES_CHANGE,
-1, -1,
GADGET_ID_PROPERTIES_CHANGE, GADGET_ID_PROPERTIES_CONFIG_2,
8, "Change",
// ---------- level and editor settings (buttons) ---------------------------
{
+ ED_TEXTBUTTON_ID_SAVE_LEVELSET,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(10),
GADGET_ID_SAVE_LEVELSET, GADGET_ID_LEVELSET_SAVE_MODE,
-1, "Save",
NULL, NULL, NULL, "Update or create level set"
},
{
+ ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_2,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(6),
GADGET_ID_SAVE_AS_TEMPLATE_2, GADGET_ID_NONE,
-1, "Save",
// ---------- element settings (buttons) ------------------------------------
{
+ ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_1,
-1, -1,
GADGET_ID_SAVE_AS_TEMPLATE_1, GADGET_ID_CUSTOM_USE_TEMPLATE_1,
-1, "Save",
"Save current settings as new template"
},
{
+ ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE,
-1, -1,
GADGET_ID_ADD_CHANGE_PAGE, GADGET_ID_PASTE_CHANGE_PAGE,
-1, "New",
NULL, NULL, NULL, "Add new change page"
},
{
+ ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE,
-1, -1,
GADGET_ID_DEL_CHANGE_PAGE, GADGET_ID_ADD_CHANGE_PAGE,
-1, "Delete",
static struct
{
+ int gadget_type_id;
int graphic;
int x, y;
int gadget_id;
} graphicbutton_info[ED_NUM_GRAPHICBUTTONS] =
{
{
+ ED_GRAPHICBUTTON_ID_PREV_CHANGE_PAGE,
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"
},
{
+ ED_GRAPHICBUTTON_ID_NEXT_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"
},
{
+ ED_GRAPHICBUTTON_ID_COPY_CHANGE_PAGE,
IMG_GFX_EDITOR_BUTTON_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"
},
{
+ ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE,
IMG_GFX_EDITOR_BUTTON_CP_PASTE,
-1, ED_ELEMENT_SETTINGS_YPOS(14),
GADGET_ID_PASTE_CHANGE_PAGE, GADGET_ID_COPY_CHANGE_PAGE,
static struct
{
+ int gadget_type_id;
int graphic;
int gadget_id;
char *infotext;
} scrollbutton_info[ED_NUM_SCROLLBUTTONS] =
{
{
+ ED_SCROLLBUTTON_ID_AREA_UP,
IMG_EDITOR_PLAYFIELD_SCROLL_UP,
GADGET_ID_SCROLL_UP,
"scroll level editing area up"
},
{
+ ED_SCROLLBUTTON_ID_AREA_DOWN,
IMG_EDITOR_PLAYFIELD_SCROLL_DOWN,
GADGET_ID_SCROLL_DOWN,
"scroll level editing area down"
},
{
+ ED_SCROLLBUTTON_ID_AREA_LEFT,
IMG_EDITOR_PLAYFIELD_SCROLL_LEFT,
GADGET_ID_SCROLL_LEFT,
"scroll level editing area left"
},
{
+ ED_SCROLLBUTTON_ID_AREA_RIGHT,
IMG_EDITOR_PLAYFIELD_SCROLL_RIGHT,
GADGET_ID_SCROLL_RIGHT,
"scroll level editing area right"
},
{
+ ED_SCROLLBUTTON_ID_LIST_UP,
IMG_EDITOR_PALETTE_SCROLL_UP,
GADGET_ID_SCROLL_LIST_UP,
"scroll element list up ('Page Up')"
},
{
+ ED_SCROLLBUTTON_ID_LIST_DOWN,
IMG_EDITOR_PALETTE_SCROLL_DOWN,
GADGET_ID_SCROLL_LIST_DOWN,
"scroll element list down ('Page Down')"
static struct
{
+ int gadget_type_id;
int graphic;
int type;
int gadget_id;
} scrollbar_info[ED_NUM_SCROLLBARS] =
{
{
+ ED_SCROLLBAR_ID_AREA_HORIZONTAL,
IMG_EDITOR_PLAYFIELD_SCROLLBAR,
GD_TYPE_SCROLLBAR_HORIZONTAL,
GADGET_ID_SCROLL_HORIZONTAL,
"scroll level editing area horizontally"
},
{
+ ED_SCROLLBAR_ID_AREA_VERTICAL,
IMG_EDITOR_PLAYFIELD_SCROLLBAR,
GD_TYPE_SCROLLBAR_VERTICAL,
GADGET_ID_SCROLL_VERTICAL,
"scroll level editing area vertically"
},
{
+ ED_SCROLLBAR_ID_LIST_VERTICAL,
IMG_EDITOR_PALETTE_SCROLLBAR,
GD_TYPE_SCROLLBAR_VERTICAL,
GADGET_ID_SCROLL_LIST_VERTICAL,
static struct
{
+ int gadget_type_id;
int x, y;
int gadget_id;
int gadget_id_align;
} radiobutton_info[ED_NUM_RADIOBUTTONS] =
{
{
+ ED_RADIOBUTTON_ID_PERCENTAGE,
-1, ED_LEVEL_SETTINGS_YPOS(0),
GADGET_ID_RANDOM_PERCENTAGE, GADGET_ID_LEVEL_RANDOM_UP,
RADIO_NR_RANDOM_ELEMENTS,
" ", "percentage", "use percentage for random elements"
},
{
+ ED_RADIOBUTTON_ID_QUANTITY,
-1, ED_LEVEL_SETTINGS_YPOS(0),
GADGET_ID_RANDOM_QUANTITY, GADGET_ID_RANDOM_PERCENTAGE,
RADIO_NR_RANDOM_ELEMENTS,
static struct
{
+ int gadget_type_id;
int x, y;
int gadget_id;
int gadget_id_align;
// ---------- level and editor settings -------------------------------------
{
+ ED_CHECKBUTTON_ID_AUTO_COUNT_GEMS,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(6),
GADGET_ID_AUTO_COUNT_GEMS, GADGET_ID_NONE,
&level.auto_count_gems,
"automatically count gems needed", "set counter to number of gems"
},
{
+ ED_CHECKBUTTON_ID_RATE_TIME_OVER_SCORE,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(11),
GADGET_ID_RATE_TIME_OVER_SCORE, GADGET_ID_NONE,
&level.rate_time_over_score,
"rate time/steps used over score", "sort high scores by playing time/steps"
},
{
+ ED_CHECKBUTTON_ID_USE_LEVELSET_ARTWORK,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(7),
GADGET_ID_USE_LEVELSET_ARTWORK, GADGET_ID_NONE,
&levelset_use_levelset_artwork,
"use current custom artwork", "use custom artwork of this level set"
},
{
+ ED_CHECKBUTTON_ID_COPY_LEVEL_TEMPLATE,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(8),
GADGET_ID_COPY_LEVEL_TEMPLATE, GADGET_ID_NONE,
&levelset_copy_level_template,
"copy current level template", "copy level template of this level set"
},
{
+ ED_CHECKBUTTON_ID_RANDOM_RESTRICTED,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(1),
GADGET_ID_RANDOM_RESTRICTED, GADGET_ID_NONE,
&random_placement_background_restricted,
"restrict random placement to:", "set random placement restriction"
},
{
+ ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_3,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(4),
GADGET_ID_CUSTOM_USE_TEMPLATE_3, GADGET_ID_NONE,
&setup.editor.use_template_for_new_levels,
"use template for new levels", "use template for level properties"
},
{
+ ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2,
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(5),
GADGET_ID_CUSTOM_USE_TEMPLATE_2, GADGET_ID_NONE,
&level.use_custom_template,
NULL, NULL,
"use template for custom elements", "use template for custom properties"
},
+ {
+ ED_CHECKBUTTON_ID_BD_INTERMISSION,
+ ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(0),
+ GADGET_ID_BD_INTERMISSION, GADGET_ID_NONE,
+ &level.bd_intermission,
+ "Boulder Dash game engine settings:", NULL,
+ "intermission", "level is an intermission level"
+ },
+ {
+ ED_CHECKBUTTON_ID_BD_PAL_TIMING,
+ ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(2),
+ GADGET_ID_BD_PAL_TIMING, GADGET_ID_NONE,
+ &level.bd_pal_timing,
+ NULL, NULL,
+ "PAL timing", "use slower timer (like PAL C64)"
+ },
+ {
+ ED_CHECKBUTTON_ID_BD_LINE_SHIFTING_BORDERS,
+ ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(6),
+ GADGET_ID_BD_LINE_SHIFTING_BORDERS, GADGET_ID_NONE,
+ &level.bd_line_shifting_borders,
+ "Compatibility settings:", NULL,
+ "line-shifting borders", "use line-shifting wrap-around"
+ },
+ {
+ ED_CHECKBUTTON_ID_BD_SCAN_FIRST_AND_LAST_ROW,
+ ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(7),
+ GADGET_ID_BD_SCAN_FIRST_AND_LAST_ROW, GADGET_ID_NONE,
+ &level.bd_scan_first_and_last_row,
+ NULL, NULL,
+ "scan first and last row", "also process top/bottom border rows"
+ },
+ {
+ ED_CHECKBUTTON_ID_BD_SHORT_EXPLOSIONS,
+ ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(8),
+ GADGET_ID_BD_SHORT_EXPLOSIONS, GADGET_ID_NONE,
+ &level.bd_short_explosions,
+ NULL, NULL,
+ "short explosions", "use four game cycles for explosions"
+ },
+ {
+ ED_CHECKBUTTON_ID_BD_GRAVITY_AFFECTS_ALL,
+ ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(9),
+ GADGET_ID_BD_GRAVITY_AFFECTS_ALL, GADGET_ID_NONE,
+ &level.bd_gravity_affects_all,
+ NULL, NULL,
+ "gravity change affects everything", "gravity affects all falling objects"
+ },
// ---------- element settings: configure (various elements) ----------------
{
+ ED_CHECKBUTTON_ID_STICK_ELEMENT,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0),
GADGET_ID_STICK_ELEMENT, GADGET_ID_NONE,
&stick_element_properties_window,
"stick this screen to edit content","stick this screen to edit content"
},
{
+ ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
GADGET_ID_EM_SLIPPERY_GEMS, GADGET_ID_NONE,
&level.em_slippery_gems,
"slip down from certain flat walls","use EM/DC style slipping behaviour"
},
{
+ ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
GADGET_ID_EM_EXPLODES_BY_FIRE, GADGET_ID_NONE,
&level.em_explodes_by_fire,
"explodes with chain reaction", "use R'n'D style explosion behaviour"
},
{
+ ED_CHECKBUTTON_ID_USE_SPRING_BUG,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
GADGET_ID_USE_SPRING_BUG, GADGET_ID_NONE,
&level.use_spring_bug,
"use spring pushing bug", "use odd spring pushing behaviour"
},
{
+ ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
GADGET_ID_USE_TIME_ORB_BUG, GADGET_ID_NONE,
&level.use_time_orb_bug,
"use time orb bug", "use odd time orb behaviour"
},
{
+ ED_CHECKBUTTON_ID_USE_LIFE_BUGS,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(5),
GADGET_ID_USE_LIFE_BUGS, GADGET_ID_NONE,
&level.use_life_bugs,
"use buggy element behaviour", "use odd (historic) element behaviour"
},
{
+ ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
GADGET_ID_RANDOM_BALL_CONTENT, GADGET_ID_NONE,
&level.ball_random,
"create single random element", "only create one element from content"
},
{
+ ED_CHECKBUTTON_ID_INITIAL_BALL_ACTIVE,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
GADGET_ID_INITIAL_BALL_ACTIVE, GADGET_ID_NONE,
&level.ball_active_initial,
"magic ball initially activated", "activate magic ball after level start"
},
{
+ ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0),
GADGET_ID_GROW_INTO_DIGGABLE, GADGET_ID_NONE,
&level.grow_into_diggable,
"can grow into anything diggable", "grow into more than just sand"
},
{
+ ED_CHECKBUTTON_ID_SB_FIELDS_NEEDED,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0),
GADGET_ID_SB_FIELDS_NEEDED, GADGET_ID_NONE,
&level.sb_fields_needed,
"all fields need to be filled", "require all SB fields to be solved"
},
{
+ ED_CHECKBUTTON_ID_SB_OBJECTS_NEEDED,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0),
GADGET_ID_SB_OBJECTS_NEEDED, GADGET_ID_NONE,
&level.sb_objects_needed,
"all objects need to be placed", "require all SB objects to be solved"
},
{
+ ED_CHECKBUTTON_ID_AUTO_EXIT_SOKOBAN,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
GADGET_ID_AUTO_EXIT_SOKOBAN, GADGET_ID_NONE,
&level.auto_exit_sokoban,
"exit level if all tasks solved", "automatically finish Sokoban levels"
},
{
+ ED_CHECKBUTTON_ID_SOLVED_BY_ONE_PLAYER,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(14),
GADGET_ID_SOLVED_BY_ONE_PLAYER, GADGET_ID_NONE,
&level.solved_by_one_player,
"only one player must enter exit", "level solved by first player in exit"
},
{
+ ED_CHECKBUTTON_ID_FINISH_DIG_COLLECT,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3),
GADGET_ID_FINISH_DIG_COLLECT, GADGET_ID_NONE,
&level.finish_dig_collect,
"CE action on finished dig/collect", "only finished dig/collect triggers CE"
},
{
+ ED_CHECKBUTTON_ID_KEEP_WALKABLE_CE,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4),
GADGET_ID_KEEP_WALKABLE_CE, GADGET_ID_NONE,
&level.keep_walkable_ce,
"keep walkable CE changed to player", "keep CE changing to player if walkable"
},
{
+ ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9),
GADGET_ID_CONTINUOUS_SNAPPING, GADGET_ID_NONE,
&level.continuous_snapping,
"continuous snapping", "use snapping without releasing key"
},
{
+ ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8),
GADGET_ID_BLOCK_SNAP_FIELD, GADGET_ID_NONE,
&level.block_snap_field,
"block snapped field when snapping", "use snapping delay to show animation"
},
{
+ ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
GADGET_ID_BLOCK_LAST_FIELD, GADGET_ID_NONE,
&level.block_last_field,
"block last field when moving", "player blocks last field when moving"
},
{
+ ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
GADGET_ID_SP_BLOCK_LAST_FIELD, GADGET_ID_NONE,
&level.sp_block_last_field,
"block last field when moving", "player blocks last field when moving"
},
{
+ ED_CHECKBUTTON_ID_INSTANT_RELOCATION,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3),
GADGET_ID_INSTANT_RELOCATION, GADGET_ID_NONE,
&level.instant_relocation,
"no scrolling when relocating", "player gets relocated without delay"
},
{
+ ED_CHECKBUTTON_ID_SHIFTED_RELOCATION,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4),
GADGET_ID_SHIFTED_RELOCATION, GADGET_ID_NONE,
&level.shifted_relocation,
"no centering when relocating", "level not centered after relocation"
},
{
+ ED_CHECKBUTTON_ID_LAZY_RELOCATION,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(5),
GADGET_ID_LAZY_RELOCATION, GADGET_ID_NONE,
&level.lazy_relocation,
"only redraw off-screen relocation","no redraw if relocation target visible"
},
{
+ ED_CHECKBUTTON_ID_USE_START_ELEMENT,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10),
GADGET_ID_USE_START_ELEMENT, GADGET_ID_NONE,
&level.use_start_element[0],
"use level start element:", "start level at this element's position"
},
{
+ ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(11),
GADGET_ID_USE_ARTWORK_ELEMENT, GADGET_ID_NONE,
&level.use_artwork_element[0],
"use artwork from element:", "use player artwork from other element"
},
{
+ ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(12),
GADGET_ID_USE_EXPLOSION_ELEMENT, GADGET_ID_NONE,
&level.use_explosion_element[0],
"use explosion from element:", "use explosion properties from element"
},
{
+ ED_CHECKBUTTON_ID_INITIAL_GRAVITY,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(13),
GADGET_ID_INITIAL_GRAVITY, GADGET_ID_NONE,
&level.initial_player_gravity[0],
"use initial gravity", "set initial player gravity"
},
{
+ ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
GADGET_ID_USE_INITIAL_INVENTORY, GADGET_ID_NONE,
&level.use_initial_inventory[0],
"use initial inventory:", "use collected elements on level start"
},
{
+ ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(6),
GADGET_ID_CAN_PASS_TO_WALKABLE, GADGET_ID_NONE,
&level.can_pass_to_walkable,
"can pass to walkable element", "player can pass to empty or walkable"
},
{
+ ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID,
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],
"can fall into acid (with gravity)","player can fall into acid pool"
},
{
+ ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID,
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],
"can move into acid", "element can move into acid pool"
},
{
+ ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH,
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],
"deadly when colliding with", "element is deadly when hitting player"
},
{
+ ED_CHECKBUTTON_ID_BD_DIAGONAL_MOVEMENTS,
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0),
+ GADGET_ID_BD_DIAGONAL_MOVEMENTS, GADGET_ID_NONE,
+ &level.bd_diagonal_movements,
+ NULL, NULL,
+ "can move diagonally", "player can move diagonally"
+ },
+ {
+ ED_CHECKBUTTON_ID_BD_TOPMOST_PLAYER_ACTIVE,
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
+ GADGET_ID_BD_TOPMOST_PLAYER_ACTIVE, GADGET_ID_NONE,
+ &level.bd_topmost_player_active,
+ NULL, NULL,
+ "topmost player is active", "use first player found on playfield"
+ },
+ {
+ ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET,
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4),
+ GADGET_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET, GADGET_ID_NONE,
+ &level.bd_push_mega_rock_with_sweet,
+ NULL, NULL,
+ "mega rocks pushable with sweet", "push mega rocks after eating sweet"
+ },
+ {
+ ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
GADGET_ID_ENVELOPE_AUTOWRAP, GADGET_ID_NONE,
&level.envelope[0].autowrap,
"auto-wrap", "automatically wrap envelope text"
},
{
+ ED_CHECKBUTTON_ID_ENVELOPE_CENTERED,
-1, ED_ELEMENT_SETTINGS_YPOS(1),
GADGET_ID_ENVELOPE_CENTERED, GADGET_ID_ENVELOPE_AUTOWRAP,
&level.envelope[0].centered,
"centered", "automatically center envelope text"
},
{
+ ED_CHECKBUTTON_ID_MM_LASER_RED,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
GADGET_ID_MM_LASER_RED, GADGET_ID_NONE,
&level.mm_laser_red,
"red", "use red color components in laser"
},
{
+ ED_CHECKBUTTON_ID_MM_LASER_GREEN,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
GADGET_ID_MM_LASER_GREEN, GADGET_ID_NONE,
&level.mm_laser_green,
"green", "use green color components in laser"
},
{
+ ED_CHECKBUTTON_ID_MM_LASER_BLUE,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3),
GADGET_ID_MM_LASER_BLUE, GADGET_ID_NONE,
&level.mm_laser_blue,
"blue", "use blue color components in laser"
},
{
+ ED_CHECKBUTTON_ID_DF_LASER_RED,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
GADGET_ID_DF_LASER_RED, GADGET_ID_NONE,
&level.df_laser_red,
"red", "use red color components in laser"
},
{
+ ED_CHECKBUTTON_ID_DF_LASER_GREEN,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
GADGET_ID_DF_LASER_GREEN, GADGET_ID_NONE,
&level.df_laser_green,
"green", "use green color components in laser"
},
{
+ ED_CHECKBUTTON_ID_DF_LASER_BLUE,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3),
GADGET_ID_DF_LASER_BLUE, GADGET_ID_NONE,
&level.df_laser_blue,
"blue", "use blue color components in laser"
},
{
+ ED_CHECKBUTTON_ID_ROTATE_MM_BALL_CONTENT,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(5),
GADGET_ID_ROTATE_MM_BALL_CONTENT, GADGET_ID_NONE,
&level.rotate_mm_ball_content,
"randomly rotate created content", "randomly rotate newly created content"
},
{
+ ED_CHECKBUTTON_ID_EXPLODE_MM_BALL,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(6),
GADGET_ID_EXPLODE_MM_BALL, GADGET_ID_NONE,
&level.explode_mm_ball,
// ---------- element settings: configure 1 (custom elements) ---------------
{
+ ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
GADGET_ID_CUSTOM_USE_GRAPHIC, GADGET_ID_NONE,
&custom_element.use_gfx_element,
"use graphic of element:", "use existing element graphic"
},
{
+ ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_1,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(14),
GADGET_ID_CUSTOM_USE_TEMPLATE_1, GADGET_ID_NONE,
&level.use_custom_template,
"use template", "use template for custom properties"
},
{
+ ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
GADGET_ID_CUSTOM_ACCESSIBLE, GADGET_ID_NONE,
&custom_element_properties[EP_ACCESSIBLE],
NULL, "player can walk to or pass this field"
},
{
+ ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9),
GADGET_ID_CUSTOM_GRAV_REACHABLE, GADGET_ID_NONE,
&custom_element_properties[EP_GRAVITY_REACHABLE],
"reachable despite gravity", "player can walk/dig despite gravity"
},
{
+ ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE,
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,
"use last CE value after change", "use last CE value after change"
},
{
+ ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT,
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, "player can dig/collect/push element"
},
{
+ ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8),
GADGET_ID_CUSTOM_INDESTRUCTIBLE, GADGET_ID_NONE,
&custom_element_properties[EP_INDESTRUCTIBLE],
// ---------- element settings: configure 2 (custom elements) ---------------
{
+ ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE,
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, "element can move with some pattern"
},
{
+ ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8),
GADGET_ID_CUSTOM_CAN_FALL, GADGET_ID_NONE,
&custom_element_properties[EP_CAN_FALL],
"can fall", "element can fall down"
},
{
+ ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH,
-1, ED_ELEMENT_SETTINGS_YPOS(8),
GADGET_ID_CUSTOM_CAN_SMASH, GADGET_ID_CUSTOM_CAN_FALL,
&custom_element_properties[EP_CAN_SMASH],
NULL, "element can smash other elements"
},
{
+ ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9),
GADGET_ID_CUSTOM_SLIPPERY, GADGET_ID_NONE,
&custom_element_properties[EP_SLIPPERY],
NULL, "other elements can fall down from it"
},
{
+ ED_CHECKBUTTON_ID_CUSTOM_DEADLY,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10),
GADGET_ID_CUSTOM_DEADLY, GADGET_ID_NONE,
&custom_element_properties[EP_DEADLY],
NULL, "element can kill the player"
},
{
+ ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(11),
GADGET_ID_CUSTOM_CAN_EXPLODE, GADGET_ID_NONE,
&custom_element_properties[EP_CAN_EXPLODE],
NULL, "element can explode"
},
{
+ ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(12),
GADGET_ID_CUSTOM_EXPLODE_FIRE, GADGET_ID_NONE,
&custom_element_properties[EP_EXPLODES_BY_FIRE],
"by fire", "element can explode by fire/explosion"
},
{
+ ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH,
-1, ED_ELEMENT_SETTINGS_YPOS(12),
GADGET_ID_CUSTOM_EXPLODE_SMASH, GADGET_ID_CUSTOM_EXPLODE_FIRE,
&custom_element_properties[EP_EXPLODES_SMASHED],
"smashed", "element can explode when smashed"
},
{
+ ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT,
-1, ED_ELEMENT_SETTINGS_YPOS(12),
GADGET_ID_CUSTOM_EXPLODE_IMPACT, GADGET_ID_CUSTOM_EXPLODE_SMASH,
&custom_element_properties[EP_EXPLODES_IMPACT],
// ---------- element settings: advanced (custom elements) ------------------
{
+ ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
GADGET_ID_CUSTOM_CAN_CHANGE, GADGET_ID_NONE,
&custom_element_change.can_change,
"element changes to:", "change element on specified condition"
},
{
+ ED_CHECKBUTTON_ID_CHANGE_DELAY,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(2),
GADGET_ID_CHANGE_DELAY, GADGET_ID_NONE,
&custom_element_change_events[CE_DELAY],
NULL, "element changes after delay"
},
{
+ ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT,
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, "element changes by direct action"
},
{
+ ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT,
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, "element changes by other element"
},
{
+ ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(8),
GADGET_ID_CHANGE_USE_EXPLOSION, GADGET_ID_NONE,
&custom_element_change.explode,
"explode instead of change", "element explodes instead of change"
},
{
+ ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT,
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(9),
GADGET_ID_CHANGE_USE_CONTENT, GADGET_ID_NONE,
&custom_element_change.use_target_content,
"use extended change target:", "element changes to more elements"
},
{
+ ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE,
ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(11),
GADGET_ID_CHANGE_ONLY_COMPLETE, GADGET_ID_NONE,
&custom_element_change.only_if_complete,
"replace all or nothing", "only replace when all can be changed"
},
{
+ ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM,
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, "use percentage for random replace"
},
{
+ ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(13),
GADGET_ID_CHANGE_HAS_ACTION, GADGET_ID_NONE,
&custom_element_change.has_action,
static struct
{
+ int gadget_type_id;
int x, y;
int xoffset, yoffset;
int gadget_id;
// ---------- level playfield content ---------------------------------------
{
+ ED_DRAWING_ID_DRAWING_LEVEL,
0, 0,
0, 0,
GADGET_ID_DRAWING_LEVEL, GADGET_ID_NONE,
// ---------- yam yam content -----------------------------------------------
{
+ ED_DRAWING_ID_YAMYAM_CONTENT_0,
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,
NULL, NULL, NULL, "1", NULL
},
{
+ ED_DRAWING_ID_YAMYAM_CONTENT_1,
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,
NULL, NULL, NULL, "2", NULL
},
{
+ ED_DRAWING_ID_YAMYAM_CONTENT_2,
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,
NULL, NULL, NULL, "3", NULL
},
{
+ ED_DRAWING_ID_YAMYAM_CONTENT_3,
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,
NULL, NULL, NULL, "4", NULL
},
{
+ ED_DRAWING_ID_YAMYAM_CONTENT_4,
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,
NULL, NULL, NULL, "5", NULL
},
{
+ ED_DRAWING_ID_YAMYAM_CONTENT_5,
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,
NULL, NULL, NULL, "6", NULL
},
{
+ ED_DRAWING_ID_YAMYAM_CONTENT_6,
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,
NULL, NULL, NULL, "7", NULL
},
{
+ ED_DRAWING_ID_YAMYAM_CONTENT_7,
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,
// ---------- magic ball content --------------------------------------------
{
+ ED_DRAWING_ID_MAGIC_BALL_CONTENT_0,
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,
NULL, NULL, NULL, "1", NULL
},
{
+ ED_DRAWING_ID_MAGIC_BALL_CONTENT_1,
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,
NULL, NULL, NULL, "2", NULL
},
{
+ ED_DRAWING_ID_MAGIC_BALL_CONTENT_2,
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,
NULL, NULL, NULL, "3", NULL
},
{
+ ED_DRAWING_ID_MAGIC_BALL_CONTENT_3,
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,
NULL, NULL, NULL, "4", NULL
},
{
+ ED_DRAWING_ID_MAGIC_BALL_CONTENT_4,
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,
NULL, NULL, NULL, "5", NULL
},
{
+ ED_DRAWING_ID_MAGIC_BALL_CONTENT_5,
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,
NULL, NULL, NULL, "6", NULL
},
{
+ ED_DRAWING_ID_MAGIC_BALL_CONTENT_6,
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,
NULL, NULL, NULL, "7", NULL
},
{
+ ED_DRAWING_ID_MAGIC_BALL_CONTENT_7,
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,
// ---------- android content -----------------------------------------------
{
+ ED_DRAWING_ID_ANDROID_CONTENT,
ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(6),
ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF,
GADGET_ID_ANDROID_CONTENT, GADGET_ID_NONE,
// ---------- amoeba content ------------------------------------------------
{
+ ED_DRAWING_ID_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 start element -------------------------------------------
{
+ ED_DRAWING_ID_START_ELEMENT,
-1, ED_AREA_1X1_SETTINGS_YPOS(10),
0, ED_AREA_1X1_SETTINGS_YOFF,
GADGET_ID_START_ELEMENT, GADGET_ID_USE_START_ELEMENT,
// ---------- player artwork element ----------------------------------------
{
+ ED_DRAWING_ID_ARTWORK_ELEMENT,
-1, ED_AREA_1X1_SETTINGS_YPOS(11),
0, ED_AREA_1X1_SETTINGS_YOFF,
GADGET_ID_ARTWORK_ELEMENT, GADGET_ID_USE_ARTWORK_ELEMENT,
// ---------- player explosion element --------------------------------------
{
+ ED_DRAWING_ID_EXPLOSION_ELEMENT,
-1, ED_AREA_1X1_SETTINGS_YPOS(12),
0, ED_AREA_1X1_SETTINGS_YOFF,
GADGET_ID_EXPLOSION_ELEMENT, GADGET_ID_USE_EXPLOSION_ELEMENT,
// ---------- player initial inventory --------------------------------------
{
+ ED_DRAWING_ID_INVENTORY_CONTENT,
-1, ED_AREA_1X1_SETTINGS_YPOS(1),
0, ED_AREA_1X1_SETTINGS_YOFF,
GADGET_ID_INVENTORY_CONTENT, GADGET_ID_USE_INITIAL_INVENTORY,
// ---------- gray ball content -----------------------------------------
{
+ ED_DRAWING_ID_MM_BALL_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_MM_BALL_CONTENT, GADGET_ID_NONE,
// ---------- custom graphic ------------------------------------------------
{
+ ED_DRAWING_ID_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,
+ &custom_element.gfx_element_initial, 1, 1,
NULL, NULL, NULL, NULL, "custom graphic element"
},
// ---------- custom content (when exploding) -------------------------------
{
+ ED_DRAWING_ID_CUSTOM_CONTENT,
-1, ED_AREA_3X3_SETTINGS_YPOS(11),
0, ED_AREA_3X3_SETTINGS_YOFF,
GADGET_ID_CUSTOM_CONTENT, GADGET_ID_NONE, // align three rows
// ---------- custom enter and leave element (when moving) ------------------
{
+ ED_DRAWING_ID_CUSTOM_MOVE_ENTER,
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,
"can dig:", " ", NULL, NULL, "element that can be digged/collected"
},
{
+ ED_DRAWING_ID_CUSTOM_MOVE_LEAVE,
-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 change target ------------------------------------------
{
+ ED_DRAWING_ID_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 change content (extended change target) ----------------
{
+ ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT,
-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 change trigger (element causing change) ----------------
{
+ ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER,
-1, ED_AREA_1X1_SETTINGS_YPOS(5),
0, ED_AREA_1X1_SETTINGS_YOFF,
GADGET_ID_CUSTOM_CHANGE_TRIGGER, GADGET_ID_CHANGE_OTHER_ACTION,
// ---------- custom change action (element used for action) ----------------
{
+ ED_DRAWING_ID_CUSTOM_CHANGE_ACTION,
-1, ED_AREA_1X1_SETTINGS_YPOS(13),
0, ED_AREA_1X1_SETTINGS_YOFF,
GADGET_ID_CUSTOM_CHANGE_ACTION, GADGET_ID_ACTION_ARG,
// ---------- group element content -----------------------------------------
{
+ ED_DRAWING_ID_GROUP_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,
// ---------- random background (for random painting) -----------------------
{
+ ED_DRAWING_ID_RANDOM_BACKGROUND,
-1, ED_AREA_1X1_LSETTINGS_YPOS(1),
0, ED_AREA_1X1_LSETTINGS_YOFF,
GADGET_ID_RANDOM_BACKGROUND, GADGET_ID_RANDOM_RESTRICTED,
static int ed_tilesize = DEFAULT_EDITOR_TILESIZE;
static int ed_tilesize_default = DEFAULT_EDITOR_TILESIZE;
-#define IN_ED_FIELD(x,y) IN_FIELD(x, y, ed_fieldx, ed_fieldy)
+#define IN_ED_FIELD(x, y) IN_FIELD(x, y, ed_fieldx, ed_fieldy)
// drawing elements on the three mouse buttons
static int new_element1 = EL_WALL;
static void RedrawDrawingElements(void);
static void DrawDrawingWindowExt(boolean);
static void DrawDrawingWindow(void);
-static void DrawLevelInfoWindow(void);
+static void DrawLevelConfigWindow(void);
static void DrawPropertiesWindow(void);
static void DrawPaletteWindow(void);
static void UpdateCustomElementGraphicGadgets(void);
static int getTabulatorBarWidth(void);
static int getTabulatorBarHeight(void);
static Pixel getTabulatorBarColor(void);
+static int numHiresTiles(int);
static int num_editor_gadgets = 0; // dynamically determined
static int redo_buffer_steps = 0;
static int edit_mode;
-static int edit_mode_levelinfo;
+static int edit_mode_levelconfig;
static int edit_mode_properties;
static int element_shift = 0;
static int num_editor_hl_boulderdash = ARRAY_SIZE(editor_hl_boulderdash);
static int num_editor_el_boulderdash = ARRAY_SIZE(editor_el_boulderdash);
+static int editor_hl_boulderdash_native[] =
+{
+ EL_INTERNAL_CASCADE_BD_NATIVE_ACTIVE,
+ EL_CHAR('B'),
+ EL_CHAR('D'),
+ EL_EMPTY,
+};
+
+static int editor_el_boulderdash_native[] =
+{
+ EL_EMPTY,
+ EL_BD_SAND,
+ EL_BD_ROCK,
+ EL_BD_DIAMOND,
+
+ EL_BD_STEELWALL,
+ EL_BD_WALL,
+ EL_EMPTY,
+ EL_BD_MAGIC_WALL,
+
+ EL_BD_AMOEBA,
+ EL_BD_BUTTERFLY_UP,
+ EL_BD_FIREFLY_UP,
+ EL_BD_EXIT_CLOSED,
+
+ EL_BD_BUTTERFLY_LEFT,
+ EL_BD_FIREFLY_LEFT,
+ EL_BD_BUTTERFLY_RIGHT,
+ EL_BD_FIREFLY_RIGHT,
+
+ EL_BD_INBOX,
+ EL_BD_BUTTERFLY_DOWN,
+ EL_BD_FIREFLY_DOWN,
+ EL_BD_EXIT_OPEN,
+
+ EL_BD_AMOEBA_2,
+ EL_BD_BUTTERFLY_2_UP,
+ EL_BD_FIREFLY_2_UP,
+ EL_EMPTY,
+
+ EL_BD_BUTTERFLY_2_LEFT,
+ EL_BD_FIREFLY_2_LEFT,
+ EL_BD_BUTTERFLY_2_RIGHT,
+ EL_BD_FIREFLY_2_RIGHT,
+
+ EL_EMPTY,
+ EL_BD_BUTTERFLY_2_DOWN,
+ EL_BD_FIREFLY_2_DOWN,
+ EL_EMPTY,
+
+ EL_EMPTY,
+ EL_BD_DRAGONFLY_UP,
+ EL_BD_STONEFLY_UP,
+ EL_EMPTY,
+
+ EL_BD_DRAGONFLY_LEFT,
+ EL_BD_STONEFLY_LEFT,
+ EL_BD_DRAGONFLY_RIGHT,
+ EL_BD_STONEFLY_RIGHT,
+
+ EL_EMPTY,
+ EL_BD_DRAGONFLY_DOWN,
+ EL_BD_STONEFLY_DOWN,
+ EL_EMPTY,
+
+ EL_EMPTY,
+ EL_BD_BITER_UP,
+ EL_BD_COW_UP,
+ EL_EMPTY,
+
+ EL_BD_BITER_LEFT,
+ EL_BD_COW_LEFT,
+ EL_BD_BITER_RIGHT,
+ EL_BD_COW_RIGHT,
+
+ EL_EMPTY,
+ EL_BD_BITER_DOWN,
+ EL_BD_COW_DOWN,
+ EL_EMPTY,
+
+ EL_EMPTY,
+ EL_BD_SAND,
+ EL_BD_SAND_BALL,
+ EL_BD_SAND_LOOSE,
+
+ EL_BD_SAND_SLOPED_UP_LEFT,
+ EL_BD_SAND_SLOPED_UP_RIGHT,
+ EL_BD_WALL_SLOPED_UP_LEFT,
+ EL_BD_WALL_SLOPED_UP_RIGHT,
+
+ EL_BD_SAND_SLOPED_DOWN_LEFT,
+ EL_BD_SAND_SLOPED_DOWN_RIGHT,
+ EL_BD_WALL_SLOPED_DOWN_LEFT,
+ EL_BD_WALL_SLOPED_DOWN_RIGHT,
+
+ EL_BD_FLYING_DIAMOND,
+ EL_BD_FLYING_ROCK,
+ EL_BD_STEELWALL_SLOPED_UP_LEFT,
+ EL_BD_STEELWALL_SLOPED_UP_RIGHT,
+
+ EL_BD_NUT,
+ EL_BD_MEGA_ROCK,
+ EL_BD_STEELWALL_SLOPED_DOWN_LEFT,
+ EL_BD_STEELWALL_SLOPED_DOWN_RIGHT,
+
+ EL_BD_SAND_2,
+ EL_BD_WALL_NON_SLOPED,
+ EL_BD_WALL,
+ EL_BD_MAGIC_WALL,
+
+ EL_BD_EXIT_CLOSED,
+ EL_BD_EXIT_OPEN,
+ EL_BD_INVISIBLE_EXIT_CLOSED,
+ EL_BD_INVISIBLE_EXIT_OPEN,
+
+ EL_BD_STEELWALL,
+ EL_BD_STEELWALL_EXPLODABLE,
+ EL_BD_STEELWALL_DIGGABLE,
+ EL_BD_WALL_DIGGABLE,
+
+ EL_BD_EXPANDABLE_WALL_HORIZONTAL,
+ EL_BD_EXPANDABLE_WALL_VERTICAL,
+ EL_BD_EXPANDABLE_WALL_ANY,
+ EL_BD_CREATURE_SWITCH,
+
+ EL_BD_EXPANDABLE_STEELWALL_HORIZONTAL,
+ EL_BD_EXPANDABLE_STEELWALL_VERTICAL,
+ EL_BD_EXPANDABLE_STEELWALL_ANY,
+ EL_BD_EXPANDABLE_WALL_SWITCH_HORIZONTAL,
+
+ EL_BD_BITER_SWITCH_1,
+ EL_BD_REPLICATOR_SWITCH,
+ EL_BD_CONVEYOR_SWITCH,
+ EL_BD_CONVEYOR_DIR_SWITCH_RIGHT,
+
+ EL_BD_ACID,
+ EL_BD_FALLING_WALL,
+ EL_BD_BOX,
+ EL_BD_TIME_PENALTY,
+
+ EL_BD_GRAVESTONE,
+ EL_BD_ROCK_GLUED,
+ EL_BD_DIAMOND_GLUED,
+ EL_BD_DIAMOND_KEY,
+
+ EL_BD_TRAPPED_DIAMOND,
+ EL_BD_CLOCK,
+ EL_BD_SAND_GLUED,
+ EL_BD_WATER,
+
+ EL_BD_KEY_1,
+ EL_BD_KEY_2,
+ EL_BD_KEY_3,
+ EL_EMPTY,
+
+ EL_BD_WALL_KEY_1,
+ EL_BD_WALL_KEY_2,
+ EL_BD_WALL_KEY_3,
+ EL_BD_WALL_DIAMOND,
+
+ EL_BD_GATE_1,
+ EL_BD_GATE_2,
+ EL_BD_GATE_3,
+ EL_BD_POT,
+
+ EL_BD_GRAVITY_SWITCH,
+ EL_BD_PNEUMATIC_HAMMER,
+ EL_BD_TELEPORTER,
+ EL_BD_SKELETON,
+
+ EL_BD_AMOEBA,
+ EL_BD_AMOEBA_2,
+ EL_BD_REPLICATOR,
+ EL_BD_BLADDER_SPENDER,
+
+ EL_BD_CONVEYOR_LEFT,
+ EL_BD_CONVEYOR_RIGHT,
+ EL_BD_BOMB,
+ EL_BD_NITRO_PACK,
+
+ EL_BD_LAVA,
+ EL_BD_SWEET,
+ EL_BD_VOODOO_DOLL,
+ EL_BD_SLIME,
+
+ EL_BD_BLADDER,
+ EL_BD_WAITING_ROCK,
+ EL_BD_CHASING_ROCK,
+ EL_BD_GHOST,
+
+ EL_BD_PLAYER,
+ EL_BD_PLAYER_WITH_BOMB,
+ EL_BD_PLAYER_GLUED,
+ EL_BD_PLAYER_STIRRING,
+};
+static int *editor_hl_boulderdash_native_ptr = editor_hl_boulderdash_native;
+static int *editor_el_boulderdash_native_ptr = editor_el_boulderdash_native;
+static int num_editor_hl_boulderdash_native = ARRAY_SIZE(editor_hl_boulderdash_native);
+static int num_editor_el_boulderdash_native = ARRAY_SIZE(editor_el_boulderdash_native);
+
static int editor_hl_emerald_mine[] =
{
EL_INTERNAL_CASCADE_EM_ACTIVE,
EL_DF_MIRROR_START,
EL_DF_MIRROR_ROTATING_START,
+ EL_DF_MIRROR_FIXED_START,
EL_DF_CELL,
- EL_DF_MINE,
EL_DF_FIBRE_OPTIC_RED_1,
EL_DF_FIBRE_OPTIC_YELLOW_1,
EL_DF_STEEL_WALL,
EL_DF_WOODEN_WALL,
EL_DF_REFRACTOR,
- EL_EMPTY
+ EL_DF_MINE,
+
+ EL_DF_SLOPE_1,
+ EL_DF_SLOPE_2,
+ EL_DF_SLOPE_3,
+ EL_DF_SLOPE_4
};
static int *editor_hl_deflektor_ptr = editor_hl_deflektor;
static int *editor_el_deflektor_ptr = editor_el_deflektor;
static boolean setup_editor_el_players = TRUE;
static boolean setup_editor_el_boulderdash = TRUE;
+static boolean setup_editor_el_boulderdash_native = TRUE;
static boolean setup_editor_el_emerald_mine = TRUE;
static boolean setup_editor_el_emerald_mine_club = TRUE;
static boolean setup_editor_el_more = TRUE;
&editor_hl_boulderdash_ptr, &num_editor_hl_boulderdash,
&editor_el_boulderdash_ptr, &num_editor_el_boulderdash
},
+ {
+ &setup_editor_el_boulderdash_native,
+ &setup.editor_cascade.el_bd_native,
+ &editor_hl_boulderdash_native_ptr, &num_editor_hl_boulderdash_native,
+ &editor_el_boulderdash_native_ptr, &num_editor_el_boulderdash_native
+ },
{
&setup_editor_el_emerald_mine,
&setup.editor_cascade.el_em,
// find all elements used in current level
for (y = 0; y < lev_fieldy; y++)
+ {
for (x = 0; x < lev_fieldx; x++)
- if (Tile[x][y] < NUM_FILE_ELEMENTS) // should always be true
+ {
+ if (Tile[x][y] >= NUM_FILE_ELEMENTS) // should never happen
+ continue;
+
+ if (IS_MM_WALL(Tile[x][y]))
+ element_found[map_mm_wall_element(Tile[x][y])] = TRUE;
+ else
element_found[Tile[x][y]] = TRUE;
+ }
+ }
*num_elements = 0;
*num_elements = 0;
- // add all elements used in current level (non-custom/group elements)
+ // add all elements used in current level (non-custom/group/empty elements)
for (i = 0; i < NUM_FILE_ELEMENTS; i++)
- if (element_found[i] && !(IS_CUSTOM_ELEMENT(i) || IS_GROUP_ELEMENT(i)))
+ if (element_found[i] && !(IS_CUSTOM_ELEMENT(i) ||
+ IS_GROUP_ELEMENT(i) ||
+ IS_EMPTY_ELEMENT(i)))
(*elements)[(*num_elements)++] = i;
- // add all elements used in current level (custom/group elements)
+ // add all elements used in current level (custom/group/empty elements)
for (i = 0; i < NUM_FILE_ELEMENTS; i++)
- if (element_found[i] && (IS_CUSTOM_ELEMENT(i) || IS_GROUP_ELEMENT(i)))
+ if (element_found[i] && (IS_CUSTOM_ELEMENT(i) ||
+ IS_GROUP_ELEMENT(i) ||
+ IS_EMPTY_ELEMENT(i)))
(*elements)[(*num_elements)++] = i;
while (*num_elements % 4) // pad with empty elements, if needed
setup_editor_el_players = TRUE;
setup_editor_el_boulderdash = TRUE;
+ setup_editor_el_boulderdash_native = TRUE;
setup_editor_el_emerald_mine = TRUE;
setup_editor_el_emerald_mine_club = TRUE;
setup_editor_el_more = TRUE;
{
setup_editor_el_players = FALSE;
setup_editor_el_boulderdash = FALSE;
+ setup_editor_el_boulderdash_native = FALSE;
setup_editor_el_emerald_mine = FALSE;
setup_editor_el_emerald_mine_club = FALSE;
setup_editor_el_more = FALSE;
if (level.game_engine_type == GAME_ENGINE_TYPE_RND)
{
+ setup_editor_el_boulderdash_native = FALSE;
+ setup_editor_el_mirror_magic = FALSE;
+ setup_editor_el_deflektor = FALSE;
+ }
+ else if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+ {
+ setup_editor_el_players = FALSE;
+ setup_editor_el_boulderdash = FALSE;
+ setup_editor_el_emerald_mine = FALSE;
+ setup_editor_el_emerald_mine_club = FALSE;
+ setup_editor_el_more = FALSE;
+ setup_editor_el_sokoban = FALSE;
+ setup_editor_el_supaplex = FALSE;
+ setup_editor_el_diamond_caves = FALSE;
+ setup_editor_el_dx_boulderdash = FALSE;
setup_editor_el_mirror_magic = FALSE;
setup_editor_el_deflektor = FALSE;
+ setup_editor_el_chars = FALSE;
+ setup_editor_el_steel_chars = FALSE;
+
+ setup_editor_el_custom = FALSE;
}
else if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
{
setup_editor_el_boulderdash = FALSE;
+ setup_editor_el_boulderdash_native = FALSE;
setup_editor_el_more = FALSE;
setup_editor_el_sokoban = FALSE;
setup_editor_el_supaplex = FALSE;
{
setup_editor_el_players = FALSE;
setup_editor_el_boulderdash = FALSE;
+ setup_editor_el_boulderdash_native = FALSE;
setup_editor_el_emerald_mine = FALSE;
setup_editor_el_emerald_mine_club = FALSE;
setup_editor_el_more = FALSE;
{
setup_editor_el_players = FALSE;
setup_editor_el_boulderdash = FALSE;
+ setup_editor_el_boulderdash_native = FALSE;
setup_editor_el_emerald_mine = FALSE;
setup_editor_el_emerald_mine_club = FALSE;
setup_editor_el_more = FALSE;
// create toolbox buttons
for (i = 0; i < ED_NUM_CTRL_BUTTONS; i++)
{
+ int type_id = controlbutton_info[i].gadget_id; // same as gadget ID here
int id = controlbutton_info[i].gadget_id;
int type = controlbutton_info[i].gadget_type;
int graphic = controlbutton_info[i].graphic;
int radio_button_nr = RADIO_NR_NONE;
boolean checked = FALSE;
+ if (type_id != i)
+ Fail("'controlbutton_info' structure corrupted at index %d -- please fix", i);
+
if (type == GD_TYPE_RADIO_BUTTON)
{
event_mask = GD_EVENT_PRESSED;
}
gi = CreateGadget(GDI_CUSTOM_ID, id,
- GDI_CUSTOM_TYPE_ID, i,
+ GDI_CUSTOM_TYPE_ID, type_id,
GDI_IMAGE_ID, graphic,
GDI_INFO_TEXT, controlbutton_info[i].infotext,
GDI_X, x,
for (i = 0; i < ED_NUM_SCROLLBUTTONS; i++)
{
int id = scrollbutton_info[i].gadget_id;
+ int type_id = scrollbutton_info[i].gadget_type_id;
int graphic = scrollbutton_info[i].graphic;
struct GraphicInfo *gd = &graphic_info[graphic];
Bitmap *gd_bitmap = gd->bitmap;
int y = scrollbutton_pos[i].y;
unsigned int event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED;
+ if (type_id != i)
+ Fail("'scrollbutton_info' structure corrupted at index %d -- please fix", i);
+
if (id == GADGET_ID_SCROLL_LIST_UP ||
id == GADGET_ID_SCROLL_LIST_DOWN)
{
}
gi = CreateGadget(GDI_CUSTOM_ID, id,
- GDI_CUSTOM_TYPE_ID, i,
+ GDI_CUSTOM_TYPE_ID, type_id,
GDI_IMAGE_ID, graphic,
GDI_INFO_TEXT, scrollbutton_info[i].infotext,
GDI_X, x,
// create buttons for element list
for (i = 0; i < ED_NUM_ELEMENTLIST_BUTTONS; i++)
{
+ int type_id = i;
int id = GADGET_ID_ELEMENTLIST_FIRST + i;
int graphic = IMG_EDITOR_PALETTE_BUTTON;
struct GraphicInfo *gd = &graphic_info[graphic];
deco_ypos = (gd->height - tile_size) / 2;
gi = CreateGadget(GDI_CUSTOM_ID, id,
- GDI_CUSTOM_TYPE_ID, i,
+ GDI_CUSTOM_TYPE_ID, type_id,
GDI_IMAGE_ID, graphic,
GDI_INFO_TEXT, getElementInfoText(element),
GDI_X, x,
for (i = 0; i < ED_NUM_COUNTERBUTTONS; i++)
{
- int j;
+ int type_id = counterbutton_info[i].gadget_type_id;
int x = SX + ED_SETTINGS_X(counterbutton_info[i].x); // down count button
int y = SY + ED_SETTINGS_Y(counterbutton_info[i].y);
+ int j;
+
+ if (type_id != i)
+ Fail("'counterbutton_info' structure corrupted at index %d -- please fix", i);
// determine horizontal position to the right of specified gadget
if (counterbutton_info[i].gadget_id_align != GADGET_ID_NONE)
(j == 0 ? "decrease" : "increase"));
gi = CreateGadget(GDI_CUSTOM_ID, id,
- GDI_CUSTOM_TYPE_ID, i,
+ GDI_CUSTOM_TYPE_ID, type_id,
GDI_IMAGE_ID, graphic,
GDI_INFO_TEXT, infotext,
GDI_X, x,
gd_y2 = gd->src_y + gd->active_yoffset;
gi = CreateGadget(GDI_CUSTOM_ID, id,
- GDI_CUSTOM_TYPE_ID, i,
+ GDI_CUSTOM_TYPE_ID, type_id,
GDI_IMAGE_ID, graphic,
GDI_INFO_TEXT, "enter counter value",
GDI_X, x,
{
struct GadgetInfo *gi;
int id = drawingarea_info[i].gadget_id;
+ int type_id = drawingarea_info[i].gadget_type_id;
int x = SX + ED_AREA_SETTINGS_X(drawingarea_info[i]);
int y = SY + ED_AREA_SETTINGS_Y(drawingarea_info[i]);
int area_xsize = drawingarea_info[i].area_xsize;
GD_EVENT_PRESSED | GD_EVENT_RELEASED | GD_EVENT_MOVING |
GD_EVENT_OFF_BORDERS | GD_EVENT_PIXEL_PRECISE;
+ if (type_id != i)
+ Fail("'drawingarea_info' structure corrupted at index %d -- please fix", i);
+
// 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] +
x += getTextWidthForDrawingArea(drawingarea_info[i].text_left);
gi = CreateGadget(GDI_CUSTOM_ID, id,
- GDI_CUSTOM_TYPE_ID, i,
+ GDI_CUSTOM_TYPE_ID, type_id,
GDI_X, x,
GDI_Y, y,
GDI_TYPE, GD_TYPE_DRAWING_AREA,
unsigned int event_mask = GD_EVENT_TEXT_RETURN | GD_EVENT_TEXT_LEAVING;
char infotext[MAX_OUTPUT_LINESIZE + 1];
int id = textinput_info[i].gadget_id;
+ int type_id = textinput_info[i].gadget_type_id;
int x, y;
+ if (type_id != i)
+ Fail("'textinput_info' structure corrupted at index %d -- please fix", i);
+
if (i == ED_TEXTINPUT_ID_ELEMENT_NAME)
{
int element_border = graphic_info[IMG_EDITOR_ELEMENT_BORDER].border_size;
infotext[max_infotext_len] = '\0';
gi = CreateGadget(GDI_CUSTOM_ID, id,
- GDI_CUSTOM_TYPE_ID, i,
+ GDI_CUSTOM_TYPE_ID, type_id,
GDI_INFO_TEXT, infotext,
GDI_X, SX + x,
GDI_Y, SY + y,
unsigned int event_mask = GD_EVENT_TEXT_LEAVING;
char infotext[MAX_OUTPUT_LINESIZE + 1];
int id = textarea_info[i].gadget_id;
+ int type_id = textarea_info[i].gadget_type_id;
int area_xsize = textarea_info[i].xsize;
int area_ysize = textarea_info[i].ysize;
+ if (type_id != i)
+ Fail("'textarea_info' structure corrupted at index %d -- please fix", i);
+
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_CUSTOM_TYPE_ID, type_id,
GDI_INFO_TEXT, infotext,
GDI_X, SX + ED_SETTINGS_X(textarea_info[i].x),
GDI_Y, SY + ED_SETTINGS_Y(textarea_info[i].y),
struct GadgetInfo *gi;
char infotext[MAX_OUTPUT_LINESIZE + 1];
int id = selectbox_info[i].gadget_id;
+ int type_id = selectbox_info[i].gadget_type_id;
int x = SX + ED_SETTINGS_X(selectbox_info[i].x);
int y = SY + ED_SETTINGS_Y(selectbox_info[i].y);
unsigned int event_mask =
GD_EVENT_RELEASED | GD_EVENT_TEXT_RETURN | GD_EVENT_TEXT_LEAVING;
+ if (type_id != i)
+ Fail("'selectbox_info' structure corrupted at index %d -- please fix", i);
+
if (selectbox_info[i].size == -1) // dynamically determine size
{
// (we cannot use -1 for uninitialized values if we directly compare
infotext[max_infotext_len] = '\0';
gi = CreateGadget(GDI_CUSTOM_ID, id,
- GDI_CUSTOM_TYPE_ID, i,
+ GDI_CUSTOM_TYPE_ID, type_id,
GDI_INFO_TEXT, infotext,
GDI_X, x,
GDI_Y, y,
for (i = 0; i < ED_NUM_TEXTBUTTONS; i++)
{
int id = textbutton_info[i].gadget_id;
+ int type_id = textbutton_info[i].gadget_type_id;
int is_tab_button =
- ((id >= GADGET_ID_LEVELINFO_LEVEL && id <= GADGET_ID_LEVELINFO_EDITOR) ||
+ ((id >= GADGET_ID_LEVELCONFIG_LEVEL && id <= GADGET_ID_LEVELCONFIG_ENGINE) ||
(id >= GADGET_ID_PROPERTIES_INFO && id <= GADGET_ID_PROPERTIES_CHANGE));
int graphic =
(is_tab_button ? IMG_EDITOR_TABBUTTON : IMG_EDITOR_TEXTBUTTON);
int x = SX + ED_SETTINGS_X(textbutton_info[i].x);
int y = SY + ED_SETTINGS_Y(textbutton_info[i].y);
+ if (type_id != i)
+ Fail("'textbutton_info' structure corrupted at index %d -- please fix", i);
+
if (textbutton_info[i].size == -1) // dynamically determine size
textbutton_info[i].size = strlen(textbutton_info[i].text);
x += getTextWidthForGadget(textbutton_info[i].text_left);
gi = CreateGadget(GDI_CUSTOM_ID, id,
- GDI_CUSTOM_TYPE_ID, i,
+ GDI_CUSTOM_TYPE_ID, type_id,
GDI_IMAGE_ID, graphic,
GDI_INFO_TEXT, infotext,
GDI_X, x,
for (i = 0; i < ED_NUM_GRAPHICBUTTONS; i++)
{
int id = graphicbutton_info[i].gadget_id;
+ int type_id = graphicbutton_info[i].gadget_type_id;
int x = SX + ED_SETTINGS_X(graphicbutton_info[i].x);
int y = SY + ED_SETTINGS_Y(graphicbutton_info[i].y);
int graphic = graphicbutton_info[i].graphic;
int gd_y1 = gd->src_y;
int gd_x2 = gd->src_x + gd->pressed_xoffset;
int gd_y2 = gd->src_y + gd->pressed_yoffset;
- unsigned int event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED;
+ unsigned int event_mask = GD_EVENT_RELEASED;
+
+ if (type_id != i)
+ Fail("'graphicbutton_info' structure corrupted at index %d -- please fix", i);
// determine horizontal position to the right of specified gadget
if (graphicbutton_info[i].gadget_id_align != GADGET_ID_NONE)
x += getTextWidthForGadget(graphicbutton_info[i].text_left);
gi = CreateGadget(GDI_CUSTOM_ID, id,
- GDI_CUSTOM_TYPE_ID, i,
+ GDI_CUSTOM_TYPE_ID, type_id,
GDI_IMAGE_ID, graphic,
GDI_INFO_TEXT, graphicbutton_info[i].infotext,
GDI_X, x,
for (i = 0; i < ED_NUM_SCROLLBARS; i++)
{
int id = scrollbar_info[i].gadget_id;
+ int type_id = scrollbar_info[i].gadget_type_id;
int graphic = scrollbar_info[i].graphic;
struct GraphicInfo *gd = &graphic_info[graphic];
int gd_x1 = gd->src_x;
int items_max, items_visible, item_position;
unsigned int event_mask = GD_EVENT_MOVING | GD_EVENT_OFF_BORDERS;
+ if (type_id != i)
+ Fail("'scrollbar_info' structure corrupted at index %d -- please fix", i);
+
if (i == ED_SCROLLBAR_ID_LIST_VERTICAL)
{
items_max = num_editor_elements / ED_ELEMENTLIST_BUTTONS_HORIZ;
}
gi = CreateGadget(GDI_CUSTOM_ID, id,
- GDI_CUSTOM_TYPE_ID, i,
+ GDI_CUSTOM_TYPE_ID, type_id,
GDI_IMAGE_ID, graphic,
GDI_INFO_TEXT, scrollbar_info[i].infotext,
GDI_X, scrollbar_pos[i].x,
for (i = 0; i < ED_NUM_CHECKBUTTONS; i++)
{
int id = checkbutton_info[i].gadget_id;
+ int type_id = checkbutton_info[i].gadget_type_id;
int graphic = (id == GADGET_ID_STICK_ELEMENT ? IMG_EDITOR_STICKYBUTTON :
IMG_EDITOR_CHECKBOX);
struct GraphicInfo *gd = &graphic_info[graphic];
int y = SY + ED_SETTINGS_Y(checkbutton_info[i].y);
unsigned int event_mask = GD_EVENT_PRESSED;
+ if (type_id != i)
+ Fail("'checkbutton_info' structure corrupted at index %d -- please fix", i);
+
// determine horizontal position to the right of specified gadget
if (checkbutton_info[i].gadget_id_align != GADGET_ID_NONE)
x = (right_gadget_border[checkbutton_info[i].gadget_id_align] +
x += getTextWidthForGadget(checkbutton_info[i].text_left);
gi = CreateGadget(GDI_CUSTOM_ID, id,
- GDI_CUSTOM_TYPE_ID, i,
+ GDI_CUSTOM_TYPE_ID, type_id,
GDI_IMAGE_ID, graphic,
GDI_INFO_TEXT, checkbutton_info[i].infotext,
GDI_X, x,
for (i = 0; i < ED_NUM_RADIOBUTTONS; i++)
{
int id = radiobutton_info[i].gadget_id;
+ int type_id = radiobutton_info[i].gadget_type_id;
int x = SX + ED_SETTINGS_X(radiobutton_info[i].x);
int y = SY + ED_SETTINGS_Y(radiobutton_info[i].y);
unsigned int event_mask = GD_EVENT_PRESSED;
+ if (type_id != i)
+ Fail("'radiobutton_info' structure corrupted at index %d -- please fix", i);
+
int checked =
(*radiobutton_info[i].value == radiobutton_info[i].checked_value);
x += getTextWidthForGadget(radiobutton_info[i].text_left);
gi = CreateGadget(GDI_CUSTOM_ID, id,
- GDI_CUSTOM_TYPE_ID, i,
+ GDI_CUSTOM_TYPE_ID, type_id,
GDI_IMAGE_ID, graphic,
GDI_INFO_TEXT, radiobutton_info[i].infotext,
GDI_X, x,
ModifyEditorCounterValue(id, *counterbutton_info[id].value);
- // set position for "value[1,2,3,4]" counter gadgets (score in most cases)
- if (id >= ED_COUNTER_ID_ELEMENT_VALUE1 &&
- id <= ED_COUNTER_ID_ELEMENT_VALUE4)
- {
- ModifyGadget(gi_down, GDI_Y,
- SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
- ModifyGadget(gi_text, GDI_Y,
- SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
- ModifyGadget(gi_up, GDI_Y,
- SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
- }
+ // set position for counter gadgets with dynamically determined position
+ ModifyGadget(gi_down, GDI_Y, SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
+ ModifyGadget(gi_text, GDI_Y, SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
+ ModifyGadget(gi_up, GDI_Y, SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
// vertical position might have changed after setting position above
y = gi_up->y + yoffset;
{
int font_nr = FONT_TEXT_1;
int font_height = getFontHeight(font_nr);
- struct GadgetInfo *gi= level_editor_gadget[graphicbutton_info[id].gadget_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 = (gi->height - font_height) / 2;
// set position for gadgets with dynamically determined position
if (checkbutton_info[id].x != -1) // do not change dynamic positions
- ModifyGadget(gi, GDI_X, SX + ED_SETTINGS_X(checkbutton_info[id].x),GDI_END);
+ ModifyGadget(gi, GDI_X, SX + ED_SETTINGS_X(checkbutton_info[id].x), GDI_END);
ModifyGadget(gi, GDI_Y, SY + ED_SETTINGS_Y(checkbutton_info[id].y), GDI_END);
x_left = gi->x - xoffset_left;
no_vertical_scrollbar = (lev_fieldy <= ed_fieldy);
}
- for (i=ED_SCROLLBUTTON_ID_AREA_FIRST; i <= ED_SCROLLBUTTON_ID_AREA_LAST; i++)
+ for (i = ED_SCROLLBUTTON_ID_AREA_FIRST; i <= ED_SCROLLBUTTON_ID_AREA_LAST; i++)
{
if (((i == ED_SCROLLBUTTON_ID_AREA_LEFT ||
i == ED_SCROLLBUTTON_ID_AREA_RIGHT) &&
MapOrUnmapLevelEditorToolboxCustomGadgets(TRUE);
}
+static void MapLevelEditorToolboxCustomGadgetsIfNeeded(void)
+{
+ if (IS_CUSTOM_ELEMENT(properties_element) ||
+ IS_GROUP_ELEMENT(properties_element) ||
+ IS_EMPTY_ELEMENT(properties_element))
+ MapLevelEditorToolboxCustomGadgets();
+}
+
static void UnmapLevelEditorToolboxCustomGadgets(void)
{
MapOrUnmapLevelEditorToolboxCustomGadgets(FALSE);
RedrawDrawingElements();
}
- if (edit_mode == ED_MODE_INFO)
- DrawLevelInfoWindow();
+ if (edit_mode == ED_MODE_LEVELCONFIG)
+ DrawLevelConfigWindow();
else if (edit_mode == ED_MODE_PROPERTIES)
DrawPropertiesWindow();
else if (edit_mode == ED_MODE_PALETTE)
return TRUE;
}
-static void ModifyLevelInfoForSavingIntoPersonalLevelSet(char *former_name)
+static void ModifyLevelConfigForSavingIntoPersonalLevelSet(char *former_name)
{
static char *filename_levelinfo = NULL, *mod_name = NULL;
FILE *file;
return FALSE;
}
+ else if (IS_EMPTY_ELEMENT(element_old) && !IS_EMPTY_ELEMENT(element_new))
+ {
+ Request("Please choose empty element!", REQ_CONFIRM);
+
+ return FALSE;
+ }
else
{
level.changed = TRUE;
if (level.game_engine_type == game_engine_type_last)
return;
- if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
+ if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+ {
+ new_element1 = EL_BD_WALL;
+ new_element2 = EL_EMPTY;
+ new_element3 = EL_BD_SAND;
+ }
+ else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
{
new_element1 = EL_SP_CHIP_SINGLE;
new_element2 = EL_EMPTY;
// draw all toolbox gadgets to editor doors
MapControlButtons();
+ // when returning from test game to properties page, redraw toolbox gadgets
+ if (edit_mode == ED_MODE_PROPERTIES)
+ {
+ UnmapLevelEditorToolboxDrawingGadgets();
+ UnmapLevelEditorToolboxCustomGadgets();
+
+ MapLevelEditorToolboxCustomGadgetsIfNeeded();
+ }
+
// draw all palette gadgets to editor doors
ModifyEditorElementList();
RedrawDrawingElements();
else
{
edit_mode = ED_MODE_DRAWING;
- edit_mode_levelinfo = ED_MODE_LEVELINFO_LEVEL;
+ edit_mode_levelconfig = ED_MODE_LEVELCONFIG_LEVEL;
edit_mode_properties = ED_MODE_PROPERTIES_INFO;
ResetUndoBuffer();
if (suppressBorderElement())
{
- ed_xsize = max_ed_fieldx;
- ed_ysize = max_ed_fieldy;
+ ed_xsize = lev_fieldx;
+ ed_ysize = lev_fieldy;
}
// check if we need any scrollbars
static Pixel getTabulatorBarColor(void)
{
- struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_LEVELINFO_LEVEL];
+ struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_LEVELCONFIG_LEVEL];
struct GadgetDesign *gd = &gd_gi1->alt_design[GD_BUTTON_UNPRESSED];
int gd_x = gd->x + gd_gi1->border.width / 2;
int gd_y = gd->y + gd_gi1->height - 1;
return GetPixel(gd->bitmap, gd_x, gd_y);
}
-static void DrawLevelInfoTabulatorGadgets(void)
+static void DrawLevelConfigTabulatorGadgets(void)
{
- struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_LEVELINFO_LEVEL];
+ struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_LEVELCONFIG_LEVEL];
Pixel tab_color = getTabulatorBarColor();
- int id_first = ED_TAB_BUTTON_ID_LEVELINFO_FIRST;
- int id_last = ED_TAB_BUTTON_ID_LEVELINFO_LAST;
+ int id_first = ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL;
+ int id_last = ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR;
int i;
+ // draw additional "engine" tabulator when using native BD engine
+ if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+ id_last = ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE;
+
for (i = id_first; i <= id_last; i++)
{
int gadget_id = textbutton_info[i].gadget_id;
struct GadgetInfo *gi = level_editor_gadget[gadget_id];
- boolean active = (i != edit_mode_levelinfo);
+ boolean active = (i != edit_mode_levelconfig);
// draw background line below tabulator button
ClearRectangleOnBackground(drawto, gi->x, gi->y + gi->height, gi->width, 1);
TRUE, FALSE, FALSE);
}
-static void DrawLevelInfoLevel(void)
+static void DrawLevelConfigLevel(void)
{
int i;
return leveldir_current->subdir;
}
-static void DrawLevelInfoLevelSet_DirectoryInfo(void)
+static void DrawLevelConfigLevelSet_DirectoryInfo(void)
{
char *directory_text = "Level set directory:";
char *directory_name = getLevelSubdirFromSaveMode(levelset_save_mode);
PrintInfoText(directory_name, font2_nr, x, y);
}
-static void DrawLevelInfoLevelSet(void)
+static void DrawLevelConfigLevelSet(void)
{
boolean artwork_exists = checkIfCustomArtworkExistsForCurrentLevelSet();
boolean template_exists = fileExists(getLocalLevelTemplateFilename());
MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_LEVELSET);
// draw info text
- DrawLevelInfoLevelSet_DirectoryInfo();
+ DrawLevelConfigLevelSet_DirectoryInfo();
}
-static void DrawLevelInfoEditor(void)
+static void DrawLevelConfigEditor(void)
{
int i;
MapCounterButtons(i);
// draw checkbutton gadgets
- for (i=ED_CHECKBUTTON_ID_EDITOR_FIRST; i<= ED_CHECKBUTTON_ID_EDITOR_LAST; i++)
+ for (i = ED_CHECKBUTTON_ID_EDITOR_FIRST; i <= ED_CHECKBUTTON_ID_EDITOR_LAST; i++)
MapCheckbuttonGadget(i);
// draw radiobutton gadgets
- for (i=ED_RADIOBUTTON_ID_EDITOR_FIRST; i<= ED_RADIOBUTTON_ID_EDITOR_LAST; i++)
+ for (i = ED_RADIOBUTTON_ID_EDITOR_FIRST; i <= ED_RADIOBUTTON_ID_EDITOR_LAST; i++)
MapRadiobuttonGadget(i);
// draw drawing area
MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_2);
}
-static void DrawLevelInfoWindow(void)
+static void DrawLevelConfigEngine(void)
+{
+ int i;
+
+ // draw counter gadgets
+ if (level.bd_scheduling_type == GD_SCHEDULING_MILLISECONDS)
+ {
+ MapCounterButtons(ED_COUNTER_ID_BD_CYCLE_DELAY_MS);
+ MapCounterButtons(ED_COUNTER_ID_BD_HATCHING_DELAY_CYCLES);
+ }
+ else
+ {
+ MapCounterButtons(ED_COUNTER_ID_BD_CYCLE_DELAY_C64);
+ MapCounterButtons(ED_COUNTER_ID_BD_HATCHING_DELAY_SECONDS);
+ }
+
+ // draw checkbutton gadgets
+ for (i = ED_CHECKBUTTON_ID_ENGINE_FIRST; i <= ED_CHECKBUTTON_ID_ENGINE_LAST; i++)
+ MapCheckbuttonGadget(i);
+
+ // draw selectbox gadgets
+ for (i = ED_SELECTBOX_ID_ENGINE_FIRST; i <= ED_SELECTBOX_ID_ENGINE_LAST; i++)
+ MapSelectboxGadget(i);
+}
+
+static void DrawLevelConfigWindow(void)
{
char *text = "Global Settings";
int font_nr = FONT_TITLE_1;
DrawText(sx, sy, text, font_nr);
- DrawLevelInfoTabulatorGadgets();
+ DrawLevelConfigTabulatorGadgets();
- if (edit_mode_levelinfo == ED_MODE_LEVELINFO_LEVEL)
- DrawLevelInfoLevel();
- else if (edit_mode_levelinfo == ED_MODE_LEVELINFO_LEVELSET)
- DrawLevelInfoLevelSet();
- else if (edit_mode_levelinfo == ED_MODE_LEVELINFO_EDITOR)
- DrawLevelInfoEditor();
+ if (edit_mode_levelconfig == ED_MODE_LEVELCONFIG_LEVEL)
+ DrawLevelConfigLevel();
+ else if (edit_mode_levelconfig == ED_MODE_LEVELCONFIG_LEVELSET)
+ DrawLevelConfigLevelSet();
+ else if (edit_mode_levelconfig == ED_MODE_LEVELCONFIG_EDITOR)
+ DrawLevelConfigEditor();
+ else if (edit_mode_levelconfig == ED_MODE_LEVELCONFIG_ENGINE)
+ DrawLevelConfigEngine();
}
static void DrawCustomContentArea(void)
char *no_description_text = "No description available.";
char *none_text = "None";
float percentage;
- int num_elements_in_level;
- int num_similar_in_level;
+ int num_elements_in_level = 0;
+ int num_similar_in_level = 0;
+ int num_hires_tiles_in_level = 0;
int num_standard_properties = 0;
int font1_nr = FONT_TEXT_1;
int font2_nr = FONT_TEXT_2;
// ----- print number of elements / percentage of this element in level
- num_elements_in_level = 0;
- for (y = 0; y < lev_fieldy; y++)
+ for (y = 0; y < lev_fieldy; y++)
+ {
for (x = 0; x < lev_fieldx; x++)
+ {
if (Tile[x][y] == properties_element)
+ {
num_elements_in_level++;
+ }
+ else if (IS_MM_WALL(Tile[x][y]) &&
+ map_mm_wall_element(Tile[x][y]) == properties_element)
+ {
+ num_hires_tiles_in_level += numHiresTiles(Tile[x][y]);
+ }
+ }
+ }
+
percentage = num_elements_in_level * 100.0 / (lev_fieldx * lev_fieldy);
DrawTextS(xpos, ypos, font1_nr, num_elements_text);
- if (num_elements_in_level > 0)
+ if (num_hires_tiles_in_level > 0)
+ DrawTextF(xpos + num_elements_text_len, ypos + font2_yoffset, font2_nr,
+ "%d wall tiles", num_hires_tiles_in_level);
+ else if (num_elements_in_level > 0)
DrawTextF(xpos + num_elements_text_len, ypos + font2_yoffset, font2_nr,
"%d (%.2f %%)", num_elements_in_level, percentage);
else
// ----- print number of similar elements / percentage of them in level
- num_similar_in_level = 0;
for (y = 0; y < lev_fieldy; y++)
+ {
for (x = 0; x < lev_fieldx; x++)
+ {
if (strEqual(element_info[Tile[x][y]].class_name,
element_info[properties_element].class_name))
+ {
num_similar_in_level++;
+ }
+ }
+ }
if (num_similar_in_level != num_elements_in_level)
{
}
#define TEXT_COLLECTING "Score for collecting"
+#define TEXT_COLLECTING_EXTRA "Score for extra diamonds"
#define TEXT_SMASHING "Score for smashing"
#define TEXT_SLURPING "Score for slurping robot"
#define TEXT_CRACKING "Score for cracking"
char *text;
} elements_with_counter[] =
{
- { EL_EMERALD, &level.score[SC_EMERALD], TEXT_COLLECTING },
- { EL_BD_DIAMOND, &level.score[SC_EMERALD], TEXT_COLLECTING },
- { EL_EMERALD_YELLOW, &level.score[SC_EMERALD], TEXT_COLLECTING },
- { EL_EMERALD_RED, &level.score[SC_EMERALD], TEXT_COLLECTING },
- { EL_EMERALD_PURPLE, &level.score[SC_EMERALD], TEXT_COLLECTING },
- { EL_SP_INFOTRON, &level.score[SC_EMERALD], TEXT_COLLECTING },
- { EL_DIAMOND, &level.score[SC_DIAMOND], TEXT_COLLECTING },
- { EL_CRYSTAL, &level.score[SC_CRYSTAL], TEXT_COLLECTING },
- { EL_PEARL, &level.score[SC_PEARL], TEXT_COLLECTING },
- { EL_BUG, &level.score[SC_BUG], TEXT_SMASHING },
- { EL_BUG_RIGHT, &level.score[SC_BUG], TEXT_SMASHING },
- { EL_BUG_UP, &level.score[SC_BUG], TEXT_SMASHING },
- { EL_BUG_LEFT, &level.score[SC_BUG], TEXT_SMASHING },
- { EL_BUG_DOWN, &level.score[SC_BUG], TEXT_SMASHING },
- { EL_BD_BUTTERFLY, &level.score[SC_BUG], TEXT_SMASHING },
- { EL_BD_BUTTERFLY_RIGHT,&level.score[SC_BUG], TEXT_SMASHING },
- { EL_BD_BUTTERFLY_UP, &level.score[SC_BUG], TEXT_SMASHING },
- { EL_BD_BUTTERFLY_LEFT, &level.score[SC_BUG], TEXT_SMASHING },
- { EL_BD_BUTTERFLY_DOWN, &level.score[SC_BUG], TEXT_SMASHING },
- { EL_SP_ELECTRON, &level.score[SC_BUG], TEXT_SMASHING },
- { EL_SPACESHIP, &level.score[SC_SPACESHIP], TEXT_SMASHING },
- { EL_SPACESHIP_RIGHT, &level.score[SC_SPACESHIP], TEXT_SMASHING },
- { EL_SPACESHIP_UP, &level.score[SC_SPACESHIP], TEXT_SMASHING },
- { EL_SPACESHIP_LEFT, &level.score[SC_SPACESHIP], TEXT_SMASHING },
- { EL_SPACESHIP_DOWN, &level.score[SC_SPACESHIP], TEXT_SMASHING },
- { EL_BD_FIREFLY, &level.score[SC_SPACESHIP], TEXT_SMASHING },
- { EL_BD_FIREFLY_RIGHT,&level.score[SC_SPACESHIP], TEXT_SMASHING },
- { EL_BD_FIREFLY_UP, &level.score[SC_SPACESHIP], TEXT_SMASHING },
- { EL_BD_FIREFLY_LEFT, &level.score[SC_SPACESHIP], TEXT_SMASHING },
- { EL_BD_FIREFLY_DOWN, &level.score[SC_SPACESHIP], TEXT_SMASHING },
- { EL_SP_SNIKSNAK, &level.score[SC_SPACESHIP], TEXT_SMASHING },
- { EL_YAMYAM, &level.score[SC_YAMYAM], TEXT_SMASHING },
- { EL_YAMYAM_LEFT, &level.score[SC_YAMYAM], TEXT_SMASHING },
- { EL_YAMYAM_RIGHT, &level.score[SC_YAMYAM], TEXT_SMASHING },
- { EL_YAMYAM_UP, &level.score[SC_YAMYAM], TEXT_SMASHING },
- { EL_YAMYAM_DOWN, &level.score[SC_YAMYAM], TEXT_SMASHING },
- { EL_DARK_YAMYAM, &level.score[SC_YAMYAM], TEXT_SMASHING },
- { EL_ROBOT, &level.score[SC_ROBOT], TEXT_SMASHING },
- { EL_PACMAN, &level.score[SC_PACMAN], TEXT_SMASHING },
- { EL_PACMAN_RIGHT, &level.score[SC_PACMAN], TEXT_SMASHING },
- { EL_PACMAN_UP, &level.score[SC_PACMAN], TEXT_SMASHING },
- { EL_PACMAN_LEFT, &level.score[SC_PACMAN], TEXT_SMASHING },
- { EL_PACMAN_DOWN, &level.score[SC_PACMAN], TEXT_SMASHING },
- { EL_NUT, &level.score[SC_NUT], TEXT_CRACKING },
- { EL_DYNAMITE, &level.score[SC_DYNAMITE], TEXT_COLLECTING },
- { EL_EM_DYNAMITE, &level.score[SC_DYNAMITE], TEXT_COLLECTING },
- { EL_DYNABOMB_INCREASE_NUMBER,&level.score[SC_DYNAMITE],TEXT_COLLECTING },
- { EL_DYNABOMB_INCREASE_SIZE, &level.score[SC_DYNAMITE],TEXT_COLLECTING },
- { EL_DYNABOMB_INCREASE_POWER, &level.score[SC_DYNAMITE],TEXT_COLLECTING },
- { EL_SHIELD_NORMAL, &level.score[SC_SHIELD], TEXT_COLLECTING },
- { EL_SHIELD_DEADLY, &level.score[SC_SHIELD], TEXT_COLLECTING },
- { EL_EXTRA_TIME, &level.extra_time_score, TEXT_COLLECTING },
- { EL_KEY_1, &level.score[SC_KEY], TEXT_COLLECTING },
- { EL_KEY_2, &level.score[SC_KEY], TEXT_COLLECTING },
- { EL_KEY_3, &level.score[SC_KEY], TEXT_COLLECTING },
- { EL_KEY_4, &level.score[SC_KEY], TEXT_COLLECTING },
- { EL_EM_KEY_1, &level.score[SC_KEY], TEXT_COLLECTING },
- { EL_EM_KEY_2, &level.score[SC_KEY], TEXT_COLLECTING },
- { EL_EM_KEY_3, &level.score[SC_KEY], TEXT_COLLECTING },
- { EL_EM_KEY_4, &level.score[SC_KEY], TEXT_COLLECTING },
- { EL_EMC_KEY_5, &level.score[SC_KEY], TEXT_COLLECTING },
- { EL_EMC_KEY_6, &level.score[SC_KEY], TEXT_COLLECTING },
- { EL_EMC_KEY_7, &level.score[SC_KEY], TEXT_COLLECTING },
- { EL_EMC_KEY_8, &level.score[SC_KEY], TEXT_COLLECTING },
- { EL_DC_KEY_WHITE, &level.score[SC_KEY], TEXT_COLLECTING },
- { EL_MM_KETTLE, &level.score[SC_EMERALD], TEXT_COLLECTING },
- { EL_DF_CELL, &level.score[SC_EMERALD], TEXT_COLLECTING },
- { EL_MM_KEY, &level.score[SC_KEY], TEXT_COLLECTING },
- { EL_MM_LIGHTBALL, &level.score[SC_ELEM_BONUS], TEXT_COLLECTING },
- { EL_MM_PACMAN, &level.score[SC_PACMAN], TEXT_SMASHING },
- { EL_MM_PACMAN_RIGHT, &level.score[SC_PACMAN], TEXT_SMASHING },
- { EL_MM_PACMAN_UP, &level.score[SC_PACMAN], TEXT_SMASHING },
- { EL_MM_PACMAN_LEFT, &level.score[SC_PACMAN], TEXT_SMASHING },
- { EL_MM_PACMAN_DOWN, &level.score[SC_PACMAN], TEXT_SMASHING },
- { EL_AMOEBA_WET, &level.amoeba_speed, TEXT_AMOEBA_SPEED },
- { EL_AMOEBA_DRY, &level.amoeba_speed, TEXT_AMOEBA_SPEED },
- { EL_AMOEBA_FULL, &level.amoeba_speed, TEXT_AMOEBA_SPEED },
- { EL_BD_AMOEBA, &level.amoeba_speed, TEXT_AMOEBA_SPEED },
- { EL_EMC_DRIPPER, &level.amoeba_speed, TEXT_AMOEBA_SPEED },
- { EL_MAGIC_WALL, &level.time_magic_wall, TEXT_DURATION },
- { EL_BD_MAGIC_WALL, &level.time_magic_wall, TEXT_DURATION },
- { EL_DC_MAGIC_WALL, &level.time_magic_wall, TEXT_DURATION },
- { EL_ROBOT_WHEEL, &level.time_wheel, TEXT_DURATION },
-
- { EL_TIMEGATE_SWITCH, &level.time_timegate, TEXT_DURATION },
- { EL_DC_TIMEGATE_SWITCH,&level.time_timegate, TEXT_DURATION },
- { EL_LIGHT_SWITCH, &level.time_light, TEXT_DURATION },
- { EL_LIGHT_SWITCH_ACTIVE, &level.time_light, TEXT_DURATION },
- { EL_SHIELD_NORMAL, &level.shield_normal_time, TEXT_DURATION },
- { EL_SHIELD_DEADLY, &level.shield_deadly_time, TEXT_DURATION },
- { EL_EXTRA_TIME, &level.extra_time, TEXT_TIME_BONUS },
- { EL_TIME_ORB_FULL, &level.time_orb_time, TEXT_TIME_BONUS },
- { EL_GAME_OF_LIFE, &level.game_of_life[0], TEXT_GAME_OF_LIFE_1 },
- { EL_GAME_OF_LIFE, &level.game_of_life[1], TEXT_GAME_OF_LIFE_2 },
- { EL_GAME_OF_LIFE, &level.game_of_life[2], TEXT_GAME_OF_LIFE_3 },
- { EL_GAME_OF_LIFE, &level.game_of_life[3], TEXT_GAME_OF_LIFE_4 },
- { EL_BIOMAZE, &level.biomaze[0], TEXT_GAME_OF_LIFE_1 },
- { EL_BIOMAZE, &level.biomaze[1], TEXT_GAME_OF_LIFE_2 },
- { EL_BIOMAZE, &level.biomaze[2], TEXT_GAME_OF_LIFE_3 },
- { EL_BIOMAZE, &level.biomaze[3], TEXT_GAME_OF_LIFE_4 },
-
- { EL_EMC_ANDROID, &level.android_move_time, TEXT_MOVE_SPEED },
- { EL_EMC_ANDROID, &level.android_clone_time, TEXT_CLONE_SPEED },
- { EL_EMC_MAGIC_BALL, &level.ball_time, TEXT_BALL_DELAY },
- { EL_EMC_LENSES, &level.lenses_score, TEXT_COLLECTING },
- { EL_EMC_MAGNIFIER, &level.magnify_score, TEXT_COLLECTING },
- { EL_SPRING, &level.slurp_score, TEXT_SLURPING },
- { EL_SPRING_LEFT, &level.slurp_score, TEXT_SLURPING },
- { EL_SPRING_RIGHT, &level.slurp_score, TEXT_SLURPING },
- { EL_EMC_LENSES, &level.lenses_time, TEXT_DURATION },
- { EL_EMC_MAGNIFIER, &level.magnify_time, TEXT_DURATION },
- { EL_MM_FUSE_ACTIVE, &level.mm_time_fuse, TEXT_DELAY_OFF },
- { EL_MM_BOMB, &level.mm_time_bomb, TEXT_DELAY_EXPLODING },
- { EL_MM_GRAY_BALL, &level.mm_time_ball, TEXT_DELAY_CHANGING },
- { EL_MM_STEEL_BLOCK, &level.mm_time_block, TEXT_DELAY_MOVING },
- { EL_MM_WOODEN_BLOCK, &level.mm_time_block, TEXT_DELAY_MOVING },
-
- { -1, NULL, NULL }
+ { EL_EMERALD, &level.score[SC_EMERALD], TEXT_COLLECTING },
+ { EL_BD_DIAMOND, &level.score[SC_EMERALD], TEXT_COLLECTING },
+ { EL_BD_DIAMOND, &level.score[SC_DIAMOND_EXTRA], TEXT_COLLECTING_EXTRA },
+ { EL_EMERALD_YELLOW, &level.score[SC_EMERALD], TEXT_COLLECTING },
+ { EL_EMERALD_RED, &level.score[SC_EMERALD], TEXT_COLLECTING },
+ { EL_EMERALD_PURPLE, &level.score[SC_EMERALD], TEXT_COLLECTING },
+ { EL_SP_INFOTRON, &level.score[SC_EMERALD], TEXT_COLLECTING },
+ { EL_DIAMOND, &level.score[SC_DIAMOND], TEXT_COLLECTING },
+ { EL_CRYSTAL, &level.score[SC_CRYSTAL], TEXT_COLLECTING },
+ { EL_PEARL, &level.score[SC_PEARL], TEXT_COLLECTING },
+ { EL_BUG, &level.score[SC_BUG], TEXT_SMASHING },
+ { EL_BUG_RIGHT, &level.score[SC_BUG], TEXT_SMASHING },
+ { EL_BUG_UP, &level.score[SC_BUG], TEXT_SMASHING },
+ { EL_BUG_LEFT, &level.score[SC_BUG], TEXT_SMASHING },
+ { EL_BUG_DOWN, &level.score[SC_BUG], TEXT_SMASHING },
+ { EL_BD_BUTTERFLY, &level.score[SC_BUG], TEXT_SMASHING },
+ { EL_BD_BUTTERFLY_RIGHT, &level.score[SC_BUG], TEXT_SMASHING },
+ { EL_BD_BUTTERFLY_UP, &level.score[SC_BUG], TEXT_SMASHING },
+ { EL_BD_BUTTERFLY_LEFT, &level.score[SC_BUG], TEXT_SMASHING },
+ { EL_BD_BUTTERFLY_DOWN, &level.score[SC_BUG], TEXT_SMASHING },
+ { EL_SP_ELECTRON, &level.score[SC_BUG], TEXT_SMASHING },
+ { EL_SPACESHIP, &level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_SPACESHIP_RIGHT, &level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_SPACESHIP_UP, &level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_SPACESHIP_LEFT, &level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_SPACESHIP_DOWN, &level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_BD_FIREFLY, &level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_BD_FIREFLY_RIGHT, &level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_BD_FIREFLY_UP, &level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_BD_FIREFLY_LEFT, &level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_BD_FIREFLY_DOWN, &level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_SP_SNIKSNAK, &level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_YAMYAM, &level.score[SC_YAMYAM], TEXT_SMASHING },
+ { EL_YAMYAM_LEFT, &level.score[SC_YAMYAM], TEXT_SMASHING },
+ { EL_YAMYAM_RIGHT, &level.score[SC_YAMYAM], TEXT_SMASHING },
+ { EL_YAMYAM_UP, &level.score[SC_YAMYAM], TEXT_SMASHING },
+ { EL_YAMYAM_DOWN, &level.score[SC_YAMYAM], TEXT_SMASHING },
+ { EL_DARK_YAMYAM, &level.score[SC_YAMYAM], TEXT_SMASHING },
+ { EL_ROBOT, &level.score[SC_ROBOT], TEXT_SMASHING },
+ { EL_PACMAN, &level.score[SC_PACMAN], TEXT_SMASHING },
+ { EL_PACMAN_RIGHT, &level.score[SC_PACMAN], TEXT_SMASHING },
+ { EL_PACMAN_UP, &level.score[SC_PACMAN], TEXT_SMASHING },
+ { EL_PACMAN_LEFT, &level.score[SC_PACMAN], TEXT_SMASHING },
+ { EL_PACMAN_DOWN, &level.score[SC_PACMAN], TEXT_SMASHING },
+ { EL_NUT, &level.score[SC_NUT], TEXT_CRACKING },
+ { EL_DYNAMITE, &level.score[SC_DYNAMITE], TEXT_COLLECTING },
+ { EL_EM_DYNAMITE, &level.score[SC_DYNAMITE], TEXT_COLLECTING },
+ { EL_DYNABOMB_INCREASE_NUMBER,&level.score[SC_DYNAMITE], TEXT_COLLECTING },
+ { EL_DYNABOMB_INCREASE_SIZE, &level.score[SC_DYNAMITE], TEXT_COLLECTING },
+ { EL_DYNABOMB_INCREASE_POWER, &level.score[SC_DYNAMITE], TEXT_COLLECTING },
+ { EL_SHIELD_NORMAL, &level.score[SC_SHIELD], TEXT_COLLECTING },
+ { EL_SHIELD_DEADLY, &level.score[SC_SHIELD], TEXT_COLLECTING },
+ { EL_EXTRA_TIME, &level.extra_time_score, TEXT_COLLECTING },
+ { EL_KEY_1, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_KEY_2, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_KEY_3, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_KEY_4, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_EM_KEY_1, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_EM_KEY_2, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_EM_KEY_3, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_EM_KEY_4, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_EMC_KEY_5, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_EMC_KEY_6, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_EMC_KEY_7, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_EMC_KEY_8, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_DC_KEY_WHITE, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_MM_KETTLE, &level.score[SC_EMERALD], TEXT_COLLECTING },
+ { EL_DF_CELL, &level.score[SC_EMERALD], TEXT_COLLECTING },
+ { EL_MM_KEY, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_MM_LIGHTBALL, &level.score[SC_ELEM_BONUS], TEXT_COLLECTING },
+ { EL_MM_PACMAN, &level.score[SC_PACMAN], TEXT_SMASHING },
+ { EL_MM_PACMAN_RIGHT, &level.score[SC_PACMAN], TEXT_SMASHING },
+ { EL_MM_PACMAN_UP, &level.score[SC_PACMAN], TEXT_SMASHING },
+ { EL_MM_PACMAN_LEFT, &level.score[SC_PACMAN], TEXT_SMASHING },
+ { EL_MM_PACMAN_DOWN, &level.score[SC_PACMAN], TEXT_SMASHING },
+ { EL_AMOEBA_WET, &level.amoeba_speed, TEXT_AMOEBA_SPEED },
+ { EL_AMOEBA_DRY, &level.amoeba_speed, TEXT_AMOEBA_SPEED },
+ { EL_AMOEBA_FULL, &level.amoeba_speed, TEXT_AMOEBA_SPEED },
+ { EL_BD_AMOEBA, &level.amoeba_speed, TEXT_AMOEBA_SPEED },
+ { EL_EMC_DRIPPER, &level.amoeba_speed, TEXT_AMOEBA_SPEED },
+ { EL_MAGIC_WALL, &level.time_magic_wall, TEXT_DURATION },
+ { EL_BD_MAGIC_WALL, &level.time_magic_wall, TEXT_DURATION },
+ { EL_DC_MAGIC_WALL, &level.time_magic_wall, TEXT_DURATION },
+ { EL_ROBOT_WHEEL, &level.time_wheel, TEXT_DURATION },
+ { EL_TIMEGATE_SWITCH, &level.time_timegate, TEXT_DURATION },
+ { EL_DC_TIMEGATE_SWITCH, &level.time_timegate, TEXT_DURATION },
+ { EL_LIGHT_SWITCH, &level.time_light, TEXT_DURATION },
+ { EL_LIGHT_SWITCH_ACTIVE, &level.time_light, TEXT_DURATION },
+ { EL_SHIELD_NORMAL, &level.shield_normal_time, TEXT_DURATION },
+ { EL_SHIELD_DEADLY, &level.shield_deadly_time, TEXT_DURATION },
+ { EL_EXTRA_TIME, &level.extra_time, TEXT_TIME_BONUS },
+ { EL_TIME_ORB_FULL, &level.time_orb_time, TEXT_TIME_BONUS },
+ { EL_GAME_OF_LIFE, &level.game_of_life[0], TEXT_GAME_OF_LIFE_1 },
+ { EL_GAME_OF_LIFE, &level.game_of_life[1], TEXT_GAME_OF_LIFE_2 },
+ { EL_GAME_OF_LIFE, &level.game_of_life[2], TEXT_GAME_OF_LIFE_3 },
+ { EL_GAME_OF_LIFE, &level.game_of_life[3], TEXT_GAME_OF_LIFE_4 },
+ { EL_BIOMAZE, &level.biomaze[0], TEXT_GAME_OF_LIFE_1 },
+ { EL_BIOMAZE, &level.biomaze[1], TEXT_GAME_OF_LIFE_2 },
+ { EL_BIOMAZE, &level.biomaze[2], TEXT_GAME_OF_LIFE_3 },
+ { EL_BIOMAZE, &level.biomaze[3], TEXT_GAME_OF_LIFE_4 },
+ { EL_EMC_ANDROID, &level.android_move_time, TEXT_MOVE_SPEED },
+ { EL_EMC_ANDROID, &level.android_clone_time, TEXT_CLONE_SPEED },
+ { EL_EMC_MAGIC_BALL, &level.ball_time, TEXT_BALL_DELAY },
+ { EL_EMC_LENSES, &level.lenses_score, TEXT_COLLECTING },
+ { EL_EMC_MAGNIFIER, &level.magnify_score, TEXT_COLLECTING },
+ { EL_SPRING, &level.slurp_score, TEXT_SLURPING },
+ { EL_SPRING_LEFT, &level.slurp_score, TEXT_SLURPING },
+ { EL_SPRING_RIGHT, &level.slurp_score, TEXT_SLURPING },
+ { EL_EMC_LENSES, &level.lenses_time, TEXT_DURATION },
+ { EL_EMC_MAGNIFIER, &level.magnify_time, TEXT_DURATION },
+ { EL_MM_FUSE_ACTIVE, &level.mm_time_fuse, TEXT_DELAY_OFF },
+ { EL_MM_BOMB, &level.mm_time_bomb, TEXT_DELAY_EXPLODING },
+ { EL_MM_GRAY_BALL, &level.mm_time_ball, TEXT_DELAY_CHANGING },
+ { EL_MM_STEEL_BLOCK, &level.mm_time_block, TEXT_DELAY_MOVING },
+ { EL_MM_WOODEN_BLOCK, &level.mm_time_block, TEXT_DELAY_MOVING },
+
+ { -1, NULL, NULL }
};
static boolean checkPropertiesConfig(int element)
{
int i;
+ // special case: empty space customization only available in R'n'D game engine
+ if (element == EL_EMPTY_SPACE && level.game_engine_type != GAME_ENGINE_TYPE_RND)
+ return FALSE;
+
+ // special case: BD style rock customization only available in BD game engine
+ if (element == EL_BD_ROCK && level.game_engine_type != GAME_ENGINE_TYPE_BD)
+ return FALSE;
+
if (IS_GEM(element) ||
IS_CUSTOM_ELEMENT(element) ||
IS_GROUP_ELEMENT(element) ||
IS_MM_MCDUFFIN(element) ||
IS_DF_LASER(element) ||
IS_PLAYER_ELEMENT(element) ||
+ IS_BD_PLAYER_ELEMENT(element) ||
+ IS_SOKOBAN_OBJECT_OR_FIELD(element) ||
HAS_EDITOR_CONTENT(element) ||
CAN_GROW(element) ||
COULD_MOVE_INTO_ACID(element) ||
MAYBE_DONT_COLLIDE_WITH(element) ||
- element == EL_SOKOBAN_OBJECT ||
- element == EL_SOKOBAN_FIELD_EMPTY ||
- element == EL_SOKOBAN_FIELD_FULL)
+ element == EL_BD_ROCK ||
+ element == EL_BD_MEGA_ROCK ||
+ element == EL_BD_SWEET)
+ {
return TRUE;
+ }
else
+ {
for (i = 0; elements_with_counter[i].element != -1; i++)
if (elements_with_counter[i].element == element)
return TRUE;
+ }
return FALSE;
}
{
if (elements_with_counter[i].element == properties_element)
{
+ // special case: score for extra diamonds only available in BD game engine
+ if (elements_with_counter[i].element == EL_BD_DIAMOND &&
+ elements_with_counter[i].value == &level.score[SC_DIAMOND_EXTRA] &&
+ level.game_engine_type != GAME_ENGINE_TYPE_BD)
+ continue;
+
int counter_id = ED_COUNTER_ID_ELEMENT_VALUE1 + num_element_counters;
counterbutton_info[counter_id].y =
num_element_counters);
counterbutton_info[counter_id].value = elements_with_counter[i].value;
- counterbutton_info[counter_id].text_right= elements_with_counter[i].text;
+ counterbutton_info[counter_id].text_right = elements_with_counter[i].text;
if (properties_element == EL_GAME_OF_LIFE ||
properties_element == EL_BIOMAZE)
}
}
- if (IS_GEM(properties_element))
+ if (IS_BD_PLAYER_ELEMENT(properties_element))
+ {
+ counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB].y =
+ ED_ELEMENT_SETTINGS_YPOS(2);
+ counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET].y =
+ ED_ELEMENT_SETTINGS_YPOS(3);
+ checkbutton_info[ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET].y =
+ ED_ELEMENT_SETTINGS_YPOS(4);
+
+ // draw checkbutton gadgets
+ MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_DIAGONAL_MOVEMENTS);
+ MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_TOPMOST_PLAYER_ACTIVE);
+ MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET);
+
+ // draw counter gadgets
+ MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB);
+ MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET);
+ }
+
+ if (properties_element == EL_BD_ROCK && level.game_engine_type == GAME_ENGINE_TYPE_BD)
+ {
+ counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB].y =
+ ED_ELEMENT_SETTINGS_YPOS(0);
+ counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET].y =
+ ED_ELEMENT_SETTINGS_YPOS(1);
+
+ MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB);
+ MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET);
+ }
+
+ if (properties_element == EL_BD_MEGA_ROCK ||
+ properties_element == EL_BD_SWEET)
+ {
+ counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET].y =
+ ED_ELEMENT_SETTINGS_YPOS(0);
+ checkbutton_info[ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET].y =
+ ED_ELEMENT_SETTINGS_YPOS(1);
+
+ MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET);
+ MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET);
+ }
+
+ // special case: slippery walls option for gems only available in R'n'D game engine
+ if (IS_GEM(properties_element) && level.game_engine_type == GAME_ENGINE_TYPE_RND)
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS);
if (properties_element == EL_EM_DYNAMITE)
UnmapLevelEditorToolboxDrawingGadgets();
UnmapLevelEditorToolboxCustomGadgets();
- if (IS_CUSTOM_ELEMENT(properties_element) ||
- IS_GROUP_ELEMENT(properties_element))
- MapLevelEditorToolboxCustomGadgets();
+ MapLevelEditorToolboxCustomGadgetsIfNeeded();
SetMainBackgroundImage(IMG_BACKGROUND_EDITOR);
ClearField();
EL_DF_RECEIVER_DOWN,
EL_DF_RECEIVER_LEFT
},
+ {
+ EL_DF_SLOPE_1,
+ EL_DF_SLOPE_4,
+ EL_DF_SLOPE_3,
+ EL_DF_SLOPE_2
+ },
{
-1,
EL_DF_MIRROR_ROTATING_3,
EL_DF_MIRROR_ROTATING_2
},
+ {
+ EL_DF_MIRROR_FIXED_1,
+ EL_DF_MIRROR_FIXED_16,
+ EL_DF_MIRROR_FIXED_15,
+ EL_DF_MIRROR_FIXED_14,
+ EL_DF_MIRROR_FIXED_13,
+ EL_DF_MIRROR_FIXED_12,
+ EL_DF_MIRROR_FIXED_11,
+ EL_DF_MIRROR_FIXED_10,
+ EL_DF_MIRROR_FIXED_9,
+ EL_DF_MIRROR_FIXED_8,
+ EL_DF_MIRROR_FIXED_7,
+ EL_DF_MIRROR_FIXED_6,
+ EL_DF_MIRROR_FIXED_5,
+ EL_DF_MIRROR_FIXED_4,
+ EL_DF_MIRROR_FIXED_3,
+ EL_DF_MIRROR_FIXED_2
+ },
{
-1,
return (IS_MM_WALL_EDITOR(element) || element == EL_EMPTY);
}
+static int numHiresTiles(int element)
+{
+ if (IS_MM_WALL(element))
+ return get_number_of_bits(MM_WALL_BITS(element));
+
+ return 1;
+}
+
static void SetDrawModeHiRes(int element)
{
draw_mode_hires =
DrawArcExt(from_x, from_y, to_x2, to_y2, element, change_level);
DrawArcExt(from_x, from_y, mirror_to_x2, to_y2, element, change_level);
DrawArcExt(from_x, from_y, to_x2, mirror_to_y2, element, change_level);
- DrawArcExt(from_x, from_y, mirror_to_x2, mirror_to_y2, element,change_level);
+ DrawArcExt(from_x, from_y, mirror_to_x2, mirror_to_y2, element, change_level);
}
#endif
#define CB_BRUSH_TO_CLIPBOARD 7
#define CB_BRUSH_TO_CLIPBOARD_SMALL 8
#define CB_UPDATE_BRUSH_POSITION 9
+#define CB_FLIP_BRUSH_X 10
+#define CB_FLIP_BRUSH_Y 11
+#define CB_FLIP_BRUSH_XY 12
#define MAX_CB_PART_SIZE 10
#define MAX_CB_LINE_SIZE (MAX_LEV_FIELDX + 1) // text plus newline
MAX_CB_NUM_LINES * \
MAX_CB_PART_SIZE)
+static int getFlippedTileExt(int map[], int element)
+{
+ int i;
+
+ for (i = 0; map[i] != -1; i++)
+ if (map[i] == element)
+ return map[i ^ 1]; // get flipped element by flipping LSB of index
+
+ return element;
+}
+
+static int getFlippedTileX(int element)
+{
+ int map[] =
+ {
+ EL_BD_BUTTERFLY_LEFT, EL_BD_BUTTERFLY_RIGHT,
+ EL_BD_FIREFLY_LEFT, EL_BD_FIREFLY_RIGHT,
+ EL_BUG_LEFT, EL_BUG_RIGHT,
+ EL_SPACESHIP_LEFT, EL_SPACESHIP_RIGHT,
+ EL_PACMAN_LEFT, EL_PACMAN_RIGHT,
+ EL_ARROW_LEFT, EL_ARROW_RIGHT,
+ EL_MOLE_LEFT, EL_MOLE_RIGHT,
+ EL_BALLOON_SWITCH_LEFT, EL_BALLOON_SWITCH_RIGHT,
+ EL_YAMYAM_LEFT, EL_YAMYAM_RIGHT,
+ EL_SP_PORT_LEFT, EL_SP_PORT_RIGHT,
+ EL_SP_GRAVITY_PORT_LEFT, EL_SP_GRAVITY_PORT_RIGHT,
+ EL_SP_GRAVITY_ON_PORT_LEFT, EL_SP_GRAVITY_ON_PORT_RIGHT,
+ EL_SP_GRAVITY_OFF_PORT_LEFT, EL_SP_GRAVITY_OFF_PORT_RIGHT,
+ EL_CONVEYOR_BELT_1_LEFT, EL_CONVEYOR_BELT_1_RIGHT,
+ EL_CONVEYOR_BELT_2_LEFT, EL_CONVEYOR_BELT_2_RIGHT,
+ EL_CONVEYOR_BELT_3_LEFT, EL_CONVEYOR_BELT_3_RIGHT,
+ EL_CONVEYOR_BELT_4_LEFT, EL_CONVEYOR_BELT_4_RIGHT,
+ EL_SPRING_LEFT, EL_SPRING_RIGHT,
+ EL_SP_CHIP_LEFT, EL_SP_CHIP_RIGHT,
+ EL_TUBE_VERTICAL_LEFT, EL_TUBE_VERTICAL_RIGHT,
+ EL_TUBE_LEFT_UP, EL_TUBE_RIGHT_UP,
+ EL_TUBE_LEFT_DOWN, EL_TUBE_RIGHT_DOWN,
+ EL_DC_STEELWALL_1_LEFT, EL_DC_STEELWALL_1_RIGHT,
+ EL_DC_STEELWALL_1_TOPLEFT, EL_DC_STEELWALL_1_TOPRIGHT,
+ EL_DC_STEELWALL_1_BOTTOMLEFT, EL_DC_STEELWALL_1_BOTTOMRIGHT,
+ EL_DC_STEELWALL_1_TOPLEFT_2, EL_DC_STEELWALL_1_TOPRIGHT_2,
+ EL_DC_STEELWALL_1_BOTTOMLEFT_2, EL_DC_STEELWALL_1_BOTTOMRIGHT_2,
+ EL_DC_STEELWALL_2_LEFT, EL_DC_STEELWALL_2_RIGHT,
+ EL_ACID_POOL_TOPLEFT, EL_ACID_POOL_TOPRIGHT,
+ EL_ACID_POOL_BOTTOMLEFT, EL_ACID_POOL_BOTTOMRIGHT,
+
+ -1
+ };
+
+ return getFlippedTileExt(map, element);
+}
+
+static int getFlippedTileY(int element)
+{
+ int map[] =
+ {
+ EL_BD_BUTTERFLY_UP, EL_BD_BUTTERFLY_DOWN,
+ EL_BD_FIREFLY_UP, EL_BD_FIREFLY_DOWN,
+ EL_BUG_UP, EL_BUG_DOWN,
+ EL_SPACESHIP_UP, EL_SPACESHIP_DOWN,
+ EL_PACMAN_UP, EL_PACMAN_DOWN,
+ EL_ARROW_UP, EL_ARROW_DOWN,
+ EL_MOLE_UP, EL_MOLE_DOWN,
+ EL_BALLOON_SWITCH_UP, EL_BALLOON_SWITCH_DOWN,
+ EL_YAMYAM_UP, EL_YAMYAM_DOWN,
+ EL_SP_PORT_UP, EL_SP_PORT_DOWN,
+ EL_SP_GRAVITY_PORT_UP, EL_SP_GRAVITY_PORT_DOWN,
+ EL_SP_GRAVITY_ON_PORT_UP, EL_SP_GRAVITY_ON_PORT_DOWN,
+ EL_SP_GRAVITY_OFF_PORT_UP, EL_SP_GRAVITY_OFF_PORT_DOWN,
+ EL_SP_CHIP_TOP, EL_SP_CHIP_BOTTOM,
+ EL_TUBE_HORIZONTAL_UP, EL_TUBE_HORIZONTAL_DOWN,
+ EL_TUBE_LEFT_UP, EL_TUBE_LEFT_DOWN,
+ EL_TUBE_RIGHT_UP, EL_TUBE_RIGHT_DOWN,
+ EL_DC_STEELWALL_1_TOP, EL_DC_STEELWALL_1_BOTTOM,
+ EL_DC_STEELWALL_1_TOPLEFT, EL_DC_STEELWALL_1_BOTTOMLEFT,
+ EL_DC_STEELWALL_1_TOPRIGHT, EL_DC_STEELWALL_1_BOTTOMRIGHT,
+ EL_DC_STEELWALL_1_TOPLEFT_2, EL_DC_STEELWALL_1_BOTTOMLEFT_2,
+ EL_DC_STEELWALL_1_TOPRIGHT_2, EL_DC_STEELWALL_1_BOTTOMRIGHT_2,
+ EL_DC_STEELWALL_2_TOP, EL_DC_STEELWALL_2_BOTTOM,
+ EL_EMC_WALL_1, EL_EMC_WALL_3,
+
+ -1
+ };
+
+ return getFlippedTileExt(map, element);
+}
+
+static int getFlippedTileXY(int element)
+{
+ int map[] =
+ {
+ EL_BD_BUTTERFLY_LEFT, EL_BD_BUTTERFLY_UP,
+ EL_BD_BUTTERFLY_RIGHT, EL_BD_BUTTERFLY_DOWN,
+ EL_BD_FIREFLY_LEFT, EL_BD_FIREFLY_UP,
+ EL_BD_FIREFLY_RIGHT, EL_BD_FIREFLY_DOWN,
+ EL_BUG_LEFT, EL_BUG_UP,
+ EL_BUG_RIGHT, EL_BUG_DOWN,
+ EL_SPACESHIP_LEFT, EL_SPACESHIP_UP,
+ EL_SPACESHIP_RIGHT, EL_SPACESHIP_DOWN,
+ EL_PACMAN_LEFT, EL_PACMAN_UP,
+ EL_PACMAN_RIGHT, EL_PACMAN_DOWN,
+ EL_ARROW_LEFT, EL_ARROW_UP,
+ EL_ARROW_RIGHT, EL_ARROW_DOWN,
+ EL_MOLE_LEFT, EL_MOLE_UP,
+ EL_MOLE_RIGHT, EL_MOLE_DOWN,
+ EL_BALLOON_SWITCH_LEFT, EL_BALLOON_SWITCH_UP,
+ EL_BALLOON_SWITCH_RIGHT, EL_BALLOON_SWITCH_DOWN,
+ EL_YAMYAM_LEFT, EL_YAMYAM_UP,
+ EL_YAMYAM_RIGHT, EL_YAMYAM_DOWN,
+ EL_SP_PORT_LEFT, EL_SP_PORT_UP,
+ EL_SP_PORT_RIGHT, EL_SP_PORT_DOWN,
+ EL_SP_GRAVITY_PORT_LEFT, EL_SP_GRAVITY_PORT_UP,
+ EL_SP_GRAVITY_PORT_RIGHT, EL_SP_GRAVITY_PORT_DOWN,
+ EL_SP_GRAVITY_ON_PORT_LEFT, EL_SP_GRAVITY_ON_PORT_UP,
+ EL_SP_GRAVITY_ON_PORT_RIGHT, EL_SP_GRAVITY_ON_PORT_DOWN,
+ EL_SP_GRAVITY_OFF_PORT_LEFT, EL_SP_GRAVITY_OFF_PORT_UP,
+ EL_SP_GRAVITY_OFF_PORT_RIGHT, EL_SP_GRAVITY_OFF_PORT_DOWN,
+ EL_SP_CHIP_LEFT, EL_SP_CHIP_TOP,
+ EL_SP_CHIP_RIGHT, EL_SP_CHIP_BOTTOM,
+ EL_TUBE_VERTICAL, EL_TUBE_HORIZONTAL,
+ EL_TUBE_VERTICAL_LEFT, EL_TUBE_HORIZONTAL_UP,
+ EL_TUBE_VERTICAL_RIGHT, EL_TUBE_HORIZONTAL_DOWN,
+ EL_TUBE_LEFT_DOWN, EL_TUBE_RIGHT_UP,
+ EL_DC_STEELWALL_1_LEFT, EL_DC_STEELWALL_1_TOP,
+ EL_DC_STEELWALL_1_RIGHT, EL_DC_STEELWALL_1_BOTTOM,
+ EL_DC_STEELWALL_1_HORIZONTAL, EL_DC_STEELWALL_1_VERTICAL,
+ EL_DC_STEELWALL_1_TOPRIGHT, EL_DC_STEELWALL_1_BOTTOMLEFT,
+ EL_DC_STEELWALL_1_TOPRIGHT_2, EL_DC_STEELWALL_1_BOTTOMLEFT_2,
+ EL_DC_STEELWALL_2_LEFT, EL_DC_STEELWALL_2_TOP,
+ EL_DC_STEELWALL_2_RIGHT, EL_DC_STEELWALL_2_BOTTOM,
+ EL_DC_STEELWALL_2_HORIZONTAL, EL_DC_STEELWALL_2_VERTICAL,
+ EL_EXPANDABLE_WALL_HORIZONTAL, EL_EXPANDABLE_WALL_VERTICAL,
+ EL_EXPANDABLE_STEELWALL_HORIZONTAL, EL_EXPANDABLE_STEELWALL_VERTICAL,
+
+ -1
+ };
+
+ return getFlippedTileExt(map, element);
+}
+
+static int getFlippedTile(int element, int mode)
+{
+ if (IS_MM_ELEMENT(element))
+ {
+ // get MM game element
+ element = map_element_RND_to_MM(element);
+
+ // get flipped game element
+ element = (mode == CB_FLIP_BRUSH_X ? getFlippedTileX_MM(element) :
+ mode == CB_FLIP_BRUSH_Y ? getFlippedTileY_MM(element) :
+ mode == CB_FLIP_BRUSH_XY ? getFlippedTileXY_MM(element) :
+ element);
+
+ // get RND game element again
+ element = map_element_MM_to_RND(element);
+ }
+ else
+ {
+ // get flipped game element
+ element = (mode == CB_FLIP_BRUSH_X ? getFlippedTileX(element) :
+ mode == CB_FLIP_BRUSH_Y ? getFlippedTileY(element) :
+ mode == CB_FLIP_BRUSH_XY ? getFlippedTileXY(element) :
+ element);
+ }
+
+ return element;
+}
+
+static void SwapFlippedTiles(short *tile1, short *tile2, int mode)
+{
+ // flip tiles
+ short tile1_flipped = getFlippedTile(*tile1, mode);
+ short tile2_flipped = getFlippedTile(*tile2, mode);
+
+ // swap tiles
+ *tile1 = tile2_flipped;
+ *tile2 = tile1_flipped;
+}
+
static void DrawBrushElement(int sx, int sy, int element, boolean change_level)
{
DrawLineElement(sx, sy, element, change_level);
lev_fieldx = level.fieldx = brush_width;
lev_fieldy = level.fieldy = brush_height;
+ boolean use_bd_engine = TRUE;
boolean use_em_engine = TRUE;
boolean use_sp_engine = TRUE;
boolean use_mm_engine = TRUE;
{
int element = Tile[x][y];
+ if (!IS_BD_ELEMENT(element) && !IS_PLAYER_ELEMENT(element))
+ use_bd_engine = FALSE;
+
if (!IS_EM_ELEMENT(element) && !IS_PLAYER_ELEMENT(element))
use_em_engine = FALSE;
}
}
- level.game_engine_type = (use_em_engine ? GAME_ENGINE_TYPE_EM :
+ level.game_engine_type = (use_bd_engine ? GAME_ENGINE_TYPE_BD :
+ use_em_engine ? GAME_ENGINE_TYPE_EM :
use_sp_engine ? GAME_ENGINE_TYPE_SP :
use_mm_engine ? GAME_ENGINE_TYPE_MM :
GAME_ENGINE_TYPE_RND);
delete_old_brush = TRUE;
}
+ else if (mode == CB_FLIP_BRUSH_X)
+ {
+ for (y = 0; y < brush_height; y++)
+ for (x = 0; x < (brush_width + 1) / 2; x++)
+ SwapFlippedTiles(&brush_buffer[x][y],
+ &brush_buffer[brush_width - x - 1][y], mode);
+
+ CopyBrushExt(last_cursor_x, last_cursor_y, 0, 0, 0, CB_BRUSH_TO_CURSOR);
+ }
+ else if (mode == CB_FLIP_BRUSH_Y)
+ {
+ for (y = 0; y < (brush_height + 1) / 2; y++)
+ for (x = 0; x < brush_width; x++)
+ SwapFlippedTiles(&brush_buffer[x][y],
+ &brush_buffer[x][brush_height - y - 1], mode);
+
+ CopyBrushExt(last_cursor_x, last_cursor_y, 0, 0, 0, CB_BRUSH_TO_CURSOR);
+ }
+ else if (mode == CB_FLIP_BRUSH_XY)
+ {
+ CopyBrushExt(0, 0, 0, 0, 0, CB_DELETE_OLD_CURSOR);
+
+ for (y = 0; y < MAX(brush_width, brush_height); y++)
+ for (x = 0; x <= y; x++)
+ SwapFlippedTiles(&brush_buffer[x][y],
+ &brush_buffer[y][x], mode);
+
+ swap_numbers(&brush_width, &brush_height);
+
+ CopyBrushExt(last_cursor_x, last_cursor_y, 0, 0, 0, CB_BRUSH_TO_CURSOR);
+ }
if (mode == CB_UPDATE_BRUSH_POSITION)
{
CopyBrushExt(0, 0, 0, 0, 0, CB_DELETE_OLD_CURSOR);
}
+static void FlipBrushX(void)
+{
+ CopyBrushExt(0, 0, 0, 0, 0, CB_FLIP_BRUSH_X);
+}
+
+static void FlipBrushY(void)
+{
+ CopyBrushExt(0, 0, 0, 0, 0, CB_FLIP_BRUSH_Y);
+}
+
+static void RotateBrush(void)
+{
+ CopyBrushExt(0, 0, 0, 0, 0, CB_FLIP_BRUSH_XY);
+ CopyBrushExt(0, 0, 0, 0, 0, CB_FLIP_BRUSH_X);
+}
+
void DumpBrush(void)
{
CopyBrushExt(0, 0, 0, 0, 0, CB_DUMP_BRUSH);
CopyLevelToUndoBuffer(UNDO_ACCUMULATE);
}
-static void DrawAreaElementHighlight(boolean highlighted)
+static void DrawAreaElementHighlight(boolean highlighted,
+ boolean highlighted_similar)
{
DrawEditorLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos);
{
for (y = 0; y < ed_fieldy; y++)
{
+ boolean highlight = FALSE;
int lx = x + level_xpos;
int ly = y + level_ypos;
if (!IN_LEV_FIELD(lx, ly))
continue;
- if (Tile[lx][ly] != new_element1)
+ // check if element is the same
+ if (Tile[lx][ly] == new_element1)
+ highlight = TRUE;
+
+ // check if element is similar
+ if (highlighted_similar &&
+ strEqual(element_info[Tile[lx][ly]].class_name,
+ element_info[new_element1].class_name))
+ highlight = TRUE;
+
+ // check if element is matching MM style wall
+ if (IS_MM_WALL(Tile[lx][ly]) &&
+ map_mm_wall_element(Tile[lx][ly]) == new_element1)
+ highlight = TRUE;
+
+ if (!highlight)
continue;
- int sx = SX + x * ed_tilesize;
- int sy = SY + y * ed_tilesize;
- int from_sx = sx;
- int from_sy = sy;
- int to_sx = sx + ed_tilesize - 1;
- int to_sy = sy + ed_tilesize - 1;
-
- DrawSimpleWhiteLine(drawto, from_sx, from_sy, to_sx, from_sy);
- DrawSimpleWhiteLine(drawto, to_sx, from_sy, to_sx, to_sy);
- DrawSimpleWhiteLine(drawto, to_sx, to_sy, from_sx, to_sy);
- DrawSimpleWhiteLine(drawto, from_sx, to_sy, from_sx, from_sy);
+ if (IS_MM_WALL(Tile[lx][ly]) && !highlighted_similar)
+ {
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (!(MM_WALL_BITS(Tile[lx][ly]) & (1 << i)))
+ continue;
+
+ int xx = x * 2 + (i % 2);
+ int yy = y * 2 + (i / 2);
+ int sx = SX + xx * ed_tilesize / 2;
+ int sy = SY + yy * ed_tilesize / 2;
+ int from_sx = sx;
+ int from_sy = sy;
+ int to_sx = sx + ed_tilesize / 2 - 1;
+ int to_sy = sy + ed_tilesize / 2 - 1;
+
+ DrawSimpleWhiteLine(drawto, from_sx, from_sy, to_sx, from_sy);
+ DrawSimpleWhiteLine(drawto, to_sx, from_sy, to_sx, to_sy);
+ DrawSimpleWhiteLine(drawto, to_sx, to_sy, from_sx, to_sy);
+ DrawSimpleWhiteLine(drawto, from_sx, to_sy, from_sx, from_sy);
+ }
+ }
+ else
+ {
+ int sx = SX + x * ed_tilesize;
+ int sy = SY + y * ed_tilesize;
+ int from_sx = sx;
+ int from_sy = sy;
+ int to_sx = sx + ed_tilesize - 1;
+ int to_sy = sy + ed_tilesize - 1;
+
+ DrawSimpleWhiteLine(drawto, from_sx, from_sy, to_sx, from_sy);
+ DrawSimpleWhiteLine(drawto, to_sx, from_sy, to_sx, to_sy);
+ DrawSimpleWhiteLine(drawto, to_sx, to_sy, from_sx, to_sy);
+ DrawSimpleWhiteLine(drawto, from_sx, to_sy, from_sx, from_sy);
+ }
}
}
}
{
SetDrawModeHiRes(new_element);
- if (IS_PLAYER_ELEMENT(new_element))
+ if (IS_PLAYER_ELEMENT(new_element) || IS_MM_MCDUFFIN(new_element))
{
// remove player at old position
for (y = 0; y < lev_fieldy; y++)
{
int old_element = Tile[x][y];
- if (IS_PLAYER_ELEMENT(old_element))
+ if (IS_PLAYER_ELEMENT(old_element) &&
+ IS_PLAYER_ELEMENT(new_element))
{
int replaced_with_element =
(old_element == EL_SOKOBAN_FIELD_PLAYER &&
SetElement(x, y, replaced_with_element);
}
+ else if (IS_MM_MCDUFFIN(old_element) &&
+ IS_MM_MCDUFFIN(new_element))
+ {
+ // remove McDuffin at old position
+ SetElement(x, y, EL_EMPTY);
+ }
}
}
}
if (type_id == ED_SELECTBOX_ID_LEVELSET_SAVE_MODE)
{
- DrawLevelInfoWindow();
+ DrawLevelConfigWindow();
}
else if (type_id == ED_SELECTBOX_ID_SELECT_CHANGE_PAGE)
{
}
else if (type_id == ED_SELECTBOX_ID_GAME_ENGINE_TYPE)
{
- // update element selection list
+ // show or hide "engine" tabulator depending on game engine type
+ DrawLevelConfigWindow();
+
+ // update element selection list depending on game engine type
ReinitializeElementList();
ModifyEditorElementList();
}
+ else if (type_id == ED_SELECTBOX_ID_BD_SCHEDULING_TYPE)
+ {
+ // update BD cycle delay counter gadgets depending on BD scheduling type
+ DrawLevelConfigWindow();
+ }
// do not mark level as modified for certain non-level-changing gadgets
if (type_id == ED_SELECTBOX_ID_LEVELSET_SAVE_MODE ||
int type_id = gi->custom_type_id;
int i;
- if (type_id >= ED_TAB_BUTTON_ID_LEVELINFO_FIRST &&
- type_id <= ED_TAB_BUTTON_ID_LEVELINFO_LAST)
+ if (type_id >= ED_TAB_BUTTON_ID_LEVELCONFIG_FIRST &&
+ type_id <= ED_TAB_BUTTON_ID_LEVELCONFIG_LAST)
{
- edit_mode_levelinfo = gi->custom_type_id;
+ edit_mode_levelconfig = gi->custom_type_id;
- DrawLevelInfoWindow();
+ DrawLevelConfigWindow();
}
else if (type_id >= ED_TAB_BUTTON_ID_PROPERTIES_FIRST &&
type_id <= ED_TAB_BUTTON_ID_PROPERTIES_LAST)
break;
- case GADGET_ID_INFO:
- if (edit_mode != ED_MODE_INFO)
+ case GADGET_ID_CONF:
+ if (edit_mode != ED_MODE_LEVELCONFIG)
{
last_edit_mode = edit_mode;
- ChangeEditModeWindow(ED_MODE_INFO);
+ ChangeEditModeWindow(ED_MODE_LEVELCONFIG);
}
else
{
Request("Save this level and kill the old?", REQ_ASK))
{
if (leveldir_former->readonly)
- ModifyLevelInfoForSavingIntoPersonalLevelSet(leveldir_former->name);
+ ModifyLevelConfigForSavingIntoPersonalLevelSet(leveldir_former->name);
SetAutomaticNumberOfGemsNeeded();
for (i = 0; editor_elements_info[i].setup_value != NULL; i++)
{
- int *cascade_element= &(*editor_elements_info[i].headline_list)[0];
- boolean *cascade_value=editor_elements_info[i].setup_cascade_value;
+ int *cascade_element = &(*editor_elements_info[i].headline_list)[0];
+ boolean *cascade_value = editor_elements_info[i].setup_cascade_value;
if (*cascade_element == new_element)
{
case KSYM_Escape:
if (edit_mode == ED_MODE_DRAWING)
RequestExitLevelEditor(setup.ask_on_escape_editor, TRUE);
- else if (edit_mode == ED_MODE_INFO)
- HandleControlButtons(level_editor_gadget[GADGET_ID_INFO]);
+ else if (edit_mode == ED_MODE_LEVELCONFIG)
+ HandleControlButtons(level_editor_gadget[GADGET_ID_CONF]);
else if (edit_mode == ED_MODE_PROPERTIES)
HandleControlButtons(level_editor_gadget[GADGET_ID_PROPERTIES]);
else if (edit_mode == ED_MODE_PALETTE)
if (letter && letter == controlbutton_info[i].shortcut)
if (!anyTextGadgetActive())
ClickOnGadget(level_editor_gadget[i], button);
+
+ if (draw_with_brush)
+ {
+ if (letter == 'x')
+ FlipBrushX();
+ else if (letter == 'y')
+ FlipBrushY();
+ else if (letter == 'z')
+ RotateBrush();
+ }
}
static void HandleLevelEditorIdle_Properties(void)
static void HandleLevelEditorIdle_Drawing(void)
{
static boolean last_highlighted = FALSE;
+ static boolean last_highlighted_similar = FALSE;
boolean highlighted = (GetKeyModState() & KMOD_Alt);
+ boolean highlighted_similar = (GetKeyModState() & KMOD_Shift);
- if (highlighted != last_highlighted)
+ if (highlighted != last_highlighted ||
+ (highlighted && highlighted_similar != last_highlighted_similar))
{
- DrawAreaElementHighlight(highlighted);
-
- last_highlighted = highlighted;
+ DrawAreaElementHighlight(highlighted, highlighted_similar);
redraw_mask |= REDRAW_FIELD;
}
+
+ last_highlighted = highlighted;
+ last_highlighted_similar = highlighted_similar;
}
void HandleLevelEditorIdle(void)
sy = ly - level_ypos;
}
- if (IN_ED_FIELD(sx,sy) && IN_LEV_FIELD(lx, ly))
+ if (IN_ED_FIELD(sx, sy) && IN_LEV_FIELD(lx, ly))
{
if (button_status) // if (gi->state == GD_BUTTON_PRESSED)
{
vp_door_2->height == VYSIZE)
CloseDoor(DOOR_CLOSE_ALL | DOOR_NO_DELAY);
else
- SetDoorState(DOOR_CLOSE_2);
+ SetDoorState(DOOR_CLOSE_ALL);
BackToFront();