#ifndef RAGNAROK_SOURCE_UTILITY_CIPHER_OBFUSCATE_H #define RAGNAROK_SOURCE_UTILITY_CIPHER_OBFUSCATE_H #include #include #include namespace utility { template class Obfuscator { public: // INLINED consteval explicit Obfuscator(const char (&text)[Length]) : m_data{} { for (std::size_t index = 0; index < Length; ++index) { this->m_data[index] = static_cast(text[index] ^ static_cast(Key >> ((index % 8) * 8))); } } // INLINED template consteval std::array Array() const { std::array out{}; for (std::size_t index = 0; index < Length; ++index) { out[index] = static_cast(this->m_data[index]); } return out; } char m_data[Length]; }; } #define OBFUSCATE_NAME_(text, key, variable) \ constexpr ::utility::Obfuscator obfuscator(text); \ thread_local EncryptedName variable(obfuscator.m_data) #define OBFUSCATE_NAME_SOURCE_(text, key, variable) \ constexpr ::utility::Obfuscator obfuscator(text); \ constexpr EncryptedSource source(obfuscator.m_data); \ thread_local EncryptedName variable(source) #define OBFUSCATE_NAME_ARRAY_(text, key, element, variable) \ constexpr std::array source = ::utility::Obfuscator(text).Array(); \ thread_local EncryptedName variable(source) #define OBFUSCATE_ARRAY(text, key, element) \ []() -> EncryptedName& { \ OBFUSCATE_NAME_ARRAY_(text, key, element, name); \ return name; \ }() #define OBFUSCATE_ARRAY_TEXT(text, key, element) \ []() { \ OBFUSCATE_NAME_ARRAY_(text, key, element, name); \ return name.Text(); \ }() #define OBFUSCATE_ARRAY_BODY(text, key, element) \ OBFUSCATE_NAME_ARRAY_(text, key, element, name); \ return name #define OBFUSCATE_STRING_BODY(text, key) \ OBFUSCATE_NAME_(text, key, name); \ return name #define OBFUSCATE_STRING(text, key) \ []() -> EncryptedName& { \ OBFUSCATE_NAME_(text, key, name); \ return name; \ }() #define OBFUSCATE_TEXT_NAMED(text, key, variable) \ []() { \ OBFUSCATE_NAME_(text, key, variable); \ return variable.Text(); \ }() #define OBFUSCATE_SOURCE_TEXT_NAMED(text, key, variable) \ []() { \ OBFUSCATE_NAME_SOURCE_(text, key, variable); \ return variable.Text(); \ }() #define OBFUSCATE_TEXT(text, key) OBFUSCATE_TEXT_NAMED(text, key, name) #define OBFUSCATE_SOURCE_TEXT(text, key) OBFUSCATE_SOURCE_TEXT_NAMED(text, key, name) #endif