diff options
author | lukaslw | 2014-06-06 03:21:47 +0200 |
---|---|---|
committer | lukaslw | 2014-06-22 20:08:42 +0200 |
commit | bb85844e7336baaa09fe7edcf16007c7ebe259d9 (patch) | |
tree | 5bd0ae95ba65c9e2be699fd594a40b913aade27f | |
parent | 870d1be7c3b4e40b98710d0190aaaaaeffff621c (diff) | |
download | scummvm-rg350-bb85844e7336baaa09fe7edcf16007c7ebe259d9.tar.gz scummvm-rg350-bb85844e7336baaa09fe7edcf16007c7ebe259d9.tar.bz2 scummvm-rg350-bb85844e7336baaa09fe7edcf16007c7ebe259d9.zip |
PRINCE: Inventory update - first suitcase drawing
-rw-r--r-- | engines/prince/graphics.cpp | 4 | ||||
-rw-r--r-- | engines/prince/graphics.h | 2 | ||||
-rw-r--r-- | engines/prince/mhwanh.h | 2 | ||||
-rw-r--r-- | engines/prince/prince.cpp | 136 | ||||
-rw-r--r-- | engines/prince/prince.h | 5 |
5 files changed, 88 insertions, 61 deletions
diff --git a/engines/prince/graphics.cpp b/engines/prince/graphics.cpp index 210b9d9ef9..49cc88c8ae 100644 --- a/engines/prince/graphics.cpp +++ b/engines/prince/graphics.cpp @@ -73,11 +73,11 @@ void GraphicsMan::draw(uint16 posX, uint16 posY, const Graphics::Surface *s) { change(); } -void GraphicsMan::drawTransparentIntro(int32 posX, int32 posY, const Graphics::Surface *s) { +void GraphicsMan::drawTransparentSurface(int32 posX, int32 posY, const Graphics::Surface *s, int transColor) { for (int y = 0; y < s->h; y++) { for (int x = 0; x < s->w; x++) { byte pixel = *((byte*)s->getBasePtr(x, y)); - if (pixel != 255) { + if (pixel != transColor) { if (x + posX < _frontScreen->w && x + posX >= 0) { if (y + posY < _frontScreen->h && y + posY >= 0) { *((byte*)_frontScreen->getBasePtr(x + posX, y + posY)) = pixel; diff --git a/engines/prince/graphics.h b/engines/prince/graphics.h index 2756bf4777..cd3d8b4f35 100644 --- a/engines/prince/graphics.h +++ b/engines/prince/graphics.h @@ -45,7 +45,7 @@ public: void makeShadowTable(int brightness, byte *shadowTable); void draw(uint16 x, uint16 y, const Graphics::Surface *s); - void drawTransparentIntro(int32 posX, int32 poxY, const Graphics::Surface *s); + void drawTransparentSurface(int32 posX, int32 poxY, const Graphics::Surface *s, int transColor); static void drawTransparent(Graphics::Surface *frontScreen, DrawNode *drawNode); static void drawAsShadow(Graphics::Surface *frontScreen, DrawNode *drawNode); diff --git a/engines/prince/mhwanh.h b/engines/prince/mhwanh.h index 5364c5d20a..02256569ce 100644 --- a/engines/prince/mhwanh.h +++ b/engines/prince/mhwanh.h @@ -38,7 +38,7 @@ public: // ImageDecoder API void destroy(); virtual bool loadStream(Common::SeekableReadStream &stream); - virtual const Graphics::Surface *getSurface() const { return _surface; } + virtual Graphics::Surface *getSurface() const { return _surface; } virtual const byte *getPalette() const { return _palette; } uint16 getPaletteCount() const { return _paletteColorCount; } diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index ad825fb140..a535e4f234 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -79,7 +79,8 @@ PrinceEngine::PrinceEngine(OSystem *syst, const PrinceGameDescription *gameDesc) _locationNr(0), _debugger(nullptr), _midiPlayer(nullptr), _room(nullptr), testAnimNr(0), testAnimFrame(0), _frameNr(0), _cursor1(nullptr), _cursor2(nullptr), _font(nullptr), _suitcaseBmp(nullptr), _roomBmp(nullptr), _cursorNr(0), _picWindowX(0), _picWindowY(0), _randomSource("prince"), - _invLineX(134), _invLineY(176), _invLine(5), _invLines(3), _invLineW(70), _invLineH(76), _invLineSkipX(2), _invLineSkipY(3) { + _invLineX(134), _invLineY(176), _invLine(5), _invLines(3), _invLineW(70), _invLineH(76), _invLineSkipX(2), _invLineSkipY(3), + _showInventoryFlag(false), _inventoryBackgroundRemember(false) { // Debug/console setup DebugMan.addDebugChannel(DebugChannel::kScript, "script", "Prince Script debug channel"); @@ -408,7 +409,7 @@ bool PrinceEngine::playNextFrame() { const Graphics::Surface *s = _flicPlayer.decodeNextFrame(); if (s) { - _graph->drawTransparentIntro(0, 0, s); + _graph->drawTransparentSurface(0, 0, s, 255); _graph->change(); } else if (_flicLooped) { _flicPlayer.rewind(); @@ -654,6 +655,7 @@ void PrinceEngine::keyHandler(Common::Event event) { break; case Common::KEYCODE_i: _mainHero->_middleY -= 5; + inventoryFlagChange(); break; case Common::KEYCODE_k: _mainHero->_middleY += 5; @@ -1183,69 +1185,76 @@ void PrinceEngine::freeDrawNodes() { } void PrinceEngine::drawScreen() { - const Graphics::Surface *roomSurface = _roomBmp->getSurface(); - Graphics::Surface visiblePart; - if (roomSurface) { - visiblePart = roomSurface->getSubArea(Common::Rect(_picWindowX, 0, roomSurface->w, roomSurface->h)); - _graph->draw(0, 0, &visiblePart); - } - - Graphics::Surface *mainHeroSurface = NULL; - if (_mainHero->_visible) { - mainHeroSurface = _mainHero->getSurface(); - if (mainHeroSurface) { - _mainHero->showHeroShadow(mainHeroSurface); + if (!_showInventoryFlag || _inventoryBackgroundRemember) { + const Graphics::Surface *roomSurface = _roomBmp->getSurface(); + Graphics::Surface visiblePart; + if (roomSurface) { + visiblePart = roomSurface->getSubArea(Common::Rect(_picWindowX, 0, roomSurface->w, roomSurface->h)); + _graph->draw(0, 0, &visiblePart); + } - DrawNode newDrawNode; - newDrawNode.posX = _mainHero->_drawX; - newDrawNode.posY = _mainHero->_drawY; - newDrawNode.posZ = _mainHero->_drawZ; - newDrawNode.width = 0; - newDrawNode.height = 0; - newDrawNode.originalRoomSurface = nullptr; - newDrawNode.data = nullptr; - newDrawNode.drawFunction = &_graph->drawTransparent; - - if (_mainHero->_zoomFactor != 0) { - Graphics::Surface *zoomedHeroSurface = _mainHero->zoomSprite(mainHeroSurface); - newDrawNode.s = zoomedHeroSurface; - newDrawNode.freeSurfaceSMemory = true; - } else { - newDrawNode.s = mainHeroSurface; - newDrawNode.freeSurfaceSMemory = false; + Graphics::Surface *mainHeroSurface = NULL; + if (_mainHero->_visible) { + mainHeroSurface = _mainHero->getSurface(); + if (mainHeroSurface) { + _mainHero->showHeroShadow(mainHeroSurface); + + DrawNode newDrawNode; + newDrawNode.posX = _mainHero->_drawX; + newDrawNode.posY = _mainHero->_drawY; + newDrawNode.posZ = _mainHero->_drawZ; + newDrawNode.width = 0; + newDrawNode.height = 0; + newDrawNode.originalRoomSurface = nullptr; + newDrawNode.data = nullptr; + newDrawNode.drawFunction = &_graph->drawTransparent; + + if (_mainHero->_zoomFactor != 0) { + Graphics::Surface *zoomedHeroSurface = _mainHero->zoomSprite(mainHeroSurface); + newDrawNode.s = zoomedHeroSurface; + newDrawNode.freeSurfaceSMemory = true; + } else { + newDrawNode.s = mainHeroSurface; + newDrawNode.freeSurfaceSMemory = false; + } + _drawNodeList.push_back(newDrawNode); } - _drawNodeList.push_back(newDrawNode); } - } - showBackAnims(); + showBackAnims(); - showObjects(); + showObjects(); - if (roomSurface) { - insertMasks(&visiblePart); - } - - showParallax(); + if (roomSurface) { + insertMasks(&visiblePart); + } - displayInventory(); // temp + showParallax(); - runDrawNodes(); + runDrawNodes(); - freeDrawNodes(); + freeDrawNodes(); - if (_mainHero->_visible) { - mainHeroSurface->free(); - delete mainHeroSurface; - } + if (_mainHero->_visible) { + mainHeroSurface->free(); + delete mainHeroSurface; + } - clsMasks(); + clsMasks(); - playNextFrame(); + playNextFrame(); - hotspot(); + if (!_inventoryBackgroundRemember) { + hotspot(); + showTexts(); + } else { + rememberScreenInv(); + _inventoryBackgroundRemember = false; + } - showTexts(); + } else { + displayInventory(); + } getDebugger()->onFrame(); @@ -1253,7 +1262,16 @@ void PrinceEngine::drawScreen() { } void PrinceEngine::rememberScreenInv() { + _backgroundForInventory = _graph->_frontScreen; +} +void PrinceEngine::inventoryFlagChange() { + if (!_showInventoryFlag) { + _showInventoryFlag = true; + _inventoryBackgroundRemember = true; + } else { + _showInventoryFlag = false; + } } void PrinceEngine::prepareInventoryToView() { @@ -1269,12 +1287,10 @@ void PrinceEngine::prepareInventoryToView() { _maxInvW = (374 - 2 * _invLine) / _invLine; _invLineW = _maxInvW - 2; - rememberScreenInv(); - int currInvX = _invLineX; int currInvY = _invLineY; - int item = 0; + uint item = 0; for (int i = 0 ; i < _invLines; i++) { for (int j = 0; j < _invLine; j++) { Mob tempMobItem; @@ -1311,14 +1327,14 @@ void PrinceEngine::drawInvItems() { //MST_Shadow // TODO! //shad0: - if (_mainHero->_inventory[item] != 0) { + //if (_mainHero->_inventory[item] != 0) { int itemNr = _mainHero->_inventory[item]; if (itemNr != 68) { - showSprite(_allInvList[itemNr].getSurface(), currInvX, currInvY, 10000, false); // temp + _graph->drawTransparentSurface(currInvX, currInvY, _allInvList[itemNr].getSurface(), 0); } else { // candle item: } - } + //} } currInvX += _invLineW + _invLineSkipX; item++; @@ -1336,7 +1352,13 @@ void PrinceEngine::displayInventory() { _mainHero->_inventory.push_back(3); _mainHero->_inventory.push_back(4); _mainHero->_inventory.push_back(5); + prepareInventoryToView(); + + _graph->drawTransparentSurface(0, 0, _backgroundForInventory, 0); + Graphics::Surface *suitcase = _suitcaseBmp->getSurface(); + _graph->drawTransparentSurface(0, 0, suitcase, 0); + drawInvItems(); } diff --git a/engines/prince/prince.h b/engines/prince/prince.h index 0f76ffc1e4..6919587271 100644 --- a/engines/prince/prince.h +++ b/engines/prince/prince.h @@ -275,6 +275,8 @@ public: uint32 _invTxtSize; byte *_invTxt; + bool _showInventoryFlag; + bool _inventoryBackgroundRemember; int _invLineX; int _invLineY; int _invLine; // number of items in one line @@ -285,12 +287,15 @@ public: int _invLineSkipX; int _invLineSkipY; + void inventoryFlagChange(); bool loadAllInv(); void rememberScreenInv(); void prepareInventoryToView(); void drawInvItems(); void displayInventory(); + Graphics::Surface *_backgroundForInventory; + int testAnimNr; int testAnimFrame; |