Skip to content
6 changes: 3 additions & 3 deletions libs/s25main/Settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ void Settings::LoadDefaults()
// interface
// {
interface.autosave_interval = 0;
interface.revert_mouse = false;
interface.invertMouse = false;
interface.enableWindowPinning = false;
interface.windowSnapDistance = 8;
// }
Expand Down Expand Up @@ -299,7 +299,7 @@ void Settings::Load()
// interface
// {
interface.autosave_interval = iniInterface->getIntValue("autosave_interval");
interface.revert_mouse = iniInterface->getBoolValue("revert_mouse");
interface.invertMouse = iniInterface->getValue("invert_mouse", false);
interface.enableWindowPinning = iniInterface->getValue("enable_window_pinning", false);
interface.windowSnapDistance = iniInterface->getValue("window_snap_distance", 8);
// }
Expand Down Expand Up @@ -463,7 +463,7 @@ void Settings::Save()
// interface
// {
iniInterface->setValue("autosave_interval", interface.autosave_interval);
iniInterface->setValue("revert_mouse", interface.revert_mouse);
iniInterface->setValue("invert_mouse", interface.invertMouse);
iniInterface->setValue("enable_window_pinning", interface.enableWindowPinning);
iniInterface->setValue("window_snap_distance", interface.windowSnapDistance);
// }
Expand Down
2 changes: 1 addition & 1 deletion libs/s25main/Settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ class Settings : public Singleton<Settings, SingletonPolicies::WithLongevity>
struct
{
unsigned autosave_interval;
bool revert_mouse;
bool invertMouse;
bool enableWindowPinning;
unsigned windowSnapDistance;
} interface;
Expand Down
2 changes: 1 addition & 1 deletion libs/s25main/desktops/dskGameInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,7 @@ bool dskGameInterface::Msg_MouseMove(const MouseCoords& mc)

int acceleration = SETTINGS.global.smartCursor ? 2 : 3;

if(SETTINGS.interface.revert_mouse)
if(SETTINGS.interface.invertMouse)
acceleration = -acceleration;

gwv.MoveBy((mc.GetPos() - startScrollPt) * acceleration);
Expand Down
38 changes: 24 additions & 14 deletions libs/s25main/desktops/dskOptions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ enum
ID_grpDebugData,
ID_txtUPNP,
ID_grpUPNP,
ID_txtInvertScroll,
ID_grpInvertScroll,
ID_txtSmartCursor,
ID_grpSmartCursor,
ID_txtGFInfo,
Expand Down Expand Up @@ -199,8 +201,8 @@ dskOptions::dskOptions() : Desktop(LOADER.GetImageN("setup013", 0))
groupAllgemein->AddText(ID_txtIpv6, curPos, _("Use IPv6:"), COLOR_YELLOW, FontStyle{}, NormalFont);

ctrlOptionGroup* ipv6 = groupAllgemein->AddOptionGroup(ID_grpIpv6, GroupSelectType::Check);
ipv6->AddTextButton(ID_btOn, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("IPv6"), NormalFont);
ipv6->AddTextButton(ID_btOff, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("IPv4"), NormalFont);
ipv6->AddTextButton(ID_btOn, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("IPv6"), NormalFont);
ipv6->AddTextButton(ID_btOff, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("IPv4"), NormalFont);
ipv6->SetSelection(SETTINGS.server.ipv6);
// ipv6-feld ggf (de-)aktivieren
ipv6->GetCtrl<ctrlButton>(1)->SetEnabled(SETTINGS.proxy.type != ProxyType::Socks5); //-V807
Expand All @@ -219,8 +221,8 @@ dskOptions::dskOptions() : Desktop(LOADER.GetImageN("setup013", 0))

