[Scummvm-git-logs] scummvm master -> ab1e526c1ec2ca4533c83fcb81e54ac5a8781b5f

ysj1173886760 42030331+ysj1173886760 at users.noreply.github.com
Fri Jul 30 08:38:51 UTC 2021


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

Summary:
99447ca832 GRAPHICS: MACGUI: implement getting member of menuItem
0bc678e47b DIRECTOR: implement getTheMenuItemEntity
a33ca9d831 DIRECTOR: amend coding format
b1f5de3501 GRAPHICS: MACGUI: implement mouseChar
928e76538f DIRECTOR: implement getting the MouseChar
87cd99126a GRAPHICS: MACGUI: implement getMouseWord
ab1e526c1e DIRECTOR: implement getting the MouseWord


Commit: 99447ca832cbf482c7c0bc8d880474441557ead0
    https://github.com/scummvm/scummvm/commit/99447ca832cbf482c7c0bc8d880474441557ead0
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-30T15:43:00+08:00

Commit Message:
GRAPHICS: MACGUI: implement getting member of menuItem

Changed paths:
    graphics/macgui/macmenu.cpp
    graphics/macgui/macmenu.h
    graphics/macgui/macwindowmanager.cpp
    graphics/macgui/macwindowmanager.h


diff --git a/graphics/macgui/macmenu.cpp b/graphics/macgui/macmenu.cpp
index 65a9e2f09f..05f5b95374 100644
--- a/graphics/macgui/macmenu.cpp
+++ b/graphics/macgui/macmenu.cpp
@@ -556,6 +556,55 @@ void MacMenu::setAction(int menuId, int itemId, int actionId) {
 	}
 }
 
+bool MacMenu::getCheckMark(int menuId, int itemId) {
+	MacMenuItem *item = findMenuItem(menuId, itemId);
+
+	// if item doesn't exist, this will be warned at findMenuItem
+	return item ? item->checked : false;
+}
+
+bool MacMenu::getCheckMark(const Common::String &menuId, const Common::String &itemId) {
+	MacMenuItem *item = findMenuItem(menuId, itemId);
+
+	return item ? item->checked : false;
+}
+
+bool MacMenu::getEnabled(int menuId, int itemId) {
+	MacMenuItem *item = findMenuItem(menuId, itemId);
+
+	return item ? item->enabled : false;
+}
+
+bool MacMenu::getEnabled(const Common::String &menuId, const Common::String &itemId) {
+	MacMenuItem *item = findMenuItem(menuId, itemId);
+
+	return item ? item->enabled : false;
+}
+
+Common::String MacMenu::getName(int menuId, int itemId) {
+	MacMenuItem *item = findMenuItem(menuId, itemId);
+
+	return item ? item->text : Common::String();
+}
+
+Common::String MacMenu::getName(const Common::String &menuId, const Common::String &itemId) {
+	MacMenuItem *item = findMenuItem(menuId, itemId);
+
+	return item ? item->text : Common::String();
+}
+
+int MacMenu::getAction(int menuId, int itemId) {
+	MacMenuItem *item = findMenuItem(menuId, itemId);
+
+	return item ? item->action : 0;
+}
+
+int MacMenu::getAction(const Common::String &menuId, const Common::String &itemId) {
+	MacMenuItem *item = findMenuItem(menuId, itemId);
+
+	return item ? item->action : 0;
+}
+
 MacMenuItem *MacMenu::findMenuItem(const Common::String &menuId, const Common::String &itemId) {
 	// TODO: support arbitrary level menu item finding
 	// only support 2 level finding now.
diff --git a/graphics/macgui/macmenu.h b/graphics/macgui/macmenu.h
index 16900fc605..3c7cb58367 100644
--- a/graphics/macgui/macmenu.h
+++ b/graphics/macgui/macmenu.h
@@ -97,14 +97,26 @@ public:
 
 	bool checkIntersects(Common::Rect &rect);
 
+	// macmenuItem operations
 	void setCheckMark(const Common::String &menuId, const Common::String &itemId, bool checkMark);
 	void setCheckMark(int menuId, int itemId, bool checkMark);
+	bool getCheckMark(const Common::String &menuId, const Common::String &itemId);
+	bool getCheckMark(int menuId, int itemId);
+
 	void setEnabled(const Common::String &menuId, const Common::String &itemId, bool enabled);
 	void setEnabled(int menuId, int itemId, bool enabled);
+	bool getEnabled(const Common::String &menuId, const Common::String &itemId);
+	bool getEnabled(int menuId, int itemId);
+
 	void setName(const Common::String &menuId, const Common::String &itemId, const Common::String &name);
 	void setName(int menuId, int itemId, const Common::String &name);
+	Common::String getName(const Common::String &menuId, const Common::String &itemId);
+	Common::String getName(int menuId, int itemId);
+
 	void setAction(const Common::String &menuId, const Common::String &itemId, int actionId);
 	void setAction(int menuId, int itemId, int actionId);
+	int getAction(const Common::String &menuId, const Common::String &itemId);
+	int getAction(int menuId, int itemId);
 
 	Common::Rect _bbox;
 
diff --git a/graphics/macgui/macwindowmanager.cpp b/graphics/macgui/macwindowmanager.cpp
index fc26839637..dd5c060978 100644
--- a/graphics/macgui/macwindowmanager.cpp
+++ b/graphics/macgui/macwindowmanager.cpp
@@ -490,6 +490,78 @@ void MacWindowManager::setMenuItemAction(int menuId, int itemId, int actionId) {
 	}
 }
 
