[Scummvm-git-logs] scummvm master -> 4244c48d736796e872c6acc4fc74550b0fd3a1c5

sev- noreply at scummvm.org
Sun Oct 12 23:52:33 UTC 2025


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

Summary:
4244c48d73 DIRECTOR: LINGO: Stubbed the remaining D6 keywords. This completes the set


Commit: 4244c48d736796e872c6acc4fc74550b0fd3a1c5
    https://github.com/scummvm/scummvm/commit/4244c48d736796e872c6acc4fc74550b0fd3a1c5
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-10-13T01:51:27+02:00

Commit Message:
DIRECTOR: LINGO: Stubbed the remaining D6 keywords. This completes the set

Changed paths:
    engines/director/castmember/xtra.cpp
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-bytecode.cpp
    engines/director/lingo/lingo-events.cpp
    engines/director/lingo/lingo-the.cpp
    engines/director/lingo/lingo-the.h
    engines/director/types.h


diff --git a/engines/director/castmember/xtra.cpp b/engines/director/castmember/xtra.cpp
index 863f67755c0..7ebcee818b3 100644
--- a/engines/director/castmember/xtra.cpp
+++ b/engines/director/castmember/xtra.cpp
@@ -47,6 +47,7 @@ bool XtraCastMember::hasField(int field) {
 	case kTheCuePointNames:		// D6
 	case kTheCuePointTimes:		// D6
 	case kTheCurrentTime:		// D6
+	case kTheMediaBusy:			// D6, undocumented
 		return true;
 	default:
 		break;
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index f6bfb7c3709..c7606fbd9ed 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -96,7 +96,7 @@ static const BuiltinProto builtins[] = {
 	{ "getPos",			LB::b_getPos,		2, 2, 400, FBLTIN_LIST },	//			D4 f
 	{ "getProp",		LB::b_getProp,		2, 2, 400, FBLTIN_LIST },	//			D4 f
 	{ "getPropAt",		LB::b_getPropAt,	2, 2, 400, FBLTIN_LIST },	//			D4 f
-	{ "list",			LB::b_list,			-1, 0, 400, FBLTIN_LIST },	//			D4 f
+	{ "list",			LB::b_list,			-1,0, 400, FBLTIN_LIST },	//			D4 f
 	{ "listP",			LB::b_listP,		1, 1, 400, FBLTIN_LIST },	//			D4 f
 	{ "max",			LB::b_max,			-1,0, 400, FBLTIN_LIST },	//			D4 f
 	{ "min",			LB::b_min,			-1,0, 400, FBLTIN_LIST },	//			D4 f
@@ -122,14 +122,14 @@ static const BuiltinProto builtins[] = {
 	{ "xtra",			LB::b_xtra,			1, 1, 500, FBLTIN },	//				D5 f
 	// Control
 	{ "abort",			LB::b_abort,		0, 0, 400, CBLTIN },	//			D4 c
-	{ "cancelIdleLoad",	LB::b_cancelIdleLoad,1, 1, 500, CBLTIN },	//				D5 c
-	{ "call",			LB::b_call,			-1,0, 200, CBLTIN },	// 					D6 c
-	{ "callAncestor",	LB::b_callAncestor,	-1,0, 200, CBLTIN },	// 					D6 c
+	{ "cancelIdleLoad",	LB::b_cancelIdleLoad,1,1, 500, CBLTIN },	//				D5 c
+	{ "call",			LB::b_call,			-1,0, 600, CBLTIN },	// 					D6 c
+	{ "callAncestor",	LB::b_callAncestor,	-1,0, 600, CBLTIN },	// 					D6 c
 	{ "continue",		LB::b_continue,		0, 0, 200, CBLTIN },	// D2 c
 	{ "dontPassEvent",	LB::b_dontPassEvent,0, 0, 200, CBLTIN },	// D2 c
 	{ "delay",	 		LB::b_delay,		1, 1, 200, CBLTIN },	// D2 c
 	{ "do",		 		LB::b_do,			1, 1, 200, CBLTIN },	// D2 c
-	{ "finishIdleLoad",	LB::b_finishIdleLoad,1, 1, 500, CBLTIN },	//				D5 c
+	{ "finishIdleLoad",	LB::b_finishIdleLoad,1,1, 500, CBLTIN },	//				D5 c
 	{ "go",		 		LB::b_go,			1, 2, 200, CBLTIN },	// D2 c
 	{ "halt",	 		LB::b_halt,			0, 0, 400, CBLTIN },	//			D4 c
 	{ "idleLoadDone",	LB::b_idleLoadDone,	1, 1, 500, FBLTIN },	//				D5 f
@@ -138,7 +138,7 @@ static const BuiltinProto builtins[] = {
 	{ "pause",			LB::b_pause,		0, 0, 200, CBLTIN },	// D2 c
 	{ "play",			LB::b_play,			0, 2, 200, CBLTIN },	// D2 c
 	{ "playAccel",		LB::b_playAccel,	-1,0, 200, CBLTIN },	// D2
-		// play done													// D2
+		// play done												// D2
 	{ "preLoad",		LB::b_preLoad,		-1,0, 300, CBLTIN },	//		D3.1 c
 	{ "preLoadCast",	LB::b_preLoadCast,	-1,0, 300, CBLTIN },	//		D3.1 c
 	{ "preLoadMember",	LB::b_preLoadCast,	-1,0, 500, CBLTIN },	//				D5 c
@@ -146,13 +146,15 @@ static const BuiltinProto builtins[] = {
 	{ "quit",			LB::b_quit,			0, 0, 200, CBLTIN },	// D2 c
 	{ "restart",		LB::b_restart,		0, 0, 200, CBLTIN },	// D2 c
 	{ "return",			LB::b_return,		0, 1, 200, CBLTIN },	// D2 f
+	{ "send",			LB::b_call,			-1,0, 400, CBLTIN },	//			D4 c, undocumented
+	{ "sendAncestor",	LB::b_callAncestor,	-1,0, 400, CBLTIN },	//			D4 c, undocumented
 	{ "shutDown",		LB::b_shutDown,		0, 0, 200, CBLTIN },	// D2 c
 	{ "startTimer",		LB::b_startTimer,	0, 0, 200, CBLTIN },	// D2 c
 	{ "stopEvent",		LB::b_stopEvent,	0, 0, 600, CBLTIN },	//						D6 c
-		// when keyDown													// D2
-		// when mouseDown												// D2
-		// when mouseUp													// D2
-		// when timeOut													// D2
+		// when keyDown												// D2
+		// when mouseDown											// D2
+		// when mouseUp												// D2
+		// when timeOut												// D2
 	// Types
 	{ "factory",		LB::b_factory,		1, 1, 300, FBLTIN },	//		D3
 	{ "floatP",			LB::b_floatP,		1, 1, 300, FBLTIN },	//		D3
@@ -172,31 +174,31 @@ static const BuiltinProto builtins[] = {
 	{ "param",	 		LB::b_param,		1, 1, 400, FBLTIN },	//			D4 f
 	{ "printFrom",	 	LB::b_printFrom,	-1,0, 200, CBLTIN },	// D2 c
 	{ "put",			LB::b_put,			-1,0, 200, CBLTIN },	// D2
-		// set															// D2
+		// set														// D2
 	{ "setPref",		LB::b_setPref,		2, 2, 600, CBLTIN },	// 					D6 c
 	{ "showGlobals",	LB::b_showGlobals,	0, 0, 200, CBLTIN },	// D2 c
 	{ "showLocals",		LB::b_showLocals,	0, 0, 200, CBLTIN },	// D2 c
 	// Score
 	{ "constrainH",		LB::b_constrainH,	2, 2, 200, FBLTIN },	// D2 f
 	{ "constrainV",		LB::b_constrainV,	2, 2, 200, FBLTIN },	// D2 f
-	{ "copyToClipBoard",LB::b_copyToClipBoard,1,1, 400, CBLTIN }, //			D4 c
+	{ "copyToClipBoard",LB::b_copyToClipBoard,1,1,400, CBLTIN }, 	//			D4 c
 	{ "duplicate",		LB::b_duplicate,	1, 2, 400, CBLTIN },	//			D4 c
 	{ "editableText",	LB::b_editableText,	0, 0, 200, CBLTIN },	// D2
 	{ "erase",			LB::b_erase,		1, 1, 400, CBLTIN },	//			D4 c
 	{ "findEmpty",		LB::b_findEmpty,	1, 1, 400, FBLTIN },	//			D4 f
 		// go															// D2
-	{ "importFileInto",	LB::b_importFileInto,2, 2, 400, CBLTIN }, //			D4 c
+	{ "importFileInto",	LB::b_importFileInto,2,2, 400, CBLTIN },	//			D4 c
 	{ "installMenu",	LB::b_installMenu,	1, 1, 200, CBLTIN },	// D2 c
 	{ "label",			LB::b_label,		1, 1, 200, FBLTIN },	// D2 f
 	{ "marker",			LB::b_marker,		1, 1, 200, FBLTIN },	// D2 f
 	{ "move",			LB::b_move,			1, 2, 400, CBLTIN },	//			D4 c
-	{ "moveableSprite",	LB::b_moveableSprite,0, 0, 200, CBLTIN },// D2, FIXME: the field in D4+
-	{ "pasteClipBoardInto",LB::b_pasteClipBoardInto,1,1,400,CBLTIN },//		D4 c
-	{ "puppetPalette",	LB::b_puppetPalette, -1,0, 200, CBLTIN },// D2 c
+	{ "moveableSprite",	LB::b_moveableSprite,0, 0, 200, CBLTIN },	// D2, FIXME: the field in D4+
+	{ "pasteClipBoardInto",LB::b_pasteClipBoardInto,1,1,400,CBLTIN },//			D4 c
+	{ "puppetPalette",	LB::b_puppetPalette, -1,0, 200, CBLTIN },	// D2 c
 	{ "puppetSound",	LB::b_puppetSound,	-1,0, 200, CBLTIN },	// D2 c
 	{ "puppetSprite",	LB::b_puppetSprite,	-1,0, 200, CBLTIN },	// D2 c
 	{ "puppetTempo",	LB::b_puppetTempo,	1, 1, 200, CBLTIN },	// D2 c
-	{ "puppetTransition",LB::b_puppetTransition,-1,0,200, CBLTIN },// D2 c
+	{ "puppetTransition",LB::b_puppetTransition,-1,0,200, CBLTIN },	// D2 c
 	{ "ramNeeded",		LB::b_ramNeeded,	2, 2, 300, FBLTIN },	//		D3.1 f
 	{ "rollOver",		LB::b_rollOver,		1, 1, 200, FBLTIN },	// D2 f
 	{ "sendAllSprites",	LB::b_sendAllSprites,-1,0,600, CBLTIN },	// 					D6 c
@@ -208,11 +210,11 @@ static const BuiltinProto builtins[] = {
 	{ "unLoadMovie",	LB::b_unLoadMovie,	1, 1, 500, CBLTIN },	//				D5 c
 	{ "updateStage",	LB::b_updateStage,	0, 0, 200, CBLTIN },	// D2 c
 	{ "zoomBox",		LB::b_zoomBox,		-1,0, 200, CBLTIN },	// D2 c
-	{"immediateSprite", LB::b_immediateSprite, -1, 0, 200, CBLTIN}, // D2 c
+	{"immediateSprite", LB::b_immediateSprite,-1,0,200,CBLTIN },	// D2 c
 	// Score recording
 	{ "clearFrame",		LB::b_clearFrame,	0, 0, 500, CBLTIN },	//				D5 c
 	{ "deleteFrame",	LB::b_deleteFrame,	0, 0, 500, CBLTIN },	//				D5 c
-	{ "duplicateFrame",	LB::b_duplicateFrame,0, 0, 500, CBLTIN },	//				D5 c
+	{ "duplicateFrame",	LB::b_duplicateFrame,0,0, 500, CBLTIN },	//				D5 c
 	{ "insertFrame",	LB::b_insertFrame,	0, 0, 500, CBLTIN },	//				D5 c
 	{ "updateFrame",	LB::b_updateFrame,	0, 0, 500, CBLTIN },	//				D5 c
 	// Point
@@ -254,7 +256,7 @@ static const BuiltinProto builtins[] = {
 	{ "lineHeight",		LB::b_lineHeight,   2, 2, 500, FBLTIN },	//				D5 f
 	{ "linePosToLocV",	LB::b_linePosToLocV,2, 2, 500, FBLTIN },	//				D5 f
 	{ "locToCharPos",	LB::b_locToCharPos, 2, 2, 500, FBLTIN },	//				D5 f
-	{ "locVToLinePos",	LB::b_locVToLinePos, 2, 2, 500, FBLTIN },	//				D5 f
+	{ "locVToLinePos",	LB::b_locVToLinePos,2, 2, 500, FBLTIN },	//				D5 f
 	{ "scrollByLine",	LB::b_scrollByLine, 2, 2, 500, CBLTIN },	//				D5 c
 	{ "scrollByPage",	LB::b_scrollByPage, 2, 2, 500, CBLTIN },	//				D5 c
 	// Chunk operations
@@ -264,7 +266,7 @@ static const BuiltinProto builtins[] = {
 	{ "numberOfWords",	LB::b_numberofwords,1, 1, 300, FBLTIN },	//			D3 f
 	// Digital video operations
 	{ "trackCount",		LB::b_trackCount,	1, 1, 500, FBLTIN },	//				D5 f
-	{ "trackStartTime",	LB::b_trackStartTime,1, 1, 500, FBLTIN },	//				D5 f
+	{ "trackStartTime",	LB::b_trackStartTime,1,1, 500, FBLTIN },	//				D5 f
 	{ "trackStopTime",	LB::b_trackStopTime,1, 1, 500, FBLTIN },	//				D5 f
 	{ "trackType",		LB::b_trackType,	1, 1, 500, FBLTIN },	//				D5 f
 
@@ -290,7 +292,7 @@ static const BuiltinProto builtins[] = {
 	{ nullptr, nullptr, 0, 0, 0, VOIDSYM }
 };
 
-/* These are related to Director Serrvices API, used by Xtras
+/* These are related to Director Services API, used by Xtras
    to talk to Director. Unused in ScummVM. Leaving here for reference.
 
    Media Info:
diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index f1ae36a75cf..c205f23f6d2 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -1654,6 +1654,13 @@ ScriptContext *LingoCompiler::compileLingoV4(Common::SeekableReadStreamEndian &s
 			functionName = g_lingo->_eventHandlerTypes[kEventGeneric];
 		}
 
+		// We need to find movies with 'on cuePassed'
+		if (g_director->getVersion() >= 600) {
+			if (functionName.equalsIgnoreCase("cuePassed")) {
+				error("sev needs this movie as a sample for cuePoints, please talk to him");
+			}
+		}
+
 		Symbol sym;
 		if (!functionName.empty()) {
 			debugC(5, kDebugLoading, "Function %d binding: %s()", i, functionName.c_str());
diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index ce8b119a45b..614d4aab008 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -75,6 +75,7 @@ struct EventHandlerType {
 	{ kEventMouseWithin,		"mouseWithin" },		//					D6, present in D5
 
 	{ kEventTimeout,			"timeout" },			// D2 as when
+	{ kEventCuePassed,			"cuePassed" },			//					D6
 
 	{ kEventStartUp,			"startUp" },
 
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 9adc9ca53f5..7554fc8baa6 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -131,6 +131,7 @@ TheEntity entities[] = {					//	hasId  ver.	isFunction
 	{ kTheMovieName,		"movieName",		false, 400, true },	//			D4 f
 	{ kTheMoviePath,		"moviePath",		false, 400, true },	//			D4 f
 	{ kTheMultiSound,		"multiSound",		false, 300, true },	//		D3.1 f
+	{ kTheNetThrottleTicks,	"netThrottleTicks",	false, 600, true }, //					D6 f, documented in D7
 	{ kTheOptionDown,		"optionDown",		false, 200, true },	// D2 f
 	{ kTheOrganizationName,	"organizationName",	false, 500, false },//				D5 p, documented in D7
 	{ kTheParamCount,		"paramCount",		false, 400, true },	//			D4 f
@@ -164,6 +165,7 @@ TheEntity entities[] = {					//	hasId  ver.	isFunction
 	{ kTheShiftDown,		"shiftDown",		false, 200, true },	// D2 f
 	{ kTheSoundEnabled,		"soundEnabled",		false, 200, false },// D2 p
 	{ kTheSoundEntity,		"sound",			true,  300, false },// 		D3 p
+	{ kTheSoundKeepDevice,	"soundKeepDevice",	false, 600, false },//					D6 p, documented in D7
 	{ kTheSoundLevel,		"soundLevel",		false, 200, false },// D2 p
 	{ kTheSprite,			"sprite",			true,  200, false },// 			D4 p
 	{ kTheStage,			"stage",			false, 400, false },//			D4 p
@@ -357,8 +359,9 @@ const TheEntityField fields[] = {
 	{ kTheCast,		"chunkSize",	kTheChunkSize,	500 },//					D5 p
 	{ kTheCast,		"transitionType",kTheTransitionType,500 },//				D5 p
 
-	// XtrsaCastMember fields
+	// XtrasCastMember fields
 	{ kTheCast,		"interface",	kTheInterface,	500 },//					D5 p
+	{ kTheCast,		"mediaBusy",	kTheMediaBusy,	600 },//						D6 p
 
 	// Behavior (me) fields
 	{ kTheCast,		"spriteNum",	kTheSpriteNum,	600 },//						D6 p
@@ -928,6 +931,11 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 		// We always support multiple sound channels!
 		d = 1;
 		break;
+	case kTheNetThrottleTicks:
+		// This is default in Mac Director.
+		// Specifies the frequency of servicing to a network
+		d = 15;
+		break;
 	case kTheOptionDown:
 		d = (movie->_keyFlags & Common::KBD_ALT) ? 1 : 0;
 		break;
@@ -1061,6 +1069,11 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 			}
 		}
 		break;
+	case kTheSoundKeepDevice:
+		// System property; for Windows only, prevents the sound driver from unloading
+		// and reloading each time a sound needs to play. The default value is TRUE.
+		d = 1;
+		break;
 	case kTheSoundLevel:
 		// getting sound level of channel 1, maybe need to be amended in higher version
 		d = _vm->getCurrentWindow()->getSoundManager()->getChannelVolume(1) / 32;
@@ -1345,6 +1358,9 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
 	case kTheMouseUpScript:
 		movie->setPrimaryEventHandler(kEventMouseUp, d.asString());
 		break;
+	case kTheNetThrottleTicks:
+		// No op, we always smooth on network operations
+		break;
 	case kThePerFrameHook:
 		_perFrameHook = d;
 		break;
@@ -1415,6 +1431,9 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
 			}
 		}
 		break;
+	case kTheSoundKeepDevice:
+		// We do not need to unload the sound driver, so just ignore this.
+		break;
 	case kTheSoundLevel:
 		// setting all of the channel for now
 		_vm->getCurrentWindow()->getSoundManager()->setChannelVolume(-1, MAX(0, MIN(d.asInt() * 32, 255)));
diff --git a/engines/director/lingo/lingo-the.h b/engines/director/lingo/lingo-the.h
index e97c3a01592..e43305c60d1 100644
--- a/engines/director/lingo/lingo-the.h
+++ b/engines/director/lingo/lingo-the.h
@@ -115,6 +115,7 @@ enum TheEntityType {
 	kTheMovieName,
 	kTheMoviePath,
 	kTheMultiSound,
+	kTheNetThrottleTicks,
 	kTheOptionDown,
 	kTheOrganizationName,
 	kTheParamCount,
@@ -148,6 +149,7 @@ enum TheEntityType {
 	kTheShiftDown,
 	kTheSoundEntity,
 	kTheSoundEnabled,
+	kTheSoundKeepDevice,
 	kTheSoundLevel,
 	kTheSprite,
 	kTheSqrt,
@@ -240,6 +242,7 @@ enum TheFieldType {
 	kTheLoop,
 	kTheMargin,
 	kTheMedia,
+	kTheMediaBusy,
 	kTheMediaReady,
 	kTheMember,
 	kTheMemberNum,
diff --git a/engines/director/types.h b/engines/director/types.h
index ff089789525..80f4a19dd5b 100644
--- a/engines/director/types.h
+++ b/engines/director/types.h
@@ -240,6 +240,8 @@ enum LEvent {
 	kEventGetBehaviorDescription,
 	kEventGetPropertyDescriptionList,
 	kEventRunPropertyDialog,
+
+	kEventCuePassed,
 };
 
 enum TransitionType {




More information about the Scummvm-git-logs mailing list