Add touch control options, add rumble checkbox, clean up layout. (#598)

* Reduce maximum sizes, make isle-config smaller

* Add extra options, clean up layout

* Add line breaks to tooltips

* Add Texture Loader extension config, fix var case

* Add "categories" in ini file

* Fix broken CI building on Linux
This commit is contained in:
VoxelTek 2025-07-15 00:58:29 +10:00 committed by GitHub
parent 21ce906a32
commit 7e1df12c63
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 494 additions and 224 deletions

View File

@ -57,8 +57,10 @@ CMainDialog::CMainDialog(QWidget* pParent) : QDialog(pParent)
connect(m_ui->devicesList, &QListWidget::currentRowChanged, this, &CMainDialog::OnList3DevicesSelectionChanged); connect(m_ui->devicesList, &QListWidget::currentRowChanged, this, &CMainDialog::OnList3DevicesSelectionChanged);
connect(m_ui->musicCheckBox, &QCheckBox::toggled, this, &CMainDialog::OnCheckboxMusic); connect(m_ui->musicCheckBox, &QCheckBox::toggled, this, &CMainDialog::OnCheckboxMusic);
connect(m_ui->sound3DCheckBox, &QCheckBox::toggled, this, &CMainDialog::OnCheckbox3DSound); connect(m_ui->sound3DCheckBox, &QCheckBox::toggled, this, &CMainDialog::OnCheckbox3DSound);
connect(m_ui->joystickCheckBox, &QCheckBox::toggled, this, &CMainDialog::OnCheckboxJoystick);
connect(m_ui->fullscreenCheckBox, &QCheckBox::toggled, this, &CMainDialog::OnCheckboxFullscreen); connect(m_ui->fullscreenCheckBox, &QCheckBox::toggled, this, &CMainDialog::OnCheckboxFullscreen);
connect(m_ui->rumbleCheckBox, &QCheckBox::toggled, this, &CMainDialog::OnCheckboxRumble);
connect(m_ui->textureCheckBox, &QCheckBox::toggled, this, &CMainDialog::OnCheckboxTexture);
connect(m_ui->touchComboBox, &QComboBox::currentIndexChanged, this, &CMainDialog::TouchControlsChanged);
connect(m_ui->transitionTypeComboBox, &QComboBox::currentIndexChanged, this, &CMainDialog::TransitionTypeChanged); connect(m_ui->transitionTypeComboBox, &QComboBox::currentIndexChanged, this, &CMainDialog::TransitionTypeChanged);
connect(m_ui->okButton, &QPushButton::clicked, this, &CMainDialog::accept); connect(m_ui->okButton, &QPushButton::clicked, this, &CMainDialog::accept);
connect(m_ui->cancelButton, &QPushButton::clicked, this, &CMainDialog::reject); connect(m_ui->cancelButton, &QPushButton::clicked, this, &CMainDialog::reject);
@ -70,8 +72,13 @@ CMainDialog::CMainDialog(QWidget* pParent) : QDialog(pParent)
connect(m_ui->dataPath, &QLineEdit::editingFinished, this, &CMainDialog::DataPathEdited); connect(m_ui->dataPath, &QLineEdit::editingFinished, this, &CMainDialog::DataPathEdited);
connect(m_ui->savePath, &QLineEdit::editingFinished, this, &CMainDialog::SavePathEdited); connect(m_ui->savePath, &QLineEdit::editingFinished, this, &CMainDialog::SavePathEdited);
connect(m_ui->texturePathOpen, &QPushButton::clicked, this, &CMainDialog::SelectTexturePathDialog);
connect(m_ui->texturePath, &QLineEdit::editingFinished, this, &CMainDialog::TexturePathEdited);
connect(m_ui->maxLoDSlider, &QSlider::valueChanged, this, &CMainDialog::MaxLoDChanged); connect(m_ui->maxLoDSlider, &QSlider::valueChanged, this, &CMainDialog::MaxLoDChanged);
connect(m_ui->maxLoDSlider, &QSlider::sliderMoved, this, &CMainDialog::MaxLoDChanged);
connect(m_ui->maxActorsSlider, &QSlider::valueChanged, this, &CMainDialog::MaxActorsChanged); connect(m_ui->maxActorsSlider, &QSlider::valueChanged, this, &CMainDialog::MaxActorsChanged);
connect(m_ui->maxActorsSlider, &QSlider::sliderMoved, this, &CMainDialog::MaxActorsChanged);
layout()->setSizeConstraint(QLayout::SetFixedSize); layout()->setSizeConstraint(QLayout::SetFixedSize);
} }
@ -115,7 +122,9 @@ bool CMainDialog::OnInitDialog()
m_ui->devicesList->setCurrentRow(selected); m_ui->devicesList->setCurrentRow(selected);
m_ui->maxLoDSlider->setValue((int) currentConfigApp->m_max_lod * 10); m_ui->maxLoDSlider->setValue((int) currentConfigApp->m_max_lod * 10);
m_ui->LoDNum->setNum((int) currentConfigApp->m_max_lod * 10);
m_ui->maxActorsSlider->setValue(currentConfigApp->m_max_actors); m_ui->maxActorsSlider->setValue(currentConfigApp->m_max_actors);
m_ui->maxActorsNum->setNum(currentConfigApp->m_max_actors);
UpdateInterface(); UpdateInterface();
return true; return true;
} }
@ -210,12 +219,18 @@ void CMainDialog::UpdateInterface()
else { else {
m_ui->textureQualityHighRadioButton->setChecked(true); m_ui->textureQualityHighRadioButton->setChecked(true);
} }
m_ui->joystickCheckBox->setChecked(currentConfigApp->m_use_joystick);
m_ui->musicCheckBox->setChecked(currentConfigApp->m_music); m_ui->musicCheckBox->setChecked(currentConfigApp->m_music);
m_ui->fullscreenCheckBox->setChecked(currentConfigApp->m_full_screen); m_ui->fullscreenCheckBox->setChecked(currentConfigApp->m_full_screen);
m_ui->rumbleCheckBox->setChecked(currentConfigApp->m_haptic);
m_ui->touchComboBox->setCurrentIndex(currentConfigApp->m_touch_scheme);
m_ui->transitionTypeComboBox->setCurrentIndex(currentConfigApp->m_transition_type); m_ui->transitionTypeComboBox->setCurrentIndex(currentConfigApp->m_transition_type);
m_ui->dataPath->setText(QString::fromStdString(currentConfigApp->m_cd_path)); m_ui->dataPath->setText(QString::fromStdString(currentConfigApp->m_cd_path));
m_ui->savePath->setText(QString::fromStdString(currentConfigApp->m_save_path)); m_ui->savePath->setText(QString::fromStdString(currentConfigApp->m_save_path));
m_ui->textureCheckBox->setChecked(currentConfigApp->m_texture_load);
m_ui->texturePath->setText(QString::fromStdString(currentConfigApp->m_texture_path));
m_ui->texturePath->setEnabled(currentConfigApp->m_texture_load);
m_ui->texturePathOpen->setEnabled(currentConfigApp->m_texture_load);
} }
// FUNCTION: CONFIG 0x004045e0 // FUNCTION: CONFIG 0x004045e0
@ -275,14 +290,6 @@ void CMainDialog::OnRadiobuttonTextureHighQuality(bool checked)
} }
} }
// FUNCTION: CONFIG 0x00404790
void CMainDialog::OnCheckboxJoystick(bool checked)
{
currentConfigApp->m_use_joystick = checked;
m_modified = true;
UpdateInterface();
}
// FUNCTION: CONFIG 0x004048c0 // FUNCTION: CONFIG 0x004048c0
void CMainDialog::OnCheckboxMusic(bool checked) void CMainDialog::OnCheckboxMusic(bool checked)
{ {
@ -298,6 +305,27 @@ void CMainDialog::OnCheckboxFullscreen(bool checked)
UpdateInterface(); UpdateInterface();
} }
void CMainDialog::OnCheckboxRumble(bool checked)
{
currentConfigApp->m_haptic = checked;
m_modified = true;
UpdateInterface();
}
void CMainDialog::OnCheckboxTexture(bool checked)
{
currentConfigApp->m_texture_load = checked;
m_modified = true;
UpdateInterface();
}
void CMainDialog::TouchControlsChanged(int index)
{
currentConfigApp->m_touch_scheme = index;
m_modified = true;
UpdateInterface();
}
void CMainDialog::TransitionTypeChanged(int index) void CMainDialog::TransitionTypeChanged(int index)
{ {
currentConfigApp->m_transition_type = index; currentConfigApp->m_transition_type = index;
@ -376,11 +404,43 @@ void CMainDialog::SavePathEdited()
void CMainDialog::MaxLoDChanged(int value) void CMainDialog::MaxLoDChanged(int value)
{ {
currentConfigApp->m_max_lod = static_cast<float>(value) / 10.0f; currentConfigApp->m_max_lod = static_cast<float>(value) / 10.0f;
m_ui->LoDNum->setNum(value);
m_modified = true; m_modified = true;
} }
void CMainDialog::MaxActorsChanged(int value) void CMainDialog::MaxActorsChanged(int value)
{ {
currentConfigApp->m_max_actors = value; currentConfigApp->m_max_actors = value;
m_ui->maxActorsNum->setNum(value);
m_modified = true; m_modified = true;
} }
void CMainDialog::SelectTexturePathDialog()
{
QString texture_path = QString::fromStdString(currentConfigApp->m_texture_path);
texture_path = QFileDialog::getExistingDirectory(
this,
tr("Open Directory"),
texture_path,
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks
);
QDir texture_dir = QDir(texture_path);
if (texture_dir.exists()) {
currentConfigApp->m_texture_path = texture_dir.absolutePath().toStdString();
m_modified = true;
}
UpdateInterface();
}
void CMainDialog::TexturePathEdited()
{
QDir texture_dir = QDir(m_ui->texturePath->text());
if (texture_dir.exists()) {
currentConfigApp->m_texture_path = texture_dir.absolutePath().toStdString();
m_modified = true;
}
UpdateInterface();
}

View File

@ -40,9 +40,11 @@ private slots:
void OnRadiobuttonModelHighQuality(bool checked); void OnRadiobuttonModelHighQuality(bool checked);
void OnRadiobuttonTextureLowQuality(bool checked); void OnRadiobuttonTextureLowQuality(bool checked);
void OnRadiobuttonTextureHighQuality(bool checked); void OnRadiobuttonTextureHighQuality(bool checked);
void OnCheckboxJoystick(bool checked);
void OnCheckboxMusic(bool checked); void OnCheckboxMusic(bool checked);
void OnCheckboxFullscreen(bool checked); void OnCheckboxFullscreen(bool checked);
void OnCheckboxRumble(bool checked);
void OnCheckboxTexture(bool checked);
void TouchControlsChanged(int index);
void TransitionTypeChanged(int index); void TransitionTypeChanged(int index);
void accept() override; void accept() override;
void reject() override; void reject() override;
@ -53,6 +55,8 @@ private slots:
void SavePathEdited(); void SavePathEdited();
void MaxLoDChanged(int value); void MaxLoDChanged(int value);
void MaxActorsChanged(int value); void MaxActorsChanged(int value);
void SelectTexturePathDialog();
void TexturePathEdited();
}; };
// SYNTHETIC: CONFIG 0x00403de0 // SYNTHETIC: CONFIG 0x00403de0

