[Scummvm-git-logs] scummvm master -> 0ca3d76f9cd39a302c9e5cbca7a3f4dc80ca2b0c

bluegr bluegr at gmail.com
Sun May 30 14:37:44 UTC 2021


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

Summary:
de70a494cb TRECISION: Const correctness
bd64803269 TRECISION: Fix regression with closeup exits
24f3f4ff75 TRECISION: Use Common::Point for text placement
4efb1d7f44 TRECISION: Add some sanity checks to GraphicsManager. Some cleanup
ffcdb3f58d TRECISION: Simplify dissolve()
b117194994 TRECISION: Disable dissolve() for now, as it writes OOB
ef803f8768 TRECISION: Split doMouseLeftRight() into smaller functions
0ca3d76f9c TRECISION: Replace _flagCharacterExists with _flagShowCharacter


Commit: de70a494cb96224732a09e2e8bef5d5b8edec20b
    https://github.com/scummvm/scummvm/commit/de70a494cb96224732a09e2e8bef5d5b8edec20b
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2021-05-30T17:37:16+03:00

Commit Message:
TRECISION: Const correctness

Changed paths:
    engines/trecision/script.cpp


diff --git a/engines/trecision/script.cpp b/engines/trecision/script.cpp
index 6e53d95202..e07ff5cce9 100644
--- a/engines/trecision/script.cpp
+++ b/engines/trecision/script.cpp
@@ -595,16 +595,16 @@ void TrecisionEngine::doInvOperate() {
 	if (!_curInventory)
 		warning("doInvOperate - _curInventory not set properly");
 
-	bool printSentence = _logicMgr->operateInventory();
+	const bool printSentence = _logicMgr->operateInventory();
 	if (_inventoryObj[_curInventory]._action && printSentence)
 		_textMgr->characterSay(_inventoryObj[_curInventory]._action);
 }
 
 void TrecisionEngine::doScript() {
 	Message *message = _curMessage;
-	uint16 index = message->_u16Param1;
-	uint16 index2 = message->_u16Param2;
-	uint32 value = message->_u32Param;
+	const uint16 index = message->_u16Param1;
+	const uint16 index2 = message->_u16Param2;
+	const uint32 value = message->_u32Param;
 
 	switch (message->_event) {
 	case ME_CHANGER:


Commit: bd648032697782b26d2638633392698f416bc606
    https://github.com/scummvm/scummvm/commit/bd648032697782b26d2638633392698f416bc606
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2021-05-30T17:37:16+03:00

Commit Message:
TRECISION: Fix regression with closeup exits

Changed paths:
    engines/trecision/defines.h
    engines/trecision/logic.cpp


diff --git a/engines/trecision/defines.h b/engines/trecision/defines.h
index d2c8a401ab..047ef68e74 100644
--- a/engines/trecision/defines.h
+++ b/engines/trecision/defines.h
@@ -669,7 +669,7 @@ enum RoomId {
 #define oSCRIVANIA2B			419
 #define oPORTALAMPADE2B			420
 #define omLAMPADINA2B			421
-#define oEXIT2BL				422
+#define oEXIT2BL				422	// Exit from Egyptology book
 #define oUEPOIS					423
 #define oHATOR					424
 #define oNUT					425
@@ -973,7 +973,7 @@ enum RoomId {
 #define oSCATOLONE36			723
 #define omCARTACCE36			724
 #define omSCATOLONEA36			725
-#define oEXIT36F				726
+#define oEXIT36F				726	// Exit from security system sequence
 #define oSIMON37				727
 #define oSPORTELLOA37			728
 #define oSPORTELLOI37			729
@@ -1436,7 +1436,7 @@ enum RoomId {
 #define omWINDOW5A	        1200
 #define oPIANTE5A		        1201
 #define oEXIT58T		        1202
-#define oEXIT41D				1203
+#define oEXIT41D				1203	// Exit from positioner
 #define oPULSANTECD				1205
 #define oPULSANTE1AD			1247
 #define oPULSANTE33AD			1279
diff --git a/engines/trecision/logic.cpp b/engines/trecision/logic.cpp
index 2f496d1f36..92475b2470 100644
--- a/engines/trecision/logic.cpp
+++ b/engines/trecision/logic.cpp
@@ -3505,16 +3505,16 @@ bool LogicManager::operateInventory() {
 		break;
 
 	case kItemEgyptologyBook:
-		_vm->changeRoom(kRoom2BL);
 		_vm->_obj[oEXIT2BL]._goRoom = _vm->_curRoom;
+		_vm->changeRoom(kRoom2BL);
 		_vm->_actor->actorStop();
 		_vm->_pathFind->nextStep();
 		printSentence = false;
 		break;
 
 	case kItemSecuritySystemSequence:
-		_vm->changeRoom(kRoom36F);
 		_vm->_obj[oEXIT36F]._goRoom = _vm->_curRoom;
+		_vm->changeRoom(kRoom36F);
 		_vm->_actor->actorStop();
 		_vm->_pathFind->nextStep();
 		printSentence = false;
@@ -3523,8 +3523,8 @@ bool LogicManager::operateInventory() {
 	case kItemPositioner:
 		for (int a = oROOM41; a <= oROOM45B; ++a)
 			_vm->setObjectVisible(a, false);
-		_vm->changeRoom(kRoom41D);
 		_vm->_obj[oEXIT41D]._goRoom = _vm->_curRoom;
+		_vm->changeRoom(kRoom41D);
 		_vm->_inventoryObj[kItemPositioner].setFlagExtra(false);
 		_vm->_actor->actorStop();
 		_vm->_pathFind->nextStep();
@@ -3845,8 +3845,8 @@ void LogicManager::doSystemChangeRoom(uint16 room) {
 	_vm->_curRoom = room;
 	_vm->_scheduler->resetQueues();
 
-	_vm->closeInventoryImmediately();
 	_vm->clearUseWith();
+	_vm->closeInventoryImmediately();
 
 	_vm->_flagCharacterExists = true;
 	_vm->_flagShowCharacter = true;


Commit: 24f3f4ff75d3239dd713d86f2b4e3ca5cb1dcdc4
    https://github.com/scummvm/scummvm/commit/24f3f4ff75d3239dd713d86f2b4e3ca5cb1dcdc4
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2021-05-30T17:37:16+03:00

Commit Message:
TRECISION: Use Common::Point for text placement

Changed paths:
    engines/trecision/inventory.cpp
    engines/trecision/text.cpp
    engines/trecision/text.h


diff --git a/engines/trecision/inventory.cpp b/engines/trecision/inventory.cpp
index 6842304c7a..a3888845af 100644
--- a/engines/trecision/inventory.cpp
+++ b/engines/trecision/inventory.cpp
@@ -241,13 +241,12 @@ void TrecisionEngine::showInventoryName(uint16 obj, bool showhide) {
 		}
 
 		const uint16 lenText = textLength(desc);
-		const uint16 posX = CLIP(320 - (lenText / 2), 2, MAXX - 2 - lenText);
-		const uint16 posY = MAXY - CARHEI;
+		Common::Point pos(CLIP(320 - (lenText / 2), 2, MAXX - 2 - lenText), MAXY - CARHEI);
 
 		_lastInv = (obj | 0x8000);
 		if (_lastInv)
 			_textMgr->clearLastText();
-		_textMgr->addText(posX, posY, desc.c_str(), COLOR_INVENTORY, MASKCOL);
+		_textMgr->addText(pos, desc.c_str(), COLOR_INVENTORY, MASKCOL);
 	} else {
 		if (obj == _lastInv)
 			return;
@@ -261,7 +260,7 @@ void TrecisionEngine::showInventoryName(uint16 obj, bool showhide) {
 		const uint16 lenText = textLength(_objName[_inventoryObj[obj]._name]);
 		uint16 posX = ICONMARGSX + ((iconPos(_curInventory) - _iconBase) * (ICONDX)) + ICONDX / 2;
 		posX = CLIP(posX - (lenText / 2), 2, MAXX - 2 - lenText);
-		const uint16 posY = MAXY - CARHEI;
+		Common::Point pos(posX, MAXY - CARHEI);
 		
 		_lastInv = obj;
 
@@ -269,7 +268,7 @@ void TrecisionEngine::showInventoryName(uint16 obj, bool showhide) {
 			_textMgr->clearLastText();
 
 		if (_inventoryObj[obj]._name)
-			_textMgr->addText(posX, posY, _objName[_inventoryObj[obj]._name], COLOR_INVENTORY, MASKCOL);
+			_textMgr->addText(pos, _objName[_inventoryObj[obj]._name], COLOR_INVENTORY, MASKCOL);
 	}
 }
 
diff --git a/engines/trecision/text.cpp b/engines/trecision/text.cpp
index aa23a692ab..1aaff5d768 100644
--- a/engines/trecision/text.cpp
+++ b/engines/trecision/text.cpp
@@ -52,8 +52,10 @@ TextManager::TextManager(TrecisionEngine *vm) : _vm(vm) {
 TextManager::~TextManager() {
 }
 
-void TextManager::positionString(uint16 x, uint16 y, const char *string, uint16 *posx, uint16 *posy, bool characterFl) {
+Common::Point TextManager::positionString(uint16 x, uint16 y, const char *string, bool characterFl) {
 	uint16 lenText = _vm->textLength(string);
+	Common::Point pos;
+
 	if (lenText > 960)
 		lenText = (lenText * 2 / 5);
 	else if (lenText > 320)
@@ -64,12 +66,14 @@ void TextManager::positionString(uint16 x, uint16 y, const char *string, uint16
 	else
 		x = 0;
 
-	*posx = CLIP<uint16>(x, 5, MAXX - lenText - 5);
+	pos.x = CLIP<uint16>(x, 5, MAXX - lenText - 5);
+
+	pos.y = characterFl ? 0 : VIDEOTOP;
+	pos.y += y - 1; //15
+	if (pos.y <= VIDEOTOP)
+		pos.y = VIDEOTOP + 1;
 
-	*posy = characterFl ? 0 : VIDEOTOP;
-	*posy += y - 1; //15
-	if (*posy <= VIDEOTOP)
-		*posy = VIDEOTOP + 1;
+	return pos;
 }
 
 void TextManager::formattingSuperString() {
@@ -124,21 +128,21 @@ void TextManager::characterTalk(const char *s) {
 }
 
 void TextManager::characterContinueTalk() {
-	uint16 posx, posy;
+	Common::Point pos;
 
 	_vm->_flagSkipTalk = false;
 	_vm->_characterSpeakTime = _vm->_curTime;
 
 	_subStringAgain = (_curSubString < (_subStringUsed - 1));
 
-	if (_vm->_flagCharacterExists)
-		positionString(_vm->_actor->_lim[0], _vm->_actor->_lim[2], _subString[_curSubString], &posx, &posy, true);
+	if (_vm->_flagShowCharacter || _vm->_animMgr->_playingAnims[kSmackerAction])
+		pos = positionString(_vm->_actor->_lim[0], _vm->_actor->_lim[2], _subString[_curSubString], true);
 	else
-		positionString(MAXX / 2, 30, _subString[_curSubString], &posx, &posy, false);
+		pos = positionString(MAXX / 2, 30, _subString[_curSubString], false);
 
 	clearLastText();
 	if (ConfMan.getBool("subtitles"))
-		addText(posx, posy, _subString[_curSubString], COLOR_OBJECT, MASKCOL);
+		addText(pos, _subString[_curSubString], COLOR_OBJECT, MASKCOL);
 
 	if (!_vm->_flagDialogActive) {
 		if (_curSubString)
@@ -179,15 +183,15 @@ void TextManager::someoneContinueTalk() {
 
 	_subStringAgain = (_curSubString < (_subStringUsed - 1));
 
-	uint16 posx, posy;
+	Common::Point pos;
 	if (_talkingPersonId)
-		positionString(_vm->_obj[_talkingPersonId]._lim.left, _vm->_obj[_talkingPersonId]._lim.top, _subString[_curSubString], &posx, &posy, false);
+		pos = positionString(_vm->_obj[_talkingPersonId]._lim.left, _vm->_obj[_talkingPersonId]._lim.top, _subString[_curSubString], false);
 	else
-		positionString(_vm->_actor->_lim[0], _vm->_actor->_lim[2], _subString[_curSubString], &posx, &posy, true);
+		pos = positionString(_vm->_actor->_lim[0], _vm->_actor->_lim[2], _subString[_curSubString], true);
 
 	clearLastText();
 	if (ConfMan.getBool("subtitles"))
-		addText(posx, posy, _subString[_curSubString], HYELLOW, MASKCOL);
+		addText(pos, _subString[_curSubString], HYELLOW, MASKCOL);
 
 	if (_curSubString)
 		_lastFilename = Common::String::format("s%04d%c.wav", _curSentenceId, _curSubString + 'a');
@@ -291,12 +295,11 @@ void TextManager::showObjName(uint16 obj, bool show) {
 
 		_vm->_lastObj = (obj | 0x8000);
 		const uint16 lenText = _vm->textLength(desc);
-		const uint16 posx = CLIP(320 - (lenText / 2), 2, MAXX - 2 - lenText);
-		const uint16 posy = MAXY - CARHEI;
+		const Common::Point pos(CLIP(320 - (lenText / 2), 2, MAXX - 2 - lenText), MAXY - CARHEI);
 
 		if (_vm->_lastObj)
 			clearLastText();
-		addText(posx, posy, desc.c_str(), COLOR_INVENTORY, MASKCOL);
+		addText(pos, desc.c_str(), COLOR_INVENTORY, MASKCOL);
 	} else {
 		if (!obj || !show) {
 			clearLastText();
@@ -320,14 +323,14 @@ void TextManager::showObjName(uint16 obj, bool show) {
 		else
 			desc = _vm->_objName[_vm->_obj[obj]._name];
 
-		uint16 posx = (_vm->_obj[obj]._lim.left + _vm->_obj[obj]._lim.right) / 2;
-		uint16 posy = (obj == oWHEELS2C) ? 187 : _vm->_obj[obj]._lim.top;
+		const uint16 x = (_vm->_obj[obj]._lim.left + _vm->_obj[obj]._lim.right) / 2;
+		const uint16 y = (obj == oWHEELS2C) ? 187 : _vm->_obj[obj]._lim.top;
+		Common::Point pos = positionString(x, y, desc.c_str(), false);
 
-		positionString(posx, posy, desc.c_str(), &posx, &posy, false);
 		if (_vm->_lastObj)
 			clearLastText();
 		_vm->_lastObj = obj;
-		addText(posx, posy, desc.c_str(), COLOR_OBJECT, MASKCOL);
+		addText(pos, desc.c_str(), COLOR_OBJECT, MASKCOL);
 	}
 }
 
@@ -374,10 +377,10 @@ void TextManager::characterSayInAction(uint16 ss) {
 	characterContinueTalk();
 }
 
-void TextManager::addText(uint16 x, uint16 y, const char *text, uint16 textCol, uint16 shadowCol) {
+void TextManager::addText(Common::Point pos, const char *text, uint16 textCol, uint16 shadowCol) {
 	StackText t;
-	t._x = x;
-	t._y = y;
+	t._x = pos.x;
+	t._y = pos.y;
 	t._textCol = textCol;
 	t._shadowCol = shadowCol;
 	t._clear = false;
diff --git a/engines/trecision/text.h b/engines/trecision/text.h
index ed6ae574b4..f81a76a7aa 100644
--- a/engines/trecision/text.h
+++ b/engines/trecision/text.h
@@ -60,7 +60,7 @@ class TextManager {
 
 	Common::List<StackText> _textStack;
 
-	void positionString(uint16 x, uint16 y, const char *string, uint16 *posx, uint16 *posy, bool characterFl);
+	Common::Point positionString(uint16 x, uint16 y, const char *string, bool characterFl);
 	void formattingSuperString();
 	void formattingOneString();
 	void characterTalk(const char *s);
@@ -79,7 +79,7 @@ public:
 	void characterSay(uint16 i);
 	void characterSayInAction(uint16 ss);
 
-	void addText(uint16 x, uint16 y, const char *text, uint16 textCol, uint16 shadowCol);
+	void addText(Common::Point pos, const char *text, uint16 textCol, uint16 shadowCol);
 	void clearLastText();
 	void drawText(StackText text);
 	void clearText();


Commit: 4efb1d7f44577068400db93255b1a374c0dcc9c4
    https://github.com/scummvm/scummvm/commit/4efb1d7f44577068400db93255b1a374c0dcc9c4
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2021-05-30T17:37:17+03:00

Commit Message:
TRECISION: Add some sanity checks to GraphicsManager. Some cleanup

Changed paths:
    engines/trecision/graphics.cpp


diff --git a/engines/trecision/graphics.cpp b/engines/trecision/graphics.cpp
index 38fb0b2ffa..6adbda9465 100644
--- a/engines/trecision/graphics.cpp
+++ b/engines/trecision/graphics.cpp
@@ -118,7 +118,7 @@ void GraphicsManager::drawObj() {
 	if (_drawMask && _drawObjIndex >= 0) {
 		uint8 *mask = _vm->_maskPointers[_drawObjIndex];
 
-		for (uint16 b = _drawRect.top; b < _drawRect.bottom; ++b) {
+		for (uint16 y = _drawRect.top; y < _drawRect.bottom; ++y) {
 			uint16 sco = 0;
 			uint16 c = 0;
 			while (sco < _drawRect.width()) {
@@ -130,18 +130,18 @@ void GraphicsManager::drawObj() {
 				} else { // copy
 					const uint16 maskOffset = *mask;
 
-					if (maskOffset != 0 && b >= _drawRect.top + _drawObjRect.top && b < _drawRect.top + _drawObjRect.bottom) {
+					if (maskOffset != 0 && y >= _drawRect.top + _drawObjRect.top && y < _drawRect.top + _drawObjRect.bottom) {
 						if (sco >= _drawObjRect.left && sco + maskOffset < _drawObjRect.right)
-							memcpy(_screenBuffer.getBasePtr(sco + _drawRect.left, b), buf, maskOffset * 2);
+							memcpy(_screenBuffer.getBasePtr(sco + _drawRect.left, y), buf, maskOffset * 2);
 
 						else if (sco < _drawObjRect.left && sco + maskOffset < _drawObjRect.right && sco + maskOffset >= _drawObjRect.left)
-							memcpy(_screenBuffer.getBasePtr(_drawObjRect.left + _drawRect.left, b), buf + _drawObjRect.left - sco, (maskOffset + sco - _drawObjRect.left) * 2);
+							memcpy(_screenBuffer.getBasePtr(_drawObjRect.left + _drawRect.left, y), buf + _drawObjRect.left - sco, (maskOffset + sco - _drawObjRect.left) * 2);
 
 						else if (sco >= _drawObjRect.left && sco + maskOffset >= _drawObjRect.right && sco < _drawObjRect.right)
-							memcpy(_screenBuffer.getBasePtr(sco + _drawRect.left, b), buf, (_drawObjRect.right - sco) * 2);
+							memcpy(_screenBuffer.getBasePtr(sco + _drawRect.left, y), buf, (_drawObjRect.right - sco) * 2);
 
 						else if (sco < _drawObjRect.left && sco + maskOffset >= _drawObjRect.right)
-							memcpy(_screenBuffer.getBasePtr(_drawObjRect.left + _drawRect.left, b), buf + _drawObjRect.left - sco, (_drawObjRect.right - _drawObjRect.left) * 2);
+							memcpy(_screenBuffer.getBasePtr(_drawObjRect.left + _drawRect.left, y), buf + _drawObjRect.left - sco, (_drawObjRect.right - _drawObjRect.left) * 2);
 					}
 					sco += *mask;
 					buf += *mask++;
@@ -150,15 +150,25 @@ void GraphicsManager::drawObj() {
 			}
 		}
 	} else {
-		for (uint16 b = _drawObjRect.top; b < _drawObjRect.bottom; ++b) {
-			memcpy(_screenBuffer.getBasePtr(_drawRect.left + _drawObjRect.left, _drawRect.top + b),
-				   buf + (b * _drawRect.width()) + _drawObjRect.left, _drawObjRect.width() * 2);
+		const uint16 x = _drawRect.left + _drawObjRect.left;
+
+		if (x + _drawObjRect.width() >= MAXX || _drawObjRect.top + _drawObjRect.height() >= MAXY) {
+			warning("drawObj: Invalid surface, skipping");
+			return;
+		}
+		
+		for (uint16 y = _drawObjRect.top; y < _drawObjRect.bottom; ++y) {
+			memcpy(_screenBuffer.getBasePtr(x, _drawRect.top + y),
+				   buf + (y * _drawRect.width()) + _drawObjRect.left, _drawObjRect.width() * 2);
 		}
 	}
 }
 
 void GraphicsManager::eraseObj() {
-	_screenBuffer.fillRect(Common::Rect(_drawObjRect.left, _drawObjRect.top + TOP, _drawObjRect.right, _drawObjRect.bottom + TOP), 0);
+	Common::Rect eraseRect = _drawObjRect;
+	eraseRect.translate(0, TOP);
+	if (eraseRect.isValidRect())
+		_screenBuffer.fillRect(eraseRect, 0);
 }
 
 void GraphicsManager::clearScreen() {
@@ -175,6 +185,11 @@ void GraphicsManager::copyToScreenBuffer(const Graphics::Surface *surface, int x
 }
 
 void GraphicsManager::copyToScreenBufferInner(const Graphics::Surface *surface, int x, int y) {
+	if (x + surface->w >= MAXX || y + surface->h >= MAXY) {
+		warning("copyToScreenBufferInner: Invalid surface, skipping");
+		return;
+	}
+
 	for (int curY = 0; curY < surface->h; ++curY) {
 		// NOTE: We use surface width for the pitch so that memcpy works
 		// correcly with surfaces from getSubArea()
@@ -183,6 +198,11 @@ void GraphicsManager::copyToScreenBufferInner(const Graphics::Surface *surface,
 }
 
 void GraphicsManager::blitToScreenBuffer(const Graphics::Surface *surface, int x, int y, const byte *palette, bool useSmkBg) {
+	if (x + surface->w >= MAXX || y + surface->h >= MAXY) {
+		warning("blitToScreenBuffer: Invalid surface, skipping");
+		return;
+	}
+
 	const uint16 mask = (uint16)_screenFormat.RGBToColor(palette[0], palette[1], palette[2]);
 	Graphics::Surface *surface16 = surface->convertTo(_screenFormat, palette);
 
@@ -338,7 +358,12 @@ void GraphicsManager::updatePixelFormat(uint16 *p, uint32 len) const {
  *				(dark) 0..8 (light)
  */
 void GraphicsManager::shadow(uint16 x, uint16 y, uint8 num) {
-	const uint16 val = _screenBuffer.getPixel(x, y);
+	if (x >= MAXX || y >= MAXY) {
+		warning("shadow: Invalid pixel, skipping");
+		return;
+	}
+
+	const uint16 val = (uint16)_screenBuffer.getPixel(x, y);
 	const uint16 shadow =
 			((((val & _bitMask[2]) * num >> 7) & _bitMask[2]) |
 			(((val & _bitMask[1]) * num >> 7) & _bitMask[1]) |
@@ -347,6 +372,11 @@ void GraphicsManager::shadow(uint16 x, uint16 y, uint8 num) {
 }
 
 void GraphicsManager::pixelAliasing(uint16 x, uint16 y) {
+	if (x >= MAXX || y >= MAXY) {
+		warning("pixelAliasing: Invalid pixel, skipping");
+		return;
+	}
+
 	int px1 = _screenBuffer.getPixel(x - 1, y);
 	int px2 = _screenBuffer.getPixel(x, y);
 
@@ -397,7 +427,7 @@ void GraphicsManager::dissolve(uint8 val) {
 
 		if (centerY - (int)y > TOP)
 			memset(_screenBuffer.getBasePtr(0, TOP), 0, (centerY - (int)y - TOP) * MAXX * 2);
-		if ((AREA + TOP) > centerY + (int)y)
+		if (AREA + TOP > centerY + (int)y)
 			memset(_screenBuffer.getBasePtr(0, centerY + (int)y), 0, (AREA + TOP - (centerY + (int)y)) * MAXX * 2);
 
 		float d1 = b * b - a * a * b + a * a / 4.0f;


Commit: ffcdb3f58d51a3ad903742c69bf37bd4851e4c56
    https://github.com/scummvm/scummvm/commit/ffcdb3f58d51a3ad903742c69bf37bd4851e4c56
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2021-05-30T17:37:17+03:00

Commit Message:
TRECISION: Simplify dissolve()

Changed paths:
    engines/trecision/graphics.cpp
    engines/trecision/graphics.h
    engines/trecision/logic.cpp


diff --git a/engines/trecision/graphics.cpp b/engines/trecision/graphics.cpp
index 6adbda9465..e998644cff 100644
--- a/engines/trecision/graphics.cpp
+++ b/engines/trecision/graphics.cpp
@@ -403,7 +403,8 @@ uint16 GraphicsManager::aliasing(uint32 val1, uint32 val2, uint8 num) {
 			((((val1 & _bitMask[0]) * num + (val2 & _bitMask[0]) * (8 - num)) >> 3) & _bitMask[0]));
 }
 
-void GraphicsManager::dissolve(uint8 val) {
+void GraphicsManager::dissolve() {
+	const uint16 val = 30;
 	uint16 centerX = MAXX / 2;
 	uint16 centerY = MAXY / 2;
 
diff --git a/engines/trecision/graphics.h b/engines/trecision/graphics.h
index 7a89ee231a..a4c5e8b873 100644
--- a/engines/trecision/graphics.h
+++ b/engines/trecision/graphics.h
@@ -94,7 +94,7 @@ public:
 
 	void shadow(uint16 x, uint16 y, uint8 num);
 	void pixelAliasing(uint16 x, uint16 y);
-	void dissolve(uint8 val);
+	void dissolve();
 
 	void addDirtyRect(Common::Rect rect, bool translateRect, bool updateActorRect = false);
 
diff --git a/engines/trecision/logic.cpp b/engines/trecision/logic.cpp
index 92475b2470..d610dfb428 100644
--- a/engines/trecision/logic.cpp
+++ b/engines/trecision/logic.cpp
@@ -3839,7 +3839,7 @@ void LogicManager::initControlPanel() {
 
 void LogicManager::doSystemChangeRoom(uint16 room) {
 	if (_vm->_curRoom == kRoom41D && _vm->_oldRoom != room)
-		_vm->_graphicsMgr->dissolve(30);
+		_vm->_graphicsMgr->dissolve();
 
 	_vm->_oldRoom = _vm->_curRoom;
 	_vm->_curRoom = room;


Commit: b117194994f5cb51c566b4dcbbe6cd4dc58936ff
    https://github.com/scummvm/scummvm/commit/b117194994f5cb51c566b4dcbbe6cd4dc58936ff
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2021-05-30T17:37:17+03:00

Commit Message:
TRECISION: Disable dissolve() for now, as it writes OOB

Changed paths:
    engines/trecision/graphics.cpp


diff --git a/engines/trecision/graphics.cpp b/engines/trecision/graphics.cpp
index e998644cff..94e6d63b6e 100644
--- a/engines/trecision/graphics.cpp
+++ b/engines/trecision/graphics.cpp
@@ -404,6 +404,8 @@ uint16 GraphicsManager::aliasing(uint32 val1, uint32 val2, uint8 num) {
 }
 
 void GraphicsManager::dissolve() {
+	// FIXME: This is writing OOB. Disabled for now
+#if 0
 	const uint16 val = 30;
 	uint16 centerX = MAXX / 2;
 	uint16 centerY = MAXY / 2;
@@ -478,6 +480,8 @@ void GraphicsManager::dissolve() {
 		cv = _vm->readTime();
 	}
 
+#endif
+
 	clearScreen();
 }
 


Commit: ef803f87682c8f5e5b08cc996299f668e4bfeb3d
    https://github.com/scummvm/scummvm/commit/ef803f87682c8f5e5b08cc996299f668e4bfeb3d
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2021-05-30T17:37:17+03:00

Commit Message:
TRECISION: Split doMouseLeftRight() into smaller functions

Changed paths:
    engines/trecision/logic.cpp
    engines/trecision/logic.h


diff --git a/engines/trecision/logic.cpp b/engines/trecision/logic.cpp
index d610dfb428..0fa81acd59 100644
--- a/engines/trecision/logic.cpp
+++ b/engines/trecision/logic.cpp
@@ -492,7 +492,7 @@ void LogicManager::endChangeRoom() {
 	else if (_vm->_curRoom == kRoom5A && !_vm->_room[kRoom5A].isDone())
 		_vm->_textMgr->characterSay(1408);
 	else if (_vm->_curRoom == kRoomControlPanel && (_vm->_oldRoom == kRoomControlPanel))
-		_vm->_logicMgr->doSys(o00LOAD);
+		_vm->_logicMgr->handleClickControlPanel(o00LOAD);
 	_vm->_inventoryObj[kItemPositioner].setFlagExtra(false);
 }
 
@@ -3600,199 +3600,89 @@ bool LogicManager::doMouseInventory() {
 	return !_vm->_flagCharacterExists && _vm->_curRoom != kRoom31P && _vm->_curRoom != kRoom35P;
 }
 
-void LogicManager::doMouseLeftRight() {
-	//  for the displacer
-	if ((_vm->_curObj >= oPULSANTE1AD) && (_vm->_curObj <= oPULSANTE33AD)) {
-		if ((_vm->_obj[_vm->_curObj]._goRoom == kRoom45) && (_vm->_obj[od44TO45]._goRoom == kRoom45S) &&
-			(_vm->_obj[oEXIT41D]._goRoom == kRoom45S) && (_vm->_curMessage->_event == ME_MRIGHT))
-			_vm->_scheduler->mouseOperate(_vm->_curObj);
-		else if ((_vm->_obj[_vm->_curObj]._goRoom == kRoom45) && (_vm->_obj[od44TO45]._goRoom == kRoom45S) &&
-				 (_vm->_obj[oEXIT41D]._goRoom != kRoom45S) && (_vm->_curMessage->_event == ME_MRIGHT)) {
-			_vm->_obj[oEXIT41D]._goRoom = kRoom45S;
-			_vm->_inventoryObj[kItemPositioner].setFlagExtra(true);
-			_vm->changeRoom(kRoom45S);
-		} else if (_vm->_obj[oEXIT41D]._goRoom != _vm->_obj[_vm->_curObj]._goRoom && (_vm->_curMessage->_event == ME_MRIGHT)) {
-			_vm->_obj[oEXIT41D]._goRoom = _vm->_obj[_vm->_curObj]._goRoom;
-			_vm->_inventoryObj[kItemPositioner].setFlagExtra(true);
-			_vm->changeRoom(_vm->_obj[oEXIT41D]._goRoom);
-		} else if ((_vm->_curMessage->_event == ME_MLEFT) && _vm->_curObj)
-			_vm->_scheduler->mouseExamine(_vm->_curObj);
-		else if ((_vm->_curMessage->_event == ME_MRIGHT) && _vm->_curObj)
-			_vm->_scheduler->mouseOperate(_vm->_curObj);
-		return;
-	}
-	// end of displacer
-
-	if (_vm->_curRoom == kRoom52) {
-		// snake escape 52
-		if (_vm->isObjectVisible(oSNAKEU52)) {
-			if (_vm->isGameArea(_vm->_mousePos) && !_vm->_flagUseWithStarted && (_vm->_curObj != oSNAKEU52)) {
-				_vm->startCharacterAction(a526, 0, 1, 0);
-				_vm->setObjectAnim(oSCAVO51, a516);
-				_vm->_snake52.set(_vm->_curMessage);
+void LogicManager::handleClickSphinxPuzzle() {
+	if (_vm->checkMask(_vm->_mousePos)) {
+		if ((_vm->_curObj >= oWHEEL1A2C) && (_vm->_curObj <= oWHEEL12C2C))
+			_wheel = (_vm->_curObj - oWHEEL1A2C) % 3;
+		else if (_vm->_curObj == oPULSANTE2C) {
+			if (_vm->_curMessage->_event == ME_MLEFT) {
+				_vm->_scheduler->mouseExamine(_vm->_curObj);
 				return;
 			}
-		}
-	} else if (_vm->_curRoom == kRoomControlPanel) {
-		// Sys
-		_vm->checkMask(_vm->_mousePos);
-		doSys(_vm->_curObj);
-		return;
-	}
+			_vm->_animMgr->_animTab[aBKG2C]._flag &= ~SMKANIM_OFF1;
+			_vm->setObjectVisible(oBASEWHEELS2C, false);
+			_vm->setObjectVisible(omWHEELS2C, false);
+			_vm->setObjectVisible(oPULSANTE2C, false);
+			_vm->setObjectVisible(_wheelPos[0] * 3 + 0 + oWHEEL1A2C, false);
+			_vm->setObjectVisible(_wheelPos[1] * 3 + 1 + oWHEEL1A2C, false);
+			_vm->setObjectVisible(_wheelPos[2] * 3 + 2 + oWHEEL1A2C, false);
+			_vm->setObjectVisible(oCAMPO2C, true);
+			_vm->setObjectVisible(oTEMPIO2C, true);
+			_vm->setObjectVisible(oLEONE2C, true);
+			_vm->setObjectVisible(oSFINGE2C, true);
+			_vm->setObjectVisible(oSTATUA2C, true);
+			_vm->setObjectVisible(od2CTO2E, true);
+			_vm->setObjectVisible(oCARTELLOA2C, true);
+			_vm->setObjectVisible(od2CTO26, true);
+			_vm->setObjectVisible(oWHEELS2C, true);
+			_vm->_flagShowCharacter = true;
+			_vm->_animMgr->startSmkAnim(_vm->_room[_vm->_curRoom]._bkgAnim);
+
+			// right combination
+			if ((_wheelPos[0] == 7) && (_wheelPos[1] == 5) && (_wheelPos[2] == 11)) {
+				_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERACTION, MP_DEFAULT, a2C6PREMEPULSANTEAPERTURA, 0, 0, _vm->_curObj);
+				_vm->_obj[oSFINGE2C].setFlagPerson(false);
+			} else
+				_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERACTION, MP_DEFAULT, a2C6PREMEPULSANTE, 0, 0, _vm->_curObj);
 
-	// If it's in a room without a character, like a map or a book
-	if (!_vm->_flagCharacterExists) {
-		if (_vm->isInventoryArea(_vm->_mousePos) && (_vm->_curRoom == kRoom31P || _vm->_curRoom == kRoom35P)) {
-			if (_vm->isIconArea(_vm->_mousePos) && _vm->whatIcon(_vm->_mousePos) && (_vm->_inventoryStatus == INV_INACTION)) {
-				_vm->_useWith[WITH] = 0;
-				_vm->_curObj = 0;
-				_vm->_lightIcon = 0xFF;
-				_vm->setInventoryStart(_vm->_iconBase, INVENTORY_SHOW);
-				if (_vm->_curMessage->_event == ME_MRIGHT || _vm->_flagUseWithStarted)
-					_vm->useItem();
-				else
-					_vm->examineItem();
-			}
 			return;
-		}
+		} else
+			return;
 
-		if ((_vm->_curMessage->_event == ME_MLEFT) && _vm->_curObj)
-			_vm->_scheduler->mouseExamine(_vm->_curObj);
-		else if ((_vm->_curMessage->_event == ME_MRIGHT) && _vm->_curObj)
-			_vm->_scheduler->mouseOperate(_vm->_curObj);
+		if (_vm->_curMessage->_event == ME_MLEFT)
+			_wheelPos[_wheel] = (_wheelPos[_wheel] > 10) ? 0 : _wheelPos[_wheel] + 1;
+		if (_vm->_curMessage->_event == ME_MRIGHT)
+			_wheelPos[_wheel] = (_wheelPos[_wheel] < 1) ? 11 : _wheelPos[_wheel] - 1;
 
-		return;
+		_vm->_soundMgr->play(wWHEELS2C);
+		_vm->setObjectVisible(_vm->_curObj, false);
+		_vm->setObjectVisible(_wheelPos[_wheel] * 3 + _wheel + oWHEEL1A2C, true);
 	}
+}
 
-	// Special management for 2C wheels
-	if (_vm->isObjectVisible(oBASEWHEELS2C) && _vm->_curRoom == kRoom2C) {
-		if (_vm->checkMask(_vm->_mousePos)) {
-			if ((_vm->_curObj >= oWHEEL1A2C) && (_vm->_curObj <= oWHEEL12C2C))
-				_wheel = (_vm->_curObj - oWHEEL1A2C) % 3;
-			else if (_vm->_curObj == oPULSANTE2C) {
-				if (_vm->_curMessage->_event == ME_MLEFT) {
-					_vm->_scheduler->mouseExamine(_vm->_curObj);
-					return;
-				}
-				_vm->_animMgr->_animTab[aBKG2C]._flag &= ~SMKANIM_OFF1;
-				_vm->setObjectVisible(oBASEWHEELS2C, false);
-				_vm->setObjectVisible(omWHEELS2C, false);
-				_vm->setObjectVisible(oPULSANTE2C, false);
-				_vm->setObjectVisible(_wheelPos[0] * 3 + 0 + oWHEEL1A2C, false);
-				_vm->setObjectVisible(_wheelPos[1] * 3 + 1 + oWHEEL1A2C, false);
-				_vm->setObjectVisible(_wheelPos[2] * 3 + 2 + oWHEEL1A2C, false);
-				_vm->setObjectVisible(oCAMPO2C, true);
-				_vm->setObjectVisible(oTEMPIO2C, true);
-				_vm->setObjectVisible(oLEONE2C, true);
-				_vm->setObjectVisible(oSFINGE2C, true);
-				_vm->setObjectVisible(oSTATUA2C, true);
-				_vm->setObjectVisible(od2CTO2E, true);
-				_vm->setObjectVisible(oCARTELLOA2C, true);
-				_vm->setObjectVisible(od2CTO26, true);
-				_vm->setObjectVisible(oWHEELS2C, true);
-				_vm->_flagShowCharacter = true;
-				_vm->_animMgr->startSmkAnim(_vm->_room[_vm->_curRoom]._bkgAnim);
-
-				// right combination
-				if ((_wheelPos[0] == 7) && (_wheelPos[1] == 5) && (_wheelPos[2] == 11)) {
-					_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERACTION, MP_DEFAULT, a2C6PREMEPULSANTEAPERTURA, 0, 0, _vm->_curObj);
-					_vm->_obj[oSFINGE2C].setFlagPerson(false);
-				} else
-					_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERACTION, MP_DEFAULT, a2C6PREMEPULSANTE, 0, 0, _vm->_curObj);
-
-				return;
-			} else
-				return;
-
-			if (_vm->_curMessage->_event == ME_MLEFT)
-				_wheelPos[_wheel] = (_wheelPos[_wheel] > 10) ? 0 : _wheelPos[_wheel] + 1;
-			if (_vm->_curMessage->_event == ME_MRIGHT)
-				_wheelPos[_wheel] = (_wheelPos[_wheel] < 1) ? 11 : _wheelPos[_wheel] - 1;
+void LogicManager::handleClickPositioner() {
+	if ((_vm->_obj[_vm->_curObj]._goRoom == kRoom45) && (_vm->_obj[od44TO45]._goRoom == kRoom45S) &&
+		(_vm->_obj[oEXIT41D]._goRoom == kRoom45S) && (_vm->_curMessage->_event == ME_MRIGHT))
+		_vm->_scheduler->mouseOperate(_vm->_curObj);
+	else if ((_vm->_obj[_vm->_curObj]._goRoom == kRoom45) && (_vm->_obj[od44TO45]._goRoom == kRoom45S) &&
+			 (_vm->_obj[oEXIT41D]._goRoom != kRoom45S) && (_vm->_curMessage->_event == ME_MRIGHT)) {
+		_vm->_obj[oEXIT41D]._goRoom = kRoom45S;
+		_vm->_inventoryObj[kItemPositioner].setFlagExtra(true);
+		_vm->changeRoom(kRoom45S);
+	} else if (_vm->_obj[oEXIT41D]._goRoom != _vm->_obj[_vm->_curObj]._goRoom && (_vm->_curMessage->_event == ME_MRIGHT)) {
+		_vm->_obj[oEXIT41D]._goRoom = _vm->_obj[_vm->_curObj]._goRoom;
+		_vm->_inventoryObj[kItemPositioner].setFlagExtra(true);
+		_vm->changeRoom(_vm->_obj[oEXIT41D]._goRoom);
+	} else if ((_vm->_curMessage->_event == ME_MLEFT) && _vm->_curObj)
+		_vm->_scheduler->mouseExamine(_vm->_curObj);
+	else if ((_vm->_curMessage->_event == ME_MRIGHT) && _vm->_curObj)
+		_vm->_scheduler->mouseOperate(_vm->_curObj);
+}
 
-			_vm->_soundMgr->play(wWHEELS2C);
-			_vm->setObjectVisible(_vm->_curObj, false);
-			_vm->setObjectVisible(_wheelPos[_wheel] * 3 + _wheel + oWHEEL1A2C, true);
+void LogicManager::handleClickSnakeEscape() {
+	if (_vm->isObjectVisible(oSNAKEU52)) {
+		if (_vm->isGameArea(_vm->_mousePos) && !_vm->_flagUseWithStarted && _vm->_curObj != oSNAKEU52) {
+			_vm->startCharacterAction(a526, 0, 1, 0);
+			_vm->setObjectAnim(oSCAVO51, a516);
+			_vm->_snake52.set(_vm->_curMessage);
 		}
-		return;
 	}
+}
 
-	//	Game area
-	if (_vm->isGameArea(_vm->_mousePos) && !_vm->_animMgr->_playingAnims[kSmackerAction]) {
-		if (_vm->_flagScriptActive)
-			_vm->_curObj = _vm->_curMessage->_u32Param;
-
-		int pmousex = _vm->_curMessage->_u16Param1;
-		int pmousey = _vm->_curMessage->_u16Param2;
-		if (!_vm->_logicMgr->mouseClick(_vm->_curObj)) {
-			if (_vm->checkMask(_vm->_mousePos)) {
-				if ((_vm->_obj[_vm->_curObj]._lim.right - _vm->_obj[_vm->_curObj]._lim.left) < MAXX / 7) {
-					pmousex = (_vm->_obj[_vm->_curObj]._lim.left + _vm->_obj[_vm->_curObj]._lim.right) / 2;
-					pmousey = ((_vm->_obj[_vm->_curObj]._lim.top + _vm->_obj[_vm->_curObj]._lim.bottom) / 2) + TOP;
-				}
-			}
-			_vm->_pathFind->whereIs(pmousex, pmousey);
-			_vm->_pathFind->findPath();
-		}
-		_vm->_scheduler->initCharacterQueue();
-
-		if (_vm->checkMask(_vm->_mousePos) && !_vm->_flagDialogActive) {
-			if (_vm->_curRoom == kRoom1D && !_vm->_room[kRoom1D].hasExtra() && (_vm->_curObj != oSCALA1D))
-				_vm->_curObj = oDONNA1D;
-			else if (_vm->_curRoom == kRoom2B && _vm->_room[kRoom2B].hasExtra() && (_vm->_curObj != oCARTELLO2B) && (_vm->_curObj != od2BTO28)) {
-				_vm->_textMgr->clearLastText();
-				_vm->_curObj = oDOOR2B;
-				_vm->startCharacterAction(a2B1PROVAAPRIREPORTA, 0, 0, 0);
-				_vm->clearUseWith();
-				return;
-			} else if (_vm->_curRoom == kRoom35 && !_vm->_room[kRoom35].hasExtra()
-					&& ((_vm->_curObj == oFRONTOFFICEC35)
-			            || (_vm->_curObj == oFRONTOFFICEA35) || (_vm->_curObj == oASCENSORE35) || (_vm->_curObj == oMONITOR35)
-			            || (_vm->_curObj == oSEDIA35) || (_vm->_curObj == oRIBELLEA35) || (_vm->_curObj == oCOMPUTER35) || (_vm->_curObj == oGIORNALE35))) {
-				_vm->_curObj = oLASTLEV5;
-				_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTOEXAMINE, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, _vm->_curObj);
-				_vm->clearUseWith();
-				return;
-			} else if ((_vm->_curMessage->_event == ME_MLEFT) &&
-					   ((!_vm->_room[_vm->_curRoom].hasExtra() && ((_vm->_curObj == oENTRANCE2E) || (_vm->_curObj == od24TO26) || (_vm->_curObj == od21TO23 && !_vm->_obj[_vm->_curObj].isFlagExamine()))) ||
-						(_vm->_room[_vm->_curRoom].hasExtra() && ((_vm->_curObj == od2ETO2C) || (_vm->_curObj == od24TO23) || (_vm->_curObj == od21TO22 && !_vm->_obj[_vm->_curObj].isFlagExamine()) || (_vm->_curObj == od2GVTO26))))) {
-				_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTO, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, 0);
-				return;
-			}
-
-			if (_vm->_curMessage->_event == ME_MRIGHT) {
-				if (!_vm->_obj[_vm->_curObj].isFlagExamine() && (_vm->_curObj != 0)) {
-					if (_vm->_flagUseWithStarted) {
-						_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTO, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, 0);
-						return;
-					}
-					if (_vm->_obj[_vm->_curObj].isFlagRoomIn())
-						_vm->changeRoom(_vm->_obj[_vm->_curObj]._goRoom, _vm->_obj[_vm->_curObj]._anim, _vm->_obj[_vm->_curObj]._ninv);
-					else if (_vm->_obj[_vm->_curObj].isFlagRoomOut())
-						_vm->changeRoom(_vm->_obj[_vm->_curObj]._goRoom, 0, _vm->_obj[_vm->_curObj]._ninv);
-					_vm->_actor->actorStop();
-					_vm->_pathFind->nextStep();
-					_vm->_obj[_vm->_curObj].setFlagDone(true);
-				} else if (_vm->_obj[_vm->_curObj].isFlagUseWith()) {
-					_vm->_pathFind->_characterGoToPosition = -1;
-					_vm->_actor->actorStop();
-					_vm->_pathFind->nextStep();
-					_vm->_scheduler->mouseOperate(_vm->_curObj);
-				} else
-					_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTOACTION, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, _vm->_curObj);
-			} else
-				_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTOEXAMINE, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, _vm->_curObj);
-		} else
-			_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTO, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, 0);
-	} else if (_vm->isInventoryArea(_vm->_mousePos)) {
-		// Inventory area
-		if (_vm->_animMgr->_playingAnims[kSmackerAction] || _vm->_flagDialogActive || _vm->_curRoom == kRoomControlPanel)
-			return;
-
+// Handles rooms without a character, like maps or books
+void LogicManager::handleClickCloseup() {
+	if (_vm->isInventoryArea(_vm->_mousePos) && (_vm->_curRoom == kRoom31P || _vm->_curRoom == kRoom35P)) {
 		if (_vm->isIconArea(_vm->_mousePos) && _vm->whatIcon(_vm->_mousePos) && (_vm->_inventoryStatus == INV_INACTION)) {
-			_vm->_scheduler->initCharacterQueue();
-			_vm->_actor->actorStop();
-			_vm->_pathFind->nextStep();
-			_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTOACTION, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, 0);
 			_vm->_useWith[WITH] = 0;
 			_vm->_curObj = 0;
 			_vm->_lightIcon = 0xFF;
@@ -3802,6 +3692,116 @@ void LogicManager::doMouseLeftRight() {
 			else
 				_vm->examineItem();
 		}
+		return;
+	}
+
+	if ((_vm->_curMessage->_event == ME_MLEFT) && _vm->_curObj)
+		_vm->_scheduler->mouseExamine(_vm->_curObj);
+	else if ((_vm->_curMessage->_event == ME_MRIGHT) && _vm->_curObj)
+		_vm->_scheduler->mouseOperate(_vm->_curObj);
+}
+
+void LogicManager::handleClickGameArea() {
+	if (_vm->_flagScriptActive)
+		_vm->_curObj = _vm->_curMessage->_u32Param;
+
+	int pmousex = _vm->_curMessage->_u16Param1;
+	int pmousey = _vm->_curMessage->_u16Param2;
+	if (!_vm->_logicMgr->mouseClick(_vm->_curObj)) {
+		if (_vm->checkMask(_vm->_mousePos)) {
+			if ((_vm->_obj[_vm->_curObj]._lim.right - _vm->_obj[_vm->_curObj]._lim.left) < MAXX / 7) {
+				pmousex = (_vm->_obj[_vm->_curObj]._lim.left + _vm->_obj[_vm->_curObj]._lim.right) / 2;
+				pmousey = ((_vm->_obj[_vm->_curObj]._lim.top + _vm->_obj[_vm->_curObj]._lim.bottom) / 2) + TOP;
+			}
+		}
+		_vm->_pathFind->whereIs(pmousex, pmousey);
+		_vm->_pathFind->findPath();
+	}
+	_vm->_scheduler->initCharacterQueue();
+
+	if (_vm->checkMask(_vm->_mousePos) && !_vm->_flagDialogActive) {
+		if (_vm->_curRoom == kRoom1D && !_vm->_room[kRoom1D].hasExtra() && (_vm->_curObj != oSCALA1D))
+			_vm->_curObj = oDONNA1D;
+		else if (_vm->_curRoom == kRoom2B && _vm->_room[kRoom2B].hasExtra() && (_vm->_curObj != oCARTELLO2B) && (_vm->_curObj != od2BTO28)) {
+			_vm->_textMgr->clearLastText();
+			_vm->_curObj = oDOOR2B;
+			_vm->startCharacterAction(a2B1PROVAAPRIREPORTA, 0, 0, 0);
+			_vm->clearUseWith();
+			return;
+		} else if (_vm->_curRoom == kRoom35 && !_vm->_room[kRoom35].hasExtra() && ((_vm->_curObj == oFRONTOFFICEC35) || (_vm->_curObj == oFRONTOFFICEA35) || (_vm->_curObj == oASCENSORE35) || (_vm->_curObj == oMONITOR35) || (_vm->_curObj == oSEDIA35) || (_vm->_curObj == oRIBELLEA35) || (_vm->_curObj == oCOMPUTER35) || (_vm->_curObj == oGIORNALE35))) {
+			_vm->_curObj = oLASTLEV5;
+			_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTOEXAMINE, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, _vm->_curObj);
+			_vm->clearUseWith();
+			return;
+		} else if ((_vm->_curMessage->_event == ME_MLEFT) &&
+				   ((!_vm->_room[_vm->_curRoom].hasExtra() && ((_vm->_curObj == oENTRANCE2E) || (_vm->_curObj == od24TO26) || (_vm->_curObj == od21TO23 && !_vm->_obj[_vm->_curObj].isFlagExamine()))) ||
+					(_vm->_room[_vm->_curRoom].hasExtra() && ((_vm->_curObj == od2ETO2C) || (_vm->_curObj == od24TO23) || (_vm->_curObj == od21TO22 && !_vm->_obj[_vm->_curObj].isFlagExamine()) || (_vm->_curObj == od2GVTO26))))) {
+			_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTO, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, 0);
+			return;
+		}
+
+		if (_vm->_curMessage->_event == ME_MRIGHT) {
+			if (!_vm->_obj[_vm->_curObj].isFlagExamine() && (_vm->_curObj != 0)) {
+				if (_vm->_flagUseWithStarted) {
+					_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTO, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, 0);
+					return;
+				}
+				if (_vm->_obj[_vm->_curObj].isFlagRoomIn())
+					_vm->changeRoom(_vm->_obj[_vm->_curObj]._goRoom, _vm->_obj[_vm->_curObj]._anim, _vm->_obj[_vm->_curObj]._ninv);
+				else if (_vm->_obj[_vm->_curObj].isFlagRoomOut())
+					_vm->changeRoom(_vm->_obj[_vm->_curObj]._goRoom, 0, _vm->_obj[_vm->_curObj]._ninv);
+				_vm->_actor->actorStop();
+				_vm->_pathFind->nextStep();
+				_vm->_obj[_vm->_curObj].setFlagDone(true);
+			} else if (_vm->_obj[_vm->_curObj].isFlagUseWith()) {
+				_vm->_pathFind->_characterGoToPosition = -1;
+				_vm->_actor->actorStop();
+				_vm->_pathFind->nextStep();
+				_vm->_scheduler->mouseOperate(_vm->_curObj);
+			} else
+				_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTOACTION, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, _vm->_curObj);
+		} else
+			_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTOEXAMINE, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, _vm->_curObj);
+	} else
+		_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTO, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, 0);
+}
+
+void LogicManager::handleClickInventoryArea() {
+	if (_vm->_animMgr->_playingAnims[kSmackerAction] || _vm->_flagDialogActive || _vm->_curRoom == kRoomControlPanel)
+		return;
+
+	if (_vm->isIconArea(_vm->_mousePos) && _vm->whatIcon(_vm->_mousePos) && (_vm->_inventoryStatus == INV_INACTION)) {
+		_vm->_scheduler->initCharacterQueue();
+		_vm->_actor->actorStop();
+		_vm->_pathFind->nextStep();
+		_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTOACTION, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, 0);
+		_vm->_useWith[WITH] = 0;
+		_vm->_curObj = 0;
+		_vm->_lightIcon = 0xFF;
+		_vm->setInventoryStart(_vm->_iconBase, INVENTORY_SHOW);
+		if (_vm->_curMessage->_event == ME_MRIGHT || _vm->_flagUseWithStarted)
+			_vm->useItem();
+		else
+			_vm->examineItem();
+	}
+}
+
+void LogicManager::doMouseLeftRight() {
+	if (_vm->_curObj >= oPULSANTE1AD && _vm->_curObj <= oPULSANTE33AD) {
+		handleClickPositioner();
+	} else if (_vm->isObjectVisible(oBASEWHEELS2C) && _vm->_curRoom == kRoom2C) {
+		handleClickSphinxPuzzle();
+	} else if (_vm->_curRoom == kRoomControlPanel) {
+		handleClickControlPanel(_vm->_curObj);
+	} else if (!_vm->_flagCharacterExists) {
+		handleClickCloseup();
+	} else if (_vm->isGameArea(_vm->_mousePos) && !_vm->_animMgr->_playingAnims[kSmackerAction]) {
+		if (_vm->_curRoom == kRoom52)
+			handleClickSnakeEscape();
+
+		handleClickGameArea();
+	} else if (_vm->isInventoryArea(_vm->_mousePos)) {
+		handleClickInventoryArea();
 	}
 }
 
@@ -3929,7 +3929,9 @@ void LogicManager::doSystemChangeRoom(uint16 room) {
 	}
 }
 
-void LogicManager::doSys(uint16 curObj) {
+void LogicManager::handleClickControlPanel(uint16 curObj) {
+	_vm->checkMask(_vm->_mousePos);
+
 	switch (curObj) {
 	case o00QUIT:
 		if (_vm->quitPrompt())
diff --git a/engines/trecision/logic.h b/engines/trecision/logic.h
index 2e5334e9ff..7e2b324b00 100644
--- a/engines/trecision/logic.h
+++ b/engines/trecision/logic.h
@@ -90,7 +90,14 @@ private:
 	void startCharacterAnimations();
 	bool startPlayDialog();
 	void initControlPanel();
-	void doSys(uint16 curObj);
+
+	void handleClickControlPanel(uint16 curObj);
+	void handleClickSphinxPuzzle();
+	void handleClickPositioner();
+	void handleClickSnakeEscape();
+	void handleClickCloseup();
+	void handleClickGameArea();
+	void handleClickInventoryArea();
 };
 // end of class
 


Commit: 0ca3d76f9cd39a302c9e5cbca7a3f4dc80ca2b0c
    https://github.com/scummvm/scummvm/commit/0ca3d76f9cd39a302c9e5cbca7a3f4dc80ca2b0c
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2021-05-30T17:37:18+03:00

Commit Message:
TRECISION: Replace _flagCharacterExists with _flagShowCharacter

These two ended up having practically the same semantics, so they have
been merged. The only place where the difference actually mattered
is in characterContinueTalk(), to show the subtitles in the correct
place, but it suffices to check for active character animations at that
point instead.

Changed paths:
    engines/trecision/anim.cpp
    engines/trecision/dialog.cpp
    engines/trecision/graphics.cpp
    engines/trecision/logic.cpp
    engines/trecision/saveload.cpp
    engines/trecision/script.cpp
    engines/trecision/trecision.cpp
    engines/trecision/trecision.h


diff --git a/engines/trecision/anim.cpp b/engines/trecision/anim.cpp
index 7884adc5b4..c0a0821bc9 100644
--- a/engines/trecision/anim.cpp
+++ b/engines/trecision/anim.cpp
@@ -101,10 +101,10 @@ void AnimTypeManager::executeAtFrameDoit(ATFHandle *h, int doit, uint16 objectId
 		break;
 
 	case fCHARACTEROFF:
-		_vm->_flagCharacterExists = false;
+		_vm->_flagShowCharacter = false;
 		break;
 	case fCHARACTERON:
-		_vm->_flagCharacterExists = true;
+		_vm->_flagShowCharacter = true;
 		break;
 	case fCHARACTERFOREGROUND:
 		_vm->_forcedActorPos = BOX_FOREGROUND;
diff --git a/engines/trecision/dialog.cpp b/engines/trecision/dialog.cpp
index 8fd98acbb5..2b65376f3e 100644
--- a/engines/trecision/dialog.cpp
+++ b/engines/trecision/dialog.cpp
@@ -429,7 +429,6 @@ void DialogManager::afterChoice() {
 			break;
 
 		case dC4A1:
-			_vm->_flagCharacterExists = true;
 			_vm->_flagShowCharacter = true;
 			_vm->_actor->actorStop();
 			_vm->_pathFind->nextStep();
diff --git a/engines/trecision/graphics.cpp b/engines/trecision/graphics.cpp
index 94e6d63b6e..97b609c4c5 100644
--- a/engines/trecision/graphics.cpp
+++ b/engines/trecision/graphics.cpp
@@ -649,7 +649,7 @@ void GraphicsManager::paintObjAnm(uint16 curBox) {
 		}
 	}
 
-	if (_vm->_actorPos == curBox && _vm->_flagShowCharacter && _vm->_flagCharacterExists) {
+	if (_vm->_actorPos == curBox && _vm->_flagShowCharacter) {
 		_vm->_renderer->drawCharacter(CALCPOINTS);
 
 		int x1 = _vm->_actor->_lim[0];
diff --git a/engines/trecision/logic.cpp b/engines/trecision/logic.cpp
index 0fa81acd59..908f68824b 100644
--- a/engines/trecision/logic.cpp
+++ b/engines/trecision/logic.cpp
@@ -436,11 +436,9 @@ void LogicManager::endChangeRoom() {
 
 	if (isCloseupOrControlRoom()) { // Screens without inventory
 		_vm->_flagShowCharacter = false;
-		_vm->_flagCharacterExists = false;
 		_vm->_flagInventoryLocked = true;
 	} else if (_vm->_curRoom == kRoom31P || _vm->_curRoom == kRoom35P) { // Screens with inventory
 		_vm->_flagShowCharacter = false;
-		_vm->_flagCharacterExists = false;
 	} else if (_vm->_curRoom == kRoom23A && (_vm->_oldRoom == kRoom21) && !_vm->_room[kRoom23A].isDone())
 		_vm->_flagShowCharacter = false;
 	else if (_vm->_curRoom == kRoom31 && !_vm->_room[kRoom31].isDone())
@@ -2858,7 +2856,7 @@ bool LogicManager::mouseOperate(uint16 curObj) {
 			_vm->setObjectVisible(oSUNDIAL49, false);
 			_vm->_obj[oAGENDA49]._examine = 1099;
 			_vm->_obj[oAGENDA49]._action = 1100;
-			_vm->_flagCharacterExists = true;
+			_vm->_flagShowCharacter = true;
 			_vm->_curObj = oAGENDA49;
 			_vm->playScript(s49SUNDIAL);
 		}
@@ -2915,14 +2913,14 @@ bool LogicManager::mouseOperate(uint16 curObj) {
 				_vm->setObjectVisible(oAST14C + a, false);
 			}
 			_vm->changeRoom(kRoom51, 0, 1);
-			_vm->_flagCharacterExists = true;
+			_vm->_flagShowCharacter = true;
 		} else {
 			for (a = 0; a < 6; ++a) {
 				_comb4CT[a] = 0;
 				_vm->setObjectVisible(oAST14C + a, false);
 			}
 			_vm->changeRoom(kRoom4C, 0, 4);
-			_vm->_flagCharacterExists = true;
+			_vm->_flagShowCharacter = true;
 		}
 		retVal = false;
 		break;
@@ -3597,7 +3595,7 @@ void LogicManager::doMouseGame() {
 
 // Returns true when it's in a room without a character, such as the map
 bool LogicManager::doMouseInventory() {
-	return !_vm->_flagCharacterExists && _vm->_curRoom != kRoom31P && _vm->_curRoom != kRoom35P;
+	return !_vm->_flagShowCharacter && _vm->_curRoom != kRoom31P && _vm->_curRoom != kRoom35P;
 }
 
 void LogicManager::handleClickSphinxPuzzle() {
@@ -3793,7 +3791,7 @@ void LogicManager::doMouseLeftRight() {
 		handleClickSphinxPuzzle();
 	} else if (_vm->_curRoom == kRoomControlPanel) {
 		handleClickControlPanel(_vm->_curObj);
-	} else if (!_vm->_flagCharacterExists) {
+	} else if (!_vm->_flagShowCharacter) {
 		handleClickCloseup();
 	} else if (_vm->isGameArea(_vm->_mousePos) && !_vm->_animMgr->_playingAnims[kSmackerAction]) {
 		if (_vm->_curRoom == kRoom52)
@@ -3848,7 +3846,6 @@ void LogicManager::doSystemChangeRoom(uint16 room) {
 	_vm->clearUseWith();
 	_vm->closeInventoryImmediately();
 
-	_vm->_flagCharacterExists = true;
 	_vm->_flagShowCharacter = true;
 	_vm->_flagCharacterSpeak = false;
 	_vm->_flagSomeoneSpeaks = false;
diff --git a/engines/trecision/saveload.cpp b/engines/trecision/saveload.cpp
index 06a1850002..f09d2f430f 100644
--- a/engines/trecision/saveload.cpp
+++ b/engines/trecision/saveload.cpp
@@ -453,7 +453,7 @@ bool TrecisionEngine::syncGameStream(Common::Serializer &ser) {
 	ser.syncAsSint16LE(_flagUseWithStarted);
 	ser.syncAsSint16LE(unused, SAVE_VERSION_ORIGINAL_MIN, SAVE_VERSION_ORIGINAL_MAX); // _flagMousePolling
 	ser.syncAsSint16LE(unused, SAVE_VERSION_ORIGINAL_MIN, SAVE_VERSION_ORIGINAL_MAX); // _flagDialogSolitaire
-	ser.syncAsSint16LE(_flagCharacterExists);
+	ser.syncAsSint16LE(unused);	// _flagCharacterExists
 
 	syncInventory(ser);
 	_actor->syncGameStream(ser);
diff --git a/engines/trecision/script.cpp b/engines/trecision/script.cpp
index e07ff5cce9..84931984cd 100644
--- a/engines/trecision/script.cpp
+++ b/engines/trecision/script.cpp
@@ -408,7 +408,6 @@ void TrecisionEngine::doIdle() {
 			_obj[o00EXIT]._goRoom = _curRoom;
 			changeRoom(kRoomControlPanel);
 			_flagShowCharacter = false;
-			_flagCharacterExists = false;
 		}
 		break;
 
@@ -422,7 +421,6 @@ void TrecisionEngine::doIdle() {
 			_obj[o00EXIT]._goRoom = _curRoom;
 			changeRoom(kRoomControlPanel);
 			_flagShowCharacter = false;
-			_flagCharacterExists = false;
 		}
 		break;
 
diff --git a/engines/trecision/trecision.cpp b/engines/trecision/trecision.cpp
index 9f5bb1c502..995aa3a376 100644
--- a/engines/trecision/trecision.cpp
+++ b/engines/trecision/trecision.cpp
@@ -137,7 +137,6 @@ TrecisionEngine::TrecisionEngine(OSystem *syst, const ADGameDescription *desc) :
 	_flagSomeoneSpeaks = false;
 	_flagCharacterSpeak = false;
 	_flagUseWithStarted = false;
-	_flagCharacterExists = true;
 	_flagNoPaintScreen = false;
 	_flagWaitRegen = false;
 
diff --git a/engines/trecision/trecision.h b/engines/trecision/trecision.h
index 008990a965..089df8b2cb 100644
--- a/engines/trecision/trecision.h
+++ b/engines/trecision/trecision.h
@@ -311,7 +311,6 @@ public:
 	bool _flagSomeoneSpeaks;
 	bool _flagCharacterSpeak;
 	bool _flagUseWithStarted;
-	bool _flagCharacterExists;
 	bool _flagNoPaintScreen;
 	bool _flagWaitRegen;
 




More information about the Scummvm-git-logs mailing list