[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