[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