World of Might and Magic  0.2.0
Open reimplementation of Might and Magic 6 7 8 game engine
Структура SpriteFrameTable

#include <Sprites.h>

+ Граф связей класса SpriteFrameTable:

Открытые члены

 SpriteFrameTable ()
 
void ToFile ()
 
void FromFile (void *data_mm6, void *data_mm7, void *data_mm8)
 
void ReleaseSFrames ()
 
void ResetSomeSpriteFlags ()
 
void InitializeSprite (signed int uSpriteID)
 
int FastFindSprite (const char *pSpriteName)
 
int BinarySearch (const char *pSpriteName)
 
SpriteFrameGetFrame (unsigned int uSpriteID, unsigned int uTime)
 
SpriteFrameGetFrameBy_x (unsigned int uSpriteID, signed int a3)
 

Открытые атрибуты

int uNumSpriteFrames
 
unsigned int uNumEFrames
 
int unused_field
 
SpriteFramepSpriteSFrames
 
SpriteFrame ** pSpritePFrames
 
int16_tpSpriteEFrames
 

Подробное описание

См. определение в файле Sprites.h строка 57

Конструктор(ы)

◆ SpriteFrameTable()

SpriteFrameTable::SpriteFrameTable ( )
inline

См. определение в файле Sprites.h строка 58

58  {
59  uNumSpriteFrames = 0;
60  pSpriteSFrames = nullptr;
61  pSpritePFrames = nullptr;
62  pSpriteEFrames = nullptr;
63  }

Перекрестные ссылки pSpriteEFrames, pSpritePFrames, pSpriteSFrames и uNumSpriteFrames.

Методы

◆ ToFile()

void SpriteFrameTable::ToFile ( )

См. определение в файле Sprites.cpp строка 337

337  {
338  FILE *file = fopen("data\\dsft.bin", "wb");
339  if (file == nullptr) {
340  Error("Unable to save dsft.bin!");
341  }
342  fwrite(&uNumSpriteFrames, 4, 1, file);
343  fwrite(&uNumEFrames, 4, 1, file);
344  fwrite(pSpriteSFrames, 0x3C, uNumSpriteFrames, file);
345  fwrite(pSpriteEFrames, 2, uNumEFrames, file);
346  fclose(file);
347 }

Перекрестные ссылки pSpriteEFrames, pSpriteSFrames, uNumEFrames и uNumSpriteFrames.

◆ FromFile()

void SpriteFrameTable::FromFile ( void data_mm6,
void data_mm7,
void data_mm8 
)

См. определение в файле Sprites.cpp строка 378

