X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Feditor.c;h=dddcaa8e78f1518c46d3f84afffe6ce5d62a0427;hp=92d6fb13ebd3aee12e563e095f8af2b908978320;hb=45e0606e403584e46cd3c005d488cc274db8e871;hpb=d01e22a131aef25baab99c9478faf9e94531c4fd diff --git a/src/editor.c b/src/editor.c index 92d6fb13..dddcaa8e 100644 --- a/src/editor.c +++ b/src/editor.c @@ -832,7 +832,7 @@ #define ED_NUM_SELECTBOX 29 #define ED_SELECTBOX_ID_LEVEL_FIRST ED_SELECTBOX_ID_TIME_OR_STEPS -#define ED_SELECTBOX_ID_LEVEL_LAST ED_SELECTBOX_ID_WIND_DIRECTION +#define ED_SELECTBOX_ID_LEVEL_LAST ED_SELECTBOX_ID_GAME_ENGINE_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 @@ -1332,7 +1332,7 @@ static struct "score for each second/step left:", NULL, NULL }, { - ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(13), + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(12), 0, 9999, GADGET_ID_LEVEL_RANDOM_SEED_DOWN, GADGET_ID_LEVEL_RANDOM_SEED_UP, GADGET_ID_LEVEL_RANDOM_SEED_TEXT, GADGET_ID_NONE, @@ -2347,24 +2347,24 @@ static struct NULL, "(0 => no limit)", "time or step limit" }, { - ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(12), + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(11), GADGET_ID_GAME_ENGINE_TYPE, GADGET_ID_NONE, -1, options_game_engine_type, &level.game_engine_type, "game engine:", NULL, "game engine" }, + + /* ---------- element settings: configure (several elements) ------------- */ + { - ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(11), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), GADGET_ID_WIND_DIRECTION, GADGET_ID_NONE, -1, options_wind_direction, &level.wind_direction_initial, "initial wind direction:", NULL, "initial wind direction" }, - - /* ---------- element settings: configure (several elements) ------------- */ - { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(7), GADGET_ID_PLAYER_SPEED, GADGET_ID_NONE, @@ -3643,6 +3643,7 @@ static void DrawPaletteWindow(); static void UpdateCustomElementGraphicGadgets(); static boolean checkPropertiesConfig(int); static void SetAutomaticNumberOfGemsNeeded(); +static void ClearEditorGadgetInfoText(); static void CopyLevelToUndoBuffer(int); static void HandleDrawingAreas(struct GadgetInfo *); static void HandleCounterButtons(struct GadgetInfo *); @@ -3657,6 +3658,7 @@ static void HandleControlButtons(struct GadgetInfo *); static void HandleDrawingAreaInfo(struct GadgetInfo *); static void PrintEditorGadgetInfoText(struct GadgetInfo *); static boolean AskToCopyAndModifyLevelTemplate(); +static boolean getDrawModeHiRes(); static int num_editor_gadgets = 0; /* dynamically determined */ @@ -5658,7 +5660,7 @@ static void ReinitializeElementList() void PrintEditorElementList() { - boolean *stop = &setup.editor.el_user_defined; + boolean *stop = &setup_editor_el_user_defined; int i, j; for (i = 0; editor_elements_info[i].setup_value != stop; i++) @@ -8147,8 +8149,16 @@ static int getMaxEdFieldY(boolean has_scrollbar) return max_ed_fieldy; } -void InitZoomLevelSettings() +void InitZoomLevelSettings(int zoom_tilesize) { + if (zoom_tilesize == -1) + zoom_tilesize = setup.auto_setup.editor_zoom_tilesize; + + // limit zoom tilesize by upper and lower bound + zoom_tilesize = MIN(MAX(MICRO_TILESIZE, zoom_tilesize), TILESIZE); + + ed_tilesize = setup.auto_setup.editor_zoom_tilesize = zoom_tilesize; + MAX_ED_FIELDX = getMaxEdFieldX(FALSE); MAX_ED_FIELDY = getMaxEdFieldY(FALSE); } @@ -8169,7 +8179,7 @@ void DrawLevelEd() ClearField(); - InitZoomLevelSettings(); + InitZoomLevelSettings(-1); OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2 | DOOR_NO_DELAY); @@ -9105,6 +9115,10 @@ static void DrawPropertiesInfo() #define TEXT_CRACKING "Score for cracking" #define TEXT_AMOEBA_SPEED "Speed of amoeba growth" #define TEXT_DURATION "Duration when activated" +#define TEXT_DELAY_ON "Delay before activating" +#define TEXT_DELAY_OFF "Delay before deactivating" +#define TEXT_DELAY_EXPLODING "Delay before exploding" +#define TEXT_DELAY_MOVING "Delay before moving" #define TEXT_BALL_DELAY "Element generation delay" #define TEXT_MOVE_SPEED "Speed of android moving" #define TEXT_CLONE_SPEED "Speed of android cloning" @@ -9186,6 +9200,15 @@ static struct { 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 }, @@ -9221,10 +9244,11 @@ static struct { EL_SPRING, &level.slurp_score, TEXT_SLURPING }, { EL_EMC_LENSES, &level.lenses_time, TEXT_DURATION }, { EL_EMC_MAGNIFIER, &level.magnify_time, TEXT_DURATION }, -#if 0 - /* defined, but currently not used in MM engine */ - { EL_MM_FUSE_ACTIVE, &level.mm_time_fuse, TEXT_DURATION }, -#endif + { 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_ON }, + { 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 } }; @@ -9236,6 +9260,7 @@ static boolean checkPropertiesConfig(int element) if (IS_GEM(element) || IS_CUSTOM_ELEMENT(element) || IS_GROUP_ELEMENT(element) || + IS_BALLOON_ELEMENT(element) || IS_ENVELOPE(element) || IS_MM_MCDUFFIN(element) || IS_DF_LASER(element) || @@ -9449,7 +9474,8 @@ static void DrawPropertiesConfig() ED_ELEMENT_SETTINGS_XPOS(IS_CUSTOM_ELEMENT(properties_element) ? 1 : 0); checkbutton_info[ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID].y = ED_ELEMENT_SETTINGS_YPOS(IS_CUSTOM_ELEMENT(properties_element) ? 6 : - HAS_EDITOR_CONTENT(properties_element) ? 1 : 0); + IS_BALLOON_ELEMENT(properties_element) || + HAS_EDITOR_CONTENT(properties_element) ? 1 : 0); MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID); } @@ -9476,6 +9502,9 @@ static void DrawPropertiesConfig() properties_element == EL_SOKOBAN_FIELD_FULL) MapCheckbuttonGadget(ED_CHECKBUTTON_ID_AUTO_EXIT_SOKOBAN); + if (IS_BALLOON_ELEMENT(properties_element)) + MapSelectboxGadget(ED_SELECTBOX_ID_WIND_DIRECTION); + if (IS_ENVELOPE(properties_element)) { int counter1_id = ED_COUNTER_ID_ENVELOPE_XSIZE; @@ -10268,7 +10297,8 @@ static void SetElementSimpleExt(int x, int y, int dx, int dy, int element, int sx = x - level_xpos; int sy = y - level_ypos; int old_element = Feld[x][y]; - unsigned int new_bitmask = (dx + 1) << (dy * 2); + int new_element = element; + unsigned int new_bitmask = (getDrawModeHiRes() ? (dx + 1) << (dy * 2) : 0x0f); boolean draw_masked = FALSE; if (IS_MM_WALL_EDITOR(element)) @@ -10296,7 +10326,9 @@ static void SetElementSimpleExt(int x, int y, int dx, int dy, int element, if (IN_ED_FIELD(sx, sy)) { - if (draw_masked) + if (IS_MM_WALL(old_element) && new_element == EL_EMPTY) + DrawSizedWallParts_MM(sx, sy, EL_EMPTY, ed_tilesize, FALSE, new_bitmask); + else if (draw_masked) DrawEditorElementThruMask(sx, sy, element); else DrawEditorElement(sx, sy, element); @@ -10679,10 +10711,14 @@ static void SetElementIntelliDraw(int x, int y, int new_element, { EL_EM_EXIT_CLOSED, EL_EM_EXIT_OPEN }, { EL_EM_STEEL_EXIT_CLOSED, EL_EM_STEEL_EXIT_OPEN }, { EL_QUICKSAND_FAST_EMPTY, EL_QUICKSAND_FAST_FULL }, + { EL_MM_EXIT_CLOSED, EL_MM_EXIT_OPEN }, + { EL_MM_FUSE, EL_MM_FUSE_ACTIVE }, + { EL_MM_LIGHTBULB, EL_MM_LIGHTBULB_ACTIVE }, + { EL_MM_FUEL_EMPTY, EL_MM_FUEL_FULL }, { -1, -1 }, }; - static int rotatable_elements[][4] = + static int rotatable_elements_4[][4] = { { EL_BUG_UP, @@ -10690,95 +10726,344 @@ static void SetElementIntelliDraw(int x, int y, int new_element, EL_BUG_DOWN, EL_BUG_LEFT }, - { EL_SPACESHIP_UP, EL_SPACESHIP_RIGHT, EL_SPACESHIP_DOWN, EL_SPACESHIP_LEFT }, - { EL_BD_BUTTERFLY_UP, EL_BD_BUTTERFLY_RIGHT, EL_BD_BUTTERFLY_DOWN, EL_BD_BUTTERFLY_LEFT }, - { EL_BD_FIREFLY_UP, EL_BD_FIREFLY_RIGHT, EL_BD_FIREFLY_DOWN, EL_BD_FIREFLY_LEFT }, - { EL_PACMAN_UP, EL_PACMAN_RIGHT, EL_PACMAN_DOWN, EL_PACMAN_LEFT }, - { EL_YAMYAM_UP, EL_YAMYAM_RIGHT, EL_YAMYAM_DOWN, EL_YAMYAM_LEFT }, - { EL_ARROW_UP, EL_ARROW_RIGHT, EL_ARROW_DOWN, EL_ARROW_LEFT }, - { EL_SP_PORT_UP, EL_SP_PORT_RIGHT, EL_SP_PORT_DOWN, EL_SP_PORT_LEFT }, - { EL_SP_GRAVITY_PORT_UP, EL_SP_GRAVITY_PORT_RIGHT, EL_SP_GRAVITY_PORT_DOWN, EL_SP_GRAVITY_PORT_LEFT }, - { EL_SP_GRAVITY_ON_PORT_UP, EL_SP_GRAVITY_ON_PORT_RIGHT, EL_SP_GRAVITY_ON_PORT_DOWN, EL_SP_GRAVITY_ON_PORT_LEFT }, - { EL_SP_GRAVITY_OFF_PORT_UP, EL_SP_GRAVITY_OFF_PORT_RIGHT, EL_SP_GRAVITY_OFF_PORT_DOWN, EL_SP_GRAVITY_OFF_PORT_LEFT }, - { EL_MOLE_UP, EL_MOLE_RIGHT, EL_MOLE_DOWN, EL_MOLE_LEFT }, - { EL_BALLOON_SWITCH_UP, EL_BALLOON_SWITCH_RIGHT, EL_BALLOON_SWITCH_DOWN, EL_BALLOON_SWITCH_LEFT }, + { + EL_MM_MCDUFFIN_UP, + EL_MM_MCDUFFIN_RIGHT, + EL_MM_MCDUFFIN_DOWN, + EL_MM_MCDUFFIN_LEFT + }, + { + EL_MM_MIRROR_FIXED_1, + EL_MM_MIRROR_FIXED_4, + EL_MM_MIRROR_FIXED_3, + EL_MM_MIRROR_FIXED_2 + }, + { + EL_MM_STEEL_GRID_FIXED_1, + EL_MM_STEEL_GRID_FIXED_4, + EL_MM_STEEL_GRID_FIXED_2, + EL_MM_STEEL_GRID_FIXED_3 + }, + { + EL_MM_WOODEN_GRID_FIXED_1, + EL_MM_WOODEN_GRID_FIXED_4, + EL_MM_WOODEN_GRID_FIXED_2, + EL_MM_WOODEN_GRID_FIXED_3 + }, + { + EL_MM_POLARISATOR_CROSS_1, + EL_MM_POLARISATOR_CROSS_4, + EL_MM_POLARISATOR_CROSS_3, + EL_MM_POLARISATOR_CROSS_2 + }, + { + EL_MM_PACMAN_UP, + EL_MM_PACMAN_RIGHT, + EL_MM_PACMAN_DOWN, + EL_MM_PACMAN_LEFT + }, + { + EL_DF_LASER_UP, + EL_DF_LASER_RIGHT, + EL_DF_LASER_DOWN, + EL_DF_LASER_LEFT + }, + { + EL_DF_RECEIVER_UP, + EL_DF_RECEIVER_RIGHT, + EL_DF_RECEIVER_DOWN, + EL_DF_RECEIVER_LEFT + }, { -1, + }, + }; + static int rotatable_elements_8[][8] = + { + { + EL_DF_STEEL_GRID_FIXED_1, + EL_DF_STEEL_GRID_FIXED_8, + EL_DF_STEEL_GRID_FIXED_7, + EL_DF_STEEL_GRID_FIXED_6, + EL_DF_STEEL_GRID_FIXED_5, + EL_DF_STEEL_GRID_FIXED_4, + EL_DF_STEEL_GRID_FIXED_3, + EL_DF_STEEL_GRID_FIXED_2 + }, + { + EL_DF_WOODEN_GRID_FIXED_1, + EL_DF_WOODEN_GRID_FIXED_8, + EL_DF_WOODEN_GRID_FIXED_7, + EL_DF_WOODEN_GRID_FIXED_6, + EL_DF_WOODEN_GRID_FIXED_5, + EL_DF_WOODEN_GRID_FIXED_4, + EL_DF_WOODEN_GRID_FIXED_3, + EL_DF_WOODEN_GRID_FIXED_2 + }, + { + EL_DF_STEEL_GRID_ROTATING_1, + EL_DF_STEEL_GRID_ROTATING_8, + EL_DF_STEEL_GRID_ROTATING_7, + EL_DF_STEEL_GRID_ROTATING_6, + EL_DF_STEEL_GRID_ROTATING_5, + EL_DF_STEEL_GRID_ROTATING_4, + EL_DF_STEEL_GRID_ROTATING_3, + EL_DF_STEEL_GRID_ROTATING_2 + }, + { + EL_DF_WOODEN_GRID_ROTATING_1, + EL_DF_WOODEN_GRID_ROTATING_8, + EL_DF_WOODEN_GRID_ROTATING_7, + EL_DF_WOODEN_GRID_ROTATING_6, + EL_DF_WOODEN_GRID_ROTATING_5, + EL_DF_WOODEN_GRID_ROTATING_4, + EL_DF_WOODEN_GRID_ROTATING_3, + EL_DF_WOODEN_GRID_ROTATING_2 + }, + + { -1, - -1, + }, + }; + static int rotatable_elements_16[][16] = + { + { + EL_MM_MIRROR_1, + EL_MM_MIRROR_16, + EL_MM_MIRROR_15, + EL_MM_MIRROR_14, + EL_MM_MIRROR_13, + EL_MM_MIRROR_12, + EL_MM_MIRROR_11, + EL_MM_MIRROR_10, + EL_MM_MIRROR_9, + EL_MM_MIRROR_8, + EL_MM_MIRROR_7, + EL_MM_MIRROR_6, + EL_MM_MIRROR_5, + EL_MM_MIRROR_4, + EL_MM_MIRROR_3, + EL_MM_MIRROR_2 + }, + { + EL_MM_BEAMER_5, + EL_MM_BEAMER_4, + EL_MM_BEAMER_3, + EL_MM_BEAMER_2, + EL_MM_BEAMER_1, + EL_MM_BEAMER_16, + EL_MM_BEAMER_15, + EL_MM_BEAMER_14, + EL_MM_BEAMER_13, + EL_MM_BEAMER_12, + EL_MM_BEAMER_11, + EL_MM_BEAMER_10, + EL_MM_BEAMER_9, + EL_MM_BEAMER_8, + EL_MM_BEAMER_7, + EL_MM_BEAMER_6 + }, + { + EL_MM_BEAMER_RED_5, + EL_MM_BEAMER_RED_4, + EL_MM_BEAMER_RED_3, + EL_MM_BEAMER_RED_2, + EL_MM_BEAMER_RED_1, + EL_MM_BEAMER_RED_16, + EL_MM_BEAMER_RED_15, + EL_MM_BEAMER_RED_14, + EL_MM_BEAMER_RED_13, + EL_MM_BEAMER_RED_12, + EL_MM_BEAMER_RED_11, + EL_MM_BEAMER_RED_10, + EL_MM_BEAMER_RED_9, + EL_MM_BEAMER_RED_8, + EL_MM_BEAMER_RED_7, + EL_MM_BEAMER_RED_6 + }, + { + EL_MM_BEAMER_YELLOW_5, + EL_MM_BEAMER_YELLOW_4, + EL_MM_BEAMER_YELLOW_3, + EL_MM_BEAMER_YELLOW_2, + EL_MM_BEAMER_YELLOW_1, + EL_MM_BEAMER_YELLOW_16, + EL_MM_BEAMER_YELLOW_15, + EL_MM_BEAMER_YELLOW_14, + EL_MM_BEAMER_YELLOW_13, + EL_MM_BEAMER_YELLOW_12, + EL_MM_BEAMER_YELLOW_11, + EL_MM_BEAMER_YELLOW_10, + EL_MM_BEAMER_YELLOW_9, + EL_MM_BEAMER_YELLOW_8, + EL_MM_BEAMER_YELLOW_7, + EL_MM_BEAMER_YELLOW_6 + }, + { + EL_MM_BEAMER_GREEN_5, + EL_MM_BEAMER_GREEN_4, + EL_MM_BEAMER_GREEN_3, + EL_MM_BEAMER_GREEN_2, + EL_MM_BEAMER_GREEN_1, + EL_MM_BEAMER_GREEN_16, + EL_MM_BEAMER_GREEN_15, + EL_MM_BEAMER_GREEN_14, + EL_MM_BEAMER_GREEN_13, + EL_MM_BEAMER_GREEN_12, + EL_MM_BEAMER_GREEN_11, + EL_MM_BEAMER_GREEN_10, + EL_MM_BEAMER_GREEN_9, + EL_MM_BEAMER_GREEN_8, + EL_MM_BEAMER_GREEN_7, + EL_MM_BEAMER_GREEN_6 + }, + { + EL_MM_BEAMER_BLUE_5, + EL_MM_BEAMER_BLUE_4, + EL_MM_BEAMER_BLUE_3, + EL_MM_BEAMER_BLUE_2, + EL_MM_BEAMER_BLUE_1, + EL_MM_BEAMER_BLUE_16, + EL_MM_BEAMER_BLUE_15, + EL_MM_BEAMER_BLUE_14, + EL_MM_BEAMER_BLUE_13, + EL_MM_BEAMER_BLUE_12, + EL_MM_BEAMER_BLUE_11, + EL_MM_BEAMER_BLUE_10, + EL_MM_BEAMER_BLUE_9, + EL_MM_BEAMER_BLUE_8, + EL_MM_BEAMER_BLUE_7, + EL_MM_BEAMER_BLUE_6 + }, + { + EL_MM_POLARISATOR_1, + EL_MM_POLARISATOR_16, + EL_MM_POLARISATOR_15, + EL_MM_POLARISATOR_14, + EL_MM_POLARISATOR_13, + EL_MM_POLARISATOR_12, + EL_MM_POLARISATOR_11, + EL_MM_POLARISATOR_10, + EL_MM_POLARISATOR_9, + EL_MM_POLARISATOR_8, + EL_MM_POLARISATOR_7, + EL_MM_POLARISATOR_6, + EL_MM_POLARISATOR_5, + EL_MM_POLARISATOR_4, + EL_MM_POLARISATOR_3, + EL_MM_POLARISATOR_2 + }, + { + EL_DF_MIRROR_1, + EL_DF_MIRROR_16, + EL_DF_MIRROR_15, + EL_DF_MIRROR_14, + EL_DF_MIRROR_13, + EL_DF_MIRROR_12, + EL_DF_MIRROR_11, + EL_DF_MIRROR_10, + EL_DF_MIRROR_9, + EL_DF_MIRROR_8, + EL_DF_MIRROR_7, + EL_DF_MIRROR_6, + EL_DF_MIRROR_5, + EL_DF_MIRROR_4, + EL_DF_MIRROR_3, + EL_DF_MIRROR_2 + }, + { + EL_DF_MIRROR_ROTATING_1, + EL_DF_MIRROR_ROTATING_16, + EL_DF_MIRROR_ROTATING_15, + EL_DF_MIRROR_ROTATING_14, + EL_DF_MIRROR_ROTATING_13, + EL_DF_MIRROR_ROTATING_12, + EL_DF_MIRROR_ROTATING_11, + EL_DF_MIRROR_ROTATING_10, + EL_DF_MIRROR_ROTATING_9, + EL_DF_MIRROR_ROTATING_8, + EL_DF_MIRROR_ROTATING_7, + EL_DF_MIRROR_ROTATING_6, + EL_DF_MIRROR_ROTATING_5, + EL_DF_MIRROR_ROTATING_4, + EL_DF_MIRROR_ROTATING_3, + EL_DF_MIRROR_ROTATING_2 + }, + + { -1, }, }; @@ -10793,19 +11078,61 @@ static void SetElementIntelliDraw(int x, int y, int new_element, new_element = (old_element == element1 ? element2 : element1); } - for (i = 0; rotatable_elements[i][0] != -1; i++) + for (i = 0; rotatable_elements_4[i][0] != -1; i++) { for (j = 0; j < 4; j++) { - int element = rotatable_elements[i][j]; + int element = rotatable_elements_4[i][j]; + + if (old_element == element) + new_element = (button == 1 ? rotatable_elements_4[i][(j + 3) % 4] : + button == 2 ? rotatable_elements_4[i][0] : + button == 3 ? rotatable_elements_4[i][(j + 1) % 4] : + old_element); + } + } + + for (i = 0; rotatable_elements_8[i][0] != -1; i++) + { + for (j = 0; j < 8; j++) + { + int element = rotatable_elements_8[i][j]; + + if (old_element == element) + new_element = (button == 1 ? rotatable_elements_8[i][(j + 7) % 8] : + button == 2 ? rotatable_elements_8[i][0] : + button == 3 ? rotatable_elements_8[i][(j + 1) % 8] : + old_element); + } + } + + for (i = 0; rotatable_elements_16[i][0] != -1; i++) + { + for (j = 0; j < 16; j++) + { + int element = rotatable_elements_16[i][j]; if (old_element == element) - new_element = (button == 1 ? rotatable_elements[i][(j + 3) % 4] : - button == 2 ? rotatable_elements[i][0] : - button == 3 ? rotatable_elements[i][(j + 1) % 4] : + new_element = (button == 1 ? rotatable_elements_16[i][(j + 15) % 16] : + button == 2 ? rotatable_elements_16[i][0] : + button == 3 ? rotatable_elements_16[i][(j + 1) % 16] : old_element); } } + + if (old_element != new_element) + { + int max_infotext_len = getMaxInfoTextLength(); + char infotext[MAX_OUTPUT_LINESIZE + 1]; + + strncpy(infotext, getElementInfoText(new_element), max_infotext_len); + infotext[max_infotext_len] = '\0'; + + ClearEditorGadgetInfoText(); + + DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, INFOTEXT_FONT, + infotext); + } } SetElementSimple(x, y, new_element, change_level); @@ -10825,6 +11152,30 @@ static void ResetIntelliDraw() SetElementIntelliDraw(-1, -1, EL_UNDEFINED, FALSE, -1); } +static boolean draw_mode_hires = FALSE; + +static void SetDrawModeHiRes(int element) +{ + draw_mode_hires = + (level.game_engine_type == GAME_ENGINE_TYPE_MM && + (IS_MM_WALL_EDITOR(element) || element == EL_EMPTY)); +} + +static boolean getDrawModeHiRes() +{ + return draw_mode_hires; +} + +static int getLoResScreenPos(int pos) +{ + return (getDrawModeHiRes() ? pos / 2 : pos); +} + +static int getLoResScreenMod(int pos) +{ + return (getDrawModeHiRes() ? pos % 2 : 0); +} + static void SetElementExt(int x, int y, int dx, int dy, int element, boolean change_level, int button) { @@ -10849,10 +11200,10 @@ static void SetElementButton(int x, int y, int dx, int dy, int element, static void SetElementHiRes(int sx2, int sy2, int element, boolean change_level) { - int lx = sx2 / 2 + level_xpos; - int ly = sy2 / 2 + level_ypos; - int dx = sx2 % 2; - int dy = sy2 % 2; + int lx = getLoResScreenPos(sx2) + level_xpos; + int ly = getLoResScreenPos(sy2) + level_ypos; + int dx = getLoResScreenMod(sx2); + int dy = getLoResScreenMod(sy2); SetElementExt(lx, ly, dx, dy, element, change_level, -1); } @@ -10887,9 +11238,9 @@ static int getLevelElementHiRes(int lx2, int ly2) return element; } -static void DrawLineElement(int sx2, int sy2, int element, boolean change_level) +static void DrawLineElement(int x, int y, int element, boolean change_level) { - SetElementHiRes(sx2, sy2, element, change_level); + SetElementHiRes(x, y, element, change_level); } static void DrawLine(int from_x, int from_y, int to_x, int to_y, @@ -10977,31 +11328,35 @@ static void DrawArcExt(int from_x, int from_y, int to_x2, int to_y2, for (x = 0; x <= radius; x++) { - int sx2, sy2, lx, ly; + int sx, sy, sx2, sy2, lx, ly; y = (int)(sqrt((float)(radius * radius - x * x)) + 0.5); sx2 = from_x + x * (from_x < to_x2 ? +1 : -1); sy2 = from_y + y * (from_y < to_y2 ? +1 : -1); - lx = sx2 / 2 + level_xpos; - ly = sy2 / 2 + level_ypos; + sx = getLoResScreenPos(sx2); + sy = getLoResScreenPos(sy2); + lx = sx + level_xpos; + ly = sy + level_ypos; - if (IN_ED_FIELD(sx2 / 2, sy2 / 2) && IN_LEV_FIELD(lx, ly)) + if (IN_ED_FIELD(sx, sy) && IN_LEV_FIELD(lx, ly)) DrawLineElement(sx2, sy2, element, change_level); } for (y = 0; y <= radius; y++) { - int sx2, sy2, lx, ly; + int sx, sy, sx2, sy2, lx, ly; x = (int)(sqrt((float)(radius * radius - y * y)) + 0.5); sx2 = from_x + x * (from_x < to_x2 ? +1 : -1); sy2 = from_y + y * (from_y < to_y2 ? +1 : -1); - lx = sx2 / 2 + level_xpos; - ly = sy2 / 2 + level_ypos; + sx = getLoResScreenPos(sx2); + sy = getLoResScreenPos(sy2); + lx = sx + level_xpos; + ly = sy + level_ypos; - if (IN_ED_FIELD(sx2 / 2, sy2 / 2) && IN_LEV_FIELD(lx, ly)) + if (IN_ED_FIELD(sx, sy) && IN_LEV_FIELD(lx, ly)) DrawLineElement(sx2, sy2, element, change_level); } } @@ -11063,7 +11418,7 @@ static void DrawAreaBorder(int from_x, int from_y, int to_x, int to_y) static void DrawAreaBox(int from_x, int from_y, int to_x, int to_y, int element, boolean change_level) { - DrawBox(from_x * 2, from_y * 2, to_x * 2, to_y * 2, element, change_level); + DrawBox(from_x, from_y, to_x, to_y, element, change_level); } static void SelectArea(int from_x, int from_y, int to_x, int to_y, @@ -11085,7 +11440,7 @@ static void SelectArea(int from_x, int from_y, int to_x, int to_y, static void DrawBrushElement(int sx, int sy, int element, boolean change_level) { - DrawLineElement(sx * 2, sy * 2, element, change_level); + DrawLineElement(sx, sy, element, change_level); } static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y, @@ -11604,13 +11959,13 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) /* also correct MM wall-sized (double) drawing area positions accordingly */ if (sx2 / 2 < sx || sx2 / 2 > sx) { - sx2 = sx * 2; dx = (sx2 / 2 < sx ? 0 : 1); + sx2 = sx * 2 + dx; } if (sy2 / 2 < sy || sy2 / 2 > sy) { - sy2 = sy * 2; dy = (sy2 / 2 < sy ? 0 : 1); + sy2 = sy * 2 + dy; } if (button_release_event) @@ -11667,6 +12022,8 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) ResetIntelliDraw(); } + SetDrawModeHiRes(-1); /* reset to normal draw mode */ + switch (actual_drawing_function) { case GADGET_ID_SINGLE_ITEMS: @@ -11690,6 +12047,8 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) } else { + SetDrawModeHiRes(new_element); + if (new_element == EL_PLAYER_1) { /* remove player at old position */ @@ -11743,8 +12102,13 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) if (button) { - sx = sx2; - sy = sy2; + SetDrawModeHiRes(new_element); + + if (getDrawModeHiRes()) + { + sx = sx2; + sy = sy2; + } if (!button_press_event) DrawLine(last_sx, last_sy, sx, sy, new_element, TRUE); @@ -11759,8 +12123,13 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) case GADGET_ID_ARC: case GADGET_ID_RECTANGLE: case GADGET_ID_FILLED_BOX: - sx = sx2; - sy = sy2; + SetDrawModeHiRes(new_element); + + if (getDrawModeHiRes()) + { + sx = sx2; + sy = sy2; + } /* FALLTHROUGH */ case GADGET_ID_GRAB_BRUSH: case GADGET_ID_TEXT: @@ -11854,6 +12223,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) /* do not mark level as modified for certain non-level-changing gadgets */ if ((type_id >= ED_DRAWING_ID_EDITOR_FIRST && type_id <= ED_DRAWING_ID_EDITOR_LAST) || + actual_drawing_function == GADGET_ID_GRAB_BRUSH || actual_drawing_function == GADGET_ID_PICK_ELEMENT) return; @@ -11895,17 +12265,26 @@ static void HandleCounterButtons(struct GadgetInfo *gi) if (counter_id == ED_COUNTER_ID_SELECT_LEVEL) { - LoadLevel(level_nr); - LoadScore(level_nr); + int last_game_engine_type = level.game_engine_type; + + LoadLevel(level_nr); + LoadScore(level_nr); - SaveLevelSetup_SeriesInfo(); + SaveLevelSetup_SeriesInfo(); - TapeErase(); + TapeErase(); - ResetUndoBuffer(); - DrawEditModeWindow(); + ResetUndoBuffer(); + DrawEditModeWindow(); - return; + if (level.game_engine_type != last_game_engine_type) + { + /* update element selection list */ + ReinitializeElementList(); + ModifyEditorElementList(); + } + + return; } switch (counter_id) @@ -12021,8 +12400,6 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi) } CopyElementPropertiesToGame(properties_element); - - level.changed = TRUE; } else if (type_id == ED_SELECTBOX_ID_GAME_ENGINE_TYPE) { @@ -12030,6 +12407,12 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi) ReinitializeElementList(); ModifyEditorElementList(); } + + /* do not mark level as modified for certain non-level-changing gadgets */ + if (type_id == ED_SELECTBOX_ID_SELECT_CHANGE_PAGE) + return; + + level.changed = TRUE; } static void HandleTextbuttonGadgets(struct GadgetInfo *gi) @@ -12536,7 +12919,7 @@ static void HandleControlButtons(struct GadgetInfo *gi) // limit zoom level by upper and lower bound ed_tilesize = MIN(MAX(MICRO_TILESIZE, ed_tilesize), TILESIZE); - InitZoomLevelSettings(); + InitZoomLevelSettings(ed_tilesize); if (edit_mode == ED_MODE_DRAWING) { @@ -12546,6 +12929,9 @@ static void HandleControlButtons(struct GadgetInfo *gi) PrintEditorGadgetInfoText(level_editor_gadget[id]); } + /* save current editor zoom tilesize */ + SaveSetup_AutoSetup(); + break; case GADGET_ID_CUSTOM_COPY_FROM: @@ -12635,8 +13021,8 @@ static void HandleControlButtons(struct GadgetInfo *gi) if (edit_mode != ED_MODE_DRAWING) ChangeEditModeWindow(ED_MODE_DRAWING); - for (x = 0; x < MAX_LEV_FIELDX; x++) - for (y = 0; y < MAX_LEV_FIELDY; y++) + for (x = 0; x < MAX_LEV_FIELDX; x++) + for (y = 0; y < MAX_LEV_FIELDY; y++) Feld[x][y] = (button == 1 ? EL_EMPTY : new_element); CopyLevelToUndoBuffer(GADGET_ID_CLEAR); @@ -13004,7 +13390,7 @@ void HandleLevelEditorIdle() FrameCounter++; /* increase animation frame counter */ } -void ClearEditorGadgetInfoText() +static void ClearEditorGadgetInfoText() { DrawBackground(INFOTEXT_XPOS, INFOTEXT_YPOS, INFOTEXT_XSIZE, INFOTEXT_YSIZE); }