groupAllgemein->AddText(ID_txtUPNP, curPos, _("Use UPnP"), COLOR_YELLOW, FontStyle{}, NormalFont);
ctrlOptionGroup* upnp = groupAllgemein->AddOptionGroup(ID_grpUPNP, GroupSelectType::Check);
upnp->AddTextButton(ID_btOff, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("Off"), NormalFont);
upnp->AddTextButton(ID_btOn, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("On"), NormalFont);
upnp->AddTextButton(ID_btOn, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("On"), NormalFont);
upnp->AddTextButton(ID_btOff, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("Off"), NormalFont);
upnp->SetSelection(SETTINGS.global.use_upnp);
curPos.y += 30;

Expand All @@ -241,21 +243,30 @@ dskOptions::dskOptions() : Desktop(LOADER.GetImageN("setup013", 0))
}
curPos.y += 50;

groupAllgemein->AddText(ID_txtInvertScroll, curPos, _("Invert Mouse Pan:"), COLOR_YELLOW, FontStyle{}, NormalFont);
ctrlOptionGroup* invertScroll = groupAllgemein->AddOptionGroup(ID_grpInvertScroll, GroupSelectType::Check);
invertScroll->AddTextButton(ID_btOn, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("On"), NormalFont,
_("Map moves in the opposite direction the mouse is moved when scrolling/panning."));
invertScroll->AddTextButton(ID_btOff, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("Off"), NormalFont,
_("Map moves in the same direction the mouse is moved when scrolling/panning."));
invertScroll->SetSelection(SETTINGS.interface.invertMouse);
curPos.y += 30;

groupAllgemein->AddText(ID_txtSmartCursor, curPos, _("Smart Cursor"), COLOR_YELLOW, FontStyle{}, NormalFont);
ctrlOptionGroup* smartCursor = groupAllgemein->AddOptionGroup(ID_grpSmartCursor, GroupSelectType::Check);
smartCursor->AddTextButton(ID_btOn, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("On"), NormalFont,
_("Place cursor on default button for new dialogs / action windows (default)"));
smartCursor->AddTextButton(
ID_btOff, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("Off"), NormalFont,
ID_btOff, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("Off"), NormalFont,
_("Don't move cursor automatically\nUseful e.g. for split-screen / dual-mice multiplayer (see wiki)"));
smartCursor->AddTextButton(ID_btOn, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("On"), NormalFont,
_("Place cursor on default button for new dialogs / action windows (default)"));
smartCursor->SetSelection(SETTINGS.global.smartCursor);
curPos.y += 50;

