[Scummvm-git-logs] scummvm master -> f7dc4223688e9961b034d9ef5995316901408e77
whiterandrek
whiterandrek at gmail.com
Sun Oct 4 14:52:56 UTC 2020
This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
301bd3e115 PETKA: optimize drawing
46e2f7a669 PETKA: fix dialog handlers when object is used
f7dc422368 PETKA: save heroes positions in savefile
Commit: 301bd3e1154d22411cd7c61ce5542335f356fbfd
https://github.com/scummvm/scummvm/commit/301bd3e1154d22411cd7c61ce5542335f356fbfd
Author: Andrei Prykhodko (whiterandrek at gmail.com)
Date: 2020-10-04T17:51:34+03:00
Commit Message:
PETKA: optimize drawing
Changed paths:
engines/petka/flc.cpp
engines/petka/flc.h
engines/petka/objects/object.cpp
engines/petka/objects/object_bg.cpp
engines/petka/objects/object_case.cpp
engines/petka/video.cpp
engines/petka/video.h
diff --git a/engines/petka/flc.cpp b/engines/petka/flc.cpp
index 657cb906c9..02b457e0a2 100644
--- a/engines/petka/flc.cpp
+++ b/engines/petka/flc.cpp
@@ -74,14 +74,6 @@ const Common::Rect &FlicDecoder::getBounds() const {
return *(new Common::Rect(0, 0));
}
-Common::Point FlicDecoder::getPos() const {
- const Track *track = getTrack(0);
- if (track)
- return ((const FlicVideoTrack *)track)->getPos();
-
- return Common::Point(0, 0);
-}
-
const Common::Array<Common::Rect> &FlicDecoder::getMskRects() const {
const Track *track = getTrack(0);
if (track)
@@ -166,25 +158,6 @@ bool FlicDecoder::FlicVideoTrack::loadMsk(Common::SeekableReadStream &stream) {
_bounds.right++;
_bounds.bottom++;
- _pos.x = 0;
- _pos.y = 0;
-
- if (_frameCount == 1 && _surface->w > 630 && _surface->h > 470 && (_bounds.width() < 620 || _bounds.height() < 460)) {
- Graphics::Surface *s = new Graphics::Surface();
- s->create(_bounds.width(), _bounds.height(), g_system->getScreenFormat());
-
- _surface->convertToInPlace(s->format, _palette);
- s->copyRectToSurface(*_surface, 0, 0, _bounds);
-
- _surface->free();
- delete _surface;
-
- _pos.x = _bounds.left;
- _pos.y = _bounds.top;
-
- _surface = s;
- }
-
return true;
}
@@ -205,8 +178,4 @@ uint FlicDecoder::FlicVideoTrack::getDelay() const {
return _frameDelay;
}
-Common::Point FlicDecoder::FlicVideoTrack::getPos() const {
- return _pos;
-}
-
} // End of namespace Petka
diff --git a/engines/petka/flc.h b/engines/petka/flc.h
index feffe542a6..17b88c6492 100644
--- a/engines/petka/flc.h
+++ b/engines/petka/flc.h
@@ -35,7 +35,6 @@ public:
uint getDelay() const;
const Common::Rect &getBounds() const;
- Common::Point getPos() const;
const Common::Array<Common::Rect> &getMskRects() const;
const Graphics::Surface *getCurrentFrame() const;
uint32 getTransColor(const Graphics::PixelFormat &fmt) const;
@@ -49,13 +48,11 @@ protected:
uint getDelay() const;
const Common::Rect &getBounds() const;
- Common::Point getPos() const;
const Common::Array<Common::Rect> &getMskRects() const;
const Graphics::Surface *getSurface() const;
private:
Common::Rect _bounds;
- Common::Point _pos;
Common::Array<Common::Array<Common::Rect> > _msk;
};
};
diff --git a/engines/petka/objects/object.cpp b/engines/petka/objects/object.cpp
index 561b48f48d..aa355e7f14 100644
--- a/engines/petka/objects/object.cpp
+++ b/engines/petka/objects/object.cpp
@@ -428,13 +428,13 @@ bool QObject::isInPoint(Common::Point p) {
return false;
const Graphics::Surface *s = flc->getCurrentFrame();
if (s->format.bytesPerPixel == 1) {
- byte index = *(const byte *) flc->getCurrentFrame()->getBasePtr(p.x - _x - flc->getPos().x,
- p.y - _y - flc->getPos().y);
+ byte index = *(const byte *) flc->getCurrentFrame()->getBasePtr(p.x - _x,
+ p.y - _y);
const byte *pal = flc->getPalette();
return (pal[0] != pal[index * 3] || pal[1] != pal[index * 3 + 1] || pal[2] != pal[index * 3 + 2]);
}
if (s->format.bytesPerPixel == 2)
- return *(const uint16*)flc->getCurrentFrame()->getBasePtr(p.x - _x - flc->getPos().x, p.y - _y - flc->getPos().y) != flc->getTransColor(s->format);
+ return *(const uint16*)flc->getCurrentFrame()->getBasePtr(p.x - _x, p.y - _y) != flc->getTransColor(s->format);
}
return false;
}
@@ -457,31 +457,39 @@ void QObject::draw() {
_startSound = false;
}
- QSystem *sys = g_vm->getQSystem();
- Common::Rect screen(640 + sys->_xOffset, 480);
- Common::Rect dest(flc->getBounds());
- dest.translate(_x, _y);
+ int xOff = g_vm->getQSystem()->_xOffset;
+ VideoSystem *videoSys = g_vm->videoSystem();
+
+ Common::Rect screen(640 + xOff, 480);
+ Common::Rect flcBounds(flc->getBounds());
+ Common::Rect objBounds(flcBounds);
+
+ objBounds.translate(_x, _y);
- Common::Rect intersect(screen.findIntersectingRect(dest));
+ Common::Rect intersect(screen.findIntersectingRect(objBounds));
if (intersect.isEmpty())
return;
- const Graphics::Surface *frame = flc->getCurrentFrame();
- Graphics::Surface *s = frame->convertTo(g_system->getScreenFormat(), flc->getPalette());
- const Common::List<Common::Rect> &dirtyRects = g_vm->videoSystem()->rects();
- for (Common::List<Common::Rect>::const_iterator it = dirtyRects.begin(); it != dirtyRects.end(); ++it) {
- Common::Rect dirty = *it;
- dirty.translate(sys->_xOffset, 0);
+ Graphics::Surface *surface = flc->getCurrentFrame()->getSubArea(flcBounds).convertTo(g_system->getScreenFormat(), flc->getPalette());
+
+ for (Common::Rect dirty : videoSys->rects()) {
+ dirty.translate(xOff, 0);
+
Common::Rect destRect(intersect.findIntersectingRect(dirty));
if (destRect.isEmpty())
continue;
+
Common::Rect srcRect(destRect);
- srcRect.translate(-_x - flc->getPos().x, -_y - flc->getPos().y);
- destRect.translate(-sys->_xOffset, 0);
- g_vm->videoSystem()->transBlitFrom(*s, srcRect, destRect, flc->getTransColor(s->format));
+
+ srcRect.translate(-_x, -_y);
+ srcRect.translate(-flcBounds.left, -flcBounds.top);
+
+ destRect.translate(-xOff, 0);
+ videoSys->transBlitFrom(*surface, srcRect, destRect, flc->getTransColor(surface->format));
}
- s->free();
- delete s;
+
+ surface->free();
+ delete surface;
}
void QObject::updateZ() {
@@ -490,7 +498,7 @@ void QObject::updateZ() {
FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
if (flc) {
_z = 1;
- const Common::Array<Common::Rect> rects = flc->getMskRects();
+ const Common::Array<Common::Rect> &rects = flc->getMskRects();
for (uint i = 0; i < rects.size(); ++i) {
if (_y + rects[i].bottom > _z)
_z = _y + rects[i].bottom;
diff --git a/engines/petka/objects/object_bg.cpp b/engines/petka/objects/object_bg.cpp
index c9b55456be..19ceff333a 100644
--- a/engines/petka/objects/object_bg.cpp
+++ b/engines/petka/objects/object_bg.cpp
@@ -89,10 +89,10 @@ void QObjectBG::draw() {
Graphics::Surface *s = g_vm->resMgr()->loadBitmap(_resourceId);
if (!s)
return;
- for (auto r : g_vm->videoSystem()->rects()) {
- Common::Rect srcRect = r;
- srcRect.translate(g_vm->getQSystem()->_xOffset, 0);
- g_vm->videoSystem()->blitFrom(*s, srcRect, Common::Point(r.left, r.top));
+ int xOffset = g_vm->getQSystem()->_xOffset;
+ for (auto rect : g_vm->videoSystem()->rects()) {
+ rect.translate(xOffset, 0);
+ g_vm->videoSystem()->blitFrom(*s, rect, Common::Point(rect.left - xOffset, rect.top));
}
}
diff --git a/engines/petka/objects/object_case.cpp b/engines/petka/objects/object_case.cpp
index b15d3aae66..51e45bf01d 100644
--- a/engines/petka/objects/object_case.cpp
+++ b/engines/petka/objects/object_case.cpp
@@ -111,7 +111,7 @@ void QObjectCase::draw() {
for (uint i = 0; i < mskRects.size(); ++i) {
Common::Rect destRect = mskRects[i].findIntersectingRect(*it);
Common::Rect srcRect = destRect;
- srcRect.translate(-flc->getPos().x - _x + sys->_xOffset, -flc->getPos().y - _y);
+ srcRect.translate(-_x + sys->_xOffset, -_y);
g_vm->videoSystem()->transBlitFrom(*s, srcRect, destRect, flc->getTransColor(s->format));
}
}
@@ -146,7 +146,7 @@ bool QObjectCase::isInPoint(Common::Point p) {
void QObjectCase::onMouseMove(Common::Point p) {
p.x -= _x;
FlicDecoder *flc = g_vm->resMgr()->loadFlic(kExitCaseResourceId);
- if (*(const byte *)flc->getCurrentFrame()->getBasePtr(p.x - flc->getPos().x, p.y - flc->getPos().y) != 0) {
+ if (*(const byte *)flc->getCurrentFrame()->getBasePtr(p.x, p.y) != 0) {
if (_clickedObjIndex != kCloseButton && _clickedObjIndex != kInvalidButton) {
flc = g_vm->resMgr()->loadFlic(kFirstButtonResourceId + _clickedObjIndex);
flc->setFrame(1);
@@ -290,4 +290,4 @@ void QObjectCase::reshow() {
}
}
-}
+} // End of namespace Petka
diff --git a/engines/petka/video.cpp b/engines/petka/video.cpp
index 14669bb55c..8ade8f7cb2 100644
--- a/engines/petka/video.cpp
+++ b/engines/petka/video.cpp
@@ -62,8 +62,8 @@ void VideoSystem::update() {
xOff = MAX<int>(xOff, reqOffset);
}
sys->_xOffset = CLIP(xOff, 0, sys->_sceneWidth - 640);
+ makeAllDirty();
}
- makeAllDirty();
}
@@ -76,7 +76,6 @@ void VideoSystem::update() {
}
sort();
-
mergeDirtyRects();
_allowAddingRects = false;
@@ -135,7 +134,7 @@ void VideoSystem::addDirtyMskRects(FlicDecoder &flc) {
addDirtyMskRects(Common::Point(0, 0), flc);
}
-const Common::List<Common::Rect> VideoSystem::rects() const {
+const Common::List<Common::Rect> &VideoSystem::rects() const {
return _dirtyRects;
}
diff --git a/engines/petka/video.h b/engines/petka/video.h
index 5e3b2afc8a..b12f7aa6a2 100644
--- a/engines/petka/video.h
+++ b/engines/petka/video.h
@@ -47,7 +47,7 @@ public:
void setShake(bool shake);
- const Common::List<Common::Rect> rects() const;
+ const Common::List<Common::Rect> &rects() const;
private:
void sort();
Commit: 46e2f7a6690706a249d95e77f54a938d5417fc62
https://github.com/scummvm/scummvm/commit/46e2f7a6690706a249d95e77f54a938d5417fc62
Author: Andrei Prykhodko (whiterandrek at gmail.com)
Date: 2020-10-04T17:51:34+03:00
Commit Message:
PETKA: fix dialog handlers when object is used
Changed paths:
engines/petka/big_dialogue.cpp
engines/petka/big_dialogue.h
engines/petka/objects/object.cpp
diff --git a/engines/petka/big_dialogue.cpp b/engines/petka/big_dialogue.cpp
index 9c35c73835..df2d97eec3 100644
--- a/engines/petka/big_dialogue.cpp
+++ b/engines/petka/big_dialogue.cpp
@@ -52,8 +52,7 @@ BigDialogue::BigDialogue(PetkaEngine &vm)
}
for (uint i = 0; i < _objDialogs.size(); ++i) {
for (uint j = 0; j < _objDialogs[i].handlers.size(); ++j) {
- _objDialogs[i].handlers[j].opcode = file->readUint16LE();
- _objDialogs[i].handlers[j].objId = file->readUint16LE();
+ _objDialogs[i].handlers[j].opcode = file->readUint32LE();
_objDialogs[i].handlers[j].dialogs.resize(file->readUint32LE());
_objDialogs[i].handlers[j].startDialogIndex = file->readUint32LE();
file->skip(4); // pointer
@@ -151,22 +150,25 @@ const DialogHandler *BigDialogue::findHandler(uint objId, uint opcode, bool *fal
*fallback = false;
}
for (uint i = 0; i < _objDialogs.size(); ++i) {
- if (_objDialogs[i].objId == objId) {
- for (uint j = 0; j < _objDialogs[i].handlers.size(); ++j) {
- if (_objDialogs[i].handlers[j].opcode == opcode) {
- return &_objDialogs[i].handlers[j];
- }
- }
- if (opcode != kObjectUse) {
- continue;
+ if (_objDialogs[i].objId != objId) {
+ continue;
+ }
+
+ for (uint j = 0; j < _objDialogs[i].handlers.size(); ++j) {
+ if (_objDialogs[i].handlers[j].opcode == opcode) {
+ return &_objDialogs[i].handlers[j];
}
- for (uint j = 0; j < _objDialogs[i].handlers.size(); ++j) {
- if (_objDialogs[i].handlers[j].opcode == kFallback) {
- if (fallback)
- *fallback = true;
- return &_objDialogs[i].handlers[j];
- }
+ }
+
+ if ((uint16)opcode != kObjectUse) {
+ continue;
+ }
+ for (uint j = 0; j < _objDialogs[i].handlers.size(); ++j) {
+ if (_objDialogs[i].handlers[j].opcode == kFallback) {
+ if (fallback)
+ *fallback = true;
+ return &_objDialogs[i].handlers[j];
}
}
}
diff --git a/engines/petka/big_dialogue.h b/engines/petka/big_dialogue.h
index 83e1970861..2e090930e8 100644
--- a/engines/petka/big_dialogue.h
+++ b/engines/petka/big_dialogue.h
@@ -87,8 +87,7 @@ struct Dialog {
};
struct DialogHandler {
- uint16 opcode;
- uint16 objId;
+ uint32 opcode;
uint32 startDialogIndex;
Common::Array<Dialog> dialogs;
};
diff --git a/engines/petka/objects/object.cpp b/engines/petka/objects/object.cpp
index aa355e7f14..cdb72cf999 100644
--- a/engines/petka/objects/object.cpp
+++ b/engines/petka/objects/object.cpp
@@ -70,6 +70,7 @@ QMessageObject::QMessageObject() {
void QMessageObject::processMessage(const QMessage &msg) {
bool reacted = false;
+ int opcode = (msg.opcode == kObjectUse) ? (msg.sender->_id << 16) | kObjectUse : msg.opcode;
for (uint i = 0; i < _reactions.size(); ++i) {
QReaction *r = &_reactions[i];
if (r->opcode != msg.opcode ||
@@ -78,15 +79,15 @@ void QMessageObject::processMessage(const QMessage &msg) {
continue;
}
bool fallback;
- if (g_vm->getBigDialogue()->findHandler(_id, msg.opcode, &fallback) && !fallback) {
- g_vm->getBigDialogue()->setHandler(_id, msg.opcode);
+ if (g_vm->getBigDialogue()->findHandler(_id, opcode, &fallback) && !fallback) {
+ g_vm->getBigDialogue()->setHandler(_id, opcode);
g_vm->getQSystem()->_mainInterface->_dialog.setSender(this);
}
processReaction(r, &msg);
reacted = true;
}
- if (reacted || !g_vm->getBigDialogue()->findHandler(_id, msg.opcode, nullptr)) {
+ if (reacted || !g_vm->getBigDialogue()->findHandler(_id, opcode, nullptr)) {
switch (msg.opcode) {
case kAddInv:
g_vm->getQSystem()->getCase()->addItem(msg.objId);
@@ -267,7 +268,7 @@ void QMessageObject::processMessage(const QMessage &msg) {
}
g_vm->getQSystem()->_mainInterface->_dialog.setReaction(createReaction(r.messages.data(), r.messages.end()));
}
- g_vm->getBigDialogue()->setHandler(_id, msg.opcode);
+ g_vm->getBigDialogue()->setHandler(_id, opcode);
g_vm->getQSystem()->_mainInterface->_dialog.start(msg.arg1, this);
}
Commit: f7dc4223688e9961b034d9ef5995316901408e77
https://github.com/scummvm/scummvm/commit/f7dc4223688e9961b034d9ef5995316901408e77
Author: Andrei Prykhodko (whiterandrek at gmail.com)
Date: 2020-10-04T17:51:34+03:00
Commit Message:
PETKA: save heroes positions in savefile
Changed paths:
engines/petka/q_system.cpp
engines/petka/saveload.cpp
diff --git a/engines/petka/q_system.cpp b/engines/petka/q_system.cpp
index 0c8bdf88af..70787caa28 100644
--- a/engines/petka/q_system.cpp
+++ b/engines/petka/q_system.cpp
@@ -38,6 +38,8 @@
#include "petka/big_dialogue.h"
#include "petka/q_system.h"
#include "petka/video.h"
+#include "petka/q_manager.h"
+#include "petka/flc.h"
namespace Petka {
@@ -215,7 +217,7 @@ void QSystem::load(Common::ReadStream *s) {
obj->_holdMessages = s->readUint32LE();
obj->_status = s->readUint32LE();
obj->_resourceId = s->readUint32LE();
- obj->_z = s->readUint32LE();
+ /*obj->_z =*/ s->readUint32LE();
obj->_x = s->readUint32LE();
obj->_y = s->readUint32LE();
obj->_isShown = s->readUint32LE();
@@ -235,6 +237,22 @@ void QSystem::load(Common::ReadStream *s) {
_mainInterface->loadRoom(_room->_id, true);
}
+ QObjectPetka *petka = getPetka();
+ QObjectChapayev *chapayev = getChapay();
+
+ Common::Point pos;
+ pos.x = s->readSint32LE();
+ pos.y = s->readSint32LE();
+
+ petka->setPos(pos, false);
+
+ _xOffset = CLIP<int>(pos.x - 320, 0, _sceneWidth - 640);
+
+ pos.x = s->readSint32LE();
+ pos.y = s->readSint32LE();
+
+ chapayev->setPos(pos, false);
+
_vm.getBigDialogue()->load(s);
QObjectCursor *cursor = getCursor();
@@ -247,6 +265,18 @@ void QSystem::load(Common::ReadStream *s) {
cursor->_invObj = nullptr;
}
+ int imageId = s->readSint32LE();
+ if (imageId != -1 && !(imageId % 100)) {
+ addMessage(petka->_id, kImage, imageId, 1);
+ }
+
+ imageId = s->readSint32LE();
+ if (imageId != -1 && !(imageId % 100)) {
+ addMessage(chapayev->_id, kImage, imageId, 1);
+ }
+
+ getStar()->_isActive = true;
+
_vm.videoSystem()->makeAllDirty();
}
@@ -273,7 +303,17 @@ void QSystem::save(Common::WriteStream *s) {
writeString(s, _room->_name);
- // heroes (no impl)
+ QObjectPetka *petka = getPetka();
+ QObjectChapayev *chapayev = getChapay();
+
+ FlicDecoder *petkaFlc = _vm.resMgr()->loadFlic(petka->_resourceId);
+ FlicDecoder *chapayFlc = _vm.resMgr()->loadFlic(chapayev->_resourceId);
+
+ s->writeSint32LE(petka->_x - petkaFlc->getCurrentFrame()->w * petka->_k * -0.5);
+ s->writeSint32LE(petka->_y + petkaFlc->getCurrentFrame()->h * petka->_k);
+
+ s->writeSint32LE(chapayev->_x - chapayFlc->getCurrentFrame()->w * chapayev->_k * -0.5);
+ s->writeSint32LE(chapayev->_y + chapayFlc->getCurrentFrame()->h * chapayev->_k);
_vm.getBigDialogue()->save(s);
@@ -281,10 +321,13 @@ void QSystem::save(Common::WriteStream *s) {
s->writeUint32LE(cursor->_resourceId);
s->writeUint32LE(cursor->_actionType);
if (cursor->_invObj) {
- s->writeSint32LE(cursor->_invObj->_resourceId);
+ s->writeSint32LE(cursor->_invObj->_id);
} else {
s->writeSint32LE(-1);
}
+
+ s->writeSint32LE(petka->_imageId);
+ s->writeSint32LE(chapayev->_imageId);
}
QObjectPetka *QSystem::getPetka() const {
diff --git a/engines/petka/saveload.cpp b/engines/petka/saveload.cpp
index c662833e78..242a12ee61 100644
--- a/engines/petka/saveload.cpp
+++ b/engines/petka/saveload.cpp
@@ -47,6 +47,7 @@ Common::Error PetkaEngine::loadGameState(int slot) {
_nextPart = in->readUint32LE();
_chapter = in->readUint32LE();
if (_nextPart == _part) {
+ loadChapter(_chapter);
_qsystem->load(in);
} else {
_shouldChangePart = true;
More information about the Scummvm-git-logs
mailing list