From: <fu...@us...> - 2009-06-23 15:04:32
|
Revision: 6598 http://gemrb.svn.sourceforge.net/gemrb/?rev=6598&view=rev Author: fuzzie Date: 2009-06-23 15:04:30 +0000 (Tue, 23 Jun 2009) Log Message: ----------- make a hackish attempt to allow WalkTo() to re-path smoothly while moving Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-06-23 13:45:09 UTC (rev 6597) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-06-23 15:04:30 UTC (rev 6598) @@ -1179,14 +1179,52 @@ void Movable::WalkTo(Point &Des, int distance) { + Point from = Pos; + + // the prev_step stuff is a naive attempt to allow re-pathing while moving + PathNode *prev_step = NULL; + unsigned char old_stance = StanceID; + if (step && step->Next) { + // don't interrupt in the middle of a step; path from the next one + prev_step = new PathNode(*step); + from.x = ( step->Next->x * 16 ) + 8; + from.y = ( step->Next->y * 12 ) + 6; + } + ClearPath(); - FixPosition(); + if (!prev_step) { + FixPosition(); + } area->ClearSearchMapFor(this); - path = area->FindPath( Pos, Des, size, distance ); + path = area->FindPath( from, Des, size, distance ); //ClearPath sets destination, so Destination must be set after it //also we should set Destination only if there is a walkable path if (path) { Destination = Des; + + if (prev_step) { + // we want to smoothly continue, please + // this all needs more thought! but it seems to work okay + StanceID = old_stance; + + if (path->Next) { + // this is a terrible hack to make up for the + // pathfinder orienting the first node wrong + // should be fixed in pathfinder and not here! + Point next, follow; + next.x = path->x; next.y = path->y; + follow.x = path->Next->x; + follow.y = path->Next->y; + path->orient = GetOrient(follow, next); + } + + // then put the prev_step at the beginning of the path + prev_step->Next = path; + path->Parent = prev_step; + path = prev_step; + + step = path; + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |