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

sev- noreply at scummvm.org
Tue Jul 1 23:22:16 UTC 2025


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

Summary:
ed7019f977 DIRECTOR: LINGO: Implement b_scrollByLine
fc4c476846 DIRECTOR: Add kidstorypirate and kidstorymilly to detection table
7457efc15b DIRECTOR: Fix issue where repl broke breakpoints
7e44dd6768 DIRECTOR: XTRA: Make Rtk multi-window aware
ab93d1314a DIRECTOR: LINGO: Improve accuracy of resolving sprite event handlers


Commit: ed7019f97744db39e79b6f91b9575e6b8d6159e6
    https://github.com/scummvm/scummvm/commit/ed7019f97744db39e79b6f91b9575e6b8d6159e6
Author: Scott Percival (code at moral.net.au)
Date: 2025-07-02T01:22:11+02:00

Commit Message:
DIRECTOR: LINGO: Implement b_scrollByLine

Changed paths:
    engines/director/castmember/text.cpp
    engines/director/castmember/text.h
    engines/director/lingo/lingo-builtins.cpp


diff --git a/engines/director/castmember/text.cpp b/engines/director/castmember/text.cpp
index 4466f3f3a2d..4da9ee5eb11 100644
--- a/engines/director/castmember/text.cpp
+++ b/engines/director/castmember/text.cpp
@@ -560,6 +560,11 @@ void TextCastMember::setTextStyle(const Common::String &textStyle) {
 	_modified = true;
 }
 