379  {
380  uint num_mm6_frames = 0;
381  uint num_mm6_eframes = 0;
382  if (data_mm6) {
383  num_mm6_frames = *(int *)data_mm6;
384  num_mm6_eframes = *((int *)data_mm6 + 1);
385  }
386 
387  uint num_mm7_frames = 0;
388  uint num_mm7_eframes = 0;
389  if (data_mm7) {
390  num_mm7_frames = *(int *)data_mm7;
391  num_mm7_eframes = *((int *)data_mm7 + 1);
392  }
393 
394  uint num_mm8_frames = 0;
395  uint num_mm8_eframes = 0;
396  if (data_mm8) {
397  num_mm8_frames = *(int *)data_mm8;
398  num_mm8_eframes = *((int *)data_mm8 + 1);
399  }
400 
401  this->uNumSpriteFrames =
402  num_mm7_frames /*+ num_mm6_frames + num_mm8_frames*/;
403 
404  this->pSpriteSFrames = new SpriteFrame[this->uNumSpriteFrames];
405  for (unsigned int i = 0; i < this->uNumSpriteFrames; ++i) {
406  auto res = this->pSpriteSFrames[i].Deserialize(
407  (SpriteFrame_MM7 *)((char *)data_mm7 + 8) + i);
408 
409  if (!res) {
410  logger->Warning(L"MM7 Sprite %u deserialization failed", i);
411  }
412  }
413 
414  this->uNumEFrames = num_mm7_eframes /*+ num_mm6_eframes + num_mm8_eframes*/;
415  this->pSpriteEFrames = (__int16 *)malloc(uNumSpriteFrames * sizeof(short));
416 
417  uint mm7_frames_size = num_mm7_frames * sizeof(SpriteFrame_MM7);
418  memcpy(pSpriteEFrames, (char *)data_mm7 + 8 + mm7_frames_size,
419  2 * num_mm7_eframes);
420 
421  pSpritePFrames = (SpriteFrame **)malloc(sizeof(void *) * uNumSpriteFrames);
422 
423  /*uint mm6_frames_size = num_mm6_frames * sizeof(SpriteFrame_mm6);
424  for (uint i = 0; i < num_mm6_frames; ++i)
425  {
426  memcpy(pSpriteSFrames + num_mm7_frames + i, (char *)data_mm6 + 8 + i *
427  sizeof(SpriteFrame_mm6), sizeof(SpriteFrame_mm6));
428  pSpriteSFrames[num_mm7_frames + i].uAnimLength = 0;
429  }
430  memcpy(pSpriteEFrames + num_mm7_frames, (char *)data_mm6 + 8 +
431  mm6_frames_size, 2 * num_mm6_eframes);*/
432 
433  /*uint mm8_frames_size = num_mm8_frames * sizeof(SpriteFrame);
434  memcpy(pSpriteSFrames + num_mm6_frames + num_mm7_frames, (char *)data_mm8 +
435  8, mm8_frames_size); memcpy(pSpriteEFrames + num_mm6_frames +
436  num_mm7_frames, (char *)data_mm8 + 8 + mm8_frames_size, 2 *
437  num_mm8_eframes);*/
438 
439  // the original was using num_mmx_frames, but never accessed any element
440  // beyond num_mmx_eframes, but boing beyong eframes caused invalid memory
441  // accesses
442  for (uint i = 0;
443  i < num_mm7_eframes /*+ num_mm6_eframes + num_mm8_eframes*/; ++i)
445 }

Перекрестные ссылки SpriteFrame::Deserialize(), logger, pSpriteEFrames, pSpritePFrames, pSpriteSFrames, uNumEFrames, uNumSpriteFrames и Log::Warning().

Используется в Engine::MM7_Initialize().

+ Граф вызовов:
+ Граф вызова функции:

◆ ReleaseSFrames()

void SpriteFrameTable::ReleaseSFrames ( )

См. определение в файле Sprites.cpp строка 25

25  {
26  free(this->pSpriteSFrames);
27  this->pSpriteSFrames = nullptr;
28  this->uNumSpriteFrames = 0;
29 }

Перекрестные ссылки pSpriteSFrames и uNumSpriteFrames.

◆ ResetSomeSpriteFlags()

void SpriteFrameTable::ResetSomeSpriteFlags ( )

См. определение в файле Sprites.cpp строка 32

32  {
33  int v1; // esi@1
34  signed int i; // edx@1
35  char *v3; // eax@2
36 
37  v1 = 0;
38  for (i = 0; i < (signed int)this->uNumSpriteFrames; ++i) {
39  v3 = (char *)&this->pSpriteSFrames[v1].uFlags;
40  ++v1;
41  *v3 &= 0x7Fu;
42  }
43 }

Перекрестные ссылки pSpriteSFrames и uNumSpriteFrames.

Используется в Application::Game::EventLoop(), OutdoorLocation::Initialize() и Engine::ResetCursor_Palettes_LODs_Level_Audio_SFT_Windows().

+ Граф вызова функции:

◆ InitializeSprite()

void SpriteFrameTable::InitializeSprite ( signed int  uSpriteID)

См. определение в файле Sprites.cpp строка 46

