Merge pull request #8925 from JosJuice/tas-turbo-interval

DolphinQt: Allow customizing TAS input turbo interval
This commit is contained in:
LC 2020-07-08 08:40:46 -04:00 committed by GitHub
commit 0bff77d9e4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 99 additions and 47 deletions

View File

@ -43,18 +43,18 @@ GCTASInputWindow::GCTASInputWindow(QWidget* parent, int num) : TASInputWindow(pa
triggers_layout->addLayout(r_trigger_layout); triggers_layout->addLayout(r_trigger_layout);
m_triggers_box->setLayout(triggers_layout); m_triggers_box->setLayout(triggers_layout);
m_a_button = new TASCheckBox(QStringLiteral("&A")); m_a_button = CreateButton(QStringLiteral("&A"));
m_b_button = new TASCheckBox(QStringLiteral("&B")); m_b_button = CreateButton(QStringLiteral("&B"));
m_x_button = new TASCheckBox(QStringLiteral("&X")); m_x_button = CreateButton(QStringLiteral("&X"));
m_y_button = new TASCheckBox(QStringLiteral("&Y")); m_y_button = CreateButton(QStringLiteral("&Y"));
m_z_button = new TASCheckBox(QStringLiteral("&Z")); m_z_button = CreateButton(QStringLiteral("&Z"));
m_l_button = new TASCheckBox(QStringLiteral("&L")); m_l_button = CreateButton(QStringLiteral("&L"));
m_r_button = new TASCheckBox(QStringLiteral("&R")); m_r_button = CreateButton(QStringLiteral("&R"));
m_start_button = new TASCheckBox(QStringLiteral("&START")); m_start_button = CreateButton(QStringLiteral("&START"));
m_left_button = new TASCheckBox(QStringLiteral("L&eft")); m_left_button = CreateButton(QStringLiteral("L&eft"));
m_up_button = new TASCheckBox(QStringLiteral("&Up")); m_up_button = CreateButton(QStringLiteral("&Up"));
m_down_button = new TASCheckBox(QStringLiteral("&Down")); m_down_button = CreateButton(QStringLiteral("&Down"));
m_right_button = new TASCheckBox(QStringLiteral("R&ight")); m_right_button = CreateButton(QStringLiteral("R&ight"));
auto* buttons_layout = new QGridLayout; auto* buttons_layout = new QGridLayout;
buttons_layout->addWidget(m_a_button, 0, 0); buttons_layout->addWidget(m_a_button, 0, 0);
@ -80,7 +80,7 @@ GCTASInputWindow::GCTASInputWindow(QWidget* parent, int num) : TASInputWindow(pa
layout->addLayout(top_layout); layout->addLayout(top_layout);
layout->addWidget(m_triggers_box); layout->addWidget(m_triggers_box);
layout->addWidget(m_buttons_box); layout->addWidget(m_buttons_box);
layout->addWidget(m_use_controller); layout->addWidget(m_settings_box);
setLayout(layout); setLayout(layout);
} }

View File

@ -7,8 +7,10 @@
#include <QMouseEvent> #include <QMouseEvent>
#include "Core/Movie.h" #include "Core/Movie.h"
#include "DolphinQt/TAS/TASInputWindow.h"
TASCheckBox::TASCheckBox(const QString& text) : QCheckBox(text) TASCheckBox::TASCheckBox(const QString& text, TASInputWindow* parent)
: QCheckBox(text, parent), m_parent(parent)
{ {
setTristate(true); setTristate(true);
} }
@ -16,7 +18,10 @@ TASCheckBox::TASCheckBox(const QString& text) : QCheckBox(text)
bool TASCheckBox::GetValue() const bool TASCheckBox::GetValue() const
{ {
if (checkState() == Qt::PartiallyChecked) if (checkState() == Qt::PartiallyChecked)
return Movie::GetCurrentFrame() % 2 == static_cast<u64>(m_trigger_on_odd); {
const u64 frames_elapsed = Movie::GetCurrentFrame() - m_frame_turbo_started;
return frames_elapsed % m_turbo_total_frames < m_turbo_press_frames;
}
return isChecked(); return isChecked();
} }
@ -35,6 +40,8 @@ void TASCheckBox::mousePressEvent(QMouseEvent* event)
return; return;
} }
m_trigger_on_odd = Movie::GetCurrentFrame() % 2 == 0; m_frame_turbo_started = Movie::GetCurrentFrame();
m_turbo_press_frames = m_parent->GetTurboPressFrames();
m_turbo_total_frames = m_turbo_press_frames + m_parent->GetTurboReleaseFrames();
setCheckState(Qt::PartiallyChecked); setCheckState(Qt::PartiallyChecked);
} }

