diff options
Diffstat (limited to 'src/input_common/drivers/tas_input.cpp')
| -rw-r--r-- | src/input_common/drivers/tas_input.cpp | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/src/input_common/drivers/tas_input.cpp b/src/input_common/drivers/tas_input.cpp index 5bdd5dac3..944e141bf 100644 --- a/src/input_common/drivers/tas_input.cpp +++ b/src/input_common/drivers/tas_input.cpp | |||
| @@ -23,7 +23,7 @@ enum class Tas::TasAxis : u8 { | |||
| 23 | }; | 23 | }; |
| 24 | 24 | ||
| 25 | // Supported keywords and buttons from a TAS file | 25 | // Supported keywords and buttons from a TAS file |
| 26 | constexpr std::array<std::pair<std::string_view, TasButton>, 20> text_to_tas_button = { | 26 | constexpr std::array<std::pair<std::string_view, TasButton>, 18> text_to_tas_button = { |
| 27 | std::pair{"KEY_A", TasButton::BUTTON_A}, | 27 | std::pair{"KEY_A", TasButton::BUTTON_A}, |
| 28 | {"KEY_B", TasButton::BUTTON_B}, | 28 | {"KEY_B", TasButton::BUTTON_B}, |
| 29 | {"KEY_X", TasButton::BUTTON_X}, | 29 | {"KEY_X", TasButton::BUTTON_X}, |
| @@ -40,8 +40,9 @@ constexpr std::array<std::pair<std::string_view, TasButton>, 20> text_to_tas_but | |||
| 40 | {"KEY_DDOWN", TasButton::BUTTON_DOWN}, | 40 | {"KEY_DDOWN", TasButton::BUTTON_DOWN}, |
| 41 | {"KEY_SL", TasButton::BUTTON_SL}, | 41 | {"KEY_SL", TasButton::BUTTON_SL}, |
| 42 | {"KEY_SR", TasButton::BUTTON_SR}, | 42 | {"KEY_SR", TasButton::BUTTON_SR}, |
| 43 | {"KEY_CAPTURE", TasButton::BUTTON_CAPTURE}, | 43 | // These buttons are disabled to avoid TAS input from activating hotkeys |
| 44 | {"KEY_HOME", TasButton::BUTTON_HOME}, | 44 | // {"KEY_CAPTURE", TasButton::BUTTON_CAPTURE}, |
| 45 | // {"KEY_HOME", TasButton::BUTTON_HOME}, | ||
| 45 | {"KEY_ZL", TasButton::TRIGGER_ZL}, | 46 | {"KEY_ZL", TasButton::TRIGGER_ZL}, |
| 46 | {"KEY_ZR", TasButton::TRIGGER_ZR}, | 47 | {"KEY_ZR", TasButton::TRIGGER_ZR}, |
| 47 | }; | 48 | }; |
| @@ -105,10 +106,16 @@ void Tas::LoadTasFile(size_t player_index, size_t file_index) { | |||
| 105 | continue; | 106 | continue; |
| 106 | } | 107 | } |
| 107 | 108 | ||
| 108 | const auto num_frames = std::stoi(seg_list[0]); | 109 | try { |
| 109 | while (frame_no < num_frames) { | 110 | const auto num_frames = std::stoi(seg_list[0]); |
| 110 | commands[player_index].emplace_back(); | 111 | while (frame_no < num_frames) { |
| 111 | frame_no++; | 112 | commands[player_index].emplace_back(); |
| 113 | frame_no++; | ||
| 114 | } | ||
| 115 | } catch (const std::invalid_argument&) { | ||
| 116 | LOG_ERROR(Input, "Invalid argument: '{}' at command {}", seg_list[0], frame_no); | ||
| 117 | } catch (const std::out_of_range&) { | ||
| 118 | LOG_ERROR(Input, "Out of range: '{}' at command {}", seg_list[0], frame_no); | ||
| 112 | } | 119 | } |
| 113 | 120 | ||
| 114 | TASCommand command = { | 121 | TASCommand command = { |
| @@ -233,10 +240,21 @@ TasAnalog Tas::ReadCommandAxis(const std::string& line) const { | |||
| 233 | } | 240 | } |
| 234 | } | 241 | } |
| 235 | 242 | ||
| 236 | const float x = std::stof(seg_list.at(0)) / 32767.0f; | 243 | if (seg_list.size() < 2) { |
| 237 | const float y = std::stof(seg_list.at(1)) / 32767.0f; | 244 | LOG_ERROR(Input, "Invalid axis data: '{}'", line); |
| 245 | return {}; | ||
| 246 | } | ||
| 238 | 247 | ||
| 239 | return {x, y}; | 248 | try { |
| 249 | const float x = std::stof(seg_list.at(0)) / 32767.0f; | ||
| 250 | const float y = std::stof(seg_list.at(1)) / 32767.0f; | ||
| 251 | return {x, y}; | ||
| 252 | } catch (const std::invalid_argument&) { | ||
| 253 | LOG_ERROR(Input, "Invalid argument: '{}'", line); | ||
| 254 | } catch (const std::out_of_range&) { | ||
| 255 | LOG_ERROR(Input, "Out of range: '{}'", line); | ||
| 256 | } | ||
| 257 | return {}; | ||
| 240 | } | 258 | } |
| 241 | 259 | ||
| 242 | u64 Tas::ReadCommandButtons(const std::string& line) const { | 260 | u64 Tas::ReadCommandButtons(const std::string& line) const { |