X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=27eba8b6ee71b3694b2dc17d50bbfcdc68a97945;hb=42e820b32f8ff2a7f9fc6daa4e5a831e95c63ad8;hp=2a26c09f67222d1d7c26b2351796f4aaba71ba41;hpb=74c0f7de91268e40d15948f473eac51a9760b9c0;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 2a26c09f..27eba8b6 100644 --- a/src/editor.c +++ b/src/editor.c @@ -1070,7 +1070,15 @@ static struct ValueTextInfo options_move_pattern[] = { MV_ALONG_RIGHT_SIDE, "along right side" }, { MV_TURNING_LEFT, "turning left" }, { MV_TURNING_RIGHT, "turning right" }, + { MV_TURNING_LEFT_RIGHT, "turning left, right" }, + { MV_TURNING_RIGHT_LEFT, "turning right, left" }, + { MV_TURNING_RANDOM, "turning random" }, { MV_WHEN_PUSHED, "when pushed" }, + { MV_WHEN_DROPPED, "when dropped" }, +#if 1 + { MV_MAZE_RUNNER, "maze runner style" }, + { MV_MAZE_HUNTER, "maze hunter style" }, +#endif { -1, NULL } }; @@ -1125,6 +1133,7 @@ static struct ValueTextInfo options_deadliness[] = static struct ValueTextInfo options_consistency[] = { { EP_CAN_EXPLODE_3X3, "can explode 3x3" }, + { EP_CAN_EXPLODE_DYNA, "can explode 3+3" }, { EP_CAN_EXPLODE_1X1, "can explode 1x1" }, { EP_INDESTRUCTIBLE, "indestructible" }, { -1, NULL } @@ -1146,9 +1155,14 @@ static struct ValueTextInfo options_change_direct_action[] = { CE_LEFT_BY_PLAYER, "left by player ..." }, { CE_DROPPED_BY_PLAYER, "dropped by player" }, { CE_SWITCHED, "switched ..." }, - { CE_COLLISION, "collision ..." }, - { CE_IMPACT, "impact" }, - { CE_SMASHED, "smashed" }, +#if 1 + { CE_HITTING_SOMETHING, "hitting something ..." }, + { CE_HIT_BY_SOMETHING, "hit by something ..." }, +#else + { CE_HITTING_SOMETHING, "collision ..." }, +#endif + { CE_IMPACT, "impact (on something)" }, + { CE_SMASHED, "smashed (from above)" }, { -1, NULL } }; @@ -1163,6 +1177,10 @@ static struct ValueTextInfo options_change_other_action[] = { CE_OTHER_GETS_COLLECTED, "player collects" }, { CE_OTHER_GETS_DROPPED, "player drops" }, { CE_OTHER_IS_TOUCHING, "touching ..." }, +#if 1 + { CE_OTHER_IS_HITTING, "hitting ..." }, + { CE_OTHER_GETS_HIT, "hit by ..." }, +#endif { CE_OTHER_IS_SWITCHING, "switch of ..." }, { CE_OTHER_IS_CHANGING, "change of" }, { CE_OTHER_IS_EXPLODING, "explosion of" }, @@ -1177,7 +1195,7 @@ static struct ValueTextInfo options_change_sides[] = { CH_SIDE_BOTTOM, "bottom side" }, { CH_SIDE_LEFT_RIGHT, "left/right side" }, { CH_SIDE_TOP_BOTTOM, "top/bottom side" }, - { CH_SIDE_ANY, "all sides" }, + { CH_SIDE_ANY, "any side" }, { -1, NULL } }; @@ -2133,7 +2151,11 @@ static int editor_el_more[] = EL_BD_FIREFLY, EL_MOLE_LEFT, +#if 0 + EL_MAZE_RUNNER, +#else EL_EMPTY, +#endif EL_MOLE_RIGHT, EL_PACMAN, @@ -3058,8 +3080,7 @@ static void ReinitializeElementList() int pos = 0; int i, j; - if (editor_elements != NULL) - free(editor_elements); + checked_free(editor_elements); if (!initialized) { @@ -4942,11 +4963,13 @@ static void CopyCustomElementPropertiesToEditor(int element) (IS_INDESTRUCTIBLE(element) ? EP_INDESTRUCTIBLE : CAN_EXPLODE_1X1(element) ? EP_CAN_EXPLODE_1X1 : CAN_EXPLODE_3X3(element) ? EP_CAN_EXPLODE_3X3 : + CAN_EXPLODE_DYNA(element) ? EP_CAN_EXPLODE_DYNA : custom_element.consistency); custom_element_properties[EP_EXPLODE_RESULT] = (IS_INDESTRUCTIBLE(element) || CAN_EXPLODE_1X1(element) || - CAN_EXPLODE_3X3(element)); + CAN_EXPLODE_3X3(element) || + CAN_EXPLODE_DYNA(element)); /* special case: sub-settings dependent from main setting */ if (CAN_EXPLODE_BY_FIRE(element)) @@ -4967,7 +4990,8 @@ static void CopyCustomElementPropertiesToEditor(int element) HAS_CHANGE_EVENT(element, CE_LEFT_BY_PLAYER) ? CE_LEFT_BY_PLAYER : HAS_CHANGE_EVENT(element, CE_DROPPED_BY_PLAYER) ? CE_DROPPED_BY_PLAYER : HAS_CHANGE_EVENT(element, CE_SWITCHED) ? CE_SWITCHED : - HAS_CHANGE_EVENT(element, CE_COLLISION) ? CE_COLLISION : + HAS_CHANGE_EVENT(element, CE_HITTING_SOMETHING) ? CE_HITTING_SOMETHING : + HAS_CHANGE_EVENT(element, CE_HIT_BY_SOMETHING) ? CE_HIT_BY_SOMETHING : HAS_CHANGE_EVENT(element, CE_IMPACT) ? CE_IMPACT : HAS_CHANGE_EVENT(element, CE_SMASHED) ? CE_SMASHED : custom_element_change.direct_action); @@ -4983,6 +5007,8 @@ static void CopyCustomElementPropertiesToEditor(int element) HAS_CHANGE_EVENT(element, CE_OTHER_GETS_COLLECTED) ? CE_OTHER_GETS_COLLECTED : HAS_CHANGE_EVENT(element, CE_OTHER_GETS_DROPPED) ? CE_OTHER_GETS_DROPPED : HAS_CHANGE_EVENT(element, CE_OTHER_IS_TOUCHING) ? CE_OTHER_IS_TOUCHING : + HAS_CHANGE_EVENT(element, CE_OTHER_IS_HITTING) ? CE_OTHER_IS_HITTING : + HAS_CHANGE_EVENT(element, CE_OTHER_GETS_HIT) ? CE_OTHER_GETS_HIT : HAS_CHANGE_EVENT(element, CE_OTHER_IS_SWITCHING) ? CE_OTHER_IS_SWITCHING : HAS_CHANGE_EVENT(element, CE_OTHER_IS_CHANGING) ? CE_OTHER_IS_CHANGING : HAS_CHANGE_EVENT(element, CE_OTHER_IS_EXPLODING) ? CE_OTHER_IS_EXPLODING : @@ -4999,7 +5025,7 @@ static void CopyCustomElementPropertiesToGame(int element) if (level.use_custom_template) { - if (Request("Copy and modify level tem- plate ?", REQ_ASK)) + if (Request("Copy and modify level template ?", REQ_ASK)) { level.use_custom_template = FALSE; ModifyGadget(level_editor_gadget[GADGET_ID_CUSTOM_USE_TEMPLATE], @@ -5057,6 +5083,7 @@ static void CopyCustomElementPropertiesToGame(int element) custom_element_properties[EP_INDESTRUCTIBLE] = FALSE; custom_element_properties[EP_CAN_EXPLODE_1X1] = FALSE; custom_element_properties[EP_CAN_EXPLODE_3X3] = FALSE; + custom_element_properties[EP_CAN_EXPLODE_DYNA] = FALSE; custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] = FALSE; custom_element_properties[EP_CAN_EXPLODE_SMASHED] = FALSE; custom_element_properties[EP_CAN_EXPLODE_IMPACT] = FALSE; @@ -5064,8 +5091,9 @@ static void CopyCustomElementPropertiesToGame(int element) custom_element_properties[EP_EXPLODE_RESULT]; /* special case: sub-settings dependent from main setting */ - if (custom_element_properties[EP_CAN_EXPLODE_3X3] || - custom_element_properties[EP_CAN_EXPLODE_1X1]) + if (custom_element_properties[EP_CAN_EXPLODE_1X1] || + custom_element_properties[EP_CAN_EXPLODE_3X3] || + custom_element_properties[EP_CAN_EXPLODE_DYNA]) { custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] = custom_element.can_explode_by_fire; @@ -5085,7 +5113,8 @@ static void CopyCustomElementPropertiesToGame(int element) custom_element_change_events[CE_LEFT_BY_PLAYER] = FALSE; custom_element_change_events[CE_DROPPED_BY_PLAYER] = FALSE; custom_element_change_events[CE_SWITCHED] = FALSE; - custom_element_change_events[CE_COLLISION] = FALSE; + custom_element_change_events[CE_HITTING_SOMETHING] = FALSE; + custom_element_change_events[CE_HIT_BY_SOMETHING] = FALSE; custom_element_change_events[CE_IMPACT] = FALSE; custom_element_change_events[CE_SMASHED] = FALSE; custom_element_change_events[custom_element_change.direct_action] = @@ -5101,6 +5130,8 @@ static void CopyCustomElementPropertiesToGame(int element) custom_element_change_events[CE_OTHER_GETS_COLLECTED] = FALSE; custom_element_change_events[CE_OTHER_GETS_DROPPED] = FALSE; custom_element_change_events[CE_OTHER_IS_TOUCHING] = FALSE; + custom_element_change_events[CE_OTHER_IS_HITTING] = FALSE; + custom_element_change_events[CE_OTHER_GETS_HIT] = FALSE; custom_element_change_events[CE_OTHER_IS_SWITCHING] = FALSE; custom_element_change_events[CE_OTHER_IS_CHANGING] = FALSE; custom_element_change_events[CE_OTHER_IS_EXPLODING] = FALSE; @@ -5510,8 +5541,7 @@ char *getElementDescriptionFilename(int element) static char *filename = NULL; char basename[MAX_FILENAME_LEN]; - if (filename != NULL) - free(filename); + checked_free(filename); /* 1st try: look for element description file for exactly this element */ sprintf(basename, "%s.txt", element_info[element].token_name); @@ -5547,6 +5577,26 @@ static boolean PrintInfoText(char *text, int font_nr, int start_line) return TRUE; } +#if 1 + +static int PrintElementDescriptionFromFile(char *filename, int start_line) +{ + int font_nr = FONT_TEXT_2; + int font_width = getFontWidth(font_nr); + int font_height = getFontHeight(font_nr); + int pad_x = ED_SETTINGS_XPOS(0); + int pad_y = ED_SETTINGS_YPOS(0) + ED_BORDER_SIZE; + int sx = SX + pad_x; + int sy = SY + pad_y + start_line * font_height; + int max_chars_per_line = (SXSIZE - 2 * pad_x) / font_width; + int max_lines_per_screen = (SYSIZE - pad_y) / font_height - 1; + + return DrawTextFromFile(sx, sy, filename, font_nr, max_chars_per_line, + max_lines_per_screen); +} + +#else + static int PrintElementDescriptionFromFile(char *filename, int start_line) { int font_nr = FONT_TEXT_2; @@ -5634,6 +5684,8 @@ static int PrintElementDescriptionFromFile(char *filename, int start_line) return (current_line - start_line); } +#endif + static void DrawPropertiesTabulatorGadgets() { struct GadgetInfo *gd_gi = level_editor_gadget[GADGET_ID_PROPERTIES_INFO]; @@ -6795,7 +6847,10 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) /* clicking into drawing area with pressed Control key picks element */ if (GetKeyModState() & KMOD_Control) + { + last_drawing_function = drawing_function; actual_drawing_function = GADGET_ID_PICK_ELEMENT; + } switch (actual_drawing_function) { @@ -7149,14 +7204,15 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) } else if (type_id == ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE) { - boolean new_template = (!LevelFileExists(-1)); + char *template_filename = getDefaultLevelFilename(-1); + boolean new_template = !fileExists(template_filename); if (new_template || - Request("Save this tem- plate and kill the old ?", REQ_ASK)) + Request("Save this template and kill the old ?", REQ_ASK)) SaveLevelTemplate(); if (new_template) - Request("Tem- plate saved !", REQ_CONFIRM); + Request("Template saved !", REQ_CONFIRM); } else if (type_id == ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE && custom_element.num_change_pages < MAX_CHANGE_PAGES) @@ -7237,9 +7293,11 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) } else if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE) { - if (level.use_custom_template && !LevelFileExists(-1)) + char *template_filename = getDefaultLevelFilename(-1); + + if (level.use_custom_template && !fileExists(template_filename)) { - Request("No level tem- plate found !", REQ_CONFIRM); + Request("No level template found !", REQ_CONFIRM); level.use_custom_template = FALSE; ModifyGadget(gi, GDI_CHECKED, FALSE, GDI_END); @@ -7520,7 +7578,8 @@ static void HandleControlButtons(struct GadgetInfo *gi) Request("No Level without Gregor Mc Duffin please !", REQ_CONFIRM); else { - boolean new_level = (!LevelFileExists(level_nr)); + char *level_filename = getDefaultLevelFilename(level_nr); + boolean new_level = !fileExists(level_filename); if (new_level || Request("Save this level and kill the old ?", REQ_ASK))