+void TextCastMember::scrollByLine(int count) {
+	Graphics::MacText *target = getWidget();
+	target->scroll(count);
+}
+
 void TextCastMember::setTextStyle(const Common::String &textStyle, int start, int end) {
 	Graphics::MacText *target = getWidget();
 	int slant = g_director->_wm->_fontMan->parseSlantFromName(textStyle);
diff --git a/engines/director/castmember/text.h b/engines/director/castmember/text.h
index c6cd8302f61..21319deaf7a 100644
--- a/engines/director/castmember/text.h
+++ b/engines/director/castmember/text.h
@@ -85,6 +85,8 @@ public:
 	void setTextStyle(const Common::String &textStyle);
 	void setTextStyle(const Common::String &textStyle, int start, int end);
 
+	void scrollByLine(int count);
+
 	Common::String formatInfo() override;
 
 	void load() override;
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index bcae8992485..f2c1f5723cd 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -3674,8 +3674,20 @@ void LB::b_locVToLinePos(int nargs) {
 }
 
 void LB::b_scrollByLine(int nargs) {
-	g_lingo->printSTUBWithArglist("b_scrollByLine", nargs);
-	g_lingo->dropStack(nargs);
+	ARGNUMCHECK(2);
+	Datum count = g_lingo->pop();
+	Datum member = g_lingo->pop();
+	CastMemberID id = member.asMemberID();
+	Movie *movie = g_director->getCurrentMovie();
+	CastMember *cast = movie->getCastMember(id);
+	if (!cast) {
+		g_lingo->lingoError("b_scrollByLine: Could not resolve cast member %s", id.asString().c_str());
+	} else if (cast->_type != kCastText) {
+		g_lingo->lingoError("b_scrollByLine: Expected cast member %s to be text, got %s", id.asString().c_str(), castType2str(cast->_type));
+	} else {
+		((TextCastMember *)cast)->scrollByLine(count.asInt());
+	}
+
 }
 
 void LB::b_scrollByPage(int nargs) {


Commit: fc4c476846be0613f38df65e9f51dd0f1fe9ad28
    https://github.com/scummvm/scummvm/commit/fc4c476846be0613f38df65e9f51dd0f1fe9ad28
Author: Scott Percival (code at moral.net.au)
Date: 2025-07-02T01:22:11+02:00

Commit Message:
DIRECTOR: Add kidstorypirate and kidstorymilly to detection table

Changed paths:
    engines/director/detection_tables.h


diff --git a/engines/director/detection_tables.h b/engines/director/detection_tables.h
index 99270f01974..0b345aa7397 100644
--- a/engines/director/detection_tables.h
+++ b/engines/director/detection_tables.h
@@ -294,6 +294,8 @@ static const PlainGameDescriptor directorGames[] = {
 	{ "kidsbiblejlife",		"Interactive Bible for Kids: The Life and Ministry of Jesus" },
 	{ "kidsbiblemoses",		"Interactive Bible for Kids: The Life of Moses" },
 	{ "kidsbiblepaul",		"Interactive Bible for Kids: The Life of Paul" },
+	{ "kidstorypirate",		"The Kidstory Series: The Pirate Who Wouldn't Wash" },
+	{ "kidstorymilly",		"The Kidstory Series: Milly Fitzwilly's Mouse Catcher" },
 	{ "kingandi",			"The King and I: Animated Thinking Adventure" },
 	{ "korkydragons",		"Dragons!" },
 	{ "kothhoot",			"King of the Hill: Hootenany" },
@@ -4882,6 +4884,11 @@ static const DirectorGameDescription gameDescriptions[] = {
 
 	WINGAME1("kidtools", "", "DEMO.EXE", "da65c64d0821c0d689f8a3ead9301a2a", 15606953, 400),
 
+	WINGAME2("kidstorypirate", "", "PIRATE.EXE", "t:9f557eeb3322d61feb4e11251bbf85c9", 3570593,
+									"C01.DXR", "d:3430a236538e856eca98885407063a22", 810064, 404),
+	WINGAME2("kidstorymilly", "", "MILLY.EXE", "t:9f557eeb3322d61feb4e11251bbf85c9", 3570593,
+			                      "D01.DXR", "d:e3467d46a301f7974c7f128617e1cbe4", 1350746, 404),
+
 	// Original Mac filename is Kinder-Kitâ„¢
 	MACGAME1_l("kinderkit", "", "xn--Kinder-Kit-398e", "r:bcd3c718db258701496b3c5bcb827ef2", 483518, Common::PT_BRA, 404),
 	WINGAME1_l("kinderkit", "", "KKIT.EXE",			   "t:87ecfa89c0a78bedd277930c267dd07d", 862425, Common::PT_BRA, 404),


Commit: 7457efc15bf97f5d5c61820f3633256ba66c25fa
    https://github.com/scummvm/scummvm/commit/7457efc15bf97f5d5c61820f3633256ba66c25fa
Author: Scott Percival (code at moral.net.au)
Date: 2025-07-02T01:22:11+02:00

Commit Message:
DIRECTOR: Fix issue where repl broke breakpoints

Changed paths:
    engines/director/debugger.cpp


diff --git a/engines/director/debugger.cpp b/engines/director/debugger.cpp
index 0a8641a8155..134335863d5 100644
--- a/engines/director/debugger.cpp
+++ b/engines/director/debugger.cpp
@@ -1190,6 +1190,7 @@ bool Debugger::lingoEval(const char *inputOrig) {
 	_lingoEval = true;
 	LC::call(sym, 0, true);
 	g_lingo->execute();
+	_lingoEval = false;
 
 	debugPrintf("\n");
 	return true;


Commit: 7e44dd67680f767102b59b6766d1a7abf1871ff8
    https://github.com/scummvm/scummvm/commit/7e44dd67680f767102b59b6766d1a7abf1871ff8
Author: Scott Percival (code at moral.net.au)
Date: 2025-07-02T01:22:11+02:00

Commit Message:
DIRECTOR: XTRA: Make Rtk multi-window aware

Fixes glitching in Cracking the Conspiracy.

Changed paths:
    engines/director/lingo/xtras/rtk.cpp


diff --git a/engines/director/lingo/xtras/rtk.cpp b/engines/director/lingo/xtras/rtk.cpp
index 0e2acf1ee8c..bcb1714af88 100644
--- a/engines/director/lingo/xtras/rtk.cpp
+++ b/engines/director/lingo/xtras/rtk.cpp
@@ -119,7 +119,7 @@ class RolloverToolkitXtraState : public Object<RolloverToolkitXtraState> {
 public:
 	RolloverToolkitXtraState() : Object<RolloverToolkitXtraState>("Rollover_Toolkit") {};
 
-	int lastSprite = 0;
+	Common::HashMap<int, int> lastSprite;
 };
 
 RolloverToolkitXtraObject::RolloverToolkitXtraObject(ObjectType ObjectType) :Object<RolloverToolkitXtraObject>("RolloverToolkit") {
@@ -172,7 +172,8 @@ void RolloverToolkitXtra::m_CheckForRollovers(int nargs) {
 	// if it's new
 	//  - check if there's an on endRollover handler, provide old sprite as arg 1
 	//	- check if there's a on startRollover handler, provide new sprite as arg 1
-	Movie *movie = g_director->getCurrentMovie();
+	Window *window = g_director->getCurrentWindow();
+	Movie *movie = window->getCurrentMovie();
 	Score *score = movie->getScore();
 
 	if (!score) {
@@ -188,7 +189,8 @@ void RolloverToolkitXtra::m_CheckForRollovers(int nargs) {
 
 
 	Common::Point pos = g_director->getCurrentWindow()->getMousePos();
-	int lastSprite = state->lastSprite;
+	int lastSprite = state->lastSprite.getValOrDefault(window->getId(), 0);
+
 	int newSprite = score->getRollOverSpriteIDFromPos(pos);
 	if (newSprite != lastSprite && lastSprite != 0) {
 		// try and call endRollover(lastSprite)
@@ -198,7 +200,7 @@ void RolloverToolkitXtra::m_CheckForRollovers(int nargs) {
 		// try and call startRollover(lastSprite)
 		movie->queueInputEvent(kEventMouseEnter, newSprite, pos);
 	}
-	state->lastSprite = newSprite;
+	state->lastSprite[window->getId()] = newSprite;
 }
 
 


Commit: ab93d1314acca00014da2b6ed8d756bafb160464
    https://github.com/scummvm/scummvm/commit/ab93d1314acca00014da2b6ed8d756bafb160464
Author: Scott Percival (code at moral.net.au)
Date: 2025-07-02T01:22:11+02:00

Commit Message:
DIRECTOR: LINGO: Improve accuracy of resolving sprite event handlers

When resolving a mouseUp event handler, the sprite that should be
checked for a handler is the one identified during the earlier mouseDown event.

Fixes the DNA safe puzzle in Cracking the Conspiracy.
Fixes the buttons in first-person navigation mode in P.A.W.S.

Changed paths:
    engines/director/lingo/lingo-events.cpp
    engines/director/movie.h


diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index d71d8afa8db..45f75155e05 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -166,13 +166,16 @@ void Movie::resolveScriptEvent(LingoEvent &event) {
 				// change the cast member underneath. on mouseUp should always load the cast
 				// script for the original cast member, not the new one.
 				_currentMouseDownCastID = _score->_channels[event.channelId]->_sprite->_castId;
-
+				_currentMouseDownSpriteScriptID = _score->_channels[event.channelId]->_sprite->_scriptId;
+				_currentMouseDownSpriteImmediate = _score->_channels[event.channelId]->_sprite->_immediate;
 			} else {
 				_currentHiliteChannelId = 0;
 				_mouseDownWasInButton = false;
 				_draggingSpriteOffset = Common::Point(0, 0);
 				_currentDraggedChannel = nullptr;
 				_currentMouseDownCastID = CastMemberID();
+				_currentMouseDownSpriteScriptID = CastMemberID();
+				_currentMouseDownSpriteImmediate = false;
 			}
 
 		} else if ((event.event == kEventMouseUp) || (event.event == kEventRightMouseUp)) {
@@ -228,30 +231,40 @@ void Movie::resolveScriptEvent(LingoEvent &event) {
 	 * [D4 docs] */
 	case kSpriteHandler:
 		{
-			if (!event.channelId)
-				return;
-			Frame *currentFrame = _score->_currentFrame;
-			assert(currentFrame != nullptr);
-			Sprite *sprite = _score->getSpriteById(event.channelId);
+			CastMemberID scriptId;
+			bool immediate = false;
+			// mouseUp events seem to check the frame script ID from the original mouseDown event
+			if ((event.event == kEventMouseUp) || (event.event == kEventRightMouseUp)) {
+				scriptId = _currentMouseDownSpriteScriptID;
+				immediate = _currentMouseDownSpriteImmediate;
+			} else {
+				if (!event.channelId)
+					return;
+				Frame *currentFrame = _score->_currentFrame;
+				assert(currentFrame != nullptr);
+				Sprite *sprite = _score->getSpriteById(event.channelId);
+				if (!sprite || !sprite->_scriptId.member)
+					return;
+				scriptId = sprite->_scriptId;
+				immediate = sprite->_immediate;
+			}
 
 			// Sprite (score) script
-			if (sprite && sprite->_scriptId.member) {
-				ScriptContext *script = getScriptContext(kScoreScript, sprite->_scriptId);
-				if (script) {
-					if (script->_eventHandlers.contains(event.event)) {
-						// D4-style event handler
+			ScriptContext *script = getScriptContext(kScoreScript, scriptId);
+			if (script) {
+				if (script->_eventHandlers.contains(event.event)) {
+					// D4-style event handler
+					event.scriptType = kScoreScript;
+					event.scriptId = scriptId;
+				} else if (script->_eventHandlers.contains(kEventGeneric)) {
+					// D3-style sprite script, not contained in a handler
+					// If sprite is immediate, its script is run on mouseDown, otherwise on mouseUp
+					if ((event.event == kEventMouseDown && immediate) || (event.event == kEventMouseUp && !immediate)) {
+						event.event = kEventGeneric;
 						event.scriptType = kScoreScript;
-						event.scriptId = sprite->_scriptId;
-					} else if (script->_eventHandlers.contains(kEventGeneric)) {
-						// D3-style sprite script, not contained in a handler
-						// If sprite is immediate, its script is run on mouseDown, otherwise on mouseUp
-						if ((event.event == kEventMouseDown && sprite->_immediate) || (event.event == kEventMouseUp && !sprite->_immediate)) {
-							event.event = kEventGeneric;
-							event.scriptType = kScoreScript;
-							event.scriptId = sprite->_scriptId;
-						}
-						return; // FIXME: Do not execute the cast script if there is a D3-style sprite script
+						event.scriptId = scriptId;
 					}
+					return; // FIXME: Do not execute the cast script if there is a D3-style sprite script
 				}
 			}
 		}
diff --git a/engines/director/movie.h b/engines/director/movie.h
index 22d9056195e..ab1c961fd48 100644
--- a/engines/director/movie.h
+++ b/engines/director/movie.h
@@ -151,6 +151,8 @@ public:
 	uint16 _currentActiveSpriteId;
 	uint16 _currentMouseSpriteId;
 	CastMemberID _currentMouseDownCastID;
+	CastMemberID _currentMouseDownSpriteScriptID;
+	bool _currentMouseDownSpriteImmediate;
 	uint16 _currentEditableTextChannel;
 	uint32 _lastEventTime;
 	uint32 _lastRollTime;




More information about the Scummvm-git-logs mailing list