diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp index 3384b878150..b43ea9706de 100644 --- a/engines/fullpipe/gfx.cpp +++ b/engines/fullpipe/gfx.cpp @@ -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); diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h index feb560c06f0..640b8886369 100644 --- a/engines/fullpipe/gfx.h +++ b/engines/fullpipe/gfx.h @@ -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); diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp index 25d70770f07..47a68118df7 100644 --- a/engines/fullpipe/scene.cpp +++ b/engines/fullpipe/scene.cpp @@ -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) { diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp index 53111e82d47..7e4c1397ac1 100644 --- a/engines/fullpipe/statics.cpp +++ b/engines/fullpipe/statics.cpp @@ -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); diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h index 95030180c36..9393612d77c 100644 --- a/engines/fullpipe/statics.h +++ b/engines/fullpipe/statics.h @@ -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 {