Initial implementation of spritesProcessWiz. Also plugged it into main loop.

svn-id: r16887
This commit is contained in:
Eugene Sandulenko 2005-02-24 04:04:17 +00:00
parent 4bc6cfd469
commit 1ad372c589
4 changed files with 179 additions and 24 deletions

View File

@ -967,12 +967,16 @@ protected:
void spritesResetTables(bool refreshScreen);
void spriteGroupCheck(int spriteGroupId);
void spriteMarkIfInGroup(int spriteGroupId, uint32 flags);
void spriteInfoSet_addImageToList(int spriteId, int imageNum, int *spriteIdptr);
void spritesUpdateImages();
public:
void spritesBlitToScreen();
void spritesMarkDirty(bool unkFlag);
void spritesUpdateImages();
void spriteInfoSet_addImageToList(int spriteId, int imageNum, int *spriteIdptr);
void spritesSortActiveSprites();
void spritesProcessWiz(bool arg);
protected:
/* HE version 90 script opcodes */
void o90_dup();
void o90_min();

View File

@ -1840,6 +1840,11 @@ load_game:
// Full Throttle always redraws verbs and draws verbs before actors
if (_version >= 7)
redrawVerbs();
if (_heversion >= 90) {
((ScummEngine_v90he *)this)->spritesBlitToScreen();
((ScummEngine_v90he *)this)->spritesSortActiveSprites();
}
setActorRedrawFlags();
resetActorBgs();
@ -1854,11 +1859,22 @@ load_game:
preProcessAuxQueue();
processActors();
postProcessAuxQueue();
if (_heversion >= 90) {
((ScummEngine_v90he *)this)->spritesMarkDirty(0);
((ScummEngine_v90he *)this)->spritesProcessWiz(true);
}
} else {
processActors();
}
_fullRedraw = false;
if (_heversion >= 90) {
((ScummEngine_v90he *)this)->spritesMarkDirty(1);
((ScummEngine_v90he *)this)->spritesProcessWiz(false);
}
if (_version >= 4 && _heversion <= 60)
cyclePalette();
palManipulate();

View File

