fix bug in preset validation and clear_goal (board repr wasn't updated correctly)

This commit is contained in:
2026-02-28 18:58:42 +01:00
parent ce05dd504a
commit bc8dd423be
3 changed files with 19 additions and 15 deletions

View File

@ -17,10 +17,10 @@ auto input_handler::init_handlers() -> void
register_mouse_pressed_handler(MOUSE_BUTTON_LEFT, &input_handler::select_block);
register_mouse_pressed_handler(MOUSE_BUTTON_LEFT, &input_handler::add_block);
register_mouse_pressed_handler(MOUSE_BUTTON_LEFT, &input_handler::start_add_block);
register_mouse_pressed_handler(MOUSE_BUTTON_MIDDLE, &input_handler::place_goal);
register_mouse_pressed_handler(MOUSE_BUTTON_RIGHT, &input_handler::camera_start_rotate);
register_mouse_pressed_handler(MOUSE_BUTTON_RIGHT, &input_handler::remove_block);
register_mouse_pressed_handler(MOUSE_BUTTON_RIGHT, &input_handler::clear_add_block);
register_mouse_pressed_handler(MOUSE_BUTTON_MIDDLE, &input_handler::place_goal);
register_mouse_released_handler(MOUSE_BUTTON_LEFT, &input_handler::camera_stop_pan);
register_mouse_released_handler(MOUSE_BUTTON_RIGHT, &input_handler::camera_stop_rotate);
@ -29,19 +29,21 @@ auto input_handler::init_handlers() -> void
register_key_pressed_handler(KEY_D, &input_handler::move_block_eas);
register_key_pressed_handler(KEY_S, &input_handler::move_block_sou);
register_key_pressed_handler(KEY_A, &input_handler::move_block_wes);
register_key_pressed_handler(KEY_P, &input_handler::print_state);
register_key_pressed_handler(KEY_N, &input_handler::load_previous_preset);
register_key_pressed_handler(KEY_M, &input_handler::load_next_preset);
register_key_pressed_handler(KEY_R, &input_handler::goto_starting_state);
register_key_pressed_handler(KEY_V, &input_handler::goto_most_distant_state);
register_key_pressed_handler(KEY_B, &input_handler::goto_closest_target_state);
register_key_pressed_handler(KEY_SPACE, &input_handler::goto_optimal_next_state);
register_key_pressed_handler(KEY_BACKSPACE, &input_handler::goto_previous_state);
register_key_pressed_handler(KEY_G, &input_handler::populate_graph);
register_key_pressed_handler(KEY_C, &input_handler::clear_graph);
register_key_pressed_handler(KEY_I, &input_handler::toggle_mark_solutions);
register_key_pressed_handler(KEY_O, &input_handler::toggle_connect_solutions);
// RegisterKeyPressedHandler(KEY_U, &InputHandler::ToggleMarkPath);
register_key_pressed_handler(KEY_SPACE, &input_handler::goto_optimal_next_state);
register_key_pressed_handler(KEY_V, &input_handler::goto_most_distant_state);
register_key_pressed_handler(KEY_B, &input_handler::goto_closest_target_state);
register_key_pressed_handler(KEY_BACKSPACE, &input_handler::goto_previous_state);
register_key_pressed_handler(KEY_TAB, &input_handler::toggle_editing);
register_key_pressed_handler(KEY_F, &input_handler::toggle_restricted_movement);
register_key_pressed_handler(KEY_T, &input_handler::toggle_target_block);
register_key_pressed_handler(KEY_Y, &input_handler::toggle_wall_block);
@ -49,10 +51,11 @@ auto input_handler::init_handlers() -> void
register_key_pressed_handler(KEY_RIGHT, &input_handler::add_board_column);
register_key_pressed_handler(KEY_DOWN, &input_handler::remove_board_row);
register_key_pressed_handler(KEY_LEFT, &input_handler::remove_board_column);
register_key_pressed_handler(KEY_TAB, &input_handler::toggle_editing);
register_key_pressed_handler(KEY_X, &input_handler::clear_goal);
register_key_pressed_handler(KEY_P, &input_handler::print_state);
register_key_pressed_handler(KEY_L, &input_handler::toggle_camera_lock);
register_key_pressed_handler(KEY_LEFT_ALT, &input_handler::toggle_camera_projection);
register_key_pressed_handler(KEY_X, &input_handler::clear_goal);
register_key_pressed_handler(KEY_U, &input_handler::toggle_camera_mass_center_lock);
}

View File

@ -117,11 +117,11 @@ auto puzzle::valid_thorough() const -> bool
return false;
}
if (!std::string("012345678").contains(state[3]) || !std::string("012345678").contains(state[4])) {
infoln("Puzzle invalid: Representation[3/4] {}/{} doesn't match [1-9]", state[1], state[2]);
infoln("Puzzle invalid: Representation[3/4] {}/{} doesn't match [1-9]", state[3], state[4]);
return false;
}
if (std::stoi(state.substr(3, 1)) != target_x || std::stoi(state.substr(4, 1)) != target_y) {
infoln("Puzzle invalid: Representation[3/4] {}/{} doesn't match target ({}, {})", state[1], state[2], target_x,
infoln("Puzzle invalid: Representation[3/4] {}/{} doesn't match target ({}, {})", state[3], state[4], target_x,
target_y);
return false;
}
@ -209,8 +209,8 @@ auto puzzle::try_set_goal(const int x, const int y) const -> std::optional<puzzl
p.target_y = y;
}
p.state.replace(3, 1, std::format("{}", target_x));
p.state.replace(4, 1, std::format("{}", target_y));
p.state.replace(3, 1, std::format("{}", p.target_x));
p.state.replace(4, 1, std::format("{}", p.target_y));
return p;
}
@ -220,7 +220,7 @@ auto puzzle::try_clear_goal() const -> std::optional<puzzle>
puzzle p = *this;
p.target_x = MAX_WIDTH;
p.target_y = MAX_HEIGHT;
p.state.replace(3, 2, "99");
p.state.replace(3, 2, std::format("{}{}", MAX_WIDTH, MAX_HEIGHT));
return p;
}

View File

@ -554,7 +554,8 @@ auto user_interface::draw_puzzle_controls(const Color color) const -> void
input.goto_most_distant_state();
}
if (draw_menu_button(2, 5, 1, 1, "Go to Starting State (R)", color)) {
if (draw_menu_button(2, 5, 1, 1, "Go to Starting State (R)", color,
state.get_current_index() != state.get_starting_index())) {
input.goto_starting_state();
}
}