Forráskód Böngészése

Merge pull request #7576 from lioncash/tasenum

tas_input: Minor cleanup
bunnei 4 éve
szülő
commit
7276aaf907
2 módosított fájl, 82 hozzáadás és 70 törlés
  1. 49 44
      src/input_common/drivers/tas_input.cpp
  2. 33 26
      src/input_common/drivers/tas_input.h

+ 49 - 44
src/input_common/drivers/tas_input.cpp

@@ -3,7 +3,6 @@
 // Refer to the license.txt file included.
 
 #include <cstring>
-#include <regex>
 #include <fmt/format.h>
 
 #include "common/fs/file.h"
@@ -15,7 +14,7 @@
 
 namespace InputCommon::TasInput {
 
-enum TasAxes : u8 {
+enum class Tas::TasAxis : u8 {
     StickX,
     StickY,
     SubstickX,
@@ -66,7 +65,7 @@ Tas::Tas(const std::string& input_engine_) : InputCommon::InputEngine(input_engi
 
 Tas::~Tas() {
     Stop();
-};
+}
 
 void Tas::LoadTasFiles() {
     script_length = 0;
@@ -79,43 +78,43 @@ void Tas::LoadTasFiles() {
 }
 
 void Tas::LoadTasFile(size_t player_index, size_t file_index) {
-    if (!commands[player_index].empty()) {
-        commands[player_index].clear();
-    }
+    commands[player_index].clear();
+
     std::string file = Common::FS::ReadStringFromFile(
         Common::FS::GetYuzuPath(Common::FS::YuzuPath::TASDir) /
             fmt::format("script{}-{}.txt", file_index, player_index + 1),
         Common::FS::FileType::BinaryFile);
-    std::stringstream command_line(file);
+    std::istringstream command_line(file);
     std::string line;
     int frame_no = 0;
     while (std::getline(command_line, line, '\n')) {
         if (line.empty()) {
             continue;
         }
-        std::smatch m;
 
-        std::stringstream linestream(line);
-        std::string segment;
-        std::vector<std::string> seglist;
-
-        while (std::getline(linestream, segment, ' ')) {
-            seglist.push_back(segment);
+        std::vector<std::string> seg_list;
+        {
+            std::istringstream line_stream(line);
+            std::string segment;
+            while (std::getline(line_stream, segment, ' ')) {
+                seg_list.push_back(std::move(segment));
+            }
         }
 
-        if (seglist.size() < 4) {
+        if (seg_list.size() < 4) {
             continue;
         }
 
-        while (frame_no < std::stoi(seglist.at(0))) {
-            commands[player_index].push_back({});
+        const auto num_frames = std::stoi(seg_list[0]);
+        while (frame_no < num_frames) {
+            commands[player_index].emplace_back();
             frame_no++;
         }
 
         TASCommand command = {
-            .buttons = ReadCommandButtons(seglist.at(1)),
-            .l_axis = ReadCommandAxis(seglist.at(2)),
-            .r_axis = ReadCommandAxis(seglist.at(3)),
+            .buttons = ReadCommandButtons(seg_list[1]),
+            .l_axis = ReadCommandAxis(seg_list[2]),
+            .r_axis = ReadCommandAxis(seg_list[3]),
         };
         commands[player_index].push_back(command);
         frame_no++;
@@ -123,16 +122,17 @@ void Tas::LoadTasFile(size_t player_index, size_t file_index) {
     LOG_INFO(Input, "TAS file loaded! {} frames", frame_no);
 }
 
-void Tas::WriteTasFile(std::u8string file_name) {
+void Tas::WriteTasFile(std::u8string_view file_name) {
     std::string output_text;
     for (size_t frame = 0; frame < record_commands.size(); frame++) {
         const TASCommand& line = record_commands[frame];
         output_text += fmt::format("{} {} {} {}\n", frame, WriteCommandButtons(line.buttons),
                                    WriteCommandAxis(line.l_axis), WriteCommandAxis(line.r_axis));
     }
-    const auto bytes_written = Common::FS::WriteStringToFile(
-        Common::FS::GetYuzuPath(Common::FS::YuzuPath::TASDir) / file_name,
-        Common::FS::FileType::TextFile, output_text);
+
+    const auto tas_file_name = Common::FS::GetYuzuPath(Common::FS::YuzuPath::TASDir) / file_name;
+    const auto bytes_written =
+        Common::FS::WriteStringToFile(tas_file_name, Common::FS::FileType::TextFile, output_text);
     if (bytes_written == output_text.size()) {
         LOG_INFO(Input, "TAS file written to file!");
     } else {
@@ -205,10 +205,10 @@ void Tas::UpdateThread() {
                 const int button = static_cast<int>(i);
                 SetButton(identifier, button, button_status);
             }
-            SetAxis(identifier, TasAxes::StickX, command.l_axis.x);
-            SetAxis(identifier, TasAxes::StickY, command.l_axis.y);
-            SetAxis(identifier, TasAxes::SubstickX, command.r_axis.x);
-            SetAxis(identifier, TasAxes::SubstickY, command.r_axis.y);
+            SetTasAxis(identifier, TasAxis::StickX, command.l_axis.x);
+            SetTasAxis(identifier, TasAxis::StickY, command.l_axis.y);
+            SetTasAxis(identifier, TasAxis::SubstickX, command.r_axis.x);
+            SetTasAxis(identifier, TasAxis::SubstickY, command.r_axis.y);
         }
     } else {
         is_running = Settings::values.tas_loop.GetValue();
@@ -224,27 +224,28 @@ void Tas::ClearInput() {
 }
 
 TasAnalog Tas::ReadCommandAxis(const std::string& line) const {
-    std::stringstream linestream(line);
-    std::string segment;
-    std::vector<std::string> seglist;
-
-    while (std::getline(linestream, segment, ';')) {
-        seglist.push_back(segment);
+    std::vector<std::string> seg_list;
+    {
+        std::istringstream line_stream(line);
+        std::string segment;
+        while (std::getline(line_stream, segment, ';')) {
+            seg_list.push_back(std::move(segment));
+        }
     }
 
-    const float x = std::stof(seglist.at(0)) / 32767.0f;
-    const float y = std::stof(seglist.at(1)) / 32767.0f;
+    const float x = std::stof(seg_list.at(0)) / 32767.0f;
+    const float y = std::stof(seg_list.at(1)) / 32767.0f;
 
     return {x, y};
 }
 
-u64 Tas::ReadCommandButtons(const std::string& data) const {
-    std::stringstream button_text(data);
-    std::string line;
+u64 Tas::ReadCommandButtons(const std::string& line) const {
+    std::istringstream button_text(line);
+    std::string button_line;
     u64 buttons = 0;
-    while (std::getline(button_text, line, ';')) {
-        for (auto [text, tas_button] : text_to_tas_button) {
-            if (text == line) {
+    while (std::getline(button_text, button_line, ';')) {
+        for (const auto& [text, tas_button] : text_to_tas_button) {
+            if (text == button_line) {
                 buttons |= static_cast<u64>(tas_button);
                 break;
             }
@@ -254,8 +255,8 @@ u64 Tas::ReadCommandButtons(const std::string& data) const {
 }
 
 std::string Tas::WriteCommandButtons(u64 buttons) const {
-    std::string returns = "";
-    for (auto [text_button, tas_button] : text_to_tas_button) {
+    std::string returns;
+    for (const auto& [text_button, tas_button] : text_to_tas_button) {
         if ((buttons & static_cast<u64>(tas_button)) != 0) {
             returns += fmt::format("{};", text_button);
         }
@@ -267,6 +268,10 @@ std::string Tas::WriteCommandAxis(TasAnalog analog) const {
     return fmt::format("{};{}", analog.x * 32767, analog.y * 32767);
 }
 
+void Tas::SetTasAxis(const PadIdentifier& identifier, TasAxis axis, f32 value) {
+    SetAxis(identifier, static_cast<int>(axis), value);
+}
+
 void Tas::StartStop() {
     if (!Settings::values.tas_enable) {
         return;

+ 33 - 26
src/input_common/drivers/tas_input.h

@@ -5,11 +5,11 @@
 #pragma once
 
 #include <array>
+#include <string>
+#include <vector>
 
 #include "common/common_types.h"
-#include "common/settings_input.h"
 #include "input_common/input_engine.h"
-#include "input_common/main.h"
 
 /*
 To play back TAS scripts on Yuzu, select the folder with scripts in the configuration menu below
@@ -88,39 +88,39 @@ public:
 
     /**
      * Changes the input status that will be stored in each frame
-     * @param buttons: bitfield with the status of the buttons
-     * @param left_axis: value of the left axis
-     * @param right_axis: value of the right axis
+     * @param buttons    Bitfield with the status of the buttons
+     * @param left_axis  Value of the left axis
+     * @param right_axis Value of the right axis
      */
     void RecordInput(u64 buttons, TasAnalog left_axis, TasAnalog right_axis);
 
     // Main loop that records or executes input
     void UpdateThread();
 
-    //  Sets the flag to start or stop the TAS command excecution and swaps controllers profiles
+    // Sets the flag to start or stop the TAS command execution and swaps controllers profiles
     void StartStop();
 
-    //  Stop the TAS and reverts any controller profile
+    // Stop the TAS and reverts any controller profile
     void Stop();
 
-    // Sets the flag to reload the file and start from the begining in the next update
+    // Sets the flag to reload the file and start from the beginning in the next update
     void Reset();
 
     /**
      * Sets the flag to enable or disable recording of inputs
-     * @return Returns true if the current recording status is enabled
+     * @returns true if the current recording status is enabled
      */
     bool Record();
 
     /**
      * Saves contents of record_commands on a file
-     * @param overwrite_file: Indicates if player 1 should be overwritten
+     * @param overwrite_file Indicates if player 1 should be overwritten
      */
     void SaveRecording(bool overwrite_file);
 
     /**
      * Returns the current status values of TAS playback/recording
-     * @return Tuple of
+     * @returns A Tuple of
      * TasState indicating the current state out of Running ;
      * Current playback progress ;
      * Total length of script file currently loaded or being recorded
@@ -128,6 +128,8 @@ public:
     std::tuple<TasState, size_t, size_t> GetStatus() const;
 
 private:
+    enum class TasAxis : u8;
+
     struct TASCommand {
         u64 buttons{};
         TasAnalog l_axis{};
@@ -137,29 +139,31 @@ private:
     /// Loads TAS files from all players
     void LoadTasFiles();
 
-    /** Loads TAS file from the specified player
-     * @param player_index: player number to save the script
-     * @param file_index: script number of the file
+    /**
+     * Loads TAS file from the specified player
+     * @param player_index Player number to save the script
+     * @param file_index   Script number of the file
      */
     void LoadTasFile(size_t player_index, size_t file_index);
 
-    /** Writes a TAS file from the recorded commands
-     * @param file_name: name of the file to be written
+    /**
+     * Writes a TAS file from the recorded commands
+     * @param file_name Name of the file to be written
      */
-    void WriteTasFile(std::u8string file_name);
+    void WriteTasFile(std::u8string_view file_name);
 
     /**
      * Parses a string containing the axis values. X and Y have a range from -32767 to 32767
-     * @param line: string containing axis values with the following format "x;y"
-     * @return Returns a TAS analog object with axis values with range from -1.0 to 1.0
+     * @param line String containing axis values with the following format "x;y"
+     * @returns A TAS analog object with axis values with range from -1.0 to 1.0
      */
     TasAnalog ReadCommandAxis(const std::string& line) const;
 
     /**
      * Parses a string containing the button values. Each button is represented by it's text format
      * specified in text_to_tas_button array
-     * @param line: string containing button name with the following format "a;b;c;d..."
-     * @return Returns a u64 with each bit representing the status of a button
+     * @param line string containing button name with the following format "a;b;c;d..."
+     * @returns A u64 with each bit representing the status of a button
      */
     u64 ReadCommandButtons(const std::string& line) const;
 
@@ -170,17 +174,20 @@ private:
 
     /**
      * Converts an u64 containing the button status into the text equivalent
-     * @param buttons: bitfield with the status of the buttons
-     * @return Returns a string with the name of the buttons to be written to the file
+     * @param buttons Bitfield with the status of the buttons
+     * @returns A string with the name of the buttons to be written to the file
      */
     std::string WriteCommandButtons(u64 buttons) const;
 
     /**
      * Converts an TAS analog object containing the axis status into the text equivalent
-     * @param data: value of the axis
-     * @return A string with the value of the axis to be written to the file
+     * @param analog Value of the axis
+     * @returns A string with the value of the axis to be written to the file
      */
-    std::string WriteCommandAxis(TasAnalog data) const;
+    std::string WriteCommandAxis(TasAnalog analog) const;
+
+    /// Sets an axis for a particular pad to the given value.
+    void SetTasAxis(const PadIdentifier& identifier, TasAxis axis, f32 value);
 
     size_t script_length{0};
     bool is_recording{false};