groupAllgemein->AddText(ID_txtDebugData, curPos, _("Submit debug data:"), COLOR_YELLOW, FontStyle{}, NormalFont);
optiongroup = groupAllgemein->AddOptionGroup(ID_grpDebugData, GroupSelectType::Check);
optiongroup->AddTextButton(ID_btSubmitDebugOn, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("On"),
optiongroup->AddTextButton(ID_btSubmitDebugOn, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("On"),
NormalFont);
optiongroup->AddTextButton(ID_btSubmitDebugAsk, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("Ask always"),
optiongroup->AddTextButton(ID_btSubmitDebugAsk, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("Ask always"),
NormalFont);

optiongroup->SetSelection((SETTINGS.global.submit_debug_data == 1) ? ID_btSubmitDebugOn :
Expand All @@ -264,8 +275,8 @@ dskOptions::dskOptions() : Desktop(LOADER.GetImageN("setup013", 0))

groupAllgemein->AddText(ID_txtGFInfo, curPos, _("Show GameFrame Info:"), COLOR_YELLOW, FontStyle{}, NormalFont);
optiongroup = groupAllgemein->AddOptionGroup(ID_grpGFInfo, GroupSelectType::Check);
optiongroup->AddTextButton(ID_btOn, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("On"), NormalFont);
optiongroup->AddTextButton(ID_btOff, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("Off"), NormalFont);
optiongroup->AddTextButton(ID_btOn, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("On"), NormalFont);
optiongroup->AddTextButton(ID_btOff, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("Off"), NormalFont);

optiongroup->SetSelection(SETTINGS.global.showGFInfo);

Expand All @@ -278,9 +289,8 @@ dskOptions::dskOptions() : Desktop(LOADER.GetImageN("setup013", 0))
// "Vollbild"
groupGrafik->AddText(ID_txtFullscreen, curPos, _("Mode:"), COLOR_YELLOW, FontStyle{}, NormalFont);
optiongroup = groupGrafik->AddOptionGroup(ID_grpFullscreen, GroupSelectType::Check);
optiongroup->AddTextButton(ID_btOn, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("Fullscreen"),
NormalFont);
optiongroup->AddTextButton(ID_btOff, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("Windowed"), NormalFont);
optiongroup->AddTextButton(ID_btOn, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("Fullscreen"), NormalFont);
optiongroup->AddTextButton(ID_btOff, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("Windowed"), NormalFont);
curPos.y += 50;

// "VSync"
Expand Down
2 changes: 1 addition & 1 deletion libs/s25main/ingameWindows/iwObservate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ bool iwObservate::Msg_MouseMove(const MouseCoords& mc)
{
int acceleration = SETTINGS.global.smartCursor ? 2 : 3;

if(SETTINGS.interface.revert_mouse)
if(SETTINGS.interface.invertMouse)
acceleration = -acceleration;

view->MoveBy((mc.GetPos() - scrollOrigin) * acceleration);
Expand Down
65 changes: 37 additions & 28 deletions libs/s25main/ingameWindows/iwSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,52 +15,64 @@
#include "gameData/const_gui_ids.h"
#include "s25util/colors.h"

namespace {
enum
{
ID_txtResolution,
ID_txtFullScreen,
ID_grpFullscreen,
ID_cbResolution,
ID_cbInvertMouse,
ID_cbStatisticScale,
};
constexpr auto ID_btOn = 1;
constexpr auto ID_btOff = 0;
} // namespace

iwSettings::iwSettings()
: IngameWindow(CGI_SETTINGS, IngameWindow::posLastOrCenter, Extent(370, 172), _("Settings"),
LOADER.GetImageN("resource", 41))
{
AddText(46, DrawPoint(15, 40), _("Fullscreen resolution:"), COLOR_YELLOW, FontStyle{}, NormalFont);
AddText(47, DrawPoint(15, 85), _("Mode:"), COLOR_YELLOW, FontStyle{}, NormalFont);
AddCheckBox(4, DrawPoint(200, 124), Extent(150, 26), TextureColor::Grey, _("Statistics Scale"), NormalFont, false);
GetCtrl<ctrlCheck>(4)->setChecked(SETTINGS.ingame.scale_statistics);

// "Vollbild"
ctrlOptionGroup* optiongroup = AddOptionGroup(3, GroupSelectType::Check);
optiongroup->AddTextButton(1, DrawPoint(200, 70), Extent(150, 22), TextureColor::Grey, _("Fullscreen"), NormalFont);
optiongroup->AddTextButton(2, DrawPoint(200, 95), Extent(150, 22), TextureColor::Grey, _("Windowed"), NormalFont);
AddText(ID_txtResolution, DrawPoint(15, 40), _("Fullscreen resolution:"), COLOR_YELLOW, FontStyle{}, NormalFont);
auto* cbResolution =
AddComboBox(ID_cbResolution, DrawPoint(200, 35), Extent(150, 22), TextureColor::Grey, NormalFont, 110);

// "Vollbild" setzen
optiongroup = GetCtrl<ctrlOptionGroup>(3);
optiongroup->SetSelection((SETTINGS.video.fullscreen ? 1 : 2)); //-V807
VIDEODRIVER.ListVideoModes(video_modes);

// "Auflösung"
AddComboBox(0, DrawPoint(200, 35), Extent(150, 22), TextureColor::Grey, NormalFont, 110);

// Und zu der Combobox hinzufügen
for(unsigned i = 0; i < video_modes.size(); ++i)
{
// >=800x600, alles andere macht keinen Sinn
if(video_modes[i].width >= 800 && video_modes[i].height >= 600)
{
GetCtrl<ctrlComboBox>(0)->AddString(helpers::format("%ux%u", video_modes[i].width, video_modes[i].height));

// Ist das die aktuelle Auflösung? Dann selektieren
cbResolution->AddString(helpers::format("%ux%u", video_modes[i].width, video_modes[i].height));
if(video_modes[i] == SETTINGS.video.fullscreenSize)
GetCtrl<ctrlComboBox>(0)->SetSelection(i);
cbResolution->SetSelection(i);
} else
{
video_modes.erase(video_modes.begin() + i);
--i;
}
}
AddText(ID_txtFullScreen, DrawPoint(15, 85), _("Mode:"), COLOR_YELLOW, FontStyle{}, NormalFont);
ctrlOptionGroup* optiongroup = AddOptionGroup(ID_grpFullscreen, GroupSelectType::Check);
optiongroup->AddTextButton(ID_btOn, DrawPoint(200, 70), Extent(150, 22), TextureColor::Grey, _("Fullscreen"),
NormalFont);
optiongroup->AddTextButton(ID_btOff, DrawPoint(200, 95), Extent(150, 22), TextureColor::Grey, _("Windowed"),
NormalFont);
optiongroup->SetSelection(SETTINGS.video.fullscreen); //-V807

AddCheckBox(ID_cbInvertMouse, DrawPoint(15, 124), Extent(150, 26), TextureColor::Grey, _("Invert Mouse Pan"),
NormalFont, false)
->setChecked(SETTINGS.interface.invertMouse);
AddCheckBox(ID_cbStatisticScale, DrawPoint(200, 124), Extent(150, 26), TextureColor::Grey, _("Statistics Scale"),
NormalFont, false)
->setChecked(SETTINGS.ingame.scale_statistics);
}

iwSettings::~iwSettings()
{
try
{
auto* SizeCombo = GetCtrl<ctrlComboBox>(0);
auto* SizeCombo = GetCtrl<ctrlComboBox>(ID_cbResolution);
SETTINGS.video.fullscreenSize = video_modes[SizeCombo->GetSelection().get()];

if((SETTINGS.video.fullscreen && SETTINGS.video.fullscreenSize != VIDEODRIVER.GetWindowSize())
Expand All @@ -85,18 +97,15 @@ void iwSettings::Msg_OptionGroupChange(const unsigned ctrl_id, const unsigned se
{
switch(ctrl_id)
{
case 3: SETTINGS.video.fullscreen = (selection == 1); break;
case ID_grpFullscreen: SETTINGS.video.fullscreen = selection == ID_btOn; break;
}
}

void iwSettings::Msg_CheckboxChange(const unsigned ctrl_id, const bool checked)
{
switch(ctrl_id)
{
case 4:
{
SETTINGS.ingame.scale_statistics = checked;
break;
}
case ID_cbInvertMouse: SETTINGS.interface.invertMouse = checked; break;
case ID_cbStatisticScale: SETTINGS.ingame.scale_statistics = checked; break;
}
}
128 changes: 76 additions & 52 deletions tests/s25Main/integration/testDskGameInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include "GamePlayer.h"
#include "PointOutput.h"
#include "Settings.h"
#include "WindowManager.h"
#include "buildings/nobBaseWarehouse.h"
#include "desktops/dskGameInterface.h"
Expand Down Expand Up @@ -66,63 +67,86 @@ void checkNotScrolling(const GameWorldView& view, Cursor cursor = Cursor::Hand)
BOOST_FIXTURE_TEST_CASE(Scrolling, GameInterfaceFixture)
{
const int acceleration = 2;
SETTINGS.interface.invertMouse = false;

Position startPos(10, 15);
MouseCoords mouse(startPos, false, true);
// Regular scrolling: Right down, 2 moves, right up
WINDOWMANAGER.Msg_RightDown(mouse);
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
DrawPoint pos = view->GetOffset();
mouse.pos = startPos + Position(4, 3);
WINDOWMANAGER.Msg_MouseMove(mouse);
pos += acceleration * Position(4, 3);
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
mouse.pos = startPos + Position(-6, 7);
WINDOWMANAGER.Msg_MouseMove(mouse);
pos += acceleration * Position(-6, 7);
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
mouse.rdown = false;
WINDOWMANAGER.Msg_RightUp(mouse);
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Hand);
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
checkNotScrolling(*view);
{
WINDOWMANAGER.Msg_RightDown(mouse);
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
DrawPoint pos = view->GetOffset();
mouse.pos = startPos + Position(4, 3);
WINDOWMANAGER.Msg_MouseMove(mouse);
pos += acceleration * Position(4, 3);
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
mouse.pos = startPos + Position(-6, 7);
WINDOWMANAGER.Msg_MouseMove(mouse);
pos += acceleration * Position(-6, 7);
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
mouse.rdown = false;
WINDOWMANAGER.Msg_RightUp(mouse);
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Hand);
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
checkNotScrolling(*view);
}

// Inverted scrolling
{
SETTINGS.interface.invertMouse = true;
WINDOWMANAGER.Msg_RightDown(mouse);
startPos = mouse.pos;
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
const DrawPoint pos = view->GetOffset();
mouse.pos = startPos + Position(4, 3);
WINDOWMANAGER.Msg_MouseMove(mouse);
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
BOOST_TEST_REQUIRE(view->GetOffset() == pos - acceleration * Position(4, 3));
mouse.rdown = false;
WINDOWMANAGER.Msg_RightUp(mouse);
SETTINGS.interface.invertMouse = false;
}

// Opening a window does not cancel scrolling
mouse.rdown = true;
WINDOWMANAGER.Msg_RightDown(mouse);
startPos = mouse.pos;
KeyEvent key;
key.kt = KeyType::Char;
key.c = 'm';
key.ctrl = key.alt = key.shift = false;
WINDOWMANAGER.Msg_KeyDown(key);
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetTopMostWindow());
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
mouse.pos = startPos + Position(-6, 7);
WINDOWMANAGER.Msg_MouseMove(mouse);
pos += acceleration * Position(-6, 7);
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
// Closing it doesn't either
WINDOWMANAGER.Msg_KeyDown(key);
WINDOWMANAGER.Draw();
BOOST_TEST_REQUIRE(gameDesktop->IsActive());
BOOST_TEST_REQUIRE(!WINDOWMANAGER.GetTopMostWindow());
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
mouse.pos = startPos + Position(-6, 7);
WINDOWMANAGER.Msg_MouseMove(mouse);
pos += acceleration * Position(-6, 7);
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
// Left click does cancel it
mouse.ldown = true;
WINDOWMANAGER.Msg_LeftDown(mouse);
mouse.ldown = false;
WINDOWMANAGER.Msg_LeftUp(mouse);
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Hand);
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
checkNotScrolling(*view);
{
mouse.rdown = true;
WINDOWMANAGER.Msg_RightDown(mouse);
startPos = mouse.pos;
DrawPoint pos = view->GetOffset();
KeyEvent key;
key.kt = KeyType::Char;
key.c = 'm';
key.ctrl = key.alt = key.shift = false;
WINDOWMANAGER.Msg_KeyDown(key);
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetTopMostWindow());
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
mouse.pos = startPos + Position(-6, 7);
WINDOWMANAGER.Msg_MouseMove(mouse);
pos += acceleration * Position(-6, 7);
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
// Closing it doesn't either
WINDOWMANAGER.Msg_KeyDown(key);
WINDOWMANAGER.Draw();
BOOST_TEST_REQUIRE(gameDesktop->IsActive());
BOOST_TEST_REQUIRE(!WINDOWMANAGER.GetTopMostWindow());
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
mouse.pos = startPos + Position(-6, 7);
WINDOWMANAGER.Msg_MouseMove(mouse);
pos += acceleration * Position(-6, 7);
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
// Left click does cancel it
mouse.ldown = true;
WINDOWMANAGER.Msg_LeftDown(mouse);
mouse.ldown = false;
WINDOWMANAGER.Msg_LeftUp(mouse);
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Hand);
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
checkNotScrolling(*view);
}
}

BOOST_FIXTURE_TEST_CASE(ScrollingWhileRoadBuilding, GameInterfaceFixture)
Expand Down