+bool MacWindowManager::getMenuItemCheckMark(const Common::String &menuId, const Common::String &itemId) {
+	if (_menu) {
+		return _menu->getCheckMark(menuId, itemId);
+	} else {
+		warning("MacWindowManager::getMenuItemCheckMark: wm doesn't have menu");
+		return false;
+	}
+}
+
+bool MacWindowManager::getMenuItemCheckMark(int menuId, int itemId) {
+	if (_menu) {
+		return _menu->getCheckMark(menuId, itemId);
+	} else {
+		warning("MacWindowManager::getMenuItemCheckMark: wm doesn't have menu");
+		return false;
+	}
+}
+
+bool MacWindowManager::getMenuItemEnabled(const Common::String &menuId, const Common::String &itemId) {
+	if (_menu) {
+		return _menu->getEnabled(menuId, itemId);
+	} else {
+		warning("MacWindowManager::getMenuItemEnabled: wm doesn't have menu");
+		return false;
+	}
+}
+
+bool MacWindowManager::getMenuItemEnabled(int menuId, int itemId) {
+	if (_menu) {
+		return _menu->getEnabled(menuId, itemId);
+	} else {
+		warning("MacWindowManager::getMenuItemEnabled: wm doesn't have menu");
+		return false;
+	}
+}
+
+Common::String MacWindowManager::getMenuItemName(const Common::String &menuId, const Common::String &itemId) {
+	if (_menu) {
+		return _menu->getName(menuId, itemId);
+	} else {
+		warning("MacWindowManager::getMenuItemName: wm doesn't have menu");
+		return Common::String();
+	}
+}
+
+Common::String MacWindowManager::getMenuItemName(int menuId, int itemId) {
+	if (_menu) {
+		return _menu->getName(menuId, itemId);
+	} else {
+		warning("MacWindowManager::getMenuItemName: wm doesn't have menu");
+		return Common::String();
+	}
+}
+
+int MacWindowManager::getMenuItemAction(const Common::String &menuId, const Common::String &itemId) {
+	if (_menu) {
+		return _menu->getAction(menuId, itemId);
+	} else {
+		warning("MacWindowManager::getMenuItemAction: wm doesn't have menu");
+		return 0;
+	}
+}
+
+int MacWindowManager::getMenuItemAction(int menuId, int itemId) {
+	if (_menu) {
+		return _menu->getAction(menuId, itemId);
+	} else {
+		warning("MacWindowManager::getMenuItemAction: wm doesn't have menu");
+		return 0;
+	}
+}
+
 // this is refer to how we deal U32String in splitString in mactext
 // maybe we can optimize this specifically
 Common::U32String stripFormat(const Common::U32String &str) {
diff --git a/graphics/macgui/macwindowmanager.h b/graphics/macgui/macwindowmanager.h
index 9eaac3d0be..80c6c1117d 100644
--- a/graphics/macgui/macwindowmanager.h
+++ b/graphics/macgui/macwindowmanager.h
@@ -335,14 +335,23 @@ public:
 	void clearHandlingWidgets();
 
 	void setMenuItemCheckMark(const Common::String &menuId, const Common::String &itemId, bool checkMark);
-	void setMenuItemEnabled(const Common::String &menuId, const Common::String &itemId, bool enabled);
-	void setMenuItemName(const Common::String &menuId, const Common::String &itemId, const Common::String &name);
 	void setMenuItemCheckMark(int menuId, int itemId, bool checkMark);
+	void setMenuItemEnabled(const Common::String &menuId, const Common::String &itemId, bool enabled);
 	void setMenuItemEnabled(int menuId, int itemId, bool enabled);
+	void setMenuItemName(const Common::String &menuId, const Common::String &itemId, const Common::String &name);
 	void setMenuItemName(int menuId, int itemId, const Common::String &name);
 	void setMenuItemAction(const Common::String &menuId, const Common::String &itemId, int actionId);
 	void setMenuItemAction(int menuId, int itemId, int actionId);
 
+	bool getMenuItemCheckMark(const Common::String &menuId, const Common::String &itemId);
+	bool getMenuItemCheckMark(int menuId, int itemId);
+	bool getMenuItemEnabled(const Common::String &menuId, const Common::String &itemId);
+	bool getMenuItemEnabled(int menuId, int itemId);
+	Common::String getMenuItemName(const Common::String &menuId, const Common::String &itemId);
+	Common::String getMenuItemName(int menuId, int itemId);
+	int getMenuItemAction(const Common::String &menuId, const Common::String &itemId);
+	int getMenuItemAction(int menuId, int itemId);
+
 public:
 	MacFontManager *_fontMan;
 	uint32 _mode;


Commit: 0bc678e47b71ec7f27167002e417d3546068ea47
    https://github.com/scummvm/scummvm/commit/0bc678e47b71ec7f27167002e417d3546068ea47
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-30T15:43:16+08:00

Commit Message:
DIRECTOR: implement getTheMenuItemEntity

Changed paths:
    engines/director/lingo/lingo-the.cpp


diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 5e2994938c..e6aacdbd99 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -1100,10 +1100,57 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
 }
 
 Datum Lingo::getTheMenuItemEntity(int entity, Datum &menuId, int field, Datum &menuItemId) {
-	warning("STUB: getTheMenuItemEntity(%s, %s, %s, %s)", entity2str(entity), menuId.asString(true).c_str(), field2str(field),
-				menuItemId.asString(true).c_str());
+	Datum d;
 
-	return Datum();
+	switch(field) {
+	case kTheCheckMark:
+		if (menuId.type == STRING && menuItemId.type == STRING) {
+			d.type = INT;
+			d.u.i = g_director->_wm->getMenuItemCheckMark(menuId.asString(), menuItemId.asString());
+		} else if (menuId.type == INT && menuItemId.type == INT) {
+			d.type = INT;
+			d.u.i = g_director->_wm->getMenuItemCheckMark(menuId.asInt(), menuItemId.asInt());
+		} else
+			warning("Lingo::getTheMenuItemEntity(): Unprocessed setting field \"%s\" of entity %s", field2str(field), entity2str(entity));
+		break;
+	case kTheEnabled:
+		if (menuId.type == STRING && menuItemId.type == STRING) {
+			d.type = INT;
+			d.u.i = g_director->_wm->getMenuItemEnabled(menuId.asString(), menuItemId.asString());
+		} else if (menuId.type == INT && menuItemId.type == INT) {
+			d.type = INT;
+			d.u.i = g_director->_wm->getMenuItemEnabled(menuId.asInt(), menuItemId.asInt());
+		} else
+			warning("Lingo::getTheMenuItemEntity(): Unprocessed setting field \"%s\" of entity %s", field2str(field), entity2str(entity));
+		break;
+	case kTheName:
+		if (menuId.type == STRING && menuItemId.type == STRING) {
+			d.type = STRING;
+			d.u.s = new Common::String;
+			*(d.u.s) = g_director->_wm->getMenuItemName(menuId.asString(), menuItemId.asString());
+		} else if (menuId.type == INT && menuItemId.type == INT) {
+			d.type = STRING;
+			d.u.s = new Common::String;
+			*(d.u.s) = g_director->_wm->getMenuItemName(menuId.asInt(), menuItemId.asInt());
+		} else
+			warning("Lingo::getTheMenuItemEntity(): Unprocessed setting field \"%s\" of entity %s", field2str(field), entity2str(entity));
+		break;
+	case kTheScript:
+		if (menuId.type == STRING && menuItemId.type == STRING) {
+			d.type = INT;
+			d.u.i = g_director->_wm->getMenuItemAction(menuId.asString(), menuItemId.asString());
+		} else if (menuId.type == INT && menuItemId.type == INT) {
+			d.type = INT;
+			d.u.i = g_director->_wm->getMenuItemAction(menuId.asInt(), menuItemId.asInt());
+		} else
+			warning("Lingo::getTheMenuItemEntity(): Unprocessed setting field \"%s\" of entity %s", field2str(field), entity2str(entity));
+		break;
+	default:
+		warning("Lingo::getTheMenuItemEntity(): Unprocessed setting field \"%s\" of entity %s", field2str(field), entity2str(entity));
+		break;
+	}
+
+	return d;
 }
 
 void Lingo::setTheMenuItemEntity(int entity, Datum &menuId, int field, Datum &menuItemId, Datum &d) {


Commit: a33ca9d8316b5bf2cd40124b4f8aeddd2c3d9cfe
    https://github.com/scummvm/scummvm/commit/a33ca9d8316b5bf2cd40124b4f8aeddd2c3d9cfe
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-30T16:00:01+08:00

Commit Message:
DIRECTOR: amend coding format

Changed paths:
    engines/director/lingo/lingo-the.cpp


diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index e6aacdbd99..68ccb19f99 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -1154,10 +1154,6 @@ Datum Lingo::getTheMenuItemEntity(int entity, Datum &menuId, int field, Datum &m
 }
 
 void Lingo::setTheMenuItemEntity(int entity, Datum &menuId, int field, Datum &menuItemId, Datum &d) {
-	// only used in kTheScript
-	LingoArchive *mainArchive = g_director->getCurrentMovie()->getMainLingoArch();
-	int commandId = 100;
-
 	switch(field) {
 	case kTheCheckMark:
 		if (menuId.type == STRING && menuItemId.type == STRING)
@@ -1184,16 +1180,20 @@ void Lingo::setTheMenuItemEntity(int entity, Datum &menuId, int field, Datum &me
 			warning("Lingo::setTheMenuItemEntity(): Unprocessed setting field \"%s\" of entity %s", field2str(field), entity2str(entity));
 		break;
 	case kTheScript:
-		while (mainArchive->getScriptContext(kEventScript, commandId))
-			commandId++;
-		mainArchive->addCode(d.asString(), kEventScript, commandId);
-
-		if (menuId.type == STRING && menuItemId.type == STRING)
-			g_director->_wm->setMenuItemAction(menuId.asString(), menuItemId.asString(), commandId);
-		else if (menuId.type == INT && menuItemId.type == INT)
-			g_director->_wm->setMenuItemAction(menuId.asInt() - 1, menuItemId.asInt() - 1, commandId);
-		else
-			warning("Lingo::setTheMenuItemEntity(): Unprocessed setting field \"%s\" of entity %s", field2str(field), entity2str(entity));
+		{
+			LingoArchive *mainArchive = g_director->getCurrentMovie()->getMainLingoArch();
+			int commandId = 100;
+			while (mainArchive->getScriptContext(kEventScript, commandId))
+				commandId++;
+			mainArchive->addCode(d.asString(), kEventScript, commandId);
+
+			if (menuId.type == STRING && menuItemId.type == STRING)
+				g_director->_wm->setMenuItemAction(menuId.asString(), menuItemId.asString(), commandId);
+			else if (menuId.type == INT && menuItemId.type == INT)
+				g_director->_wm->setMenuItemAction(menuId.asInt() - 1, menuItemId.asInt() - 1, commandId);
+			else
+				warning("Lingo::setTheMenuItemEntity(): Unprocessed setting field \"%s\" of entity %s", field2str(field), entity2str(entity));
+		}
 		break;
 	default:
 		warning("Lingo::setTheMenuItemEntity(): Unprocessed setting field \"%s\" of entity %s", field2str(field), entity2str(entity));


Commit: b1f5de35016a3a26494ba6886f6017144b450f84
    https://github.com/scummvm/scummvm/commit/b1f5de35016a3a26494ba6886f6017144b450f84
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-30T16:25:51+08:00

Commit Message:
GRAPHICS: MACGUI: implement mouseChar

Changed paths:
    graphics/macgui/mactext.cpp
    graphics/macgui/mactext.h


diff --git a/graphics/macgui/mactext.cpp b/graphics/macgui/mactext.cpp
index 01c4771e8f..789e8ed669 100644
--- a/graphics/macgui/mactext.cpp
+++ b/graphics/macgui/mactext.cpp
@@ -1884,6 +1884,24 @@ void MacText::updateTextSelection(int x, int y) {
 	_contentIsDirty = true;
 }
 
+int MacText::getMouseChar(int x, int y) {
+	Common::Point offset = calculateOffset();
+	x -= getDimensions().left - offset.x;
+	y -= getDimensions().top - offset.y;
+
+	y += _scrollPos;
+	int dx, dy, row, col;
+
+	getRowCol(x, y, &dx, &dy, &row, &col);
+
+	int index = 0;
+	for (int r = 0; r < row; r++)
+		index += getLineCharWidth(r);
+
+	index += col;
+	return index + 1;
+}
+
 int MacText::getAlignOffset(int row) {
 	int alignOffset = 0;
 	if (_textAlignment == kTextAlignRight)
@@ -1903,7 +1921,7 @@ void MacText::getRowCol(int x, int y, int *sx, int *sy, int *row, int *col) {
 	y = CLIP(y, 0, _textMaxHeight);
 
 	nrow = _textLines.size();
-	// use [lb, ub) bsearch here, final anser would we lb
+	// use [lb, ub) bsearch here, final answer would be lb
 	int lb = 0, ub = nrow;
 	while (ub - lb > 1) {
 		int mid = (ub + lb) / 2;
diff --git a/graphics/macgui/mactext.h b/graphics/macgui/mactext.h
index fc1e9ce7e1..3a6ee2857f 100644
--- a/graphics/macgui/mactext.h
+++ b/graphics/macgui/mactext.h
@@ -212,6 +212,8 @@ public:
 	int getTextSlant(int start, int end);
 	void setTextSlant(int textSlant, int start, int end);
 
+	int getMouseChar(int x, int y);
+
 private:
 	MacFontRun getTextChunks(int start, int end);
 	void setTextChunks(int start, int end, int param, void (*callback)(MacFontRun &, int));


Commit: 928e76538fabfbbb36e31f46c20b0c23644c362b
    https://github.com/scummvm/scummvm/commit/928e76538fabfbbb36e31f46c20b0c23644c362b
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-30T16:26:36+08:00

Commit Message:
DIRECTOR: implement getting the MouseChar

Changed paths:
    engines/director/channel.cpp
    engines/director/channel.h
    engines/director/lingo/lingo-the.cpp


diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index 7ce2034d65..3d901ce8ec 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -608,6 +608,18 @@ void Channel::addDelta(Common::Point pos) {
 	_delta += pos;
 }
 
+int Channel::getMouseChar(int x, int y) {
+	if (_sprite->_spriteType != kTextSprite)
+		return -1;
+
+	if (!_widget) {
+		warning("Channel::getMouseChar getting mouse char on a non-existing widget");
+		return -1;
+	}
+
+	return ((Graphics::MacText *)_widget)->getMouseChar(x, y);
+}
+
 Common::Point Channel::getPosition() {
 	Common::Point res = _currentPoint;
 	addRegistrationOffset(res);
diff --git a/engines/director/channel.h b/engines/director/channel.h
index 557facf3b4..c07d5c5ee5 100644
--- a/engines/director/channel.h
+++ b/engines/director/channel.h
@@ -72,6 +72,8 @@ public:
 	bool canKeepWidget(CastMemberID castId);
 	bool canKeepWidget(Sprite *currentSprite, Sprite *nextSprite);
 
+	int getMouseChar(int x, int y);
+
 public:
 	Sprite *_sprite;
 	Cursor _cursor;
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 68ccb19f99..580213b765 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -608,7 +608,14 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 		}
 		break;
 	case kTheMouseChar:
-		getTheEntitySTUB(kTheMouseChar);
+		{
+			// maybe a better handling is iterate channels and check the text sprite that enclose the cursor
+			Common::Point pos = g_director->getCurrentWindow()->getMousePos();
+			uint16 spriteId = score->getSpriteIDFromPos(pos);
+			Channel *ch = score->getChannelById(spriteId);
+			d.u.i = ch->getMouseChar(pos.x, pos.y);
+			d.type = INT;
+		}
 		break;
 	case kTheMouseDown:
 		d.type = INT;


Commit: 87cd99126a2a7a07fb67b3f8b164bbd1173f7221
    https://github.com/scummvm/scummvm/commit/87cd99126a2a7a07fb67b3f8b164bbd1173f7221
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-30T16:38:15+08:00

Commit Message:
GRAPHICS: MACGUI: implement getMouseWord

Changed paths:
    graphics/macgui/mactext.cpp
    graphics/macgui/mactext.h


diff --git a/graphics/macgui/mactext.cpp b/graphics/macgui/mactext.cpp
index 789e8ed669..5e5f9ccfdb 100644
--- a/graphics/macgui/mactext.cpp
+++ b/graphics/macgui/mactext.cpp
@@ -1888,17 +1888,48 @@ int MacText::getMouseChar(int x, int y) {
 	Common::Point offset = calculateOffset();
 	x -= getDimensions().left - offset.x;
 	y -= getDimensions().top - offset.y;
-
 	y += _scrollPos;
-	int dx, dy, row, col;
 
+	int dx, dy, row, col;
 	getRowCol(x, y, &dx, &dy, &row, &col);
 
 	int index = 0;
 	for (int r = 0; r < row; r++)
 		index += getLineCharWidth(r);
-
 	index += col;
+
+	return index + 1;
+}
+
+int MacText::getMouseWord(int x, int y) {
+	Common::Point offset = calculateOffset();
+	x -= getDimensions().left - offset.x;
+	y -= getDimensions().top - offset.y;
+	y += _scrollPos;
+
+	int dx, dy, row, col;
+	getRowCol(x, y, &dx, &dy, &row, &col);
+
+	int index = 0;
+	for (int i = 0; i < row; i++) {
+		for (uint j = 0; j < _textLines[i].chunks.size(); j++) {
+			if (_textLines[i].chunks[j].text.empty())
+				continue;
+			index++;
+		}
+	}
+
+	int cur = 0;
+	for (uint j = 0; j < _textLines[row].chunks.size(); j++) {
+		if (_textLines[row].chunks[j].text.empty())
+			continue;
+		cur += _textLines[row].chunks[j].text.size();
+		if (cur <= col)
+			index++;
+		else
+			break;
+	}
+
 	return index + 1;
 }
 
diff --git a/graphics/macgui/mactext.h b/graphics/macgui/mactext.h
index 3a6ee2857f..19b278b928 100644
--- a/graphics/macgui/mactext.h
+++ b/graphics/macgui/mactext.h
@@ -213,6 +213,7 @@ public:
 	void setTextSlant(int textSlant, int start, int end);
 
 	int getMouseChar(int x, int y);
+	int getMouseWord(int x, int y);
 
 private:
 	MacFontRun getTextChunks(int start, int end);


Commit: ab1e526c1ec2ca4533c83fcb81e54ac5a8781b5f
    https://github.com/scummvm/scummvm/commit/ab1e526c1ec2ca4533c83fcb81e54ac5a8781b5f
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-30T16:38:31+08:00

Commit Message:
DIRECTOR: implement getting the MouseWord

Changed paths:
    engines/director/channel.cpp
    engines/director/channel.h
    engines/director/lingo/lingo-the.cpp


diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index 3d901ce8ec..ef36130271 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -620,6 +620,18 @@ int Channel::getMouseChar(int x, int y) {
 	return ((Graphics::MacText *)_widget)->getMouseChar(x, y);
 }
 
+int Channel::getMouseWord(int x, int y) {
+	if (_sprite->_spriteType != kTextSprite)
+		return -1;
+
+	if (!_widget) {
+		warning("Channel::getMouseWord getting mouse char on a non-existing widget");
+		return -1;
+	}
+
+	return ((Graphics::MacText *)_widget)->getMouseWord(x, y);
+}
+
 Common::Point Channel::getPosition() {
 	Common::Point res = _currentPoint;
 	addRegistrationOffset(res);
diff --git a/engines/director/channel.h b/engines/director/channel.h
index c07d5c5ee5..d82e6a864b 100644
--- a/engines/director/channel.h
+++ b/engines/director/channel.h
@@ -73,6 +73,7 @@ public:
 	bool canKeepWidget(Sprite *currentSprite, Sprite *nextSprite);
 
 	int getMouseChar(int x, int y);
+	int getMouseWord(int x, int y);
 
 public:
 	Sprite *_sprite;
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 580213b765..656abd1cad 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -654,7 +654,14 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 		d.u.i = g_director->getCurrentWindow()->getMousePos().y;
 		break;
 	case kTheMouseWord:
-		getTheEntitySTUB(kTheMouseWord);
+		{
+			// same issue as MouseChar, check MouseChar above
+			Common::Point pos = g_director->getCurrentWindow()->getMousePos();
+			uint16 spriteId = score->getSpriteIDFromPos(pos);
+			Channel *ch = score->getChannelById(spriteId);
+			d.u.i = ch->getMouseWord(pos.x, pos.y);
+			d.type = INT;
+		}
 		break;
 	case kTheMovie:
 	case kTheMovieName:




More information about the Scummvm-git-logs mailing list