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; | 
