aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorPaul Gilbert2008-01-08 06:13:55 +0000
committerPaul Gilbert2008-01-08 06:13:55 +0000
commit965eddf0dc0df514a74504d4b92365afe6f3b892 (patch)
tree68926a5f57232fed70c658c143df8237b1697691 /engines
parent660d9a89d7d3fd1888027e83ac1d4f889c5a115c (diff)
downloadscummvm-rg350-965eddf0dc0df514a74504d4b92365afe6f3b892.tar.gz
scummvm-rg350-965eddf0dc0df514a74504d4b92365afe6f3b892.tar.bz2
scummvm-rg350-965eddf0dc0df514a74504d4b92365afe6f3b892.zip
Enhanced NPC walk-to logic to handle separately several special Ids that were previously handled identically
svn-id: r30339
Diffstat (limited to 'engines')
-rw-r--r--engines/lure/hotspots.cpp79
-rw-r--r--engines/lure/hotspots.h2
2 files changed, 54 insertions, 27 deletions
diff --git a/engines/lure/hotspots.cpp b/engines/lure/hotspots.cpp
index fbe80235fe..abad4d31ec 100644
--- a/engines/lure/hotspots.cpp
+++ b/engines/lure/hotspots.cpp
@@ -959,7 +959,7 @@ HotspotPrecheckResult Hotspot::actionPrecheck(HotspotData *hotspot) {
(hotspot->characterMode == CHARMODE_WAIT_FOR_PLAYER) ||
(hotspot->characterMode == CHARMODE_WAIT_FOR_INTERACT)) {
// loc_880
- if (characterWalkingCheck(hotspot))
+ if (characterWalkingCheck(hotspot->hotspotId))
return PC_WAIT;
} else {
// loc_886
@@ -974,7 +974,7 @@ HotspotPrecheckResult Hotspot::actionPrecheck(HotspotData *hotspot) {
((hotspot->actionHotspotId != _hotspotId) &&
(hotspot->characterMode == CHARMODE_WAIT_FOR_PLAYER))) {
// loc_880
- if (characterWalkingCheck(hotspot))
+ if (characterWalkingCheck(hotspot->hotspotId))
return PC_WAIT;
} else if (hotspot->actionHotspotId != _hotspotId) {
@@ -1077,33 +1077,60 @@ bool Hotspot::findClearBarPlace() {
return false;
}
-bool Hotspot::characterWalkingCheck(HotspotData *hotspot) {
+bool Hotspot::characterWalkingCheck(uint16 hotspotId) {
+ Resources &res = Resources::getReference();
int16 xp, yp;
+ bool altFlag;
+ HotspotData *hotspot;
+
+ // Note that several invalid hotspot Ids are used to identify special walk to
+ // coordinates used throughout the game
+
+ _walkFlag = true;
+ altFlag = false;
- if (hotspot == NULL) {
- // DEBUG for now - hardcoded value for 3E7h (NULL)
+ switch (hotspotId) {
+ case 997:
+ xp = 169; yp = 146;
+ altFlag = true;
+ break;
+
+ case 998:
+ xp = 124; yp = 169;
+ break;
+
+ case 999:
xp = 78; yp = 162;
- _walkFlag = true;
+ break;
+
+ default:
+ hotspot = res.getHotspot(hotspotId);
+ if (hotspot == NULL) {
+ // Should never come here, as all other constants are handled
+ warning("characterWalkingCheck done on unknown hotspot Id %xh", hotspotId);
+ xp = 78; yp = 162;
+ } else if ((hotspot->walkX == 0) && (hotspot->walkY == 0)) {
+ // The hotspot doesn't have any walk co-ordinates
+ xp = hotspot->startX;
+ yp = hotspot->startY + hotspot->heightCopy - 4;
+ _walkFlag = false;
+ } else {
+ xp = hotspot->walkX;
+ yp = hotspot->walkY & 0x7fff;
+ altFlag = (hotspot->walkY & 0x8000) != 0;
+ }
+ break;
}
- else if ((hotspot->walkX == 0) && (hotspot->walkY == 0)) {
- // The hotspot doesn't have any walk co-ordinates
- xp = hotspot->startX;
- yp = hotspot->startY + hotspot->heightCopy - 4;
- _walkFlag = false;
- } else {
- xp = hotspot->walkX;
- yp = hotspot->walkY & 0x7fff;
- _walkFlag = true;
-
- if ((hotspot->walkY & 0x8000) != 0) {
- if (((x() >> 3) != (xp >> 3)) ||
- ((((y() + heightCopy()) >> 3) - 1) != (yp >> 3))) {
- // Walk to the specified destination
- walkTo(xp, yp);
- return true;
- } else {
- return false;
- }
+
+ if (altFlag) {
+ // Alternate walking check
+ if (((x() >> 3) != (xp >> 3)) ||
+ ((((y() + heightCopy()) >> 3) - 1) != (yp >> 3))) {
+ // Walk to the specified destination
+ walkTo(xp, yp);
+ return true;
+ } else {
+ return false;
}
}
@@ -1987,7 +2014,7 @@ void Hotspot::npcWalkingCheck(HotspotData *hotspot) {
fields.setField(ACTIVE_HOTSPOT_ID, hId);
if ((hId < PLAYER_ID) || (hotspot->roomNumber == _roomNumber)) {
- characterWalkingCheck(hotspot);
+ characterWalkingCheck(hId);
}
}
diff --git a/engines/lure/hotspots.h b/engines/lure/hotspots.h
index aa7a2a0f4c..dce3e16307 100644
--- a/engines/lure/hotspots.h
+++ b/engines/lure/hotspots.h
@@ -304,7 +304,7 @@ private:
HotspotPrecheckResult actionPrecheck(HotspotData *hotspot);
BarPlaceResult getBarPlace();
bool findClearBarPlace();
- bool characterWalkingCheck(HotspotData *hotspot);
+ bool characterWalkingCheck(uint16 hotspotId);
bool doorCloseCheck(uint16 doorId);
void resetDirection();