ScoreSaver.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #pragma once
  2. #include "EmulatorComponent.h"
  3. #include "../Constants.h"
  4. #include <windows.h>
  5. #include <vector>
  6. #include <thread>
  7. namespace TLAC::Components
  8. {
  9. class ScoreSaver : public EmulatorComponent
  10. {
  11. public:
  12. ScoreSaver();
  13. ~ScoreSaver();
  14. virtual const char* GetDisplayName() override;
  15. virtual void Initialize(ComponentsManager*) override;
  16. virtual void Update() override;
  17. virtual void UpdateInput() override;
  18. struct DivaScore
  19. {
  20. int pvNum;
  21. int exDifficulty;
  22. int per_module_equip[6];
  23. int other_module_shit[30]; // ??? -- seems to be 6*6 ints (0x90 bytes) for modules + 5 ints (0x14 bytes) for skin and button se
  24. int per_skin_equip;
  25. int per_btn_se_equip;
  26. int per_slide_se_equip;
  27. int per_chainslide_se_equip;
  28. int per_slidertouch_se_equip;
  29. int clearRank; // +0xac: clear rank
  30. int score; // +0xb0: score
  31. int percent; // +0xb4: best percent
  32. byte paddingB8[0x14]; // ??? -- challenge_kind, chain_challenge_flag, chain_challenge_num, chain_challenge_max, challenge_ng_flag
  33. int rival_clearRank; // +0xcc: rival clear rank?
  34. int rival_score; // +0xd0: rival score
  35. int rival_percent; // +0xd4: rival percent
  36. byte paddingD8[0x9]; // ??? -- interim_ranking int?
  37. byte optionA; // +0xe1: gamemode options
  38. byte optionB;
  39. byte optionC;
  40. inline bool operator==(const DivaScore& cmp)
  41. {
  42. return cmp.pvNum == pvNum && cmp.exDifficulty == exDifficulty;
  43. }
  44. DivaScore(int pv, int exDiff)
  45. {
  46. // this is just copied from 140113510
  47. // no clue what most of it is
  48. pvNum = pv;
  49. exDifficulty = exDiff;
  50. *(int*)((uint64_t)this + 0x08) = 0;
  51. *(int*)((uint64_t)this + 0x0c) = 0;
  52. *(int*)((uint64_t)this + 0x10) = 0;
  53. *(int*)((uint64_t)this + 0x14) = 0;
  54. *(int*)((uint64_t)this + 0x18) = 0;
  55. *(int*)((uint64_t)this + 0x1c) = 0;
  56. *(long long*)((uint64_t)this + 0x20) = -1;
  57. *(long long*)((uint64_t)this + 0x28) = -1;
  58. *(long long*)((uint64_t)this + 0x30) = -1;
  59. *(long long*)((uint64_t)this + 0x38) = -1;
  60. *(long long*)((uint64_t)this + 0x40) = -1;
  61. *(long long*)((uint64_t)this + 0x48) = -1;
  62. *(long long*)((uint64_t)this + 0x50) = -1;
  63. *(long long*)((uint64_t)this + 0x58) = -1;
  64. *(long long*)((uint64_t)this + 0x60) = -1;
  65. *(long long*)((uint64_t)this + 0x68) = -1;
  66. *(long long*)((uint64_t)this + 0x70) = -1;
  67. *(long long*)((uint64_t)this + 0x78) = -1;
  68. *(int*)((uint64_t)this + 0x80) = 0x01010101;
  69. *(int*)((uint64_t)this + 0x84) = 0x01010101;
  70. *(int*)((uint64_t)this + 0x88) = 0x01010101;
  71. *(int*)((uint64_t)this + 0x8c) = 0x01010101;
  72. *(int*)((uint64_t)this + 0x90) = 0x01010101;
  73. *(int*)((uint64_t)this + 0x94) = 0x01010101;
  74. *(int*)((uint64_t)this + 0x98) = 0;
  75. *(long long*)((uint64_t)this + 0x9c) = -1;
  76. *(long long*)((uint64_t)this + 0xa4) = -1;
  77. *(int*)((uint64_t)this + 0xac) = -1;
  78. *(long long*)((uint64_t)this + 0xb0) = 0;
  79. *(int*)((uint64_t)this + 0xb8) = -1;
  80. *(byte*)((uint64_t)this + 0xbc) = 0;
  81. *(long long*)((uint64_t)this + 0xc0) = -1;
  82. *(byte*)((uint64_t)this + 0xc8) = 0;
  83. *(int*)((uint64_t)this + 0xcc) = -1;
  84. *(long long*)((uint64_t)this + 0xd0) = 0;
  85. *(int*)((uint64_t)this + 0xd8) = -1;
  86. *(byte*)((uint64_t)this + 0xdc) = 0;
  87. *(byte*)((uint64_t)this + 0xdd) = 0;
  88. *(byte*)((uint64_t)this + 0xde) = 0;
  89. *(byte*)((uint64_t)this + 0xdf) = 0;
  90. *(byte*)((uint64_t)this + 0xe0) = 0;
  91. *(byte*)((uint64_t)this + 0xe1) = 0;
  92. *(byte*)((uint64_t)this + 0xe2) = 0;
  93. *(byte*)((uint64_t)this + 0xe3) = 0;
  94. }
  95. DivaScore()
  96. {
  97. DivaScore(0, 0);
  98. }
  99. };
  100. static std::vector<ScoreSaver::DivaScore> ScoreCache[4]; // * 4 difficulties
  101. static void UpdateScoreCache();
  102. static void UpdateSingleScoreCacheEntry(int pvNum, int diff, int exDiff, bool doDefaultsReset);
  103. static void UpdateSingleScoreCacheRivalEntry(int pvNum, int diff, int exDiff);
  104. static void UpdateSingleScoreCacheModulesEntry(int pvNum, int diff, int exDiff);
  105. static void UpdateSingleScoreCacheSkinsEntry(int pvNum, int diff, int exDiff);
  106. static void UpdateSingleScoreCacheSFXEntry(int pvNum, int diff, int exDiff);
  107. static void FixScoreCacheAddresses(int diff); // only call this from the main thread
  108. static DivaScore* GetCachedScore(int pvNum, int diff, int exDiff);
  109. static void UpdateClearCounts();
  110. static void ModuleCheck(int pvNum, int diff, int exDiff);
  111. private:
  112. static bool(__stdcall* divaInitResults)(void* cls);
  113. static bool hookedInitResults(void* cls);
  114. static void InjectCode(void* address, const std::vector<uint8_t> data);
  115. static void initCache();
  116. static bool checkExistingScoreValid(int pv, int difficulty, int isEx);
  117. static int calculateCheck(int score, int cntCools, int cntFines, int percent, int combo, int clearRank, int allTimeRank, int allTimeModifiers, int allTimePercent);
  118. static WCHAR configPath[256];
  119. static WCHAR rival_configPath[256];
  120. static WCHAR modules_configPath[256];
  121. static WCHAR skins_configPath[256];
  122. static WCHAR sfx_configPath[256];
  123. static std::thread initThread;
  124. int currentPv;
  125. int currentDifficulty;
  126. int currentDifficultyIsEx;
  127. byte currentInsurance;
  128. static bool initCacheFinished;
  129. static bool didInitialAddressUpdate;
  130. };
  131. }