aboutsummaryrefslogtreecommitdiff
path: root/engines/prince
diff options
context:
space:
mode:
authorlukaslw2014-06-06 03:21:47 +0200
committerlukaslw2014-06-22 20:08:42 +0200
commitbb85844e7336baaa09fe7edcf16007c7ebe259d9 (patch)
tree5bd0ae95ba65c9e2be699fd594a40b913aade27f /engines/prince
parent870d1be7c3b4e40b98710d0190aaaaaeffff621c (diff)
downloadscummvm-rg350-bb85844e7336baaa09fe7edcf16007c7ebe259d9.tar.gz
scummvm-rg350-bb85844e7336baaa09fe7edcf16007c7ebe259d9.tar.bz2
scummvm-rg350-bb85844e7336baaa09fe7edcf16007c7ebe259d9.zip
PRINCE: Inventory update - first suitcase drawing
Diffstat (limited to 'engines/prince')
-rw-r--r--engines/prince/graphics.cpp4
-rw-r--r--engines/prince/graphics.h2
-rw-r--r--engines/prince/mhwanh.h2
-rw-r--r--engines/prince/prince.cpp136
-rw-r--r--engines/prince/prince.h5
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;