summaryrefslogtreecommitdiff
path: root/src/input_common/drivers/tas_input.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/input_common/drivers/tas_input.cpp')
-rw-r--r--src/input_common/drivers/tas_input.cpp38
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
26constexpr std::array<std::pair<std::string_view, TasButton>, 20> text_to_tas_button = { 26constexpr 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
242u64 Tas::ReadCommandButtons(const std::string& line) const { 260u64 Tas::ReadCommandButtons(const std::string& line) const {