diff options
-rw-r--r-- | engines/gob/goblin_v1.cpp | 30 | ||||
-rw-r--r-- | engines/gob/goblin_v2.cpp | 30 | ||||
-rw-r--r-- | engines/gob/goblin_v4.cpp | 24 | ||||
-rw-r--r-- | engines/gob/map.cpp | 7 | ||||
-rw-r--r-- | engines/gob/map.h | 22 | ||||
-rw-r--r-- | engines/gob/map_v1.cpp | 4 | ||||
-rw-r--r-- | engines/gob/map_v2.cpp | 2 |
7 files changed, 80 insertions, 39 deletions
diff --git a/engines/gob/goblin_v1.cpp b/engines/gob/goblin_v1.cpp index a11134b05c..3dc4c6611d 100644 --- a/engines/gob/goblin_v1.cpp +++ b/engines/gob/goblin_v1.cpp @@ -154,8 +154,10 @@ void Goblin_v1::initiateMove(Mult::Mult_Object *obj) { _vm->_map->_nearestWayPoint, _vm->_map->_nearestDest) == 0) { _pathExistence = 0; } else { - _vm->_map->_destX = _vm->_map->_wayPoints[_vm->_map->_nearestWayPoint].x; - _vm->_map->_destY = _vm->_map->_wayPoints[_vm->_map->_nearestWayPoint].y; + const WayPoint &wayPoint = _vm->_map->getWayPoint(_vm->_map->_nearestWayPoint); + + _vm->_map->_destX = wayPoint.x; + _vm->_map->_destY = wayPoint.y; } } } @@ -199,20 +201,20 @@ void Goblin_v1::movePathFind(Mult::Mult_Object *obj, if (_vm->_map->_nearestWayPoint > _vm->_map->_nearestDest) { _vm->_map->optimizePoints(0, 0, 0); - _vm->_map->_destX = - _vm->_map->_wayPoints[_vm->_map->_nearestWayPoint].x; - _vm->_map->_destY = - _vm->_map->_wayPoints[_vm->_map->_nearestWayPoint].y; + const WayPoint &wayPoint = _vm->_map->getWayPoint(_vm->_map->_nearestWayPoint); + + _vm->_map->_destX = wayPoint.x; + _vm->_map->_destY = wayPoint.y; if (_vm->_map->_nearestWayPoint > _vm->_map->_nearestDest) _vm->_map->_nearestWayPoint--; } else if (_vm->_map->_nearestWayPoint < _vm->_map->_nearestDest) { _vm->_map->optimizePoints(0, 0, 0); - _vm->_map->_destX = - _vm->_map->_wayPoints[_vm->_map->_nearestWayPoint].x; - _vm->_map->_destY = - _vm->_map->_wayPoints[_vm->_map->_nearestWayPoint].y; + const WayPoint &wayPoint = _vm->_map->getWayPoint(_vm->_map->_nearestWayPoint); + + _vm->_map->_destX = wayPoint.x; + _vm->_map->_destY = wayPoint.y; if (_vm->_map->_nearestWayPoint < _vm->_map->_nearestDest) _vm->_map->_nearestWayPoint++; @@ -220,8 +222,12 @@ void Goblin_v1::movePathFind(Mult::Mult_Object *obj, if ((_vm->_map->checkDirectPath(0, _vm->_map->_curGoblinX, _vm->_map->_curGoblinY, _gobDestX, _gobDestY) == 3) && (_vm->_map->getPass(_pressedMapX, _pressedMapY) != 0)) { - _vm->_map->_destX = _vm->_map->_wayPoints[_vm->_map->_nearestWayPoint].x; - _vm->_map->_destY = _vm->_map->_wayPoints[_vm->_map->_nearestWayPoint].y; + + const WayPoint &wayPoint = _vm->_map->getWayPoint(_vm->_map->_nearestWayPoint); + + _vm->_map->_destX = wayPoint.x; + _vm->_map->_destY = wayPoint.y; + } else { _pathExistence = 1; _vm->_map->_destX = _pressedMapX; diff --git a/engines/gob/goblin_v2.cpp b/engines/gob/goblin_v2.cpp index c2fc4ad166..81888f7c02 100644 --- a/engines/gob/goblin_v2.cpp +++ b/engines/gob/goblin_v2.cpp @@ -121,8 +121,10 @@ void Goblin_v2::initiateMove(Mult::Mult_Object *obj) { obj->pAnimData->pathExistence = _vm->_map->checkDirectPath(obj, obj->goblinX, obj->goblinY, obj->gobDestX, obj->gobDestY); if (obj->pAnimData->pathExistence == 3) { - obj->destX = _vm->_map->_wayPoints[obj->nearestWayPoint].x; - obj->destY = _vm->_map->_wayPoints[obj->nearestWayPoint].y; + const WayPoint &wayPoint = _vm->_map->getWayPoint(obj->nearestWayPoint); + + obj->destX = wayPoint.x; + obj->destY = wayPoint.y; } } @@ -162,8 +164,12 @@ void Goblin_v2::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 if (obj->nearestWayPoint > obj->nearestDest) { _vm->_map->optimizePoints(obj, gobX, gobY); - destX = _vm->_map->_wayPoints[obj->nearestWayPoint].x; - destY = _vm->_map->_wayPoints[obj->nearestWayPoint].y; + + const WayPoint &wayPoint = _vm->_map->getWayPoint(obj->nearestWayPoint); + + destX = wayPoint.x; + destY = wayPoint.y; + if (_vm->_map->checkDirectPath(obj, gobX, gobY, destX, destY) == 3) { WRITE_VAR(56, 1); animData->pathExistence = 0; @@ -172,8 +178,12 @@ void Goblin_v2::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 obj->nearestWayPoint--; } else if (obj->nearestWayPoint < obj->nearestDest) { _vm->_map->optimizePoints(obj, gobX, gobY); - destX = _vm->_map->_wayPoints[obj->nearestWayPoint].x; - destY = _vm->_map->_wayPoints[obj->nearestWayPoint].y; + + const WayPoint &wayPoint = _vm->_map->getWayPoint(obj->nearestWayPoint); + + destX = wayPoint.x; + destY = wayPoint.y; + if (_vm->_map->checkDirectPath(obj, gobX, gobY, destX, destY) == 3) { WRITE_VAR(56, 1); animData->pathExistence = 0; @@ -183,8 +193,12 @@ void Goblin_v2::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 } else { if ((_vm->_map->checkDirectPath(obj, gobX, gobY, gobDestX, gobDestY) == 3) && (_vm->_map->getPass(gobDestX, gobDestY) != 0)) { - destX = _vm->_map->_wayPoints[obj->nearestWayPoint].x; - destY = _vm->_map->_wayPoints[obj->nearestWayPoint].y; + + const WayPoint &wayPoint = _vm->_map->getWayPoint(obj->nearestWayPoint); + + destX = wayPoint.x; + destY = wayPoint.y; + WRITE_VAR(56, 1); } else { animData->pathExistence = 1; diff --git a/engines/gob/goblin_v4.cpp b/engines/gob/goblin_v4.cpp index 7758170332..f4b0ecdd20 100644 --- a/engines/gob/goblin_v4.cpp +++ b/engines/gob/goblin_v4.cpp @@ -77,8 +77,12 @@ void Goblin_v4::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 if ((gobX == destX) && (gobY == destY)) { if (obj->nearestWayPoint > obj->nearestDest) { _vm->_map->optimizePoints(obj, gobX, gobY); - destX = _vm->_map->_wayPoints[obj->nearestWayPoint].x; - destY = _vm->_map->_wayPoints[obj->nearestWayPoint].y; + + const WayPoint &wayPoint = _vm->_map->getWayPoint(obj->nearestWayPoint); + + destX = wayPoint.x; + destY = wayPoint.y; + if (_vm->_map->checkDirectPath(obj, gobX, gobY, destX, destY) == 3) { WRITE_VAR(56, 1); animData->pathExistence = 0; @@ -87,8 +91,12 @@ void Goblin_v4::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 obj->nearestWayPoint--; } else if (obj->nearestWayPoint < obj->nearestDest) { _vm->_map->optimizePoints(obj, gobX, gobY); - destX = _vm->_map->_wayPoints[obj->nearestWayPoint].x; - destY = _vm->_map->_wayPoints[obj->nearestWayPoint].y; + + const WayPoint &wayPoint = _vm->_map->getWayPoint(obj->nearestWayPoint); + + destX = wayPoint.x; + destY = wayPoint.y; + if (_vm->_map->checkDirectPath(obj, gobX, gobY, destX, destY) == 3) { WRITE_VAR(56, 1); animData->pathExistence = 0; @@ -98,8 +106,12 @@ void Goblin_v4::movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 } else { if ((_vm->_map->checkDirectPath(obj, gobX, gobY, gobDestX, gobDestY) == 3) && (_vm->_map->getPass(gobDestX, gobDestY) != 0)) { - destX = _vm->_map->_wayPoints[obj->nearestWayPoint].x; - destY = _vm->_map->_wayPoints[obj->nearestWayPoint].y; + + const WayPoint &wayPoint = _vm->_map->getWayPoint(obj->nearestWayPoint); + + destX = wayPoint.x; + destY = wayPoint.y; + WRITE_VAR(56, 1); } else { animData->pathExistence = 1; diff --git a/engines/gob/map.cpp b/engines/gob/map.cpp index e20a51b0c6..1310798d2d 100644 --- a/engines/gob/map.cpp +++ b/engines/gob/map.cpp @@ -106,6 +106,13 @@ void Map::setPass(int x, int y, int8 pass, int width) { _passMap[y * width + x] = pass; } +const WayPoint &Map::getWayPoint(int n) const { + assert(_wayPoints); + assert(n < _wayPointCount); + + return _wayPoints[n]; +} + void Map::placeItem(int16 x, int16 y, int16 id) { if ((getItem(x, y) & 0xFF00) != 0) setItem(x, y, (getItem(x, y) & 0xFF00) | id); diff --git a/engines/gob/map.h b/engines/gob/map.h index f1cd91d6d0..a04fe43283 100644 --- a/engines/gob/map.h +++ b/engines/gob/map.h @@ -57,18 +57,18 @@ enum Direction { kDirSE = 0x5100 }; +struct WayPoint { + int16 x; + int16 y; + int16 notWalkable; +}; + + class Map { public: #include "common/pack-start.h" // START STRUCT PACKING - struct Point { - int16 x; - int16 y; - int16 notWalkable; - } PACKED_STRUCT; - #define szMap_ItemPos 3 - struct ItemPos { int8 x; int8 y; @@ -91,9 +91,6 @@ public: bool _mapUnknownBool; - int16 _wayPointCount; - Point *_wayPoints; - int16 _nearestWayPoint; int16 _nearestDest; @@ -113,6 +110,8 @@ public: int8 getPass(int x, int y, int width = -1) const; void setPass(int x, int y, int8 pass, int width = -1); + const WayPoint &getWayPoint(int n) const; + void findNearestWalkable(int16 &gobDestX, int16 &gobDestY, int16 mouseX, int16 mouseY); @@ -143,6 +142,9 @@ protected: int16 _passWidth; int8 *_passMap; // [y * _mapWidth + x], getPass(x, y); + int16 _wayPointCount; + WayPoint *_wayPoints; + int16 findNearestWayPoint(int16 x, int16 y); private: diff --git a/engines/gob/map_v1.cpp b/engines/gob/map_v1.cpp index 92e1d3a03b..1f007dbf34 100644 --- a/engines/gob/map_v1.cpp +++ b/engines/gob/map_v1.cpp @@ -58,8 +58,8 @@ void Map_v1::init() { } _wayPointCount = 40; - _wayPoints = new Point[40]; - memset(_wayPoints, 0, sizeof(Point)); + _wayPoints = new WayPoint[40]; + memset(_wayPoints, 0, sizeof(WayPoint)); } void Map_v1::loadMapObjects(const char *avjFile) { diff --git a/engines/gob/map_v2.cpp b/engines/gob/map_v2.cpp index 7460128ca9..968663a4b4 100644 --- a/engines/gob/map_v2.cpp +++ b/engines/gob/map_v2.cpp @@ -138,7 +138,7 @@ void Map_v2::loadMapObjects(const char *avjFile) { wayPointsCount = _wayPointCount == 0 ? 1 : _wayPointCount; delete[] _wayPoints; - _wayPoints = new Point[wayPointsCount]; + _wayPoints = new WayPoint[wayPointsCount]; for (int i = 0; i < _wayPointCount; i++) { _wayPoints[i].x = mapData.readSByte(); _wayPoints[i].y = mapData.readSByte(); |