|  |  | @ -4,32 +4,33 @@ | 
		
	
		
			
			|  |  |  | #include <string> | 
		
	
		
			
			|  |  |  | #include <cstring> | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | static const std::string base64_chars = | 
		
	
		
			
			|  |  |  | "abcdefghijklmnopqrstuvwxyz" | 
		
	
		
			
			|  |  |  | "ABCDEFGHIJKLMNOPQRSTUVWXYZ" | 
		
	
		
			
			|  |  |  | "0123456789+/"; | 
		
	
		
			
			|  |  |  | static const std::string base64_chars = | 
		
	
		
			
			|  |  |  | "s1XWgtaLvfyEeYUi42Mo36NR9DKrVjbTpPuwHc5lA8dC0OSxzknm7qGJBIZFQh+/"; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | static inline bool is_base64(unsigned char c) { | 
		
	
		
			
			|  |  |  | static inline bool is_base64(unsigned char c) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | return (isalnum(c) || (c == '+') || (c == '/')); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) { | 
		
	
		
			
			|  |  |  | std::string base64_encode(unsigned char const *bytes_to_encode, unsigned int in_len) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | std::string ret; | 
		
	
		
			
			|  |  |  | int i = 0; | 
		
	
		
			
			|  |  |  | int j = 0; | 
		
	
		
			
			|  |  |  | unsigned char char_array_3[3]; | 
		
	
		
			
			|  |  |  | unsigned char char_array_4[4]; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | while (in_len--) { | 
		
	
		
			
			|  |  |  | while (in_len--) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | char_array_3[i++] = *(bytes_to_encode++); | 
		
	
		
			
			|  |  |  | if (i == 3) { | 
		
	
		
			
			|  |  |  | if (i == 3) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; | 
		
	
		
			
			|  |  |  | char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); | 
		
	
		
			
			|  |  |  | char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); | 
		
	
		
			
			|  |  |  | char_array_4[3] = char_array_3[2] & 0x3f; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | for(i = 0; (i <4) ; i++) | 
		
	
		
			
			|  |  |  | for (i = 0; (i < 4); i++) | 
		
	
		
			
			|  |  |  | ret += base64_chars[char_array_4[i]]; | 
		
	
		
			
			|  |  |  | i = 0; | 
		
	
		
			
			|  |  |  | } | 
		
	
	
		
			
				|  |  | @ -37,26 +38,25 @@ std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_ | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | if (i) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | for(j = i; j < 3; j++) | 
		
	
		
			
			|  |  |  | for (j = i; j < 3; j++) | 
		
	
		
			
			|  |  |  | char_array_3[j] = '\0'; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | char_array_4[0] = ( char_array_3[0] & 0xfc) >> 2; | 
		
	
		
			
			|  |  |  | char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; | 
		
	
		
			
			|  |  |  | char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); | 
		
	
		
			
			|  |  |  | char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | for (j = 0; (j < i + 1); j++) | 
		
	
		
			
			|  |  |  | ret += base64_chars[char_array_4[j]]; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | while((i++ < 3)) | 
		
	
		
			
			|  |  |  | while ((i++ < 3)) | 
		
	
		
			
			|  |  |  | ret += '='; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | return ret; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | std::string base64_decode(std::string const& encoded_string) { | 
		
	
		
			
			|  |  |  | std::string base64_decode(std::string const &encoded_string) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int in_len = encoded_string.size(); | 
		
	
		
			
			|  |  |  | int i = 0; | 
		
	
		
			
			|  |  |  | int j = 0; | 
		
	
	
		
			
				|  |  | @ -64,15 +64,18 @@ std::string base64_decode(std::string const& encoded_string) { | 
		
	
		
			
			|  |  |  | unsigned char char_array_4[4], char_array_3[3]; | 
		
	
		
			
			|  |  |  | std::string ret; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) { | 
		
	
		
			
			|  |  |  | char_array_4[i++] = encoded_string[in_]; in_++; | 
		
	
		
			
			|  |  |  | if (i ==4) { | 
		
	
		
			
			|  |  |  | for (i = 0; i <4; i++) | 
		
	
		
			
			|  |  |  | while (in_len-- && (encoded_string[in_] != '=') && is_base64(encoded_string[in_])) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | char_array_4[i++] = encoded_string[in_]; | 
		
	
		
			
			|  |  |  | in_++; | 
		
	
		
			
			|  |  |  | if (i == 4) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | for (i = 0; i < 4; i++) | 
		
	
		
			
			|  |  |  | char_array_4[i] = base64_chars.find(char_array_4[i]); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | char_array_3[0] = ( char_array_4[0] << 2       ) + ((char_array_4[1] & 0x30) >> 4); | 
		
	
		
			
			|  |  |  | char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); | 
		
	
		
			
			|  |  |  | char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); | 
		
	
		
			
			|  |  |  | char_array_3[2] = ((char_array_4[2] & 0x3) << 6) +   char_array_4[3]; | 
		
	
		
			
			|  |  |  | char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | for (i = 0; (i < 3); i++) | 
		
	
		
			
			|  |  |  | ret += char_array_3[i]; | 
		
	
	
		
			
				|  |  | @ -80,14 +83,16 @@ std::string base64_decode(std::string const& encoded_string) { | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | if (i) { | 
		
	
		
			
			|  |  |  | if (i) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | for (j = 0; j < i; j++) | 
		
	
		
			
			|  |  |  | char_array_4[j] = base64_chars.find(char_array_4[j]); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); | 
		
	
		
			
			|  |  |  | char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | for (j = 0; (j < i - 1); j++) ret += char_array_3[j]; | 
		
	
		
			
			|  |  |  | for (j = 0; (j < i - 1); j++) | 
		
	
		
			
			|  |  |  | ret += char_array_3[j]; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | return ret; | 
		
	
	
		
			
				|  |  | @ -95,47 +100,47 @@ std::string base64_decode(std::string const& encoded_string) { | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | Player *Memory::loadFromCode(std::string code) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | code = base64_decode(code); | 
		
	
		
			
			|  |  |  | char playerName[16] = {0}; | 
		
	
		
			
			|  |  |  | int playerHP = 0; | 
		
	
		
			
			|  |  |  | int playerAtk = 0; | 
		
	
		
			
			|  |  |  | int playerDef = 0; | 
		
	
		
			
			|  |  |  | int playerLevel = 0; | 
		
	
		
			
			|  |  |  | int playerExp = 0; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | int result = sscanf(code.c_str(), | 
		
	
		
			
			|  |  |  | "PlayerLevel=%d;PlayerExp=%d;PlayerHP=%d;PlayerAtk=%d;PlayerDef=%d;PlayerName=%15s", | 
		
	
		
			
			|  |  |  | &playerLevel, | 
		
	
		
			
			|  |  |  | &playerExp, | 
		
	
		
			
			|  |  |  | &playerHP, | 
		
	
		
			
			|  |  |  | &playerAtk, | 
		
	
		
			
			|  |  |  | &playerDef, | 
		
	
		
			
			|  |  |  | playerName); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | std::string playerTrueName = playerName; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | if (result == 6) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | return new Player(playerTrueName, playerHP, playerAtk, playerDef, playerLevel, playerExp); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | else | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | return nullptr; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | code = base64_decode(code); | 
		
	
		
			
			|  |  |  | char playerName[16] = {0}; | 
		
	
		
			
			|  |  |  | int playerHP = 0; | 
		
	
		
			
			|  |  |  | int playerAtk = 0; | 
		
	
		
			
			|  |  |  | int playerDef = 0; | 
		
	
		
			
			|  |  |  | int playerLevel = 0; | 
		
	
		
			
			|  |  |  | int playerExp = 0; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | int result = sscanf(code.c_str(), | 
		
	
		
			
			|  |  |  | "PlayerLevel=%d;PlayerExp=%d;PlayerHP=%d;PlayerAtk=%d;PlayerDef=%d;PlayerName=%15s", | 
		
	
		
			
			|  |  |  | &playerLevel, | 
		
	
		
			
			|  |  |  | &playerExp, | 
		
	
		
			
			|  |  |  | &playerHP, | 
		
	
		
			
			|  |  |  | &playerAtk, | 
		
	
		
			
			|  |  |  | &playerDef, | 
		
	
		
			
			|  |  |  | playerName); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | std::string playerTrueName = playerName; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | if (result == 6) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | return new Player(playerTrueName, playerHP, playerAtk, playerDef, playerLevel, playerExp); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | else | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | return nullptr; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | std::string Memory::saveToCode(Player *player) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | char code[256]; | 
		
	
		
			
			|  |  |  | snprintf(code, sizeof(code), | 
		
	
		
			
			|  |  |  | "PlayerLevel=%d;PlayerExp=%d;PlayerHP=%d;PlayerAtk=%d;PlayerDef=%d;PlayerName=%s", | 
		
	
		
			
			|  |  |  | player->getLevel(), | 
		
	
		
			
			|  |  |  | player->getExp(), | 
		
	
		
			
			|  |  |  | player->getMaxHP(), | 
		
	
		
			
			|  |  |  | player->getAtk(), | 
		
	
		
			
			|  |  |  | player->getDef(), | 
		
	
		
			
			|  |  |  | player->getName().c_str()); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | return base64_encode(reinterpret_cast<unsigned char *>(code), | 
		
	
		
			
			|  |  |  | strlen(code)); | 
		
	
		
			
			|  |  |  | char code[256]; | 
		
	
		
			
			|  |  |  | snprintf(code, sizeof(code), | 
		
	
		
			
			|  |  |  | "PlayerLevel=%d;PlayerExp=%d;PlayerHP=%d;PlayerAtk=%d;PlayerDef=%d;PlayerName=%s", | 
		
	
		
			
			|  |  |  | player->getLevel(), | 
		
	
		
			
			|  |  |  | player->getExp(), | 
		
	
		
			
			|  |  |  | player->getMaxHP(), | 
		
	
		
			
			|  |  |  | player->getAtk(), | 
		
	
		
			
			|  |  |  | player->getDef(), | 
		
	
		
			
			|  |  |  | player->getName().c_str()); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | return base64_encode(reinterpret_cast<unsigned char *>(code), | 
		
	
		
			
			|  |  |  | strlen(code)); | 
		
	
		
			
			|  |  |  | } |