46  {
47  // SpriteFrameTable *v2; // esi@1
48  unsigned int v3; // ebx@3
49  // char *v4; // edx@3
50  // int v5; // eax@3
51  // SpriteFrame *v6; // ecx@5
52  // int v7; // eax@5
53  // __int16 v8; // ax@6
54  // signed int v9; // edx@6
55  // int v10; // ecx@6
56  // signed int v11; // edi@10
57  // __int16 v12; // ax@16
58  // int v13; // ecx@16
59  // size_t v14; // eax@19
60  // signed int v15; // edi@19
61  // __int16 v16; // ax@27
62  // int v17; // ecx@27
63  // signed int v18; // edi@29
64  // SpriteFrame *v19; // eax@30
65  // __int16 v20; // ax@45
66  // int v21; // ecx@45
67 
68  char Str[32]; // [sp+Ch] [bp-3Ch]@19
69  char sprite_name[20]; // [sp+2Ch] [bp-1Ch]@15
70  char Source[4]; // [sp+40h] [bp-8h]@19
71 
72  // v2 = this;
73  if (uSpriteID <= this->uNumSpriteFrames) {
74  if (uSpriteID >= 0) {
75  v3 = uSpriteID;
76 
77  int uFlags = pSpriteSFrames[v3].uFlags;
78  if (!(uFlags & 0x0080)) { // not loaded
79  pSpriteSFrames[v3].uFlags |= 0x80; // set loaded
80  while (1) {
83  pSpriteSFrames[v3].uPaletteID);
84  if (uFlags & 0x10) { // single frame per frame sequence
85  auto v8 = pSprites_LOD->LoadSprite(
86  pSpriteSFrames[v3].texture_name.c_str(),
88 
89  if (v8 == -1) { // should we set hw_sprites as nullptr in these cases??
90  // __debugbreak();
91  logger->Warning(L"Sprite %S not loaded!", pSpriteSFrames[v3].texture_name.c_str());
92  }
93 
94  for (uint i = 0; i < 8; ++i) {
95  // pSpriteSFrames[v3].pHwSpriteIDs[i] = v8;
98  }
99 
100  } else if (uFlags & 0x10000) {
101  for (uint i = 0; i < 8; ++i) {
102  switch (i) {
103  case 3:
104  case 4:
105  case 5:
106  sprintf(sprite_name, "%s4",
108  .texture_name.c_str());
109  break;
110  case 2:
111  case 6:
112  sprintf(sprite_name, "%s2",
114  .texture_name.c_str());
115  break;
116  case 0:
117  case 1:
118  case 7:
119  sprintf(sprite_name, "%s0",
121  .texture_name.c_str());
122  break;
123  }
124  auto v12 = pSprites_LOD->LoadSprite(
125  sprite_name, pSpriteSFrames[v3].uPaletteID);
126  // pSpriteSFrames[v3].pHwSpriteIDs[i]=v12;
127  if (v12 == -1) __debugbreak();
130  }
131 
132  } else if (uFlags & 0x40) { // part of monster fidgeting seq
133  strcpy(Source, "stA");
134  strcpy(Str, pSpriteSFrames[v3].texture_name.c_str());
135  auto v14 = strlen(Str);
136  strcpy(&Str[v14 - 3], Source);
137  for (uint i = 0; i < 8; ++i) {
138  switch (i) {
139  case 0:
140  sprintf(sprite_name, "%s0",
142  .texture_name.c_str());
143  break;
144  case 4:
145  sprintf(sprite_name, "%s4", Str);
146  break;
147  case 3:
148  case 5:
149  sprintf(sprite_name, "%s3", Str);
150  break;
151  case 2:
152  case 6:
153  sprintf(sprite_name, "%s2",
155  .texture_name.c_str());
156  break;
157  case 1:
158  case 7:
159  sprintf(sprite_name, "%s1",
161  .texture_name.c_str());
162  break;
163  }
164  auto v12 = pSprites_LOD->LoadSprite(
165  sprite_name, pSpriteSFrames[v3].uPaletteID);
166  // pSpriteSFrames[v3].pHwSpriteIDs[i]=v12;
167  if (v12 == -1) __debugbreak();
168 
171  }
172  } else {
173  for (uint i = 0; i < 8; ++i) {
174  if (((0x0100 << i) &
175  pSpriteSFrames[v3].uFlags)) { // mirrors
176  switch (i) {
177  case 1:
178  sprintf(sprite_name, "%s7",
180  .texture_name.c_str());
181  break;
182  case 2:
183  sprintf(sprite_name, "%s6",
185  .texture_name.c_str());
186  break;
187  case 3:
188  sprintf(sprite_name, "%s5",
190  .texture_name.c_str());
191  break;
192  case 4:
193  sprintf(sprite_name, "%s4",
195  .texture_name.c_str());
196  break;
197  case 5:
198  sprintf(sprite_name, "%s3",
200  .texture_name.c_str());
201  break;
202  case 6:
203  sprintf(sprite_name, "%s2",
205  .texture_name.c_str());
206  break;
207  case 7:
208  sprintf(sprite_name, "%s1",
210  .texture_name.c_str());
211  break;
212  }
213  } else {
214  // some names already passed through with codes attached
215  if (strlen(pSpriteSFrames[v3].texture_name.c_str()) < 7) {
216  sprintf(sprite_name, "%s%i", pSpriteSFrames[v3].texture_name.c_str(), i);
217  } else {
218  sprintf(sprite_name, "%s", pSpriteSFrames[v3].texture_name.c_str());
219  // __debugbreak();
220  }
221  }
222 
223  auto v12 = pSprites_LOD->LoadSprite(
224  sprite_name, pSpriteSFrames[v3].uPaletteID);
225  // pSpriteSFrames[v3].pHwSpriteIDs[i]=v12;
226 
227  if (v12 == -1) __debugbreak();
228 
231  }
232  }
233 
234  if (!(pSpriteSFrames[v3].uFlags & 1)) return;
235  ++v3;
236  }
237  }
238  }
239  }
240 }