View File

@ -78,6 +78,10 @@ bool CConfigApp::InitInstance()
m_3d_video_ram = FALSE; m_3d_video_ram = FALSE;
m_joystick_index = -1; m_joystick_index = -1;
m_display_bit_depth = 16; m_display_bit_depth = 16;
m_haptic = TRUE;
m_touch_scheme = 2;
m_texture_load = TRUE;
m_texture_path = "/textures/";
int totalRamMiB = SDL_GetSystemRAM(); int totalRamMiB = SDL_GetSystemRAM();
if (totalRamMiB < 12) { if (totalRamMiB < 12) {
m_3d_sound = FALSE; m_3d_sound = FALSE;
@ -155,6 +159,7 @@ bool CConfigApp::ReadRegisterSettings()
m_flip_surfaces = iniparser_getboolean(dict, "isle:Flip Surfaces", m_flip_surfaces); m_flip_surfaces = iniparser_getboolean(dict, "isle:Flip Surfaces", m_flip_surfaces);
m_full_screen = iniparser_getboolean(dict, "isle:Full Screen", m_full_screen); m_full_screen = iniparser_getboolean(dict, "isle:Full Screen", m_full_screen);
m_transition_type = iniparser_getint(dict, "isle:Transition Type", m_transition_type); m_transition_type = iniparser_getint(dict, "isle:Transition Type", m_transition_type);
m_touch_scheme = iniparser_getint(dict, "isle:Touch Scheme", m_touch_scheme);
m_3d_video_ram = iniparser_getboolean(dict, "isle:Back Buffers in Video RAM", m_3d_video_ram); m_3d_video_ram = iniparser_getboolean(dict, "isle:Back Buffers in Video RAM", m_3d_video_ram);
m_wide_view_angle = iniparser_getboolean(dict, "isle:Wide View Angle", m_wide_view_angle); m_wide_view_angle = iniparser_getboolean(dict, "isle:Wide View Angle", m_wide_view_angle);
m_3d_sound = iniparser_getboolean(dict, "isle:3DSound", m_3d_sound); m_3d_sound = iniparser_getboolean(dict, "isle:3DSound", m_3d_sound);
@ -162,10 +167,13 @@ bool CConfigApp::ReadRegisterSettings()
m_model_quality = iniparser_getint(dict, "isle:Island Quality", m_model_quality); m_model_quality = iniparser_getint(dict, "isle:Island Quality", m_model_quality);
m_texture_quality = iniparser_getint(dict, "isle:Island Texture", m_texture_quality); m_texture_quality = iniparser_getint(dict, "isle:Island Texture", m_texture_quality);
m_use_joystick = iniparser_getboolean(dict, "isle:UseJoystick", m_use_joystick); m_use_joystick = iniparser_getboolean(dict, "isle:UseJoystick", m_use_joystick);
m_haptic = iniparser_getboolean(dict, "isle:Haptic", m_haptic);
m_music = iniparser_getboolean(dict, "isle:Music", m_music); m_music = iniparser_getboolean(dict, "isle:Music", m_music);
m_joystick_index = iniparser_getint(dict, "isle:JoystickIndex", m_joystick_index); m_joystick_index = iniparser_getint(dict, "isle:JoystickIndex", m_joystick_index);
m_max_lod = iniparser_getdouble(dict, "isle:Max LOD", m_max_lod); m_max_lod = iniparser_getdouble(dict, "isle:Max LOD", m_max_lod);
m_max_actors = iniparser_getint(dict, "isle:Max Allowed Extras", m_max_actors); m_max_actors = iniparser_getint(dict, "isle:Max Allowed Extras", m_max_actors);
m_texture_load = iniparser_getboolean(dict, "extensions:texture loader", m_texture_load);
m_texture_path = iniparser_getstring(dict, "texture loader:texture path", m_texture_path.c_str());
iniparser_freedict(dict); iniparser_freedict(dict);
return true; return true;
} }
@ -230,6 +238,14 @@ bool CConfigApp::ValidateSettings()
m_max_actors = 20; m_max_actors = 20;
is_modified = TRUE; is_modified = TRUE;
} }
if (!m_use_joystick) {
m_use_joystick = true;
is_modified = TRUE;
}
if (m_touch_scheme < 0 || m_touch_scheme > 2) {
m_touch_scheme = 2;
is_modified = TRUE;
}
return is_modified; return is_modified;
} }
@ -298,6 +314,8 @@ void CConfigApp::WriteRegisterSettings() const
dictionary* dict = dictionary_new(0); dictionary* dict = dictionary_new(0);
iniparser_set(dict, "isle", NULL); iniparser_set(dict, "isle", NULL);
iniparser_set(dict, "extensions", NULL);
iniparser_set(dict, "texture loader", NULL);
if (m_device_enumerator->FormatDeviceName(buffer, m_driver, m_device) >= 0) { if (m_device_enumerator->FormatDeviceName(buffer, m_driver, m_device) >= 0) {
iniparser_set(dict, "isle:3D Device ID", buffer); iniparser_set(dict, "isle:3D Device ID", buffer);
} }
@ -311,14 +329,19 @@ void CConfigApp::WriteRegisterSettings() const
SetIniBool(dict, "isle:Wide View Angle", m_wide_view_angle); SetIniBool(dict, "isle:Wide View Angle", m_wide_view_angle);
SetIniInt(dict, "isle:Transition Type", m_transition_type); SetIniInt(dict, "isle:Transition Type", m_transition_type);
SetIniInt(dict, "isle:Touch Scheme", m_touch_scheme);
SetIniBool(dict, "isle:3DSound", m_3d_sound); SetIniBool(dict, "isle:3DSound", m_3d_sound);
SetIniBool(dict, "isle:Music", m_music); SetIniBool(dict, "isle:Music", m_music);
SetIniBool(dict, "isle:Haptic", m_haptic);
SetIniBool(dict, "isle:UseJoystick", m_use_joystick); SetIniBool(dict, "isle:UseJoystick", m_use_joystick);
SetIniInt(dict, "isle:JoystickIndex", m_joystick_index); SetIniInt(dict, "isle:JoystickIndex", m_joystick_index);
SetIniBool(dict, "isle:Draw Cursor", m_draw_cursor); SetIniBool(dict, "isle:Draw Cursor", m_draw_cursor);
SetIniBool(dict, "extensions:texture loader", m_texture_load);
iniparser_set(dict, "texture loader:texture path", m_texture_path.c_str());
SetIniBool(dict, "isle:Back Buffers in Video RAM", m_3d_video_ram); SetIniBool(dict, "isle:Back Buffers in Video RAM", m_3d_video_ram);
SetIniInt(dict, "isle:Island Quality", m_model_quality); SetIniInt(dict, "isle:Island Quality", m_model_quality);

