[Scummvm-git-logs] scummvm master -> 50d7be8767ade8c2df7c2b055d616591f66f1f44

whiterandrek whiterandrek at gmail.com
Thu May 21 04:05:05 UTC 2020


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
50d7be8767 PETKA: case object reimplementation


Commit: 50d7be8767ade8c2df7c2b055d616591f66f1f44
    https://github.com/scummvm/scummvm/commit/50d7be8767ade8c2df7c2b055d616591f66f1f44
Author: Andrei Prykhodko (whiterandrek at gmail.com)
Date: 2020-05-21T07:04:45+03:00

Commit Message:
PETKA: case object reimplementation

Changed paths:
    engines/petka/interfaces/interface.h
    engines/petka/objects/object.cpp
    engines/petka/objects/object_case.cpp
    engines/petka/objects/object_case.h


diff --git a/engines/petka/interfaces/interface.h b/engines/petka/interfaces/interface.h
index 2436619204..69b8c05c48 100644
--- a/engines/petka/interfaces/interface.h
+++ b/engines/petka/interfaces/interface.h
@@ -56,7 +56,7 @@ public:
 public:
 	Common::Array<QVisibleObject *> _objs;
 	QVisibleObject *_objUnderCursor;
-	int _startIndex;
+	uint _startIndex;
 };
 
 } // End of namespace Petka