@ -983,28 +983,28 @@ void ScummEngine_v90he::spritesBlitToScreen() {
SpriteInfo *spi = _activeSpritesTable[i];
if (!(spi->flags & kSF31) && (spi->flags & kSF01)) {
spi->flags &= ~kSF01;
if (spi->bbox_xmin <= spi->bbox_xmax && spi->bbox_ymin <= spi->bbox_ymax) {
if (spi->bbox.left <= spi->bbox.right && spi->bbox.top <= spi->bbox.bottom) {
if (spi->flags & kSFBlitDirectly) {
gdi.copyVirtScreenBuffers(Common::Rect(spi->bbox_xmin, spi->bbox_ymin, spi->bbox_ymin, spi->bbox_ymax)); // XXX 0, 0x40000000);
gdi.copyVirtScreenBuffers(spi->bbox); // XXX 0, 0x40000000);
}
} else if (firstLoop) {
xmin = spi->bbox_xmin;
ymin = spi->bbox_ymin;
xmax = spi->bbox_xmax;
ymax = spi->bbox_ymax;
xmin = spi->bbox.left;
ymin = spi->bbox.top;
xmax = spi->bbox.right;
ymax = spi->bbox.bottom;
firstLoop = false;
} else {
if (xmin < spi->bbox_xmin) {
xmin = spi->bbox_xmin;
if (xmin < spi->bbox.left) {
xmin = spi->bbox.left;
}
if (ymin < spi->bbox_ymin) {
ymin = spi->bbox_ymin;
if (ymin < spi->bbox.top) {
ymin = spi->bbox.top;
}
if (xmax > spi->bbox_xmax) {
xmax = spi->bbox_xmax;
if (xmax > spi->bbox.right) {
xmax = spi->bbox.right;
}
if (ymax > spi->bbox_ymax) {
ymax = spi->bbox_ymax;
if (ymax > spi->bbox.bottom) {
ymax = spi->bbox.bottom;
}
refreshScreen = true;
}
@ -1025,10 +1025,10 @@ void ScummEngine_v90he::spritesMarkDirty(bool unkFlag) {
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);
int lp = MIN(79, spi->bbox.left / 8);
int rp = MIN(79, (spi->bbox.right + 7) / 8);
for (; lp <= rp; ++lp) {
if (vs0->tdirty[lp] < vs0->h && spi->bbox_ymax >= vs0->bdirty[lp] && spi->bbox_ymin <= vs0->tdirty[lp]) {
if (vs0->tdirty[lp] < vs0->h && spi->bbox.bottom >= vs0->bdirty[lp] && spi->bbox.top <= vs0->tdirty[lp]) {
needRedraw = true;
break;
}
@ -1140,4 +1140,142 @@ void ScummEngine_v90he::spritesSortActiveSprites() {
qsort(_activeSpritesTable, _numSpritesToProcess, sizeof(SpriteInfo *), compareSprTable);
}
void ScummEngine_v90he::spritesProcessWiz(bool arg) {
int spr_flags, spr_flags_;
int16 spr_wiz_x, spr_wiz_y;
int res_id, res_state;
Common::Rect *bboxPtr;
int rot_angle, zoom;
int w, h;
int ebx;
WizParameters wiz;
if (!_numSpritesToProcess)
return;
for (int i = 0; i < _numSpritesToProcess; i++) {
SpriteInfo *spi = _activeSpritesTable[i];
if (!(spi->flags & kSFNeedRedraw))
continue;
spr_flags = spi->flags;
if (arg) {
if (spi->field_0)
return;
} else {
if (spi->field_0 < 0)
continue;
}
spi->flags &= ~(kSF01 | kSFNeedRedraw);
res_id = spi->res_id;
res_state = spi->res_state;
loadImgSpot(spi->res_id, spi->res_state, spr_wiz_x, spr_wiz_y);
if (spi->group_num) {
SpriteGroup *spg = &_spriteGroups[spi->group_num];
if (spg->scaling) {
wiz.img.x1 = spi->tx * spg->scale_x - spr_wiz_x + spg->tx;
wiz.img.y1 = spi->ty * spg->scale_y - spr_wiz_y + spg->ty;
} else {
wiz.img.x1 = spi->tx - spr_wiz_x + spg->tx;
wiz.img.y1 = spi->ty - spr_wiz_y + spg->ty;
}
} else {
wiz.img.x1 = spi->tx - spr_wiz_x;
wiz.img.y1 = spi->ty - spr_wiz_y;
}
spi->field_48 = wiz.img.state = res_state;
spi->field_4C = wiz.img.resNum = res_id;
wiz.processFlags = 0x401;
spi->field_68 = spi->rot_angle;
spi->field_6C = spi->zoom;
spi->field_34 = wiz.img.x1;
spi->field_38 = wiz.img.y1;
bboxPtr = &spi->bbox;
if (res_id) {
rot_angle = spi->rot_angle;
zoom = spi->zoom;
spr_flags_ = spi->flags & kSFRotated;
getWizImageDim(res_id, res_state, w, h);
if (!(spi->flags & (kSFZoomed | kSFRotated)) || 1) { // FIXME. remove '|| 1'
bboxPtr->bottom = wiz.img.y1 + h;
bboxPtr->left = wiz.img.x1;
bboxPtr->top = wiz.img.y1;
bboxPtr->right = w + wiz.img.x1;
ebx = -1234;
} else {
// TODO
// what is this?
//
// mov eax, something
// cdq
// sub eax, edx
// sar eax, 1
// mov ecx, eax
// neg ecx
ebx = -1234;
}
} else {
bboxPtr->left = 1234;
bboxPtr->top = 1234;
bboxPtr->right = -1234;
bboxPtr->bottom = -1234;
ebx = -1234;
}
wiz.img.flags = 0x10;
if (spr_flags & kSF23)
wiz.img.flags = 0x410;
if (spr_flags & kSF22)
wiz.img.flags |= 0x800;
if (spr_flags & kSF21) {
wiz.img.flags &= ~(0x11);
wiz.img.flags |= 8;
}
if (spi->field_54) {
wiz.img.flags |= 0x200;
wiz.processFlags |= 4;
wiz.unk_15C = spi->field_54;
}
if (spr_flags & kSF20)
wiz.img.flags |= 2;
if (spi->field_7C) {
wiz.processFlags |= 0x80000;
//wiz.field_178 = spi->field_7C; // FIXME
}
wiz.processFlags |= 0x20;
if (spr_flags & kSFRotated) {
wiz.processFlags |= 0x10;
wiz.angle = spi->rot_angle;
}
if (spr_flags & kSFZoomed) {
wiz.processFlags |= 0x08;
wiz.zoom = spi->zoom;
}
spi->imgFlags = wiz.img.flags;
if (spi->group_num && _spriteGroups[spi->group_num].flags & kSGF01) {
// TODO: rectClipIfIntersects() is missing
}
if (spi->field_14) {
wiz.processFlags |= 0x8000;
//wiz.field_174 = spi->field_14; // FIXME
}
if (spi->res_id && spi->group_num && _spriteGroups[spi->group_num].field_20) {
wiz.processFlags |= 0x1000;
//wiz.field_380 = _spriteGroups[spi->group_num].field_20; // FIXME
}
displayWizComplexImage(&wiz);
}
}
} // End of namespace Scumm

View File

@ -73,10 +73,7 @@ struct SpriteInfo {
int group_num;
int field_14;
int field_18;
int bbox_xmin;
int bbox_ymin;
int bbox_xmax;
int bbox_ymax;
Common::Rect bbox;
int dx;
int dy;
int field_34;
@ -94,7 +91,7 @@ struct SpriteInfo {
int field_64;
int field_68;
int field_6C;
int field_70;
int imgFlags;
int field_74;
int field_78;
int field_7C;