some WIP HE sprites stuff

svn-id: r16832
This commit is contained in:
Gregory Montoir 2005-02-20 22:16:31 +00:00
parent 78533d416f
commit f1f7e6ce7a
3 changed files with 95 additions and 3 deletions

View file

@ -879,6 +879,10 @@ protected:
int spriteInfoGet_flags_6(int spriteNum);
int spriteInfoGet_flags_7(int spriteNum);
int spriteInfoGet_flags_8(int spriteNum);
void spritesAllocTables(int numSprites, int numGroups, int numImgSprites);
void spritesResetTables(bool refreshScreen);
void spriteGroupCheck(int sprGrpId);
void spriteMarkIfInGroup(int sprGrpId, uint32 flags);
/* HE version 90 script opcodes */
void o90_dup();

View file

@ -31,10 +31,8 @@
namespace Scumm {
void ScummEngine_v90he::allocateArrays() {
_spriteGroups = (SpriteGroup *)calloc(_numSprites, sizeof(SpriteGroup));
_spriteTable = (SpriteInfo *)calloc(_numSprites, sizeof(SpriteInfo));
ScummEngine::allocateArrays();
spritesAllocTables(_numSprites, 64, 64);
}
int ScummEngine_v90he::spriteInfoGet_flags_1(int spriteNum) {
@ -85,4 +83,80 @@ int ScummEngine_v90he::spriteInfoGet_flags_8(int spriteNum) {
return ((_spriteTable[spriteNum].flags & kSF31) != 0) ? 1 : 0;
}
void ScummEngine_v90he::spritesAllocTables(int numSprites, int numGroups, int numImgLists) {
_varNumSpriteGroups = numGroups;
_numSpritesToProcess = 0;
_varNumSprites = numSprites;
_varNumImgLists = numImgLists;
_spriteGroups = (SpriteGroup *)malloc((_varNumSpriteGroups + 1) * sizeof(SpriteGroup));
_spriteTable = (SpriteInfo *)malloc((_varNumSprites + 1) * sizeof(SpriteInfo));
_activeSpritesTable = (SpriteInfo **)malloc((_varNumSprites + 1) * sizeof(SpriteInfo *));
_imageListTable = (uint32 *)malloc((_varNumImgLists + 1) * sizeof(uint32)); // XXX
_imageListStack = (uint16 *)malloc((_varNumImgLists + 1) * sizeof(uint16));
}
void ScummEngine_v90he::spritesResetTables(bool refreshScreen) {
int i;
for (i = 0; i < _varNumImgLists; ++i) {
_imageListStack[i] = i;
}
memset(_spriteTable, 0, (_varNumSprites + 1) * sizeof(SpriteInfo));
memset(_spriteGroups, 0, (_varNumSpriteGroups + 1) * sizeof(SpriteGroup));
for (int curGrp = 1; curGrp < _varNumSpriteGroups; ++curGrp) {
SpriteGroup *spg = &_spriteGroups[curGrp];
checkRange(_varNumSpriteGroups, 1, curGrp, "Invalid sprite group %d");
if (spg->field_10 != 0) {
spg->field_10 = 0;
spriteGroupCheck(curGrp);
for (i = 0; i < _numSpritesToProcess; ++i) {
SpriteInfo *spi = _activeSpritesTable[i];
if (spi->group_num == curGrp) {
spi->flags |= kSF1 | kSF2;
}
}
}
if (spg->tx != 0 || spg->ty != 0) {
spg->tx = spg->ty = 0;
spriteGroupCheck(curGrp);
for (i = 0; i < _numSpritesToProcess; ++i) {
SpriteInfo *spi = _activeSpritesTable[i];
if (spi->group_num == curGrp) {
spi->flags |= kSF1 | kSF2;
}
}
}
spg->flags &= ~kSGF1;
spriteMarkIfInGroup(curGrp, kSF1 | kSF2);
if (spg->field_20 != 0) {
spriteGroupCheck(curGrp);
for (i = 0; i < _numSpritesToProcess; ++i) {
SpriteInfo *spi = _activeSpritesTable[i];
if (spi->group_num == curGrp) {
spi->flags |= kSF1 | kSF2;
}
}
}
spriteGroupCheck(curGrp);
spg->scaling = 0;
spg->scale_x = 0x3F800000;
spg->field_30 = 0;
spg->field_34 = 0;
spg->scale_y = 0x3F800000;
spg->field_38 = 0;
spg->field_3C = 0;
}
if (refreshScreen) {
gdi.copyVirtScreenBuffers(Common::Rect(_screenWidth, _screenHeight));
}
_numSpritesToProcess = 0;
}
void ScummEngine_v90he::spriteGroupCheck(int sprGrpId) {
// XXX
}
void ScummEngine_v90he::spriteMarkIfInGroup(int sprGrpId, uint32 flags) {
// XXX
}
} // End of namespace Scumm

View file

@ -60,6 +60,11 @@ enum SpriteFlags {
kSF32 = (1 << 31)
};
enum SpriteGroupFlags {
kSGF1 = 1 << 0,
kSFG2 = 1 << 1
};
struct SpriteInfo {
int field_0;
int flags;
@ -116,8 +121,17 @@ struct SpriteGroup {
int field_3C;
};
int _varNumSpriteGroups;
int _numSpritesToProcess;
int _varNumSprites;
int _varNumImgLists;
SpriteInfo *_spriteTable;
SpriteGroup *_spriteGroups;
SpriteInfo **_activeSpritesTable;
uint32 *_imageListTable; // XXX wrong type
uint16 *_imageListStack;
int _curSprImageListNum;
} // End of namespace Scumm