[Scummvm-cvs-logs] SF.net SVN: scummvm: [27225] scummvm/trunk/engines/saga

h00ligan at users.sourceforge.net h00ligan at users.sourceforge.net
Sat Jun 9 01:33:36 CEST 2007


Revision: 27225
          http://scummvm.svn.sourceforge.net/scummvm/?rev=27225&view=rev
Author:   h00ligan
Date:     2007-06-08 16:33:35 -0700 (Fri, 08 Jun 2007)

Log Message:
-----------
fix IHNM pathfinding engine. now TED(Chapter 5) interacts with the books properly

Modified Paths:
--------------
    scummvm/trunk/engines/saga/actor.cpp
    scummvm/trunk/engines/saga/objectmap.cpp
    scummvm/trunk/engines/saga/script.cpp

Modified: scummvm/trunk/engines/saga/actor.cpp
===================================================================
--- scummvm/trunk/engines/saga/actor.cpp	2007-06-08 23:05:24 UTC (rev 27224)
+++ scummvm/trunk/engines/saga/actor.cpp	2007-06-08 23:33:35 UTC (rev 27225)
@@ -93,9 +93,9 @@
 	return ((i1) > (i2) ? 1 : ((i1) < (i2) ? -1 : 0));
 }
 
-inline int16 quickDistance(const Point &point1, const Point &point2) {
+inline int16 quickDistance(const Point &point1, const Point &point2, int16 compressX) {
 	Point delta;
-	delta.x = ABS(point1.x - point2.x) / 2;
+	delta.x = ABS(point1.x - point2.x) / compressX;
 	delta.y = ABS(point1.y - point2.y);
 	return ((delta.x < delta.y) ? (delta.y + delta.x / 2) : (delta.x + delta.y / 2));
 }
@@ -2009,9 +2009,12 @@
 	actor = getActor(actorId);
 	actor->_actorFlags &= ~kActorBackwards;
 
-	if (actor->_location.distance(actor->_finalTarget) > 8 && (actor->_flags & kProtagonist) && recurse && !(actor->_actorFlags & kActorNoCollide)) {
-		actor->_actorFlags |= kActorNoCollide;
-		return actorWalkTo(actorId, actor->_finalTarget);
+	if (_vm->getGameType() == GType_ITE) {
+
+		if (actor->_location.distance(actor->_finalTarget) > 8 && (actor->_flags & kProtagonist) && recurse && !(actor->_actorFlags & kActorNoCollide)) {
+			actor->_actorFlags |= kActorNoCollide;
+			return actorWalkTo(actorId, actor->_finalTarget);
+		}
 	}
 
 	actor->_currentAction = kActionWait;
@@ -2725,10 +2728,11 @@
 	const PathDirectionData *samplePathDirection;
 	Point nextPoint;
 	int directionCount;
+	int16 compressX = (_vm->getGameType() == GType_ITE) ? 2 : 1;
 
 	_pathDirectionListCount = 0;
 	pointCounter = 0;
-	bestRating = quickDistance(fromPoint, toPoint);
+	bestRating = quickDistance(fromPoint, toPoint, compressX);
 	bestPath = fromPoint;
 
 	for (startDirection = 0; startDirection < 4; startDirection++) {
@@ -2776,7 +2780,7 @@
 				bestPoint = toPoint;
 				return pointCounter;
 			}
-			currentRating = quickDistance(nextPoint, toPoint);
+			currentRating = quickDistance(nextPoint, toPoint, compressX);
 			if (currentRating < bestRating) {
 				bestRating = currentRating;
 				bestPath = nextPoint;

Modified: scummvm/trunk/engines/saga/objectmap.cpp
===================================================================
--- scummvm/trunk/engines/saga/objectmap.cpp	2007-06-08 23:05:24 UTC (rev 27224)
+++ scummvm/trunk/engines/saga/objectmap.cpp	2007-06-08 23:33:35 UTC (rev 27225)
@@ -146,6 +146,8 @@
 	Location location;
 	HitZone::ClickArea *clickArea;
 	Point *points;
+	Point specialPoint1;
+	Point specialPoint2;
 	for (i = 0; i < _clickAreasCount; i++) {
 		clickArea = &_clickAreas[i];
 		pointsCount = clickArea->pointsCount;
@@ -175,6 +177,14 @@
 		}
 
 	}
+	if (getSpecialPoint(specialPoint1)) {
+		specialPoint2 = specialPoint1;
+		specialPoint1.x--;
+		specialPoint1.y--;
+		specialPoint2.x++;
+		specialPoint2.y++;
+		ds->drawFrame(specialPoint1, specialPoint2, color);
+	}
 }
 
 

Modified: scummvm/trunk/engines/saga/script.cpp
===================================================================
--- scummvm/trunk/engines/saga/script.cpp	2007-06-08 23:05:24 UTC (rev 27224)
+++ scummvm/trunk/engines/saga/script.cpp	2007-06-08 23:33:35 UTC (rev 27225)
@@ -639,10 +639,19 @@
 	}
 
 	if (hitZone != NULL) {
-		if (hitZone->getFlags() & kHitZoneNoWalk) {
-			_vm->_actor->actorFaceTowardsPoint(ID_PROTAG, pickLocation);
-			doVerb();
-			return;
+		if (_vm->getGameType() == GType_ITE) {
+			if (hitZone->getFlags() & kHitZoneNoWalk) {
+				_vm->_actor->actorFaceTowardsPoint(ID_PROTAG, pickLocation);
+				doVerb();
+				return;
+			}
+		} else { 
+			if (_vm->getGameType() == GType_IHNM) {
+				if ((hitZone->getFlags() & kHitZoneNoWalk) && (_pendingVerb == getVerbType(kVerbWalkTo))) {
+					doVerb();
+					return;
+				}
+			}
 		}
 
 		if (hitZone->getFlags() & kHitZoneProject) {
@@ -663,26 +672,54 @@
 		}
 	}
 
-	if ((_pendingVerb == getVerbType(kVerbWalkTo)) ||
-		(_pendingVerb == getVerbType(kVerbPickUp)) ||
-		(_pendingVerb == getVerbType(kVerbOpen)) ||
-		(_pendingVerb == getVerbType(kVerbClose)) ||
-		(_pendingVerb == getVerbType(kVerbUse))) {
-			_vm->_actor->actorWalkTo(ID_PROTAG, pickLocation);
-	} else {
-		if (_pendingVerb == getVerbType(kVerbLookAt)) {
-			if (objectTypeId(_pendingObject[0]) != kGameObjectActor ) {
+	if (_vm->getGameType() == GType_ITE) {
+		if ((_pendingVerb == getVerbType(kVerbWalkTo)) ||
+			(_pendingVerb == getVerbType(kVerbPickUp)) ||
+			(_pendingVerb == getVerbType(kVerbOpen)) ||
+			(_pendingVerb == getVerbType(kVerbClose)) ||
+			(_pendingVerb == getVerbType(kVerbUse))) {
 				_vm->_actor->actorWalkTo(ID_PROTAG, pickLocation);
+		} else {
+			if (_pendingVerb == getVerbType(kVerbLookAt)) {
+				if (objectTypeId(_pendingObject[0]) != kGameObjectActor ) {
+					_vm->_actor->actorWalkTo(ID_PROTAG, pickLocation);
+				} else {
+					doVerb();
+				}
 			} else {
-				doVerb();
+				if ((_pendingVerb == getVerbType(kVerbTalkTo)) ||
+					(_pendingVerb == getVerbType(kVerbGive))) {
+						doVerb();
+				}
 			}
+		}
+	}
+
+	if (_vm->getGameType() == GType_IHNM) {
+
+		if ((_pendingVerb == getVerbType(kVerbWalkTo)) ||
+			(_pendingVerb == getVerbType(kVerbPickUp)) ||
+			(_pendingVerb == getVerbType(kVerbOpen)) ||
+			(_pendingVerb == getVerbType(kVerbClose)) ||
+			(_pendingVerb == getVerbType(kVerbUse))) {
+				_vm->_actor->actorWalkTo(ID_PROTAG, pickLocation);
 		} else {
-			if ((_pendingVerb == getVerbType(kVerbTalkTo)) ||
-				(_pendingVerb == getVerbType(kVerbGive))) {
+			if (_pendingVerb == getVerbType(kVerbLookAt)) {
+				if (objectTypeId(_pendingObject[0]) != kGameObjectActor ) {
+					_vm->_actor->actorWalkTo(ID_PROTAG, pickLocation);
+				} else {
+					_vm->_actor->actorFaceTowardsObject(ID_PROTAG, _pendingObject[0]);
 					doVerb();
+				}
+			} else {
+				if ((_pendingVerb == getVerbType(kVerbTalkTo)) ||
+					(_pendingVerb == getVerbType(kVerbGive))) {
+						doVerb();
+				}
 			}
 		}
 	}
+
 }
 
 void Script::whichObject(const Point& mousePoint) {


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list