Fixing _itemsMap access (bug #2069177)

svn-id: r34113
This commit is contained in:
Sven Hesse 2008-08-23 14:18:12 +00:00
parent 2f5da4f356
commit 5c060ef5d9
4 changed files with 114 additions and 96 deletions

View File

@ -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));
}
}
}

View File

@ -2443,10 +2443,10 @@ void Inter_v1::o1_getItem(OpGobParams &params) {
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 &params) {
@ -2468,10 +2468,10 @@ void Inter_v1::o1_getItemIndirect(OpGobParams &params) {
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 &params) {
@ -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));
}
}
}

View File

@ -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 {

View File

@ -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<int>(x, 0, _mapWidth - 1);
y = CLIP<int>(y, 0, _mapHeight - 1);
return _itemsMap[y][x];
}
virtual void setItem(int x, int y, int16 item) {
assert(_itemsMap);
x = CLIP<int>(x, 0, _mapWidth - 1);
y = CLIP<int>(y, 0, _mapHeight - 1);
_itemsMap[y][x] = item;
}
virtual int8 getPass(int x, int y, int heightOff = -1) {
if (!_passMap)
return 0;