diff options
Diffstat (limited to 'engines/gnap/grid.cpp')
-rw-r--r-- | engines/gnap/grid.cpp | 1561 |
1 files changed, 562 insertions, 999 deletions
diff --git a/engines/gnap/grid.cpp b/engines/gnap/grid.cpp index 568fe2520e..d4aed8dbc0 100644 --- a/engines/gnap/grid.cpp +++ b/engines/gnap/grid.cpp @@ -81,176 +81,81 @@ bool GnapEngine::isPointBlocked(int gridX, int gridY) { } return false; - } -bool GnapEngine::gnapFindPath4(int gridX, int gridY) { - bool result = false; - - _gnapWalkNodesCount = 0; - _gnapWalkDirXIncr = 0; - _gnapWalkDirYIncr = 0; - _gnapWalkDeltaX = ABS(_gnapWalkDestX - gridX); - _gnapWalkDeltaY = ABS(_gnapWalkDestY - gridY); - - if (_gnapWalkDeltaX) - _gnapWalkDirX = (_gnapWalkDestX - gridX) / _gnapWalkDeltaX; - else - _gnapWalkDirX = 0; - - if (_gnapWalkDeltaY) - _gnapWalkDirY = (_gnapWalkDestY - gridY) / _gnapWalkDeltaY; - else - _gnapWalkDirY = 0; - - while (_gnapWalkDirXIncr < _gnapWalkDeltaX && _gnapWalkDirYIncr < _gnapWalkDeltaY) { - _gnapWalkNodes[_gnapWalkNodesCount]._gridX1 = gridX + _gnapWalkDirX * _gnapWalkDirXIncr; - _gnapWalkNodes[_gnapWalkNodesCount]._gridY1 = gridY + _gnapWalkDirY * _gnapWalkDirYIncr; - if (!isPointBlocked(_gnapWalkDirX + _gnapWalkNodes[_gnapWalkNodesCount]._gridX1, _gnapWalkDirY + _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = _gnapWalkDirX; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = _gnapWalkDirY; - ++_gnapWalkDirXIncr; - ++_gnapWalkDirYIncr; - } else if (_gnapWalkDeltaY - _gnapWalkDirYIncr > _gnapWalkDeltaX - _gnapWalkDirXIncr) { - if (!isPointBlocked(_gnapWalkNodes[_gnapWalkNodesCount]._gridX1, _gnapWalkDirY + _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = 0; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = _gnapWalkDirY; - ++_gnapWalkDirYIncr; - } else if (!isPointBlocked(_gnapWalkDirX + _gnapWalkNodes[_gnapWalkNodesCount]._gridX1, _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = _gnapWalkDirX; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = 0; - ++_gnapWalkDirXIncr; - } else { - _gnapWalkDeltaX = _gnapWalkDirXIncr; - _gnapWalkDeltaY = _gnapWalkDirYIncr; - --_gnapWalkNodesCount; - } - } else { - if (!isPointBlocked(_gnapWalkDirX + _gnapWalkNodes[_gnapWalkNodesCount]._gridX1, _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = _gnapWalkDirX; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = 0; - ++_gnapWalkDirXIncr; - } else if (!isPointBlocked(_gnapWalkNodes[_gnapWalkNodesCount]._gridX1, _gnapWalkDirY + _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = 0; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = _gnapWalkDirY; - ++_gnapWalkDirYIncr; - } else { - _gnapWalkDeltaX = _gnapWalkDirXIncr; - _gnapWalkDeltaY = _gnapWalkDirYIncr; - --_gnapWalkNodesCount; - } - } - ++_gnapWalkNodesCount; - } - - while (_gnapWalkDirXIncr < _gnapWalkDeltaX) { - _gnapWalkNodes[_gnapWalkNodesCount]._gridX1 = gridX + _gnapWalkDirX * _gnapWalkDirXIncr; - _gnapWalkNodes[_gnapWalkNodesCount]._gridY1 = _gnapWalkDestY; - if (!isPointBlocked(_gnapWalkDirX + _gnapWalkNodes[_gnapWalkNodesCount]._gridX1, _gnapWalkDestY)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = _gnapWalkDirX; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = 0; - ++_gnapWalkDirXIncr; - ++_gnapWalkNodesCount; - } else { - _gnapWalkDeltaX = _gnapWalkDirXIncr; - } - } - - while (_gnapWalkDirYIncr < _gnapWalkDeltaY) { - _gnapWalkNodes[_gnapWalkNodesCount]._gridX1 = _gnapWalkDestX; - _gnapWalkNodes[_gnapWalkNodesCount]._gridY1 = gridY + _gnapWalkDirY * _gnapWalkDirYIncr; - if (!isPointBlocked(_gnapWalkDestX, _gnapWalkDirY + _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = 0; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = _gnapWalkDirY; - ++_gnapWalkDirYIncr; - ++_gnapWalkNodesCount; - } else { - _gnapWalkDeltaY = _gnapWalkDirYIncr; - } - } - - if (gridX + _gnapWalkDirX * _gnapWalkDirXIncr != _gnapWalkDestX || gridY + _gnapWalkDirY * _gnapWalkDirYIncr != _gnapWalkDestY) { - _gnapWalkDestX = gridX + _gnapWalkDirX * _gnapWalkDirXIncr; - _gnapWalkDestY = gridY + _gnapWalkDirY * _gnapWalkDirYIncr; - result = false; - } else { - result = true; - } +/******************************************************************************/ - return result; -} +bool PlayerGnap::findPath1(int gridX, int gridY, int index) { + _walkNodesCount = index; + _walkDirXIncr = 0; + _walkDirYIncr = 0; + _walkDeltaX = ABS(_walkDestX - gridX); + _walkDeltaY = ABS(_walkDestY - gridY); -bool GnapEngine::gnapFindPath1(int gridX, int gridY, int index) { - _gnapWalkNodesCount = index; - _gnapWalkDirXIncr = 0; - _gnapWalkDirYIncr = 0; - _gnapWalkDeltaX = ABS(_gnapWalkDestX - gridX); - _gnapWalkDeltaY = ABS(_gnapWalkDestY - gridY); - - if (_gnapWalkDeltaX) - _gnapWalkDirX = (_gnapWalkDestX - gridX) / _gnapWalkDeltaX; + if (_walkDeltaX) + _walkDirX = (_walkDestX - gridX) / _walkDeltaX; else - _gnapWalkDirX = 0; + _walkDirX = 0; - if (_gnapWalkDeltaY) - _gnapWalkDirY = (_gnapWalkDestY - gridY) / _gnapWalkDeltaY; + if (_walkDeltaY) + _walkDirY = (_walkDestY - gridY) / _walkDeltaY; else - _gnapWalkDirY = 0; - - while (_gnapWalkDirXIncr < _gnapWalkDeltaX && _gnapWalkDirYIncr < _gnapWalkDeltaY) { - _gnapWalkNodes[_gnapWalkNodesCount]._gridX1 = gridX + _gnapWalkDirX * _gnapWalkDirXIncr; - _gnapWalkNodes[_gnapWalkNodesCount]._gridY1 = gridY + _gnapWalkDirY * _gnapWalkDirYIncr; - if (!isPointBlocked(_gnapWalkDirX + _gnapWalkNodes[_gnapWalkNodesCount]._gridX1, _gnapWalkDirY + _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = _gnapWalkDirX; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = _gnapWalkDirY; - ++_gnapWalkDirXIncr; - ++_gnapWalkDirYIncr; - } else if (_gnapWalkDeltaY - _gnapWalkDirYIncr > _gnapWalkDeltaX - _gnapWalkDirXIncr) { - if (!isPointBlocked(_gnapWalkNodes[_gnapWalkNodesCount]._gridX1, _gnapWalkDirY + _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = 0; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = _gnapWalkDirY; - ++_gnapWalkDirYIncr; - } else if (!isPointBlocked(_gnapWalkDirX + _gnapWalkNodes[_gnapWalkNodesCount]._gridX1, _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = _gnapWalkDirX; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = 0; - ++_gnapWalkDirXIncr; + _walkDirY = 0; + + while (_walkDirXIncr < _walkDeltaX && _walkDirYIncr < _walkDeltaY) { + _walkNodes[_walkNodesCount]._gridX1 = gridX + _walkDirX * _walkDirXIncr; + _walkNodes[_walkNodesCount]._gridY1 = gridY + _walkDirY * _walkDirYIncr; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirXIncr; + ++_walkDirYIncr; + } else if (_walkDeltaY - _walkDirYIncr > _walkDeltaX - _walkDirXIncr) { + if (!_vm->isPointBlocked(_walkNodes[_walkNodesCount]._gridX1, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; + } else if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; } else return false; } else { - if (!isPointBlocked(_gnapWalkDirX + _gnapWalkNodes[_gnapWalkNodesCount]._gridX1, _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = _gnapWalkDirX; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = 0; - ++_gnapWalkDirXIncr; - } else if (!isPointBlocked(_gnapWalkNodes[_gnapWalkNodesCount]._gridX1, _gnapWalkDirY + _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = 0; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = _gnapWalkDirY; - ++_gnapWalkDirYIncr; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; + } else if (!_vm->isPointBlocked(_walkNodes[_walkNodesCount]._gridX1, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; } else return false; } - ++_gnapWalkNodesCount; + ++_walkNodesCount; } - while (_gnapWalkDirXIncr < _gnapWalkDeltaX) { - _gnapWalkNodes[_gnapWalkNodesCount]._gridX1 = gridX + _gnapWalkDirX * _gnapWalkDirXIncr; - _gnapWalkNodes[_gnapWalkNodesCount]._gridY1 = _gnapWalkDestY; - if (!isPointBlocked(_gnapWalkDirX + _gnapWalkNodes[_gnapWalkNodesCount]._gridX1, _gnapWalkDestY)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = _gnapWalkDirX; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = 0; - ++_gnapWalkDirXIncr; - ++_gnapWalkNodesCount; + while (_walkDirXIncr < _walkDeltaX) { + _walkNodes[_walkNodesCount]._gridX1 = gridX + _walkDirX * _walkDirXIncr; + _walkNodes[_walkNodesCount]._gridY1 = _walkDestY; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkDestY)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; + ++_walkNodesCount; } else return false; } - while (_gnapWalkDirYIncr < _gnapWalkDeltaY) { - _gnapWalkNodes[_gnapWalkNodesCount]._gridX1 = _gnapWalkDestX; - _gnapWalkNodes[_gnapWalkNodesCount]._gridY1 = gridY + _gnapWalkDirY * _gnapWalkDirYIncr; - if (!isPointBlocked(_gnapWalkDestX, _gnapWalkDirY + _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = 0; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = _gnapWalkDirY; - ++_gnapWalkDirYIncr; - ++_gnapWalkNodesCount; + while (_walkDirYIncr < _walkDeltaY) { + _walkNodes[_walkNodesCount]._gridX1 = _walkDestX; + _walkNodes[_walkNodesCount]._gridY1 = gridY + _walkDirY * _walkDirYIncr; + if (!_vm->isPointBlocked(_walkDestX, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; + ++_walkNodesCount; } else return false; } @@ -258,101 +163,101 @@ bool GnapEngine::gnapFindPath1(int gridX, int gridY, int index) { return true; } -bool GnapEngine::gnapFindPath2(int gridX, int gridY, int index) { - _gnapWalkNodesCount = index; - _gnapWalkDirXIncr = 0; - _gnapWalkDirYIncr = 0; - _gnapWalkDeltaX = ABS(_gnapWalkDestX - gridX); - _gnapWalkDeltaY = ABS(_gnapWalkDestY - gridY); +bool PlayerGnap::findPath2(int gridX, int gridY, int index) { + _walkNodesCount = index; + _walkDirXIncr = 0; + _walkDirYIncr = 0; + _walkDeltaX = ABS(_walkDestX - gridX); + _walkDeltaY = ABS(_walkDestY - gridY); - if (_gnapWalkDeltaX) - _gnapWalkDirX = (_gnapWalkDestX - gridX) / _gnapWalkDeltaX; + if (_walkDeltaX) + _walkDirX = (_walkDestX - gridX) / _walkDeltaX; else - _gnapWalkDirX = 0; + _walkDirX = 0; - if (_gnapWalkDeltaY) - _gnapWalkDirY = (_gnapWalkDestY - gridY) / _gnapWalkDeltaY; + if (_walkDeltaY) + _walkDirY = (_walkDestY - gridY) / _walkDeltaY; else - _gnapWalkDirY = 0; - - while (_gnapWalkDeltaY < _gnapWalkDeltaX - _gnapWalkDirXIncr) { - _gnapWalkNodes[_gnapWalkNodesCount]._gridX1 = gridX + _gnapWalkDirX * _gnapWalkDirXIncr; - _gnapWalkNodes[_gnapWalkNodesCount]._gridY1 = gridY; - if (!isPointBlocked(_gnapWalkDirX + _gnapWalkNodes[_gnapWalkNodesCount]._gridX1, gridY)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = _gnapWalkDirX; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = 0; - ++_gnapWalkDirXIncr; - ++_gnapWalkNodesCount; + _walkDirY = 0; + + while (_walkDeltaY < _walkDeltaX - _walkDirXIncr) { + _walkNodes[_walkNodesCount]._gridX1 = gridX + _walkDirX * _walkDirXIncr; + _walkNodes[_walkNodesCount]._gridY1 = gridY; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, gridY)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; + ++_walkNodesCount; } else return false; } - while (_gnapWalkDeltaX < _gnapWalkDeltaY - _gnapWalkDirYIncr) { - _gnapWalkNodes[_gnapWalkNodesCount]._gridX1 = gridX; - _gnapWalkNodes[_gnapWalkNodesCount]._gridY1 = gridY + _gnapWalkDirY * _gnapWalkDirYIncr; - if (!isPointBlocked(gridX, _gnapWalkDirY + _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = 0; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = _gnapWalkDirY; - ++_gnapWalkDirYIncr; - ++_gnapWalkNodesCount; + while (_walkDeltaX < _walkDeltaY - _walkDirYIncr) { + _walkNodes[_walkNodesCount]._gridX1 = gridX; + _walkNodes[_walkNodesCount]._gridY1 = gridY + _walkDirY * _walkDirYIncr; + if (!_vm->isPointBlocked(gridX, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; + ++_walkNodesCount; } else return false; } - while (_gnapWalkDirXIncr < _gnapWalkDeltaX && _gnapWalkDirYIncr < _gnapWalkDeltaY) { - _gnapWalkNodes[_gnapWalkNodesCount]._gridX1 = gridX + _gnapWalkDirX * _gnapWalkDirXIncr; - _gnapWalkNodes[_gnapWalkNodesCount]._gridY1 = gridY + _gnapWalkDirY * _gnapWalkDirYIncr; - if (!isPointBlocked(_gnapWalkDirX + _gnapWalkNodes[_gnapWalkNodesCount]._gridX1, _gnapWalkDirY + _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = _gnapWalkDirX; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = _gnapWalkDirY; - ++_gnapWalkDirXIncr; - ++_gnapWalkDirYIncr; - } else if (_gnapWalkDeltaY - _gnapWalkDirYIncr > _gnapWalkDeltaX - _gnapWalkDirXIncr) { - if (!isPointBlocked(_gnapWalkNodes[_gnapWalkNodesCount]._gridX1, _gnapWalkDirY + _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = 0; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = _gnapWalkDirY; - ++_gnapWalkDirYIncr; - } else if (!isPointBlocked(_gnapWalkDirX + _gnapWalkNodes[_gnapWalkNodesCount]._gridX1, _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = _gnapWalkDirX; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = 0; - ++_gnapWalkDirXIncr; + while (_walkDirXIncr < _walkDeltaX && _walkDirYIncr < _walkDeltaY) { + _walkNodes[_walkNodesCount]._gridX1 = gridX + _walkDirX * _walkDirXIncr; + _walkNodes[_walkNodesCount]._gridY1 = gridY + _walkDirY * _walkDirYIncr; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirXIncr; + ++_walkDirYIncr; + } else if (_walkDeltaY - _walkDirYIncr > _walkDeltaX - _walkDirXIncr) { + if (!_vm->isPointBlocked(_walkNodes[_walkNodesCount]._gridX1, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; + } else if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; } else return false; } else { - if (!isPointBlocked(_gnapWalkDirX + _gnapWalkNodes[_gnapWalkNodesCount]._gridX1, _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = _gnapWalkDirX; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = 0; - ++_gnapWalkDirXIncr; - } else if (!isPointBlocked(_gnapWalkNodes[_gnapWalkNodesCount]._gridX1, _gnapWalkDirY + _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = 0; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = _gnapWalkDirY; - ++_gnapWalkDirYIncr; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; + } else if (!_vm->isPointBlocked(_walkNodes[_walkNodesCount]._gridX1, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; } else return false; } - ++_gnapWalkNodesCount; + ++_walkNodesCount; } - while (_gnapWalkDirXIncr < _gnapWalkDeltaX) { - _gnapWalkNodes[_gnapWalkNodesCount]._gridX1 = gridX + _gnapWalkDirX * _gnapWalkDirXIncr; - _gnapWalkNodes[_gnapWalkNodesCount]._gridY1 = _gnapWalkDestY; - if (!isPointBlocked(_gnapWalkDirX + _gnapWalkNodes[_gnapWalkNodesCount]._gridX1, _gnapWalkDestY)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = _gnapWalkDirX; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = 0; - ++_gnapWalkDirXIncr; - ++_gnapWalkNodesCount; + while (_walkDirXIncr < _walkDeltaX) { + _walkNodes[_walkNodesCount]._gridX1 = gridX + _walkDirX * _walkDirXIncr; + _walkNodes[_walkNodesCount]._gridY1 = _walkDestY; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkDestY)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; + ++_walkNodesCount; } else return false; } - while (_gnapWalkDirYIncr < _gnapWalkDeltaY) { - _gnapWalkNodes[_gnapWalkNodesCount]._gridX1 = _gnapWalkDestX; - _gnapWalkNodes[_gnapWalkNodesCount]._gridY1 = gridY + _gnapWalkDirY * _gnapWalkDirYIncr; - if (!isPointBlocked(_gnapWalkDestX, _gnapWalkDirY + _gnapWalkNodes[_gnapWalkNodesCount]._gridY1)) { - _gnapWalkNodes[_gnapWalkNodesCount]._deltaX = 0; - _gnapWalkNodes[_gnapWalkNodesCount]._deltaY = _gnapWalkDirY; - ++_gnapWalkDirYIncr; - ++_gnapWalkNodesCount; + while (_walkDirYIncr < _walkDeltaY) { + _walkNodes[_walkNodesCount]._gridX1 = _walkDestX; + _walkNodes[_walkNodesCount]._gridY1 = gridY + _walkDirY * _walkDirYIncr; + if (!_vm->isPointBlocked(_walkDestX, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; + ++_walkNodesCount; } else return false; } @@ -360,167 +265,167 @@ bool GnapEngine::gnapFindPath2(int gridX, int gridY, int index) { return true; } -bool GnapEngine::gnapFindPath3(int gridX, int gridY) { +bool PlayerGnap::findPath3(int gridX, int gridY) { int gridIncr = 1; bool done = false; - while (!done && gridIncr < _gridMaxX) { - if (!isPointBlocked(gridX + gridIncr, gridY) && gnapFindPath1(gridX + gridIncr, gridY, gridIncr)) { + while (!done && gridIncr < _vm->_gridMaxX) { + if (!_vm->isPointBlocked(gridX + gridIncr, gridY) && findPath1(gridX + gridIncr, gridY, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _gnapWalkNodes[i]._gridX1 = gridX + i; - _gnapWalkNodes[i]._gridY1 = gridY; - _gnapWalkNodes[i]._deltaX = 1; - _gnapWalkNodes[i]._deltaY = 0; + _walkNodes[i]._gridX1 = gridX + i; + _walkNodes[i]._gridY1 = gridY; + _walkNodes[i]._deltaX = 1; + _walkNodes[i]._deltaY = 0; } done = true; break; } - if (!isPointBlocked(gridX - gridIncr, gridY) && gnapFindPath1(gridX - gridIncr, gridY, gridIncr)) { + if (!_vm->isPointBlocked(gridX - gridIncr, gridY) && findPath1(gridX - gridIncr, gridY, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _gnapWalkNodes[i]._gridX1 = gridX - i; - _gnapWalkNodes[i]._gridY1 = gridY; - _gnapWalkNodes[i]._deltaX = -1; - _gnapWalkNodes[i]._deltaY = 0; + _walkNodes[i]._gridX1 = gridX - i; + _walkNodes[i]._gridY1 = gridY; + _walkNodes[i]._deltaX = -1; + _walkNodes[i]._deltaY = 0; } done = true; break; } - if (!isPointBlocked(gridX, gridY + gridIncr) && gnapFindPath1(gridX, gridY + gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(gridX, gridY + gridIncr) && findPath1(gridX, gridY + gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _gnapWalkNodes[i]._gridX1 = gridX; - _gnapWalkNodes[i]._gridY1 = gridY + i; - _gnapWalkNodes[i]._deltaX = 0; - _gnapWalkNodes[i]._deltaY = 1; + _walkNodes[i]._gridX1 = gridX; + _walkNodes[i]._gridY1 = gridY + i; + _walkNodes[i]._deltaX = 0; + _walkNodes[i]._deltaY = 1; } done = true; break; } - if (!isPointBlocked(gridX, gridY - gridIncr) && gnapFindPath1(gridX, gridY - gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(gridX, gridY - gridIncr) && findPath1(gridX, gridY - gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _gnapWalkNodes[i]._gridX1 = gridX; - _gnapWalkNodes[i]._gridY1 = gridY - i; - _gnapWalkNodes[i]._deltaX = 0; - _gnapWalkNodes[i]._deltaY = -1; + _walkNodes[i]._gridX1 = gridX; + _walkNodes[i]._gridY1 = gridY - i; + _walkNodes[i]._deltaX = 0; + _walkNodes[i]._deltaY = -1; } done = true; break; } - if (!isPointBlocked(gridX + gridIncr, gridY + gridIncr) && gnapFindPath1(gridX + gridIncr, gridY + gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(gridX + gridIncr, gridY + gridIncr) && findPath1(gridX + gridIncr, gridY + gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _gnapWalkNodes[i]._gridX1 = gridX + i; - _gnapWalkNodes[i]._gridY1 = gridY + i; - _gnapWalkNodes[i]._deltaX = 1; - _gnapWalkNodes[i]._deltaY = 1; + _walkNodes[i]._gridX1 = gridX + i; + _walkNodes[i]._gridY1 = gridY + i; + _walkNodes[i]._deltaX = 1; + _walkNodes[i]._deltaY = 1; } done = true; break; } - if (!isPointBlocked(gridX - gridIncr, gridY + gridIncr) && gnapFindPath1(gridX - gridIncr, gridY + gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(gridX - gridIncr, gridY + gridIncr) && findPath1(gridX - gridIncr, gridY + gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _gnapWalkNodes[i]._gridX1 = gridX - i; - _gnapWalkNodes[i]._gridY1 = gridY + i; - _gnapWalkNodes[i]._deltaX = -1; - _gnapWalkNodes[i]._deltaY = 1; + _walkNodes[i]._gridX1 = gridX - i; + _walkNodes[i]._gridY1 = gridY + i; + _walkNodes[i]._deltaX = -1; + _walkNodes[i]._deltaY = 1; } done = true; break; } - if (!isPointBlocked(gridX + gridIncr, gridY - gridIncr) && gnapFindPath1(gridX + gridIncr, gridY - gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(gridX + gridIncr, gridY - gridIncr) && findPath1(gridX + gridIncr, gridY - gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _gnapWalkNodes[i]._gridX1 = gridX + i; - _gnapWalkNodes[i]._gridY1 = gridY - i; - _gnapWalkNodes[i]._deltaX = 1; - _gnapWalkNodes[i]._deltaY = -1; + _walkNodes[i]._gridX1 = gridX + i; + _walkNodes[i]._gridY1 = gridY - i; + _walkNodes[i]._deltaX = 1; + _walkNodes[i]._deltaY = -1; } done = true; break; } - if (!isPointBlocked(gridX - gridIncr, gridY - gridIncr) && gnapFindPath1(gridX - gridIncr, gridY - gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(gridX - gridIncr, gridY - gridIncr) && findPath1(gridX - gridIncr, gridY - gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _gnapWalkNodes[i]._gridX1 = gridX - i; - _gnapWalkNodes[i]._gridY1 = gridY - i; - _gnapWalkNodes[i]._deltaX = -1; - _gnapWalkNodes[i]._deltaY = -1; + _walkNodes[i]._gridX1 = gridX - i; + _walkNodes[i]._gridY1 = gridY - i; + _walkNodes[i]._deltaX = -1; + _walkNodes[i]._deltaY = -1; } done = true; break; } - if (!isPointBlocked(gridX + gridIncr, gridY) && gnapFindPath2(gridX + gridIncr, gridY, gridIncr)) { + if (!_vm->isPointBlocked(gridX + gridIncr, gridY) && findPath2(gridX + gridIncr, gridY, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _gnapWalkNodes[i]._gridX1 = gridX + i; - _gnapWalkNodes[i]._gridY1 = gridY; - _gnapWalkNodes[i]._deltaX = 1; - _gnapWalkNodes[i]._deltaY = 0; + _walkNodes[i]._gridX1 = gridX + i; + _walkNodes[i]._gridY1 = gridY; + _walkNodes[i]._deltaX = 1; + _walkNodes[i]._deltaY = 0; } done = true; break; } - if (!isPointBlocked(gridX - gridIncr, gridY) && gnapFindPath2(gridX - gridIncr, gridY, gridIncr)) { + if (!_vm->isPointBlocked(gridX - gridIncr, gridY) && findPath2(gridX - gridIncr, gridY, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _gnapWalkNodes[i]._gridX1 = gridX - i; - _gnapWalkNodes[i]._gridY1 = gridY; - _gnapWalkNodes[i]._deltaX = -1; - _gnapWalkNodes[i]._deltaY = 0; + _walkNodes[i]._gridX1 = gridX - i; + _walkNodes[i]._gridY1 = gridY; + _walkNodes[i]._deltaX = -1; + _walkNodes[i]._deltaY = 0; } done = true; break; } - if (!isPointBlocked(gridX, gridY + gridIncr) && gnapFindPath2(gridX, gridY + gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(gridX, gridY + gridIncr) && findPath2(gridX, gridY + gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _gnapWalkNodes[i]._gridX1 = gridX; - _gnapWalkNodes[i]._gridY1 = gridY + i; - _gnapWalkNodes[i]._deltaX = 0; - _gnapWalkNodes[i]._deltaY = 1; + _walkNodes[i]._gridX1 = gridX; + _walkNodes[i]._gridY1 = gridY + i; + _walkNodes[i]._deltaX = 0; + _walkNodes[i]._deltaY = 1; } done = true; break; } - if (!isPointBlocked(gridX, gridY - gridIncr) && gnapFindPath2(gridX, gridY - gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(gridX, gridY - gridIncr) && findPath2(gridX, gridY - gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _gnapWalkNodes[i]._gridX1 = gridX; - _gnapWalkNodes[i]._gridY1 = gridY - i; - _gnapWalkNodes[i]._deltaX = 0; - _gnapWalkNodes[i]._deltaY = -1; + _walkNodes[i]._gridX1 = gridX; + _walkNodes[i]._gridY1 = gridY - i; + _walkNodes[i]._deltaX = 0; + _walkNodes[i]._deltaY = -1; } done = true; break; } - if (!isPointBlocked(gridX + gridIncr, gridY + gridIncr) && gnapFindPath2(gridX + gridIncr, gridY + gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(gridX + gridIncr, gridY + gridIncr) && findPath2(gridX + gridIncr, gridY + gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _gnapWalkNodes[i]._gridX1 = gridX + i; - _gnapWalkNodes[i]._gridY1 = gridY + i; - _gnapWalkNodes[i]._deltaX = 1; - _gnapWalkNodes[i]._deltaY = 1; + _walkNodes[i]._gridX1 = gridX + i; + _walkNodes[i]._gridY1 = gridY + i; + _walkNodes[i]._deltaX = 1; + _walkNodes[i]._deltaY = 1; } done = true; break; } - if (!isPointBlocked(gridX - gridIncr, gridY + gridIncr) && gnapFindPath2(gridX - gridIncr, gridY + gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(gridX - gridIncr, gridY + gridIncr) && findPath2(gridX - gridIncr, gridY + gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _gnapWalkNodes[i]._gridX1 = gridX - i; - _gnapWalkNodes[i]._gridY1 = gridY + i; - _gnapWalkNodes[i]._deltaX = -1; - _gnapWalkNodes[i]._deltaY = 1; + _walkNodes[i]._gridX1 = gridX - i; + _walkNodes[i]._gridY1 = gridY + i; + _walkNodes[i]._deltaX = -1; + _walkNodes[i]._deltaY = 1; } done = true; break; } - if (!isPointBlocked(gridX + gridIncr, gridY - gridIncr) && gnapFindPath2(gridX + gridIncr, gridY - gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(gridX + gridIncr, gridY - gridIncr) && findPath2(gridX + gridIncr, gridY - gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _gnapWalkNodes[i]._gridX1 = gridX + i; - _gnapWalkNodes[i]._gridY1 = gridY - i; - _gnapWalkNodes[i]._deltaX = 1; - _gnapWalkNodes[i]._deltaY = -1; + _walkNodes[i]._gridX1 = gridX + i; + _walkNodes[i]._gridY1 = gridY - i; + _walkNodes[i]._deltaX = 1; + _walkNodes[i]._deltaY = -1; } done = true; break; } - if (!isPointBlocked(gridX - gridIncr, gridY - gridIncr) && gnapFindPath2(gridX - gridIncr, gridY - gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(gridX - gridIncr, gridY - gridIncr) && findPath2(gridX - gridIncr, gridY - gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _gnapWalkNodes[i]._gridX1 = gridX - i; - _gnapWalkNodes[i]._gridY1 = gridY - i; - _gnapWalkNodes[i]._deltaX = -1; - _gnapWalkNodes[i]._deltaY = -1; + _walkNodes[i]._gridX1 = gridX - i; + _walkNodes[i]._gridY1 = gridY - i; + _walkNodes[i]._deltaX = -1; + _walkNodes[i]._deltaY = -1; } done = true; break; @@ -531,323 +436,94 @@ bool GnapEngine::gnapFindPath3(int gridX, int gridY) { return done; } -bool GnapEngine::gnapWalkTo(Common::Point gridPos, int animationIndex, int sequenceId, int flags) { - int datNum = flags & 3; - bool done = false; - - _timers[2] = 200; - _timers[3] = 300; - - int gridX = gridPos.x; - if (gridX < 0) - gridX = (_leftClickMouseX - _gridMinX + 37) / 75; - - int gridY = gridPos.y; - if (gridY < 0) - gridY = (_leftClickMouseY - _gridMinY + 24) / 48; - - _gnapWalkDestX = CLIP(gridX, 0, _gridMaxX - 1); - _gnapWalkDestY = CLIP(gridY, 0, _gridMaxY - 1); - - if (animationIndex >= 0 && _gnapWalkDestX == _plat->_pos.x && _gnapWalkDestY == _plat->_pos.y) - platypusMakeRoom(); - - // TODO: Simplify the cascade of Ifs - if (gnapFindPath1(_gnap->_pos.x, _gnap->_pos.y, 0)) - done = true; - - if (!done && gnapFindPath2(_gnap->_pos.x, _gnap->_pos.y, 0)) - done = true; - - if (!done && gnapFindPath3(_gnap->_pos.x, _gnap->_pos.y)) - done = true; - - if (!done && gnapFindPath4(_gnap->_pos.x, _gnap->_pos.y)) - done = true; - - gnapIdle(); - - int gnapSequenceId = _gnap->_sequenceId; - int gnapId = _gnap->_id; - int gnapSequenceDatNum = _gnap->_sequenceDatNum; - - debugC(kDebugBasic, "_gnapWalkNodesCount: %d", _gnapWalkNodesCount); - - for (int index = 0; index < _gnapWalkNodesCount; ++index) { - _gnapWalkNodes[index]._id = index + 20 * _gnapWalkNodes[index]._gridY1; - if (_gnapWalkNodes[index]._deltaX == 1 && _gnapWalkNodes[index]._deltaY == 0) { - if (index % 2) { - _gameSys->insertSequence(makeRid(datNum, 0x7AB), _gnapWalkNodes[index]._id, - makeRid(gnapSequenceDatNum, gnapSequenceId), gnapId, - kSeqScale | kSeqSyncWait, 0, 75 * _gnapWalkNodes[index]._gridX1 - _gnap->_gridX, 48 * _gnapWalkNodes[index]._gridY1 - _gnap->_gridY); - _gnapWalkNodes[index]._sequenceId = 0x7AB; - gnapSequenceId = 0x7AB; - } else { - _gameSys->insertSequence(makeRid(datNum, 0x7AC), _gnapWalkNodes[index]._id, - makeRid(gnapSequenceDatNum, gnapSequenceId), gnapId, - kSeqScale | kSeqSyncWait, 0, 75 * _gnapWalkNodes[index]._gridX1 - _gnap->_gridX, 48 * _gnapWalkNodes[index]._gridY1 - _gnap->_gridY); - _gnapWalkNodes[index]._sequenceId = 0x7AC; - gnapSequenceId = 0x7AC; - } - } else if (_gnapWalkNodes[index]._deltaX == -1 && _gnapWalkNodes[index]._deltaY == 0) { - if (index % 2) { - _gameSys->insertSequence(makeRid(datNum, 0x7AF), _gnapWalkNodes[index]._id, - makeRid(gnapSequenceDatNum, gnapSequenceId), gnapId, - kSeqScale | kSeqSyncWait, 0, 75 * _gnapWalkNodes[index]._gridX1 - _gnap->_gridX, 48 * _gnapWalkNodes[index]._gridY1 - _gnap->_gridY); - _gnapWalkNodes[index]._sequenceId = 0x7AF; - gnapSequenceId = 0x7AF; - } else { - _gameSys->insertSequence(makeRid(datNum, 0x7B0), _gnapWalkNodes[index]._id, - makeRid(gnapSequenceDatNum, gnapSequenceId), gnapId, - kSeqScale | kSeqSyncWait, 0, 75 * _gnapWalkNodes[index]._gridX1 - _gnap->_gridX, 48 * _gnapWalkNodes[index]._gridY1 - _gnap->_gridY); - _gnapWalkNodes[index]._sequenceId = 0x7B0; - gnapSequenceId = 0x7B0; - } - } else { - if (_gnapWalkNodes[index]._deltaY == -1) - _gnapWalkNodes[index]._id -= 10; - else - _gnapWalkNodes[index]._id += 10; - int newSequenceId = _gnap->getWalkSequenceId(_gnapWalkNodes[index]._deltaX, _gnapWalkNodes[index]._deltaY); - _gameSys->insertSequence(makeRid(datNum, newSequenceId), _gnapWalkNodes[index]._id, - makeRid(gnapSequenceDatNum, gnapSequenceId), gnapId, - kSeqScale | kSeqSyncWait, 0, 75 * _gnapWalkNodes[index]._gridX1 - _gnap->_gridX, 48 * _gnapWalkNodes[index]._gridY1 - _gnap->_gridY); - _gnapWalkNodes[index]._sequenceId = newSequenceId; - gnapSequenceId = newSequenceId; - } - gnapId = _gnapWalkNodes[index]._id; - gnapSequenceDatNum = datNum; - } - - if (flags & 8) { - if (_gnapWalkNodesCount > 0) { - _gnap->_sequenceId = gnapSequenceId; - _gnap->_id = gnapId; - _gnap->_idleFacing = getGnapWalkFacing(_gnapWalkNodes[_gnapWalkNodesCount - 1]._deltaX, _gnapWalkNodes[_gnapWalkNodesCount - 1]._deltaY); - _gnap->_sequenceDatNum = datNum; - if (animationIndex >= 0) - _gameSys->setAnimation(makeRid(_gnap->_sequenceDatNum, _gnap->_sequenceId), _gnap->_id, animationIndex); - } else if (animationIndex >= 0) { - _gameSys->setAnimation(0x107D3, 1, animationIndex); - _gameSys->insertSequence(0x107D3, 1, 0, 0, kSeqNone, 0, 0, 0); - } - } else { - if (sequenceId >= 0 && sequenceId != -1) { - _gnap->_sequenceId = ridToEntryIndex(sequenceId); - _gnap->_sequenceDatNum = ridToDatIndex(sequenceId); - if (_gnap->_sequenceId == 0x7B9) { - _gnap->_idleFacing = kDirBottomRight; - } else { - switch (_gnap->_sequenceId) { - case 0x7BA: - _gnap->_idleFacing = kDirBottomLeft; - break; - case 0x7BB: - _gnap->_idleFacing = kDirUpRight; - break; - case 0x7BC: - _gnap->_idleFacing = kDirUpLeft; - break; - } - } - } else { - if (_gnapWalkNodesCount > 0) { - _gnap->_sequenceId = getGnapWalkStopSequenceId(_gnapWalkNodes[_gnapWalkNodesCount - 1]._deltaX, _gnapWalkNodes[_gnapWalkNodesCount - 1]._deltaY); - _gnap->_idleFacing = getGnapWalkFacing(_gnapWalkNodes[_gnapWalkNodesCount - 1]._deltaX, _gnapWalkNodes[_gnapWalkNodesCount - 1]._deltaY); - } else if (gridX >= 0 || gridY >= 0) { - switch (_gnap->_idleFacing) { - case kDirBottomRight: - _gnap->_sequenceId = 0x7B9; - break; - case kDirBottomLeft: - _gnap->_sequenceId = 0x7BA; - break; - case kDirUpRight: - _gnap->_sequenceId = 0x7BB; - break; - default: - _gnap->_sequenceId = 0x7BC; - break; - } - } else { - //TODO: simplify the checks by using v10 and v11 - int v10 = _leftClickMouseX - (_gridMinX + 75 * _gnap->_pos.x); - int v11 = _leftClickMouseY - (_gridMinY + 48 * _gnap->_pos.y); - if (_leftClickMouseX == _gridMinX + 75 * _gnap->_pos.x) - ++v10; - if (_leftClickMouseY == _gridMinY + 48 * _gnap->_pos.y) - v11 = 1; - _gnap->_sequenceId = getGnapWalkStopSequenceId(v10 / abs(v10), v11 / abs(v11)); - _gnap->_idleFacing = getGnapWalkFacing(v10 / abs(v10), v11 / abs(v11)); - } - _gnap->_sequenceDatNum = datNum; - } - - if (animationIndex < 0) { - _gnap->_id = 20 * _gnapWalkDestY + 1; - } else { - _gnap->_id = _gnapWalkNodesCount + animationIndex + 20 * _gnapWalkDestY; - _gameSys->setAnimation(makeRid(_gnap->_sequenceDatNum, _gnap->_sequenceId), _gnapWalkNodesCount + animationIndex + 20 * _gnapWalkDestY, animationIndex); - } - - if (flags & 4) { - _gameSys->insertSequence(makeRid(_gnap->_sequenceDatNum, _gnap->_sequenceId), _gnap->_id, - makeRid(gnapSequenceDatNum, gnapSequenceId), gnapId, - kSeqScale | kSeqSyncWait, 0, 0, 0); - } else { - _gameSys->insertSequence(makeRid(_gnap->_sequenceDatNum, _gnap->_sequenceId), _gnap->_id, - makeRid(gnapSequenceDatNum, gnapSequenceId), gnapId, - kSeqScale | kSeqSyncWait, 0, 75 * _gnapWalkDestX - _gnap->_gridX, 48 * _gnapWalkDestY - _gnap->_gridY); - } - } - - _gnap->_pos = Common::Point(_gnapWalkDestX, _gnapWalkDestY); - - return done; -} - -void GnapEngine::gnapWalkStep() { - for (int i = 1; i < _gridMaxX; ++i) { - Common::Point checkPt = Common::Point(_gnap->_pos.x + i, _gnap->_pos.y); - if (!isPointBlocked(checkPt)) { - gnapWalkTo(checkPt, -1, -1, 1); - break; - } - - checkPt = Common::Point(_gnap->_pos.x - i, _gnap->_pos.y); - if (!isPointBlocked(checkPt)) { - gnapWalkTo(checkPt, -1, -1, 1); - break; - } - - checkPt = Common::Point(_gnap->_pos.x, _gnap->_pos.y + 1); - if (!isPointBlocked(checkPt)) { - gnapWalkTo(checkPt, -1, -1, 1); - break; - } - - checkPt = Common::Point(_gnap->_pos.x, _gnap->_pos.y - 1); - if (!isPointBlocked(checkPt)) { - gnapWalkTo(checkPt, -1, -1, 1); - break; - } - - checkPt = Common::Point(_gnap->_pos.x + 1, _gnap->_pos.y + 1); - if (!isPointBlocked(checkPt)) { - gnapWalkTo(checkPt, -1, -1, 1); - break; - } - - checkPt = Common::Point(_gnap->_pos.x - 1, _gnap->_pos.y + 1); - if (!isPointBlocked(checkPt)) { - gnapWalkTo(checkPt, -1, -1, 1); - break; - } - - checkPt = Common::Point(_gnap->_pos.x + 1, _gnap->_pos.y - 1); - if (!isPointBlocked(checkPt)) { - gnapWalkTo(checkPt, -1, -1, 1); - break; - } - - checkPt = Common::Point(_gnap->_pos.x - 1, _gnap->_pos.y - 1); - if (!isPointBlocked(checkPt)) { - gnapWalkTo(checkPt, -1, -1, 1); - break; - } - } -} - -//////////////////////////////////////////////////////////////////////////////// - -bool GnapEngine::platFindPath4(int gridX, int gridY) { +bool PlayerGnap::findPath4(int gridX, int gridY) { bool result = false; - _platWalkNodesCount = 0; - _platWalkDirXIncr = 0; - _platWalkDirYIncr = 0; - _platWalkDeltaX = ABS(_platWalkDestX - gridX); - _platWalkDeltaY = ABS(_platWalkDestY - gridY); + _walkNodesCount = 0; + _walkDirXIncr = 0; + _walkDirYIncr = 0; + _walkDeltaX = ABS(_walkDestX - gridX); + _walkDeltaY = ABS(_walkDestY - gridY); - if (_platWalkDeltaX) - _platWalkDirX = (_platWalkDestX - gridX) / _platWalkDeltaX; + if (_walkDeltaX) + _walkDirX = (_walkDestX - gridX) / _walkDeltaX; else - _platWalkDirX = 0; + _walkDirX = 0; - if (_platWalkDeltaY) - _platWalkDirY = (_platWalkDestY - gridY) / _platWalkDeltaY; + if (_walkDeltaY) + _walkDirY = (_walkDestY - gridY) / _walkDeltaY; else - _platWalkDirY = 0; - - while (_platWalkDirXIncr < _platWalkDeltaX && _platWalkDirYIncr < _platWalkDeltaY) { - _platWalkNodes[_platWalkNodesCount]._gridX1 = gridX + _platWalkDirX * _platWalkDirXIncr; - _platWalkNodes[_platWalkNodesCount]._gridY1 = gridY + _platWalkDirY * _platWalkDirYIncr; - if (!isPointBlocked(_platWalkDirX + _platWalkNodes[_platWalkNodesCount]._gridX1, _platWalkDirY + _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = _platWalkDirX; - _platWalkNodes[_platWalkNodesCount]._deltaY = _platWalkDirY; - ++_platWalkDirXIncr; - ++_platWalkDirYIncr; - } else if (_platWalkDeltaY - _platWalkDirYIncr > _platWalkDeltaX - _platWalkDirXIncr) { - if (!isPointBlocked(_platWalkNodes[_platWalkNodesCount]._gridX1, _platWalkDirY + _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = 0; - _platWalkNodes[_platWalkNodesCount]._deltaY = _platWalkDirY; - ++_platWalkDirYIncr; - } else if (!isPointBlocked(_platWalkDirX + _platWalkNodes[_platWalkNodesCount]._gridX1, _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = _platWalkDirX; - _platWalkNodes[_platWalkNodesCount]._deltaY = 0; - ++_platWalkDirXIncr; + _walkDirY = 0; + + while (_walkDirXIncr < _walkDeltaX && _walkDirYIncr < _walkDeltaY) { + _walkNodes[_walkNodesCount]._gridX1 = gridX + _walkDirX * _walkDirXIncr; + _walkNodes[_walkNodesCount]._gridY1 = gridY + _walkDirY * _walkDirYIncr; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirXIncr; + ++_walkDirYIncr; + } else if (_walkDeltaY - _walkDirYIncr > _walkDeltaX - _walkDirXIncr) { + if (!_vm->isPointBlocked(_walkNodes[_walkNodesCount]._gridX1, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; + } else if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; } else { - _platWalkDeltaX = _platWalkDirXIncr; - _platWalkDeltaY = _platWalkDirYIncr; - --_platWalkNodesCount; + _walkDeltaX = _walkDirXIncr; + _walkDeltaY = _walkDirYIncr; + --_walkNodesCount; } } else { - if (!isPointBlocked(_platWalkDirX + _platWalkNodes[_platWalkNodesCount]._gridX1, _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = _platWalkDirX; - _platWalkNodes[_platWalkNodesCount]._deltaY = 0; - ++_platWalkDirXIncr; - } else if (!isPointBlocked(_platWalkNodes[_platWalkNodesCount]._gridX1, _platWalkDirY + _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = 0; - _platWalkNodes[_platWalkNodesCount]._deltaY = _platWalkDirY; - ++_platWalkDirYIncr; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; + } else if (!_vm->isPointBlocked(_walkNodes[_walkNodesCount]._gridX1, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; } else { - _platWalkDeltaX = _platWalkDirXIncr; - _platWalkDeltaY = _platWalkDirYIncr; - --_platWalkNodesCount; + _walkDeltaX = _walkDirXIncr; + _walkDeltaY = _walkDirYIncr; + --_walkNodesCount; } } - ++_platWalkNodesCount; + ++_walkNodesCount; } - while (_platWalkDirXIncr < _platWalkDeltaX) { - _platWalkNodes[_platWalkNodesCount]._gridX1 = gridX + _platWalkDirX * _platWalkDirXIncr; - _platWalkNodes[_platWalkNodesCount]._gridY1 = _platWalkDestY; - if (!isPointBlocked(_platWalkDirX + _platWalkNodes[_platWalkNodesCount]._gridX1, _platWalkDestY)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = _platWalkDirX; - _platWalkNodes[_platWalkNodesCount]._deltaY = 0; - ++_platWalkDirXIncr; - ++_platWalkNodesCount; + while (_walkDirXIncr < _walkDeltaX) { + _walkNodes[_walkNodesCount]._gridX1 = gridX + _walkDirX * _walkDirXIncr; + _walkNodes[_walkNodesCount]._gridY1 = _walkDestY; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkDestY)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; + ++_walkNodesCount; } else { - _platWalkDeltaX = _platWalkDirXIncr; + _walkDeltaX = _walkDirXIncr; } } - while (_platWalkDirYIncr < _platWalkDeltaY) { - _platWalkNodes[_platWalkNodesCount]._gridX1 = _platWalkDestX; - _platWalkNodes[_platWalkNodesCount]._gridY1 = gridY + _platWalkDirY * _platWalkDirYIncr; - if (!isPointBlocked(_platWalkDestX, _platWalkDirY + _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = 0; - _platWalkNodes[_platWalkNodesCount]._deltaY = _platWalkDirY; - ++_platWalkDirYIncr; - ++_platWalkNodesCount; + while (_walkDirYIncr < _walkDeltaY) { + _walkNodes[_walkNodesCount]._gridX1 = _walkDestX; + _walkNodes[_walkNodesCount]._gridY1 = gridY + _walkDirY * _walkDirYIncr; + if (!_vm->isPointBlocked(_walkDestX, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; + ++_walkNodesCount; } else { - _platWalkDeltaY = _platWalkDirYIncr; + _walkDeltaY = _walkDirYIncr; } } - if (gridX + _platWalkDirX * _platWalkDirXIncr != _platWalkDestX || gridY + _platWalkDirY * _platWalkDirYIncr != _platWalkDestY) { - _platWalkDestX = gridX + _platWalkDirX * _platWalkDirXIncr; - _platWalkDestY = gridY + _platWalkDirY * _platWalkDirYIncr; + if (gridX + _walkDirX * _walkDirXIncr != _walkDestX || gridY + _walkDirY * _walkDirYIncr != _walkDestY) { + _walkDestX = gridX + _walkDirX * _walkDirXIncr; + _walkDestY = gridY + _walkDirY * _walkDirYIncr; result = false; } else { result = true; @@ -856,77 +532,79 @@ bool GnapEngine::platFindPath4(int gridX, int gridY) { return result; } -bool GnapEngine::platFindPath1(int gridX, int gridY, int index) { - _platWalkNodesCount = index; - _platWalkDirXIncr = 0; - _platWalkDirYIncr = 0; - _platWalkDeltaX = ABS(_platWalkDestX - gridX); - _platWalkDeltaY = ABS(_platWalkDestY - gridY); +/******************************************************************************/ - if (_platWalkDeltaX) - _platWalkDirX = (_platWalkDestX - gridX) / _platWalkDeltaX; +bool PlayerPlat::findPath1(int gridX, int gridY, int index) { + _walkNodesCount = index; + _walkDirXIncr = 0; + _walkDirYIncr = 0; + _walkDeltaX = ABS(_walkDestX - gridX); + _walkDeltaY = ABS(_walkDestY - gridY); + + if (_walkDeltaX) + _walkDirX = (_walkDestX - gridX) / _walkDeltaX; else - _platWalkDirX = 0; + _walkDirX = 0; - if (_platWalkDeltaY) - _platWalkDirY = (_platWalkDestY - gridY) / _platWalkDeltaY; + if (_walkDeltaY) + _walkDirY = (_walkDestY - gridY) / _walkDeltaY; else - _platWalkDirY = 0; - - while (_platWalkDirXIncr < _platWalkDeltaX && _platWalkDirYIncr < _platWalkDeltaY) { - _platWalkNodes[_platWalkNodesCount]._gridX1 = gridX + _platWalkDirX * _platWalkDirXIncr; - _platWalkNodes[_platWalkNodesCount]._gridY1 = gridY + _platWalkDirY * _platWalkDirYIncr; - if (!isPointBlocked(_platWalkDirX + _platWalkNodes[_platWalkNodesCount]._gridX1, _platWalkDirY + _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = _platWalkDirX; - _platWalkNodes[_platWalkNodesCount]._deltaY = _platWalkDirY; - ++_platWalkDirXIncr; - ++_platWalkDirYIncr; - } else if (_platWalkDeltaY - _platWalkDirYIncr > _platWalkDeltaX - _platWalkDirXIncr) { - if (!isPointBlocked(_platWalkNodes[_platWalkNodesCount]._gridX1, _platWalkDirY + _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = 0; - _platWalkNodes[_platWalkNodesCount]._deltaY = _platWalkDirY; - ++_platWalkDirYIncr; - } else if (!isPointBlocked(_platWalkDirX + _platWalkNodes[_platWalkNodesCount]._gridX1, _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = _platWalkDirX; - _platWalkNodes[_platWalkNodesCount]._deltaY = 0; - ++_platWalkDirXIncr; + _walkDirY = 0; + + while (_walkDirXIncr < _walkDeltaX && _walkDirYIncr < _walkDeltaY) { + _walkNodes[_walkNodesCount]._gridX1 = gridX + _walkDirX * _walkDirXIncr; + _walkNodes[_walkNodesCount]._gridY1 = gridY + _walkDirY * _walkDirYIncr; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirXIncr; + ++_walkDirYIncr; + } else if (_walkDeltaY - _walkDirYIncr > _walkDeltaX - _walkDirXIncr) { + if (!_vm->isPointBlocked(_walkNodes[_walkNodesCount]._gridX1, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; + } else if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; } else return false; } else { - if (!isPointBlocked(_platWalkDirX + _platWalkNodes[_platWalkNodesCount]._gridX1, _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = _platWalkDirX; - _platWalkNodes[_platWalkNodesCount]._deltaY = 0; - ++_platWalkDirXIncr; - } else if (!isPointBlocked(_platWalkNodes[_platWalkNodesCount]._gridX1, _platWalkDirY + _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = 0; - _platWalkNodes[_platWalkNodesCount]._deltaY = _platWalkDirY; - ++_platWalkDirYIncr; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; + } else if (!_vm->isPointBlocked(_walkNodes[_walkNodesCount]._gridX1, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; } else return false; } - ++_platWalkNodesCount; + ++_walkNodesCount; } - while (_platWalkDirXIncr < _platWalkDeltaX) { - _platWalkNodes[_platWalkNodesCount]._gridX1 = gridX + _platWalkDirX * _platWalkDirXIncr; - _platWalkNodes[_platWalkNodesCount]._gridY1 = _platWalkDestY; - if (!isPointBlocked(_platWalkDirX + _platWalkNodes[_platWalkNodesCount]._gridX1, _platWalkDestY)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = _platWalkDirX; - _platWalkNodes[_platWalkNodesCount]._deltaY = 0; - ++_platWalkDirXIncr; - ++_platWalkNodesCount; + while (_walkDirXIncr < _walkDeltaX) { + _walkNodes[_walkNodesCount]._gridX1 = gridX + _walkDirX * _walkDirXIncr; + _walkNodes[_walkNodesCount]._gridY1 = _walkDestY; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkDestY)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; + ++_walkNodesCount; } else return false; } - while (_platWalkDirYIncr < _platWalkDeltaY) { - _platWalkNodes[_platWalkNodesCount]._gridX1 = _platWalkDestX; - _platWalkNodes[_platWalkNodesCount]._gridY1 = gridY + _platWalkDirY * _platWalkDirYIncr; - if (!isPointBlocked(_platWalkDestX, _platWalkDirY + _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = 0; - _platWalkNodes[_platWalkNodesCount]._deltaY = _platWalkDirY; - ++_platWalkDirYIncr; - ++_platWalkNodesCount; + while (_walkDirYIncr < _walkDeltaY) { + _walkNodes[_walkNodesCount]._gridX1 = _walkDestX; + _walkNodes[_walkNodesCount]._gridY1 = gridY + _walkDirY * _walkDirYIncr; + if (!_vm->isPointBlocked(_walkDestX, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; + ++_walkNodesCount; } else return false; } @@ -934,101 +612,101 @@ bool GnapEngine::platFindPath1(int gridX, int gridY, int index) { return true; } -bool GnapEngine::platFindPath2(int gridX, int gridY, int index) { - _platWalkNodesCount = index; - _platWalkDirXIncr = 0; - _platWalkDirYIncr = 0; - _platWalkDeltaX = ABS(_platWalkDestX - gridX); - _platWalkDeltaY = ABS(_platWalkDestY - gridY); +bool PlayerPlat::findPath2(int gridX, int gridY, int index) { + _walkNodesCount = index; + _walkDirXIncr = 0; + _walkDirYIncr = 0; + _walkDeltaX = ABS(_walkDestX - gridX); + _walkDeltaY = ABS(_walkDestY - gridY); - if (_platWalkDeltaX) - _platWalkDirX = (_platWalkDestX - gridX) / _platWalkDeltaX; + if (_walkDeltaX) + _walkDirX = (_walkDestX - gridX) / _walkDeltaX; else - _platWalkDirX = 0; + _walkDirX = 0; - if (_platWalkDeltaY) - _platWalkDirY = (_platWalkDestY - gridY) / _platWalkDeltaY; + if (_walkDeltaY) + _walkDirY = (_walkDestY - gridY) / _walkDeltaY; else - _platWalkDirY = 0; - - while (_platWalkDeltaY < _platWalkDeltaX - _platWalkDirXIncr) { - _platWalkNodes[_platWalkNodesCount]._gridX1 = gridX + _platWalkDirX * _platWalkDirXIncr; - _platWalkNodes[_platWalkNodesCount]._gridY1 = gridY; - if (!isPointBlocked(_platWalkDirX + _platWalkNodes[_platWalkNodesCount]._gridX1, gridY)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = _platWalkDirX; - _platWalkNodes[_platWalkNodesCount]._deltaY = 0; - ++_platWalkDirXIncr; - ++_platWalkNodesCount; + _walkDirY = 0; + + while (_walkDeltaY < _walkDeltaX - _walkDirXIncr) { + _walkNodes[_walkNodesCount]._gridX1 = gridX + _walkDirX * _walkDirXIncr; + _walkNodes[_walkNodesCount]._gridY1 = gridY; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, gridY)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; + ++_walkNodesCount; } else return false; } - while (_platWalkDeltaX < _platWalkDeltaY - _platWalkDirYIncr) { - _platWalkNodes[_platWalkNodesCount]._gridX1 = gridX; - _platWalkNodes[_platWalkNodesCount]._gridY1 = gridY + _platWalkDirY * _platWalkDirYIncr; - if (!isPointBlocked(gridX, _platWalkDirY + _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = 0; - _platWalkNodes[_platWalkNodesCount]._deltaY = _platWalkDirY; - ++_platWalkDirYIncr; - ++_platWalkNodesCount; + while (_walkDeltaX < _walkDeltaY - _walkDirYIncr) { + _walkNodes[_walkNodesCount]._gridX1 = gridX; + _walkNodes[_walkNodesCount]._gridY1 = gridY + _walkDirY * _walkDirYIncr; + if (!_vm->isPointBlocked(gridX, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; + ++_walkNodesCount; } else return false; } - while (_platWalkDirXIncr < _platWalkDeltaX && _platWalkDirYIncr < _platWalkDeltaY) { - _platWalkNodes[_platWalkNodesCount]._gridX1 = gridX + _platWalkDirX * _platWalkDirXIncr; - _platWalkNodes[_platWalkNodesCount]._gridY1 = gridY + _platWalkDirY * _platWalkDirYIncr; - if (!isPointBlocked(_platWalkDirX + _platWalkNodes[_platWalkNodesCount]._gridX1, _platWalkDirY + _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = _platWalkDirX; - _platWalkNodes[_platWalkNodesCount]._deltaY = _platWalkDirY; - ++_platWalkDirXIncr; - ++_platWalkDirYIncr; - } else if (_platWalkDeltaY - _platWalkDirYIncr > _platWalkDeltaX - _platWalkDirXIncr) { - if (!isPointBlocked(_platWalkNodes[_platWalkNodesCount]._gridX1, _platWalkDirY + _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = 0; - _platWalkNodes[_platWalkNodesCount]._deltaY = _platWalkDirY; - ++_platWalkDirYIncr; - } else if (!isPointBlocked(_platWalkDirX + _platWalkNodes[_platWalkNodesCount]._gridX1, _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = _platWalkDirX; - _platWalkNodes[_platWalkNodesCount]._deltaY = 0; - ++_platWalkDirXIncr; + while (_walkDirXIncr < _walkDeltaX && _walkDirYIncr < _walkDeltaY) { + _walkNodes[_walkNodesCount]._gridX1 = gridX + _walkDirX * _walkDirXIncr; + _walkNodes[_walkNodesCount]._gridY1 = gridY + _walkDirY * _walkDirYIncr; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirXIncr; + ++_walkDirYIncr; + } else if (_walkDeltaY - _walkDirYIncr > _walkDeltaX - _walkDirXIncr) { + if (!_vm->isPointBlocked(_walkNodes[_walkNodesCount]._gridX1, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; + } else if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; } else return false; } else { - if (!isPointBlocked(_platWalkDirX + _platWalkNodes[_platWalkNodesCount]._gridX1, _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = _platWalkDirX; - _platWalkNodes[_platWalkNodesCount]._deltaY = 0; - ++_platWalkDirXIncr; - } else if (!isPointBlocked(_platWalkNodes[_platWalkNodesCount]._gridX1, _platWalkDirY + _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = 0; - _platWalkNodes[_platWalkNodesCount]._deltaY = _platWalkDirY; - ++_platWalkDirYIncr; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; + } else if (!_vm->isPointBlocked(_walkNodes[_walkNodesCount]._gridX1, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; } else return false; } - ++_platWalkNodesCount; + ++_walkNodesCount; } - while (_platWalkDirXIncr < _platWalkDeltaX) { - _platWalkNodes[_platWalkNodesCount]._gridX1 = gridX + _platWalkDirX * _platWalkDirXIncr; - _platWalkNodes[_platWalkNodesCount]._gridY1 = _platWalkDestY; - if (!isPointBlocked(_platWalkDirX + _platWalkNodes[_platWalkNodesCount]._gridX1, _platWalkDestY)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = _platWalkDirX; - _platWalkNodes[_platWalkNodesCount]._deltaY = 0; - ++_platWalkDirXIncr; - ++_platWalkNodesCount; + while (_walkDirXIncr < _walkDeltaX) { + _walkNodes[_walkNodesCount]._gridX1 = gridX + _walkDirX * _walkDirXIncr; + _walkNodes[_walkNodesCount]._gridY1 = _walkDestY; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkDestY)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; + ++_walkNodesCount; } else return false; } - while (_platWalkDirYIncr < _platWalkDeltaY) { - _platWalkNodes[_platWalkNodesCount]._gridX1 = _platWalkDestX; - _platWalkNodes[_platWalkNodesCount]._gridY1 = gridY + _platWalkDirY * _platWalkDirYIncr; - if (!isPointBlocked(_platWalkDestX, _platWalkDirY + _platWalkNodes[_platWalkNodesCount]._gridY1)) { - _platWalkNodes[_platWalkNodesCount]._deltaX = 0; - _platWalkNodes[_platWalkNodesCount]._deltaY = _platWalkDirY; - ++_platWalkDirYIncr; - ++_platWalkNodesCount; + while (_walkDirYIncr < _walkDeltaY) { + _walkNodes[_walkNodesCount]._gridX1 = _walkDestX; + _walkNodes[_walkNodesCount]._gridY1 = gridY + _walkDirY * _walkDirYIncr; + if (!_vm->isPointBlocked(_walkDestX, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; + ++_walkNodesCount; } else return false; } @@ -1036,167 +714,167 @@ bool GnapEngine::platFindPath2(int gridX, int gridY, int index) { return true; } -bool GnapEngine::platFindPath3(int gridX, int gridY) { +bool PlayerPlat::findPath3(int gridX, int gridY) { int gridIncr = 1; bool done = false; - while (!done && gridIncr < _gridMaxX) { - if (!isPointBlocked(_plat->_pos.x + gridIncr, _plat->_pos.y) && platFindPath1(_plat->_pos.x + gridIncr, _plat->_pos.y, gridIncr)) { + while (!done && gridIncr < _vm->_gridMaxX) { + if (!_vm->isPointBlocked(_pos.x + gridIncr, _pos.y) && findPath1(_pos.x + gridIncr, _pos.y, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _platWalkNodes[i]._gridX1 = _plat->_pos.x + i; - _platWalkNodes[i]._gridY1 = _plat->_pos.y; - _platWalkNodes[i]._deltaX = 1; - _platWalkNodes[i]._deltaY = 0; + _walkNodes[i]._gridX1 = _pos.x + i; + _walkNodes[i]._gridY1 = _pos.y; + _walkNodes[i]._deltaX = 1; + _walkNodes[i]._deltaY = 0; } done = true; break; } - if (!isPointBlocked(_plat->_pos.x - gridIncr, _plat->_pos.y) && platFindPath1(_plat->_pos.x - gridIncr, _plat->_pos.y, gridIncr)) { + if (!_vm->isPointBlocked(_pos.x - gridIncr, _pos.y) && findPath1(_pos.x - gridIncr, _pos.y, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _platWalkNodes[i]._gridX1 = _plat->_pos.x - i; - _platWalkNodes[i]._gridY1 = _plat->_pos.y; - _platWalkNodes[i]._deltaX = -1; - _platWalkNodes[i]._deltaY = 0; + _walkNodes[i]._gridX1 = _pos.x - i; + _walkNodes[i]._gridY1 = _pos.y; + _walkNodes[i]._deltaX = -1; + _walkNodes[i]._deltaY = 0; } done = true; break; } - if (!isPointBlocked(_plat->_pos.x, _plat->_pos.y + gridIncr) && platFindPath1(_plat->_pos.x, _plat->_pos.y + gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(_pos.x, _pos.y + gridIncr) && findPath1(_pos.x, _pos.y + gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _platWalkNodes[i]._gridX1 = _plat->_pos.x; - _platWalkNodes[i]._gridY1 = _plat->_pos.y + i; - _platWalkNodes[i]._deltaX = 0; - _platWalkNodes[i]._deltaY = 1; + _walkNodes[i]._gridX1 = _pos.x; + _walkNodes[i]._gridY1 = _pos.y + i; + _walkNodes[i]._deltaX = 0; + _walkNodes[i]._deltaY = 1; } done = true; break; } - if (!isPointBlocked(_plat->_pos.x, _plat->_pos.y - gridIncr) && platFindPath1(_plat->_pos.x, _plat->_pos.y - gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(_pos.x, _pos.y - gridIncr) && findPath1(_pos.x, _pos.y - gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _platWalkNodes[i]._gridX1 = _plat->_pos.x; - _platWalkNodes[i]._gridY1 = _plat->_pos.y - i; - _platWalkNodes[i]._deltaX = 0; - _platWalkNodes[i]._deltaY = -1; + _walkNodes[i]._gridX1 = _pos.x; + _walkNodes[i]._gridY1 = _pos.y - i; + _walkNodes[i]._deltaX = 0; + _walkNodes[i]._deltaY = -1; } done = true; break; } - if (!isPointBlocked(_plat->_pos.x + gridIncr, _plat->_pos.y + gridIncr) && platFindPath1(_plat->_pos.x + gridIncr, _plat->_pos.y + gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(_pos.x + gridIncr, _pos.y + gridIncr) && findPath1(_pos.x + gridIncr, _pos.y + gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _platWalkNodes[i]._gridX1 = _plat->_pos.x + i; - _platWalkNodes[i]._gridY1 = _plat->_pos.y + i; - _platWalkNodes[i]._deltaX = 1; - _platWalkNodes[i]._deltaY = 1; + _walkNodes[i]._gridX1 = _pos.x + i; + _walkNodes[i]._gridY1 = _pos.y + i; + _walkNodes[i]._deltaX = 1; + _walkNodes[i]._deltaY = 1; } done = true; break; } - if (!isPointBlocked(_plat->_pos.x - gridIncr, _plat->_pos.y + gridIncr) && platFindPath1(_plat->_pos.x - gridIncr, _plat->_pos.y + gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(_pos.x - gridIncr, _pos.y + gridIncr) && findPath1(_pos.x - gridIncr, _pos.y + gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _platWalkNodes[i]._gridX1 = _plat->_pos.x - i; - _platWalkNodes[i]._gridY1 = _plat->_pos.y + i; - _platWalkNodes[i]._deltaX = -1; - _platWalkNodes[i]._deltaY = 1; + _walkNodes[i]._gridX1 = _pos.x - i; + _walkNodes[i]._gridY1 = _pos.y + i; + _walkNodes[i]._deltaX = -1; + _walkNodes[i]._deltaY = 1; } done = true; break; } - if (!isPointBlocked(_plat->_pos.x + gridIncr, _plat->_pos.y - gridIncr) && platFindPath1(_plat->_pos.x + gridIncr, _plat->_pos.y - gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(_pos.x + gridIncr, _pos.y - gridIncr) && findPath1(_pos.x + gridIncr, _pos.y - gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _platWalkNodes[i]._gridX1 = _plat->_pos.x + i; - _platWalkNodes[i]._gridY1 = _plat->_pos.y - i; - _platWalkNodes[i]._deltaX = 1; - _platWalkNodes[i]._deltaY = -1; + _walkNodes[i]._gridX1 = _pos.x + i; + _walkNodes[i]._gridY1 = _pos.y - i; + _walkNodes[i]._deltaX = 1; + _walkNodes[i]._deltaY = -1; } done = true; break; } - if (!isPointBlocked(_plat->_pos.x - gridIncr, _plat->_pos.y - gridIncr) && platFindPath1(_plat->_pos.x - gridIncr, _plat->_pos.y - gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(_pos.x - gridIncr, _pos.y - gridIncr) && findPath1(_pos.x - gridIncr, _pos.y - gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _platWalkNodes[i]._gridX1 = _plat->_pos.x - i; - _platWalkNodes[i]._gridY1 = _plat->_pos.y - i; - _platWalkNodes[i]._deltaX = -1; - _platWalkNodes[i]._deltaY = -1; + _walkNodes[i]._gridX1 = _pos.x - i; + _walkNodes[i]._gridY1 = _pos.y - i; + _walkNodes[i]._deltaX = -1; + _walkNodes[i]._deltaY = -1; } done = true; break; } - if (!isPointBlocked(_plat->_pos.x + gridIncr, _plat->_pos.y) && platFindPath2(_plat->_pos.x + gridIncr, _plat->_pos.y, gridIncr)) { + if (!_vm->isPointBlocked(_pos.x + gridIncr, _pos.y) && findPath2(_pos.x + gridIncr, _pos.y, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _platWalkNodes[i]._gridX1 = _plat->_pos.x + i; - _platWalkNodes[i]._gridY1 = _plat->_pos.y; - _platWalkNodes[i]._deltaX = 1; - _platWalkNodes[i]._deltaY = 0; + _walkNodes[i]._gridX1 = _pos.x + i; + _walkNodes[i]._gridY1 = _pos.y; + _walkNodes[i]._deltaX = 1; + _walkNodes[i]._deltaY = 0; } done = true; break; } - if (!isPointBlocked(_plat->_pos.x - gridIncr, _plat->_pos.y) && platFindPath2(_plat->_pos.x - gridIncr, _plat->_pos.y, gridIncr)) { + if (!_vm->isPointBlocked(_pos.x - gridIncr, _pos.y) && findPath2(_pos.x - gridIncr, _pos.y, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _platWalkNodes[i]._gridX1 = _plat->_pos.x - i; - _platWalkNodes[i]._gridY1 = _plat->_pos.y; - _platWalkNodes[i]._deltaX = -1; - _platWalkNodes[i]._deltaY = 0; + _walkNodes[i]._gridX1 = _pos.x - i; + _walkNodes[i]._gridY1 = _pos.y; + _walkNodes[i]._deltaX = -1; + _walkNodes[i]._deltaY = 0; } done = true; break; } - if (!isPointBlocked(_plat->_pos.x, _plat->_pos.y + gridIncr) && platFindPath2(_plat->_pos.x, _plat->_pos.y + gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(_pos.x, _pos.y + gridIncr) && findPath2(_pos.x, _pos.y + gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _platWalkNodes[i]._gridX1 = _plat->_pos.x; - _platWalkNodes[i]._gridY1 = _plat->_pos.y + i; - _platWalkNodes[i]._deltaX = 0; - _platWalkNodes[i]._deltaY = 1; + _walkNodes[i]._gridX1 = _pos.x; + _walkNodes[i]._gridY1 = _pos.y + i; + _walkNodes[i]._deltaX = 0; + _walkNodes[i]._deltaY = 1; } done = true; break; } - if (!isPointBlocked(_plat->_pos.x, _plat->_pos.y - gridIncr) && platFindPath2(_plat->_pos.x, _plat->_pos.y - gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(_pos.x, _pos.y - gridIncr) && findPath2(_pos.x, _pos.y - gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _platWalkNodes[i]._gridX1 = _plat->_pos.x; - _platWalkNodes[i]._gridY1 = _plat->_pos.y - i; - _platWalkNodes[i]._deltaX = 0; - _platWalkNodes[i]._deltaY = -1; + _walkNodes[i]._gridX1 = _pos.x; + _walkNodes[i]._gridY1 = _pos.y - i; + _walkNodes[i]._deltaX = 0; + _walkNodes[i]._deltaY = -1; } done = true; break; } - if (!isPointBlocked(_plat->_pos.x + gridIncr, _plat->_pos.y + gridIncr) && platFindPath2(_plat->_pos.x + gridIncr, _plat->_pos.y + gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(_pos.x + gridIncr, _pos.y + gridIncr) && findPath2(_pos.x + gridIncr, _pos.y + gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _platWalkNodes[i]._gridX1 = _plat->_pos.x + i; - _platWalkNodes[i]._gridY1 = _plat->_pos.y + i; - _platWalkNodes[i]._deltaX = 1; - _platWalkNodes[i]._deltaY = 1; + _walkNodes[i]._gridX1 = _pos.x + i; + _walkNodes[i]._gridY1 = _pos.y + i; + _walkNodes[i]._deltaX = 1; + _walkNodes[i]._deltaY = 1; } done = true; break; } - if (!isPointBlocked(_plat->_pos.x - gridIncr, _plat->_pos.y + gridIncr) && platFindPath2(_plat->_pos.x - gridIncr, _plat->_pos.y + gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(_pos.x - gridIncr, _pos.y + gridIncr) && findPath2(_pos.x - gridIncr, _pos.y + gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _platWalkNodes[i]._gridX1 = _plat->_pos.x - i; - _platWalkNodes[i]._gridY1 = _plat->_pos.y + i; - _platWalkNodes[i]._deltaX = -1; - _platWalkNodes[i]._deltaY = 1; + _walkNodes[i]._gridX1 = _pos.x - i; + _walkNodes[i]._gridY1 = _pos.y + i; + _walkNodes[i]._deltaX = -1; + _walkNodes[i]._deltaY = 1; } done = true; break; } - if (!isPointBlocked(_plat->_pos.x + gridIncr, _plat->_pos.y - gridIncr) && platFindPath2(_plat->_pos.x + gridIncr, _plat->_pos.y - gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(_pos.x + gridIncr, _pos.y - gridIncr) && findPath2(_pos.x + gridIncr, _pos.y - gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _platWalkNodes[i]._gridX1 = _plat->_pos.x + i; - _platWalkNodes[i]._gridY1 = _plat->_pos.y - i; - _platWalkNodes[i]._deltaX = 1; - _platWalkNodes[i]._deltaY = -1; + _walkNodes[i]._gridX1 = _pos.x + i; + _walkNodes[i]._gridY1 = _pos.y - i; + _walkNodes[i]._deltaX = 1; + _walkNodes[i]._deltaY = -1; } done = true; break; } - if (!isPointBlocked(_plat->_pos.x - gridIncr, _plat->_pos.y - gridIncr) && platFindPath2(_plat->_pos.x - gridIncr, _plat->_pos.y - gridIncr, gridIncr)) { + if (!_vm->isPointBlocked(_pos.x - gridIncr, _pos.y - gridIncr) && findPath2(_pos.x - gridIncr, _pos.y - gridIncr, gridIncr)) { for (int i = 0; i < gridIncr; ++i) { - _platWalkNodes[i]._gridX1 = _plat->_pos.x - i; - _platWalkNodes[i]._gridY1 = _plat->_pos.y - i; - _platWalkNodes[i]._deltaX = -1; - _platWalkNodes[i]._deltaY = -1; + _walkNodes[i]._gridX1 = _pos.x - i; + _walkNodes[i]._gridY1 = _pos.y - i; + _walkNodes[i]._deltaX = -1; + _walkNodes[i]._deltaY = -1; } done = true; break; @@ -1207,215 +885,100 @@ bool GnapEngine::platFindPath3(int gridX, int gridY) { return done; } -bool GnapEngine::platypusWalkTo(Common::Point gridPos, int animationIndex, int sequenceId, int flags) { - int datNum = flags & 3; - bool done = false; - - _timers[1] = 60; - - int gridX = gridPos.x; - if (gridX < 0) - gridX = (_leftClickMouseX - _gridMinX + 37) / 75; - - int gridY = gridPos.y; - if (gridY < 0) - gridY = (_leftClickMouseY - _gridMinY + 24) / 48; - - _platWalkDestX = CLIP(gridX, 0, _gridMaxX - 1); - _platWalkDestY = CLIP(gridY, 0, _gridMaxY - 1); - - if (animationIndex >= 0 && _gnap->_pos == Common::Point(_platWalkDestX, _platWalkDestY)) - gnapWalkStep(); - - if (platFindPath1(_plat->_pos.x, _plat->_pos.y, 0)) - done = true; - - if (!done && platFindPath2(_plat->_pos.x, _plat->_pos.y, 0)) - done = true; - - if (!done && platFindPath3(_plat->_pos.x, _plat->_pos.y)) - done = true; +bool PlayerPlat::findPath4(int gridX, int gridY) { + bool result = false; - if (!done && platFindPath4(_plat->_pos.x, _plat->_pos.y)) - done = true; + _walkNodesCount = 0; + _walkDirXIncr = 0; + _walkDirYIncr = 0; + _walkDeltaX = ABS(_walkDestX - gridX); + _walkDeltaY = ABS(_walkDestY - gridY); - int platSequenceId = _plat->_sequenceId; - int platId = _plat->_id; - int platSequenceDatNum = _plat->_sequenceDatNum; + if (_walkDeltaX) + _walkDirX = (_walkDestX - gridX) / _walkDeltaX; + else + _walkDirX = 0; - for (int index = 0; index < _platWalkNodesCount; ++index) { - _platWalkNodes[index]._id = index + 20 * _platWalkNodes[index]._gridY1; - if (_platWalkNodes[index]._deltaX == 1 && _platWalkNodes[index]._deltaY == 0) { - if (index % 2) { - _gameSys->insertSequence(makeRid(datNum, 0x7CD), _platWalkNodes[index]._id, - makeRid(platSequenceDatNum, platSequenceId), platId, - kSeqScale | kSeqSyncWait, 0, 75 * _platWalkNodes[index]._gridX1 - _plat->_gridX, 48 * _platWalkNodes[index]._gridY1 - _plat->_gridY); - _platWalkNodes[index]._sequenceId = 0x7CD; - platSequenceId = 0x7CD; + if (_walkDeltaY) + _walkDirY = (_walkDestY - gridY) / _walkDeltaY; + else + _walkDirY = 0; + + while (_walkDirXIncr < _walkDeltaX && _walkDirYIncr < _walkDeltaY) { + _walkNodes[_walkNodesCount]._gridX1 = gridX + _walkDirX * _walkDirXIncr; + _walkNodes[_walkNodesCount]._gridY1 = gridY + _walkDirY * _walkDirYIncr; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirXIncr; + ++_walkDirYIncr; + } else if (_walkDeltaY - _walkDirYIncr > _walkDeltaX - _walkDirXIncr) { + if (!_vm->isPointBlocked(_walkNodes[_walkNodesCount]._gridX1, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; + } else if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; } else { - _gameSys->insertSequence(makeRid(datNum, 0x7CE), _platWalkNodes[index]._id, - makeRid(platSequenceDatNum, platSequenceId), platId, - kSeqScale | kSeqSyncWait, 0, 75 * _platWalkNodes[index]._gridX1 - _plat->_gridX, 48 * _platWalkNodes[index]._gridY1 - _plat->_gridY); - _platWalkNodes[index]._sequenceId = 0x7CE; - platSequenceId = 0x7CE; + _walkDeltaX = _walkDirXIncr; + _walkDeltaY = _walkDirYIncr; + --_walkNodesCount; } - } else if (_platWalkNodes[index]._deltaX == -1 && _platWalkNodes[index]._deltaY == 0) { - if (index % 2) { - _gameSys->insertSequence(makeRid(datNum, 0x7CF), _platWalkNodes[index]._id, - makeRid(platSequenceDatNum, platSequenceId), platId, - kSeqScale | kSeqSyncWait, 0, 75 * _platWalkNodes[index]._gridX1 - _plat->_gridX, 48 * _platWalkNodes[index]._gridY1 - _plat->_gridY); - _platWalkNodes[index]._sequenceId = 0x7CF; - platSequenceId = 0x7CF; + } else { + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; + } else if (!_vm->isPointBlocked(_walkNodes[_walkNodesCount]._gridX1, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; } else { - _gameSys->insertSequence(makeRid(datNum, 0x7D0), _platWalkNodes[index]._id, - makeRid(platSequenceDatNum, platSequenceId), platId, - kSeqScale | kSeqSyncWait, 0, 75 * _platWalkNodes[index]._gridX1 - _plat->_gridX, 48 * _platWalkNodes[index]._gridY1 - _plat->_gridY); - _platWalkNodes[index]._sequenceId = 0x7D0; - platSequenceId = 0x7D0; + _walkDeltaX = _walkDirXIncr; + _walkDeltaY = _walkDirYIncr; + --_walkNodesCount; } - } else { - if (_platWalkNodes[index]._deltaY == -1) - _platWalkNodes[index]._id -= 10; - else - _platWalkNodes[index]._id += 10; - int newSequenceId = _plat->getWalkSequenceId(_platWalkNodes[index]._deltaX, _platWalkNodes[index]._deltaY); - _gameSys->insertSequence(makeRid(datNum, newSequenceId), _platWalkNodes[index]._id, - makeRid(platSequenceDatNum, platSequenceId), platId, - kSeqScale | kSeqSyncWait, 0, 75 * _platWalkNodes[index]._gridX1 - _plat->_gridX, 48 * _platWalkNodes[index]._gridY1 - _plat->_gridY); - _platWalkNodes[index]._sequenceId = newSequenceId; - platSequenceId = newSequenceId; } - platId = _platWalkNodes[index]._id; - platSequenceDatNum = datNum; + ++_walkNodesCount; } - if (flags & 8) { - if (_platWalkNodesCount > 0) { - _plat->_sequenceId = platSequenceId; - _plat->_id = platId; - _plat->_sequenceDatNum = datNum; - // CHECKME Not sure if this is correct... - if (_platWalkNodes[_platWalkNodesCount - 1]._deltaX > 0) - _plat->_idleFacing = kDirNone; - else if (_platWalkNodes[_platWalkNodesCount - 1]._deltaX < 0) - _plat->_idleFacing = kDirUnk4; - else if (_platWalkNodes[_platWalkNodesCount - 1]._gridX1 % 2) - _plat->_idleFacing = kDirUnk4; - else - _plat->_idleFacing = kDirNone; - if (animationIndex >= 0) - _gameSys->setAnimation(makeRid(_plat->_sequenceDatNum, _plat->_sequenceId), _plat->_id, animationIndex); - } else if (animationIndex >= 0) { - _gameSys->setAnimation(0x107D3, 1, animationIndex); - _gameSys->insertSequence(0x107D3, 1, 0, 0, kSeqNone, 0, 0, 0); - } - } else { - if (sequenceId >= 0 && sequenceId != -1) { - _plat->_sequenceId = ridToEntryIndex(sequenceId); - _plat->_sequenceDatNum = ridToDatIndex(sequenceId); - if (_plat->_sequenceId == 0x7C2) { - _plat->_idleFacing = kDirNone; - } else if (_plat->_sequenceId == 0x7D2) { - _plat->_idleFacing = kDirUnk4; - } + while (_walkDirXIncr < _walkDeltaX) { + _walkNodes[_walkNodesCount]._gridX1 = gridX + _walkDirX * _walkDirXIncr; + _walkNodes[_walkNodesCount]._gridY1 = _walkDestY; + if (!_vm->isPointBlocked(_walkDirX + _walkNodes[_walkNodesCount]._gridX1, _walkDestY)) { + _walkNodes[_walkNodesCount]._deltaX = _walkDirX; + _walkNodes[_walkNodesCount]._deltaY = 0; + ++_walkDirXIncr; + ++_walkNodesCount; } else { - if (_platWalkNodesCount > 0) { - if (_platWalkNodes[_platWalkNodesCount - 1]._deltaX > 0) { - _plat->_sequenceId = 0x7C2; - _plat->_idleFacing = kDirNone; - } else if (_platWalkNodes[_platWalkNodesCount - 1]._deltaX < 0) { - _plat->_sequenceId = 0x7D2; - _plat->_idleFacing = kDirUnk4; - } else if (_platWalkNodes[0]._deltaX > 0) { - _plat->_sequenceId = 0x7C2; - _plat->_idleFacing = kDirNone; - } else if (_platWalkNodes[0]._deltaX < 0) { - _plat->_sequenceId = 0x7D2; - _plat->_idleFacing = kDirUnk4; - } else { - _plat->_sequenceId = 0x7D2; - _plat->_idleFacing = kDirUnk4; - } - } else if (_plat->_idleFacing != kDirNone) { - _plat->_sequenceId = 0x7D2; - } else { - _plat->_sequenceId = 0x7C2; - } - _plat->_sequenceDatNum = datNum; + _walkDeltaX = _walkDirXIncr; } + } - if (animationIndex < 0) { - _plat->_id = 20 * _platWalkDestY; + while (_walkDirYIncr < _walkDeltaY) { + _walkNodes[_walkNodesCount]._gridX1 = _walkDestX; + _walkNodes[_walkNodesCount]._gridY1 = gridY + _walkDirY * _walkDirYIncr; + if (!_vm->isPointBlocked(_walkDestX, _walkDirY + _walkNodes[_walkNodesCount]._gridY1)) { + _walkNodes[_walkNodesCount]._deltaX = 0; + _walkNodes[_walkNodesCount]._deltaY = _walkDirY; + ++_walkDirYIncr; + ++_walkNodesCount; } else { - _plat->_id = animationIndex + 20 * _platWalkDestY; - _gameSys->setAnimation(makeRid(_plat->_sequenceDatNum, _plat->_sequenceId), animationIndex + 20 * _platWalkDestY, animationIndex); + _walkDeltaY = _walkDirYIncr; } - - if (flags & 4) - _gameSys->insertSequence(makeRid(_plat->_sequenceDatNum, _plat->_sequenceId), _plat->_id, - makeRid(platSequenceDatNum, platSequenceId), platId, - 9, 0, 0, 0); - else - _gameSys->insertSequence(makeRid(_plat->_sequenceDatNum, _plat->_sequenceId), _plat->_id, - makeRid(platSequenceDatNum, platSequenceId), platId, - 9, 0, 75 * _platWalkDestX - _plat->_gridX, 48 * _platWalkDestY - _plat->_gridY); } - _plat->_pos = Common::Point(_platWalkDestX, _platWalkDestY); - - return done; -} - -void GnapEngine::platypusWalkStep() { - for (int i = 1; i < _gridMaxX; ++i) { - Common::Point checkPt = Common::Point(_plat->_pos.x + i, _plat->_pos.y); - if (!isPointBlocked(checkPt)) { - platypusWalkTo(checkPt, -1, -1, 1); - break; - } - - checkPt = Common::Point(_plat->_pos.x - i, _plat->_pos.y); - if (!isPointBlocked(checkPt)) { - platypusWalkTo(checkPt, -1, -1, 1); - break; - } - - checkPt = Common::Point(_plat->_pos.x, _plat->_pos.y + 1); - if (!isPointBlocked(checkPt)) { - platypusWalkTo(checkPt, -1, -1, 1); - break; - } - - checkPt = Common::Point(_plat->_pos.x, _plat->_pos.y - 1); - if (!isPointBlocked(checkPt)) { - platypusWalkTo(checkPt, -1, -1, 1); - break; - } - - checkPt = Common::Point(_plat->_pos.x + 1, _plat->_pos.y + 1); - if (!isPointBlocked(checkPt)) { - platypusWalkTo(checkPt, -1, -1, 1); - break; - } - - checkPt = Common::Point(_plat->_pos.x - 1, _plat->_pos.y + 1); - if (!isPointBlocked(checkPt)) { - platypusWalkTo(checkPt, -1, -1, 1); - break; - } - - checkPt = Common::Point(_plat->_pos.x + 1, _plat->_pos.y - 1); - if (!isPointBlocked(checkPt)) { - platypusWalkTo(checkPt, -1, -1, 1); - break; - } - - checkPt = Common::Point(_plat->_pos.x - 1, _plat->_pos.y - 1); - if (!isPointBlocked(checkPt)) { - platypusWalkTo(checkPt, -1, -1, 1); - break; - } + if (gridX + _walkDirX * _walkDirXIncr != _walkDestX || gridY + _walkDirY * _walkDirYIncr != _walkDestY) { + _walkDestX = gridX + _walkDirX * _walkDirXIncr; + _walkDestY = gridY + _walkDirY * _walkDirYIncr; + result = false; + } else { + result = true; } + + return result; } void GnapEngine::platypusMakeRoom() { @@ -1425,7 +988,7 @@ void GnapEngine::platypusMakeRoom() { rndGridX = getRandom(_gridMaxX); } while (ABS(rndGridX - _plat->_pos.x) > 4 || ABS(rndGridY - _plat->_pos.y) > 3 || isPointBlocked(rndGridX, rndGridY)); - platypusWalkTo(Common::Point(rndGridX, rndGridY), -1, -1, 1); + _plat->walkTo(Common::Point(rndGridX, rndGridY), -1, -1, 1); } } // End of namespace Gnap |