From 99f1f4c22a9f110dfcfcf441b33c742552b76d36 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 4 Jan 2025 15:46:15 +0100 Subject: [PATCH] cheats: add float32 gui support --- Utilities/cheat_info.h | 1 + rpcs3/rpcs3qt/cheat_manager.cpp | 43 ++++++++++++++++++++------------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/Utilities/cheat_info.h b/Utilities/cheat_info.h index 9c77d8dd7f..3ceb32716b 100644 --- a/Utilities/cheat_info.h +++ b/Utilities/cheat_info.h @@ -14,6 +14,7 @@ enum class cheat_type : u8 signed_16_cheat, signed_32_cheat, signed_64_cheat, + float_32_cheat, max }; diff --git a/rpcs3/rpcs3qt/cheat_manager.cpp b/rpcs3/rpcs3qt/cheat_manager.cpp index 27e0860232..d5af8a1a2f 100644 --- a/rpcs3/rpcs3qt/cheat_manager.cpp +++ b/rpcs3/rpcs3qt/cheat_manager.cpp @@ -43,6 +43,7 @@ void fmt_class_string::format(std::string& out, u64 arg) case cheat_type::signed_16_cheat: return "Signed 16 bits"; case cheat_type::signed_32_cheat: return "Signed 32 bits"; case cheat_type::signed_64_cheat: return "Signed 64 bits"; + case cheat_type::float_32_cheat: return "Float 32 bits"; case cheat_type::max: break; } @@ -612,8 +613,9 @@ cheat_manager_dialog::cheat_manager_dialog(QWidget* parent) return; } - bool success; - u64 result_value; + bool success = false; + u64 result_value {}; + f64 result_value_f {}; switch (cheat->type) { @@ -625,6 +627,7 @@ cheat_manager_dialog::cheat_manager_dialog(QWidget* parent) case cheat_type::signed_16_cheat: result_value = cheat_engine::get_value(final_offset, success); break; case cheat_type::signed_32_cheat: result_value = cheat_engine::get_value(final_offset, success); break; case cheat_type::signed_64_cheat: result_value = cheat_engine::get_value(final_offset, success); break; + case cheat_type::float_32_cheat: result_value_f = cheat_engine::get_value(final_offset, success); break; default: log_cheat.fatal("Unsupported cheat type"); return; } @@ -632,6 +635,8 @@ cheat_manager_dialog::cheat_manager_dialog(QWidget* parent) { if (cheat->type >= cheat_type::signed_8_cheat && cheat->type <= cheat_type::signed_64_cheat) edt_value_final->setText(tr("%1").arg(static_cast(result_value))); + else if (cheat->type == cheat_type::float_32_cheat) + edt_value_final->setText(tr("%1").arg(result_value_f)); else edt_value_final->setText(tr("%1").arg(result_value)); } @@ -795,6 +800,7 @@ cheat_manager_dialog::cheat_manager_dialog(QWidget* parent) case cheat_type::signed_16_cheat: results = convert_and_set(final_offset); break; case cheat_type::signed_32_cheat: results = convert_and_set(final_offset); break; case cheat_type::signed_64_cheat: results = convert_and_set(final_offset); break; + case cheat_type::float_32_cheat: results = convert_and_set(final_offset); break; default: log_cheat.fatal("Unsupported cheat type"); return; } @@ -888,8 +894,6 @@ cheat_manager_dialog* cheat_manager_dialog::get_dlg(QWidget* parent) template T cheat_manager_dialog::convert_from_QString(const QString& str, bool& success) { - T result; - if constexpr (std::is_same_v) { const u16 result_16 = str.toUShort(&success); @@ -897,17 +901,17 @@ T cheat_manager_dialog::convert_from_QString(const QString& str, bool& success) if (result_16 > 0xFF) success = false; - result = static_cast(result_16); + return static_cast(result_16); } if constexpr (std::is_same_v) - result = str.toUShort(&success); + return str.toUShort(&success); if constexpr (std::is_same_v) - result = str.toUInt(&success); + return str.toUInt(&success); if constexpr (std::is_same_v) - result = str.toULongLong(&success); + return str.toULongLong(&success); if constexpr (std::is_same_v) { @@ -915,28 +919,31 @@ T cheat_manager_dialog::convert_from_QString(const QString& str, bool& success) if (result_16 < -128 || result_16 > 127) success = false; - result = static_cast(result_16); + return static_cast(result_16); } if constexpr (std::is_same_v) - result = str.toShort(&success); + return str.toShort(&success); if constexpr (std::is_same_v) - result = str.toInt(&success); + return str.toInt(&success); if constexpr (std::is_same_v) - result = str.toLongLong(&success); + return str.toLongLong(&success); - return result; + if constexpr (std::is_same_v) + return str.toFloat(&success); + + return {}; } template bool cheat_manager_dialog::convert_and_search() { - bool res_conv; + bool res_conv = false; const QString to_search = edt_cheat_search_value->text(); - T value = convert_from_QString(to_search, res_conv); + const T value = convert_from_QString(to_search, res_conv); if (!res_conv) return false; @@ -948,10 +955,10 @@ bool cheat_manager_dialog::convert_and_search() template std::pair cheat_manager_dialog::convert_and_set(u32 offset) { - bool res_conv; + bool res_conv = false; const QString to_set = edt_value_final->text(); - T value = convert_from_QString(to_set, res_conv); + const T value = convert_from_QString(to_set, res_conv); if (!res_conv) return {false, false}; @@ -974,6 +981,7 @@ void cheat_manager_dialog::do_the_search() case cheat_type::signed_16_cheat: res_conv = convert_and_search(); break; case cheat_type::signed_32_cheat: res_conv = convert_and_search(); break; case cheat_type::signed_64_cheat: res_conv = convert_and_search(); break; + case cheat_type::float_32_cheat: res_conv = convert_and_search(); break; default: log_cheat.fatal("Unsupported cheat type"); break; } @@ -1065,6 +1073,7 @@ QString cheat_manager_dialog::get_localized_cheat_type(cheat_type type) case cheat_type::signed_16_cheat: return tr("Signed 16 bits"); case cheat_type::signed_32_cheat: return tr("Signed 32 bits"); case cheat_type::signed_64_cheat: return tr("Signed 64 bits"); + case cheat_type::float_32_cheat: return tr("Float 32 bits"); case cheat_type::max: break; } std::string type_formatted;