write battle/challenge records structures
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user