X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=68dcf25612655fa089dd52c0aebc40bc72df89b0;hb=01732be3e0e75dbeebc5272b96a2d8dac127c4db;hp=4dce1f20be6c85f50c41abd25f13f80602862f6e;hpb=51fac215ea420ec5bc559d49300e3f871203f134;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 4dce1f20..68dcf256 100644 --- a/src/editor.c +++ b/src/editor.c @@ -1618,6 +1618,7 @@ static struct ValueTextInfo options_game_engine_type[] = { GAME_ENGINE_TYPE_RND, "Rocks'n'Diamonds" }, { GAME_ENGINE_TYPE_EM, "Emerald Mine" }, { GAME_ENGINE_TYPE_SP, "Supaplex" }, + { GAME_ENGINE_TYPE_MM, "Mirror Magic" }, { -1, NULL } }; @@ -4215,6 +4216,116 @@ static int *editor_el_dx_boulderdash_ptr = editor_el_dx_boulderdash; static int num_editor_hl_dx_boulderdash = SIZEOF_ARRAY_INT(editor_hl_dx_boulderdash); static int num_editor_el_dx_boulderdash = SIZEOF_ARRAY_INT(editor_el_dx_boulderdash); +static int editor_hl_mirror_magic[] = +{ + EL_INTERNAL_CASCADE_MM_ACTIVE, + EL_CHAR('M'), + EL_CHAR('M'), + EL_EMPTY, +}; + +static int editor_el_mirror_magic[] = +{ + EL_MM_MCDUFFIN_RIGHT, + EL_MM_MCDUFFIN_UP, + EL_MM_MCDUFFIN_LEFT, + EL_MM_MCDUFFIN_DOWN, + + EL_MM_MIRROR_START, + EL_MM_MIRROR_FIXED_START, + EL_MM_POLARISATOR_START, + EL_MM_POLARISATOR_CROSS_START, + + EL_MM_BEAMER_RED_START, + EL_MM_BEAMER_YELLOW_START, + EL_MM_BEAMER_GREEN_START, + EL_MM_BEAMER_BLUE_START, + + EL_MM_PRISM, + EL_MM_FUSE_ACTIVE, + EL_MM_PACMAN_RIGHT, + EL_MM_EXIT_CLOSED, + + EL_MM_KETTLE, + EL_MM_BOMB, + EL_MM_KEY, + EL_MM_FUEL_FULL, + + EL_MM_LIGHTBULB, + EL_MM_LIGHTBULB_ACTIVE, + EL_MM_GRAY_BALL, + EL_MM_LIGHTBALL, + + EL_MM_STEEL_WALL, + EL_MM_WOODEN_WALL, + EL_MM_ICE_WALL, + EL_MM_AMOEBA_WALL, + + EL_MM_STEEL_LOCK, + EL_MM_WOODEN_LOCK, + EL_MM_STEEL_BLOCK, + EL_MM_WOODEN_BLOCK, + + EL_MM_STEEL_GRID_FIXED_1, + EL_MM_STEEL_GRID_FIXED_2, + EL_MM_STEEL_GRID_FIXED_3, + EL_MM_STEEL_GRID_FIXED_4, + + EL_MM_WOODEN_GRID_FIXED_1, + EL_MM_WOODEN_GRID_FIXED_2, + EL_MM_WOODEN_GRID_FIXED_3, + EL_MM_WOODEN_GRID_FIXED_4 +}; +static int *editor_hl_mirror_magic_ptr = editor_hl_mirror_magic; +static int *editor_el_mirror_magic_ptr = editor_el_mirror_magic; +static int num_editor_hl_mirror_magic = SIZEOF_ARRAY_INT(editor_hl_mirror_magic); +static int num_editor_el_mirror_magic = SIZEOF_ARRAY_INT(editor_el_mirror_magic); + +static int editor_hl_deflektor[] = +{ + EL_INTERNAL_CASCADE_DF_ACTIVE, + EL_CHAR('D'), + EL_CHAR('F'), + EL_EMPTY, +}; + +static int editor_el_deflektor[] = +{ + EL_DF_LASER_RIGHT, + EL_DF_LASER_UP, + EL_DF_LASER_LEFT, + EL_DF_LASER_DOWN, + + EL_DF_RECEIVER_RIGHT, + EL_DF_RECEIVER_UP, + EL_DF_RECEIVER_LEFT, + EL_DF_RECEIVER_DOWN, + + EL_DF_MIRROR_START, + EL_DF_MIRROR_ROTATING_START, + EL_DF_CELL, + EL_DF_MINE, + + EL_DF_FIBRE_OPTIC_RED_1, + EL_DF_FIBRE_OPTIC_YELLOW_1, + EL_DF_FIBRE_OPTIC_GREEN_1, + EL_DF_FIBRE_OPTIC_BLUE_1, + + EL_DF_STEEL_GRID_FIXED_START, + EL_DF_STEEL_GRID_ROTATING_START, + EL_DF_WOODEN_GRID_FIXED_START, + EL_DF_WOODEN_GRID_ROTATING_START, + + EL_DF_STEEL_WALL, + EL_DF_WOODEN_WALL, + EL_DF_REFRACTOR, + EL_EMPTY +}; +static int *editor_hl_deflektor_ptr = editor_hl_deflektor; +static int *editor_el_deflektor_ptr = editor_el_deflektor; +static int num_editor_hl_deflektor = SIZEOF_ARRAY_INT(editor_hl_deflektor); +static int num_editor_el_deflektor = SIZEOF_ARRAY_INT(editor_el_deflektor); + static int editor_hl_chars[] = { EL_INTERNAL_CASCADE_CHARS_ACTIVE, @@ -4911,6 +5022,23 @@ static int num_editor_elements = 0; /* dynamically determined */ static boolean setup_editor_cascade_never = FALSE; +static boolean setup_editor_el_players = TRUE; +static boolean setup_editor_el_boulderdash = 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; +static boolean setup_editor_el_sokoban = TRUE; +static boolean setup_editor_el_supaplex = TRUE; +static boolean setup_editor_el_diamond_caves = TRUE; +static boolean setup_editor_el_dx_boulderdash = TRUE; +static boolean setup_editor_el_mirror_magic = TRUE; +static boolean setup_editor_el_deflektor = TRUE; +static boolean setup_editor_el_chars = TRUE; +static boolean setup_editor_el_steel_chars = TRUE; +static boolean setup_editor_el_custom = TRUE; +static boolean setup_editor_el_user_defined = TRUE; +static boolean setup_editor_el_dynamic = TRUE; + static int editor_hl_unused[] = { EL_EMPTY }; static int *editor_hl_unused_ptr = editor_hl_unused; static int num_editor_hl_unused = 0; @@ -4931,97 +5059,109 @@ static struct editor_elements_info[] = { { - &setup.editor.el_classic, + &setup_editor_el_players, &setup_editor_cascade_never, &editor_hl_unused_ptr, &num_editor_hl_unused, &editor_el_players_ptr, &num_editor_el_players }, { - &setup.editor.el_classic, + &setup_editor_el_boulderdash, &setup.editor_cascade.el_bd, &editor_hl_boulderdash_ptr, &num_editor_hl_boulderdash, &editor_el_boulderdash_ptr, &num_editor_el_boulderdash }, { - &setup.editor.el_classic, + &setup_editor_el_emerald_mine, &setup.editor_cascade.el_em, &editor_hl_emerald_mine_ptr, &num_editor_hl_emerald_mine, &editor_el_emerald_mine_ptr, &num_editor_el_emerald_mine }, { - &setup.editor.el_classic, + &setup_editor_el_emerald_mine_club, &setup.editor_cascade.el_emc, &editor_hl_emerald_mine_club_ptr, &num_editor_hl_emerald_mine_club, &editor_el_emerald_mine_club_ptr, &num_editor_el_emerald_mine_club }, { - &setup.editor.el_classic, + &setup_editor_el_more, &setup.editor_cascade.el_rnd, &editor_hl_rnd_ptr, &num_editor_hl_rnd, &editor_el_rnd_ptr, &num_editor_el_rnd }, { - &setup.editor.el_classic, + &setup_editor_el_sokoban, &setup.editor_cascade.el_sb, &editor_hl_sokoban_ptr, &num_editor_hl_sokoban, &editor_el_sokoban_ptr, &num_editor_el_sokoban }, { - &setup.editor.el_classic, + &setup_editor_el_supaplex, &setup.editor_cascade.el_sp, &editor_hl_supaplex_ptr, &num_editor_hl_supaplex, &editor_el_supaplex_ptr, &num_editor_el_supaplex }, { - &setup.editor.el_classic, + &setup_editor_el_diamond_caves, &setup.editor_cascade.el_dc, &editor_hl_diamond_caves_ptr, &num_editor_hl_diamond_caves, &editor_el_diamond_caves_ptr, &num_editor_el_diamond_caves }, { - &setup.editor.el_classic, + &setup_editor_el_dx_boulderdash, &setup.editor_cascade.el_dx, &editor_hl_dx_boulderdash_ptr, &num_editor_hl_dx_boulderdash, &editor_el_dx_boulderdash_ptr, &num_editor_el_dx_boulderdash }, { - &setup.editor.el_classic, + &setup_editor_el_mirror_magic, + &setup.editor_cascade.el_mm, + &editor_hl_mirror_magic_ptr, &num_editor_hl_mirror_magic, + &editor_el_mirror_magic_ptr, &num_editor_el_mirror_magic + }, + { + &setup_editor_el_deflektor, + &setup.editor_cascade.el_df, + &editor_hl_deflektor_ptr, &num_editor_hl_deflektor, + &editor_el_deflektor_ptr, &num_editor_el_deflektor + }, + { + &setup_editor_el_chars, &setup.editor_cascade.el_chars, &editor_hl_chars_ptr, &num_editor_hl_chars, &editor_el_chars_ptr, &num_editor_el_chars }, { - &setup.editor.el_classic, + &setup_editor_el_steel_chars, &setup.editor_cascade.el_steel_chars, &editor_hl_steel_chars_ptr, &num_editor_hl_steel_chars, &editor_el_steel_chars_ptr, &num_editor_el_steel_chars }, { - &setup.editor.el_custom, + &setup_editor_el_custom, &setup.editor_cascade.el_ce, &editor_hl_custom_ptr, &num_editor_hl_custom, &editor_el_custom_ptr, &num_editor_el_custom }, { - &setup.editor.el_custom, + &setup_editor_el_custom, &setup.editor_cascade.el_ge, &editor_hl_group_ptr, &num_editor_hl_group, &editor_el_group_ptr, &num_editor_el_group }, { - &setup.editor.el_custom, + &setup_editor_el_custom, &setup.editor_cascade.el_ref, &editor_hl_reference_ptr, &num_editor_hl_reference, &editor_el_reference_ptr, &num_editor_el_reference }, { - &setup.editor.el_user_defined, + &setup_editor_el_user_defined, &setup.editor_cascade.el_user, &editor_hl_user_defined_ptr, &num_editor_hl_user_defined, &editor_el_user_defined_ptr, &num_editor_el_user_defined }, { - &setup.editor.el_dynamic, + &setup_editor_el_dynamic, &setup.editor_cascade.el_dynamic, &editor_hl_dynamic_ptr, &num_editor_hl_dynamic, &editor_el_dynamic_ptr, &num_editor_el_dynamic, @@ -5186,12 +5326,122 @@ static void InitDynamicEditorElementList(int **elements, int *num_elements) (*elements)[(*num_elements)++] = EL_EMPTY; } +static void ReinitializeElementList_EnableSections() +{ + /* default: enable all element sections */ + + setup_editor_el_players = TRUE; + setup_editor_el_boulderdash = TRUE; + setup_editor_el_emerald_mine = TRUE; + setup_editor_el_emerald_mine_club = TRUE; + setup_editor_el_more = TRUE; + setup_editor_el_sokoban = TRUE; + setup_editor_el_supaplex = TRUE; + setup_editor_el_diamond_caves = TRUE; + setup_editor_el_dx_boulderdash = TRUE; + setup_editor_el_mirror_magic = TRUE; + setup_editor_el_deflektor = TRUE; + setup_editor_el_chars = TRUE; + setup_editor_el_steel_chars = TRUE; + + setup_editor_el_custom = TRUE; + setup_editor_el_user_defined = TRUE; + setup_editor_el_dynamic = TRUE; + + /* now disable all element sections not to be displayed */ + + if (!setup.editor.el_classic) + { + 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; + } + + if (!setup.editor.el_custom) + { + setup_editor_el_custom = FALSE; + } + + if (!setup.editor.el_user_defined) + { + setup_editor_el_user_defined = FALSE; + } + + if (!setup.editor.el_dynamic) + { + setup_editor_el_dynamic = FALSE; + } + + if (level.game_engine_type == GAME_ENGINE_TYPE_RND) + { + setup_editor_el_mirror_magic = FALSE; + setup_editor_el_deflektor = FALSE; + } + else if (level.game_engine_type == GAME_ENGINE_TYPE_EM) + { + setup_editor_el_boulderdash = FALSE; + setup_editor_el_more = FALSE; + setup_editor_el_sokoban = FALSE; + setup_editor_el_supaplex = FALSE; + setup_editor_el_dx_boulderdash = FALSE; + setup_editor_el_mirror_magic = FALSE; + setup_editor_el_deflektor = FALSE; + setup_editor_el_steel_chars = FALSE; + + setup_editor_el_custom = FALSE; + } + else if (level.game_engine_type == GAME_ENGINE_TYPE_SP) + { + 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_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_MM) + { + 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_steel_chars = FALSE; + + setup_editor_el_custom = FALSE; + } +} + static void ReinitializeElementList() { static boolean initialization_needed = TRUE; int pos = 0; int i, j; + ReinitializeElementList_EnableSections(); + if (initialization_needed) { LoadSetup_EditorCascade(); /* load last editor cascade state */ @@ -5236,7 +5486,7 @@ static void ReinitializeElementList() Error(ERR_WARN, "editor element %d is runtime element", element); if (strEqual(getElementInfoText(element), INFOTEXT_UNKNOWN_ELEMENT)) - Error(ERR_WARN, "no element description for element %d", element); + Error(ERR_WARN, "no element description text for element %d", element); } } @@ -7802,7 +8052,8 @@ void CheckElementDescriptions() for (i = 0; i < NUM_FILE_ELEMENTS; i++) if (getElementDescriptionFilename(i) == NULL && !IS_OBSOLETE(i)) - Error(ERR_WARN, "no element description for element '%s'", EL_NAME(i)); + Error(ERR_WARN, "no element description file for element '%s'", + EL_NAME(i)); } static int getMaxEdFieldX(boolean has_scrollbar) @@ -8598,41 +8849,22 @@ static void DrawEnvelopeTextArea(int envelope_nr) MapTextAreaGadget(ED_TEXTAREA_ID_ENVELOPE_INFO); } -static boolean PrintInfoText(char *text, int font_nr, int start_line) +static void PrintInfoText(char *text, int font_nr, int xpos, int ypos) { - int font_height = getFontHeight(font_nr); - int pad_x = ED_ELEMENT_SETTINGS_X(0); - int pad_y = ED_ELEMENT_SETTINGS_Y(0) + ED_GADGET_SMALL_DISTANCE; - int sx = SX + pad_x; - int sy = SY + pad_y; - int max_lines_per_screen = (SYSIZE - pad_y) / font_height - 1; - - if (start_line >= max_lines_per_screen) - return FALSE; - - DrawText(sx, sy + start_line * font_height, text, font_nr); - - return TRUE; + DrawText(SX + xpos, SY + ypos, text, font_nr); } -static int PrintElementDescriptionFromFile(char *filename, int start_line) +static int PrintElementDescriptionFromFile(char *filename, int font_nr, + int xpos, int ypos) { - int font_nr = FONT_TEXT_2; int font_width = getFontWidth(font_nr); int font_height = getFontHeight(font_nr); - int pad_x = ED_ELEMENT_SETTINGS_X(0); - int pad_y = ED_ELEMENT_SETTINGS_Y(0) + ED_GADGET_SMALL_DISTANCE; - 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; - int max_lines_drawable = max_lines_per_screen - start_line; - - if (start_line >= max_lines_per_screen) - return FALSE; + int max_chars_per_line = (SXSIZE - 2 * xpos) / font_width; + int max_lines_drawable = (SYSIZE - ypos) / font_height - 1; - return DrawTextFile(sx, sy, filename, font_nr, max_chars_per_line, -1, - max_lines_drawable, 0, -1, TRUE, FALSE, FALSE); + return DrawTextFile(SX + xpos, SY + ypos, filename, font_nr, + max_chars_per_line, -1, max_lines_drawable, 0, -1, + TRUE, FALSE, FALSE); } static void DrawPropertiesInfo() @@ -8698,23 +8930,34 @@ static void DrawPropertiesInfo() char *filename = getElementDescriptionFilename(properties_element); char *percentage_text = "In this level: "; char *properties_text = "Standard properties: "; + char *description_text = "Description:"; + char *no_description_text = "No description available."; + char *none_text = "None"; float percentage; int num_elements_in_level; int num_standard_properties = 0; int font1_nr = FONT_TEXT_1; int font2_nr = FONT_TEXT_2; int font1_width = getFontWidth(font1_nr); + int font1_height = getFontHeight(font1_nr); int font2_height = getFontHeight(font2_nr); - int pad_x = ED_ELEMENT_SETTINGS_X(0); - int pad_y = ED_ELEMENT_SETTINGS_Y(0) + ED_GADGET_SMALL_DISTANCE; - int screen_line = 0; + int line1_height = font1_height + ED_GADGET_LINE_DISTANCE; + int font2_yoffset = (font1_height - font2_height) / 2; + int percentage_text_len = strlen(percentage_text) * font1_width; + int properties_text_len = strlen(properties_text) * font1_width; + int xpos = ED_ELEMENT_SETTINGS_X(0); + int ypos = ED_ELEMENT_SETTINGS_Y(0) + ED_GADGET_SMALL_DISTANCE; int i, x, y; if (setup.editor.show_element_token) { - DrawTextF(pad_x, pad_y + screen_line++ * font2_height, FONT_TEXT_3, + int font3_nr = FONT_TEXT_3; + int font3_height = getFontHeight(font3_nr); + + DrawTextF(xpos, ypos, font3_nr, "[%s]", element_info[properties_element].token_name); - screen_line++; + + ypos += 2 * font3_height; } /* ----- print number of elements / percentage of this element in level */ @@ -8726,40 +8969,53 @@ static void DrawPropertiesInfo() num_elements_in_level++; percentage = num_elements_in_level * 100.0 / (lev_fieldx * lev_fieldy); - DrawTextS(pad_x, pad_y + screen_line * font2_height, font1_nr, - percentage_text); - DrawTextF(pad_x + strlen(percentage_text) * font1_width, - pad_y + screen_line++ * font2_height, font2_nr, - "%d (%.2f%%)", num_elements_in_level, percentage); + DrawTextS(xpos, ypos, font1_nr, percentage_text); + + if (num_elements_in_level > 0) + DrawTextF(xpos + percentage_text_len, ypos + font2_yoffset, font2_nr, + "%d (%.2f %%)", num_elements_in_level, percentage); + else + DrawTextF(xpos + percentage_text_len, ypos + font2_yoffset, font2_nr, + none_text); - screen_line++; + ypos += 2 * MAX(font1_height, font2_height); /* ----- print standard properties of this element */ - DrawTextS(pad_x, pad_y + screen_line++ * font2_height, font1_nr, - properties_text); + DrawTextS(xpos, ypos, font1_nr, properties_text); + + ypos += line1_height; for (i = 0; properties[i].value != -1; i++) { if (!HAS_PROPERTY(properties_element, properties[i].value)) continue; - DrawTextS(pad_x, pad_y + screen_line++ * font2_height, font2_nr, - properties[i].text); + DrawTextS(xpos, ypos, font2_nr, properties[i].text); + + ypos += font2_height; + num_standard_properties++; } if (num_standard_properties == 0) - DrawTextS(pad_x + strlen(properties_text) * font1_width, - pad_y + (screen_line - 1) * font2_height, font2_nr, "none"); + { + DrawTextS(xpos + properties_text_len, ypos - line1_height + font2_yoffset, + font2_nr, none_text); - screen_line++; + ypos -= (line1_height - font1_height); + } + + ypos += MAX(font1_height, font2_height); /* ----- print special description of this element */ - PrintInfoText("Description:", FONT_TEXT_1, screen_line); - if (PrintElementDescriptionFromFile(filename, screen_line + 1) == 0) - PrintInfoText("No description available.", FONT_TEXT_1, screen_line); + PrintInfoText(description_text, font1_nr, xpos, ypos); + + ypos += line1_height; + + if (PrintElementDescriptionFromFile(filename, font2_nr, xpos, ypos) == 0) + PrintInfoText(no_description_text, font1_nr, xpos, ypos - line1_height); } #define TEXT_COLLECTING "Score for collecting" @@ -8922,7 +9178,11 @@ static void DrawPropertiesConfig() if (!checkPropertiesConfig(properties_element)) { - PrintInfoText("No configuration options available.", FONT_TEXT_1, 0); + int xpos = ED_ELEMENT_SETTINGS_X(0); + int ypos = ED_ELEMENT_SETTINGS_Y(0) + ED_GADGET_SMALL_DISTANCE; + + PrintInfoText("No configuration options available.", + FONT_TEXT_1, xpos, ypos); return; } @@ -11357,6 +11617,8 @@ static void HandleCounterButtons(struct GadgetInfo *gi) LoadLevel(level_nr); LoadScore(level_nr); + SaveLevelSetup_SeriesInfo(); + TapeErase(); ResetUndoBuffer(); @@ -11481,6 +11743,12 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi) level.changed = TRUE; } + else if (type_id == ED_SELECTBOX_ID_GAME_ENGINE_TYPE) + { + /* update element selection list */ + ReinitializeElementList(); + ModifyEditorElementList(); + } } static void HandleTextbuttonGadgets(struct GadgetInfo *gi)