From 5c060ef5d9491e05a5dc5a831e64f1c675922c80 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 23 Aug 2008 14:18:12 +0000 Subject: Fixing _itemsMap access (bug #2069177) svn-id: r34113 --- engines/gob/goblin.cpp | 74 ++++++++++++++++--------------- engines/gob/inter_v1.cpp | 110 +++++++++++++++++++++++------------------------ engines/gob/map.cpp | 6 +-- engines/gob/map.h | 20 +++++++++ 4 files changed, 114 insertions(+), 96 deletions(-) (limited to 'engines') diff --git a/engines/gob/goblin.cpp b/engines/gob/goblin.cpp index 5add0b9cea..55758cdfdc 100644 --- a/engines/gob/goblin.cpp +++ b/engines/gob/goblin.cpp @@ -652,7 +652,7 @@ void Goblin::adjustDest(int16 posX, int16 posY) { if ((_vm->_map->getPass(_pressedMapX, _pressedMapY) == 0) && ((_gobAction == 0) || - (_vm->_map->_itemsMap[_pressedMapY][_pressedMapX] == 0))) { + (_vm->_map->getItem(_pressedMapX, _pressedMapY) == 0))) { resDelta = -1; resDeltaDir = 0; @@ -727,17 +727,17 @@ void Goblin::adjustDest(int16 posX, int16 posY) { void Goblin::adjustTarget(void) { if ((_gobAction == 4) && - (_vm->_map->_itemsMap[_pressedMapY][_pressedMapX] == 0)) { + (_vm->_map->getItem(_pressedMapX, _pressedMapY) == 0)) { if ((_pressedMapY > 0) && - (_vm->_map->_itemsMap[_pressedMapY - 1][_pressedMapX] != 0)) { + (_vm->_map->getItem(_pressedMapX, _pressedMapY - 1) != 0)) { _pressedMapY--; } else if ((_pressedMapX < (_vm->_map->_mapWidth - 1)) && - (_vm->_map->_itemsMap[_pressedMapY][_pressedMapX + 1] != 0)) { + (_vm->_map->getItem(_pressedMapX + 1, _pressedMapY) != 0)) { _pressedMapX++; } else if ((_pressedMapX < (_vm->_map->_mapWidth - 1)) && (_pressedMapY > 0) && - (_vm->_map->_itemsMap[_pressedMapY - 1][_pressedMapX + 1] != 0)) { + (_vm->_map->getItem(_pressedMapX + 1, _pressedMapY - 1) != 0)) { _pressedMapY--; _pressedMapX++; } @@ -747,7 +747,7 @@ void Goblin::adjustTarget(void) { } void Goblin::targetDummyItem(Gob_Object *gobDesc) { - if (_vm->_map->_itemsMap[_pressedMapY][_pressedMapX] == 0 && + if (_vm->_map->getItem(_pressedMapX, _pressedMapY) == 0 && _vm->_map->getPass(_pressedMapX, _pressedMapY) == 1) { if (gobDesc->curLookDir == 0) { _vm->_map->_itemPoses[0].x = _pressedMapX; @@ -771,7 +771,7 @@ void Goblin::targetItem(void) { Gob_Object *itemDesc; if ((_gobAction == 3) || (_gobAction == 4)) { - items = _vm->_map->_itemsMap[_pressedMapY][_pressedMapX]; + items = _vm->_map->getItem(_pressedMapX, _pressedMapY); if ((_gobAction == 4) && ((items & 0xFF00) != 0) && (_objects[_itemToObject[(items & 0xFF00) >> 8]]->pickable == 1)) { _destItemId = (items & 0xFF00) >> 8; @@ -802,40 +802,40 @@ void Goblin::targetItem(void) { _gobDestX = _vm->_map->_itemPoses[_destItemId].x; } else if ((items & 0xFF00) != 0) { if (_vm->_map->_itemPoses[_destItemId].orient == 4) { - if ((_vm->_map->_itemsMap[_pressedMapY][_pressedMapX - 1] & 0xFF00) == - (_vm->_map->_itemsMap[_pressedMapY][_pressedMapX] & 0xFF00)) { + if ((_vm->_map->getItem(_pressedMapX - 1, _pressedMapY) & 0xFF00) == + (_vm->_map->getItem(_pressedMapX, _pressedMapY) & 0xFF00)) { _pressedMapX--; _vm->_map->_destX = _pressedMapX; _gobDestX = _pressedMapX; } } else if (_vm->_map->_itemPoses[_destItemId].orient == 0) { - if ((_vm->_map->_itemsMap[_pressedMapY][_pressedMapX + 1] & 0xFF00) == - (_vm->_map->_itemsMap[_pressedMapY][_pressedMapX] & 0xFF00)) { + if ((_vm->_map->getItem(_pressedMapX + 1, _pressedMapY) & 0xFF00) == + (_vm->_map->getItem(_pressedMapX, _pressedMapY) & 0xFF00)) { _pressedMapX++; _vm->_map->_destX = _pressedMapX; _gobDestX = _pressedMapX; } } - if ((_vm->_map->_itemsMap[_pressedMapY + 1][_pressedMapX] & 0xFF00) == - (_vm->_map->_itemsMap[_pressedMapY][_pressedMapX] & 0xFF00)) { + if ((_vm->_map->getItem(_pressedMapX, _pressedMapY + 1) & 0xFF00) == + (_vm->_map->getItem(_pressedMapX, _pressedMapY) & 0xFF00)) { _pressedMapY++; _vm->_map->_destY = _pressedMapY; _gobDestY = _pressedMapY; } } else { if (_vm->_map->_itemPoses[_destItemId].orient == 4) { - if ((_vm->_map->_itemsMap[_pressedMapY][_pressedMapX - 1]) == - (_vm->_map->_itemsMap[_pressedMapY][_pressedMapX])) { + if ((_vm->_map->getItem(_pressedMapX - 1, _pressedMapY)) == + (_vm->_map->getItem(_pressedMapX, _pressedMapY))) { _pressedMapX--; _vm->_map->_destX = _pressedMapX; _gobDestX = _pressedMapX; } } else if (_vm->_map->_itemPoses[_destItemId].orient == 0) { - if ((_vm->_map->_itemsMap[_pressedMapY][_pressedMapX + 1]) == - (_vm->_map->_itemsMap[_pressedMapY][_pressedMapX])) { + if ((_vm->_map->getItem(_pressedMapX + 1, _pressedMapY)) == + (_vm->_map->getItem(_pressedMapX, _pressedMapY))) { _pressedMapX++; _vm->_map->_destX = _pressedMapX; _gobDestX = _pressedMapX; @@ -843,8 +843,8 @@ void Goblin::targetItem(void) { } if (_pressedMapY < (_vm->_map->_mapHeight-1)) { - if ((_vm->_map->_itemsMap[_pressedMapY + 1][_pressedMapX]) == - (_vm->_map->_itemsMap[_pressedMapY][_pressedMapX])) { + if ((_vm->_map->getItem(_pressedMapX, _pressedMapY + 1)) == + (_vm->_map->getItem(_pressedMapX, _pressedMapY))) { _pressedMapY++; _vm->_map->_destY = _pressedMapY; _gobDestY = _pressedMapY; @@ -931,37 +931,37 @@ void Goblin::moveFindItem(int16 posX, int16 posY) { _pressedMapX = CLIP(posX / 12, 0, _vm->_map->_mapWidth - 1); _pressedMapY = CLIP(posY / 6, 0, _vm->_map->_mapHeight - 1); - if ((_vm->_map->_itemsMap[_pressedMapY][_pressedMapX] == 0) && (i < 20)) { + if ((_vm->_map->getItem(_pressedMapX, _pressedMapY) == 0) && (i < 20)) { if ((_pressedMapY < (_vm->_map->_mapHeight - 1)) && - (_vm->_map->_itemsMap[_pressedMapY + 1][_pressedMapX] != 0)) { + (_vm->_map->getItem(_pressedMapX, _pressedMapY + 1) != 0)) { _pressedMapY++; } else if ((_pressedMapX < (_vm->_map->_mapWidth - 1)) && (_pressedMapY < (_vm->_map->_mapHeight - 1)) && - (_vm->_map->_itemsMap[_pressedMapY + 1][_pressedMapX + 1] != 0)) { + (_vm->_map->getItem(_pressedMapX + 1, _pressedMapY + 1) != 0)) { _pressedMapX++; _pressedMapY++; } else if ((_pressedMapX < (_vm->_map->_mapWidth - 1)) && - (_vm->_map->_itemsMap[_pressedMapY][_pressedMapX + 1] != 0)) { + (_vm->_map->getItem(_pressedMapX + 1, _pressedMapY) != 0)) { _pressedMapX++; } else if ((_pressedMapX < (_vm->_map->_mapWidth - 1)) && (_pressedMapY > 0) && - (_vm->_map->_itemsMap[_pressedMapY - 1][_pressedMapX + 1] != 0)) { + (_vm->_map->getItem(_pressedMapX + 1, _pressedMapY - 1) != 0)) { _pressedMapX++; _pressedMapY--; } else if ((_pressedMapY > 0) && - (_vm->_map->_itemsMap[_pressedMapY - 1][_pressedMapX] != 0)) { + (_vm->_map->getItem(_pressedMapX, _pressedMapY - 1) != 0)) { _pressedMapY--; } else if ((_pressedMapY > 0) && (_pressedMapX > 0) && - (_vm->_map->_itemsMap[_pressedMapY - 1][_pressedMapX - 1] != 0)) { + (_vm->_map->getItem(_pressedMapX - 1, _pressedMapY - 1) != 0)) { _pressedMapY--; _pressedMapX--; } else if ((_pressedMapX > 0) && - (_vm->_map->_itemsMap[_pressedMapY][_pressedMapX - 1] != 0)) { + (_vm->_map->getItem(_pressedMapX - 1, _pressedMapY) != 0)) { _pressedMapX--; } else if ((_pressedMapX > 0) && (_pressedMapY < (_vm->_map->_mapHeight - 1)) && - (_vm->_map->_itemsMap[_pressedMapY + 1][_pressedMapX - 1] != 0)) { + (_vm->_map->getItem(_pressedMapX - 1, _pressedMapY + 1) != 0)) { _pressedMapX--; _pressedMapY++; } @@ -1384,11 +1384,11 @@ void Goblin::pickItem(int16 indexToPocket, int16 idToPocket) { for (int y = 0; y < _vm->_map->_mapHeight; y++) { for (int x = 0; x < _vm->_map->_mapWidth; x++) { if (_itemByteFlag == 1) { - if (((_vm->_map->_itemsMap[y][x] & 0xFF00) >> 8) == idToPocket) - _vm->_map->_itemsMap[y][x] &= 0xFF; + if (((_vm->_map->getItem(x, y) & 0xFF00) >> 8) == idToPocket) + _vm->_map->setItem(x, y, _vm->_map->getItem(x, y) & 0xFF); } else { - if ((_vm->_map->_itemsMap[y][x] & 0xFF) == idToPocket) - _vm->_map->_itemsMap[y][x] &= 0xFF00; + if ((_vm->_map->getItem(x, y) & 0xFF) == idToPocket) + _vm->_map->setItem(x, y, _vm->_map->getItem(x, y) & 0xFF00); } } } @@ -1494,18 +1494,16 @@ void Goblin::swapItems(int16 indexToPick, int16 idToPick) { if (_itemByteFlag == 0) { for (y = 0; y < _vm->_map->_mapHeight; y++) { for (x = 0; x < _vm->_map->_mapWidth; x++) { - if ((_vm->_map->_itemsMap[y][x] & 0xFF) == idToPick) - _vm->_map->_itemsMap[y][x] = - (_vm->_map->_itemsMap[y][x] & 0xFF00) + idToPlace; + if ((_vm->_map->getItem(x, y) & 0xFF) == idToPick) + _vm->_map->setItem(x, y, (_vm->_map->getItem(x, y) & 0xFF00) + idToPlace); } } } else { for (y = 0; y < _vm->_map->_mapHeight; y++) { for (x = 0; x < _vm->_map->_mapWidth; x++) { - if (((_vm->_map->_itemsMap[y][x] & 0xFF00) >> 8) == idToPick) - _vm->_map->_itemsMap[y][x] = - (_vm->_map->_itemsMap[y][x] & 0xFF) + (idToPlace << 8); + if (((_vm->_map->getItem(x, y) & 0xFF00) >> 8) == idToPick) + _vm->_map->setItem(x, y, (_vm->_map->getItem(x, y) & 0xFF) + (idToPlace << 8)); } } } diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp index 865d188a2e..18c29ec978 100644 --- a/engines/gob/inter_v1.cpp +++ b/engines/gob/inter_v1.cpp @@ -2443,10 +2443,10 @@ void Inter_v1::o1_getItem(OpGobParams ¶ms) { int16 xPos = load16(); int16 yPos = load16(); - if ((_vm->_map->_itemsMap[yPos][xPos] & 0xFF00) != 0) - params.retVarPtr = (uint32) ((_vm->_map->_itemsMap[yPos][xPos] & 0xFF00) >> 8); + if ((_vm->_map->getItem(xPos, yPos) & 0xFF00) != 0) + params.retVarPtr = (uint32) ((_vm->_map->getItem(xPos, yPos) & 0xFF00) >> 8); else - params.retVarPtr = (uint32) _vm->_map->_itemsMap[yPos][xPos]; + params.retVarPtr = (uint32) _vm->_map->getItem(xPos, yPos); } void Inter_v1::o1_manipulateMapIndirect(OpGobParams ¶ms) { @@ -2468,10 +2468,10 @@ void Inter_v1::o1_getItemIndirect(OpGobParams ¶ms) { xPos = VAR(xPos); yPos = VAR(yPos); - if ((_vm->_map->_itemsMap[yPos][xPos] & 0xFF00) != 0) - params.retVarPtr = (uint32) ((_vm->_map->_itemsMap[yPos][xPos] & 0xFF00) >> 8); + if ((_vm->_map->getItem(xPos, yPos) & 0xFF00) != 0) + params.retVarPtr = (uint32) ((_vm->_map->getItem(xPos, yPos) & 0xFF00) >> 8); else - params.retVarPtr = (uint32) _vm->_map->_itemsMap[yPos][xPos]; + params.retVarPtr = (uint32) _vm->_map->getItem(xPos, yPos); } void Inter_v1::o1_setPassMap(OpGobParams ¶ms) { @@ -3025,88 +3025,88 @@ void Inter_v1::animPalette() { void Inter_v1::manipulateMap(int16 xPos, int16 yPos, int16 item) { for (int y = 0; y < _vm->_map->_mapHeight; y++) { for (int x = 0; x < _vm->_map->_mapWidth; x++) { - if ((_vm->_map->_itemsMap[y][x] & 0xFF) == item) - _vm->_map->_itemsMap[y][x] &= 0xFF00; - else if (((_vm->_map->_itemsMap[y][x] & 0xFF00) >> 8) == item) - _vm->_map->_itemsMap[y][x] &= 0xFF; + if ((_vm->_map->getItem(x, y) & 0xFF) == item) + _vm->_map->setItem(x, y, _vm->_map->getItem(x, y) & 0xFF00); + else if (((_vm->_map->getItem(x, y) & 0xFF00) >> 8) == item) + _vm->_map->setItem(x, y, _vm->_map->getItem(x, y) & 0xFF); } } if (xPos < _vm->_map->_mapWidth - 1) { if (yPos > 0) { - if (((_vm->_map->_itemsMap[yPos][xPos] & 0xFF00) != 0) || - ((_vm->_map->_itemsMap[yPos - 1][xPos] & 0xFF00) != 0) || - ((_vm->_map->_itemsMap[yPos][xPos + 1] & 0xFF00) != 0) || - ((_vm->_map->_itemsMap[yPos - 1][xPos + 1] & 0xFF00) != 0)) { + if (((_vm->_map->getItem(xPos, yPos) & 0xFF00) != 0) || + ((_vm->_map->getItem(xPos, yPos - 1) & 0xFF00) != 0) || + ((_vm->_map->getItem(xPos + 1, yPos) & 0xFF00) != 0) || + ((_vm->_map->getItem(xPos + 1, yPos - 1) & 0xFF00) != 0)) { - _vm->_map->_itemsMap[yPos][xPos] = - (_vm->_map->_itemsMap[yPos][xPos] & 0xFF00) + item; + _vm->_map->setItem(xPos, yPos, + (_vm->_map->getItem(xPos, yPos) & 0xFF00) + item); - _vm->_map->_itemsMap[yPos - 1][xPos] = - (_vm->_map->_itemsMap[yPos - 1][xPos] & 0xFF00) + item; + _vm->_map->setItem(xPos, yPos - 1, + (_vm->_map->getItem(xPos, yPos - 1) & 0xFF00) + item); - _vm->_map->_itemsMap[yPos][xPos + 1] = - (_vm->_map->_itemsMap[yPos][xPos + 1] & 0xFF00) + item; + _vm->_map->setItem(xPos + 1, yPos, + (_vm->_map->getItem(xPos + 1, yPos) & 0xFF00) + item); - _vm->_map->_itemsMap[yPos - 1][xPos + 1] = - (_vm->_map->_itemsMap[yPos - 1][xPos + 1] & 0xFF00) + item; + _vm->_map->setItem(xPos + 1, yPos - 1, + (_vm->_map->getItem(xPos + 1, yPos - 1) & 0xFF00) + item); } else { - _vm->_map->_itemsMap[yPos][xPos] = - (_vm->_map->_itemsMap[yPos][xPos] & 0xFF) + (item << 8); + _vm->_map->setItem(xPos, yPos, + (_vm->_map->getItem(xPos, yPos) & 0xFF) + (item << 8)); - _vm->_map->_itemsMap[yPos - 1][xPos] = - (_vm->_map->_itemsMap[yPos - 1][xPos] & 0xFF) + (item << 8); + _vm->_map->setItem(xPos, yPos - 1, + (_vm->_map->getItem(xPos, yPos - 1) & 0xFF) + (item << 8)); - _vm->_map->_itemsMap[yPos][xPos + 1] = - (_vm->_map->_itemsMap[yPos][xPos + 1] & 0xFF) + (item << 8); + _vm->_map->setItem(xPos + 1, yPos, + (_vm->_map->getItem(xPos + 1, yPos) & 0xFF) + (item << 8)); - _vm->_map->_itemsMap[yPos - 1][xPos + 1] = - (_vm->_map->_itemsMap[yPos - 1][xPos + 1] & 0xFF) + (item << 8); + _vm->_map->setItem(xPos + 1, yPos - 1, + (_vm->_map->getItem(xPos + 1, yPos - 1) & 0xFF) + (item << 8)); } } else { - if (((_vm->_map->_itemsMap[yPos][xPos] & 0xFF00) != 0) || - ((_vm->_map->_itemsMap[yPos][xPos + 1] & 0xFF00) != 0)) { + if (((_vm->_map->getItem(xPos, yPos) & 0xFF00) != 0) || + ((_vm->_map->getItem(xPos + 1, yPos) & 0xFF00) != 0)) { - _vm->_map->_itemsMap[yPos][xPos] = - (_vm->_map->_itemsMap[yPos][xPos] & 0xFF00) + item; + _vm->_map->setItem(xPos, yPos, + (_vm->_map->getItem(xPos, yPos) & 0xFF00) + item); - _vm->_map->_itemsMap[yPos][xPos + 1] = - (_vm->_map->_itemsMap[yPos][xPos + 1] & 0xFF00) + item; + _vm->_map->setItem(xPos + 1, yPos, + (_vm->_map->getItem(xPos + 1, yPos) & 0xFF00) + item); } else { - _vm->_map->_itemsMap[yPos][xPos] = - (_vm->_map->_itemsMap[yPos][xPos] & 0xFF) + (item << 8); + _vm->_map->setItem(xPos, yPos, + (_vm->_map->getItem(xPos, yPos) & 0xFF) + (item << 8)); - _vm->_map->_itemsMap[yPos][xPos + 1] = - (_vm->_map->_itemsMap[yPos][xPos + 1] & 0xFF) + (item << 8); + _vm->_map->setItem(xPos + 1, yPos, + (_vm->_map->getItem(xPos + 1, yPos) & 0xFF) + (item << 8)); } } } else { if (yPos > 0) { - if (((_vm->_map->_itemsMap[yPos][xPos] & 0xFF00) != 0) || - ((_vm->_map->_itemsMap[yPos - 1][xPos] & 0xFF00) != 0)) { + if (((_vm->_map->getItem(xPos, yPos) & 0xFF00) != 0) || + ((_vm->_map->getItem(xPos, yPos - 1) & 0xFF00) != 0)) { - _vm->_map->_itemsMap[yPos][xPos] = - (_vm->_map->_itemsMap[yPos][xPos] & 0xFF00) + item; + _vm->_map->setItem(xPos, yPos, + (_vm->_map->getItem(xPos, yPos) & 0xFF00) + item); - _vm->_map->_itemsMap[yPos - 1][xPos] = - (_vm->_map->_itemsMap[yPos - 1][xPos] & 0xFF00) + item; + _vm->_map->setItem(xPos, yPos - 1, + (_vm->_map->getItem(xPos, yPos - 1) & 0xFF00) + item); } else { - _vm->_map->_itemsMap[yPos][xPos] = - (_vm->_map->_itemsMap[yPos][xPos] & 0xFF) + (item << 8); + _vm->_map->setItem(xPos, yPos, + (_vm->_map->getItem(xPos, yPos) & 0xFF) + (item << 8)); - _vm->_map->_itemsMap[yPos - 1][xPos] = - (_vm->_map->_itemsMap[yPos - 1][xPos] & 0xFF) + (item << 8); + _vm->_map->setItem(xPos, yPos - 1, + (_vm->_map->getItem(xPos, yPos - 1) & 0xFF) + (item << 8)); } } else { - if ((_vm->_map->_itemsMap[yPos][xPos] & 0xFF00) != 0) { - _vm->_map->_itemsMap[yPos][xPos] = - (_vm->_map->_itemsMap[yPos][xPos] & 0xFF00) + item; + if ((_vm->_map->getItem(xPos, yPos) & 0xFF00) != 0) { + _vm->_map->setItem(xPos, yPos, + (_vm->_map->getItem(xPos, yPos) & 0xFF00) + item); } else { - _vm->_map->_itemsMap[yPos][xPos] = - (_vm->_map->_itemsMap[yPos][xPos] & 0xFF) + (item << 8); + _vm->_map->setItem(xPos, yPos, + (_vm->_map->getItem(xPos, yPos) & 0xFF) + (item << 8)); } } } diff --git a/engines/gob/map.cpp b/engines/gob/map.cpp index 75867aaa6c..bb259800c0 100644 --- a/engines/gob/map.cpp +++ b/engines/gob/map.cpp @@ -77,10 +77,10 @@ Map::~Map() { } void Map::placeItem(int16 x, int16 y, int16 id) { - if ((_itemsMap[y][x] & 0xFF00) != 0) - _itemsMap[y][x] = (_itemsMap[y][x] & 0xFF00) | id; + if ((getItem(x, y) & 0xFF00) != 0) + setItem(x, y, (getItem(x, y) & 0xFF00) | id); else - _itemsMap[y][x] = (_itemsMap[y][x] & 0x00FF) | (id << 8); + setItem(x, y, (getItem(x, y) & 0x00FF) | (id << 8)); } enum { diff --git a/engines/gob/map.h b/engines/gob/map.h index 8a94de8da9..4a211f205d 100644 --- a/engines/gob/map.h +++ b/engines/gob/map.h @@ -101,6 +101,9 @@ public: void loadMapsInitGobs(void); + virtual int16 getItem(int x, int y) = 0; + virtual void setItem(int x, int y, int16 item) = 0; + virtual int8 getPass(int x, int y, int heightOff = -1) = 0; virtual void setPass(int x, int y, int8 pass, int heightOff = -1) = 0; @@ -127,6 +130,23 @@ public: virtual void findNearestToDest(Mult::Mult_Object *obj); virtual void optimizePoints(Mult::Mult_Object *obj, int16 x, int16 y); + virtual int16 getItem(int x, int y) { + assert(_itemsMap); + + x = CLIP(x, 0, _mapWidth - 1); + y = CLIP(y, 0, _mapHeight - 1); + + return _itemsMap[y][x]; + } + virtual void setItem(int x, int y, int16 item) { + assert(_itemsMap); + + x = CLIP(x, 0, _mapWidth - 1); + y = CLIP(y, 0, _mapHeight - 1); + + _itemsMap[y][x] = item; + } + virtual int8 getPass(int x, int y, int heightOff = -1) { if (!_passMap) return 0; -- cgit v1.2.3