[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