diff options
author | Eugene Sandulenko | 2014-05-04 09:33:25 +0300 |
---|---|---|
committer | Eugene Sandulenko | 2014-05-04 09:33:45 +0300 |
commit | bd5736c641688ab11a68532810be9fcdf4c450b7 (patch) | |
tree | 483835d6883a33e34aba37396cc1b5ecc4417505 /engines/fullpipe | |
parent | 0a899876e760419b913495e17052da2903371cb6 (diff) | |
download | scummvm-rg350-bd5736c641688ab11a68532810be9fcdf4c450b7.tar.gz scummvm-rg350-bd5736c641688ab11a68532810be9fcdf4c450b7.tar.bz2 scummvm-rg350-bd5736c641688ab11a68532810be9fcdf4c450b7.zip |
FULLPIPE: Implement MovGraph::genMovArr()
Diffstat (limited to 'engines/fullpipe')
-rw-r--r-- | engines/fullpipe/motion.cpp | 70 | ||||
-rw-r--r-- | engines/fullpipe/motion.h | 10 |
2 files changed, 80 insertions, 0 deletions
diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp index 54854e3043..a1ad4de89f 100644 --- a/engines/fullpipe/motion.cpp +++ b/engines/fullpipe/motion.cpp @@ -682,6 +682,76 @@ int MovGraph::getItemIndexByStaticAni(StaticANIObject *ani) { return -1; } +Common::Array<MovArr *> *MovGraph::genMovArr(int x, int y, int *arrSize, int flag1, int flag2) { + if (!_links.size()) { + *arrSize = 0; + + return 0; + } + + Common::Array<MovArr *> *arr = new Common::Array<MovArr *>; + MovArr *movarr; + + for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) { + MovGraphLink *lnk = (MovGraphLink *)*i; + + if (flag1) { + Common::Point point(x, y); + double dist = calcDistance(&point, lnk, 0); + + if (dist >= 0.0 && dist < 2.0) { + movarr = new MovArr; + + movarr->_link = lnk; + movarr->_dist = ((double)(lnk->_movGraphNode1->_y - lnk->_movGraphNode2->_y) * (double)(lnk->_movGraphNode1->_y - point.y) + + (double)(lnk->_movGraphNode2->_x - lnk->_movGraphNode1->_x) * (double)(point.x - lnk->_movGraphNode1->_x)) / + lnk->_distance / lnk->_distance; + movarr->_point = point; + + arr->push_back(movarr); + } + } else { + if (lnk->_movGraphReact) { + if (lnk->_movGraphReact->pointInRegion(x, y)) { + if (!(lnk->_flags & 0x10000000) || lnk->_flags & 0x20000000) { + if (!flag2) { + movarr = new MovArr; + movarr->_link = lnk; + movarr->_dist = 0.0; + movarr->_point.x = lnk->_movGraphNode1->_x; + movarr->_point.y = lnk->_movGraphNode1->_y; + arr->push_back(movarr); + + movarr = new MovArr; + movarr->_link = lnk; + movarr->_dist = 1.0; + movarr->_point.x = lnk->_movGraphNode1->_x; + movarr->_point.y = lnk->_movGraphNode1->_y; + arr->push_back(movarr); + } + } else { + movarr = new MovArr; + movarr->_link = lnk; + movarr->_dist = ((double)(lnk->_movGraphNode1->_y - lnk->_movGraphNode2->_y) * (double)(lnk->_movGraphNode1->_y - y) + + (double)(lnk->_movGraphNode2->_x - lnk->_movGraphNode1->_x) * (double)(x - lnk->_movGraphNode1->_x)) / + lnk->_distance / lnk->_distance; + movarr->_point.x = x; + movarr->_point.y = y; + + calcDistance(&movarr->_point, lnk, 0); + + arr->push_back(movarr); + } + } + } + } + } + + *arrSize = arr->size(); + + return arr; +} + int MovGraph2::getItemIndexByGameObjectId(int objectId) { for (uint i = 0; i < _items2.size(); i++) if (_items2[i]->_objectId == objectId) diff --git a/engines/fullpipe/motion.h b/engines/fullpipe/motion.h index 4d92fd7fed..aa1fa436c2 100644 --- a/engines/fullpipe/motion.h +++ b/engines/fullpipe/motion.h @@ -320,6 +320,15 @@ struct MovGraphItem { MovGraphItem(); }; +struct MovArr { + int _afield_0; + int _afield_4; + int _afield_8; + MovGraphLink *_link; + double _dist; + Common::Point _point; +}; + class MovGraph : public MotionController { public: ObList _nodes; @@ -351,6 +360,7 @@ public: void calcNodeDistancesAndAngles(); MovGraphNode *calcOffset(int ox, int oy); int getItemIndexByStaticAni(StaticANIObject *ani); + Common::Array<MovArr *> *genMovArr(int x, int y, int *arrSize, int flag1, int flag2); }; class Movement; |