Перекрестные ссылки __debugbreak(), SpriteFrame::hw_sprites, PaletteManager::LoadPalette(), LODFile_Sprites::LoadSprite(), logger, LODFile_Sprites::pHardwareSprites, pPaletteManager, pSprites_LOD, pSpriteSFrames, SpriteFrame::uFlags, uNumSpriteFrames, SpriteFrame::uPaletteID, SpriteFrame::uPaletteIndex и Log::Warning().

Используется в DecorationList::InitializeDecorationSprite(), ObjectList::InitializeSprites(), OverlayList::InitializeSprites(), LevelDecorationChangeSeason(), SpellFxRenderer::LoadAnimations(), OutdoorLocation::MessWithLUN() и Actor::PrepareSprites().

+ Граф вызовов:
+ Граф вызова функции:

◆ FastFindSprite()

int SpriteFrameTable::FastFindSprite ( const char *  pSpriteName)

См. определение в файле Sprites.cpp строка 243

243  {
244  signed int result; // eax@2
245 
246  int searchResult = BinarySearch(pSpriteName);
247  if (searchResult < 0)
248  result = 0;
249  else
250  result = this->pSpriteEFrames[searchResult];
251  return result;
252 }

Перекрестные ссылки BinarySearch() и pSpriteEFrames.

Используется в SpellFxRenderer::_4A8BFC(), OverlayList::FromFileTxt(), InitializeTurnBasedAnimations(), SpellFxRenderer::LoadAnimations(), OutdoorLocation::MessWithLUN(), Actor::PrepareSprites() и SpellFxRenderer::RenderSpecialEffects().

+ Граф вызовов:
+ Граф вызова функции:

◆ BinarySearch()

int SpriteFrameTable::BinarySearch ( const char *  pSpriteName)

См. определение в файле Sprites.cpp строка 255

