mirror of
https://github.com/electronicarts/CNC_TS_and_RA2_Mission_Editor.git
synced 2025-07-04 05:37:02 -04:00
refactored serde between waypoint number and 26 radix string . (#122)
This commit is contained in:
parent
cace9efd2a
commit
f0f2439be0
6 changed files with 74 additions and 70 deletions
|
@ -1,6 +1,7 @@
|
|||
#pragma once
|
||||
#include <afx.h>
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
|
||||
// coordinate functions
|
||||
inline void PosToXY(const char* pos, int* X, int* Y)
|
||||
|
@ -89,4 +90,48 @@ inline std::array<unsigned char, 3> HSVToRGB(const unsigned char hsv[3])
|
|||
std::array<unsigned char, 3> 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;
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -104,7 +104,7 @@
|
|||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>RA2_MODE;NOMINMAX;_CONSOLE;_AFXDLL;%(PreprocessorDefinitions);_DEBUG</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)googletest\x64\include;$(SolutionDir)MissionEditorPackLib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)googletest\x64\include;$(SolutionDir)MissionEditorPackLib;$(SolutionDir)MissionEditor;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PrecompiledHeader>Create</PrecompiledHeader>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<LanguageStandard>stdcpp20</LanguageStandard>
|
||||
|
@ -124,7 +124,7 @@
|
|||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>RA2_MODE;NOMINMAX;_CONSOLE;_AFXDLL;%(PreprocessorDefinitions);NDEBUG</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)googletest\x64\include;$(SolutionDir)MissionEditorPackLib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)googletest\x64\include;$(SolutionDir)MissionEditorPackLib;$(SolutionDir)MissionEditor;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<LanguageStandard>stdcpp20</LanguageStandard>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
|
@ -143,6 +143,7 @@
|
|||
<ClCompile Include="CIni_Test.cpp" />
|
||||
<ClCompile Include="Serde_Test.cpp" />
|
||||
<ClCompile Include="UnitTest.cpp" />
|
||||
<ClCompile Include="Waypoint_Test.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\MissionEditor\IniFile.h" />
|
||||
|
|
|
@ -33,6 +33,9 @@
|
|||
<ClCompile Include="Serde_Test.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Waypoint_Test.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="StdAfx.h">
|
||||
|
|
13
UnitTest/Waypoint_Test.cpp
Normal file
13
UnitTest/Waypoint_Test.cpp
Normal file
|
@ -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);
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue