[Scummvm-cvs-logs] scummvm master -> a9aaca460875c6d7a244e3f36a1cad62ec09411d

sev- sev at scummvm.org
Fri Oct 18 23:44:50 CEST 2013


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
a9aaca4608 FULLPIPE: Implement MovGraph2::findMinPath()


Commit: a9aaca460875c6d7a244e3f36a1cad62ec09411d
    https://github.com/scummvm/scummvm/commit/a9aaca460875c6d7a244e3f36a1cad62ec09411d
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-10-18T14:44:10-07:00

Commit Message:
FULLPIPE: Implement MovGraph2::findMinPath()

Changed paths:
    engines/fullpipe/motion.cpp



diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp
index f6eb9d6..f915839 100644
--- a/engines/fullpipe/motion.cpp
+++ b/engines/fullpipe/motion.cpp
@@ -696,9 +696,11 @@ MessageQueue *MovGraph2::doWalkTo(StaticANIObject *obj, int xpos, int ypos, int
 	}
 
 	Common::Array<MovGraphLink *> tempLinkList;
+	double minPath = findMinPath(&linkInfoSource, &linkInfoDest, &tempLinkList);
 
-	if (findMinPath(&linkInfoSource, &linkInfoDest, &tempLinkList) < 0.0 || 
-		((linkInfoSource.node != linkInfoDest.node || !linkInfoSource.node) && !tempLinkList.size()))
+	debug(0, "MovGraph2::doWalkTo(): path: %lf  parts: %d", minPath, tempLinkList.size());
+
+	if (minPath < 0.0 || ((linkInfoSource.node != linkInfoDest.node || !linkInfoSource.node) && !tempLinkList.size()))
 		return 0;
 
 	movInfo1.subIndex = idxsub;
@@ -905,9 +907,74 @@ MovGraphLink *MovGraph2::findLink2(int x, int y) {
 }
 
 double MovGraph2::findMinPath(LinkInfo *linkInfoSource, LinkInfo *linkInfoDest, Common::Array<MovGraphLink *> *listObj) {
-	warning("STUB: MovGraph2::findMinPath()");
+	LinkInfo linkInfoWorkSource;
+
+	if (linkInfoSource->link != linkInfoDest->link || linkInfoSource->node != linkInfoDest->node) {
+		double minDistance = -1.0;
+
+		if (linkInfoSource->node) {
+			for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) {
+				MovGraphLink *lnk = (MovGraphLink *)*i;
+
+				if ((lnk->_movGraphNode1 == linkInfoSource->node || lnk->_movGraphNode2 == linkInfoSource->node) && !(lnk->_flags & 0xA0000000)) {
+					linkInfoWorkSource.node = 0;
+					linkInfoWorkSource.link = lnk;
+
+					Common::Array<MovGraphLink *> tmpList;
+
+					lnk->_flags |= 0x80000000;
+
+					double newDistance = findMinPath(&linkInfoWorkSource, linkInfoDest, &tmpList);
+
+					if (newDistance >= 0.0 && (minDistance < 0.0 || newDistance + lnk->_distance < minDistance)) {
+						listObj->clear();
+						listObj->push_back(tmpList);
+
+						minDistance = newDistance + lnk->_distance;
+					}
+
+					lnk->_flags &= 0x7FFFFFFF;
+				}
+			}
+		} else if (linkInfoSource->link) {
+			linkInfoWorkSource.node = linkInfoSource->link->_movGraphNode1;
+			linkInfoWorkSource.link = 0;
+			
+			Common::Array<MovGraphLink *> tmpList;
 
-	return 0.0;
+			double newDistance = findMinPath(&linkInfoWorkSource, linkInfoDest, &tmpList);
+
+			if (newDistance >= 0.0) {
+				listObj->clear();
+
+				listObj->push_back(linkInfoSource->link);
+				listObj->push_back(tmpList);
+
+				minDistance = newDistance;
+			}
+
+			linkInfoWorkSource.link = 0;
+			linkInfoWorkSource.node = linkInfoSource->link->_movGraphNode2;
+			
+			tmpList.clear();
+			
+			newDistance = findMinPath(&linkInfoWorkSource, linkInfoDest, &tmpList);
+
+			if (newDistance >= 0 && (minDistance < 0.0 || newDistance < minDistance)) {
+				listObj->push_back(linkInfoSource->link);
+				listObj->push_back(tmpList);
+
+				minDistance = newDistance;
+			}
+		}
+
+		return minDistance;
+	} else {
+		if (linkInfoSource->link)
+			listObj->push_back(linkInfoSource->link);
+
+		return 0.0;
+	}
 }
 
 MovGraphNode *MovGraph::calcOffset(int ox, int oy) {






More information about the Scummvm-git-logs mailing list