255  {
256  int startPos = 0;
257  int endPos = uNumEFrames;
258  while (1) {
259  int searchRange = endPos - startPos;
260  int middleFrameIndex = startPos + (endPos - startPos) / 2;
261  int comparisonResult = _stricmp(pSpriteName, this->pSpritePFrames[middleFrameIndex]->icon_name.c_str());
262  if (!comparisonResult) {
263  return middleFrameIndex;
264  }
265  if (startPos == endPos) {
266  return -1;
267  }
268  if (comparisonResult >= 0) {
269  startPos += std::max(((endPos - startPos) / 2), 1);
270  } else {
271  endPos = std::max(((endPos - startPos) / 2), 1) + startPos;
272  }
273  }
274 }

Перекрестные ссылки pSpritePFrames и uNumEFrames.

Используется в FastFindSprite().

+ Граф вызова функции:

◆ GetFrame()

SpriteFrame * SpriteFrameTable::GetFrame ( unsigned int  uSpriteID,
unsigned int  uTime 
)

См. определение в файле Sprites.cpp строка 277

278  {
279  SpriteFrame *v4; // ecx@1
280 
281  v4 = &pSpriteSFrames[uSpriteID];
282  if (~v4->uFlags & 1 || !v4->uAnimLength) return pSpriteSFrames + uSpriteID;
283 
284  for (uint t = (uTime / 8) % v4->uAnimLength; t > v4->uAnimTime; ++v4)
285  t -= v4->uAnimTime;
286  return v4;
287 
288  /*for (v4; v4->uAnimTime <= t; ++v4)
289 
290  v6 = (uTime / 8) % v4->uAnimLength;
291  //v7 = uSpriteID;
292  for ( i = (char *)&v4->uAnimTime; ; i += 60 )
293  {
294  v9 = *(short *)i;
295  if ( v6 <= v9 )
296  break;
297  v6 -= v9;
298  ++v7;
299  }
300  return &pSpriteSFrames[v7];*/
301 }

Перекрестные ссылки pSpriteSFrames, SpriteFrame::uAnimLength, SpriteFrame::uAnimTime и SpriteFrame::uFlags.

Используется в _441A4E_overlay_on_portrait(), SpriteObject::GetSpriteFrame(), LevelDecorationChangeSeason(), MonsterPopup_Draw(), IndoorLocation::PrepareActorRenderList_BLV(), OutdoorLocation::PrepareActorsDrawList(), IndoorLocation::PrepareDecorationsRenderList_BLV(), RenderOpenGL::PrepareDecorationsRenderList_ODM(), Render::PrepareDecorationsRenderList_ODM() и SpellFxRenderer::RenderSpecialEffects().

+ Граф вызова функции:

◆ GetFrameBy_x()

SpriteFrame * SpriteFrameTable::GetFrameBy_x ( unsigned int  uSpriteID,
signed int  a3 
)

См. определение в файле Sprites.cpp строка 304

305  {
306  SpriteFrame *v3; // edi@1
307  SpriteFrame *v4; // esi@1
308  __int16 v5; // ax@2
309  int v6; // ecx@3
310  int v7; // edx@3
311  unsigned int v8; // eax@3
312  int v9; // ecx@3
313  char *i; // edx@3
314  int v11; // esi@5
315  SpriteFrame *result; // eax@6
316 
317  v3 = this->pSpriteSFrames;
318  v4 = &v3[uSpriteID];
319  if (v4->uFlags & 1 && (v5 = v4->uAnimLength) != 0) {
320  v6 = v5;
321  v7 = a3 % v5;
322  v8 = uSpriteID;
323  v9 = v6 - v7;
324  for (i = (char *)&v4->uAnimTime;; i += 60) {
325  v11 = *(short *)i;
326  if (v9 <= v11) break;
327  v9 -= v11;
328  ++v8;
329  }
330  result = &v3[v8];
331  } else {
332  result = &v3[uSpriteID];
333  }
334  return result;
335 }

Перекрестные ссылки pSpriteSFrames, SpriteFrame::uAnimLength, SpriteFrame::uAnimTime и SpriteFrame::uFlags.

Используется в IndoorLocation::PrepareActorRenderList_BLV() и OutdoorLocation::PrepareActorsDrawList().

+ Граф вызова функции:

Данные класса

