diff options
author | lukaslw | 2014-05-06 22:46:45 +0200 |
---|---|---|
committer | lukaslw | 2014-06-22 20:07:57 +0200 |
commit | fff1ff5b1a4dc6d24d8592d73677e5a69471c1a0 (patch) | |
tree | 9aa514eeb3dc592b23adc334cbc1240cf3d798b4 /engines | |
parent | 583d6bdca10deb14578fa68bbee23e77c154d0f0 (diff) | |
download | scummvm-rg350-fff1ff5b1a4dc6d24d8592d73677e5a69471c1a0.tar.gz scummvm-rg350-fff1ff5b1a4dc6d24d8592d73677e5a69471c1a0.tar.bz2 scummvm-rg350-fff1ff5b1a4dc6d24d8592d73677e5a69471c1a0.zip |
PRINCE: showHeroShadow update, line() implementation
Diffstat (limited to 'engines')
-rw-r--r-- | engines/prince/hero.cpp | 126 | ||||
-rw-r--r-- | engines/prince/hero.h | 1 | ||||
-rw-r--r-- | engines/prince/prince.cpp | 2 | ||||
-rw-r--r-- | engines/prince/prince.h | 1 |
4 files changed, 126 insertions, 4 deletions
diff --git a/engines/prince/hero.cpp b/engines/prince/hero.cpp index 177ee0c981..57743b7069 100644 --- a/engines/prince/hero.cpp +++ b/engines/prince/hero.cpp @@ -249,6 +249,79 @@ void Hero::countDrawPosition() { } } +void Hero::line(int x1, int y1, int x2, int y2) { + //EAX - x1 <- LightX + //EBX - y1 <- LightY + //ECX - x2 <- DestX + //EDX - y2 <- DestY + + //pushad + int dX = 1; + int vx = y2 - y1; + if(x2 <= x1) { + dX = -1; + vx = -1 * vx; + } + // pl_1 + int lvx = vx; + int dY = 1; + int vy = x1 - x2; + if (y2 <= y1) { + dY = -1; + vy = -1 * vy; + } + // pl_2 + int lvy = vy; + int lx = x1; + int ly = y1; + int lx2 = x2; + int ly2 = y2; + int lfa = 0; + + //loop + //if (x1 != x2 && y1 != y2) { + while (lx != lx2 && ly != ly2) { + // not_end + // pushad + // LineCode() ? + // popad + int lfx = lfa + lvx; + int lfy = lfa + lvy; + int lfxy = lfx + lfy - lfa; + if (lfxy < 0) { + lfxy = -1 * lfxy; + } + //abs_fxy_done + if (lfx < 0) { + lfx = -1 * lfx; + } + //abs_fx_done + if (lfy < 0) { + lfy = -1 * lfy; + } + //abs_fy_done + if (lfx > lfy || lfx > lfxy) { + //c2 + if (lfy >= lfx || lfy > lfxy) { + //c3 + ly += dY; + lx += dX; + lfa = lfxy; + } else { + ly += dY; + lfa = lfa + lvy; // lfx / lfy = ? + } + } else { + lx += dX; + lfa = lfa + lvx; //9600 ??? + // jump to @@next + } + //next + // + } + +} + Graphics::Surface *Hero::showHeroShadow(Graphics::Surface *heroFrame) { int16 frameXSize = _moveSet[_moveSetType]->getFrameWidth(_phase); int16 frameYSize = _moveSet[_moveSetType]->getFrameHeight(_phase); @@ -272,7 +345,7 @@ Graphics::Surface *Hero::showHeroShadow(Graphics::Surface *heroFrame) { return makeShadow; // source Bitmap of sprite - esi - //int destX = _drawX; // eax + int destX = _drawX; // eax int destY = _middleY - _shadMinus; // ecx // modulo of source Bitmap - ebp //int scaledX = getScaledValue(frameXSize); // ebx @@ -305,8 +378,55 @@ Graphics::Surface *Hero::showHeroShadow(Graphics::Surface *heroFrame) { // sprModulo = modulo of source Bitmap // sprWidth = scaledX // sprHeight = scaledY - //int sprDestX = destX - PicWindowX; - //int sprDestY = destY - PicWindowY; + int sprDestX = destX - _vm->_picWindowX; + int sprDestY = destY - _vm->_picWindowY; + + int shadPosX = sprDestX; + int shadMinX = sprDestX; + int shadMaxX = sprDestX; + + int shadPosY = sprDestY; + int shadMinY = sprDestY; + int shadMaxY = sprDestY; + // destY * kMaxPicWidth / 8 + destX / 8 + int shadBitAddr = _shadowBitmap->getZoom(destY * kMaxPicWidth / 8 + destX / 8); + int shadBitMask = 128 / (destX % 8); + + int shadZoomY2 = _shadScaleValue; + int shadZoomY = _scaleValue; + + // lockscreen etc + + // banked2 + // edx = linijka() + 8 + + // linear_loop + //for(int i = 0; i < ; i++) { + int ebx16795 = shadPosY; + int sprModulo = 0; + int shadSkipX = 0; + //retry_line: + for(int j = 0; j < shadPosY; j++) { + shadZoomY -= 100; + if(shadZoomY < 0 || _scaleValue != 10000) { + shadZoomY += _scaleValue; + // esi -= sprWidth + } else { + break; //to line_y_ok + } + // esp += 4*4 + // koniec_bajki + } + //line_y_ok + int shadLastY = 0; + if (shadPosY < 0 || shadPosY == shadLastY || shadPosY >= 480 || shadPosX >= 640) { + shadLastY = shadPosY; + //skip_line + + } else if (shadPosX < 0) { + shadSkipX = -1 * shadPosX; + } + //} } } diff --git a/engines/prince/hero.h b/engines/prince/hero.h index edc95e12ca..efa9027d4c 100644 --- a/engines/prince/hero.h +++ b/engines/prince/hero.h @@ -114,6 +114,7 @@ public: void checkNak(); Graphics::Surface *zoomSprite(Graphics::Surface *heroFrame); void showHeroAnimFrame(); + void line(int x1, int y1, int x2, int y2); Graphics::Surface *showHeroShadow(Graphics::Surface *heroFrame); void setShadowScale(int32 shadowScale); void specialAnim(); diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index fc109b31ce..39183d35f1 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -78,7 +78,7 @@ PrinceEngine::PrinceEngine(OSystem *syst, const PrinceGameDescription *gameDesc) Engine(syst), _gameDescription(gameDesc), _graph(nullptr), _script(nullptr), _interpreter(nullptr), _flags(nullptr), _locationNr(0), _debugger(nullptr), _midiPlayer(nullptr), _cameraX(0), _newCameraX(0), _frameNr(0), _cursor1(nullptr), _cursor2(nullptr), _font(nullptr), - _walizkaBmp(nullptr), _roomBmp(nullptr), _cursorNr(0), _picWindowX(0) { + _walizkaBmp(nullptr), _roomBmp(nullptr), _cursorNr(0), _picWindowX(0), _picWindowY(0) { // Debug/console setup DebugMan.addDebugChannel(DebugChannel::kScript, "script", "Prince Script debug channel"); diff --git a/engines/prince/prince.h b/engines/prince/prince.h index 3dd372dd48..8213b2d32b 100644 --- a/engines/prince/prince.h +++ b/engines/prince/prince.h @@ -144,6 +144,7 @@ public: uint16 _newCameraX; uint16 _sceneWidth; uint32 _picWindowX; + uint32 _picWindowY; private: bool playNextFrame(); |