You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

140 lines
3.8 KiB

  1. #include "memory.hpp"
  2. #include <iostream>
  3. #include <string>
  4. #include <cstring>
  5. static const std::string base64_chars =
  6. "abcdefghijklmnopqrstuvwxyz"
  7. "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  8. "0123456789+/";
  9. static inline bool is_base64(unsigned char c) {
  10. return (isalnum(c) || (c == '+') || (c == '/'));
  11. }
  12. std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
  13. std::string ret;
  14. int i = 0;
  15. int j = 0;
  16. unsigned char char_array_3[3];
  17. unsigned char char_array_4[4];
  18. while (in_len--) {
  19. char_array_3[i++] = *(bytes_to_encode++);
  20. if (i == 3) {
  21. char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
  22. char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
  23. char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
  24. char_array_4[3] = char_array_3[2] & 0x3f;
  25. for(i = 0; (i <4) ; i++)
  26. ret += base64_chars[char_array_4[i]];
  27. i = 0;
  28. }
  29. }
  30. if (i)
  31. {
  32. for(j = i; j < 3; j++)
  33. char_array_3[j] = '\0';
  34. char_array_4[0] = ( char_array_3[0] & 0xfc) >> 2;
  35. char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
  36. char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
  37. for (j = 0; (j < i + 1); j++)
  38. ret += base64_chars[char_array_4[j]];
  39. while((i++ < 3))
  40. ret += '=';
  41. }
  42. return ret;
  43. }
  44. std::string base64_decode(std::string const& encoded_string) {
  45. int in_len = encoded_string.size();
  46. int i = 0;
  47. int j = 0;
  48. int in_ = 0;
  49. unsigned char char_array_4[4], char_array_3[3];
  50. std::string ret;
  51. while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
  52. char_array_4[i++] = encoded_string[in_]; in_++;
  53. if (i ==4) {
  54. for (i = 0; i <4; i++)
  55. char_array_4[i] = base64_chars.find(char_array_4[i]);
  56. char_array_3[0] = ( char_array_4[0] << 2 ) + ((char_array_4[1] & 0x30) >> 4);
  57. char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
  58. char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
  59. for (i = 0; (i < 3); i++)
  60. ret += char_array_3[i];
  61. i = 0;
  62. }
  63. }
  64. if (i) {
  65. for (j = 0; j < i; j++)
  66. char_array_4[j] = base64_chars.find(char_array_4[j]);
  67. char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
  68. char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
  69. for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
  70. }
  71. return ret;
  72. }
  73. Player *Memory::loadFromCode(std::string code)
  74. {
  75. code = base64_decode(code);
  76. char playerName[16] = {0};
  77. int playerHP = 0;
  78. int playerAtk = 0;
  79. int playerDef = 0;
  80. int playerLevel = 0;
  81. int playerExp = 0;
  82. int result = sscanf(code.c_str(),
  83. "PlayerLevel=%d;PlayerExp=%d;PlayerHP=%d;PlayerAtk=%d;PlayerDef=%d;PlayerName=%15s",
  84. &playerLevel,
  85. &playerExp,
  86. &playerHP,
  87. &playerAtk,
  88. &playerDef,
  89. playerName);
  90. std::string playerTrueName = playerName;
  91. if (result == 6)
  92. {
  93. return new Player(playerTrueName, playerHP, playerAtk, playerDef, playerLevel, playerExp);
  94. }
  95. else
  96. {
  97. return nullptr;
  98. }
  99. }
  100. std::string Memory::saveToCode(Player *player)
  101. {
  102. char code[256];
  103. snprintf(code, sizeof(code),
  104. "PlayerLevel=%d;PlayerExp=%d;PlayerHP=%d;PlayerAtk=%d;PlayerDef=%d;PlayerName=%s",
  105. player->getLevel(),
  106. player->getExp(),
  107. player->getMaxHP(),
  108. player->getAtk(),
  109. player->getDef(),
  110. player->getName().c_str());
  111. return base64_encode(reinterpret_cast<unsigned char *>(code),
  112. strlen(code));
  113. }