[Scummvm-git-logs] scummvm master -> f4bd3519c96ab7185c413ca7d8817b9be7572c27
djsrv
dservilla at gmail.com
Fri Jul 30 00:26:34 UTC 2021
This automated email contains information about 5 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
f94363acc5 DIRECTOR: Fix pause
1e41097267 DIRECTOR: LINGO: Add error check to Object::initMethods
b57ae80ab1 DIRECTOR: LINGO: Keep track of open xlibs
4700f44dc4 DIRECTOR: LINGO: Implement closeXLib
f4bd3519c9 DIRECTOR: LINGO: Reload open xlibs in reloadBuiltIns
Commit: f94363acc54ac2067308491ef0674a581baacb38
https://github.com/scummvm/scummvm/commit/f94363acc54ac2067308491ef0674a581baacb38
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-29T20:20:46-04:00
Commit Message:
DIRECTOR: Fix pause
I accidentally removed "if (!_vm->_playbackPaused)" while figuring out
the logic for eded70bc8ab551adca581e0d6e3ab9f552fe3a3a.
Changed paths:
engines/director/score.cpp
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 5a1875472e..d69b9c9184 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -362,10 +362,12 @@ void Score::update() {
if (_playState == kPlayStopped)
return;
- if (_nextFrame)
- _currentFrame = _nextFrame;
- else if (!_window->_newMovieStarted)
- _currentFrame++;
+ if (!_vm->_playbackPaused) {
+ if (_nextFrame)
+ _currentFrame = _nextFrame;
+ else if (!_window->_newMovieStarted)
+ _currentFrame++;
+ }
_nextFrame = 0;
Commit: 1e41097267b13a68ee1313553ff144df9dacda6e
https://github.com/scummvm/scummvm/commit/1e41097267b13a68ee1313553ff144df9dacda6e
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-29T20:20:46-04:00
Commit Message:
DIRECTOR: LINGO: Add error check to Object::initMethods
Changed paths:
engines/director/lingo/lingo-object.h
diff --git a/engines/director/lingo/lingo-object.h b/engines/director/lingo/lingo-object.h
index 6534e7bcf5..39c6ee2cf5 100644
--- a/engines/director/lingo/lingo-object.h
+++ b/engines/director/lingo/lingo-object.h
@@ -86,6 +86,11 @@ protected:
public:
static void initMethods(MethodProto protos[]) {
+ if (_methods) {
+ warning("Object::initMethods: Methods already initialized");
+ return;
+ }
+
_methods = new SymbolHash;
for (MethodProto *mtd = protos; mtd->name; mtd++) {
if (mtd->version > g_lingo->_vm->getVersion())
Commit: b57ae80ab13cceafb4ce0eb27e56fbd7b60ac961
https://github.com/scummvm/scummvm/commit/b57ae80ab13cceafb4ce0eb27e56fbd7b60ac961
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-29T20:20:46-04:00
Commit Message:
DIRECTOR: LINGO: Keep track of open xlibs
Changed paths:
engines/director/lingo/lingo-object.cpp
engines/director/lingo/lingo.h
engines/director/lingo/xlibs/fileio.cpp
engines/director/lingo/xlibs/flushxobj.cpp
engines/director/lingo/xlibs/fplayxobj.cpp
engines/director/lingo/xlibs/labeldrvxobj.cpp
engines/director/lingo/xlibs/palxobj.cpp
engines/director/lingo/xlibs/soundjam.cpp
engines/director/lingo/xlibs/winxobj.cpp
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 9bebf22403..648a4aa4b2 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -159,6 +159,11 @@ void Lingo::openXLib(Common::String name, ObjectType type) {
name.toLowercase();
name.trim();
+ if (_openXLibs[name])
+ return;
+
+ _openXLibs[name] = true;
+
if (_xlibInitializers.contains(name)) {
Symbol sym = _xlibInitializers[name];
(*sym.u.bltin)(type);
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index ff42f08239..68c5629ab7 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -209,6 +209,7 @@ typedef Common::HashMap<Common::String, Symbol, Common::IgnoreCase_Hash, Common:
typedef Common::HashMap<Common::String, Datum, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> DatumHash;
typedef Common::HashMap<Common::String, Builtin *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> BuiltinHash;
typedef Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> VarTypeHash;
+typedef Common::HashMap<Common::String, bool, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> OpenXLibsHash;
typedef Common::HashMap<Common::String, TheEntity *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> TheEntityHash;
typedef Common::HashMap<Common::String, TheEntityField *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> TheEntityFieldHash;
@@ -409,6 +410,8 @@ public:
SymbolHash _methods;
SymbolHash _xlibInitializers;
+ OpenXLibsHash _openXLibs;
+
Common::String _floatPrecisionFormat;
public:
diff --git a/engines/director/lingo/xlibs/fileio.cpp b/engines/director/lingo/xlibs/fileio.cpp
index 49b5068c82..d496e109d4 100644
--- a/engines/director/lingo/xlibs/fileio.cpp
+++ b/engines/director/lingo/xlibs/fileio.cpp
@@ -51,14 +51,10 @@ static MethodProto xlibMethods[] = {
};
void FileIO::initialize(int type) {
- FileObject::initMethods(xlibMethods);
if (type & kXObj) {
- if (!g_lingo->_globalvars.contains(xlibName)) {
- FileObject *xobj = new FileObject(kXObj);
- g_lingo->_globalvars[xlibName] = xobj;
- } else {
- warning("FileIO XObject already initialized");
- }
+ FileObject::initMethods(xlibMethods);
+ FileObject *xobj = new FileObject(kXObj);
+ g_lingo->_globalvars[xlibName] = xobj;
}
if (type & kXtraObj) {
// TODO - Implement Xtra
diff --git a/engines/director/lingo/xlibs/flushxobj.cpp b/engines/director/lingo/xlibs/flushxobj.cpp
index 6527275eca..fa31b9db6d 100644
--- a/engines/director/lingo/xlibs/flushxobj.cpp
+++ b/engines/director/lingo/xlibs/flushxobj.cpp
@@ -54,14 +54,10 @@ static MethodProto xlibMethods[] = {
};
void FlushXObj::initialize(int type) {
- FlushXObject::initMethods(xlibMethods);
if (type & kXObj) {
- if (!g_lingo->_globalvars.contains(xlibName)) {
- FlushXObject *xobj = new FlushXObject(kXObj);
- g_lingo->_globalvars[xlibName] = xobj;
- } else {
- warning("FlushXObject already initialized");
- }
+ FlushXObject::initMethods(xlibMethods);
+ FlushXObject *xobj = new FlushXObject(kXObj);
+ g_lingo->_globalvars[xlibName] = xobj;
}
}
diff --git a/engines/director/lingo/xlibs/fplayxobj.cpp b/engines/director/lingo/xlibs/fplayxobj.cpp
index fa2ddc7bc8..a4f0533c8e 100644
--- a/engines/director/lingo/xlibs/fplayxobj.cpp
+++ b/engines/director/lingo/xlibs/fplayxobj.cpp
@@ -50,11 +50,7 @@ static BuiltinProto builtins[] = {
};
void FPlayXObj::initialize(int type) {
- if (!g_lingo->_builtinCmds.contains("FPlay")) {
- g_lingo->initBuiltIns(builtins);
- } else {
- warning("FPlayXObj already initialized");
- }
+ g_lingo->initBuiltIns(builtins);
}
void FPlayXObj::b_fplay(int nargs) {
diff --git a/engines/director/lingo/xlibs/labeldrvxobj.cpp b/engines/director/lingo/xlibs/labeldrvxobj.cpp
index a058abad2a..5514c0c959 100644
--- a/engines/director/lingo/xlibs/labeldrvxobj.cpp
+++ b/engines/director/lingo/xlibs/labeldrvxobj.cpp
@@ -54,14 +54,10 @@ static MethodProto xlibMethods[] = {
};
void LabelDrvXObj::initialize(int type) {
- LabelDrvXObject::initMethods(xlibMethods);
if (type & kXObj) {
- if (!g_lingo->_globalvars.contains(xlibName)) {
- LabelDrvXObject *xobj = new LabelDrvXObject(kXObj);
- g_lingo->_globalvars[xlibName] = xobj;
- } else {
- warning("LabelDrvXObj already initialized");
- }
+ LabelDrvXObject::initMethods(xlibMethods);
+ LabelDrvXObject *xobj = new LabelDrvXObject(kXObj);
+ g_lingo->_globalvars[xlibName] = xobj;
}
}
diff --git a/engines/director/lingo/xlibs/palxobj.cpp b/engines/director/lingo/xlibs/palxobj.cpp
index a587ab0a30..206fa2c200 100644
--- a/engines/director/lingo/xlibs/palxobj.cpp
+++ b/engines/director/lingo/xlibs/palxobj.cpp
@@ -55,14 +55,10 @@ static MethodProto xlibMethods[] = {
};
void PalXObj::initialize(int type) {
- PalXObject::initMethods(xlibMethods);
if (type & kXObj) {
- if (!g_lingo->_globalvars.contains(xlibName)) {
- PalXObject *xobj = new PalXObject(kXObj);
- g_lingo->_globalvars[xlibName] = xobj;
- } else {
- warning("PalXObject already initialized");
- }
+ PalXObject::initMethods(xlibMethods);
+ PalXObject *xobj = new PalXObject(kXObj);
+ g_lingo->_globalvars[xlibName] = xobj;
}
}
diff --git a/engines/director/lingo/xlibs/soundjam.cpp b/engines/director/lingo/xlibs/soundjam.cpp
index 045ec145ba..218dc26408 100644
--- a/engines/director/lingo/xlibs/soundjam.cpp
+++ b/engines/director/lingo/xlibs/soundjam.cpp
@@ -70,14 +70,10 @@ static MethodProto xlibMethods[] = {
};
void SoundJam::initialize(int type) {
- SoundJamObject::initMethods(xlibMethods);
if (type & kXObj) {
- if (!g_lingo->_globalvars.contains(xlibName)) {
- SoundJamObject *xobj = new SoundJamObject(kXObj);
- g_lingo->_globalvars[xlibName] = xobj;
- } else {
- warning("SoundJam already initialized");
- }
+ SoundJamObject::initMethods(xlibMethods);
+ SoundJamObject *xobj = new SoundJamObject(kXObj);
+ g_lingo->_globalvars[xlibName] = xobj;
}
}
diff --git a/engines/director/lingo/xlibs/winxobj.cpp b/engines/director/lingo/xlibs/winxobj.cpp
index 4650c16aec..8b9ed9b7fc 100644
--- a/engines/director/lingo/xlibs/winxobj.cpp
+++ b/engines/director/lingo/xlibs/winxobj.cpp
@@ -48,14 +48,10 @@ static MethodProto xlibMethods[] = {
};
void RearWindowXObj::initialize(int type) {
- RearWindowXObject::initMethods(xlibMethods);
if (type & kXObj) {
- if (!g_lingo->_globalvars.contains(xlibName)) {
- RearWindowXObject *xobj = new RearWindowXObject(kXObj);
- g_lingo->_globalvars[xlibName] = xobj;
- } else {
- warning("RearWindowXObject already initialized");
- }
+ RearWindowXObject::initMethods(xlibMethods);
+ RearWindowXObject *xobj = new RearWindowXObject(kXObj);
+ g_lingo->_globalvars[xlibName] = xobj;
}
}
Commit: 4700f44dc49cd7a4556233b6bfffde677033800f
https://github.com/scummvm/scummvm/commit/4700f44dc49cd7a4556233b6bfffde677033800f
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-29T20:20:46-04:00
Commit Message:
DIRECTOR: LINGO: Implement closeXLib
Changed paths:
engines/director/lingo/lingo-builtins.cpp
engines/director/lingo/lingo-object.cpp
engines/director/lingo/lingo.h
engines/director/lingo/xlibs/fileio.cpp
engines/director/lingo/xlibs/fileio.h
engines/director/lingo/xlibs/flushxobj.cpp
engines/director/lingo/xlibs/flushxobj.h
engines/director/lingo/xlibs/fplayxobj.cpp
engines/director/lingo/xlibs/fplayxobj.h
engines/director/lingo/xlibs/labeldrvxobj.cpp
engines/director/lingo/xlibs/labeldrvxobj.h
engines/director/lingo/xlibs/palxobj.cpp
engines/director/lingo/xlibs/palxobj.h
engines/director/lingo/xlibs/soundjam.cpp
engines/director/lingo/xlibs/soundjam.h
engines/director/lingo/xlibs/winxobj.cpp
engines/director/lingo/xlibs/winxobj.h
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 87d4dc3632..2ec16558bb 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -275,6 +275,27 @@ void Lingo::cleanupBuiltIns() {
_builtinConsts.clear();
}
+void Lingo::cleanupBuiltIns(BuiltinProto protos[]) {
+ for (BuiltinProto *blt = protos; blt->name; blt++) {
+ switch (blt->type) {
+ case CBLTIN:
+ _builtinCmds.erase(blt->name);
+ break;
+ case FBLTIN:
+ _builtinFuncs.erase(blt->name);
+ break;
+ case HBLTIN:
+ _builtinCmds.erase(blt->name);
+ _builtinFuncs.erase(blt->name);
+ break;
+ case KBLTIN:
+ _builtinConsts.erase(blt->name);
+ default:
+ break;
+ }
+ }
+}
+
void Lingo::printSTUBWithArglist(const char *funcname, int nargs, const char *prefix) {
Common::String s(funcname);
@@ -1040,8 +1061,8 @@ void LB::b_closeResFile(int nargs) {
void LB::b_closeXlib(int nargs) {
Datum d = g_lingo->pop();
-
- warning("STUB: b_closeXlib(%s)", d.asString().c_str());
+ Common::String xlibName = d.asString();
+ g_lingo->closeXLib(xlibName);
}
void LB::b_getNthFileNameInFolder(int nargs) {
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 648a4aa4b2..064669f098 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -107,18 +107,19 @@ void Lingo::cleanupMethods() {
static struct XLibProto {
const char *name;
- void (*initializer)(int);
+ void (*opener)(int);
+ void (*closer)(int);
int type;
int version;
} xlibs[] = {
- { "FileIO", FileIO::initialize, kXObj | kXtraObj, 200 }, // D2
- { "FlushXObj", FlushXObj::initialize, kXObj, 400 }, // D4
- { "FPlayXObj", FPlayXObj::initialize, kXObj, 200 }, // D2
- { "PalXObj", PalXObj:: initialize, kXObj, 400 }, // D4
- { "LabelDrv", LabelDrvXObj:: initialize, kXObj, 400 }, // D4
- { "SoundJam", SoundJam::initialize, kXObj, 400 }, // D4
- { "winXObj", RearWindowXObj::initialize, kXObj, 400 }, // D4
- { 0, 0, 0, 0 }
+ { "FileIO", FileIO::open, FileIO::close, kXObj | kXtraObj, 200 }, // D2
+ { "FlushXObj", FlushXObj::open, FlushXObj::close, kXObj, 400 }, // D4
+ { "FPlayXObj", FPlayXObj::open, FPlayXObj::close, kXObj, 200 }, // D2
+ { "PalXObj", PalXObj::open, PalXObj::close, kXObj, 400 }, // D4
+ { "LabelDrv", LabelDrvXObj::open, LabelDrvXObj::close, kXObj, 400 }, // D4
+ { "SoundJam", SoundJam::open, SoundJam::close, kXObj, 400 }, // D4
+ { "winXObj", RearWindowXObj::open, RearWindowXObj::close, kXObj, 400 }, // D4
+ { 0, 0, 0, 0, 0 }
};
@@ -127,25 +128,32 @@ void Lingo::initXLibs() {
if (lib->version > _vm->getVersion())
continue;
- Symbol sym;
- sym.name = new Common::String(lib->name);
- sym.type = HBLTIN;
- sym.nargs = 0;
- sym.maxArgs = 0;
- sym.targetType = lib->type;
- sym.u.bltin = lib->initializer;
- Common::String xlibName = lib->name;
- xlibName.toLowercase();
- _xlibInitializers[xlibName] = sym;
+ Symbol openSym;
+ openSym.name = new Common::String(lib->name);
+ openSym.type = HBLTIN;
+ openSym.nargs = 0;
+ openSym.maxArgs = 0;
+ openSym.targetType = lib->type;
+ openSym.u.bltin = lib->opener;
+ _xlibOpeners[lib->name] = openSym;
+
+ Symbol closeSym;
+ closeSym.name = new Common::String(lib->name);
+ closeSym.type = HBLTIN;
+ closeSym.nargs = 0;
+ closeSym.maxArgs = 0;
+ openSym.targetType = lib->type;
+ closeSym.u.bltin = lib->closer;
+ _xlibClosers[lib->name] = closeSym;
}
}
void Lingo::cleanupXLibs() {
- _xlibInitializers.clear();
+ _xlibOpeners.clear();
+ _xlibClosers.clear();
}
-void Lingo::openXLib(Common::String name, ObjectType type) {
-
+Common::String Lingo::normalizeXLibName(Common::String name) {
Common::Platform platform = _vm->getPlatform();
if (platform == Common::kPlatformMacintosh) {
int pos = name.findLastOf(':');
@@ -155,20 +163,43 @@ void Lingo::openXLib(Common::String name, ObjectType type) {
name = name.substr(0, name.size() - 4);
}
- // normalize xlib name
- name.toLowercase();
name.trim();
- if (_openXLibs[name])
+ return name;
+}
+
+void Lingo::openXLib(Common::String name, ObjectType type) {
+ name = normalizeXLibName(name);
+
+ if (_openXLibs.contains(name))
return;
- _openXLibs[name] = true;
+ _openXLibs[name] = type;
+
+ if (_xlibOpeners.contains(name)) {
+ Symbol sym = _xlibOpeners[name];
+ (*sym.u.bltin)(type);
+ } else {
+ warning("Lingo::openXLib: Unimplemented xlib: '%s'", name.c_str());
+ }
+}
+
+void Lingo::closeXLib(Common::String name) {
+ name = normalizeXLibName(name);
+
+ if (!_openXLibs.contains(name)) {
+ warning("Lingo::closeXLib: xlib %s is not open", name.c_str());
+ return;
+ }
+
+ ObjectType type = _openXLibs[name];
+ _openXLibs.erase(name);
- if (_xlibInitializers.contains(name)) {
- Symbol sym = _xlibInitializers[name];
+ if (_xlibClosers.contains(name)) {
+ Symbol sym = _xlibClosers[name];
(*sym.u.bltin)(type);
} else {
- warning("Unimplemented xlib: '%s'", name.c_str());
+ warning("Lingo::closeXLib: Unimplemented xlib: '%s'", name.c_str());
}
}
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 68c5629ab7..4ad617e710 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -209,7 +209,7 @@ typedef Common::HashMap<Common::String, Symbol, Common::IgnoreCase_Hash, Common:
typedef Common::HashMap<Common::String, Datum, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> DatumHash;
typedef Common::HashMap<Common::String, Builtin *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> BuiltinHash;
typedef Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> VarTypeHash;
-typedef Common::HashMap<Common::String, bool, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> OpenXLibsHash;
+typedef Common::HashMap<Common::String, ObjectType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> OpenXLibsHash;
typedef Common::HashMap<Common::String, TheEntity *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> TheEntityHash;
typedef Common::HashMap<Common::String, TheEntityField *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> TheEntityFieldHash;
@@ -283,6 +283,7 @@ public:
void initBuiltIns();
void initBuiltIns(BuiltinProto protos[]);
void cleanupBuiltIns();
+ void cleanupBuiltIns(BuiltinProto protos[]);
void initFuncs();
void cleanupFuncs();
void initBytecode();
@@ -290,7 +291,10 @@ public:
void cleanupMethods();
void initXLibs();
void cleanupXLibs();
+
+ Common::String normalizeXLibName(Common::String name);
void openXLib(Common::String name, ObjectType type);
+ void closeXLib(Common::String name);
void runTests();
@@ -408,7 +412,8 @@ public:
SymbolHash _builtinFuncs;
SymbolHash _builtinConsts;
SymbolHash _methods;
- SymbolHash _xlibInitializers;
+ SymbolHash _xlibOpeners;
+ SymbolHash _xlibClosers;
OpenXLibsHash _openXLibs;
diff --git a/engines/director/lingo/xlibs/fileio.cpp b/engines/director/lingo/xlibs/fileio.cpp
index d496e109d4..6f34901cce 100644
--- a/engines/director/lingo/xlibs/fileio.cpp
+++ b/engines/director/lingo/xlibs/fileio.cpp
@@ -50,13 +50,21 @@ static MethodProto xlibMethods[] = {
{ 0, 0, 0, 0, 0 }
};
-void FileIO::initialize(int type) {
- if (type & kXObj) {
+void FileIO::open(int type) {
+ if (type == kXObj) {
FileObject::initMethods(xlibMethods);
FileObject *xobj = new FileObject(kXObj);
g_lingo->_globalvars[xlibName] = xobj;
+ } else if (type == kXtraObj) {
+ // TODO - Implement Xtra
}
- if (type & kXtraObj) {
+}
+
+void FileIO::close(int type) {
+ if (type == kXObj) {
+ FileObject::cleanupMethods();
+ g_lingo->_globalvars[xlibName] = Datum();
+ } else if (type == kXtraObj) {
// TODO - Implement Xtra
}
}
diff --git a/engines/director/lingo/xlibs/fileio.h b/engines/director/lingo/xlibs/fileio.h
index 23a4963303..361034468d 100644
--- a/engines/director/lingo/xlibs/fileio.h
+++ b/engines/director/lingo/xlibs/fileio.h
@@ -68,8 +68,10 @@ public:
};
namespace FileIO {
+ void open(int type);
+ void close(int type);
+
bool charInMatchString(char ch, const Common::String &matchString);
- void initialize(int type);
void saveFileError();
void m_delete(int nargs);
void m_dispose(int nargs);
diff --git a/engines/director/lingo/xlibs/flushxobj.cpp b/engines/director/lingo/xlibs/flushxobj.cpp
index fa31b9db6d..2b9837da8c 100644
--- a/engines/director/lingo/xlibs/flushxobj.cpp
+++ b/engines/director/lingo/xlibs/flushxobj.cpp
@@ -53,14 +53,21 @@ static MethodProto xlibMethods[] = {
{ 0, 0, 0, 0, 0 }
};
-void FlushXObj::initialize(int type) {
- if (type & kXObj) {
+void FlushXObj::open(int type) {
+ if (type == kXObj) {
FlushXObject::initMethods(xlibMethods);
FlushXObject *xobj = new FlushXObject(kXObj);
g_lingo->_globalvars[xlibName] = xobj;
}
}
+void FlushXObj::close(int type) {
+ if (type == kXObj) {
+ FlushXObject::cleanupMethods();
+ g_lingo->_globalvars[xlibName] = Datum();
+ }
+}
+
FlushXObject::FlushXObject(ObjectType ObjectType) :Object<FlushXObject>("FlushXObj") {
_objType = ObjectType;
diff --git a/engines/director/lingo/xlibs/flushxobj.h b/engines/director/lingo/xlibs/flushxobj.h
index a23f36c1c4..f1556a93ce 100644
--- a/engines/director/lingo/xlibs/flushxobj.h
+++ b/engines/director/lingo/xlibs/flushxobj.h
@@ -32,7 +32,8 @@ public:
namespace FlushXObj {
-void initialize(int type);
+void open(int type);
+void close(int type);
void m_new(int nargs);
void m_clearMask(int nargs);
diff --git a/engines/director/lingo/xlibs/fplayxobj.cpp b/engines/director/lingo/xlibs/fplayxobj.cpp
index a4f0533c8e..f330bc10a8 100644
--- a/engines/director/lingo/xlibs/fplayxobj.cpp
+++ b/engines/director/lingo/xlibs/fplayxobj.cpp
@@ -49,10 +49,14 @@ static BuiltinProto builtins[] = {
{ 0, 0, 0, 0, 0, VOIDSYM }
};
-void FPlayXObj::initialize(int type) {
+void FPlayXObj::open(int type) {
g_lingo->initBuiltIns(builtins);
}
+void FPlayXObj::close(int type) {
+ g_lingo->cleanupBuiltIns(builtins);
+}
+
void FPlayXObj::b_fplay(int nargs) {
if (nargs == 0) {
warning("FPlayXObj::b_fplay: requires at least one argument");
diff --git a/engines/director/lingo/xlibs/fplayxobj.h b/engines/director/lingo/xlibs/fplayxobj.h
index 1cc977bbf5..5798f43607 100644
--- a/engines/director/lingo/xlibs/fplayxobj.h
+++ b/engines/director/lingo/xlibs/fplayxobj.h
@@ -27,7 +27,8 @@ namespace Director {
namespace FPlayXObj {
-void initialize(int type);
+void open(int type);
+void close(int type);
void b_fplay(int nargs);
void b_sndinfo(int nargs);
diff --git a/engines/director/lingo/xlibs/labeldrvxobj.cpp b/engines/director/lingo/xlibs/labeldrvxobj.cpp
index 5514c0c959..51d4c60266 100644
--- a/engines/director/lingo/xlibs/labeldrvxobj.cpp
+++ b/engines/director/lingo/xlibs/labeldrvxobj.cpp
@@ -53,14 +53,21 @@ static MethodProto xlibMethods[] = {
{ 0, 0, 0, 0, 0 }
};
-void LabelDrvXObj::initialize(int type) {
- if (type & kXObj) {
+void LabelDrvXObj::open(int type) {
+ if (type == kXObj) {
LabelDrvXObject::initMethods(xlibMethods);
LabelDrvXObject *xobj = new LabelDrvXObject(kXObj);
g_lingo->_globalvars[xlibName] = xobj;
}
}
+void LabelDrvXObj::close(int type) {
+ if (type == kXObj) {
+ LabelDrvXObject::cleanupMethods();
+ g_lingo->_globalvars[xlibName] = Datum();
+ }
+}
+
LabelDrvXObject::LabelDrvXObject(ObjectType ObjectType) :Object<LabelDrvXObject>("LabelDrvXObj") {
_objType = ObjectType;
}
diff --git a/engines/director/lingo/xlibs/labeldrvxobj.h b/engines/director/lingo/xlibs/labeldrvxobj.h
index d7a03e5963..8eaddd5fed 100644
--- a/engines/director/lingo/xlibs/labeldrvxobj.h
+++ b/engines/director/lingo/xlibs/labeldrvxobj.h
@@ -35,7 +35,8 @@ public:
namespace LabelDrvXObj {
-void initialize(int type);
+void open(int type);
+void close(int type);
void m_new(int nargs);
void m_setRange(int nargs);
diff --git a/engines/director/lingo/xlibs/palxobj.cpp b/engines/director/lingo/xlibs/palxobj.cpp
index 206fa2c200..f10a16d287 100644
--- a/engines/director/lingo/xlibs/palxobj.cpp
+++ b/engines/director/lingo/xlibs/palxobj.cpp
@@ -54,14 +54,21 @@ static MethodProto xlibMethods[] = {
{ 0, 0, 0, 0, 0 }
};
-void PalXObj::initialize(int type) {
- if (type & kXObj) {
+void PalXObj::open(int type) {
+ if (type == kXObj) {
PalXObject::initMethods(xlibMethods);
PalXObject *xobj = new PalXObject(kXObj);
g_lingo->_globalvars[xlibName] = xobj;
}
}
+void PalXObj::close(int type) {
+ if (type == kXObj) {
+ PalXObject::cleanupMethods();
+ g_lingo->_globalvars[xlibName] = Datum();
+ }
+}
+
PalXObject::PalXObject(ObjectType ObjectType) :Object<PalXObject>("PalXObj") {
_objType = ObjectType;
diff --git a/engines/director/lingo/xlibs/palxobj.h b/engines/director/lingo/xlibs/palxobj.h
index 4da3408320..70da86adb3 100644
--- a/engines/director/lingo/xlibs/palxobj.h
+++ b/engines/director/lingo/xlibs/palxobj.h
@@ -35,7 +35,8 @@ public:
namespace PalXObj {
-void initialize(int type);
+void open(int type);
+void close(int type);
void m_new(int nargs);
void m_patchIt(int nargs);
diff --git a/engines/director/lingo/xlibs/soundjam.cpp b/engines/director/lingo/xlibs/soundjam.cpp
index 218dc26408..8846adefbf 100644
--- a/engines/director/lingo/xlibs/soundjam.cpp
+++ b/engines/director/lingo/xlibs/soundjam.cpp
@@ -69,14 +69,21 @@ static MethodProto xlibMethods[] = {
{ 0, 0, 0, 0, 0 }
};
-void SoundJam::initialize(int type) {
- if (type & kXObj) {
+void SoundJam::open(int type) {
+ if (type == kXObj) {
SoundJamObject::initMethods(xlibMethods);
SoundJamObject *xobj = new SoundJamObject(kXObj);
g_lingo->_globalvars[xlibName] = xobj;
}
}
+void SoundJam::close(int type) {
+ if (type == kXObj) {
+ SoundJamObject::cleanupMethods();
+ g_lingo->_globalvars[xlibName] = Datum();
+ }
+}
+
SoundJamObject::SoundJamObject(ObjectType objType) : Object<SoundJamObject>("SoundJam") {
_objType = objType;
}
diff --git a/engines/director/lingo/xlibs/soundjam.h b/engines/director/lingo/xlibs/soundjam.h
index cc3344c71d..76f892839e 100644
--- a/engines/director/lingo/xlibs/soundjam.h
+++ b/engines/director/lingo/xlibs/soundjam.h
@@ -32,7 +32,8 @@ public:
namespace SoundJam {
-void initialize(int type);
+void open(int type);
+void close(int type);
void m_new(int nargs);
void m_defineFileSound(int nargs);
diff --git a/engines/director/lingo/xlibs/winxobj.cpp b/engines/director/lingo/xlibs/winxobj.cpp
index 8b9ed9b7fc..c9f298b899 100644
--- a/engines/director/lingo/xlibs/winxobj.cpp
+++ b/engines/director/lingo/xlibs/winxobj.cpp
@@ -47,14 +47,21 @@ static MethodProto xlibMethods[] = {
{ 0, 0, 0, 0, 0 }
};
-void RearWindowXObj::initialize(int type) {
- if (type & kXObj) {
+void RearWindowXObj::open(int type) {
+ if (type == kXObj) {
RearWindowXObject::initMethods(xlibMethods);
RearWindowXObject *xobj = new RearWindowXObject(kXObj);
g_lingo->_globalvars[xlibName] = xobj;
}
}
+void RearWindowXObj::close(int type) {
+ if (type == kXObj) {
+ RearWindowXObject::cleanupMethods();
+ g_lingo->_globalvars[xlibName] = Datum();
+ }
+}
+
RearWindowXObject::RearWindowXObject(ObjectType ObjectType) :Object<RearWindowXObject>("RearWindowXObj") {
_objType = ObjectType;
diff --git a/engines/director/lingo/xlibs/winxobj.h b/engines/director/lingo/xlibs/winxobj.h
index c37de5d881..c58dbaae66 100644
--- a/engines/director/lingo/xlibs/winxobj.h
+++ b/engines/director/lingo/xlibs/winxobj.h
@@ -33,7 +33,8 @@ public:
namespace RearWindowXObj {
-void initialize(int type);
+void open(int type);
+void close(int type);
void m_new(int nargs);
void m_getMemoryNeeded(int nargs);
Commit: f4bd3519c96ab7185c413ca7d8817b9be7572c27
https://github.com/scummvm/scummvm/commit/f4bd3519c96ab7185c413ca7d8817b9be7572c27
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-29T20:20:46-04:00
Commit Message:
DIRECTOR: LINGO: Reload open xlibs in reloadBuiltIns
Changed paths:
engines/director/lingo/lingo-object.cpp
engines/director/lingo/lingo.cpp
engines/director/lingo/lingo.h
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 064669f098..bef55274dc 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -203,6 +203,14 @@ void Lingo::closeXLib(Common::String name) {
}
}
+void Lingo::reloadOpenXLibs() {
+ OpenXLibsHash openXLibsCopy = _openXLibs;
+ for (OpenXLibsHash::iterator it = openXLibsCopy.begin(); it != openXLibsCopy.end(); ++it) {
+ closeXLib(it->_key);
+ openXLib(it->_key, it->_value);
+ }
+}
+
// Initialization/disposal
void LM::m_new(int nargs) {
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index c0b3e3f577..a81374f6b8 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -204,6 +204,7 @@ void Lingo::reloadBuiltIns() {
initTheEntities();
initMethods();
initXLibs();
+ reloadOpenXLibs();
}
LingoArchive::~LingoArchive() {
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 4ad617e710..7162a29c43 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -295,6 +295,7 @@ public:
Common::String normalizeXLibName(Common::String name);
void openXLib(Common::String name, ObjectType type);
void closeXLib(Common::String name);
+ void reloadOpenXLibs();
void runTests();
More information about the Scummvm-git-logs
mailing list