diff --git a/engines/petka/objects/object.cpp b/engines/petka/objects/object.cpp
index 7ec192da9d..3876441057 100644
--- a/engines/petka/objects/object.cpp
+++ b/engines/petka/objects/object.cpp
@@ -187,7 +187,7 @@ void QMessageObject::processMessage(const QMessage &msg) {
 			g_vm->getQSystem()->_case->removeItem(msg.objId);
 			break;
 		case kSetInv:
-			g_vm->getQSystem()->_case->setInv(msg.sender->_id, msg.objId);
+			g_vm->getQSystem()->_case->transformItem(msg.sender->_id, msg.objId);
 			break;
 		case kAvi: {
 			Common::String videoName = g_vm->resMgr()->findResourceName((uint16) msg.arg1);
diff --git a/engines/petka/objects/object_case.cpp b/engines/petka/objects/object_case.cpp
index 385599f754..2d24fcee95 100644
--- a/engines/petka/objects/object_case.cpp
+++ b/engines/petka/objects/object_case.cpp
@@ -20,6 +20,8 @@
  *
  */
 
+#include "common/system.h"
+
 #include "petka/interfaces/main.h"
 #include "petka/objects/object_case.h"
 #include "petka/flc.h"
@@ -34,29 +36,54 @@ namespace Petka {
 // Полоска в чемодане
 const char *const kPoloska = "\xCF\xEE\xEB\xEE\xF1\xEA\xE0\x20\xE2\x20\xF7\xE5\xEC\xEE\xE4\xE0\xED\xE5";
 
+const uint kCaseZ = 980;
+const uint kItemZ = kCaseZ + 1;
+const uint kPoloskaZ = kCaseZ + 2;
+
+const uint kButtonsCount = 6;
+const uint kItemsOnPage = 6;
+
+const uint kObjectCaseId = 4099;
+
+const uint kCaseResourceId = 6000;
+const uint kFirstButtonResourceId = 6001;
+const uint kExitCaseResourceId = 6009;
+
+enum {
+	kChapayevButton = 0,
+	kPanelButton,
+	kMapButton,
+	kCloseButton,
+	kNextPageButton,
+	kPrevPageButton,
+	kInvalidButton
+};
 
 QObjectCase::QObjectCase() {
+	_id = kObjectCaseId;
+	_resourceId = kCaseResourceId;
+
+	_z = kCaseZ;
+
 	_itemIndex = 0;
+	_clickedObjIndex = kInvalidButton;
+
 	_isShown = false;
 	_updateZ = false;
-	_id = 4099;
-	_resourceId = 6000;
-	_z = 980;
-	_clickedObjIndex = -1;
 
-	_itemsLocation[0] = Common::Point(120, 145);
-	_itemsLocation[1] = Common::Point(240, 145);
-	_itemsLocation[2] = Common::Point(360, 145);
-	_itemsLocation[3] = Common::Point(100, 220);
-	_itemsLocation[4] = Common::Point(240, 220);
-	_itemsLocation[5] = Common::Point(380, 220);
+	_itemsLocation[kChapayevButton] = Common::Point(120, 145);
+	_itemsLocation[kPanelButton] = Common::Point(240, 145);
+	_itemsLocation[kMapButton] = Common::Point(360, 145);
+	_itemsLocation[kCloseButton] = Common::Point(100, 220);
+	_itemsLocation[kNextPageButton] = Common::Point(240, 220);
+	_itemsLocation[kPrevPageButton] = Common::Point(380, 220);
 }
 
 void QObjectCase::update(int time) {
-	if (!_isShown || _clickedObjIndex >= 6)
+	if (!_isShown || _clickedObjIndex == kInvalidButton)
 		return;
 	_time += time;
-	FlicDecoder *flc = g_vm->resMgr()->loadFlic(6001 + _clickedObjIndex);
+	FlicDecoder *flc = g_vm->resMgr()->loadFlic(kFirstButtonResourceId + _clickedObjIndex);
 	if (flc) {
 		while (_time >= flc->getDelay()) {
 			flc->setFrame(-1);
@@ -66,24 +93,43 @@ void QObjectCase::update(int time) {
 	}
 }
 
+void QObjectCase::draw() {
+	if (!_isShown)
+		return;
+	QObject::draw();
+	if (_clickedObjIndex != kInvalidButton) {
+		FlicDecoder *flc = g_vm->resMgr()->loadFlic(kFirstButtonResourceId + _clickedObjIndex);
+		Graphics::Surface *s = flc->getCurrentFrame()->convertTo(g_system->getScreenFormat(), flc->getPalette());
+
+		const Common::List<Common::Rect> &dirty = g_vm->videoSystem()->rects();
+		const Common::Array<Common::Rect> &mskRects = flc->getMskRects();
+
+		for (Common::List<Common::Rect>::const_iterator it = dirty.begin(); it != dirty.end(); ++it) {
+			for (uint i = 0; i < mskRects.size(); ++i) {
+				Common::Rect rect = mskRects[i].findIntersectingRect(*it);
+				debug("%d %d", rect.width(), rect.height());
+				g_vm->videoSystem()->screen().transBlitFrom(*s, rect, rect, flc->getTransColor(s->format));
+			}
+		}
+
+		s->free();
+		delete s;
+	}
+}
+
 void QObjectCase::show(bool v) {
 	_x = 0; // sys->xOffset
 	QObject::show(v);
 	if (v) {
-		fillWithItems();
+		addItemObjects();
+
 		QMessageObject *obj = g_vm->getQSystem()->findObject(kPoloska);
-		obj->_z = _z + 2;
+		obj->_z = kPoloskaZ;
 		obj->_x = 0; // sys->xOffset
+
 		g_vm->getQSystem()->_mainInterface->_objs.push_back(obj);
 	} else {
-		Common::Array<QVisibleObject *> &objs = g_vm->getQSystem()->_mainInterface->_objs;
-		for (int i = 0; i < objs.size();) {
-			if (objs[i]->_z == _z + 1 || objs[i]->_z == _z + 2) {
-				objs.remove_at(i);
-			} else {
-				++i;
-			}
-		}
+		removeObjects(true);
 		g_vm->getQSystem()->_currInterface->_startIndex = 0;
 	}
 }
@@ -93,40 +139,38 @@ bool QObjectCase::isInPoint(int x, int y) {
 }
 
 void QObjectCase::onMouseMove(int x, int y) {
-	FlicDecoder *flc = g_vm->resMgr()->loadFlic(6009);
+	FlicDecoder *flc = g_vm->resMgr()->loadFlic(kExitCaseResourceId);
 	if (*(const byte *)flc->getCurrentFrame()->getBasePtr(x - _x, y - _y) != 0) {
-		if (_clickedObjIndex != 3 && _clickedObjIndex < 6 && _clickedObjIndex >= 0) {
-			flc = g_vm->resMgr()->loadFlic(6001 + _clickedObjIndex);
+		if (_clickedObjIndex != kCloseButton && _clickedObjIndex != kInvalidButton) {
+			flc = g_vm->resMgr()->loadFlic(kFirstButtonResourceId + _clickedObjIndex);
 			flc->setFrame(1);
 			g_vm->videoSystem()->addDirtyRectFromMsk(Common::Point(0, 0), *flc);
 		}
-		_clickedObjIndex = 3;
+		_clickedObjIndex = kCloseButton;
 	} else {
-		int i;
-		for (i = 0; i < 6; ++i) {
-			flc = g_vm->resMgr()->loadFlic(6001 + i);
+		uint i;
+		for (i = 0; i < kButtonsCount; ++i) {
+			flc = g_vm->resMgr()->loadFlic(kFirstButtonResourceId + i);
 			if (flc->getMskRects()[0].contains(Common::Point(x - _x, y))) {
 				break;
 			}
 		}
 
-		if (_clickedObjIndex != i && _clickedObjIndex < 6 && _clickedObjIndex >= 0) {
-			flc = g_vm->resMgr()->loadFlic(6001 + _clickedObjIndex);
+		if (_clickedObjIndex != i && _clickedObjIndex != kInvalidButton) {
+			flc = g_vm->resMgr()->loadFlic(kFirstButtonResourceId + _clickedObjIndex);
 			flc->setFrame(1);
 			g_vm->videoSystem()->addDirtyRectFromMsk(Common::Point(0, 0), *flc);
 		}
 
-		if (i == 6) {
-			if (_clickedObjIndex < 6 && _clickedObjIndex >= 0) {
-				_clickedObjIndex = -1;
-			}
+		if (i == kButtonsCount && _clickedObjIndex != kInvalidButton) {
+			_clickedObjIndex = kInvalidButton;
 		} else if (i != _clickedObjIndex) {
-			if ((i || g_vm->getQSystem()->_chapayev->_isShown) && (i != 2 || g_vm->getQSystem()->_room->_showMap)) {
-				flc = g_vm->resMgr()->loadFlic(6001 + i);
+			if ((i != kChapayevButton || g_vm->getQSystem()->_chapayev->_isShown) && (i != kMapButton || g_vm->getQSystem()->_room->_showMap)) {
+				flc = g_vm->resMgr()->loadFlic(kFirstButtonResourceId + i);
 				g_vm->videoSystem()->addDirtyRectFromMsk(Common::Point(0, 0), *flc);
 				_clickedObjIndex = i;
 			} else {
-				_clickedObjIndex = -1;
+				_clickedObjIndex = kInvalidButton;
 			}
 		}
 	}
@@ -134,56 +178,43 @@ void QObjectCase::onMouseMove(int x, int y) {
 
 void QObjectCase::onClick(int x, int y) {
 	switch (_clickedObjIndex) {
-		case 0:
+		case kChapayevButton:
 			g_vm->getQSystem()->setChapayev();
 			break;
-		case 1:
+		case kPanelButton:
 			g_vm->getQSystem()->togglePanelInterface();
 			break;
-		case 2:
+		case kMapButton:
 			g_vm->getQSystem()->toggleMapInterface();
 			break;
-		case 3:
-			show(0);
+		case kCloseButton:
+			show(false);
 			break;
-		case 4:
-			if (_items.size() > _itemIndex + 6) {
-				_itemIndex += 6;
-				fillWithItems();
-				g_vm->videoSystem()->makeAllDirty();
-			}
+		case kNextPageButton:
+			nextPage();
 			break;
-		case 5:
-			if (_itemIndex > 0) {
-				_itemIndex = (_itemIndex - 6 <= 0) ? 0 : _itemIndex - 6;
-				fillWithItems();
-				g_vm->videoSystem()->makeAllDirty();
-			}
+		case kPrevPageButton:
+			prevPage();
 			break;
 		default:
 			break;
 	}
 }
 
-void QObjectCase::fillWithItems() {
+void QObjectCase::addItemObjects() {
 	Common::Array<QVisibleObject *> &objs = g_vm->getQSystem()->_mainInterface->_objs;
-	for (int i = 0; i < objs.size();) {
-		if (objs[i]->_z == _z + 1) {
-			objs.remove_at(i);
-		} else {
-			++i;
-		}
-	}
+	removeObjects(false);
 
-	for (int i = 0; i < objs.size(); ++i) {
-		if (objs[i]->_resourceId == 6000) {
+	for (uint i = 0; i < objs.size(); ++i) {
+		if (objs[i]->_resourceId == kCaseResourceId) {
 			g_vm->getQSystem()->_currInterface->_startIndex = i;
 		}
 	}
 
-	for (int i = _itemIndex; i < ((_itemIndex + 6 >= _items.size()) ? _items.size() : _itemIndex + 6); ++i) {
+	const uint size = (_itemIndex + kItemsOnPage >= _items.size()) ? _items.size() : (_itemIndex + kItemsOnPage);
+	for (uint i = _itemIndex; i < size; ++i) {
 		QMessageObject *obj = g_vm->getQSystem()->findObject(_items[i]);
-		obj->_z = _z + 1;
+		obj->_z = kItemZ;
 		objs.push_back(obj);
 		g_vm->resMgr()->loadFlic(obj->_resourceId);
 		_x = _itemsLocation[i - _itemIndex].x;
@@ -191,39 +222,64 @@ void QObjectCase::fillWithItems() {
 	}
 }
 
-void QObjectCase::addItem(int id) {
+void QObjectCase::addItem(uint16 id) {
 	_items.push_back(id);
-	if (_isShown) {
-		show(0);
-		show(1);
-	}
+	reshow();
 }
 
-void QObjectCase::removeItem(int id) {
+void QObjectCase::removeItem(uint16 id) {
 	for (uint i = 0; i < _items.size(); ++i) {
 		if (_items[i] == id) {
 			_items.remove_at(i);
 		}
 	}
 
-	_itemIndex = (_items.size() < 6) ? 0 : (_items.size() - 6);
+	_itemIndex = (_items.size() < kItemsOnPage) ? 0 : (_items.size() - kItemsOnPage);
 
-	if (_isShown) {
-		show(0);
-		show(1);
-	}
+	reshow();
 }
 
-void QObjectCase::setInv(int id1, int id2) {
+void QObjectCase::transformItem(uint16 oldItem, uint16 newItem) {
 	for (uint i = 0; i < _items.size(); ++i) {
-		if (_items[i] == id1) {
-			_items[i] = id2;
+		if (_items[i] == oldItem) {
+			_items[i] = newItem;
 		}
 	}
 
+	reshow();
+}
+
+void QObjectCase::nextPage() {
+	if (_items.size() > _itemIndex + kItemsOnPage) {
+		_itemIndex += kItemsOnPage;
+		addItemObjects();
+		g_vm->videoSystem()->makeAllDirty();
+	}
+}
+
+void QObjectCase::prevPage() {
+	if (_itemIndex > 0) {
+		_itemIndex = (_itemIndex <= kItemsOnPage) ? 0 : _itemIndex - kItemsOnPage;
+		addItemObjects();
+		g_vm->videoSystem()->makeAllDirty();
+	}
+}
+
+void QObjectCase::removeObjects(bool removePoloska) {
+	Common::Array<QVisibleObject *> &objs = g_vm->getQSystem()->_mainInterface->_objs;
+	for (uint i = 0; i < objs.size();) {
+		if (objs[i]->_z == kItemZ || (removePoloska && objs[i]->_z == kPoloskaZ)) {
+			objs.remove_at(i);
+		} else {
+			++i;
+		}
+	}
+}
+
+void QObjectCase::reshow() {
 	if (_isShown) {
-		show(0);
-		show(1);
+		show(false);
+		show(true);
 	}
 }
 
diff --git a/engines/petka/objects/object_case.h b/engines/petka/objects/object_case.h
index bde7544b2d..978314670a 100644
--- a/engines/petka/objects/object_case.h
+++ b/engines/petka/objects/object_case.h
@@ -30,22 +30,31 @@ namespace Petka {
 class QObjectCase : public QObject {
 public:
 	QObjectCase();
+	void draw() override;
 	void update(int time) override;
 	void show(bool v) override;
 	bool isInPoint(int x, int y) override;
 	void onMouseMove(int x, int y) override;
 	void onClick(int x, int y) override;
-	void fillWithItems();
 
-	void addItem(int id);
-	void removeItem(int id);
-	void setInv(int id1, int id2);
+	void addItem(uint16 id);
+	void removeItem(uint16 id);
+	void transformItem(uint16 oldItem, uint16 newItem);
+
+private:
+	void reshow();
+
+	void nextPage();
+	void prevPage();
+
+	void addItemObjects();
+	void removeObjects(bool removePoloska);
 
 public:
-	Common::Array<int> _items;
+	Common::Array<uint16> _items;
 	Common::Point _itemsLocation[6];
 	uint _clickedObjIndex;
-	int _itemIndex;
+	uint _itemIndex;
 };
 
 } // End of namespace Petka




More information about the Scummvm-git-logs mailing list