aboutsummaryrefslogtreecommitdiff
path: root/engines/access/player.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/access/player.cpp')
-rw-r--r--engines/access/player.cpp175
1 files changed, 163 insertions, 12 deletions
diff --git a/engines/access/player.cpp b/engines/access/player.cpp
index 8cd129f0b2..a50b835e3e 100644
--- a/engines/access/player.cpp
+++ b/engines/access/player.cpp
@@ -52,6 +52,10 @@ Player::Player(AccessEngine *vm): Manager(vm), ImageEntry() {
_leftDelta = _rightDelta = 0;
_upDelta = _downDelta = 0;
_scrollConst = 0;
+ _scrollFlag = false;
+ _scrollThreshold = 0;
+ _scrollAmount = 0;
+ _scrollEnd = 0;
_roomNumber = 0;
_collideFlag = false;
_move = NONE;
@@ -293,11 +297,11 @@ void Player::walkLeft() {
_playerDirection = LEFT;
- bool flag = _vm->_screen->_scrollEnd == 1;
+ bool flag = _scrollEnd == 1;
if (!flag) {
calcPlayer();
flag = (_playerX - _vm->_screen->_scaleTable1[_scrollConst] -
- _vm->_screen->_scrollThreshold) > 0;
+ _vm->_player->_scrollThreshold) > 0;
}
if (flag) {
int walkOffset = _walkOffLeft[_frame - _sideWalkMin];
@@ -332,11 +336,11 @@ void Player::walkRight() {
_playerDirection = RIGHT;
- bool flag = _vm->_screen->_scrollEnd == 2;
+ bool flag = _scrollEnd == 2;
if (!flag) {
calcPlayer();
flag = (_vm->_screen->_clipWidth - _playerX - _vm->_screen->_scaleTable1[_scrollConst] -
- _vm->_screen->_scrollThreshold) > 0;
+ _vm->_player->_scrollThreshold) > 0;
}
if (flag) {
int walkOffset = _walkOffLeft[_frame - _sideWalkMin];
@@ -372,11 +376,11 @@ void Player::walkUpLeft() {
_playerDirection = UPLEFT;
int walkOffset;
- bool flag = _vm->_screen->_scrollEnd == 1;
+ bool flag = _scrollEnd == 1;
if (!flag) {
calcPlayer();
flag = (_playerX - _vm->_screen->_scaleTable1[_scrollConst] -
- _vm->_screen->_scrollThreshold) > 0;
+ _vm->_player->_scrollThreshold) > 0;
}
if (flag) {
walkOffset = _walkOffUL[_frame - _diagUpWalkMin].x;
@@ -419,11 +423,11 @@ void Player::walkDownLeft() {
_playerDirection = DOWNLEFT;
int walkOffset;
- bool flag = _vm->_screen->_scrollEnd == 1;
+ bool flag = _scrollEnd == 1;
if (!flag) {
calcPlayer();
flag = (_playerX - _vm->_screen->_scaleTable1[_scrollConst] -
- _vm->_screen->_scrollThreshold) > 0;
+ _vm->_player->_scrollThreshold) > 0;
}
if (flag) {
walkOffset = _walkOffDL[_frame - _sideWalkMin].x;
@@ -466,11 +470,11 @@ void Player::walkUpRight() {
_playerDirection = UPLEFT;
int walkOffset;
- bool flag = _vm->_screen->_scrollEnd == 1;
+ bool flag = _scrollEnd == 1;
if (!flag) {
calcPlayer();
flag = (_vm->_screen->_clipWidth - _playerX - _vm->_screen->_scaleTable1[_scrollConst] -
- _vm->_screen->_scrollThreshold) > 0;
+ _vm->_player->_scrollThreshold) > 0;
}
if (flag) {
walkOffset = _walkOffUR[_frame - _diagUpWalkMin].x;
@@ -513,11 +517,11 @@ void Player::walkDownRight() {
_playerDirection = DOWNRIGHT;
int walkOffset;
- bool flag = _vm->_screen->_scrollEnd == 1;
+ bool flag = _scrollEnd == 1;
if (!flag) {
calcPlayer();
flag = (_playerX - _vm->_screen->_scaleTable1[_scrollConst] -
- _vm->_screen->_scrollThreshold) > 0;
+ _vm->_player->_scrollThreshold) > 0;
}
if (flag) {
walkOffset = _walkOffUR[_frame - _sideWalkMin].x;
@@ -654,4 +658,151 @@ bool Player::codeWalls() {
error("TODO");
}
+void Player::checkScroll() {
+ _scrollFlag = false;
+ if (_playerDirection == NONE)
+ return;
+
+ if ((_playerDirection == UPLEFT || _playerDirection == DOWNLEFT ||
+ _playerDirection == LEFT) && _playerX <= _scrollThreshold) {
+ // Scroll right
+ _scrollAmount = -(_playerX - _scrollThreshold);
+ _scrollFlag = true;
+ _vm->_screen->_scrollX -= _scrollAmount;
+ if (_vm->_screen->_scrollX < 0) {
+ _scrollFlag = true;
+ _vm->_screen->_scrollX += _scrollAmount;
+
+ while (_vm->_screen->_scrollX >= TILE_WIDTH && !_vm->shouldQuit()) {
+ _vm->_screen->_scrollX -= TILE_WIDTH;
+ _vm->_screen->moveBufferLeft();
+ _vm->_room->buildColumn(_vm->_screen->_scrollCol -
+ _vm->_screen->_vWindowWidth, _vm->_screen->_vWindowBytesWide);
+
+ if (_vm->_screen->_scrollX < TILE_WIDTH && _playerDirection != UPRIGHT) {
+ if (_playerDirection != DOWNRIGHT)
+ return;
+ goto finish;
+ }
+ }
+
+ _scrollEnd = 1;
+ _vm->_screen->_scrollX = 0;
+ _vm->_screen->_scrollCol = 0;
+ }
+ } else if ((_playerDirection == UPRIGHT || _playerDirection == DOWNRIGHT ||
+ _playerDirection == RIGHT) && (_vm->_screen->_clipWidth -
+ _playerX - _scrollThreshold) <= 0) {
+ // Scroll left
+ _scrollAmount = -(_vm->_screen->_clipWidth - _playerX - _scrollThreshold);
+ if ((_vm->_rScrollCol + _vm->_screen->_vWindowWidth) == _vm->_room->_playFieldWidth) {
+ _scrollEnd = 2;
+ _vm->_screen->_scrollX = 0;
+ _scrollFlag = true;
+ } else {
+ _scrollFlag = true;
+ _vm->_screen->_scrollX = _vm->_screen->_scrollX + _scrollAmount;
+
+ while (_vm->_screen->_scrollX >= TILE_WIDTH && !_vm->shouldQuit()) {
+ _vm->_screen->_scrollX -= TILE_WIDTH;
+ ++_vm->_screen->_scrollCol;
+ _vm->_screen->moveBufferLeft();
+ _vm->_room->buildColumn(_vm->_screen->_scrollCol +
+ _vm->_screen->_vWindowWidth, _vm->_screen->_vWindowBytesWide);
+
+ if (_vm->_screen->_scrollX < TILE_WIDTH && _playerDirection != UPRIGHT) {
+ if (_playerDirection != DOWNRIGHT)
+ return;
+ goto finish;
+ }
+ }
+
+ _scrollEnd = 2;
+ _vm->_screen->_scrollX = 0;
+ _scrollFlag = true;
+ }
+ }
+
+ if ((_playerDirection == UPRIGHT || _playerDirection == UPLEFT ||
+ _playerDirection == UP) && _playerY <= _scrollThreshold) {
+ _scrollAmount = -(_playerY - _scrollThreshold);
+ _scrollFlag = true;
+ _vm->_screen->_scrollY -= _scrollAmount;
+ if (_vm->_screen->_scrollY >= 0)
+ return;
+
+ do {
+ _vm->_screen->_scrollY += TILE_HEIGHT;
+ if (--_vm->_screen->_scrollRow < 0)
+ break;
+
+ _vm->_screen->moveBufferDown();
+ _vm->_room->buildRow(_vm->_screen->_scrollRow, 0);
+
+ if (_vm->_screen->_scrollY >= 0)
+ return;
+ } while (!_vm->shouldQuit());
+
+ _scrollEnd = 3;
+ _vm->_screen->_scrollY = 0;
+ _vm->_screen->_scrollRow = 0;
+ return;
+ }
+
+finish:
+ if ((_playerDirection == DOWNRIGHT || _playerDirection == DOWNLEFT ||
+ _playerDirection == DOWN) && (_vm->_screen->_clipHeight -
+ _playerY - _scrollThreshold) <= 0) {
+ // Scroll up
+ if (scrollUp()) {
+ _scrollEnd = 4;
+ _vm->_screen->_scrollY = TILE_HEIGHT;
+ _scrollFlag = true;
+ }
+ }
+}
+
+bool Player::scrollUp() {
+ _scrollAmount = -(_vm->_screen->_clipHeight - _playerY - _scrollThreshold);
+ if ((_vm->_screen->_scrollRow + _vm->_screen->_vWindowHeight) >=
+ _vm->_room->_playFieldHeight)
+ return true;
+
+ _scrollFlag = true;
+ _vm->_screen->_scrollY = _vm->_screen->_scrollY + _scrollAmount;
+
+ while (_vm->_screen->_scrollY >= TILE_HEIGHT && !_vm->shouldQuit()) {
+ _vm->_screen->_scrollY -= TILE_HEIGHT;
+ ++_vm->_screen->_scrollRow;
+ _vm->_screen->moveBufferUp();
+
+ _vm->_room->buildRow(_vm->_screen->_scrollRow + _vm->_screen->_vWindowHeight,
+ _vm->_screen->_vWindowLinesTall * _vm->_screen->_bufferBytesWide);
+
+ if ((_vm->_screen->_scrollRow + _vm->_screen->_vWindowHeight) >=
+ _vm->_room->_playFieldHeight)
+ return true;
+
+ if (_vm->_screen->_scrollY <= TILE_HEIGHT)
+ return false;
+ }
+
+ return false;
+}
+
+bool Player::scrollDown() {
+ // TODO: Refactor checkScroll code here
+ return false;
+}
+
+bool Player::scrollLeft() {
+ // TODO: Refactor checkScroll code here
+ return false;
+}
+
+bool Player::scrollRight() {
+ // TODO: Refactor checkScroll code here
+ return false;
+}
+
} // End of namespace Access