diff options
author | lukaslw | 2014-07-10 22:27:39 +0200 |
---|---|---|
committer | lukaslw | 2014-07-10 22:27:39 +0200 |
commit | 0f58b3ac6a71db4556152b987a9d6be783975217 (patch) | |
tree | 0784a705068097e95f082db47c0d34f2b512df57 /engines | |
parent | b711899a63e7e98bce9dc9509e9cc4a85486cb41 (diff) | |
download | scummvm-rg350-0f58b3ac6a71db4556152b987a9d6be783975217.tar.gz scummvm-rg350-0f58b3ac6a71db4556152b987a9d6be783975217.tar.bz2 scummvm-rg350-0f58b3ac6a71db4556152b987a9d6be783975217.zip |
PRINCE: Pathfinding - second update
Diffstat (limited to 'engines')
-rw-r--r-- | engines/prince/prince.cpp | 96 | ||||
-rw-r--r-- | engines/prince/prince.h | 14 |
2 files changed, 99 insertions, 11 deletions
diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index 1fe671187a..6685a065e5 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -90,7 +90,8 @@ 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), _destX(0), _destY(0), _destX2(0), _destY2(0), - _fpFlag(0), _fpX(0), _fpY(0), _fpX1(0), _fpY1(0) { + _fpFlag(0), _fpX(0), _fpY(0), _fpX1(0), _fpY1(0), _coordsBufEnd(8), _coordsBuf(nullptr), _coords(nullptr), + _traceLineLen(0), _traceLineFlag(0) { // Debug/console setup DebugMan.addDebugChannel(DebugChannel::kScript, "script", "Prince Script debug channel"); @@ -177,6 +178,7 @@ PrinceEngine::~PrinceEngine() { free(_roomPathBitmap); free(_roomPathBitmapTemp); + free(_coordsBuf); } GUI::Debugger *PrinceEngine::getDebugger() { @@ -298,6 +300,8 @@ void PrinceEngine::init() { _roomPathBitmap = (byte *)malloc(kPathBitmapLen); _roomPathBitmapTemp = (byte *)malloc(kPathBitmapLen); + _coordsBuf = (byte *)malloc(kTracePts * 4); + _coords = _coordsBuf; BackgroundAnim tempBackAnim; tempBackAnim._seq._currRelative = 0; @@ -2686,22 +2690,24 @@ void PrinceEngine::freeAllNormAnims() { _normAnimList.clear(); } -bool PrinceEngine::fpGetPixelAddr(int x, int y) { +int PrinceEngine::fpGetPixelAddr(int x, int y) { _fpX = x; _fpY = y; return fpGetPixel(x, y); } -bool PrinceEngine::fpGetPixel(int x, int y) { +int PrinceEngine::fpGetPixel(int x, int y) { _fpX1 = x; _fpY1 = y; - int mask = 128 >> (x & 7); byte value = _roomPathBitmap[x / 8 + y * 80]; - if (mask != value) { - return true; - } - return false; + return (mask & value); +} + +int PrinceEngine::getPixelAddr(byte *pathBitmap, int x, int y) { + int mask = 128 >> (x & 7); + byte value = pathBitmap[x / 8 + y * 80]; + return (mask & value); } void PrinceEngine::findPoint(int x1, int y1, int x2, int y2) { @@ -2860,6 +2866,45 @@ Direction PrinceEngine::makeDirection(int x1, int y1, int x2, int y2) { } } +void PrinceEngine::specialPlot(int x, int y) { + if (*_coords < _coordsBufEnd) { + WRITE_UINT16(_coords, x); + _coords += 2; + WRITE_UINT16(_coords, y); + _coords += 2; + int mask = 128 >> (x & 7); + _roomPathBitmapTemp[x / 8 + y * 80] |= mask; // set point + } +} + +void PrinceEngine::specialPlotInside(int x, int y) { + if (*_coords < _coordsBufEnd) { + WRITE_UINT16(_coords, x); + _coords += 2; + WRITE_UINT16(_coords, y); + _coords += 2; + } +} + +void PrinceEngine::plotTraceLine(int x, int y, int color, void *data) { + PrinceEngine *traceLine = (PrinceEngine *)data; + if (!traceLine->_traceLineFlag) { + if (!traceLine->getPixelAddr(traceLine->_roomPathBitmapTemp, x, y)) { + if (traceLine->getPixelAddr(traceLine->_roomPathBitmap, x, y)) { + traceLine->specialPlotInside(x, y); + traceLine->_traceLineLen++; + traceLine->_traceLineFlag = 0; + } else { + //mov eax, OldX // last correct point + //mov ebx, OldY + traceLine->_traceLineFlag = -1; + } + } else { + traceLine->_traceLineFlag = 1; + } + } +} + int PrinceEngine::tracePath(int x1, int y1, int x2, int y2) { for (int i = 0; i < kPathBitmapLen; i++) { _roomPathBitmapTemp[i] = 0; @@ -2873,7 +2918,36 @@ int PrinceEngine::tracePath(int x1, int y1, int x2, int y2) { _destY = y1; _destX2 = x2; _destY2 = y2; - makeDirection(x1, y1, x2, y2); + Direction dir = makeDirection(x1, y1, x2, y2); + // eax = _destX; + // ebx = _destY; + // EAX, EBX - x,y + // ESI - adres w buforze SSala (czasowy) + // EBP - adres w buforze Sala (staly) + // DL - maska bitu + if(getPixelAddr(_roomPathBitmap, _destX, _destY)) { + if (getPixelAddr(_roomPathBitmap, _destX2, _destY2)) { + //mov eax,d DestX + //mov ebx,d DestY + //mov edi,o CoordsBuf + //mov d Coords,edi + specialPlot(_destX, _destY); + //trace_loop: + int btx = _destX; + int bty = _destY; + byte *bcad = _coords; + while (1) { + _traceLineLen = 0; + Graphics::drawLine(_destX, _destY, _destX2, _destY2, 0, &this->plotTraceLine, this); + } + } else { + //error2 + return 2; + } + } else { + //error2 + return 2; + } return 0; } else { //error1: @@ -2881,6 +2955,10 @@ int PrinceEngine::tracePath(int x1, int y1, int x2, int y2) { } } +void PrinceEngine::approxPath() { + +} + void PrinceEngine::makePath(int destX, int destY) { int pathLen1 = 0; // global? int pathLen2 = 0; // global? diff --git a/engines/prince/prince.h b/engines/prince/prince.h index b9dc249cc3..81c2bf6949 100644 --- a/engines/prince/prince.h +++ b/engines/prince/prince.h @@ -434,6 +434,7 @@ public: // Pathfinding static const int16 kPathGridStep = 2; static const int32 kPathBitmapLen = (kMaxPicHeight / kPathGridStep * kMaxPicWidth / kPathGridStep) / 8; + static const int32 kTracePts = 8000; byte *_roomPathBitmap; // PL - Sala byte *_roomPathBitmapTemp; // PL -SSala @@ -447,6 +448,11 @@ public: int _fpX1; int _fpY1; Direction _direction; + int _coordsBufEnd; + byte *_coordsBuf; // optimal path + byte *_coords; // last path point adress from coordsBuf + int _traceLineLen; + int _traceLineFlag; // return value of plotTraceLine struct fpResult { int x1; @@ -458,10 +464,14 @@ public: bool loadPath(const char *resourceName); void makePath(int destX, int destY); void findPoint(int x1, int y1, int x2, int y2); - bool fpGetPixelAddr(int x, int y); - bool fpGetPixel(int x, int y); + int fpGetPixelAddr(int x, int y); + int fpGetPixel(int x, int y); + int getPixelAddr(byte *pathBitmap, int x, int y); + static void plotTraceLine(int x, int y, int color, void *data); + void specialPlotInside(int x, int y); int tracePath(int x1, int y1, int x2, int y2); Direction makeDirection(int x1, int y1, int x2, int y2); + void specialPlot(int x, int y); void approxPath(); int testAnimNr; |