View File

@ -71,16 +71,20 @@ public:
bool m_3d_sound; bool m_3d_sound;
bool m_draw_cursor; bool m_draw_cursor;
bool m_use_joystick; bool m_use_joystick;
bool m_haptic;
int m_joystick_index; int m_joystick_index;
int m_model_quality; int m_model_quality;
int m_texture_quality; int m_texture_quality;
bool m_music; bool m_music;
bool m_texture_load;
std::string m_texture_path;
std::string m_iniPath; std::string m_iniPath;
std::string m_base_path; std::string m_base_path;
std::string m_cd_path; std::string m_cd_path;
std::string m_save_path; std::string m_save_path;
float m_max_lod; float m_max_lod;
int m_max_actors; int m_max_actors;
int m_touch_scheme;
}; };
extern CConfigApp g_theApp; extern CConfigApp g_theApp;

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>575</width> <width>550</width>
<height>600</height> <height>700</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy"> <property name="sizePolicy">
@ -23,7 +23,7 @@
<iconset resource="config.qrc"> <iconset resource="config.qrc">
<normaloff>:/lego1.png</normaloff>:/lego1.png</iconset> <normaloff>:/lego1.png</normaloff>:/lego1.png</iconset>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1"> <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0">
<item> <item>
<widget class="QLabel" name="sharkImageLabel"> <widget class="QLabel" name="sharkImageLabel">
<property name="sizePolicy"> <property name="sizePolicy">
@ -56,13 +56,16 @@
<property name="scaledContents"> <property name="scaledContents">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QWidget" name="settingsWidget" native="true"> <widget class="QWidget" name="settingsWidget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QWidget" name="dataPaths" native="true"> <widget class="QWidget" name="dataPaths" native="true">
@ -89,7 +92,7 @@
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>55</width> <width>50</width>
<height>16777215</height> <height>16777215</height>
</size> </size>
</property> </property>
@ -108,7 +111,7 @@
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>55</width> <width>50</width>
<height>16777215</height> <height>16777215</height>
</size> </size>
</property> </property>
@ -129,17 +132,15 @@
<string>Save Path:</string> <string>Save Path:</string>
</property> </property>
<property name="textFormat"> <property name="textFormat">
<enum>Qt::TextFormat::PlainText</enum> <enum>Qt::PlainText</enum>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QLineEdit" name="dataPath"> <widget class="QLineEdit" name="dataPath">
<property name="toolTip"> <property name="toolTip">
<string>Path to the game data files. Set this to the CD image root.</string> <string>Path to the game data files.
Set this to the CD image root.</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -162,10 +163,7 @@
<string>Data Path:</string> <string>Data Path:</string>
</property> </property>
<property name="textFormat"> <property name="textFormat">
<enum>Qt::TextFormat::PlainText</enum> <enum>Qt::PlainText</enum>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
@ -187,13 +185,166 @@
<property name="rightMargin"> <property name="rightMargin">
<number>0</number> <number>0</number>
</property> </property>
<item row="1" column="3">
<widget class="QGroupBox" name="maxActorsGroup">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Maximum number of LEGO actors to exist in the world at a time.
The game will gradually increase the number of actors until this maximum is reached and while performance is acceptable.</string>
</property>
<property name="title">
<string>Maximum Actors (5..40)</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<widget class="QSlider" name="maxActorsSlider">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimum">
<number>5</number>
</property>
<property name="maximum">
<number>40</number>
</property>
<property name="singleStep">
<number>5</number>
</property>
<property name="value">
<number>20</number>
</property>
<property name="sliderPosition">
<number>20</number>
</property>
<property name="tracking">
<bool>false</bool>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::NoTicks</enum>
</property>
<property name="tickInterval">
<number>5</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="maxActorsNum">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>15</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>20</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="2">
<widget class="QGroupBox" name="maxLoDGroup">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>70</height>
</size>
</property>
<property name="toolTip">
<string>Maximum Level of Detail (LOD).
A higher setting will cause higher quality textures to be drawn regardless of distance.</string>
</property>
<property name="title">
<string>Maximum LOD</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QSlider" name="maxLoDSlider">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<number>50</number>
</property>
<property name="singleStep">
<number>5</number>
</property>
<property name="pageStep">
<number>10</number>
</property>
<property name="value">
<number>35</number>
</property>
<property name="tracking">
<bool>false</bool>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::NoTicks</enum>
</property>
<property name="tickInterval">
<number>10</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="LoDNum">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>15</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>35</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="0" column="3"> <item row="0" column="3">
<widget class="QGroupBox" name="modelQualityGroup"> <widget class="QGroupBox" name="modelQualityGroup">
<property name="maximumSize"> <property name="sizePolicy">
<size> <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<width>16777215</width> <horstretch>0</horstretch>
<height>120</height> <verstretch>0</verstretch>
</size> </sizepolicy>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>Set 3D model detail level.</string> <string>Set 3D model detail level.</string>
@ -204,8 +355,14 @@
<layout class="QVBoxLayout" name="verticalLayout_6"> <layout class="QVBoxLayout" name="verticalLayout_6">
<item> <item>
<widget class="QRadioButton" name="modelQualityLowRadioButton"> <widget class="QRadioButton" name="modelQualityLowRadioButton">
<property name="toolTip">
<string>Broken, not recommended.</string>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(255, 0, 0);</string>
</property>
<property name="text"> <property name="text">
<string>Low</string> <string>Low - BROKEN!</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -226,63 +383,26 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="1" column="2">
<widget class="QGroupBox" name="maxLoDGroup">
<property name="minimumSize">
<size>
<width>0</width>
<height>70</height>
</size>
</property>
<property name="toolTip">
<string>Maximum Level of Detail (LOD). A higher setting will cause higher quality textures to be drawn regardless of distance.</string>
</property>
<property name="title">
<string>Maximum LOD</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QSlider" name="maxLoDSlider">
<property name="maximum">
<number>50</number>
</property>
<property name="singleStep">
<number>5</number>
</property>
<property name="pageStep">
<number>10</number>
</property>
<property name="value">
<number>35</number>
</property>
<property name="tracking">
<bool>false</bool>
</property>
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TickPosition::TicksBothSides</enum>
</property>
<property name="tickInterval">
<number>10</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="0" column="2"> <item row="0" column="2">
<widget class="QGroupBox" name="textureQualityGroup"> <widget class="QGroupBox" name="textureQualityGroup">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip"> <property name="toolTip">
<string>Set texture detail level.</string> <string>Set texture detail level.</string>
</property> </property>
<property name="title"> <property name="title">
<string>Island Texture Quality</string> <string>Island Texture Quality</string>
</property> </property>
<property name="flat">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5"> <layout class="QVBoxLayout" name="verticalLayout_5">
<property name="topMargin"> <property name="topMargin">
<number>0</number> <number>0</number>
@ -307,58 +427,24 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="1" column="3">
<widget class="QGroupBox" name="maxActorsGroup">
<property name="toolTip">
<string>Maximum number of LEGO actors to exist in the world at a time. The game will gradually increase the number of actors until this maximum is reached and while performance is acceptable.</string>
</property>
<property name="title">
<string>Maximum Actors (5..40)</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<widget class="QSlider" name="maxActorsSlider">
<property name="minimum">
<number>5</number>
</property>
<property name="maximum">
<number>40</number>
</property>
<property name="singleStep">
<number>5</number>
</property>
<property name="value">
<number>20</number>
</property>
<property name="sliderPosition">
<number>20</number>
</property>
<property name="tracking">
<bool>false</bool>
</property>
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TickPosition::TicksBothSides</enum>
</property>
<property name="tickInterval">
<number>5</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QWidget" name="checkboxWidget" native="true"> <widget class="QWidget" name="checkboxWidget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item> <item>
<widget class="QCheckBox" name="sound3DCheckBox"> <widget class="QCheckBox" name="sound3DCheckBox">
<property name="toolTip"> <property name="toolTip">
@ -379,16 +465,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QCheckBox" name="joystickCheckBox">
<property name="toolTip">
<string>Enable joystick and gamepad support for LEGO Island.</string>
</property>
<property name="text">
<string>Use Joystick</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QCheckBox" name="fullscreenCheckBox"> <widget class="QCheckBox" name="fullscreenCheckBox">
<property name="toolTip"> <property name="toolTip">
@ -399,80 +475,201 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QCheckBox" name="rumbleCheckBox">
<property name="enabled">
<bool>true</bool>
</property>
<property name="toolTip">
<string>Enable controller rumble.</string>
</property>
<property name="text">
<string>Rumble</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="label"> <widget class="QWidget" name="widget" native="true">
<property name="text"> <layout class="QHBoxLayout" name="horizontalLayout_3">
<string>Transition Type</string> <property name="leftMargin">
</property> <number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="transitionBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Sets the transition effect to be used in game.</string>
</property>
<property name="title">
<string>Transition Type</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QComboBox" name="transitionTypeComboBox">
<property name="currentText">
<string>Mosaic</string>
</property>
<property name="currentIndex">
<number>3</number>
</property>
<item>
<property name="text">
<string>Idle - Broken</string>
</property>
</item>
<item>
<property name="text">
<string>No Animation</string>
</property>
</item>
<item>
<property name="text">
<string>Dissolve</string>
</property>
</item>
<item>
<property name="text">
<string>Mosaic</string>
</property>
</item>
<item>
<property name="text">
<string>Wipe Down</string>
</property>
</item>
<item>
<property name="text">
<string>Windows</string>
</property>
</item>
<item>
<property name="text">
<string>Unknown - Broken</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="touchControl">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Virtual Gamepad (Recommended):&lt;/span&gt; Slide your finger to move and turn.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Virtual Arrow Keys:&lt;/span&gt; Tap screen areas to move. The top moves forward, the bottom turns or moves back.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Virtual Mouse:&lt;/span&gt; Emulates classic mouse controls with touch.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="title">
<string>Touch Control Scheme</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QComboBox" name="touchComboBox">
<property name="currentIndex">
<number>2</number>
</property>
<item>
<property name="text">
<string>Virtual Mouse</string>
</property>
</item>
<item>
<property name="text">
<string>Virtual Arrow Keys</string>
</property>
</item>
<item>
<property name="text">
<string>Virtual Gamepad</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QComboBox" name="transitionTypeComboBox"> <widget class="QGroupBox" name="groupBox">
<property name="toolTip"> <property name="title">
<string>Sets the transition effect to be used in game.</string> <string>Texture Loader Extension</string>
</property> </property>
<property name="currentText"> <layout class="QGridLayout" name="gridLayout_3">
<string>Idle - Broken</string> <item row="2" column="1">
</property> <widget class="QLineEdit" name="texturePath">
<property name="placeholderText"> <property name="enabled">
<string/> <bool>false</bool>
</property> </property>
<item> <property name="toolTip">
<property name="text"> <string>Path to texture replacements.</string>
<string>Idle - Broken</string> </property>
</property> <property name="placeholderText">
</item> <string>textures/</string>
<item> </property>
<property name="text"> </widget>
<string>No Animation</string> </item>
</property> <item row="2" column="2">
</item> <widget class="QPushButton" name="texturePathOpen">
<item> <property name="enabled">
<property name="text"> <bool>false</bool>
<string>Dissolve</string> </property>
</property> <property name="sizePolicy">
</item> <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<item> <horstretch>0</horstretch>
<property name="text"> <verstretch>0</verstretch>
<string>Mosaic</string> </sizepolicy>
</property> </property>
</item> <property name="maximumSize">
<item> <size>
<property name="text"> <width>50</width>
<string>Wipe Down</string> <height>16777215</height>
</property> </size>
</item> </property>
<item> <property name="text">
<property name="text"> <string>Open</string>
<string>Windows</string> </property>
</property> </widget>
</item> </item>
<item> <item row="2" column="0">
<property name="text"> <widget class="QCheckBox" name="textureCheckBox">
<string>Unknown - Broken</string> <property name="text">
</property> <string>Enabled</string>
</item> </property>
</widget>
</item>
</layout>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="advancedGroup"> <widget class="QGroupBox" name="advancedGroup">
<property name="maximumSize"> <property name="sizePolicy">
<size> <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<width>16777215</width> <horstretch>0</horstretch>
<height>225</height> <verstretch>0</verstretch>
</size> </sizepolicy>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>3D graphics device used to render the game.</string> <string>3D graphics device used to render the game.</string>
</property> </property>
<property name="title"> <property name="title">
<string/> <string>Graphics Devices</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property> </property>
<property name="flat"> <property name="flat">
<bool>false</bool> <bool>false</bool>
@ -490,28 +687,6 @@
<property name="bottomMargin"> <property name="bottomMargin">
<number>6</number> <number>6</number>
</property> </property>
<item>
<widget class="QLabel" name="direct3DDevicesLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>Direct 3D Devices</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item> <item>
<widget class="QListWidget" name="devicesList"> <widget class="QListWidget" name="devicesList">
<property name="enabled"> <property name="enabled">
@ -526,17 +701,17 @@
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>16777215</width> <width>16777215</width>
<height>125</height> <height>100</height>
</size> </size>
</property> </property>
<property name="editTriggers"> <property name="editTriggers">
<set>QAbstractItemView::EditTrigger::NoEditTriggers</set> <set>QAbstractItemView::NoEditTriggers</set>
</property> </property>
<property name="alternatingRowColors"> <property name="alternatingRowColors">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="selectionBehavior"> <property name="selectionBehavior">
<enum>QAbstractItemView::SelectionBehavior::SelectRows</enum> <enum>QAbstractItemView::SelectItems</enum>
</property> </property>
</widget> </widget>
</item> </item>
@ -545,9 +720,15 @@
</item> </item>
<item> <item>
<widget class="QWidget" name="buttonWidgets" native="true"> <widget class="QWidget" name="buttonWidgets" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_6"> <layout class="QHBoxLayout" name="horizontalLayout_6">
<property name="spacing"> <property name="spacing">
<number>30</number> <number>10</number>
</property> </property>
<property name="leftMargin"> <property name="leftMargin">
<number>0</number> <number>0</number>
@ -616,8 +797,6 @@
<tabstop>maxActorsSlider</tabstop> <tabstop>maxActorsSlider</tabstop>
<tabstop>sound3DCheckBox</tabstop> <tabstop>sound3DCheckBox</tabstop>
<tabstop>musicCheckBox</tabstop> <tabstop>musicCheckBox</tabstop>
<tabstop>joystickCheckBox</tabstop>
<tabstop>fullscreenCheckBox</tabstop>
<tabstop>devicesList</tabstop> <tabstop>devicesList</tabstop>
<tabstop>okButton</tabstop> <tabstop>okButton</tabstop>
<tabstop>launchButton</tabstop> <tabstop>launchButton</tabstop>