From f0f2439be0e20158a2bf872e7041cae495d6c860 Mon Sep 17 00:00:00 2001 From: Zero Fanker Date: Tue, 26 Nov 2024 22:53:24 -0500 Subject: [PATCH] refactored serde between waypoint number and 26 radix string . (#122) --- MissionEditor/Helpers.h | 45 ++++++++++++++++++++ MissionEditor/TeamTypes.cpp | 66 +++-------------------------- MissionEditor/TriggerActionsDlg.cpp | 12 +++--- UnitTest/UnitTest.vcxproj | 5 ++- UnitTest/UnitTest.vcxproj.filters | 3 ++ UnitTest/Waypoint_Test.cpp | 13 ++++++ 6 files changed, 74 insertions(+), 70 deletions(-) create mode 100644 UnitTest/Waypoint_Test.cpp diff --git a/MissionEditor/Helpers.h b/MissionEditor/Helpers.h index 78de818..7baf5a6 100644 --- a/MissionEditor/Helpers.h +++ b/MissionEditor/Helpers.h @@ -1,6 +1,7 @@ #pragma once #include #include +#include // coordinate functions inline void PosToXY(const char* pos, int* X, int* Y) @@ -89,4 +90,48 @@ inline std::array HSVToRGB(const unsigned char hsv[3]) std::array ret; HSVToRGB(hsv, ret.data()); return ret; +} + +inline int letter2number(char let) { + int reply = let - 'A'; + return reply; + +} + +inline char number2letter(int let) { + int reply = let + 'A'; + return reply; + +} + +inline int StringToWaypoint(const CString& str) +{ + if (str.IsEmpty()) { + return -1; + } + int num = 0; + for (auto idx = 0; idx < str.GetLength(); ++idx) { + auto const ch = str[idx]; + num = (num + idx) * 26 + letter2number(ch); + } + return num; +} + +// Serialize waypoint, will be renamed later +inline CString WaypointToString(int num) +{ + if (num < 0) { + return {}; + } + char secondChar = number2letter(num % 26); + char carry = num / 26; + if (!carry) { + return secondChar; + } + + char firstChar = number2letter(carry - 1); + CString ret; + ret += firstChar; + ret += secondChar; + return ret; } \ No newline at end of file diff --git a/MissionEditor/TeamTypes.cpp b/MissionEditor/TeamTypes.cpp index 604b3b8..6a9cb24 100644 --- a/MissionEditor/TeamTypes.cpp +++ b/MissionEditor/TeamTypes.cpp @@ -29,6 +29,7 @@ #include "variables.h" #include "functions.h" #include "inlines.h" +#include "Helpers.h" #ifdef _DEBUG #define new DEBUG_NEW @@ -332,63 +333,6 @@ CString btos(BOOL b) return s; } -int letter2number(char let) { - int reply = let - 'A'; - return reply; - -} - -char number2letter(int let) { - int reply = let + 'A'; - return reply; - -} - -int GetWaypoint(const char* c) -{ - if (strlen(c) == 0) { - return -1; - } - int i; - int res = 0; - for (i = 0; i < strlen(c); i++) { - int addval = letter2number(c[i]); - res += addval + (res + 1) * (i * 25) + i; - } - return res; -} - -// Serialize waypoint, will be renamed later -CString GetWaypoint(int n) -{ - if (n == -1) { - return ""; - } - for (int i = -1; i < 26; i++) { - for (int e = 0; e < 26; e++) { - char c[50]; - CString p; - if (i == -1) { - c[0] = number2letter(e); - c[1] = 0; - if (GetWaypoint(c) == n) { - return c; - } - } else { - c[0] = number2letter(i); - c[1] = number2letter(e); - c[2] = 0; - if (GetWaypoint(c) == n) { - return c; - } - } - - } - } - return ""; -} - - ///////////////////////////////////////////////////////////////////////////// // Behandlungsroutinen für Nachrichten CTeamTypes void CTeamTypes::UpdateDialog() @@ -616,7 +560,7 @@ void CTeamTypes::OnSelchangeTeamtypes() } - int w = GetWaypoint(sec["Waypoint"]); + int w = StringToWaypoint(sec["Waypoint"]); char c[50]; itoa(w, c, 10); if (w != -1) @@ -626,7 +570,7 @@ void CTeamTypes::OnSelchangeTeamtypes() #ifdef RA2_MODE if (sec.GetBool("UseTransportOrigin")) { - int w = GetWaypoint(sec["TransportWaypoint"]); + int w = StringToWaypoint(sec["TransportWaypoint"]); char c[50]; itoa(w, c, 10); if (w != -1) @@ -807,7 +751,7 @@ void CTeamTypes::OnEditchangeWaypoint() if (strlen(m_Waypoint) == 0) { sec->SetString("Waypoint", ""); } else { - sec->SetString("Waypoint", GetWaypoint(atoi(m_Waypoint))); + sec->SetString("Waypoint", WaypointToString(atoi(m_Waypoint))); } } @@ -1443,7 +1387,7 @@ void CTeamTypes::OnEditchangeTransportwaypoint() sec->SetBool("UseTransportOrigin", false); return; } - sec->SetString("TransportWaypoint", GetWaypoint(atoi(m_TransportWaypoint))); + sec->SetString("TransportWaypoint", WaypointToString(atoi(m_TransportWaypoint))); sec->SetBool("UseTransportOrigin", true); } diff --git a/MissionEditor/TriggerActionsDlg.cpp b/MissionEditor/TriggerActionsDlg.cpp index 1440fba..c7c3849 100644 --- a/MissionEditor/TriggerActionsDlg.cpp +++ b/MissionEditor/TriggerActionsDlg.cpp @@ -28,9 +28,7 @@ #include "variables.h" #include "functions.h" #include "inlines.h" - -CString GetWaypoint(int n); -int GetWaypoint(const char* c); +#include "Helpers.h" #ifdef _DEBUG #define new DEBUG_NEW @@ -249,7 +247,7 @@ void CTriggerActionsDlg::OnEditchangeActiontype() GetParam(ini["Actions"][m_currentTrigger], pos + 1 + 6) ) && bNoWP) { - int number = GetWaypoint(GetParam(ini["Actions"][m_currentTrigger], pos + 1 + 6)); + int number = StringToWaypoint(GetParam(ini["Actions"][m_currentTrigger], pos + 1 + 6)); char c[50]; itoa(number, c, 10); ini.SetString("Actions", m_currentTrigger, SetParam(ini["Actions"][m_currentTrigger], pos + 1 + 6, c)); @@ -258,7 +256,7 @@ void CTriggerActionsDlg::OnEditchangeActiontype() ) && !bNoWP) { int wp = atoi(GetParam(ini["Actions"][m_currentTrigger], pos + 1 + 6)); - CString s = GetWaypoint(wp); + CString s = WaypointToString(wp); ini.SetString("Actions", m_currentTrigger, SetParam(ini["Actions"][m_currentTrigger], pos + 1 + 6, s)); }; @@ -365,7 +363,7 @@ void CTriggerActionsDlg::OnSelchangeParameter() char wayp[50]; if (!bNoWP) { ListWaypoints(m_ParamValue); - int iWayp = GetWaypoint(GetParam(ActionData, startpos + 1 + 6)); + int iWayp = StringToWaypoint(GetParam(ActionData, startpos + 1 + 6)); itoa(iWayp, wayp, 10); } else { @@ -426,7 +424,7 @@ void CTriggerActionsDlg::OnEditchangeParamvalue() CString waypoint = newVal; if (!bNoWP) { - waypoint = GetWaypoint(atoi(newVal)); + waypoint = WaypointToString(atoi(newVal)); } ini.SetString("Actions", m_currentTrigger, SetParam(ini["Actions"][m_currentTrigger], pos, (LPCTSTR)waypoint)); diff --git a/UnitTest/UnitTest.vcxproj b/UnitTest/UnitTest.vcxproj index 987b31e..d72ae3d 100644 --- a/UnitTest/UnitTest.vcxproj +++ b/UnitTest/UnitTest.vcxproj @@ -104,7 +104,7 @@ true RA2_MODE;NOMINMAX;_CONSOLE;_AFXDLL;%(PreprocessorDefinitions);_DEBUG true - $(SolutionDir)googletest\x64\include;$(SolutionDir)MissionEditorPackLib;%(AdditionalIncludeDirectories) + $(SolutionDir)googletest\x64\include;$(SolutionDir)MissionEditorPackLib;$(SolutionDir)MissionEditor;%(AdditionalIncludeDirectories) Create MultiThreadedDebugDLL stdcpp20 @@ -124,7 +124,7 @@ true RA2_MODE;NOMINMAX;_CONSOLE;_AFXDLL;%(PreprocessorDefinitions);NDEBUG true - $(SolutionDir)googletest\x64\include;$(SolutionDir)MissionEditorPackLib;%(AdditionalIncludeDirectories) + $(SolutionDir)googletest\x64\include;$(SolutionDir)MissionEditorPackLib;$(SolutionDir)MissionEditor;%(AdditionalIncludeDirectories) stdcpp20 @@ -143,6 +143,7 @@ + diff --git a/UnitTest/UnitTest.vcxproj.filters b/UnitTest/UnitTest.vcxproj.filters index 552a0d6..534a111 100644 --- a/UnitTest/UnitTest.vcxproj.filters +++ b/UnitTest/UnitTest.vcxproj.filters @@ -33,6 +33,9 @@ 源文件 + + 源文件 + diff --git a/UnitTest/Waypoint_Test.cpp b/UnitTest/Waypoint_Test.cpp new file mode 100644 index 0000000..bf7778e --- /dev/null +++ b/UnitTest/Waypoint_Test.cpp @@ -0,0 +1,13 @@ +#include "stdafx.h" +#include "Helpers.h" + +TEST(WaypointTest, SerdeTest) +{ + //"DJ", "CL"; + ASSERT_EQ(WaypointToString(113), "DJ"); + ASSERT_EQ(StringToWaypoint("DJ"), 113); + + ASSERT_EQ(WaypointToString(0), "A"); + ASSERT_EQ(StringToWaypoint("A"), 0); + +} \ No newline at end of file