aboutsummaryrefslogtreecommitdiff
path: root/engines/m4/mads_player.cpp
diff options
context:
space:
mode:
authorPaul Gilbert2010-07-16 13:15:18 +0000
committerPaul Gilbert2010-07-16 13:15:18 +0000
commit379a55f089f70ee961bacf3072eead629cb1d2e3 (patch)
tree6ff50fd7003dce5c4a402ef188bae08d695953aa /engines/m4/mads_player.cpp
parentb062488987ed43d10d404f91c52e502fe3c44a37 (diff)
downloadscummvm-rg350-379a55f089f70ee961bacf3072eead629cb1d2e3.tar.gz
scummvm-rg350-379a55f089f70ee961bacf3072eead629cb1d2e3.tar.bz2
scummvm-rg350-379a55f089f70ee961bacf3072eead629cb1d2e3.zip
Implemented path-finding logic for accurate player movement
svn-id: r50936
Diffstat (limited to 'engines/m4/mads_player.cpp')
-rw-r--r--engines/m4/mads_player.cpp41
1 files changed, 38 insertions, 3 deletions
diff --git a/engines/m4/mads_player.cpp b/engines/m4/mads_player.cpp
index ff5f3464bf..5106d2210d 100644
--- a/engines/m4/mads_player.cpp
+++ b/engines/m4/mads_player.cpp
@@ -747,9 +747,44 @@ void MadsPlayer::turnToDestFacing() {
}
void MadsPlayer::setupRoute(bool bitFlag) {
- // TODO: Properly Implement route setup
- _routeIndexes[0] = _madsVm->scene()->getSceneResources()._nodes.size() - 1;
- _routeCount = 1;
+ // Reset the flag set of nodes in use
+ SceneNodeList &nodes = _madsVm->scene()->getSceneResources()._nodes;
+ for (uint i = 0; i < nodes.size(); ++i)
+ nodes[i].active = false;
+
+ // Start constructing route node list
+ _routeLength = 0x3FFF;
+ _routeCount = 0;
+
+ setupRouteNode(_tempRoute, nodes.size() - 1, bitFlag ? 0xC000 : 0x8000, 0);
+}
+
+void MadsPlayer::setupRouteNode(int *routeIndexP, int nodeIndex, int flags, int routeLength) {
+ SceneNodeList &nodes = _madsVm->scene()->getSceneResources()._nodes;
+ SceneNode &currentNode = nodes[nodeIndex];
+ currentNode.active = true;
+
+ *routeIndexP++ = nodeIndex;
+
+ int subIndex = nodes.size() - 2;
+ int indexVal = nodes[nodeIndex].indexes[subIndex];
+ if (indexVal & flags) {
+ routeLength += indexVal & 0x3FFF;
+ if (routeLength < _routeLength) {
+ // Found a new shorter route to destination, so set up the route with the found one
+ Common::copy(_tempRoute, routeIndexP, _routeIndexes);
+ _routeCount = routeIndexP - _tempRoute;
+ _routeLength = indexVal & 0x3FFF;
+ }
+ } else {
+ for (int idx = nodes.size() - 2; idx > 0; --idx) {
+ int nodePos = idx - 1;
+ if (!nodes[nodePos].active && ((currentNode.indexes[nodePos] & flags) != 0))
+ setupRouteNode(routeIndexP, nodePos, 0x8000, indexVal & 0x3fff);
+ }
+ }
+
+ currentNode.active = false;
}
} // End of namespace M4