FULLPIPE: More *AtPos functions

This commit is contained in:
Eugene Sandulenko 2013-08-28 10:50:03 +03:00
parent 0daaadc604
commit 7154d1f2cd
5 changed files with 96 additions and 2 deletions

View File

@ -616,6 +616,27 @@ bool Picture::isPixelHitAtPos(int x, int y) {
return _bitmap->isPixelHitAtPos(x, y);
}
int Picture::getPixelAtPos(int x, int y) {
return getPixelAtPosEx(x / g_fullpipe->_pictureScale, y / g_fullpipe->_pictureScale);
return false;
}
int Picture::getPixelAtPosEx(int x, int y) {
#if 0
if (x < 0 || y < 0)
return 0;
v5 = ictureScale + this->width - 1;
if ( x < v5 / g_fullpipe->_pictureScale
&& (v6 = g_fullpipe->_pictureScale + this_->height - 1, y < v6 / (unsigned __int16)getPictureScale())
&& (v7 = this_->memoryObject2) != 0
&& (v8 = v7->rows) != 0 )
return = *(_WORD *)&v8[x][2 * y];
#endif
return 0;
}
bool Bitmap::isPixelHitAtPos(int x, int y) {
debug(0, "STUB: Bitmap::isPixelHitAtPos(%d, %d)", x, y);

View File

@ -106,6 +106,8 @@ class Picture : public MemoryObject {
Common::Point *getDimensions(Common::Point *p);
bool isPointInside(int x, int y);
bool isPixelHitAtPos(int x, int y);
int getPixelAtPos(int x, int y);
int getPixelAtPosEx(int x, int y);
byte *getPaletteData() { return _paletteData; }
void setPaletteData(byte *pal);

View File

@ -477,9 +477,19 @@ void Scene::updateScrolling2() {
}
StaticANIObject *Scene::getStaticANIObjectAtPos(int x, int y) {
warning("STUB: Scene::getStaticANIObjectAtPos(%d, %d)", x, y);
StaticANIObject *res = 0;
return 0;
for (uint i = 0; i < _staticANIObjectList1.size(); i++) {
StaticANIObject *p = (StaticANIObject *)_staticANIObjectList1[i];
int pixel;
if ((p->_field_8 & 1) && (p->_flags & 4) &&
p->getPixelAtPos(x, y, &pixel) &&
(!res || res->_priority >= p->_priority))
res = p;
}
return res;
}
PictureObject *Scene::getPictureObjectAtPos(int x, int y) {

View File

@ -321,6 +321,65 @@ Movement *StaticANIObject::getMovementByName(char *name) {
return 0;
}
bool StaticANIObject::getPixelAtPos(int x, int y, int *pixel) {
bool res = false;
Picture *pic;
if (_movement)
pic = _movement->_currDynamicPhase;
else
pic = _statics;
if (!pic)
return false;
int ongoing;
int xani, yani;
int oxani, oyani;
Common::Point point;
if (_movement)
ongoing = _movement->_currMovement != 0;
else
ongoing = _statics->_staticsId & 0x4000;
if (_movement) {
_movement->getCurrDynamicPhaseXY(point);
xani = point.x;
yani = point.y;
oxani = _movement->_ox;
oyani = _movement->_oy;
} else {
_statics->getSomeXY(point);
xani = point.x;
yani = point.y;
oxani = _ox;
oyani = _oy;
}
int xtarget = x - (oxani - xani);
int ytarget = y - (oyani - yani);
if (ongoing && _movement)
xtarget = pic->getDimensions(&point)->x - xtarget;
x = pic->_x;
y = pic->_y;
pic->_x = 0;
pic->_y = 0;
if (pic->isPixelHitAtPos(xtarget, ytarget)) {
*pixel = pic->getPixelAtPos(xtarget, ytarget);
res = true;
} else {
res = false;
}
pic->_x = x;
pic->_y = y;
return res;
}
void Movement::draw(bool flipFlag, int angle) {
debug(3, "Movement::draw(%d, %d)", flipFlag, angle);

View File

@ -230,6 +230,8 @@ class StaticANIObject : public GameObject {
MessageQueue *changeStatics1(int msgNum);
void changeStatics2(int objId);
bool getPixelAtPos(int x, int y, int *pixel);
};
struct MovTable {