-
AlexSpl
имя: Александр
- Эксперт
-
- Сообщения: 5588
- Зарегистрирован: 17 сен 2010, 12:58
- Пол:
- Награды: 14
-
-
- Поблагодарили: 2185 раз.
|
AlexSpl » 28 янв 2022, 16:38
Удивительно, но - Код: Выделить всё
CSprite *sprite = *(CSprite**)(c->esi + 0x78); sprite->Draw(0, 2 * (townType + 1), 0, 0, sprite->Width, sprite->Height, pWindowManager->screenBitmap->map, dx, dy, pWindowManager->screenBitmap->Width, pWindowManager->screenBitmap->Height, pWindowManager->screenBitmap->ScanlineSize, false, true);
debugStr("%d %d", sprite->Width, sprite->Height);
Возвращает правильные размеры (48x32). Классы такие: - Код: Выделить всё
class _DDCOLORKEY { public: unsigned long dwColorSpaceLowValue; unsigned long dwColorSpaceHighValue; };
class _DDPIXELFORMAT { unsigned long dwSize; unsigned long dwFlags; unsigned long dwFourCC; unsigned long dwRGBBitCount; unsigned long dwYUVBitCount; unsigned long dwZBufferBitDepth; unsigned long dwAlphaBitDepth; unsigned long dwLuminanceBitCount; unsigned long dwBumpBitCount; unsigned long dwRBitMask; unsigned long dwYBitMask; unsigned long dwStencilBitDepth; unsigned long dwLuminanceBitMask; unsigned long dwBumpDuBitMask; unsigned long dwGBitMask; unsigned long dwUBitMask; unsigned long dwZBitMask; unsigned long dwBumpDvBitMask; unsigned long dwBBitMask; unsigned long dwVBitMask; unsigned long dwStencilBitMask; unsigned long dwBumpLuminanceBitMask; unsigned long dwRGBAlphaBitMask; unsigned long dwYUVAlphaBitMask; unsigned long dwLuminanceAlphaBitMask; unsigned long dwRGBZBitMask; unsigned long dwYUVZBitMask; };
class _DDSCAPS2 { unsigned long dwCaps; unsigned long dwCaps2; unsigned long dwCaps3; unsigned long dwCaps4; };
class _DDSURFACEDESC2 { public: unsigned long dwSize; unsigned long dwFlags; unsigned long dwHeight; unsigned long dwWidth; long lPitch; unsigned long dwLinearSize; unsigned long dwBackBufferCount; unsigned long dwMipMapCount; unsigned long dwRefreshRate; unsigned long dwAlphaBitDepth; unsigned long dwReserved; void *lpSurface; _DDCOLORKEY ddckCKDestOverlay; _DDCOLORKEY ddckCKDestBlt; _DDCOLORKEY ddckCKSrcOverlay; _DDCOLORKEY ddckCKSrcBlt; _DDPIXELFORMAT ddpfPixelFormat; _DDSCAPS2 ddsCaps; unsigned long dwTextureStage; };
class IUnknown { };
class IDirectDrawSurface4 : public IUnknown { };
class CSpriteFrame : public resource { public: int DataSize; int ImageSize; TEncodingMethod EncodingMethod; int Width; int Height; int CroppedWidth; int CroppedHeight; int CroppedX; int CroppedY; int Pitch; unsigned char *map; _DDSURFACEDESC2 ddsd; IDirectDrawSurface4 *ddsurf; unsigned long compmap_len; unsigned char *tempmem; };
struct CSequence { int numFrames; int allocatedFrames; CSpriteFrame *f; };
struct CSprite : public resource { CSequence *s; TPalette16 *p16; TPalette24 *p24; int numSequences; int *validSeqMask; int Width; int Height;
inline void Draw(int seqnum, int framenum, int sx, int sy, int sw, int sh, void *dst, int dx, int dy, int dw, int dh, int dpitch, bool hflip, bool tblit) { CALL_15(void, __thiscall, 0x47B610, this, seqnum, framenum, sx, sy, sw, sh, dst, dx, dy, dw, dh, dpitch, hflip, tblit); } };
Если же в классе CSpriteFrame убрать 4 последних поля, которых нет в базе IDA, будут вылеты, что логично: размер класса CSequence уменьшится, и у полей Width и Height будут неверные смещения. Так что, склоняюсь к тому, что эти поля нужны в классе CSpriteFrame. Хотя, там же всё равно указатели Сейчас проверю без этих полей. Удивительно, но без этих полей зависания или вылеты * * * Так, я разобрался. Зависания и вылеты из-за попытки показать диалог с сообщением (заменил на debugStrWin() и всё стало нормально) Работает как с теми полями, так и без них (всё-таки размер структуры CSprite не меняется, потому что в ней указатель на CSequence). Нужно глянуть конструктор CSpriteFrame, чтобы точно понять, нужны они или нет. Если нет, то почему их выпилили? Особенности Dreamcast'овской реализации? Хмм, у CSpriteFrame нет конструктора (в базе IDA). Как определить настоящий размер? А вот в дампе есть несколько разных: - Код: Выделить всё
Строка 443765: (000180) S_GPROC32: [0001:00074600], Cb: 00000064, Type: 0x5571, CSpriteFrame::CSpriteFrame Строка 443774: (0001E0) S_GPROC32: [0001:00074664], Cb: 000000AA, Type: 0x239F, CSpriteFrame::CSpriteFrame Строка 443804: (000308) S_GPROC32: [0001:00074710], Cb: 000000BA, Type: 0x239E, CSpriteFrame::CSpriteFrame Строка 443838: (000480) S_GPROC32: [0001:000747CC], Cb: 0000006E, Type: 0x239D, CSpriteFrame::CSpriteFrame
(инициализации с разными параметрами). Например, - Код: Выделить всё
(000480) S_GPROC32: [0001:000747CC], Cb: 0000006E, Type: 0x239D, CSpriteFrame::CSpriteFrame Parent: 00000000, End: 00000594, Next: 00000598 Debug start: 00000010, Debug end: 00000062
(0004C4) S_REGREL32: sp+00000020, Type: 0x239C, this (0004D8) S_REGREL32: sp+00000024, Type: 0x1001, name (0004EC) S_REGREL32: sp+00000028, Type: T_UCHAR(0020), cropped (000504) S_ENDARG
- Код: Выделить всё
(0001E0) S_GPROC32: [0001:00074664], Cb: 000000AA, Type: 0x239F, CSpriteFrame::CSpriteFrame Parent: 00000000, End: 00000304, Next: 00000308 Debug start: 0000001C, Debug end: 00000098
(000224) S_REGREL32: sp+0000002C, Type: 0x239C, this (000238) S_REGREL32: sp+00000030, Type: 0x1001, name (00024C) S_REGREL32: sp+00000034, Type: T_INT4(0074), w (00025C) S_REGREL32: sp+00000038, Type: T_INT4(0074), h (00026C) S_REGREL32: sp+0000003C, Type: T_32PUCHAR(0420), data (000280) S_REGREL32: sp+00000040, Type: T_INT4(0074), csize (000294) S_REGREL32: sp+00000044, Type: 0x1772, encoding (0002AC) S_ENDARG
и т.п.
|