diff options
-rw-r--r-- | engines/prince/prince.cpp | 94 | ||||
-rw-r--r-- | engines/prince/prince.h | 14 |
2 files changed, 97 insertions, 11 deletions
diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index 346342462d..ad825fb140 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -129,6 +129,12 @@ PrinceEngine::~PrinceEngine() { clearBackAnimList(); + for (uint i = 0; i < _allInvList.size(); i++) { + _allInvList[i]._surface->free(); + delete _allInvList[i]._surface; + } + _allInvList.clear(); + for (uint i = 0; i < _mainHero->_moveSet.size(); i++) { delete _mainHero->_moveSet[i]; } @@ -219,6 +225,8 @@ void PrinceEngine::init() { delete invTxtStream; + loadAllInv(); + _roomBmp = new Image::BitmapDecoder(); _room = new Room(); @@ -555,6 +563,34 @@ bool PrinceEngine::loadShadow(byte *shadowBitmap, uint32 dataSize, const char *r return true; } +bool PrinceEngine::loadAllInv() { + for (int i = 0; i < kMaxInv; i++) { + InvItem tempInvItem; + + const Common::String invStreamName = Common::String::format("INV%02d", i); + Common::SeekableReadStream *invStream = SearchMan.createReadStreamForMember(invStreamName); + if (!invStream) { + delete invStream; + return true; + } + + invStream->skip(4); + int width = invStream->readUint16LE(); + int height = invStream->readUint16LE(); + tempInvItem._surface = new Graphics::Surface(); + tempInvItem._surface->create(width, height, Graphics::PixelFormat::createFormatCLUT8()); + + for (int h = 0; h < tempInvItem._surface->h; h++) { + invStream->read(tempInvItem._surface->getBasePtr(0, h), tempInvItem._surface->w); + } + + _allInvList.push_back(tempInvItem); + delete invStream; + } + + return true; +} + void PrinceEngine::keyHandler(Common::Event event) { uint16 nChar = event.kbd.keycode; switch (nChar) { @@ -1192,6 +1228,8 @@ void PrinceEngine::drawScreen() { showParallax(); + displayInventory(); // temp + runDrawNodes(); freeDrawNodes(); @@ -1219,6 +1257,7 @@ void PrinceEngine::rememberScreenInv() { } void PrinceEngine::prepareInventoryToView() { + _invMobList.clear(); int invItem = _mainHero->_inventory.size(); _invLine = invItem / 3; if (invItem % 3 != 0) { @@ -1239,14 +1278,16 @@ void PrinceEngine::prepareInventoryToView() { for (int i = 0 ; i < _invLines; i++) { for (int j = 0; j < _invLine; j++) { Mob tempMobItem; - tempMobItem._mask = _mainHero->_inventory[item] - 1; - tempMobItem._x1 = currInvX + _picWindowX; //picWindowX2 ? - tempMobItem._x2 = currInvX + _picWindowX + _invLineW - 1; // picWindowX2 ? - tempMobItem._y1 = currInvY; - tempMobItem._y2 = currInvY + _invLineH - 1; - //tempMobItem._name = ; - //tempMobItem._examText = ; - _invMobList.push_back(tempMobItem); + if (item < _mainHero->_inventory.size()) { + tempMobItem._mask = _mainHero->_inventory[item] - 1; + tempMobItem._x1 = currInvX + _picWindowX; //picWindowX2 ? + tempMobItem._x2 = currInvX + _picWindowX + _invLineW - 1; // picWindowX2 ? + tempMobItem._y1 = currInvY; + tempMobItem._y2 = currInvY + _invLineH - 1; + //tempMobItem._name = ; + //tempMobItem._examText = ; + _invMobList.push_back(tempMobItem); + } currInvX += _invLineW + _invLineSkipX; item++; } @@ -1260,8 +1301,43 @@ void PrinceEngine::prepareInventoryToView() { //mov d MobPriAddr,o InvMobPri } -void PrinceEngine::displayInventory() { +void PrinceEngine::drawInvItems() { + int currInvX = _invLineX; + int currInvY = _invLineY; + uint item = 0; + for (int i = 0 ; i < _invLines; i++) { + for (int j = 0; j < _invLine; j++) { + if (item < _mainHero->_inventory.size()) { + //MST_Shadow + // TODO! + //shad0: + if (_mainHero->_inventory[item] != 0) { + int itemNr = _mainHero->_inventory[item]; + if (itemNr != 68) { + showSprite(_allInvList[itemNr].getSurface(), currInvX, currInvY, 10000, false); // temp + } else { + // candle item: + } + } + } + currInvX += _invLineW + _invLineSkipX; + item++; + } + currInvX = _invLineX; + currInvY += _invLineSkipY + _invLineH; + } +} +void PrinceEngine::displayInventory() { + _mainHero->_inventory.clear(); + _mainHero->_inventory.push_back(0); + _mainHero->_inventory.push_back(1); + _mainHero->_inventory.push_back(2); + _mainHero->_inventory.push_back(3); + _mainHero->_inventory.push_back(4); + _mainHero->_inventory.push_back(5); + prepareInventoryToView(); + drawInvItems(); } void PrinceEngine::mainLoop() { diff --git a/engines/prince/prince.h b/engines/prince/prince.h index 4e1073b375..0f76ffc1e4 100644 --- a/engines/prince/prince.h +++ b/engines/prince/prince.h @@ -179,6 +179,11 @@ struct Mask { } }; +struct InvItem { + Graphics::Surface *_surface; + Graphics::Surface *getSurface() const { return _surface; } +}; + struct DrawNode { int posX; int posY; @@ -265,21 +270,25 @@ public: void showMask(int maskNr, Graphics::Surface *originalRoomSurface); void clsMasks(); + static const int16 kMaxInv = 90; // max amount of inventory items in whole game + uint32 _invTxtSize; byte *_invTxt; int _invLineX; int _invLineY; - int _invLine; - int _invLines; + int _invLine; // number of items in one line + int _invLines; // number of lines with inventory items int _invLineW; int _invLineH; int _maxInvW; int _invLineSkipX; int _invLineSkipY; + bool loadAllInv(); void rememberScreenInv(); void prepareInventoryToView(); + void drawInvItems(); void displayInventory(); int testAnimNr; @@ -334,6 +343,7 @@ private: Common::Array<Object *> _objList; Common::Array<Mask> _maskList; Common::Array<DrawNode> _drawNodeList; + Common::Array<InvItem> _allInvList; Common::Array<Mob> _invMobList; bool _flicLooped; |