◆ uNumSpriteFrames

int SpriteFrameTable::uNumSpriteFrames

См. определение в файле Sprites.h строка 74

Используется в FromFile(), InitializeSprite(), ReleaseSFrames(), ResetSomeSpriteFlags(), SpriteFrameTable() и ToFile().

◆ uNumEFrames

unsigned int SpriteFrameTable::uNumEFrames

См. определение в файле Sprites.h строка 75

Используется в BinarySearch(), FromFile() и ToFile().

◆ unused_field

int SpriteFrameTable::unused_field

См. определение в файле Sprites.h строка 76

◆ pSpriteSFrames

◆ pSpritePFrames

SpriteFrame** SpriteFrameTable::pSpritePFrames

См. определение в файле Sprites.h строка 78

Используется в BinarySearch(), FromFile() и SpriteFrameTable().

◆ pSpriteEFrames

int16_t* SpriteFrameTable::pSpriteEFrames

См. определение в файле Sprites.h строка 79

Используется в FastFindSprite(), FromFile(), SpriteFrameTable() и ToFile().


Объявления и описания членов структур находятся в файлах:
SpriteFrame_MM7
Definition: LegacyImages.h:29
SpriteFrame::hw_sprites
Sprite * hw_sprites[8]
Definition: Sprites.h:46
pSprites_LOD
LODFile_Sprites * pSprites_LOD
Definition: LOD.cpp:20
SpriteFrame::uPaletteID
int uPaletteID
Definition: Sprites.h:50
PaletteManager::LoadPalette
int LoadPalette(unsigned int uPaletteID)
Definition: PaletteManager.cpp:648
SpriteFrame::uPaletteIndex
int uPaletteIndex
Definition: Sprites.h:51
SpriteFrameTable::uNumSpriteFrames
int uNumSpriteFrames
Definition: Sprites.h:74
result
GLuint64EXT * result
Definition: SDL_opengl_glext.h:9435
LODFile_Sprites::LoadSprite
int LoadSprite(const char *pContainerName, unsigned int uPaletteID)
Definition: LOD.cpp:149
SpriteFrameTable::BinarySearch
int BinarySearch(const char *pSpriteName)
Definition: Sprites.cpp:255
SpriteFrameTable::uNumEFrames
unsigned int uNumEFrames
Definition: Sprites.h:75
SpriteFrame::uAnimTime
int uAnimTime
Definition: Sprites.h:52
v1
GLfloat GLfloat v1
Definition: SDL_opengl_glext.h:694
Log::Warning
void Warning(const wchar_t *pFormat,...)
Definition: Log.cpp:28
SpriteFrameTable::pSpriteSFrames
SpriteFrame * pSpriteSFrames
Definition: Sprites.h:77
pPaletteManager
PaletteManager * pPaletteManager
Definition: PaletteManager.cpp:7
t
GLdouble GLdouble t
Definition: SDL_opengl.h:2071
SpriteFrame::uAnimLength
int uAnimLength
Definition: Sprites.h:53
SpriteFrame
Definition: Sprites.h:39
uint
unsigned int uint
Definition: MM7.h:4
v3
GLfloat GLfloat GLfloat GLfloat v3
Definition: SDL_opengl_glext.h:696
__debugbreak
void __cdecl __debugbreak(void)
SpriteFrameTable::pSpritePFrames
SpriteFrame ** pSpritePFrames
Definition: Sprites.h:78
LODFile_Sprites::pHardwareSprites
Sprite * pHardwareSprites
Definition: LOD.h:233
logger
Log * logger
Definition: IocContainer.cpp:47
res
GLuint res
Definition: SDL_opengl_glext.h:7940
SpriteFrame::uFlags
int uFlags
Definition: Sprites.h:48
SpriteFrame::Deserialize
bool Deserialize(const struct SpriteFrame_MM7 *)
Definition: Sprites.cpp:349
SpriteFrameTable::pSpriteEFrames
int16_t * pSpriteEFrames
Definition: Sprites.h:79