aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Montoir2005-02-22 21:38:44 +0000
committerGregory Montoir2005-02-22 21:38:44 +0000
commit44c6bbe4383b1893978374c7712331c187c21877 (patch)
treeedf9d1f25f70fcde62c7f5e712ebe8043061b378
parentbe2049a338e68097e334547340af033f4a820358 (diff)
downloadscummvm-rg350-44c6bbe4383b1893978374c7712331c187c21877.tar.gz
scummvm-rg350-44c6bbe4383b1893978374c7712331c187c21877.tar.bz2
scummvm-rg350-44c6bbe4383b1893978374c7712331c187c21877.zip
some WIP stuff for HE sprites
svn-id: r16865
-rw-r--r--scumm/intern.h4
-rw-r--r--scumm/sprite_he.cpp92
-rw-r--r--scumm/sprite_he.h8
3 files changed, 90 insertions, 14 deletions
diff --git a/scumm/intern.h b/scumm/intern.h
index c3cc32eb30..2ad2c9db90 100644
--- a/scumm/intern.h
+++ b/scumm/intern.h
@@ -936,11 +936,13 @@ protected:
void spriteInfoSet_flag31(int spriteId, int value);
void spriteInfoSet_field_78_64(int spriteId, int value);
- void spritesAllocTables(int numSprites, int numGroups, int numImgSprites);
+ void spritesAllocTables(int numSprites, int numGroups, int numMaxSprites);
void spritesResetTables(bool refreshScreen);
void spriteGroupCheck(int spriteGroupId);
void spriteMarkIfInGroup(int spriteGroupId, uint32 flags);
void spritesBlitToScreen();
+ void spritesMarkDirty(bool unkFlag);
+ void spritesUpdateImages();
void spriteInfoSet_addImageToList(int spriteId, int imageNum, int *spriteIdptr);
/* HE version 90 script opcodes */
diff --git a/scumm/sprite_he.cpp b/scumm/sprite_he.cpp
index d3fd15e9e5..cd8ccd4d3b 100644
--- a/scumm/sprite_he.cpp
+++ b/scumm/sprite_he.cpp
@@ -212,8 +212,8 @@ void ScummEngine_v90he::spriteInfoGet_tx_ty(int spriteId, int32 &tx, int32 &ty)
void ScummEngine_v90he::spriteInfoGet_field_2C_30(int spriteId, int32 &field_2C, int32 &field_30) {
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
- field_2C = _spriteTable[spriteId].field_2C;
- field_30 = _spriteTable[spriteId].field_30;
+ field_2C = _spriteTable[spriteId].dx;
+ field_30 = _spriteTable[spriteId].dy;
}
//
@@ -333,8 +333,8 @@ void ScummEngine_v90he::spriteInfoSet_groupNum(int spriteId, int value) {
void ScummEngine_v90he::spriteInfoSet_field_2C_30(int spriteId, int value1, int value2) {
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
- _spriteTable[spriteId].field_2C = value1;
- _spriteTable[spriteId].field_30 = value2;
+ _spriteTable[spriteId].dx = value1;
+ _spriteTable[spriteId].dy = value2;
}
void ScummEngine_v90he::spriteInfoSet_field_54(int spriteId, int value) {
@@ -495,21 +495,21 @@ void ScummEngine_v90he::spriteInfoSet_addImageToList(int spriteId, int imageNum,
// TODO
}
-void ScummEngine_v90he::spritesAllocTables(int numSprites, int numGroups, int numImgLists) {
+void ScummEngine_v90he::spritesAllocTables(int numSprites, int numGroups, int numMaxSprites) {
_varNumSpriteGroups = numGroups;
_numSpritesToProcess = 0;
_varNumSprites = numSprites;
- _varNumImgLists = numImgLists;
+ _varMaxSprites = numMaxSprites;
_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));
+ _imageListTable = (uint16 *)malloc((_varMaxSprites + 1) * sizeof(uint16) * 2 + 1);
+ _imageListStack = (uint16 *)malloc((_varMaxSprites + 1) * sizeof(uint16));
}
void ScummEngine_v90he::spritesResetTables(bool refreshScreen) {
int i;
- for (i = 0; i < _varNumImgLists; ++i) {
+ for (i = 0; i < _varMaxSprites; ++i) {
_imageListStack[i] = i;
}
memset(_spriteTable, 0, (_varNumSprites + 1) * sizeof(SpriteInfo));
@@ -622,4 +622,78 @@ void ScummEngine_v90he::spritesBlitToScreen() {
}
}
+void ScummEngine_v90he::spritesMarkDirty(bool unkFlag) {
+ VirtScreen *vs0 = &virtscr[kMainVirtScreen];
+ for (int i = 0; i < _numSpritesToProcess; ++i) {
+ SpriteInfo *spi = _activeSpritesTable[i];
+ if (!(spi->flags & (kSFNeedRedraw | kSF30))) {
+ if ((!unkFlag || spi->field_18 >= 0) && (spi->flags & kSF23)) {
+ bool needRedraw = false;
+ int lp = MIN(79, spi->bbox_xmin / 8);
+ int rp = MIN(79, (spi->bbox_xmax + 7) / 8);
+ for (; lp <= rp; ++lp) {
+ if (vs0->tdirty[lp] < vs0->h && spi->bbox_ymax >= vs0->bdirty[lp] && spi->bbox_ymin <= vs0->tdirty[lp]) {
+ needRedraw = true;
+ break;
+ }
+ }
+ if (needRedraw) {
+ spi->flags |= kSFNeedRedraw;
+ }
+ }
+ }
+ }
+}
+
+void ScummEngine_v90he::spritesUpdateImages() {
+ for (int i = 0; i < _numSpritesToProcess; ++i) {
+ SpriteInfo *spi = _activeSpritesTable[i];
+ if (spi->dx != 0 || spi->dy != 0) {
+ checkRange(_varNumSprites, 1, i, "Invalid sprite %d");
+ int tx = spi->tx;
+ int ty = spi->ty;
+ spi->tx += spi->dx;
+ spi->ty += spi->dy;
+ if (tx != spi->tx || ty != spi->ty) {
+ spi->flags |= kSF01 | kSFNeedRedraw;
+ }
+ }
+ if (spi->flags & kSF22) {
+ if (spi->field_78 != 0) {
+ --spi->field_64;
+ if (spi->field_64 != 0) {
+ continue;
+ }
+ spi->field_64 = spi->field_78;
+ }
+ int state = spi->res_state;
+ ++spi->res_state;
+ if (spi->res_state >= spi->res_wiz_states) {
+ spi->res_state = 0;
+ if (spi->imglist_num != 0) {
+ if (!(spi->flags & kSF25)) {
+ // XXX
+ checkRange(_varMaxSprites, 1, spi->imglist_num, "Image list %d out of range");
+ uint16 img1 = _imageListTable[0x21 * spi->imglist_num - 1];
+ uint16 img2 = spi->field_74 + 1;
+ if (img2 >= img1) {
+ img2 = 0;
+ }
+ if (spi->field_74 != img2) {
+ spi->field_74 = img2;
+ spi->res_id = _imageListTable[0x21 * (img2 - 1)];
+ spi->flags |= kSF01 | kSFNeedRedraw;
+ spi->res_wiz_states = getWizImageStates(spi->res_id);
+ }
+ }
+ continue;
+ } else if (state == 0) {
+ continue;
+ }
+ }
+ spi->flags |= kSF01 | kSFNeedRedraw;
+ }
+ }
+}
+
} // End of namespace Scumm
diff --git a/scumm/sprite_he.h b/scumm/sprite_he.h
index 70e0ca657e..563e061668 100644
--- a/scumm/sprite_he.h
+++ b/scumm/sprite_he.h
@@ -77,8 +77,8 @@ struct SpriteInfo {
int bbox_ymin;
int bbox_xmax;
int bbox_ymax;
- int field_2C;
- int field_30;
+ int dx;
+ int dy;
int field_34;
int field_38;
int tx;
@@ -124,11 +124,11 @@ struct SpriteGroup {
int _varNumSpriteGroups;
int _numSpritesToProcess;
int _varNumSprites;
- int _varNumImgLists;
+ int _varMaxSprites;
SpriteInfo *_spriteTable;
SpriteGroup *_spriteGroups;
SpriteInfo **_activeSpritesTable;
- uint32 *_imageListTable; // XXX wrong type
+ uint16 *_imageListTable;
uint16 *_imageListStack;
int _curSprImageListNum;