2005-02-20 10:56:59 +00:00
|
|
|
/* ScummVM - Scumm Interpreter
|
|
|
|
* Copyright (C) 2001 Ludvig Strigeus
|
|
|
|
* Copyright (C) 2001-2005 The ScummVM project
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*
|
|
|
|
* $Header$
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
|
|
#include "scumm/intern.h"
|
|
|
|
#include "scumm/resource.h"
|
|
|
|
#include "scumm/scumm.h"
|
|
|
|
#include "scumm/sprite_he.h"
|
|
|
|
#include "scumm/wiz_he.h"
|
|
|
|
|
|
|
|
namespace Scumm {
|
|
|
|
|
2005-02-20 13:07:57 +00:00
|
|
|
void ScummEngine_v90he::allocateArrays() {
|
|
|
|
ScummEngine::allocateArrays();
|
2005-02-26 10:59:50 +00:00
|
|
|
spritesAllocTables(_numSprites, MAX(64, _numSprites / 4), 64);
|
2005-02-20 13:07:57 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 01:08:48 +00:00
|
|
|
//
|
|
|
|
// spriteInfoGet functions
|
|
|
|
//
|
2005-02-26 12:10:06 +00:00
|
|
|
int ScummEngine_v90he::findSpriteWithClassOf(int x, int y, int spriteGroupId, int d, int num, int *args) {
|
2005-02-25 15:19:03 +00:00
|
|
|
int classId;
|
2005-02-26 12:10:06 +00:00
|
|
|
debug(1, "findSprite: x %d, y %d, spriteGroup %d, d %d, num %d", x, y, spriteGroupId, d, num);
|
2005-02-25 15:19:03 +00:00
|
|
|
|
|
|
|
for (int i = 0; i < _numSpritesToProcess; ++i) {
|
|
|
|
SpriteInfo *spi = _activeSpritesTable[i];
|
|
|
|
if (!spi->field_4C)
|
|
|
|
continue;
|
|
|
|
|
2005-02-26 12:10:06 +00:00
|
|
|
if (spriteGroupId && spi->group_num != spriteGroupId)
|
2005-02-25 15:19:03 +00:00
|
|
|
continue;
|
|
|
|
|
|
|
|
for (int j = 0; j < num; j++) {
|
|
|
|
classId = args[j] & 0x7F;
|
|
|
|
checkRange(32, 1, classId, "class %d out of range in statement");
|
|
|
|
if (!(spi->class_flags & (1 << classId)))
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2005-02-27 06:01:11 +00:00
|
|
|
if (d) {
|
2005-02-25 15:19:03 +00:00
|
|
|
if (spi->bbox.left > spi->bbox.right)
|
|
|
|
continue;
|
|
|
|
if (spi->bbox.top > spi->bbox.bottom)
|
|
|
|
continue;
|
|
|
|
if (spi->bbox.left > x)
|
|
|
|
continue;
|
|
|
|
if (spi->bbox.top > y)
|
|
|
|
continue;
|
|
|
|
if (spi->bbox.right < x)
|
|
|
|
continue;
|
|
|
|
if (spi->bbox.bottom < y)
|
|
|
|
continue;
|
|
|
|
return i;
|
|
|
|
} else {
|
2005-02-25 23:37:25 +00:00
|
|
|
int resId, state, rot_angle, zoom;
|
|
|
|
int32 w, h;
|
2005-02-25 15:19:03 +00:00
|
|
|
|
2005-02-25 23:37:25 +00:00
|
|
|
resId = spi->field_4C;
|
2005-02-25 15:19:03 +00:00
|
|
|
if (spi->field_80) {
|
|
|
|
int16 x1, x2, y1, y2;
|
|
|
|
|
|
|
|
state = getWizImageStates(spi->field_80);
|
2005-02-27 03:36:33 +00:00
|
|
|
state /= spi->cur_img_state;
|
2005-02-25 15:19:03 +00:00
|
|
|
|
2005-02-27 03:36:33 +00:00
|
|
|
x -= spi->pos.x;
|
|
|
|
y -= spi->pos.y;
|
2005-02-25 15:19:03 +00:00
|
|
|
|
|
|
|
loadImgSpot(spi->field_4C, state, x1, y1);
|
|
|
|
loadImgSpot(spi->field_80, state, x2, y2);
|
|
|
|
|
|
|
|
x += (x2 - x1);
|
|
|
|
y += (y2 - y1);
|
|
|
|
} else {
|
|
|
|
if (spi->bbox.left > spi->bbox.right)
|
|
|
|
continue;
|
|
|
|
if (spi->bbox.top > spi->bbox.bottom)
|
|
|
|
continue;
|
|
|
|
if (spi->bbox.left > x)
|
|
|
|
continue;
|
|
|
|
if (spi->bbox.top > y)
|
|
|
|
continue;
|
|
|
|
if (spi->bbox.right < x)
|
|
|
|
continue;
|
|
|
|
if (spi->bbox.bottom < y)
|
|
|
|
continue;
|
|
|
|
|
2005-02-27 03:36:33 +00:00
|
|
|
x -= spi->pos.x;
|
|
|
|
y -= spi->pos.y;
|
|
|
|
state = spi->cur_img_state;
|
2005-02-25 15:19:03 +00:00
|
|
|
}
|
|
|
|
|
2005-02-25 23:37:25 +00:00
|
|
|
rot_angle = spi->field_68;
|
|
|
|
zoom = spi->field_6C;
|
2005-02-25 15:19:03 +00:00
|
|
|
if ((spi->flags & kSFZoomed) || (spi->flags & kSFRotated)) {
|
2005-02-25 23:37:25 +00:00
|
|
|
if (spi->flags & kSFZoomed && zoom) {
|
|
|
|
x = x * 256 / zoom;
|
|
|
|
y = y * 256 / zoom;
|
|
|
|
}
|
|
|
|
if (spi->flags & kSFRotated && rot_angle) {
|
2005-02-26 10:59:50 +00:00
|
|
|
rot_angle = (360 - rot_angle) % 360;
|
2005-02-25 23:37:25 +00:00
|
|
|
Common::Point pts[1];
|
|
|
|
_wiz.polygonRotatePoints(pts, 1, rot_angle);
|
|
|
|
}
|
2005-02-25 15:19:03 +00:00
|
|
|
|
2005-02-25 23:37:25 +00:00
|
|
|
getWizImageDim(resId, state, w, h);
|
|
|
|
x += w / 2;
|
|
|
|
y += h / 2;
|
2005-02-25 15:19:03 +00:00
|
|
|
}
|
|
|
|
|
2005-02-26 10:53:23 +00:00
|
|
|
if(isWizPixelNonTransparent(rtImage, resId, state, x, y, spi->imgFlags))
|
2005-02-25 15:19:03 +00:00
|
|
|
return i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-02-22 01:25:53 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2005-02-23 05:26:56 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_classFlags(int spriteId, int classId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
|
|
|
|
2005-02-23 05:26:56 +00:00
|
|
|
if (classId == -1)
|
|
|
|
return _spriteTable[spriteId].class_flags;
|
|
|
|
|
|
|
|
checkRange(32, 1, classId, "class %d out of range in statement");
|
2005-02-23 12:26:17 +00:00
|
|
|
return ((_spriteTable[spriteId].class_flags & (1 << classId)) != 0) ? 1 : 0;
|
2005-02-22 01:25:53 +00:00
|
|
|
}
|
|
|
|
|
2005-02-23 12:26:17 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_classFlagsAnd(int spriteId, int num, int *args) {
|
2005-02-24 08:26:58 +00:00
|
|
|
int classId;
|
|
|
|
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
|
|
|
|
2005-02-23 12:26:17 +00:00
|
|
|
if (!num)
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
for (int i = 0; i < num; i++) {
|
2005-02-24 08:26:58 +00:00
|
|
|
classId = args[i] & 0x7F;
|
|
|
|
checkRange(32, 1, classId, "class %d out of range in statement");
|
|
|
|
if (!(_spriteTable[spriteId].class_flags & (1 << classId)))
|
2005-02-23 12:26:17 +00:00
|
|
|
return 0;
|
2005-02-23 12:04:42 +00:00
|
|
|
}
|
|
|
|
|
2005-02-23 12:26:17 +00:00
|
|
|
return 1;
|
2005-02-22 01:25:53 +00:00
|
|
|
}
|
|
|
|
|
2005-02-24 06:47:12 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_flags_13(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 13:07:57 +00:00
|
|
|
|
2005-02-24 06:47:12 +00:00
|
|
|
return ((_spriteTable[spriteId].flags & kSF13) != 0) ? 1 : 0;
|
2005-02-20 13:07:57 +00:00
|
|
|
}
|
|
|
|
|
2005-02-24 06:47:12 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_flags_14(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 13:07:57 +00:00
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
return ((_spriteTable[spriteId].flags & kSF14) != 0) ? 1 : 0;
|
2005-02-20 13:07:57 +00:00
|
|
|
}
|
|
|
|
|
2005-02-24 06:47:12 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_flags_15(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 13:07:57 +00:00
|
|
|
|
2005-02-24 06:47:12 +00:00
|
|
|
return ((_spriteTable[spriteId].flags & kSF15) != 0) ? 1 : 0;
|
2005-02-20 13:07:57 +00:00
|
|
|
}
|
|
|
|
|
2005-02-24 21:05:29 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_flagActive(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 13:07:57 +00:00
|
|
|
|
2005-02-24 21:05:29 +00:00
|
|
|
return ((_spriteTable[spriteId].flags & kSFActive) != 0) ? 1 : 0;
|
2005-02-20 13:07:57 +00:00
|
|
|
}
|
|
|
|
|
2005-02-24 06:47:12 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_flags_20(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 13:07:57 +00:00
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
return ((_spriteTable[spriteId].flags & kSF20) != 0) ? 1 : 0;
|
2005-02-20 13:07:57 +00:00
|
|
|
}
|
|
|
|
|
2005-02-24 23:11:50 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_flagYFlipped(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 13:07:57 +00:00
|
|
|
|
2005-02-24 23:11:50 +00:00
|
|
|
return ((_spriteTable[spriteId].flags & kSFYFlipped) != 0) ? 1 : 0;
|
2005-02-20 13:07:57 +00:00
|
|
|
}
|
|
|
|
|
2005-02-24 23:11:50 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_flagXFlipped(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 13:07:57 +00:00
|
|
|
|
2005-02-24 23:11:50 +00:00
|
|
|
return ((_spriteTable[spriteId].flags & kSFXFlipped) != 0) ? 1 : 0;
|
2005-02-20 13:07:57 +00:00
|
|
|
}
|
|
|
|
|
2005-02-26 11:05:13 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_flagHasImage(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 13:07:57 +00:00
|
|
|
|
2005-02-26 11:05:13 +00:00
|
|
|
return ((_spriteTable[spriteId].flags & kSFImageless) != 0) ? 1 : 0;
|
2005-02-20 13:07:57 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_resId(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 23:30:37 +00:00
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
return _spriteTable[spriteId].res_id;
|
2005-02-20 23:30:37 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_resState(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 23:30:37 +00:00
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
return _spriteTable[spriteId].res_state;
|
2005-02-20 23:30:37 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_groupNum(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 23:30:37 +00:00
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
return _spriteTable[spriteId].group_num;
|
2005-02-20 23:30:37 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 04:53:34 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_field_14(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 04:53:34 +00:00
|
|
|
|
|
|
|
return _spriteTable[spriteId].field_14;
|
|
|
|
}
|
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_field_18(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 23:30:37 +00:00
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
return _spriteTable[spriteId].field_18;
|
2005-02-20 23:30:37 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_grp_tx(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 23:30:37 +00:00
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
if (_spriteTable[spriteId].group_num)
|
|
|
|
return _spriteTable[spriteId].tx + _spriteGroups[spriteId].tx;
|
2005-02-21 00:25:30 +00:00
|
|
|
else
|
2005-02-21 00:34:00 +00:00
|
|
|
return _spriteTable[spriteId].tx;
|
2005-02-20 23:30:37 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_grp_ty(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 23:30:37 +00:00
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
if (_spriteTable[spriteId].group_num)
|
|
|
|
return _spriteTable[spriteId].ty + _spriteGroups[spriteId].ty;
|
2005-02-21 00:25:30 +00:00
|
|
|
else
|
2005-02-21 00:34:00 +00:00
|
|
|
return _spriteTable[spriteId].ty;
|
2005-02-20 23:30:37 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_field_44(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 23:30:37 +00:00
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
return _spriteTable[spriteId].field_44;
|
2005-02-20 23:30:37 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_field_54(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 23:30:37 +00:00
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
return _spriteTable[spriteId].field_54;
|
2005-02-20 23:30:37 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_wizSize(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 23:30:37 +00:00
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
return _spriteTable[spriteId].res_wiz_states;
|
2005-02-20 23:30:37 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_zoom(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 23:30:37 +00:00
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
return _spriteTable[spriteId].zoom;
|
2005-02-20 23:30:37 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_field_78(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 23:30:37 +00:00
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
return _spriteTable[spriteId].field_78;
|
2005-02-20 23:30:37 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 04:53:34 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_field_7C(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 04:53:34 +00:00
|
|
|
|
|
|
|
return _spriteTable[spriteId].field_7C;
|
|
|
|
}
|
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_field_80(int spriteId) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 23:30:37 +00:00
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
return _spriteTable[spriteId].field_80;
|
2005-02-20 23:30:37 +00:00
|
|
|
}
|
|
|
|
|
2005-02-23 09:55:34 +00:00
|
|
|
int ScummEngine_v90he::spriteInfoGet_field_88(int spriteId, int type) {
|
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
|
|
|
|
|
|
|
if (type == 0x7B)
|
|
|
|
return _spriteTable[spriteId].field_88;
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
void ScummEngine_v90he::getSpriteImageDim(int spriteId, int32 &w, int32 &h) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-20 23:55:11 +00:00
|
|
|
|
2005-02-26 04:53:43 +00:00
|
|
|
if (_spriteTable[spriteId].res_id) {
|
|
|
|
getWizImageDim(_spriteTable[spriteId].res_id, _spriteTable[spriteId].res_state, w, h);
|
|
|
|
} else {
|
|
|
|
w = 0;
|
|
|
|
h = 0;
|
|
|
|
}
|
2005-02-20 23:55:11 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoGet_tx_ty(int spriteId, int32 &tx, int32 &ty) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 00:25:30 +00:00
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
tx = _spriteTable[spriteId].tx;
|
|
|
|
ty = _spriteTable[spriteId].ty;
|
2005-02-21 00:25:30 +00:00
|
|
|
}
|
|
|
|
|
2005-02-23 04:05:22 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoGet_dx_dy(int spriteId, int32 &dx, int32 &dy) {
|
2005-02-22 01:25:53 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 00:25:30 +00:00
|
|
|
|
2005-02-23 04:05:22 +00:00
|
|
|
dx = _spriteTable[spriteId].dx;
|
|
|
|
dy = _spriteTable[spriteId].dy;
|
2005-02-21 00:25:30 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 01:08:48 +00:00
|
|
|
//
|
|
|
|
// spriteGroupGet functions
|
|
|
|
//
|
2005-02-21 02:37:05 +00:00
|
|
|
int ScummEngine_v90he::spriteGroupGet_allocateGroupSpritesList(int spriteGroupId) {
|
2005-02-23 05:26:56 +00:00
|
|
|
int i, j = 0, sprites = 0;
|
2005-02-23 05:09:14 +00:00
|
|
|
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-21 02:37:05 +00:00
|
|
|
|
2005-02-23 05:09:14 +00:00
|
|
|
for (i = 1; i < _varNumSprites; i++) {
|
|
|
|
if (_spriteTable[i].group_num == spriteGroupId)
|
|
|
|
sprites++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!sprites)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
writeVar(0, 0);
|
|
|
|
defineArray(0, kDwordArray, 0, 0, 0, sprites);
|
|
|
|
writeArray(0, 0, 0, sprites);
|
|
|
|
|
2005-02-24 12:22:14 +00:00
|
|
|
for (i = (_varNumSprites - 1); i > 0; i--) {
|
2005-02-23 05:09:14 +00:00
|
|
|
if (_spriteTable[i].group_num == spriteGroupId)
|
2005-02-24 12:22:14 +00:00
|
|
|
writeArray(0, 0, ++j, i);
|
2005-02-23 05:09:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return readVar(0);
|
2005-02-21 02:37:05 +00:00
|
|
|
}
|
2005-02-21 01:08:48 +00:00
|
|
|
|
2005-02-26 11:22:00 +00:00
|
|
|
int ScummEngine_v90he::spriteGroupGet_zorderPriority(int spriteGroupId) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-21 01:08:48 +00:00
|
|
|
|
2005-02-26 11:22:00 +00:00
|
|
|
return _spriteGroups[spriteGroupId].zorderPriority;
|
2005-02-21 01:08:48 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
int ScummEngine_v90he::spriteGroupGet_field_20(int spriteGroupId) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-21 01:08:48 +00:00
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
return _spriteGroups[spriteGroupId].field_20;
|
2005-02-21 01:08:48 +00:00
|
|
|
}
|
|
|
|
|
2005-02-26 11:22:00 +00:00
|
|
|
int ScummEngine_v90he::spriteGroupGet_scale_x_ratio_mul(int spriteGroupId) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-21 01:08:48 +00:00
|
|
|
|
2005-02-26 11:22:00 +00:00
|
|
|
return _spriteGroups[spriteGroupId].scale_x_ratio_mul;
|
2005-02-21 01:08:48 +00:00
|
|
|
}
|
|
|
|
|
2005-02-26 11:22:00 +00:00
|
|
|
int ScummEngine_v90he::spriteGroupGet_scale_x_ratio_div(int spriteGroupId) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-21 01:08:48 +00:00
|
|
|
|
2005-02-26 11:22:00 +00:00
|
|
|
return _spriteGroups[spriteGroupId].scale_x_ratio_div;
|
2005-02-21 01:08:48 +00:00
|
|
|
}
|
|
|
|
|
2005-02-26 11:22:00 +00:00
|
|
|
int ScummEngine_v90he::spriteGroupGet_scale_y_ratio_mul(int spriteGroupId) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-21 01:08:48 +00:00
|
|
|
|
2005-02-26 11:22:00 +00:00
|
|
|
return _spriteGroups[spriteGroupId].scale_y_ratio_mul;
|
2005-02-21 01:08:48 +00:00
|
|
|
}
|
|
|
|
|
2005-02-26 11:22:00 +00:00
|
|
|
int ScummEngine_v90he::spriteGroupGet_scale_y_ratio_div(int spriteGroupId) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-21 01:08:48 +00:00
|
|
|
|
2005-02-26 11:22:00 +00:00
|
|
|
return _spriteGroups[spriteGroupId].scale_y_ratio_div;
|
2005-02-21 01:08:48 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
void ScummEngine_v90he::spriteGroupGet_tx_ty(int spriteGroupId, int32 &tx, int32 &ty) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-21 01:08:48 +00:00
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
tx = _spriteGroups[spriteGroupId].tx;
|
|
|
|
ty = _spriteGroups[spriteGroupId].ty;
|
2005-02-21 01:08:48 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 00:02:44 +00:00
|
|
|
//
|
|
|
|
// spriteInfoSet functions
|
|
|
|
//
|
2005-02-21 00:34:00 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_field_14(int spriteId, int value) {
|
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 00:02:44 +00:00
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
if (_spriteTable[spriteId].field_14 != value) {
|
|
|
|
_spriteTable[spriteId].field_14 = value;
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-21 00:02:44 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_field_7C(int spriteId, int value) {
|
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 00:02:44 +00:00
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
if (_spriteTable[spriteId].field_7C != value) {
|
|
|
|
_spriteTable[spriteId].field_7C = value;
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-21 00:02:44 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_field_80(int spriteId, int value) {
|
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 00:02:44 +00:00
|
|
|
|
2005-02-21 00:34:00 +00:00
|
|
|
_spriteTable[spriteId].field_80 = value;
|
2005-02-21 00:02:44 +00:00
|
|
|
}
|
|
|
|
|
2005-02-26 01:39:52 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_resState(int spriteId, int state) {
|
2005-02-21 02:37:05 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 00:59:50 +00:00
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
if (_spriteTable[spriteId].res_id) {
|
2005-02-26 01:39:52 +00:00
|
|
|
int res_wiz_states = _spriteTable[spriteId].res_wiz_states - 1;
|
|
|
|
if (state > res_wiz_states)
|
|
|
|
state = res_wiz_states;
|
2005-02-21 00:59:50 +00:00
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
if (_spriteTable[spriteId].res_state != state) {
|
|
|
|
_spriteTable[spriteId].res_state = state;
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-21 00:59:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_tx_ty(int spriteId, int value1, int value2) {
|
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 00:59:50 +00:00
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
if (_spriteTable[spriteId].tx != value1 || _spriteTable[spriteId].ty != value2) {
|
|
|
|
_spriteTable[spriteId].tx = value1;
|
|
|
|
_spriteTable[spriteId].ty = value2;
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-21 00:59:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_groupNum(int spriteId, int value) {
|
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 12:43:18 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 0, value, "Invalid sprite group %d");
|
2005-02-21 00:59:50 +00:00
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
_spriteTable[spriteId].group_num = value;
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-21 00:59:50 +00:00
|
|
|
}
|
|
|
|
|
2005-02-23 04:05:22 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_dx_dy(int spriteId, int value1, int value2) {
|
2005-02-21 02:37:05 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 00:59:50 +00:00
|
|
|
|
2005-02-22 21:38:44 +00:00
|
|
|
_spriteTable[spriteId].dx = value1;
|
|
|
|
_spriteTable[spriteId].dy = value2;
|
2005-02-21 00:59:50 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_field_54(int spriteId, int value) {
|
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 00:59:50 +00:00
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
_spriteTable[spriteId].field_54 = value;
|
|
|
|
if (_spriteTable[spriteId].res_id)
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-21 00:59:50 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_field_44(int spriteId, int value1, int value2) {
|
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 00:59:50 +00:00
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
_spriteTable[spriteId].field_44 = value2;
|
2005-02-21 00:59:50 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_field_18(int spriteId, int value) {
|
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 00:59:50 +00:00
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
_spriteTable[spriteId].field_18 = value;
|
2005-02-21 00:59:50 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_Inc_tx_ty(int spriteId, int value1, int value2) {
|
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 00:59:50 +00:00
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
_spriteTable[spriteId].tx += value1;
|
|
|
|
_spriteTable[spriteId].ty += value2;
|
2005-02-21 00:59:50 +00:00
|
|
|
|
2005-02-23 09:23:54 +00:00
|
|
|
if (value1 || value2)
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-21 00:59:50 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_zoom(int spriteId, int value) {
|
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 00:59:50 +00:00
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFZoomed;
|
2005-02-21 00:59:50 +00:00
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
if (_spriteTable[spriteId].zoom != value) {
|
|
|
|
_spriteTable[spriteId].zoom = value;
|
2005-02-21 00:59:50 +00:00
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
if (_spriteTable[spriteId].res_id)
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-21 00:59:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_rotAngle(int spriteId, int value) {
|
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 02:02:32 +00:00
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFRotated;
|
2005-02-21 02:02:32 +00:00
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
if (_spriteTable[spriteId].rot_angle != value) {
|
|
|
|
_spriteTable[spriteId].rot_angle = value;
|
2005-02-21 02:02:32 +00:00
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
if (_spriteTable[spriteId].res_id)
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-21 02:02:32 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-02-24 06:47:12 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_flag13(int spriteId, int value) {
|
2005-02-21 02:37:05 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 02:02:32 +00:00
|
|
|
|
2005-02-27 05:14:24 +00:00
|
|
|
int oldFlags = _spriteTable[spriteId].flags;
|
2005-02-21 02:02:32 +00:00
|
|
|
if (value)
|
2005-02-24 06:47:12 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSF13;
|
2005-02-21 02:02:32 +00:00
|
|
|
else
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags &= ~(kSF09 | kSF13);
|
2005-02-24 06:47:12 +00:00
|
|
|
|
2005-02-27 05:14:24 +00:00
|
|
|
if (_spriteTable[spriteId].res_id && _spriteTable[spriteId].flags != oldFlags)
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-21 02:02:32 +00:00
|
|
|
}
|
|
|
|
|
2005-02-24 06:47:12 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_flag14(int spriteId, int value) {
|
2005-02-21 02:37:05 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 02:02:32 +00:00
|
|
|
|
2005-02-27 05:14:24 +00:00
|
|
|
int oldFlags = _spriteTable[spriteId].flags;
|
2005-02-21 02:02:32 +00:00
|
|
|
if (value)
|
2005-02-24 06:47:12 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSF14;
|
2005-02-21 02:02:32 +00:00
|
|
|
else
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags &= ~(kSF09 | kSF14);
|
2005-02-21 02:02:32 +00:00
|
|
|
|
2005-02-27 05:14:24 +00:00
|
|
|
if (_spriteTable[spriteId].res_id && _spriteTable[spriteId].flags != oldFlags)
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-21 02:02:32 +00:00
|
|
|
}
|
|
|
|
|
2005-02-24 06:47:12 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_flag15(int spriteId, int value) {
|
2005-02-21 02:37:05 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 02:02:32 +00:00
|
|
|
|
2005-02-27 05:14:24 +00:00
|
|
|
int oldFlags = _spriteTable[spriteId].flags;
|
2005-02-21 02:02:32 +00:00
|
|
|
if (value)
|
2005-02-24 06:47:12 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSF15;
|
2005-02-21 02:02:32 +00:00
|
|
|
else
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags &= ~(kSF09 | kSF15);
|
2005-02-21 02:02:32 +00:00
|
|
|
|
2005-02-27 05:14:24 +00:00
|
|
|
if (_spriteTable[spriteId].res_id && _spriteTable[spriteId].flags != oldFlags)
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-21 02:02:32 +00:00
|
|
|
}
|
|
|
|
|
2005-02-24 21:05:29 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_flagActive(int spriteId, int value) {
|
2005-02-21 02:37:05 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 02:02:32 +00:00
|
|
|
|
|
|
|
if (value)
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFActive;
|
2005-02-21 02:02:32 +00:00
|
|
|
else
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags &= ~(kSF09 | kSFActive);
|
2005-02-21 02:02:32 +00:00
|
|
|
}
|
|
|
|
|
2005-02-24 06:47:12 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_flag20(int spriteId, int value) {
|
2005-02-21 02:37:05 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 02:02:32 +00:00
|
|
|
|
2005-02-27 05:14:24 +00:00
|
|
|
int oldFlags = _spriteTable[spriteId].flags;
|
2005-02-21 02:02:32 +00:00
|
|
|
if (value)
|
2005-02-24 06:47:12 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSF20;
|
2005-02-21 02:02:32 +00:00
|
|
|
else
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags &= ~(kSFChanged | kSF20);
|
2005-02-21 02:02:32 +00:00
|
|
|
|
2005-02-27 05:14:24 +00:00
|
|
|
if (_spriteTable[spriteId].res_id && _spriteTable[spriteId].flags != oldFlags)
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-21 02:02:32 +00:00
|
|
|
}
|
|
|
|
|
2005-02-24 23:11:50 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_flagYFlipped(int spriteId, int value) {
|
2005-02-21 02:37:05 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 02:02:32 +00:00
|
|
|
|
|
|
|
if (value)
|
2005-02-24 23:11:50 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFYFlipped;
|
2005-02-21 02:02:32 +00:00
|
|
|
else
|
2005-02-24 23:11:50 +00:00
|
|
|
_spriteTable[spriteId].flags &= ~(kSFChanged | kSFYFlipped);
|
2005-02-21 02:02:32 +00:00
|
|
|
}
|
|
|
|
|
2005-02-24 23:11:50 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_flagXFlipped(int spriteId, int value) {
|
2005-02-21 02:37:05 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 02:02:32 +00:00
|
|
|
|
|
|
|
if (value)
|
2005-02-24 23:11:50 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFXFlipped | kSFBlitDirectly;
|
2005-02-21 02:02:32 +00:00
|
|
|
else
|
2005-02-24 23:11:50 +00:00
|
|
|
_spriteTable[spriteId].flags &= ~(kSFChanged | kSFXFlipped | kSFBlitDirectly);
|
2005-02-21 02:02:32 +00:00
|
|
|
}
|
|
|
|
|
2005-02-26 11:05:13 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_flagHasImage(int spriteId, int value) {
|
2005-02-21 02:37:05 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 02:02:32 +00:00
|
|
|
|
|
|
|
// Note that condition is inverted
|
|
|
|
if (!value)
|
2005-02-26 11:05:13 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFImageless;
|
2005-02-21 02:02:32 +00:00
|
|
|
else
|
2005-02-26 11:05:13 +00:00
|
|
|
_spriteTable[spriteId].flags &= ~(kSFChanged | kSFImageless);
|
2005-02-21 02:02:32 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_field_78_64(int spriteId, int value) {
|
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 02:02:32 +00:00
|
|
|
|
2005-02-21 02:37:05 +00:00
|
|
|
_spriteTable[spriteId].field_78 = value;
|
|
|
|
_spriteTable[spriteId].field_64 = value;
|
2005-02-21 02:02:32 +00:00
|
|
|
}
|
|
|
|
|
2005-02-23 11:15:41 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_setClassFlags(int spriteId, int value) {
|
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
|
|
|
|
|
|
|
_spriteTable[spriteId].class_flags = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScummEngine_v90he::spriteInfoSet_setClassFlag(int spriteId, int classId, int toggle) {
|
2005-02-22 22:23:10 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
|
|
|
checkRange(32, 1, classId, "class %d out of range in statement");
|
|
|
|
|
|
|
|
if (toggle) {
|
2005-02-23 05:26:56 +00:00
|
|
|
_spriteTable[spriteId].class_flags |= 1 << (classId - 1);
|
2005-02-22 22:23:10 +00:00
|
|
|
} else {
|
2005-02-23 05:26:56 +00:00
|
|
|
_spriteTable[spriteId].class_flags &= ~(1 << (classId - 1));
|
2005-02-22 22:23:10 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-02-22 22:52:35 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_resetClassFlags(int spriteId) {
|
2005-02-22 22:23:10 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
|
|
|
|
|
|
|
_spriteTable[spriteId].class_flags = 0;
|
|
|
|
}
|
|
|
|
|
2005-02-23 09:55:34 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_field_88(int spriteId, int type, int value) {
|
2005-02-23 09:23:54 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
|
|
|
|
2005-02-23 09:55:34 +00:00
|
|
|
if (type == 0x7B) {
|
|
|
|
_spriteTable[spriteId].field_88 = value;
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-23 09:23:54 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-02-23 02:35:59 +00:00
|
|
|
void ScummEngine_v90he::spriteInfoSet_resetSprite(int spriteId) {
|
2005-02-21 02:37:05 +00:00
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
2005-02-21 00:59:50 +00:00
|
|
|
|
2005-02-23 02:35:59 +00:00
|
|
|
_spriteTable[spriteId].rot_angle = 0;
|
|
|
|
_spriteTable[spriteId].zoom = 0;
|
|
|
|
|
2005-02-24 00:48:24 +00:00
|
|
|
int tmp = 0;
|
2005-02-24 21:05:29 +00:00
|
|
|
spriteAddImageToList(spriteId, 1, &tmp);
|
2005-02-23 02:35:59 +00:00
|
|
|
|
|
|
|
_spriteTable[spriteId].field_54 = 0;
|
|
|
|
_spriteTable[spriteId].tx = 0;
|
|
|
|
_spriteTable[spriteId].ty = 0;
|
|
|
|
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags &= ~(kSF09 | kSF14 | kSF15);
|
|
|
|
_spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-23 02:35:59 +00:00
|
|
|
_spriteTable[spriteId].dx = 0;
|
|
|
|
_spriteTable[spriteId].dy = 0;
|
|
|
|
_spriteTable[spriteId].field_44 = 0;
|
|
|
|
_spriteTable[spriteId].group_num = 0;
|
|
|
|
_spriteTable[spriteId].field_78 = 0;
|
|
|
|
_spriteTable[spriteId].field_64 = 0;
|
|
|
|
_spriteTable[spriteId].class_flags = 0;
|
|
|
|
_spriteTable[spriteId].field_14 = 0;
|
|
|
|
_spriteTable[spriteId].field_7C = 0;
|
|
|
|
_spriteTable[spriteId].field_80 = 0;
|
2005-02-26 00:35:23 +00:00
|
|
|
// freddicove specific
|
|
|
|
//_spriteTable[spriteId].field_18 = 0;
|
2005-02-23 10:14:52 +00:00
|
|
|
_spriteTable[spriteId].field_88 = 0;
|
2005-02-21 00:59:50 +00:00
|
|
|
}
|
2005-02-21 00:02:44 +00:00
|
|
|
|
2005-02-24 21:05:29 +00:00
|
|
|
void ScummEngine_v90he::spriteAddImageToList(int spriteId, int imageNum, int *spriteIdptr) {
|
2005-02-23 03:18:49 +00:00
|
|
|
int listNum;
|
|
|
|
int *ptr;
|
2005-02-25 02:07:22 +00:00
|
|
|
int origResId, origResWizStates;
|
2005-02-23 03:18:49 +00:00
|
|
|
|
|
|
|
// XXX needs review
|
|
|
|
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
|
|
|
|
|
|
|
|
if (_spriteTable[spriteId].imglist_num) {
|
|
|
|
checkRange(_varMaxSprites, 1, _spriteTable[spriteId].imglist_num,
|
|
|
|
"Image list %d out of range");
|
|
|
|
_imageListStack[_curSprImageListNum++] = _spriteTable[spriteId].imglist_num - 1;
|
|
|
|
_spriteTable[spriteId].imglist_num = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
origResId = _spriteTable[spriteId].res_id;
|
2005-02-25 02:07:22 +00:00
|
|
|
origResWizStates = _spriteTable[spriteId].res_wiz_states;
|
2005-02-23 03:18:49 +00:00
|
|
|
|
2005-02-26 03:57:11 +00:00
|
|
|
if (imageNum == 1) {
|
2005-02-23 03:18:49 +00:00
|
|
|
_spriteTable[spriteId].res_id = *spriteIdptr;
|
2005-02-26 03:57:11 +00:00
|
|
|
} else {
|
|
|
|
// This section is currently never called
|
2005-02-23 03:18:49 +00:00
|
|
|
if (!_curSprImageListNum)
|
|
|
|
error("Out of image lists");
|
|
|
|
|
|
|
|
if (imageNum > 32)
|
|
|
|
error("Too many images in image list (%d)!", imageNum);
|
|
|
|
|
|
|
|
_curSprImageListNum--;
|
|
|
|
_spriteTable[spriteId].imglist_num = _imageListStack[_curSprImageListNum] + 1;
|
|
|
|
|
|
|
|
listNum = _spriteTable[spriteId].imglist_num;
|
|
|
|
|
|
|
|
checkRange(_varMaxSprites, 1, listNum, "Image list %d out of range");
|
|
|
|
|
|
|
|
_imageListTable[0x21 * listNum - 1] = imageNum;
|
|
|
|
|
|
|
|
ptr = spriteIdptr;
|
|
|
|
for (int i = 0; i < listNum; i++) {
|
|
|
|
_imageListTable[0x21 * listNum - 0x21 + i] = *ptr++;
|
|
|
|
}
|
|
|
|
_spriteTable[spriteId].res_id = *spriteIdptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
_spriteTable[spriteId].field_74 = 0;
|
|
|
|
_spriteTable[spriteId].res_state = 0;
|
|
|
|
|
|
|
|
if (_spriteTable[spriteId].res_id) {
|
|
|
|
_spriteTable[spriteId].res_wiz_states = getWizImageStates(_spriteTable[spriteId].res_id);
|
2005-02-24 23:11:50 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFActive | kSFYFlipped | kSFXFlipped | kSFBlitDirectly;
|
2005-02-23 03:18:49 +00:00
|
|
|
|
2005-02-28 04:34:22 +00:00
|
|
|
if (_spriteTable[spriteId].res_id != origResId || _spriteTable[spriteId].res_wiz_states != origResWizStates)
|
|
|
|
_spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-23 03:18:49 +00:00
|
|
|
} else {
|
2005-02-26 11:05:13 +00:00
|
|
|
_spriteTable[spriteId].flags &= ~(kSFImageless);
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[spriteId].flags |= kSFChanged | kSFBlitDirectly;
|
2005-02-23 03:18:49 +00:00
|
|
|
_spriteTable[spriteId].field_4C = 0;
|
2005-02-27 03:36:33 +00:00
|
|
|
_spriteTable[spriteId].cur_img_state = 0;
|
2005-02-23 03:18:49 +00:00
|
|
|
_spriteTable[spriteId].res_wiz_states = 0;
|
|
|
|
}
|
2005-02-21 00:02:44 +00:00
|
|
|
}
|
|
|
|
|
2005-02-23 01:08:29 +00:00
|
|
|
//
|
|
|
|
// spriteGroupSet functions
|
|
|
|
//
|
2005-02-23 04:35:20 +00:00
|
|
|
void ScummEngine_v90he::redrawSpriteGroup(int spriteGroupId) {
|
|
|
|
for (int i = 0; i < _numSpritesToProcess; ++i) {
|
|
|
|
SpriteInfo *spi = _activeSpritesTable[i];
|
|
|
|
if (spi->group_num == spriteGroupId) {
|
2005-02-24 21:05:29 +00:00
|
|
|
spi->flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-23 04:35:20 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-02-23 01:08:29 +00:00
|
|
|
void ScummEngine_v90he::spriteGroupSet_case0_0(int spriteGroupId, int value1, int value2) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-23 03:22:05 +00:00
|
|
|
|
|
|
|
for (int i = 1; i < _varNumSprites; i++) {
|
|
|
|
if (_spriteTable[i].group_num == spriteGroupId) {
|
|
|
|
_spriteTable[i].tx += value1;
|
|
|
|
_spriteTable[i].ty += value2;
|
|
|
|
|
|
|
|
if (value1 || value2)
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[i].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-23 03:22:05 +00:00
|
|
|
}
|
|
|
|
}
|
2005-02-23 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ScummEngine_v90he::spriteGroupSet_case0_1(int spriteGroupId, int value) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-23 03:22:05 +00:00
|
|
|
|
|
|
|
for (int i = 1; i < _varNumSprites; i++) {
|
|
|
|
if (_spriteTable[i].group_num == spriteGroupId)
|
|
|
|
_spriteTable[i].field_18 = value;
|
|
|
|
}
|
2005-02-23 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ScummEngine_v90he::spriteGroupSet_case0_2(int spriteGroupId, int value) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-23 03:22:05 +00:00
|
|
|
|
|
|
|
for (int i = 1; i < _varNumSprites; i++) {
|
|
|
|
if (_spriteTable[i].group_num == spriteGroupId) {
|
|
|
|
_spriteTable[i].group_num = value;
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[i].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-23 03:22:05 +00:00
|
|
|
}
|
|
|
|
}
|
2005-02-23 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ScummEngine_v90he::spriteGroupSet_case0_3(int spriteGroupId, int value) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-23 03:22:05 +00:00
|
|
|
|
|
|
|
for (int i = 1; i < _varNumSprites; i++) {
|
|
|
|
if (_spriteTable[i].group_num == spriteGroupId) {
|
|
|
|
if (value)
|
2005-02-24 23:11:50 +00:00
|
|
|
_spriteTable[i].flags |= kSFXFlipped | kSFBlitDirectly;
|
2005-02-23 03:22:05 +00:00
|
|
|
else
|
2005-02-24 23:11:50 +00:00
|
|
|
_spriteTable[i].flags &= ~(kSFChanged | kSFXFlipped | kSFBlitDirectly);
|
2005-02-23 03:22:05 +00:00
|
|
|
}
|
|
|
|
}
|
2005-02-23 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ScummEngine_v90he::spriteGroupSet_case0_4(int spriteGroupId) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-23 04:05:22 +00:00
|
|
|
|
|
|
|
for (int i = 1; i < _varNumSprites; i++) {
|
|
|
|
if (_spriteTable[i].group_num == spriteGroupId)
|
|
|
|
spriteInfoSet_resetSprite(i);
|
|
|
|
}
|
2005-02-23 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ScummEngine_v90he::spriteGroupSet_case0_5(int spriteGroupId, int value) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-23 03:22:05 +00:00
|
|
|
|
|
|
|
for (int i = 1; i < _varNumSprites; i++) {
|
|
|
|
if (_spriteTable[i].group_num == spriteGroupId) {
|
|
|
|
_spriteTable[i].field_78 = value;
|
|
|
|
_spriteTable[i].field_64 = value;
|
|
|
|
}
|
|
|
|
}
|
2005-02-23 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ScummEngine_v90he::spriteGroupSet_case0_6(int spriteGroupId, int value) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-23 03:22:05 +00:00
|
|
|
|
|
|
|
for (int i = 1; i < _varNumSprites; i++) {
|
|
|
|
if (_spriteTable[i].group_num == spriteGroupId) {
|
|
|
|
if (value)
|
2005-02-24 23:11:50 +00:00
|
|
|
_spriteTable[i].flags |= kSFYFlipped;
|
2005-02-23 03:22:05 +00:00
|
|
|
else
|
2005-02-24 23:11:50 +00:00
|
|
|
_spriteTable[i].flags &= ~(kSFChanged | kSFYFlipped);
|
2005-02-23 03:22:05 +00:00
|
|
|
}
|
|
|
|
}
|
2005-02-23 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ScummEngine_v90he::spriteGroupSet_case0_7(int spriteGroupId, int value) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-23 03:22:05 +00:00
|
|
|
|
|
|
|
for (int i = 1; i < _varNumSprites; i++) {
|
|
|
|
if (_spriteTable[i].group_num == spriteGroupId) {
|
|
|
|
_spriteTable[i].field_54 = value;
|
|
|
|
if (_spriteTable[i].res_id)
|
2005-02-24 21:05:29 +00:00
|
|
|
_spriteTable[i].flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-23 03:22:05 +00:00
|
|
|
}
|
|
|
|
}
|
2005-02-23 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
2005-02-28 04:17:17 +00:00
|
|
|
void ScummEngine_v90he::spriteGroupSet_bbox(int spriteGroupId, int x1, int y1, int x2, int y2) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-23 04:05:22 +00:00
|
|
|
|
2005-02-28 04:17:17 +00:00
|
|
|
_spriteGroups[spriteGroupId].flags |= kSGFClipBox;
|
|
|
|
_spriteGroups[spriteGroupId].bbox.left = x1;
|
|
|
|
_spriteGroups[spriteGroupId].bbox.top = y1;
|
|
|
|
_spriteGroups[spriteGroupId].bbox.right = x2;
|
|
|
|
_spriteGroups[spriteGroupId].bbox.bottom = y2;
|
2005-02-23 04:05:22 +00:00
|
|
|
|
2005-02-23 04:35:20 +00:00
|
|
|
redrawSpriteGroup(spriteGroupId);
|
2005-02-23 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
2005-02-28 04:17:17 +00:00
|
|
|
void ScummEngine_v90he::spriteGroupSet_zorderPriority(int spriteGroupId, int value) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-23 04:05:22 +00:00
|
|
|
|
2005-02-28 04:34:22 +00:00
|
|
|
if (_spriteGroups[spriteGroupId].zorderPriority != value) {
|
|
|
|
_spriteGroups[spriteGroupId].zorderPriority = value;
|
|
|
|
redrawSpriteGroup(spriteGroupId);
|
|
|
|
}
|
2005-02-23 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
2005-02-28 04:17:17 +00:00
|
|
|
void ScummEngine_v90he::spriteGroupSet_tx_ty(int spriteGroupId, int value1, int value2) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-23 04:05:22 +00:00
|
|
|
|
2005-02-28 04:34:22 +00:00
|
|
|
if (_spriteGroups[spriteGroupId].tx != value1 || _spriteGroups[spriteGroupId].ty != value2) {
|
|
|
|
_spriteGroups[spriteGroupId].tx = value1;
|
|
|
|
_spriteGroups[spriteGroupId].ty = value2;
|
|
|
|
redrawSpriteGroup(spriteGroupId);
|
|
|
|
}
|
2005-02-23 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
2005-02-28 04:17:17 +00:00
|
|
|
void ScummEngine_v90he::spriteGroupSet_inc_tx_ty(int spriteGroupId, int value1, int value2) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-23 04:05:22 +00:00
|
|
|
|
2005-02-28 04:17:17 +00:00
|
|
|
_spriteGroups[spriteGroupId].tx += value1;
|
|
|
|
_spriteGroups[spriteGroupId].ty += value2;
|
2005-02-23 04:05:22 +00:00
|
|
|
|
2005-02-23 04:35:20 +00:00
|
|
|
redrawSpriteGroup(spriteGroupId);
|
2005-02-23 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
2005-02-28 04:17:17 +00:00
|
|
|
void ScummEngine_v90he::spriteGroupSet_field_20(int spriteGroupId, int value) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-23 03:22:05 +00:00
|
|
|
|
2005-02-28 04:34:22 +00:00
|
|
|
if (_spriteGroups[spriteGroupId].field_20 != value) {
|
|
|
|
_spriteGroups[spriteGroupId].field_20 = value;
|
|
|
|
redrawSpriteGroup(spriteGroupId);
|
|
|
|
}
|
2005-02-23 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
2005-02-28 04:34:22 +00:00
|
|
|
void ScummEngine_v90he::spriteGroupSet_scaling(int spriteGroupId) {
|
2005-02-28 04:17:17 +00:00
|
|
|
if ((_spriteGroups[spriteGroupId].scale_x_ratio_mul != _spriteGroups[spriteGroupId].scale_x_ratio_div) || (_spriteGroups[spriteGroupId].scale_y_ratio_mul != _spriteGroups[spriteGroupId].scale_y_ratio_div))
|
|
|
|
_spriteGroups[spriteGroupId].scaling = 1;
|
|
|
|
else
|
|
|
|
_spriteGroups[spriteGroupId].scaling = 0;
|
2005-02-23 03:22:05 +00:00
|
|
|
|
2005-02-23 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
2005-02-28 04:34:22 +00:00
|
|
|
void ScummEngine_v90he::spriteGroupSet_scale_x_ratio_mul(int spriteGroupId, int value) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-23 03:22:05 +00:00
|
|
|
|
2005-02-28 04:34:22 +00:00
|
|
|
if (_spriteGroups[spriteGroupId].scale_x_ratio_mul != value) {
|
|
|
|
_spriteGroups[spriteGroupId].scale_x_ratio_mul = value;
|
|
|
|
_spriteGroups[spriteGroupId].scale_x = _spriteGroups[spriteGroupId].scale_x_ratio_mul / _spriteGroups[spriteGroupId].scale_x_ratio_div;
|
2005-02-28 04:35:26 +00:00
|
|
|
|
2005-02-28 04:34:22 +00:00
|
|
|
spriteGroupSet_scaling(spriteGroupId);
|
|
|
|
redrawSpriteGroup(spriteGroupId);
|
|
|
|
}
|
|
|
|
}
|
2005-02-23 03:22:05 +00:00
|
|
|
|
2005-02-28 04:34:22 +00:00
|
|
|
void ScummEngine_v90he::spriteGroupSet_scale_x_ratio_div(int spriteGroupId, int value) {
|
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-28 04:17:17 +00:00
|
|
|
|
2005-02-28 04:34:22 +00:00
|
|
|
if (_spriteGroups[spriteGroupId].scale_x_ratio_div != value) {
|
|
|
|
_spriteGroups[spriteGroupId].scale_x_ratio_div = value;
|
|
|
|
_spriteGroups[spriteGroupId].scale_x = _spriteGroups[spriteGroupId].scale_x_ratio_mul / _spriteGroups[spriteGroupId].scale_x_ratio_div;
|
2005-02-23 03:22:05 +00:00
|
|
|
|
2005-02-28 04:34:22 +00:00
|
|
|
spriteGroupSet_scaling(spriteGroupId);
|
|
|
|
redrawSpriteGroup(spriteGroupId);
|
|
|
|
}
|
2005-02-23 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
2005-02-28 04:17:17 +00:00
|
|
|
void ScummEngine_v90he::spriteGroupSet_scale_y_ratio_mul(int spriteGroupId, int value) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-23 03:22:05 +00:00
|
|
|
|
2005-02-28 04:34:22 +00:00
|
|
|
if (_spriteGroups[spriteGroupId].scale_y_ratio_mul != value) {
|
|
|
|
_spriteGroups[spriteGroupId].scale_y_ratio_mul = value;
|
|
|
|
_spriteGroups[spriteGroupId].scale_y = _spriteGroups[spriteGroupId].scale_y_ratio_mul / _spriteGroups[spriteGroupId].scale_y_ratio_div;
|
2005-02-23 03:22:05 +00:00
|
|
|
|
2005-02-28 04:34:22 +00:00
|
|
|
spriteGroupSet_scaling(spriteGroupId);
|
|
|
|
redrawSpriteGroup(spriteGroupId);
|
|
|
|
}
|
2005-02-23 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
2005-02-28 04:17:17 +00:00
|
|
|
void ScummEngine_v90he::spriteGroupSet_scale_y_ratio_div(int spriteGroupId, int value) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-23 03:22:05 +00:00
|
|
|
|
2005-02-28 04:34:22 +00:00
|
|
|
if (_spriteGroups[spriteGroupId].scale_y_ratio_div != value) {
|
|
|
|
_spriteGroups[spriteGroupId].scale_y_ratio_div = value;
|
|
|
|
_spriteGroups[spriteGroupId].scale_y = _spriteGroups[spriteGroupId].scale_y_ratio_mul / _spriteGroups[spriteGroupId].scale_y_ratio_div;
|
2005-02-23 03:22:05 +00:00
|
|
|
|
2005-02-28 04:34:22 +00:00
|
|
|
spriteGroupSet_scaling(spriteGroupId);
|
|
|
|
redrawSpriteGroup(spriteGroupId);
|
|
|
|
}
|
2005-02-23 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
2005-02-28 04:17:17 +00:00
|
|
|
void ScummEngine_v90he::spriteGroupSet_flagNeedRedrawAnd(int spriteGroupId) {
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-23 03:22:05 +00:00
|
|
|
|
2005-02-26 11:22:00 +00:00
|
|
|
_spriteGroups[spriteGroupId].flags &= ~(kSGFNeedRedraw);
|
2005-02-23 03:22:05 +00:00
|
|
|
|
2005-02-23 04:35:20 +00:00
|
|
|
redrawSpriteGroup(spriteGroupId);
|
2005-02-23 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
2005-02-22 21:38:44 +00:00
|
|
|
void ScummEngine_v90he::spritesAllocTables(int numSprites, int numGroups, int numMaxSprites) {
|
2005-02-20 22:16:31 +00:00
|
|
|
_varNumSpriteGroups = numGroups;
|
|
|
|
_numSpritesToProcess = 0;
|
|
|
|
_varNumSprites = numSprites;
|
2005-02-22 21:38:44 +00:00
|
|
|
_varMaxSprites = numMaxSprites;
|
2005-02-20 22:16:31 +00:00
|
|
|
_spriteGroups = (SpriteGroup *)malloc((_varNumSpriteGroups + 1) * sizeof(SpriteGroup));
|
|
|
|
_spriteTable = (SpriteInfo *)malloc((_varNumSprites + 1) * sizeof(SpriteInfo));
|
|
|
|
_activeSpritesTable = (SpriteInfo **)malloc((_varNumSprites + 1) * sizeof(SpriteInfo *));
|
2005-02-22 21:38:44 +00:00
|
|
|
_imageListTable = (uint16 *)malloc((_varMaxSprites + 1) * sizeof(uint16) * 2 + 1);
|
|
|
|
_imageListStack = (uint16 *)malloc((_varMaxSprites + 1) * sizeof(uint16));
|
2005-02-20 22:16:31 +00:00
|
|
|
}
|
|
|
|
|
2005-02-26 04:20:47 +00:00
|
|
|
void ScummEngine_v90he::spritesResetGroup(int spriteGroupId) {
|
|
|
|
SpriteGroup *spg = &_spriteGroups[spriteGroupId];
|
2005-02-27 06:07:09 +00:00
|
|
|
checkRange(_varNumSpriteGroups, 1, spriteGroupId, "Invalid sprite group %d");
|
2005-02-27 06:01:11 +00:00
|
|
|
|
|
|
|
spg->zorderPriority = 0;
|
|
|
|
spg->tx = spg->ty = 0;
|
|
|
|
|
|
|
|
spg->flags &= ~kSGFNeedRedraw;
|
|
|
|
redrawSpriteGroup(spriteGroupId);
|
|
|
|
|
|
|
|
spg->field_20 = 0;
|
2005-02-26 04:20:47 +00:00
|
|
|
spg->scaling = 0;
|
|
|
|
spg->scale_x = 0x3F800000;
|
2005-02-27 06:01:11 +00:00
|
|
|
spg->scale_x_ratio_mul = 1;
|
|
|
|
spg->scale_x_ratio_div = 1;
|
2005-02-26 04:20:47 +00:00
|
|
|
spg->scale_y = 0x3F800000;
|
2005-02-27 06:01:11 +00:00
|
|
|
spg->scale_y_ratio_mul = 1;
|
|
|
|
spg->scale_y_ratio_div = 1;
|
2005-02-23 04:35:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ScummEngine_v90he::spritesResetTables(bool refreshScreen) {
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < _varMaxSprites; ++i) {
|
|
|
|
_imageListStack[i] = i;
|
|
|
|
}
|
|
|
|
memset(_spriteTable, 0, (_varNumSprites + 1) * sizeof(SpriteInfo));
|
|
|
|
memset(_spriteGroups, 0, (_varNumSpriteGroups + 1) * sizeof(SpriteGroup));
|
2005-02-26 04:20:47 +00:00
|
|
|
for (int curGrp = 1; curGrp < _varNumSpriteGroups; ++curGrp)
|
|
|
|
spritesResetGroup(curGrp);
|
|
|
|
|
2005-02-20 22:16:31 +00:00
|
|
|
if (refreshScreen) {
|
|
|
|
gdi.copyVirtScreenBuffers(Common::Rect(_screenWidth, _screenHeight));
|
|
|
|
}
|
|
|
|
_numSpritesToProcess = 0;
|
|
|
|
}
|
|
|
|
|
2005-02-22 01:16:41 +00:00
|
|
|
void ScummEngine_v90he::spritesBlitToScreen() {
|
|
|
|
int xmin, xmax, ymin, ymax;
|
|
|
|
xmin = ymin = 1234;
|
|
|
|
xmax = ymax = -1234;
|
|
|
|
bool firstLoop = true;
|
|
|
|
bool refreshScreen = false;
|
2005-02-24 05:11:37 +00:00
|
|
|
|
2005-02-22 01:16:41 +00:00
|
|
|
for (int i = 0; i < _numSpritesToProcess; ++i) {
|
|
|
|
SpriteInfo *spi = _activeSpritesTable[i];
|
2005-02-26 11:05:13 +00:00
|
|
|
if (!(spi->flags & kSFImageless) && (spi->flags & kSFChanged)) {
|
2005-02-24 21:05:29 +00:00
|
|
|
spi->flags &= ~kSFChanged;
|
2005-02-24 04:04:17 +00:00
|
|
|
if (spi->bbox.left <= spi->bbox.right && spi->bbox.top <= spi->bbox.bottom) {
|
2005-02-22 01:23:15 +00:00
|
|
|
if (spi->flags & kSFBlitDirectly) {
|
2005-02-24 04:04:17 +00:00
|
|
|
gdi.copyVirtScreenBuffers(spi->bbox); // XXX 0, 0x40000000);
|
2005-02-26 10:02:22 +00:00
|
|
|
} else if (firstLoop) {
|
2005-02-24 04:04:17 +00:00
|
|
|
xmin = spi->bbox.left;
|
|
|
|
ymin = spi->bbox.top;
|
|
|
|
xmax = spi->bbox.right;
|
|
|
|
ymax = spi->bbox.bottom;
|
2005-02-26 10:02:22 +00:00
|
|
|
firstLoop = false;
|
|
|
|
refreshScreen = true;
|
|
|
|
} else {
|
|
|
|
if (xmin < spi->bbox.left) {
|
|
|
|
xmin = spi->bbox.left;
|
|
|
|
}
|
|
|
|
if (ymin < spi->bbox.top) {
|
|
|
|
ymin = spi->bbox.top;
|
|
|
|
}
|
|
|
|
if (xmax > spi->bbox.right) {
|
|
|
|
xmax = spi->bbox.right;
|
|
|
|
}
|
|
|
|
if (ymax > spi->bbox.bottom) {
|
|
|
|
ymax = spi->bbox.bottom;
|
|
|
|
}
|
|
|
|
refreshScreen = true;
|
2005-02-22 01:16:41 +00:00
|
|
|
}
|
|
|
|
}
|
2005-02-26 03:57:11 +00:00
|
|
|
if (!(spi->flags & (kSFNeedRedraw | kSF30)) && spi->res_id) {
|
2005-02-22 01:23:15 +00:00
|
|
|
spi->flags |= kSFNeedRedraw;
|
2005-02-22 01:16:41 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (refreshScreen) {
|
|
|
|
gdi.copyVirtScreenBuffers(Common::Rect(xmin, ymin, xmax, ymax)); // , 0, 0x40000000);
|
|
|
|
}
|
2005-02-20 22:16:31 +00:00
|
|
|
}
|
|
|
|
|
2005-02-22 21:38:44 +00:00
|
|
|
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))) {
|
2005-02-24 23:11:50 +00:00
|
|
|
if ((!unkFlag || spi->field_18 >= 0) && (spi->flags & kSFXFlipped)) {
|
2005-02-22 21:38:44 +00:00
|
|
|
bool needRedraw = false;
|
2005-02-24 04:04:17 +00:00
|
|
|
int lp = MIN(79, spi->bbox.left / 8);
|
|
|
|
int rp = MIN(79, (spi->bbox.right + 7) / 8);
|
2005-02-22 21:38:44 +00:00
|
|
|
for (; lp <= rp; ++lp) {
|
2005-02-24 04:04:17 +00:00
|
|
|
if (vs0->tdirty[lp] < vs0->h && spi->bbox.bottom >= vs0->bdirty[lp] && spi->bbox.top <= vs0->tdirty[lp]) {
|
2005-02-22 21:38:44 +00:00
|
|
|
needRedraw = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (needRedraw) {
|
|
|
|
spi->flags |= kSFNeedRedraw;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScummEngine_v90he::spritesUpdateImages() {
|
|
|
|
for (int i = 0; i < _numSpritesToProcess; ++i) {
|
|
|
|
SpriteInfo *spi = _activeSpritesTable[i];
|
2005-02-27 06:01:11 +00:00
|
|
|
if (spi->dx || spi->dy) {
|
2005-02-22 21:38:44 +00:00
|
|
|
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) {
|
2005-02-24 21:05:29 +00:00
|
|
|
spi->flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-22 21:38:44 +00:00
|
|
|
}
|
|
|
|
}
|
2005-02-24 23:11:50 +00:00
|
|
|
if (spi->flags & kSFYFlipped) {
|
2005-02-27 06:01:11 +00:00
|
|
|
if (spi->field_78) {
|
2005-02-22 21:38:44 +00:00
|
|
|
--spi->field_64;
|
2005-02-26 03:57:11 +00:00
|
|
|
if (spi->field_64)
|
2005-02-22 21:38:44 +00:00
|
|
|
continue;
|
2005-02-26 03:57:11 +00:00
|
|
|
|
2005-02-22 21:38:44 +00:00
|
|
|
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;
|
2005-02-27 06:01:11 +00:00
|
|
|
if (spi->imglist_num) {
|
2005-02-22 21:38:44 +00:00
|
|
|
if (!(spi->flags & kSF25)) {
|
|
|
|
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;
|
2005-02-26 03:57:11 +00:00
|
|
|
if (img2 >= img1)
|
2005-02-22 21:38:44 +00:00
|
|
|
img2 = 0;
|
2005-02-26 03:57:11 +00:00
|
|
|
|
2005-02-22 21:38:44 +00:00
|
|
|
if (spi->field_74 != img2) {
|
|
|
|
spi->field_74 = img2;
|
|
|
|
spi->res_id = _imageListTable[0x21 * (img2 - 1)];
|
2005-02-24 21:05:29 +00:00
|
|
|
spi->flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-22 21:38:44 +00:00
|
|
|
spi->res_wiz_states = getWizImageStates(spi->res_id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
continue;
|
|
|
|
} else if (state == 0) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
2005-02-24 21:05:29 +00:00
|
|
|
spi->flags |= kSFChanged | kSFNeedRedraw;
|
2005-02-22 21:38:44 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-02-23 23:28:53 +00:00
|
|
|
static int compareSprTable(const void *a, const void *b) {
|
|
|
|
const SpriteInfo *spr1 = *(const SpriteInfo *const*)a;
|
|
|
|
const SpriteInfo *spr2 = *(const SpriteInfo *const*)b;
|
|
|
|
|
2005-02-26 11:22:00 +00:00
|
|
|
if (spr1->zorder > spr2->zorder)
|
2005-02-23 23:28:53 +00:00
|
|
|
return 1;
|
|
|
|
|
2005-02-26 11:22:00 +00:00
|
|
|
if (spr1->zorder < spr2->zorder)
|
2005-02-23 23:28:53 +00:00
|
|
|
return -1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScummEngine_v90he::spritesSortActiveSprites() {
|
2005-02-26 11:22:00 +00:00
|
|
|
int groupZorder;
|
2005-02-23 23:28:53 +00:00
|
|
|
|
|
|
|
_numSpritesToProcess = 0;
|
|
|
|
|
|
|
|
if (_varNumSprites <= 1)
|
|
|
|
return;
|
|
|
|
|
|
|
|
for (int i = 1; i < _varNumSprites; i++) {
|
|
|
|
SpriteInfo *spi = &_spriteTable[i];
|
|
|
|
|
2005-02-24 21:05:29 +00:00
|
|
|
if (spi->flags & kSFActive) {
|
2005-02-26 12:48:51 +00:00
|
|
|
if (!(spi->flags & kSFXFlipped)) {
|
2005-02-24 08:00:30 +00:00
|
|
|
if (!(spi->flags & kSF30))
|
2005-02-23 23:28:53 +00:00
|
|
|
spi->flags |= kSFNeedRedraw;
|
2005-02-26 11:05:13 +00:00
|
|
|
if (!(spi->flags & kSFImageless))
|
2005-02-24 21:05:29 +00:00
|
|
|
spi->flags |= kSFChanged;
|
2005-02-23 23:28:53 +00:00
|
|
|
}
|
|
|
|
if (spi->group_num)
|
2005-02-26 11:22:00 +00:00
|
|
|
groupZorder = _spriteGroups[spi->group_num].zorderPriority;
|
2005-02-23 23:28:53 +00:00
|
|
|
else
|
2005-02-26 11:22:00 +00:00
|
|
|
groupZorder = 0;
|
2005-02-23 23:28:53 +00:00
|
|
|
|
2005-02-26 11:22:00 +00:00
|
|
|
spi->zorder = spi->field_18 + groupZorder;
|
2005-02-23 23:28:53 +00:00
|
|
|
|
|
|
|
_activeSpritesTable[_numSpritesToProcess++] = spi;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_numSpritesToProcess < 2)
|
|
|
|
return;
|
|
|
|
|
|
|
|
qsort(_activeSpritesTable, _numSpritesToProcess, sizeof(SpriteInfo *), compareSprTable);
|
|
|
|
}
|
|
|
|
|
2005-02-24 04:04:17 +00:00
|
|
|
void ScummEngine_v90he::spritesProcessWiz(bool arg) {
|
2005-02-25 01:20:46 +00:00
|
|
|
int spr_flags;
|
2005-02-24 04:04:17 +00:00
|
|
|
int16 spr_wiz_x, spr_wiz_y;
|
|
|
|
int res_id, res_state;
|
|
|
|
Common::Rect *bboxPtr;
|
|
|
|
int rot_angle, zoom;
|
2005-02-25 20:15:01 +00:00
|
|
|
int32 w, h;
|
2005-02-24 04:04:17 +00:00
|
|
|
WizParameters wiz;
|
|
|
|
|
|
|
|
for (int i = 0; i < _numSpritesToProcess; i++) {
|
|
|
|
SpriteInfo *spi = _activeSpritesTable[i];
|
|
|
|
|
2005-02-24 11:22:05 +00:00
|
|
|
if (!(spi->flags & kSFNeedRedraw))
|
|
|
|
continue;
|
2005-02-24 04:04:17 +00:00
|
|
|
|
|
|
|
spr_flags = spi->flags;
|
|
|
|
|
|
|
|
if (arg) {
|
2005-02-26 11:22:00 +00:00
|
|
|
if (spi->zorder >= 0)
|
2005-02-26 00:35:23 +00:00
|
|
|
return;
|
2005-02-24 04:04:17 +00:00
|
|
|
} else {
|
2005-02-26 11:22:00 +00:00
|
|
|
if (spi->zorder < 0)
|
2005-02-26 00:35:23 +00:00
|
|
|
continue;
|
2005-02-24 04:04:17 +00:00
|
|
|
}
|
|
|
|
|
2005-02-24 21:05:29 +00:00
|
|
|
spi->flags &= ~(kSFChanged | kSFNeedRedraw);
|
2005-02-24 04:04:17 +00:00
|
|
|
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;
|
|
|
|
}
|
2005-02-24 05:11:37 +00:00
|
|
|
|
2005-02-27 03:36:33 +00:00
|
|
|
spi->cur_img_state = wiz.img.state = res_state;
|
2005-02-24 04:04:17 +00:00
|
|
|
spi->field_4C = wiz.img.resNum = res_id;
|
2005-02-24 20:20:35 +00:00
|
|
|
wiz.processFlags = kWPFNewState | kWPFSetPos;
|
2005-02-24 04:04:17 +00:00
|
|
|
spi->field_68 = spi->rot_angle;
|
|
|
|
spi->field_6C = spi->zoom;
|
2005-02-27 03:36:33 +00:00
|
|
|
spi->pos.x = wiz.img.x1;
|
|
|
|
spi->pos.y = wiz.img.y1;
|
2005-02-24 04:04:17 +00:00
|
|
|
bboxPtr = &spi->bbox;
|
|
|
|
if (res_id) {
|
|
|
|
rot_angle = spi->rot_angle;
|
|
|
|
zoom = spi->zoom;
|
|
|
|
getWizImageDim(res_id, res_state, w, h);
|
2005-02-25 01:20:46 +00:00
|
|
|
if (!(spi->flags & kSFZoomed) && !(spi->flags & kSFRotated)) {
|
2005-02-24 04:04:17 +00:00
|
|
|
bboxPtr->left = wiz.img.x1;
|
|
|
|
bboxPtr->top = wiz.img.y1;
|
2005-02-25 01:15:16 +00:00
|
|
|
bboxPtr->right = wiz.img.x1 + w;
|
|
|
|
bboxPtr->bottom = wiz.img.y1 + h;
|
2005-02-24 04:04:17 +00:00
|
|
|
} else {
|
2005-02-25 01:15:16 +00:00
|
|
|
Common::Point pts[4];
|
|
|
|
|
|
|
|
pts[1].x = pts[2].x = w / 2 - 1;
|
|
|
|
pts[0].x = pts[0].y = pts[1].y = pts[3].x = -w / 2;
|
|
|
|
pts[2].y = pts[3].y = h / 2 - 1;
|
|
|
|
|
2005-02-25 23:37:25 +00:00
|
|
|
if (spi->flags & kSFZoomed && zoom) {
|
2005-02-25 01:15:16 +00:00
|
|
|
for (int j = 0; j < 4; ++j) {
|
|
|
|
pts[j].x = pts[i].x * zoom / 256;
|
|
|
|
pts[j].y = pts[i].y * zoom / 256;
|
|
|
|
}
|
|
|
|
}
|
2005-02-25 23:37:25 +00:00
|
|
|
if (spi->flags & kSFRotated && rot_angle)
|
2005-02-25 11:23:27 +00:00
|
|
|
_wiz.polygonRotatePoints(pts, 4, rot_angle);
|
2005-02-25 01:15:16 +00:00
|
|
|
|
|
|
|
for (int j = 0; j < 4; ++j) {
|
|
|
|
pts[j].x += wiz.img.x1;
|
|
|
|
pts[j].y += wiz.img.y1;
|
|
|
|
}
|
|
|
|
|
2005-02-25 11:23:27 +00:00
|
|
|
_wiz.polygonCalcBoundBox(pts, 4, spi->bbox);
|
2005-02-24 04:04:17 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
bboxPtr->left = 1234;
|
|
|
|
bboxPtr->top = 1234;
|
|
|
|
bboxPtr->right = -1234;
|
|
|
|
bboxPtr->bottom = -1234;
|
|
|
|
}
|
|
|
|
|
|
|
|
wiz.img.flags = 0x10;
|
2005-02-24 23:11:50 +00:00
|
|
|
if (spr_flags & kSFXFlipped)
|
2005-02-24 20:20:35 +00:00
|
|
|
wiz.img.flags |= kWIFFlipX;
|
2005-02-24 23:11:50 +00:00
|
|
|
if (spr_flags & kSFYFlipped)
|
2005-02-24 20:20:35 +00:00
|
|
|
wiz.img.flags |= kWIFFlipY;
|
2005-02-24 04:04:17 +00:00
|
|
|
if (spr_flags & kSF21) {
|
|
|
|
wiz.img.flags &= ~(0x11);
|
2005-02-24 20:20:35 +00:00
|
|
|
wiz.img.flags |= kWIFBlitToFrontVideoBuffer;
|
2005-02-24 04:04:17 +00:00
|
|
|
}
|
|
|
|
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;
|
2005-02-25 11:45:25 +00:00
|
|
|
wiz.unk_178 = spi->field_7C;
|
2005-02-24 04:04:17 +00:00
|
|
|
}
|
2005-02-24 20:20:35 +00:00
|
|
|
wiz.processFlags |= kWPFNewFlags;
|
2005-02-24 04:04:17 +00:00
|
|
|
|
|
|
|
if (spr_flags & kSFRotated) {
|
2005-02-24 20:20:35 +00:00
|
|
|
wiz.processFlags |= kWPFRotate;
|
2005-02-24 04:04:17 +00:00
|
|
|
wiz.angle = spi->rot_angle;
|
|
|
|
}
|
|
|
|
if (spr_flags & kSFZoomed) {
|
2005-02-24 20:20:35 +00:00
|
|
|
wiz.processFlags |= kWPFZoom;
|
2005-02-24 04:04:17 +00:00
|
|
|
wiz.zoom = spi->zoom;
|
|
|
|
}
|
|
|
|
spi->imgFlags = wiz.img.flags;
|
|
|
|
|
2005-02-26 11:22:00 +00:00
|
|
|
if (spi->group_num && (_spriteGroups[spi->group_num].flags & kSGFClipBox)) {
|
2005-02-25 01:15:16 +00:00
|
|
|
if (spi->bbox.intersects(_spriteGroups[spi->group_num].bbox)) {
|
|
|
|
spi->bbox.clip(_spriteGroups[spi->group_num].bbox);
|
2005-02-27 03:36:33 +00:00
|
|
|
wiz.processFlags |= kWPFClipBox;
|
2005-02-24 23:28:56 +00:00
|
|
|
wiz.box = spi->bbox;
|
|
|
|
} else {
|
|
|
|
bboxPtr->left = 1234;
|
|
|
|
bboxPtr->top = 1234;
|
|
|
|
bboxPtr->right = -1234;
|
|
|
|
bboxPtr->bottom = -1234;
|
|
|
|
continue;
|
|
|
|
}
|
2005-02-24 04:04:17 +00:00
|
|
|
}
|
|
|
|
if (spi->field_14) {
|
|
|
|
wiz.processFlags |= 0x8000;
|
2005-02-25 11:45:25 +00:00
|
|
|
wiz.unk_174 = spi->field_14;
|
2005-02-24 04:04:17 +00:00
|
|
|
}
|
|
|
|
if (spi->res_id && spi->group_num && _spriteGroups[spi->group_num].field_20) {
|
|
|
|
wiz.processFlags |= 0x1000;
|
2005-02-25 11:45:25 +00:00
|
|
|
wiz.unk_380 = _spriteGroups[spi->group_num].field_20;
|
2005-02-24 04:04:17 +00:00
|
|
|
}
|
|
|
|
displayWizComplexImage(&wiz);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-02-20 10:56:59 +00:00
|
|
|
} // End of namespace Scumm
|