X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=b3304f7befcbc15ad8ba4f598b80937dcee33189;hb=40705fd048ae2a23c4598ada848570f798ced780;hp=0bbf8dd3e24a2db393f1e89e235cda6918793fd5;hpb=c7467e9ca66d7b19626a9ba8b8deaf535b27cab0;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 0bbf8dd3..b3304f7b 100644 --- a/src/editor.c +++ b/src/editor.c @@ -680,13 +680,13 @@ enum GADGET_ID_LEVEL_AUTHOR, GADGET_ID_LEVELSET_NAME, GADGET_ID_LEVELSET_AUTHOR, - GADGET_ID_BD_COLOR_RGB_B, - GADGET_ID_BD_COLOR_RGB_0, - GADGET_ID_BD_COLOR_RGB_1, - GADGET_ID_BD_COLOR_RGB_2, - GADGET_ID_BD_COLOR_RGB_3, - GADGET_ID_BD_COLOR_RGB_4, - GADGET_ID_BD_COLOR_RGB_5, + GADGET_ID_BD_COLOR_TEXT_B, + GADGET_ID_BD_COLOR_TEXT_0, + GADGET_ID_BD_COLOR_TEXT_1, + GADGET_ID_BD_COLOR_TEXT_2, + GADGET_ID_BD_COLOR_TEXT_3, + GADGET_ID_BD_COLOR_TEXT_4, + GADGET_ID_BD_COLOR_TEXT_5, GADGET_ID_ELEMENT_NAME, // text area identifiers @@ -1011,13 +1011,13 @@ enum ED_TEXTINPUT_ID_LEVEL_AUTHOR, ED_TEXTINPUT_ID_LEVELSET_NAME, ED_TEXTINPUT_ID_LEVELSET_AUTHOR, - ED_TEXTINPUT_ID_BD_COLOR_RGB_B, - ED_TEXTINPUT_ID_BD_COLOR_RGB_0, - ED_TEXTINPUT_ID_BD_COLOR_RGB_1, - ED_TEXTINPUT_ID_BD_COLOR_RGB_2, - ED_TEXTINPUT_ID_BD_COLOR_RGB_3, - ED_TEXTINPUT_ID_BD_COLOR_RGB_4, - ED_TEXTINPUT_ID_BD_COLOR_RGB_5, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_B, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_0, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_1, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_2, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_3, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_4, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_5, ED_TEXTINPUT_ID_ELEMENT_NAME, ED_NUM_TEXTINPUT @@ -1029,8 +1029,8 @@ enum #define ED_TEXTINPUT_ID_LEVELSET_FIRST ED_TEXTINPUT_ID_LEVELSET_NAME #define ED_TEXTINPUT_ID_LEVELSET_LAST ED_TEXTINPUT_ID_LEVELSET_AUTHOR -#define ED_TEXTINPUT_ID_COLORS_FIRST ED_TEXTINPUT_ID_BD_COLOR_RGB_B -#define ED_TEXTINPUT_ID_COLORS_LAST ED_TEXTINPUT_ID_BD_COLOR_RGB_5 +#define ED_TEXTINPUT_ID_COLORS_FIRST ED_TEXTINPUT_ID_BD_COLOR_TEXT_B +#define ED_TEXTINPUT_ID_COLORS_LAST ED_TEXTINPUT_ID_BD_COLOR_TEXT_5 // values for text area gadgets enum @@ -1666,11 +1666,12 @@ static boolean levelset_copy_level_template = FALSE; static int levelset_save_mode = LEVELSET_SAVE_MODE_UPDATE; #define MAX_BD_COLORS 7 -#define MAX_BD_COLOR_RGB_TEXT_LEN 7 +#define MAX_BD_COLOR_TEXT_LEN 10 static boolean bd_color_type_changed = FALSE; +static int bd_color_type_default = GD_COLOR_TYPE_RGB; static int bd_color_c64[MAX_BD_COLORS]; -static char bd_color_rgb[MAX_BD_COLORS][MAX_BD_COLOR_RGB_TEXT_LEN + 1]; +static char bd_color_text[MAX_BD_COLORS][MAX_BD_COLOR_TEXT_LEN + 1]; static int bd_color_default[MAX_BD_COLORS]; static int *bd_color[MAX_BD_COLORS] = { @@ -2161,60 +2162,60 @@ static struct // ---------- engine settings: colors --------------------------------------- { - ED_TEXTINPUT_ID_BD_COLOR_RGB_B, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_B, ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(1), - GADGET_ID_BD_COLOR_RGB_B, - MAX_BD_COLOR_RGB_TEXT_LEN, - bd_color_rgb[0], - NULL, "Border color: ", NULL, "Enter border color (not used)" + GADGET_ID_BD_COLOR_TEXT_B, + MAX_BD_COLOR_TEXT_LEN, + bd_color_text[0], + NULL, "Border color: ", NULL, "Enter border color (not used)" }, { - ED_TEXTINPUT_ID_BD_COLOR_RGB_0, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_0, ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(2), - GADGET_ID_BD_COLOR_RGB_0, - MAX_BD_COLOR_RGB_TEXT_LEN, - bd_color_rgb[1], - NULL, "Background color:", NULL, "Enter background color (C64 graphics)" + GADGET_ID_BD_COLOR_TEXT_0, + MAX_BD_COLOR_TEXT_LEN, + bd_color_text[1], + NULL, "Background color: ", NULL, "Enter background color (C64 graphics)" }, { - ED_TEXTINPUT_ID_BD_COLOR_RGB_1, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_1, ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(3), - GADGET_ID_BD_COLOR_RGB_1, - MAX_BD_COLOR_RGB_TEXT_LEN, - bd_color_rgb[2], - NULL, "Sand color: ", NULL, "Enter sand color (C64 graphics)" + GADGET_ID_BD_COLOR_TEXT_1, + MAX_BD_COLOR_TEXT_LEN, + bd_color_text[2], + NULL, "Sand color: ", NULL, "Enter sand color (C64 graphics)" }, { - ED_TEXTINPUT_ID_BD_COLOR_RGB_2, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_2, ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(4), - GADGET_ID_BD_COLOR_RGB_2, - MAX_BD_COLOR_RGB_TEXT_LEN, - bd_color_rgb[3], - NULL, "Steel wall color:", NULL, "Enter steel wall color (C64 graphics)" + GADGET_ID_BD_COLOR_TEXT_2, + MAX_BD_COLOR_TEXT_LEN, + bd_color_text[3], + NULL, "Steel wall color: ", NULL, "Enter steel wall color (C64 graphics)" }, { - ED_TEXTINPUT_ID_BD_COLOR_RGB_3, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_3, ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(5), - GADGET_ID_BD_COLOR_RGB_3, - MAX_BD_COLOR_RGB_TEXT_LEN, - bd_color_rgb[4], - NULL, "Wall color: ", NULL, "Enter wall color (C64 graphics)" + GADGET_ID_BD_COLOR_TEXT_3, + MAX_BD_COLOR_TEXT_LEN, + bd_color_text[4], + NULL, "Wall color: ", NULL, "Enter wall color (C64 graphics)" }, { - ED_TEXTINPUT_ID_BD_COLOR_RGB_4, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_4, ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(6), - GADGET_ID_BD_COLOR_RGB_4, - MAX_BD_COLOR_RGB_TEXT_LEN, - bd_color_rgb[5], - NULL, "Amoeba color: ", NULL, "Enter amoeba color (C64 graphics)" + GADGET_ID_BD_COLOR_TEXT_4, + MAX_BD_COLOR_TEXT_LEN, + bd_color_text[5], + NULL, "Amoeba color: ", NULL, "Enter amoeba color (C64 graphics)" }, { - ED_TEXTINPUT_ID_BD_COLOR_RGB_5, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_5, ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(7), - GADGET_ID_BD_COLOR_RGB_5, - MAX_BD_COLOR_RGB_TEXT_LEN, - bd_color_rgb[6], - NULL, "Slime color: ", NULL, "Enter slime color (C64 graphics)" + GADGET_ID_BD_COLOR_TEXT_5, + MAX_BD_COLOR_TEXT_LEN, + bd_color_text[6], + NULL, "Slime color: ", NULL, "Enter slime color (C64 graphics)" }, // ---------- element settings: configure (several elements) ---------------- @@ -2970,8 +2971,10 @@ static struct ValueTextInfo options_bd_scheduling_type[] = static struct ValueTextInfo options_bd_color_type[] = { - { GD_COLOR_TYPE_C64, "C64 colors" }, { GD_COLOR_TYPE_RGB, "RGB colors" }, + { GD_COLOR_TYPE_C64, "C64 colors" }, + { GD_COLOR_TYPE_C64DTV, "C64DTV colors" }, + { GD_COLOR_TYPE_ATARI, "Atari colors" }, { -1, NULL } }; @@ -3122,7 +3125,7 @@ static struct -1, options_bd_color_c64_name, &bd_color_c64[0], - NULL, "Border color: ", NULL, "Select border color (not used)" + NULL, "Border color: ", NULL, "Select border color (not used)" }, { ED_SELECTBOX_ID_BD_COLOR_C64_0, @@ -3131,7 +3134,7 @@ static struct -1, options_bd_color_c64_name, &bd_color_c64[1], - NULL, "Background color:", NULL, "Select background color (C64 graphics)" + NULL, "Background color: ", NULL, "Select background color (C64 graphics)" }, { ED_SELECTBOX_ID_BD_COLOR_C64_1, @@ -3140,7 +3143,7 @@ static struct -1, options_bd_color_c64_name, &bd_color_c64[2], - NULL, "Sand color: ", NULL, "Select sand color (C64 graphics)" + NULL, "Sand color: ", NULL, "Select sand color (C64 graphics)" }, { ED_SELECTBOX_ID_BD_COLOR_C64_2, @@ -3149,7 +3152,7 @@ static struct -1, options_bd_color_c64_name, &bd_color_c64[3], - NULL, "Steel wall color:", NULL, "Select steel wall color (C64 graphics)" + NULL, "Steel wall color: ", NULL, "Select steel wall color (C64 graphics)" }, { ED_SELECTBOX_ID_BD_COLOR_C64_3, @@ -3158,7 +3161,7 @@ static struct -1, options_bd_color_c64_name, &bd_color_c64[4], - NULL, "Wall color: ", NULL, "Select wall color (C64 graphics)" + NULL, "Wall color: ", NULL, "Select wall color (C64 graphics)" }, { ED_SELECTBOX_ID_BD_COLOR_C64_4, @@ -3167,7 +3170,7 @@ static struct -1, options_bd_color_c64_name, &bd_color_c64[5], - NULL, "Amoeba color: ", NULL, "Select amoeba color (C64 graphics)" + NULL, "Amoeba color: ", NULL, "Select amoeba color (C64 graphics)" }, { ED_SELECTBOX_ID_BD_COLOR_C64_5, @@ -3176,7 +3179,7 @@ static struct -1, options_bd_color_c64_name, &bd_color_c64[6], - NULL, "Slime color: ", NULL, "Select slime color (C64 graphics)" + NULL, "Slime color: ", NULL, "Select slime color (C64 graphics)" }, // ---------- element settings: configure (several elements) ---------------- @@ -10599,30 +10602,10 @@ static void InitDrawingElements(void) if (level.game_engine_type == game_engine_type_last) return; - 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; - new_element3 = EL_SP_BASE; - } - else if (level.game_engine_type == GAME_ENGINE_TYPE_MM) - { - new_element1 = EL_MM_MIRROR_START; - new_element2 = EL_EMPTY; - new_element3 = EL_MM_WOODEN_WALL; - } - else - { - new_element1 = EL_WALL; - new_element2 = EL_EMPTY; - new_element3 = EL_SAND; - } + // select drawing elements according to game engine type + new_element1 = getDrawingElement(EL_WALL); + new_element2 = getDrawingElement(EL_EMPTY); + new_element3 = getDrawingElement(EL_SAND); game_engine_type_last = level.game_engine_type; } @@ -11421,41 +11404,41 @@ static void DrawEngineConfigConfig(void) MapSelectboxGadget(i); } -static boolean CheckLevelColorsRGB_BD(void) +static int GetCommonColorType_BD(void) { - boolean rgb_colors = FALSE; + int bd_color_type = *bd_color[0] >> 24; int i; - // check if any level color is not a C64-style color index - for (i = 0; i < MAX_BD_COLORS; i++) - if (!gd_color_is_c64(*bd_color[i])) - rgb_colors = TRUE; + // check if all colors have the same color type + for (i = 1; i < MAX_BD_COLORS; i++) + if ((*bd_color[i] >> 24) != bd_color_type) + return GD_COLOR_TYPE_RGB; - return rgb_colors; + return bd_color_type; } void SetDefaultLevelColorType_BD(void) { - level.bd_color_type = (CheckLevelColorsRGB_BD() ? GD_COLOR_TYPE_RGB : GD_COLOR_TYPE_C64); + bd_color_type_default = GetCommonColorType_BD(); + + level.bd_color_type = bd_color_type_default; } void SetDefaultLevelColors_BD(void) { int i; - // only set default colors if C64 style palette - if (level.bd_color_type == GD_COLOR_TYPE_C64) - for (i = 0; i < MAX_BD_COLORS; i++) - bd_color_default[i] = *bd_color[i]; + for (i = 0; i < MAX_BD_COLORS; i++) + bd_color_default[i] = *bd_color[i]; } -static void SetRandomLevelColors_BD(void) +void SetRandomLevelColors_BD(int bd_color_type) { struct LevelInfo_BD *level_bd = level.native_bd_level; GdCave *cave = level_bd->cave; // create random cave colors - gd_cave_set_random_colors(cave, level.bd_color_type); + gd_cave_set_random_colors(cave, bd_color_type); // copy colors to level editor level.bd_color_b = cave->colorb; @@ -11467,45 +11450,87 @@ static void SetRandomLevelColors_BD(void) level.bd_color_5 = cave->color5; } +static void DrawColorBox_BD(int nr) +{ + int id = ED_SELECTBOX_ID_COLORS_FIRST + nr; + struct GadgetInfo *gi = level_editor_gadget[selectbox_info[id].gadget_id]; + int graphic = IMG_EDITOR_CHECKBOX; + struct GraphicInfo *gd = &graphic_info[graphic]; + int offset = ED_GADGET_TEXT_DISTANCE; + int x1 = gi->x - offset - gd->width; + int y1 = gi->y; + int x2 = x1 + offset; + int y2 = y1 + offset; + int xsize1 = gd->width; + int ysize1 = gd->height; + int xsize2 = xsize1 - 2 * offset; + int ysize2 = ysize1 - 2 * offset; + int bd_color_x = *bd_color[nr]; + int r = gd_color_get_r(bd_color_x); + int g = gd_color_get_g(bd_color_x); + int b = gd_color_get_b(bd_color_x); + Pixel color = SDL_MapRGB(drawto->surface->format, r, g, b); + + BlitBitmap(gd->bitmap, drawto, gd->src_x, gd->src_y, xsize1, ysize1, x1, y1); + FillRectangle(drawto, x2, y2, xsize2, ysize2, color); +} + static void DrawEngineConfigColors(void) { int i; if (bd_color_type_changed) { - if (level.bd_color_type == GD_COLOR_TYPE_C64 && CheckLevelColorsRGB_BD()) + if (level.bd_color_type != GD_COLOR_TYPE_RGB && level.bd_color_type != GetCommonColorType_BD()) { - // color palette switched to C64 colors, but using RGB colors => reset to defaults - for (i = 0; i < MAX_BD_COLORS; i++) - *bd_color[i] = bd_color_default[i]; + // color type switched to non-RGB colors, but using different color type => reset colors + + if (level.bd_color_type == bd_color_type_default) + { + // color type switched to same color type as default colors => reset to defaults + for (i = 0; i < MAX_BD_COLORS; i++) + *bd_color[i] = bd_color_default[i]; + } + else + { + // color type switched to different color type as default colors => use random colors + SetRandomLevelColors_BD(level.bd_color_type); + } } bd_color_type_changed = FALSE; } - // copy level colors to either C64-style color index or RGB color value + // copy level colors to either C64-style color index or color text for (i = 0; i < MAX_BD_COLORS; i++) { - if (level.bd_color_type == GD_COLOR_TYPE_RGB) - snprintf(bd_color_rgb[i], sizeof(bd_color_rgb[i]), "#%06x", gd_color_get_rgb(*bd_color[i])); + int bd_color_x = (level.bd_color_type == GD_COLOR_TYPE_C64 ? *bd_color[i] & 0x0f : + level.bd_color_type == GD_COLOR_TYPE_RGB ? gd_color_get_rgb(*bd_color[i]) : + *bd_color[i]); + + if (level.bd_color_type == GD_COLOR_TYPE_C64) + bd_color_c64[i] = bd_color_x; else - bd_color_c64[i] = *bd_color[i] & 0x0f; + snprintf(bd_color_text[i], sizeof(bd_color_text[i]), "%s", gd_color_get_string(bd_color_x)); } MapSelectboxGadget(ED_SELECTBOX_ID_BD_COLOR_TYPE); - if (level.bd_color_type == GD_COLOR_TYPE_RGB) - { - // draw text input gadgets - for (i = ED_TEXTINPUT_ID_COLORS_FIRST; i <= ED_TEXTINPUT_ID_COLORS_LAST; i++) - MapTextInputGadget(i); - } - else + if (level.bd_color_type == GD_COLOR_TYPE_C64) { // draw selectbox gadgets for (i = ED_SELECTBOX_ID_COLORS_FIRST; i <= ED_SELECTBOX_ID_COLORS_LAST; i++) MapSelectboxGadget(i); } + else + { + // draw text input gadgets + for (i = ED_TEXTINPUT_ID_COLORS_FIRST; i <= ED_TEXTINPUT_ID_COLORS_LAST; i++) + MapTextInputGadget(i); + } + + for (i = 0; i < MAX_BD_COLORS; i++) + DrawColorBox_BD(i); MapTextbuttonGadget(ED_TEXTBUTTON_ID_BD_SET_RANDOM_COLORS); } @@ -11528,6 +11553,11 @@ static void DrawLevelConfigWindow(void) stick_element_properties_window = FALSE; + // make sure that previous level config edit mode exists for this level + if (edit_mode_levelconfig == ED_MODE_LEVELCONFIG_ENGINE && + level.game_engine_type != GAME_ENGINE_TYPE_BD) + edit_mode_levelconfig = ED_MODE_LEVELCONFIG_LEVEL; + SetAutomaticNumberOfGemsNeeded(); UnmapLevelEditorFieldGadgets(); @@ -16323,7 +16353,9 @@ static void HandleTextInputGadgets(struct GadgetInfo *gi) { int pos = type_id - ED_TEXTINPUT_ID_COLORS_FIRST; - *bd_color[pos] = gd_color_get_from_string(bd_color_rgb[pos]); + *bd_color[pos] = gd_color_get_from_string(bd_color_text[pos]); + + DrawColorBox_BD(pos); } // do not mark level as modified for certain non-level-changing gadgets @@ -16398,10 +16430,14 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi) { bd_color_type_changed = TRUE; - if (level.bd_color_type == GD_COLOR_TYPE_C64 && CheckLevelColorsRGB_BD()) + if (level.bd_color_type != GD_COLOR_TYPE_RGB && level.bd_color_type != GetCommonColorType_BD()) { - // color palette switched to C64 colors, but using RGB colors => reset to defaults - if (!Request("This will reset C64 colors to defaults! Continue?", REQ_ASK)) + // color type switched to non-RGB colors, but using different color type => reset colors + char *message = (level.bd_color_type == bd_color_type_default ? + "This will reset colors to defaults! Continue?" : + "This will reset colors to random colors! Continue?"); + + if (!Request(message, REQ_ASK)) { // keep current RGB colors level.bd_color_type = GD_COLOR_TYPE_RGB; @@ -16418,6 +16454,8 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi) int pos = type_id - ED_SELECTBOX_ID_COLORS_FIRST; *bd_color[pos] = gd_c64_color(bd_color_c64[pos]); + + DrawColorBox_BD(pos); } // do not mark level as modified for certain non-level-changing gadgets @@ -16583,7 +16621,7 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) } else if (type_id == ED_TEXTBUTTON_ID_BD_SET_RANDOM_COLORS) { - SetRandomLevelColors_BD(); + SetRandomLevelColors_BD(level.bd_color_type); // update BD color palette gadgets after setting random colors DrawLevelConfigWindow();