forked from nydrani/maplereverence
-
Notifications
You must be signed in to change notification settings - Fork 0
/
wztool.cpp
56 lines (43 loc) · 1.7 KB
/
wztool.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <string>
#include "constants.hpp"
#include "wztool.hpp"
namespace maplereverence {
std::string xorStringAscii(const std::string& enc) {
std::string clone = enc;
int length = enc.length();
for (int i = 0; i < length; ++i) {
int keyPos = i % maplereverence::encryptionKeyAsciiLength;
clone.at(i) ^= maplereverence::encryptionKeyAscii[keyPos];
}
return clone;
}
std::u16string xorStringUnicode(const std::u16string& enc) {
std::u16string clone = enc;
int length = enc.length();
for (int i = 0; i < length; ++i) {
int keyPos = i % maplereverence::encryptionKeyUnicodeLength;
// create 2 bit mask
uint16_t mask = maplereverence::encryptionKeyAscii[keyPos * 2];
mask += maplereverence::encryptionKeyAscii[(keyPos * 2) + 1] << 8;
clone.at(i) ^= mask;
}
return clone;
}
std::string detectString(uint8_t newFlag, uint8_t linkFlag, MapleAccessor& accessor) {
uint8_t stringParseMethod = accessor.readUnsignedByte();
std::string string;
if (stringParseMethod == newFlag) {
string = accessor.readEncryptedString();
} else if (stringParseMethod == linkFlag) {
int32_t offset = accessor.readInt();
string = accessor.readEncryptedString(offset);
} else {
std::string exception("Invalid string parse method: ");
exception += std::to_string(stringParseMethod);
exception += " at offset: ";
exception += std::to_string(accessor.tell());
throw std::runtime_error(exception);
}
return string;
}
}