diff --git a/src/game_interpreter_map.cpp b/src/game_interpreter_map.cpp index 9139e7eab0..d26586ebbe 100644 --- a/src/game_interpreter_map.cpp +++ b/src/game_interpreter_map.cpp @@ -608,15 +608,6 @@ bool Game_Interpreter_Map::CommandPanScreen(lcf::rpg::EventCommand const& com) { int speed; bool waiting_pan_screen = false; - // Maniac has new functions for pixel scrolling, which also have X and Y offsets - bool is_maniac = Player::IsPatchManiac(); - int h; - int v; - double h_speed; - double v_speed; - bool centered = false; - bool relative = false; - auto& player = *Main_Data::game_player; switch (com.parameters[0]) { @@ -645,34 +636,6 @@ bool Game_Interpreter_Map::CommandPanScreen(lcf::rpg::EventCommand const& com) { distance /= SCREEN_TILE_SIZE; break; } - if (is_maniac && com.parameters.size() > 5) { - h = ValueOrVariableBitfield(com, 1, 0, 2); - v = ValueOrVariableBitfield(com, 1, 1, 3); - waiting_pan_screen = (com.parameters[4] & 0x01) != 0; - speed = ValueOrVariableBitfield(com, 1, 2, 5); - switch (com.parameters[0]) { - case 4: // Relative Pixel Pan (speed) - centered = false; - relative = true; - player.StartPixelPan(h, v, speed, false, centered, relative); - break; - case 5: // Relative Pixel Pan (interpolated) - centered = false; - relative = true; - player.StartPixelPan(h, v, speed, true, centered, relative); - break; - case 6: // Absolute Pixel Pan (speed) - centered = (com.parameters[4] & 0x02) != 0; - relative = (com.parameters[4] & 0x04) != 0; - player.StartPixelPan(h, v, speed, false, centered, relative); - break; - case 7: // Absolute Pixel Pan (interpolated) - centered = (com.parameters[4] & 0x02) != 0; - relative = (com.parameters[4] & 0x04) != 0; - player.StartPixelPan(h, v, speed, true, centered, relative); - break; - } - } if (Player::IsPatchManiac() && com.parameters.size() > 5) { // Pixel scrolling with h/v offsets diff --git a/src/game_player.cpp b/src/game_player.cpp index 0650ed366f..4afc557ea5 100644 --- a/src/game_player.cpp +++ b/src/game_player.cpp @@ -811,8 +811,12 @@ void Game_Player::StartPixelPan(int h, int v, int speed, bool interpolated, bool int new_pan_x; int new_pan_y; - // FIXME: Fails when relative and centered are used in combination - if (relative) { + if (relative && centered) { + int screen_width = static_cast(std::ceil(static_cast(Player::screen_width) / 2)) * TILE_SIZE; + int screen_height = static_cast(std::ceil(static_cast(Player::screen_height) / 2)) * TILE_SIZE; + new_pan_x = data()->pan_finish_x - (h - screen_width) * 0.5; + new_pan_y = data()->pan_finish_y - (v - screen_height) * 0.5; + } else if (relative) { new_pan_x = data()->pan_finish_x - h; new_pan_y = data()->pan_finish_y - v; } else if (centered) {