/Engine/Tables/PlayerFrameTable.cpp

https://github.com/gp-alex/world-of-might-and-magic · C++ · 208 lines · 77 code · 16 blank · 115 comment · 11 complexity · 192b17eb871fa1a6aad992ed572e565e MD5 · raw file

  1. #include "Engine/Tables/PlayerFrameTable.h"
  2. #include "Engine/Engine.h"
  3. #include "Platform/Api.h"
  4. #include "FrameTableInc.h"
  5. //----- (00494AED) --------------------------------------------------------
  6. unsigned int PlayerFrameTable::GetFrameIdByExpression(
  7. CHARACTER_EXPRESSION_ID expression) {
  8. for (uint i = 0; i < this->uNumFrames; i++) {
  9. if (this->pFrames[i].expression == expression) return i;
  10. }
  11. return 0;
  12. }
  13. //----- (00494B10) --------------------------------------------------------
  14. PlayerFrame *PlayerFrameTable::GetFrameBy_x(unsigned int uFramesetID,
  15. unsigned int uFrameID) {
  16. unsigned int v3; // esi@1
  17. __int16 v6; // dx@2
  18. int v7; // edx@3
  19. char *i; // eax@3
  20. int v9; // ecx@5
  21. PlayerFrame *result; // eax@6
  22. v3 = uFramesetID;
  23. if (this->pFrames[uFramesetID].uFlags & 1 &&
  24. (v6 = this->pFrames[uFramesetID].uAnimLength) != 0) {
  25. v7 = ((signed int)uFrameID >> 3) % (unsigned __int16)v6;
  26. for (i = (char *)&this->pFrames[uFramesetID].uAnimTime;; i += 10) {
  27. v9 = *(short *)i;
  28. if (v7 <= v9) break;
  29. v7 -= v9;
  30. ++v3;
  31. }
  32. result = &this->pFrames[v3];
  33. } else {
  34. result = &this->pFrames[uFramesetID];
  35. }
  36. return result;
  37. }
  38. //----- (00494B5E) --------------------------------------------------------
  39. PlayerFrame *PlayerFrameTable::GetFrameBy_y(int *pFramesetID, int *pAnimTime,
  40. int a4) {
  41. int v5; // esi@1
  42. int v6; // eax@2
  43. v5 = a4 + *pAnimTime;
  44. if (v5 < 8 * this->pFrames[*pFramesetID].uAnimTime) {
  45. *pAnimTime = v5;
  46. } else {
  47. v6 = rand() % 4 + 21;
  48. *pFramesetID = v6;
  49. *pAnimTime = 8 * v5 % this->pFrames[v6].uAnimTime;
  50. }
  51. return &this->pFrames[*pFramesetID];
  52. }
  53. //----- (00494BC3) --------------------------------------------------------
  54. void PlayerFrameTable::ToFile() {
  55. PlayerFrameTable *v1; // esi@1
  56. FILE *v2; // eax@1
  57. FILE *v3; // edi@1
  58. PlayerFrameTable *Str = this;
  59. v1 = Str;
  60. v2 = fcaseopen("data/dpft.bin", "wb");
  61. v3 = v2;
  62. if (!v2) Error("Unable to save dpft.bin");
  63. fwrite(v1, 4, 1, v2);
  64. fwrite(v1->pFrames, 0xAu, v1->uNumFrames, v3);
  65. fclose(v3);
  66. }
  67. //----- (00494C0F) --------------------------------------------------------
  68. void PlayerFrameTable::FromFile(void *data_mm6, void *data_mm7,
  69. void *data_mm8) {
  70. uint num_mm6_frames = data_mm6 ? *(int *)data_mm6 : 0,
  71. num_mm7_frames = data_mm7 ? *(int *)data_mm7 : 0,
  72. num_mm8_frames = data_mm8 ? *(int *)data_mm8 : 0;
  73. uNumFrames = num_mm6_frames + num_mm7_frames + num_mm8_frames;
  74. assert(uNumFrames);
  75. assert(!num_mm8_frames);
  76. pFrames = (PlayerFrame *)malloc(uNumFrames * sizeof(PlayerFrame));
  77. memcpy(pFrames, (char *)data_mm7 + 4, num_mm7_frames * sizeof(PlayerFrame));
  78. memcpy(pFrames + num_mm7_frames, (char *)data_mm6 + 4,
  79. num_mm6_frames * sizeof(PlayerFrame));
  80. memcpy(pFrames + num_mm6_frames + num_mm7_frames, (char *)data_mm8 + 4,
  81. num_mm8_frames * sizeof(PlayerFrame));
  82. }
  83. //----- (00494C5A) --------------------------------------------------------
  84. // int PlayerFrameTable::FromFileTxt(const char *Args) {
  85. // // PlayerFrameTable *v2; // ebx@1
  86. // FILE *v3; // eax@1
  87. // int v4; // esi@3
  88. // void *v5; // eax@10
  89. // FILE *v6; // ST0C_4@12
  90. // char *i; // eax@12
  91. // // __int16 v8; // ax@15
  92. // // const char *v9; // ST10_4@15
  93. // // unsigned __int16 v10; // ax@15
  94. // // const char *v11; // ST0C_4@15
  95. // int j; // esi@15
  96. // // int v13; // eax@17
  97. // int v14; // edx@22
  98. // int v15; // ecx@23
  99. // int v16; // eax@24
  100. // signed int k; // eax@27
  101. // // PlayerFrame *v18; // edx@28
  102. // int v19; // esi@28
  103. // int l; // ecx@29
  104. // char Buf; // [sp+Ch] [bp-2F8h]@3
  105. // FrameTableTxtLine v23; // [sp+200h] [bp-104h]@4
  106. // FrameTableTxtLine v24; // [sp+27Ch] [bp-88h]@4
  107. // int v25; // [sp+2F8h] [bp-Ch]@3
  108. // int v26; // [sp+2FCh] [bp-8h]@3
  109. // FILE *File; // [sp+300h] [bp-4h]@1
  110. // int Argsa; // [sp+30Ch] [bp+8h]@28
  111. //
  112. // __debugbreak(); // Ritor1;
  113. // // TileTable::dtor((TileTable *)this);
  114. // v3 = fcaseopen(Args, "r");
  115. // File = v3;
  116. // if (!v3) Error("PlayerFrameTable::load - Unable to open file: %s.", Args);
  117. // v4 = 0;
  118. // v25 = 0;
  119. // v26 = 1;
  120. // if (fgets(&Buf, 490, v3)) {
  121. // do {
  122. // *strchr(&Buf, 10) = 0;
  123. // memcpy(&v24, txt_file_frametable_parser(&Buf, &v23), sizeof(v24));
  124. // if (v24.uPropCount && *v24.pProperties[0] != 47) {
  125. // if (v24.uPropCount < 3)
  126. // Error(
  127. // "PlayerFrameTable::load, too few arguments, %s line "
  128. // "%i.",
  129. // Args, v26);
  130. // ++v25;
  131. // }
  132. // ++v26;
  133. // } while (fgets(&Buf, 490, File));
  134. // v4 = v25;
  135. // }
  136. // this->uNumFrames = v4;
  137. // v5 = malloc(sizeof(PlayerFrame) * v4);
  138. // this->pFrames = (PlayerFrame *)v5;
  139. // if (!v5) Error("PlayerFrameTable::load - Out of Memory!");
  140. // v6 = File;
  141. // this->uNumFrames = 0;
  142. // fseek(v6, 0, 0);
  143. // for (i = fgets(&Buf, 490, File); i; i = fgets(&Buf, 490, File)) {
  144. // *strchr(&Buf, 10) = 0;
  145. // memcpy(&v24, txt_file_frametable_parser(&Buf, &v23), sizeof(v24));
  146. // if (v24.uPropCount && *v24.pProperties[0] != 47) {
  147. // // v8 = atoi(v24.pProperties[0]);
  148. // // v9 = v24.pProperties[1];
  149. // this->pFrames[this->uNumFrames].expression =
  150. // (CHARACTER_EXPRESSION_ID)atoi(v24.pProperties[0]);
  151. // // v10 = atoi(v9);
  152. // // v11 = v24.pProperties[2];
  153. // this->pFrames[this->uNumFrames].uTextureID =
  154. // atoi(v24.pProperties[1]);
  155. // this->pFrames[this->uNumFrames].uAnimTime =
  156. // atoi(v24.pProperties[2]);
  157. // this->pFrames[this->uNumFrames].uAnimLength = 0;
  158. // this->pFrames[this->uNumFrames].uFlags = 0;
  159. // for (j = 3; j < v24.uPropCount; ++j) {
  160. // if (!_stricmp(v24.pProperties[j], "New"))
  161. // this->pFrames[this->uNumFrames].uFlags |= 4;
  162. // }
  163. // ++this->uNumFrames;
  164. // }
  165. // }
  166. // fclose(File);
  167. //
  168. // if ((signed int)(this->uNumFrames - 1) > 0) {
  169. // v15 = 0;
  170. // for (v14 = 0; v14 < this->uNumFrames - 1; ++v14) {
  171. // v16 = (int)&this->pFrames[v15];
  172. // if (!(*(char *)(v16 + 18) & 4)) this->pFrames[v14].uFlags |= 1;
  173. // ++v15;
  174. // }
  175. // }
  176. // for (k = 0; k < (signed int)this->uNumFrames; *(short *)(Argsa + 6) = v19) {
  177. // // v18 = this->pFrames;
  178. // Argsa = (int)&this->pFrames[k];
  179. // v19 = *(short *)(Argsa + 4);
  180. // if (this->pFrames[k].uFlags & 1) {
  181. // ++k;
  182. // for (l = (int)&this->pFrames[k]; this->pFrames[k].uFlags & 1;
  183. // l += 10) {
  184. // v19 += *(short *)(l + 4);
  185. // ++k;
  186. // }
  187. // HEXRAYS_LOWORD(v19) = this->pFrames[k].uAnimTime + v19;
  188. // }
  189. // ++k;
  190. // }
  191. // return 1;
  192. // }