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

djsrv dservilla at gmail.com
Fri Jul 24 21:13:43 UTC 2020


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

Summary:
14892f7f02 DIRECTOR: LINGO: GlobalScript -> EventScript
a7e9ad9de5 DIRECTOR: LINGO: Use events for menu callbacks


Commit: 14892f7f02d035f7a0a0596f772e92668078ceac
    https://github.com/scummvm/scummvm/commit/14892f7f02d035f7a0a0596f772e92668078ceac
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-24T17:12:39-04:00

Commit Message:
DIRECTOR: LINGO: GlobalScript -> EventScript

Changed paths:
    engines/director/cast.cpp
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-events.cpp
    engines/director/lingo/lingo.cpp
    engines/director/types.h
    engines/director/util.cpp


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 09a0124576..f654398fb9 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -47,7 +47,7 @@ const char *scriptTypes[] = {
 	"ScoreScript",
 	"CastScript",
 	"MovieScript",
-	"GlobalScript"
+	"EventScript"
 };
 
 const char *scriptType2str(ScriptType scr) {
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 2c0d68203f..639155b7ec 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -540,7 +540,7 @@ void LB::b_value(int nargs) {
 	Common::String code = "scummvm_returnNumber " + expr;
 	// Compile the code to an anonymous function and call it
 	ScriptContext *sc = g_lingo->compileAnonymous(code.c_str());
-	Symbol sym = sc->_eventHandlers[kEventScript];
+	Symbol sym = sc->_eventHandlers[kEventGeneric];
 	LC::call(sym, 0, true);
 }
 
diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index 518772fe20..89d7134d42 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -73,7 +73,7 @@ struct EventHandlerType {
 
 	{ kEventStartUp,			"startUp" },
 
-	{ kEventScript,				"scummvm_script" },
+	{ kEventGeneric,			"scummvm_generic" },
 
 	{ kEventNone, 0 }
 };
@@ -109,7 +109,7 @@ void Movie::setPrimaryEventHandler(LEvent event, const Common::String &code) {
 	debugC(3, kDebugLingoExec, "setting primary event handler (%s)", _lingo->_eventHandlerTypes[event]);
 	LingoArchive *mainArchive = getMainLingoArch();
 	mainArchive->primaryEventHandlers[event] = code;
-	mainArchive->addCode(code.c_str(), kGlobalScript, event);
+	mainArchive->addCode(code.c_str(), kEventScript, event);
 }
 
 void Movie::queueSpriteEvent(LEvent event, int eventId, int spriteId) {
@@ -134,8 +134,8 @@ void Movie::queueSpriteEvent(LEvent event, int eventId, int spriteId) {
 			// In D3 the event lingo is not contained in a handler
 			// If sprite is immediate, its script is run on mouseDown, otherwise on mouseUp
 			if (((event == kEventMouseDown && sprite->_immediate) || (event == kEventMouseUp && !sprite->_immediate))
-					&& script->_eventHandlers.contains(kEventScript)) {
-				_eventQueue.push(LingoEvent(kEventScript, eventId, kScoreScript, sprite->_scriptId, false, spriteId));
+					&& script->_eventHandlers.contains(kEventGeneric)) {
+				_eventQueue.push(LingoEvent(kEventGeneric, eventId, kScoreScript, sprite->_scriptId, false, spriteId));
 			} else if (script->_eventHandlers.contains(event)) {
 				_eventQueue.push(LingoEvent(event, eventId, kScoreScript, sprite->_scriptId, false, spriteId));
 			}
@@ -170,8 +170,8 @@ void Movie::queueFrameEvent(LEvent event, int eventId) {
 	if (!script)
 		return;
 
-	if (event == kEventEnterFrame && script->_eventHandlers.contains(kEventScript)) {
-		_eventQueue.push(LingoEvent(kEventScript, eventId, kScoreScript, scriptId, false));
+	if (event == kEventEnterFrame && script->_eventHandlers.contains(kEventGeneric)) {
+		_eventQueue.push(LingoEvent(kEventGeneric, eventId, kScoreScript, scriptId, false));
 	} else if (script->_eventHandlers.contains(event)) {
 		_eventQueue.push(LingoEvent(event, eventId, kScoreScript, scriptId, false));
 	}
@@ -228,8 +228,8 @@ void Movie::registerEvent(LEvent event, int spriteId) {
 	case kEventKeyUp:
 	case kEventKeyDown:
 	case kEventTimeout:
-		if (getScriptContext(kGlobalScript, event)) {
-			_eventQueue.push(LingoEvent(kEventScript, eventId, kGlobalScript, event, true));
+		if (getScriptContext(kEventScript, event)) {
+			_eventQueue.push(LingoEvent(kEventGeneric, eventId, kEventScript, event, true));
 		}
 		break;
 	default:
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 000a4693d4..0ed72ee862 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -426,7 +426,7 @@ ScriptContext *Lingo::compileLingo(const char *code, LingoArchive *archive, Scri
 
 		currentFunc.argNames = argNames;
 		currentFunc.varNames = varNames;
-		_assemblyContext->_eventHandlers[kEventScript] = currentFunc;
+		_assemblyContext->_eventHandlers[kEventGeneric] = currentFunc;
 	}
 
 	delete _methodVars;
@@ -621,14 +621,14 @@ void Lingo::executeScript(ScriptType type, uint16 id) {
 		return;
 	}
 
-	if (!sc->_eventHandlers.contains(kEventScript)) {
+	if (!sc->_eventHandlers.contains(kEventGeneric)) {
 		debugC(3, kDebugLingoExec, "Request to execute script type %d id %d with no scopeless lingo", type, id);
 		return;
 	}
 
 	debugC(1, kDebugLingoExec, "Executing script type: %s, id: %d", scriptType2str(type), id);
 
-	Symbol sym = sc->_eventHandlers[kEventScript];
+	Symbol sym = sc->_eventHandlers[kEventGeneric];
 	LC::call(sym, 0, false);
 	execute(_pc);
 }
@@ -1138,7 +1138,7 @@ void Lingo::executeImmediateScripts(Frame *frame) {
 			// From D5 only explicit event handlers are processed
 			// Before that you could specify commands which will be executed on mouse up
 			if (_vm->getVersion() < 5)
-				g_lingo->processEvent(kEventScript, kScoreScript, frame->_sprites[i]->_scriptId, i);
+				g_lingo->processEvent(kEventGeneric, kScoreScript, frame->_sprites[i]->_scriptId, i);
 			else
 				g_lingo->processEvent(kEventMouseUp, kScoreScript, frame->_sprites[i]->_scriptId, i);
 		}
diff --git a/engines/director/types.h b/engines/director/types.h
index 390edfbadb..df1bd4651d 100644
--- a/engines/director/types.h
+++ b/engines/director/types.h
@@ -50,7 +50,7 @@ enum ScriptType {
 	kScoreScript = 0,
 	kCastScript = 1,
 	kMovieScript = 2,
-	kGlobalScript = 3,
+	kEventScript = 3,
 	kMaxScriptType = 3	// Sync with score-loading.cpp:45, array scriptTypes[]
 };
 
@@ -185,7 +185,7 @@ enum LEvent {
 	kEventEndSprite,
 
 	kEventNone,
-	kEventScript,
+	kEventGeneric,
 	kEventEnterFrame,
 	kEventPrepareFrame,
 	kEventIdle,
diff --git a/engines/director/util.cpp b/engines/director/util.cpp
index 05fb5a32e2..b7f097c6d1 100644
--- a/engines/director/util.cpp
+++ b/engines/director/util.cpp
@@ -537,8 +537,8 @@ Common::String dumpScriptName(const char *prefix, int type, int id, const char *
 	case kCastScript:
 		typeName = "cast";
 		break;
-	case kGlobalScript:
-		typeName = "global";
+	case kEventScript:
+		typeName = "event";
 		break;
 	case kScoreScript:
 		typeName = "score";


Commit: a7e9ad9de5cadbef69e21c0dce987c42a4353b36
    https://github.com/scummvm/scummvm/commit/a7e9ad9de5cadbef69e21c0dce987c42a4353b36
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-24T17:12:43-04:00

Commit Message:
DIRECTOR: LINGO: Use events for menu callbacks

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


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 639155b7ec..b77a8f4bd6 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1572,9 +1572,7 @@ void LB::b_importFileInto(int nargs) {
 }
 
 void menuCommandsCallback(int action, Common::String &text, void *data) {
-	Common::String name = Common::String::format("scummvmMenu%d", action);
-
-	LC::call(name, 0, false);
+	g_director->getCurrentMovie()->registerEvent(kEventMenuCallback, action);
 }
 
 void LB::b_installMenu(int nargs) {
@@ -1600,12 +1598,12 @@ void LB::b_installMenu(int nargs) {
 	Common::String command;
 	int commandId = 100;
 
-	Common::String handlers;
-
 	menu->setCommandsCallback(menuCommandsCallback, g_director);
 
 	debugC(3, kDebugLingoExec, "installMenu: '%s'", Common::toPrintable(menuStxt).c_str());
 
+	LingoArchive *mainArchive = g_director->getCurrentMovie()->getMainLingoArch();
+
 	for (const byte *s = (const byte *)menuStxt.c_str(); *s; s++) {
 		// Get next line
 		line.clear();
@@ -1667,7 +1665,10 @@ void LB::b_installMenu(int nargs) {
 
 		if (!submenuText.empty()) {
 			if (!command.empty()) {
-				handlers += g_lingo->genMenuHandler(&commandId, command);
+				while (mainArchive->getScriptContext(kEventScript, commandId)) {
+					commandId++;
+				}
+				mainArchive->addCode(command.c_str(), kEventScript, commandId);
 				submenuText += Common::String::format("[%d];", commandId);
 			} else {
 				submenuText += ';';
@@ -1681,22 +1682,6 @@ void LB::b_installMenu(int nargs) {
 	if (!submenuText.empty()) {
 		menu->createSubMenuFromString(submenu, submenuText.c_str(), 0);
 	}
-
-	// TODO: Menu callbacks should probably not be defined as a movie script
-	LingoArchive *mainArchive = g_director->getCurrentMovie()->getMainLingoArch();
-	mainArchive->addCode(handlers.c_str(), kMovieScript, 1337);
-}
-
-Common::String Lingo::genMenuHandler(int *commandId, Common::String &command) {
-	Common::String name;
-
-	do {
-		(*commandId)++;
-
-		name = Common::String::format("scummvmMenu%d", *commandId);
-	} while (getHandler(name).type != VOIDSYM);
-
-	return Common::String::format("on %s\n  %s\nend %s\n\n", name.c_str(), command.c_str(), name.c_str());
 }
 
 void LB::b_label(int nargs) {
diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index 89d7134d42..3d7ed7e625 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -204,7 +204,7 @@ void Movie::queueMovieEvent(LEvent event, int eventId) {
 	}
 }
 
-void Movie::registerEvent(LEvent event, int spriteId) {
+void Movie::registerEvent(LEvent event, int targetId) {
 	int eventId = _nextEventId++;
 	if (_nextEventId < 0)
 		_nextEventId = 0;
@@ -232,6 +232,11 @@ void Movie::registerEvent(LEvent event, int spriteId) {
 			_eventQueue.push(LingoEvent(kEventGeneric, eventId, kEventScript, event, true));
 		}
 		break;
+	case kEventMenuCallback:
+		if (getScriptContext(kEventScript, targetId)) {
+			_eventQueue.push(LingoEvent(kEventGeneric, eventId, kEventScript, targetId, true));
+		}
+		break;
 	default:
 		break;
 	}
@@ -241,8 +246,8 @@ void Movie::registerEvent(LEvent event, int spriteId) {
 		switch(event) {
 		case kEventMouseUp:
 		case kEventMouseDown:
-			if (spriteId) {
-				queueSpriteEvent(event, eventId, spriteId);
+			if (targetId) {
+				queueSpriteEvent(event, eventId, targetId);
 			}
 			break;
 
@@ -273,8 +278,8 @@ void Movie::registerEvent(LEvent event, int spriteId) {
 		case kEventMouseUp:
 		case kEventMouseDown:
 		case kEventBeginSprite:
-			if (spriteId) {
-				queueSpriteEvent(event, eventId, spriteId);
+			if (targetId) {
+				queueSpriteEvent(event, eventId, targetId);
 			}
 			// fall through
 
@@ -302,8 +307,8 @@ void Movie::registerEvent(LEvent event, int spriteId) {
 	}
 }
 
-void Movie::processEvent(LEvent event, int spriteId) {
-	registerEvent(event, spriteId);
+void Movie::processEvent(LEvent event, int targetId) {
+	registerEvent(event, targetId);
 	_vm->setCurrentMovie(this);
 	_lingo->processEvents();
 }
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 01aa6e6882..58802d2c96 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -425,9 +425,6 @@ private:
 	int parse(const char *code);
 	void parseMenu(const char *code);
 
-public:
-	Common::String genMenuHandler(int *commandId, Common::String &command);
-
 public:
 	void push(Datum d);
 	Datum pop(void);
diff --git a/engines/director/movie.h b/engines/director/movie.h
index e8103101c5..34eaab1857 100644
--- a/engines/director/movie.h
+++ b/engines/director/movie.h
@@ -118,8 +118,8 @@ public:
 	// lingo/lingo-events.cpp
 	void setPrimaryEventHandler(LEvent event, const Common::String &code);
 	int getEventCount();
-	void processEvent(LEvent event, int spriteId = 0);
-	void registerEvent(LEvent event, int spriteId = 0);
+	void processEvent(LEvent event, int targetId = 0);
+	void registerEvent(LEvent event, int targetId = 0);
 
 private:
 	void loadFileInfo(Common::SeekableSubReadStreamEndian &stream);
diff --git a/engines/director/types.h b/engines/director/types.h
index df1bd4651d..3891bc220c 100644
--- a/engines/director/types.h
+++ b/engines/director/types.h
@@ -211,7 +211,9 @@ enum LEvent {
 	kEventMouseUpOutSide,
 	kEventMouseWithin,
 
-	kEventStartUp
+	kEventStartUp,
+
+	kEventMenuCallback
 };
 
 enum TransitionType {




More information about the Scummvm-git-logs mailing list