View File

@ -7,12 +7,13 @@
#include <QCheckBox> #include <QCheckBox>
class QMouseEvent; class QMouseEvent;
class TASInputWindow;
class TASCheckBox : public QCheckBox class TASCheckBox : public QCheckBox
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit TASCheckBox(const QString& text); explicit TASCheckBox(const QString& text, TASInputWindow* parent);
bool GetValue() const; bool GetValue() const;
@ -20,5 +21,8 @@ protected:
void mousePressEvent(QMouseEvent* event) override; void mousePressEvent(QMouseEvent* event) override;
private: private:
bool m_trigger_on_odd; const TASInputWindow* m_parent;
int m_frame_turbo_started;
int m_turbo_press_frames;
int m_turbo_total_frames;
}; };

View File

@ -29,9 +29,42 @@ TASInputWindow::TASInputWindow(QWidget* parent) : QDialog(parent)
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
setWindowIcon(Resources::GetAppIcon()); setWindowIcon(Resources::GetAppIcon());
QGridLayout* settings_layout = new QGridLayout;
m_use_controller = new QCheckBox(QStringLiteral("Enable Controller Inpu&t")); m_use_controller = new QCheckBox(QStringLiteral("Enable Controller Inpu&t"));
m_use_controller->setToolTip(tr("Warning: Analog inputs may reset to controller values at " m_use_controller->setToolTip(tr("Warning: Analog inputs may reset to controller values at "
"random. In some cases this can be fixed by adding a deadzone.")); "random. In some cases this can be fixed by adding a deadzone."));
settings_layout->addWidget(m_use_controller, 0, 0, 1, 2);
QLabel* turbo_press_label = new QLabel(tr("Duration of Turbo Button Press (frames):"));
m_turbo_press_frames = new QSpinBox();
m_turbo_press_frames->setMinimum(1);
settings_layout->addWidget(turbo_press_label, 1, 0);
settings_layout->addWidget(m_turbo_press_frames, 1, 1);
QLabel* turbo_release_label = new QLabel(tr("Duration of Turbo Button Release (frames):"));
m_turbo_release_frames = new QSpinBox();
m_turbo_release_frames->setMinimum(1);
settings_layout->addWidget(turbo_release_label, 2, 0);
settings_layout->addWidget(m_turbo_release_frames, 2, 1);
m_settings_box = new QGroupBox(tr("Settings"));
m_settings_box->setLayout(settings_layout);
}
int TASInputWindow::GetTurboPressFrames() const
{
return m_turbo_press_frames->value();
}
int TASInputWindow::GetTurboReleaseFrames() const
{
return m_turbo_release_frames->value();
}
TASCheckBox* TASInputWindow::CreateButton(const QString& name)
{
return new TASCheckBox(name, this);
} }
QGroupBox* TASInputWindow::CreateStickInputs(QString name, QSpinBox*& x_value, QSpinBox*& y_value, QGroupBox* TASInputWindow::CreateStickInputs(QString name, QSpinBox*& x_value, QSpinBox*& y_value,

View File

@ -23,7 +23,11 @@ class TASInputWindow : public QDialog
public: public:
explicit TASInputWindow(QWidget* parent); explicit TASInputWindow(QWidget* parent);
int GetTurboPressFrames() const;
int GetTurboReleaseFrames() const;
protected: protected:
TASCheckBox* CreateButton(const QString& name);
QGroupBox* CreateStickInputs(QString name, QSpinBox*& x_value, QSpinBox*& y_value, u16 max_x, QGroupBox* CreateStickInputs(QString name, QSpinBox*& x_value, QSpinBox*& y_value, u16 max_x,
u16 max_y, Qt::Key x_shortcut_key, Qt::Key y_shortcut_key); u16 max_y, Qt::Key x_shortcut_key, Qt::Key y_shortcut_key);
QBoxLayout* CreateSliderValuePairLayout(QString name, QSpinBox*& value, u16 max, QBoxLayout* CreateSliderValuePairLayout(QString name, QSpinBox*& value, u16 max,
@ -36,7 +40,11 @@ protected:
void GetButton(TASCheckBox* button, UX& pad, UX mask); void GetButton(TASCheckBox* button, UX& pad, UX mask);
void GetSpinBoxU8(QSpinBox* spin, u8& controller_value); void GetSpinBoxU8(QSpinBox* spin, u8& controller_value);
void GetSpinBoxU16(QSpinBox* spin, u16& controller_value); void GetSpinBoxU16(QSpinBox* spin, u16& controller_value);
QGroupBox* m_settings_box;
QCheckBox* m_use_controller; QCheckBox* m_use_controller;
QSpinBox* m_turbo_press_frames;
QSpinBox* m_turbo_release_frames;
private: private:
std::map<TASCheckBox*, bool> m_checkbox_set_by_controller; std::map<TASCheckBox*, bool> m_checkbox_set_by_controller;

View File

@ -160,19 +160,19 @@ WiiTASInputWindow::WiiTASInputWindow(QWidget* parent, int num) : TASInputWindow(
triggers_layout->addLayout(r_trigger_layout); triggers_layout->addLayout(r_trigger_layout);
m_triggers_box->setLayout(triggers_layout); m_triggers_box->setLayout(triggers_layout);
m_a_button = new TASCheckBox(QStringLiteral("&A")); m_a_button = CreateButton(QStringLiteral("&A"));
m_b_button = new TASCheckBox(QStringLiteral("&B")); m_b_button = CreateButton(QStringLiteral("&B"));
m_1_button = new TASCheckBox(QStringLiteral("&1")); m_1_button = CreateButton(QStringLiteral("&1"));
m_2_button = new TASCheckBox(QStringLiteral("&2")); m_2_button = CreateButton(QStringLiteral("&2"));
m_plus_button = new TASCheckBox(QStringLiteral("&+")); m_plus_button = CreateButton(QStringLiteral("&+"));
m_minus_button = new TASCheckBox(QStringLiteral("&-")); m_minus_button = CreateButton(QStringLiteral("&-"));
m_home_button = new TASCheckBox(QStringLiteral("&HOME")); m_home_button = CreateButton(QStringLiteral("&HOME"));
m_left_button = new TASCheckBox(QStringLiteral("&Left")); m_left_button = CreateButton(QStringLiteral("&Left"));
m_up_button = new TASCheckBox(QStringLiteral("&Up")); m_up_button = CreateButton(QStringLiteral("&Up"));
m_down_button = new TASCheckBox(QStringLiteral("&Down")); m_down_button = CreateButton(QStringLiteral("&Down"));
m_right_button = new TASCheckBox(QStringLiteral("&Right")); m_right_button = CreateButton(QStringLiteral("&Right"));
m_c_button = new TASCheckBox(QStringLiteral("&C")); m_c_button = CreateButton(QStringLiteral("&C"));
m_z_button = new TASCheckBox(QStringLiteral("&Z")); m_z_button = CreateButton(QStringLiteral("&Z"));
auto* buttons_layout = new QGridLayout; auto* buttons_layout = new QGridLayout;
buttons_layout->addWidget(m_a_button, 0, 0); buttons_layout->addWidget(m_a_button, 0, 0);
@ -201,21 +201,21 @@ WiiTASInputWindow::WiiTASInputWindow(QWidget* parent, int num) : TASInputWindow(
m_nunchuk_buttons_box = new QGroupBox(tr("Nunchuk Buttons")); m_nunchuk_buttons_box = new QGroupBox(tr("Nunchuk Buttons"));
m_nunchuk_buttons_box->setLayout(nunchuk_buttons_layout); m_nunchuk_buttons_box->setLayout(nunchuk_buttons_layout);
m_classic_a_button = new TASCheckBox(QStringLiteral("&A")); m_classic_a_button = CreateButton(QStringLiteral("&A"));
m_classic_b_button = new TASCheckBox(QStringLiteral("&B")); m_classic_b_button = CreateButton(QStringLiteral("&B"));
m_classic_x_button = new TASCheckBox(QStringLiteral("&X")); m_classic_x_button = CreateButton(QStringLiteral("&X"));
m_classic_y_button = new TASCheckBox(QStringLiteral("&Y")); m_classic_y_button = CreateButton(QStringLiteral("&Y"));
m_classic_l_button = new TASCheckBox(QStringLiteral("&L")); m_classic_l_button = CreateButton(QStringLiteral("&L"));
m_classic_r_button = new TASCheckBox(QStringLiteral("&R")); m_classic_r_button = CreateButton(QStringLiteral("&R"));
m_classic_zl_button = new TASCheckBox(QStringLiteral("&ZL")); m_classic_zl_button = CreateButton(QStringLiteral("&ZL"));
m_classic_zr_button = new TASCheckBox(QStringLiteral("ZR")); m_classic_zr_button = CreateButton(QStringLiteral("ZR"));
m_classic_plus_button = new TASCheckBox(QStringLiteral("&+")); m_classic_plus_button = CreateButton(QStringLiteral("&+"));
m_classic_minus_button = new TASCheckBox(QStringLiteral("&-")); m_classic_minus_button = CreateButton(QStringLiteral("&-"));
m_classic_home_button = new TASCheckBox(QStringLiteral("&HOME")); m_classic_home_button = CreateButton(QStringLiteral("&HOME"));
m_classic_left_button = new TASCheckBox(QStringLiteral("L&eft")); m_classic_left_button = CreateButton(QStringLiteral("L&eft"));
m_classic_up_button = new TASCheckBox(QStringLiteral("&Up")); m_classic_up_button = CreateButton(QStringLiteral("&Up"));
m_classic_down_button = new TASCheckBox(QStringLiteral("&Down")); m_classic_down_button = CreateButton(QStringLiteral("&Down"));
m_classic_right_button = new TASCheckBox(QStringLiteral("R&ight")); m_classic_right_button = CreateButton(QStringLiteral("R&ight"));
auto* classic_buttons_layout = new QGridLayout; auto* classic_buttons_layout = new QGridLayout;
classic_buttons_layout->addWidget(m_classic_a_button, 0, 0); classic_buttons_layout->addWidget(m_classic_a_button, 0, 0);
@ -248,7 +248,7 @@ WiiTASInputWindow::WiiTASInputWindow(QWidget* parent, int num) : TASInputWindow(
layout->addWidget(m_remote_buttons_box); layout->addWidget(m_remote_buttons_box);
layout->addWidget(m_nunchuk_buttons_box); layout->addWidget(m_nunchuk_buttons_box);
layout->addWidget(m_classic_buttons_box); layout->addWidget(m_classic_buttons_box);
layout->addWidget(m_use_controller); layout->addWidget(m_settings_box);
setLayout(layout); setLayout(layout);