write battle/challenge records structures

This commit is contained in:
Martin Michelsen
2023-07-09 10:42:03 -07:00
parent 4284d163d8
commit 7dd00c75a9
12 changed files with 437 additions and 253 deletions
+41
View File
@@ -885,3 +885,44 @@ void decrypt_trivial_gci_data(void* data, size_t size, uint8_t basis) {
bytes[z] ^= key;
}
}
template <typename StringT, bool IsEncrypt>
StringT crypt_challenge_rank_text(const void* src, size_t size) {
if (size == 0) {
return StringT();
}
StringT ret;
StringReader r(src, size);
typename StringT::value_type prev = 0;
while (!r.eof()) {
typename StringT::value_type ch = r.get<typename StringT::value_type>();
if (ch == 0) {
break;
}
if (ret.empty()) {
ret.push_back(ch ^ 0x7F);
} else {
ret.push_back(IsEncrypt ? ((ch - prev) ^ 0x7F) : ((ch ^ 0x7F) + ret.back()));
}
prev = ch;
}
return ret;
}
string encrypt_challenge_rank_text(const uint8_t* src, size_t size) {
return crypt_challenge_rank_text<string, true>(src, size);
}
string decrypt_challenge_rank_text(const uint8_t* src, size_t size) {
return crypt_challenge_rank_text<string, false>(src, size);
}
u16string encrypt_challenge_rank_text(const char16_t* src, size_t size) {
return crypt_challenge_rank_text<u16string, true>(src, size);
}
u16string decrypt_challenge_rank_text(const char16_t* src, size_t size) {
return crypt_challenge_rank_text<u16string, false>(src, size);
}