X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=d780a053e1453e4d44e34935756d610fd4d41822;hb=62ce600f34661138022d2ab3e67b254d43b5228e;hp=969aad79e6f72a4688bcdea75d87b3e7bc96a212;hpb=516fafe7ee088155d156e0f36f165a0d557d2bde;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 969aad79..d780a053 100644 --- a/src/editor.c +++ b/src/editor.c @@ -378,16 +378,17 @@ #define GADGET_ID_CUSTOM_MOVE_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 4) #define GADGET_ID_CUSTOM_MOVE_STEPSIZE (GADGET_ID_SELECTBOX_FIRST + 5) #define GADGET_ID_CUSTOM_SMASH_TARGETS (GADGET_ID_SELECTBOX_FIRST + 6) -#define GADGET_ID_CUSTOM_ACCESS_TYPE (GADGET_ID_SELECTBOX_FIRST + 7) -#define GADGET_ID_CUSTOM_ACCESS_LAYER (GADGET_ID_SELECTBOX_FIRST + 8) -#define GADGET_ID_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 9) -#define GADGET_ID_CHANGE_PLAYER_ACTION (GADGET_ID_SELECTBOX_FIRST + 10) -#define GADGET_ID_CHANGE_COLLIDE_ACTION (GADGET_ID_SELECTBOX_FIRST + 11) -#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 12) -#define GADGET_ID_CHANGE_POWER (GADGET_ID_SELECTBOX_FIRST + 13) +#define GADGET_ID_CUSTOM_SLIPPERY_TYPE (GADGET_ID_SELECTBOX_FIRST + 7) +#define GADGET_ID_CUSTOM_ACCESS_TYPE (GADGET_ID_SELECTBOX_FIRST + 8) +#define GADGET_ID_CUSTOM_ACCESS_LAYER (GADGET_ID_SELECTBOX_FIRST + 9) +#define GADGET_ID_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 10) +#define GADGET_ID_CHANGE_PLAYER_ACTION (GADGET_ID_SELECTBOX_FIRST + 11) +#define GADGET_ID_CHANGE_COLLIDE_ACTION (GADGET_ID_SELECTBOX_FIRST + 12) +#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 13) +#define GADGET_ID_CHANGE_POWER (GADGET_ID_SELECTBOX_FIRST + 14) /* textbutton identifiers */ -#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 14) +#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 15) #define GADGET_ID_PROPERTIES_INFO (GADGET_ID_TEXTBUTTON_FIRST + 0) #define GADGET_ID_PROPERTIES_CONFIG (GADGET_ID_TEXTBUTTON_FIRST + 1) @@ -521,25 +522,26 @@ #define ED_TEXTINPUT_ID_LEVEL_LAST ED_TEXTINPUT_ID_LEVEL_AUTHOR /* values for selectbox gadgets */ -#define ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION 0 -#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY 1 -#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 2 +#define ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE 0 +#define ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER 1 +#define ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION 2 #define ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN 3 #define ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION 4 #define ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE 5 #define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS 6 -#define ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE 7 -#define ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER 8 -#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 9 -#define ED_SELECTBOX_ID_CHANGE_PLAYER_ACTION 10 -#define ED_SELECTBOX_ID_CHANGE_COLLIDE_ACTION 11 -#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 12 -#define ED_SELECTBOX_ID_CHANGE_POWER 13 +#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE 7 +#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 8 +#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY 9 +#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 10 +#define ED_SELECTBOX_ID_CHANGE_PLAYER_ACTION 11 +#define ED_SELECTBOX_ID_CHANGE_COLLIDE_ACTION 12 +#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 13 +#define ED_SELECTBOX_ID_CHANGE_POWER 14 -#define ED_NUM_SELECTBOX 14 +#define ED_NUM_SELECTBOX 15 -#define ED_SELECTBOX_ID_CUSTOM_FIRST ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION -#define ED_SELECTBOX_ID_CUSTOM_LAST ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER +#define ED_SELECTBOX_ID_CUSTOM_FIRST ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE +#define ED_SELECTBOX_ID_CUSTOM_LAST ED_SELECTBOX_ID_CUSTOM_CONSISTENCY #define ED_SELECTBOX_ID_CHANGE_FIRST ED_SELECTBOX_ID_CHANGE_TIME_UNITS #define ED_SELECTBOX_ID_CHANGE_LAST ED_SELECTBOX_ID_CHANGE_POWER @@ -558,39 +560,39 @@ #define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED 2 #define ED_CHECKBUTTON_ID_STICK_ELEMENT 3 #define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS 4 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT 5 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 6 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 7 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 8 -#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 9 -#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 10 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 11 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 12 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 13 -#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 14 -#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 15 +#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 5 +#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 6 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 7 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 8 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 9 +#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 10 +#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 11 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT 12 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 13 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 14 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 15 #define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 16 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 17 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 18 -#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 19 -#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 20 -#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 21 -#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 22 -#define ED_CHECKBUTTON_ID_CHANGE_DELAY 23 -#define ED_CHECKBUTTON_ID_CHANGE_BY_PLAYER 24 -#define ED_CHECKBUTTON_ID_CHANGE_BY_COLLISION 25 -#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER 26 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 17 +#define ED_CHECKBUTTON_ID_CHANGE_DELAY 18 +#define ED_CHECKBUTTON_ID_CHANGE_BY_PLAYER 19 +#define ED_CHECKBUTTON_ID_CHANGE_BY_COLLISION 20 +#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER 21 +#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 22 +#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 23 +#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 24 +#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 25 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 26 #define ED_NUM_CHECKBUTTONS 27 #define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_DOUBLE_SPEED #define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED -#define ED_CHECKBUTTON_ID_CUSTOM_FIRST ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT -#define ED_CHECKBUTTON_ID_CUSTOM_LAST ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE +#define ED_CHECKBUTTON_ID_CUSTOM_FIRST ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE +#define ED_CHECKBUTTON_ID_CUSTOM_LAST ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT #define ED_CHECKBUTTON_ID_CHANGE_FIRST ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC -#define ED_CHECKBUTTON_ID_CHANGE_LAST ED_CHECKBUTTON_ID_CHANGE_BY_OTHER +#define ED_CHECKBUTTON_ID_CHANGE_LAST ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE /* values for radiobutton gadgets */ #define ED_RADIOBUTTON_ID_PERCENTAGE 0 @@ -957,11 +959,23 @@ static struct ValueTextInfo options_move_stepsize[] = static struct ValueTextInfo options_smash_targets[] = { { EP_CAN_SMASH_PLAYER, "player" }, +#if 0 { EP_CAN_SMASH_ENEMIES, "enemies" }, +#endif { EP_CAN_SMASH_EVERYTHING, "everything" }, { -1, NULL } }; +static struct ValueTextInfo options_slippery_type[] = +{ + { SLIPPERY_ANY_RANDOM, "random" }, + { SLIPPERY_ANY_LEFT_RIGHT, "left, right" }, + { SLIPPERY_ANY_RIGHT_LEFT, "right, left" }, + { SLIPPERY_ONLY_LEFT, "only left" }, + { SLIPPERY_ONLY_RIGHT, "only right" }, + { -1, NULL } +}; + static struct ValueTextInfo options_deadliness[] = { { EP_DONT_RUN_INTO, "running into" }, @@ -1088,6 +1102,14 @@ static struct &custom_element.smash_targets, "can smash", NULL, "elements that can be smashed" }, + { + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(10), + GADGET_ID_CUSTOM_SLIPPERY_TYPE, + -1, + options_slippery_type, + &custom_element.slippery_type, + "slippery", NULL, "where other elements fall down" + }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(11), GADGET_ID_CUSTOM_DEADLINESS, @@ -1367,7 +1389,7 @@ static struct ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(10), GADGET_ID_CUSTOM_SLIPPERY, &custom_element_properties[EP_SLIPPERY], - "slippery", "other elements can fall down from it" + NULL, "other elements can fall down from it" }, { ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(11), @@ -1500,6 +1522,7 @@ static void ModifyEditorCounter(int, int); static void ModifyEditorCounterLimits(int, int, int); static void ModifyEditorSelectbox(int, int); static void ModifyEditorElementList(); +static void RedrawDrawingElements(); static void DrawDrawingWindow(); static void DrawLevelInfoWindow(); static void DrawPropertiesWindow(); @@ -3570,6 +3593,9 @@ static void ResetUndoBuffer() static void DrawEditModeWindow() { + ModifyEditorElementList(); + RedrawDrawingElements(); + if (edit_mode == ED_MODE_INFO) DrawLevelInfoWindow(); else if (edit_mode == ED_MODE_PROPERTIES) @@ -3585,7 +3611,7 @@ static boolean LevelChanged() for(y=0; ycustom_type_id >= ED_TEXTBUTTON_ID_PROPERTIES_INFO && - gi->custom_type_id <= ED_TEXTBUTTON_ID_PROPERTIES_ADVANCED) + int type_id = gi->custom_type_id; + + if (type_id >= ED_TEXTBUTTON_ID_PROPERTIES_INFO && + type_id <= ED_TEXTBUTTON_ID_PROPERTIES_ADVANCED) { edit_mode_properties = gi->custom_type_id; DrawPropertiesWindow(); } + else if (type_id == ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE) + { + boolean new_template = (!LevelFileExists(-1)); + + if (new_template || + Request("Save this tem- plate and kill the old ?", REQ_ASK)) + SaveLevelTemplate(); + + if (new_template) + Request("Tem- plate saved !", REQ_CONFIRM); + } } static void HandleRadiobuttons(struct GadgetInfo *gi) @@ -5973,15 +6036,31 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) if ((type_id >= ED_CHECKBUTTON_ID_CUSTOM_FIRST && type_id <= ED_CHECKBUTTON_ID_CUSTOM_LAST) || (type_id >= ED_CHECKBUTTON_ID_CHANGE_FIRST && - type_id <= ED_CHECKBUTTON_ID_CHANGE_LAST)) + type_id <= ED_CHECKBUTTON_ID_CHANGE_LAST && + type_id != ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE)) + { CopyCustomElementPropertiesToGame(properties_element); + } if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC) { - ModifyEditorElementList(); - RedrawDrawingElements(); + UpdateCustomElementGraphicGadgets(); + } + else if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE) + { + if (level.use_custom_template && !LevelFileExists(-1)) + { + Request("No level tem- plate found !", REQ_CONFIRM); - DrawPropertiesAdvancedDrawingAreas(); + level.use_custom_template = FALSE; + ModifyGadget(gi, GDI_CHECKED, FALSE, GDI_END); + + return; + } + + LoadLevelTemplate(level.use_custom_template ? -1 : level_nr); + + DrawEditModeWindow(); } } @@ -6229,12 +6308,18 @@ static void HandleControlButtons(struct GadgetInfo *gi) Request("No Level without Gregor Mc Duffin please !", REQ_CONFIRM); else { - if (Request("Save this level and kill the old ?", REQ_ASK)) + boolean new_level = (!LevelFileExists(level_nr)); + + if (new_level || + Request("Save this level and kill the old ?", REQ_ASK)) { - CopyPlayfield(Feld, Ur); + CopyPlayfield(Feld, level.field); SaveLevel(level_nr); } + + if (new_level) + Request("Level saved !", REQ_CONFIRM); } break; @@ -6246,8 +6331,8 @@ static void HandleControlButtons(struct GadgetInfo *gi) if (LevelChanged()) level.game_version = GAME_VERSION_ACTUAL; - CopyPlayfield(Ur, FieldBackup); - CopyPlayfield(Feld, Ur); + CopyPlayfield(level.field, FieldBackup); + CopyPlayfield(Feld, level.field); UnmapLevelEditorGadgets(); UndrawSpecialEditorDoor();