diff options
| -rw-r--r-- | engines/fullpipe/motion.cpp | 115 | ||||
| -rw-r--r-- | engines/fullpipe/motion.h | 9 | 
2 files changed, 121 insertions, 3 deletions
| diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp index f9158397c2..ef5a62b6f8 100644 --- a/engines/fullpipe/motion.cpp +++ b/engines/fullpipe/motion.cpp @@ -536,7 +536,118 @@ void MovGraph2::addObject(StaticANIObject *obj) {  }  void MovGraph2::buildMovInfo1SubItems(MovInfo1 *movinfo, Common::Array<MovGraphLink *> *linkList, LinkInfo *lnkSrc, LinkInfo *lnkDst) { -	warning("STUB: MovGraph2::buildMovInfo1SubItems()"); +	MovInfo1Sub *elem; +	Common::Point point; +	Common::Rect rect; + +	int subIndex = movinfo->subIndex; + +	movinfo->items.clear(); + +	elem = new MovInfo1Sub; +	elem->subIndex = subIndex; +	elem->x = movinfo->pt1.x; +	elem->y = movinfo->pt1.y; +	elem->distance = -1; + +	movinfo->items.push_back(elem); + +	int prevSubIndex = movinfo->subIndex; + +	for (Common::Array<MovGraphLink *>::iterator i = linkList->begin(); i != linkList->end(); ++i) { +		MovGraphLink *lnk = *i; + +		int idx1; + +		if (linkList->size() <= 1) { +			if (linkList->size() == 1) +				idx1 = getShortSide((*linkList)[0], movinfo->pt2.x - movinfo->pt1.x, movinfo->pt2.y - movinfo->pt1.y); +			else +				idx1 = getShortSide(0, movinfo->pt2.x - movinfo->pt1.x, movinfo->pt2.y - movinfo->pt1.y); + +			point.y = -1; +			rect.bottom = -1; +			rect.right = -1; +			rect.top = -1; +			rect.left = -1; +		} else { +			idx1 = findLink(linkList, lnk, &rect, &point); +		} + +		if (idx1 != prevSubIndex) { +			prevSubIndex = idx1; +			subIndex = idx1; + +			elem = new MovInfo1Sub; +			elem->subIndex = subIndex; +			elem->x = rect.left; +			elem->y = rect.top; +			elem->distance = -1; + +			movinfo->items.push_back(elem); +		} + +		if (i != linkList->end()) { +			while (1) { +				Common::Array<MovGraphLink *>::iterator j = i; + +				++i; + +				if (findLink(linkList, *i, &rect, 0) != prevSubIndex) { +					i = j; +					findLink(linkList, *i, &rect, &point); + +					break; +				} + +				if (i == linkList->end()) +					break; +			} +			lnk = *i; +		} + +		if (movinfo->items.back()->subIndex != 10) { +			subIndex = prevSubIndex; + +			elem = new MovInfo1Sub; +			elem->subIndex = 10; +			elem->x = -1; +			elem->y = -1; +			elem->distance = -1; + +			movinfo->items.push_back(elem); + +			if (i == linkList->end()) { +				elem = new MovInfo1Sub; +				elem->subIndex = prevSubIndex; +				elem->x = movinfo->pt2.x; +				elem->y = movinfo->pt2.y; +				elem->distance = movinfo->distance2; + +				movinfo->items.push_back(elem); +			} else { +				elem = new MovInfo1Sub; +				elem->subIndex = prevSubIndex; +				elem->x = rect.right; +				elem->y = rect.bottom; +				elem->distance = point.y; + +				movinfo->items.push_back(elem); +			} +		} +	} + +	if (subIndex != movinfo->item1Index) { +		elem = new MovInfo1Sub; +		elem->subIndex = movinfo->item1Index; +		elem->x = movinfo->pt2.x; +		elem->y = movinfo->pt2.y; +		elem->distance = movinfo->distance2; + +		movinfo->items.push_back(elem); +	} + +	movinfo->itemsCount = movinfo->items.size();  }  MessageQueue *MovGraph2::buildMovInfo1MessageQueue(MovInfo1 *movInfo) { @@ -824,7 +935,7 @@ int MovGraph2::getShortSide(MovGraphLink *lnk, int x, int y) {  	return 0;  } -int MovGraph2::findLink(Common::Array<MovGraphLink *> *linkList, MovGraphLink *lnk, Common::Rect *a3, Common::Point *a4) { +int MovGraph2::findLink(Common::Array<MovGraphLink *> *linkList, MovGraphLink *lnk, Common::Rect *rect, Common::Point *point) {  	warning("STUB: MovGraphLink *MovGraph2::findLink()");  	return 0; diff --git a/engines/fullpipe/motion.h b/engines/fullpipe/motion.h index 6901a7263a..d53bcf1bbf 100644 --- a/engines/fullpipe/motion.h +++ b/engines/fullpipe/motion.h @@ -280,6 +280,13 @@ struct LinkInfo {  	MovGraphNode *node;  }; +struct MovInfo1Sub { +	int subIndex; +	int x; +	int y; +	int distance; +}; +  struct MovInfo1 {  	int field_0;  	Common::Point pt1; @@ -288,7 +295,7 @@ struct MovInfo1 {  	int distance2;  	int subIndex;  	int item1Index; -	int items; +	Common::Array<MovInfo1Sub *> items;  	int itemsCount;  	int flags;  }; | 
