From 87756b4ebd83104a02b3a9c10ad7becb8db80c98 Mon Sep 17 00:00:00 2001 From: lukaslw Date: Sun, 27 Jul 2014 16:04:12 +0200 Subject: PRINCE: findPoint(), makePath() - update --- engines/prince/prince.cpp | 103 ++++++++++++++++++---------------------------- engines/prince/prince.h | 10 ++--- 2 files changed, 42 insertions(+), 71 deletions(-) (limited to 'engines/prince') diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index 840b94c219..3ab9b45209 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -90,7 +90,7 @@ PrinceEngine::PrinceEngine(OSystem *syst, const PrinceGameDescription *gameDesc) _dialogWidth(600), _dialogHeight(0), _dialogLineSpace(10), _dialogColor1(220), _dialogColor2(223), _dialogFlag(false), _dialogLines(0), _dialogText(nullptr), _mouseFlag(1), _roomPathBitmap(nullptr), _roomPathBitmapTemp(nullptr), _coordsBufEnd(nullptr), _coordsBuf(nullptr), _coords(nullptr), - _traceLineLen(0), _rembBitmapTemp(nullptr), _rembBitmap(nullptr), _rembMask(0), _rembX(0), _rembY(0), + _traceLineLen(0), _rembBitmapTemp(nullptr), _rembBitmap(nullptr), _rembMask(0), _rembX(0), _rembY(0), _fpX(0), _fpY(0), _checkBitmapTemp(nullptr), _checkBitmap(nullptr), _checkMask(0), _checkX(0), _checkY(0), _traceLineFirstPointFlag(false), _tracePointFirstPointFlag(false), _coordsBuf2(nullptr), _coords2(nullptr), _coordsBuf3(nullptr), _coords3(nullptr), _shanLen1(0), _directionTable(nullptr), _currentMidi(0) { @@ -3037,86 +3037,54 @@ int PrinceEngine::getPixelAddr(byte *pathBitmap, int x, int y) { return (mask & value); } -// TODO - check when both (start point and dest) are wrong -void PrinceEngine::findPoint(int x1, int y1, int x2, int y2) { - _fpResult.x1 = x1; - _fpResult.y1 = y1; - _fpResult.x2 = x2; - _fpResult.y2 = y2; +void PrinceEngine::findPoint(int x, int y) { + _fpX = x; + _fpY = y; - bool fpFlag = false; - int fpX = x1; - int fpY = y1; - - if (getPixelAddr(_roomPathBitmap, x1, y1)) { - fpFlag = true; - fpX = x2; - fpY = y2; - if (getPixelAddr(_roomPathBitmap, x2, y2)) { - return; - } + if (getPixelAddr(_roomPathBitmap, x, y)) { + return; } - int fpL = fpX; - int fpU = fpY; - int fpR = fpX; - int fpD = fpY; + int fpL = x; + int fpU = y; + int fpR = x; + int fpD = y; while (1) { if (fpD != kMaxPicHeight) { - if (getPixelAddr(_roomPathBitmap, fpX, fpD)) { - if (fpFlag) { - _fpResult.x2 = fpX; - _fpResult.y2 = fpD; - } else { - _fpResult.x1 = fpX; - _fpResult.y1 = fpD; - } + if (getPixelAddr(_roomPathBitmap, x, fpD)) { + _fpX = x; + _fpY = fpD; break; } fpD++; } if (fpU) { - if (getPixelAddr(_roomPathBitmap, fpX, fpU)) { - if (fpFlag) { - _fpResult.x2 = fpX; - _fpResult.y2 = fpU; - } else { - _fpResult.x1 = fpX; - _fpResult.y1 = fpU; - } + if (getPixelAddr(_roomPathBitmap, x, fpU)) { + _fpX = x; + _fpY = fpU; break; } fpU--; } if (fpL) { - if (getPixelAddr(_roomPathBitmap, fpL, fpY)) { - if (fpFlag) { - _fpResult.x2 = fpL; - _fpResult.y2 = fpY; - } else { - _fpResult.x1 = fpL; - _fpResult.y1 = fpY; - } + if (getPixelAddr(_roomPathBitmap, fpL, y)) { + _fpX = fpL; + _fpY = y; break; } fpL--; } if (fpR != _sceneWidth) { - if (getPixelAddr(_roomPathBitmap, fpR, fpY)) { - if (fpFlag) { - _fpResult.x2 = fpR; - _fpResult.y2 = fpY; - } else { - _fpResult.x1 = fpR; - _fpResult.y1 = fpY; - } + if (getPixelAddr(_roomPathBitmap, fpR, y)) { + _fpX = fpR; + _fpY = y; break; } fpR++; } - if (!fpU && fpD == kMaxPicHeight) { - if (!fpL && fpR == _sceneWidth) { + if (!fpU && (fpD == kMaxPicHeight)) { + if (!fpL && (fpR == _sceneWidth)) { break; } } @@ -4311,14 +4279,15 @@ byte *PrinceEngine::makePath(int destX, int destY) { int y2 = destY / 2; if ((x1 != x2) || (y1 != y2)) { - findPoint(x1, y1, x2, y2); - if (x1 != _fpResult.x1 || y1 != _fpResult.y1) { - x1 = _fpResult.x1; - y1 = _fpResult.y1; - } - if (x2 != _fpResult.x2 || y2 != _fpResult.y2) { - x2 = _fpResult.x2; - y2 = _fpResult.y2; + findPoint(x1, y1); + if (x1 != _fpX || y1 != _fpY) { + x1 = _fpX; + y1 = _fpY; + } + findPoint(x2, y2); + if (x2 != _fpX || y2 != _fpY) { + x2 = _fpX; + y2 = _fpY; if (!_flags->getFlagValue(Flags::EXACTMOVE)) { realDestX = x2 * 2; realDestY = y2 * 2; @@ -4329,6 +4298,12 @@ byte *PrinceEngine::makePath(int destX, int destY) { } } + if ((x1 == x2) && (y1 == y2)) { + _mainHero->freeOldMove(); + _mainHero->_state = _mainHero->kHeroStateTurn; + return nullptr; + } + int pathLen1 = 0; int pathLen2 = 0; int stX = x1; diff --git a/engines/prince/prince.h b/engines/prince/prince.h index ebc42c28fd..fab49889bb 100644 --- a/engines/prince/prince.h +++ b/engines/prince/prince.h @@ -484,17 +484,13 @@ public: int _rembX; int _rembY; - struct fpResult { - int x1; - int y1; - int x2; - int y2; - } _fpResult; + int _fpX; + int _fpY; int drawLine(int x0, int y0, int x1, int y1, int (*plotProc)(int, int, void *), void *data); bool loadPath(const char *resourceName); byte *makePath(int destX, int destY); - void findPoint(int x1, int y1, int x2, int y2); + void findPoint(int x, int y); int getPixelAddr(byte *pathBitmap, int x, int y); static int plotTraceLine(int x, int y, void *data); void specialPlotInside(int x, int y); -- cgit v1.2.3