aboutsummaryrefslogtreecommitdiff
path: root/engines/access/room.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/access/room.cpp')
-rw-r--r--engines/access/room.cpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 37746d1b7c..f32bc95ae0 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -339,7 +339,27 @@ void Room::buildColumn(int playX, int screenX) {
}
void Room::buildRow(int playY, int screenY) {
- error("TODO: buildRow");
+ if (playY < 0 || playY >= _playFieldHeight)
+ return;
+ assert(screenY <= (_vm->_screen->h - TILE_HEIGHT));
+
+ const byte *pSrc = _playField + screenY *_playFieldWidth + _vm->_screen->_scrollCol;
+
+ // WORKAROUND: Original's use of '+ 1' would frequently cause memory overruns
+ int w = MIN(_vm->_screen->_vWindowWidth + 1, _playFieldWidth);
+
+ for (int x = 0; x < w; ++x) {
+ byte *pTile = _tile + (*pSrc << 8);
+ byte *pDest = (byte *)_vm->_buffer1.getBasePtr(w * TILE_WIDTH, screenY);
+
+ for (int tileY = 0; tileY < TILE_HEIGHT; ++tileY) {
+ Common::copy(pTile, pTile + TILE_WIDTH, pDest);
+ pTile += TILE_WIDTH;
+ pDest += _vm->_buffer1.pitch;
+ }
+
+ ++pSrc;
+ }
}
void Room::loadPlayField(int fileNum, int subfile) {