aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/wintermute/base/base_game.cpp19
-rw-r--r--engines/wintermute/base/base_game.h2
-rw-r--r--engines/wintermute/base/base_scriptable.h1
-rw-r--r--engines/wintermute/base/scriptables/script_engine.cpp7
-rw-r--r--engines/wintermute/base/scriptables/script_ext_directory.cpp170
-rw-r--r--engines/wintermute/base/scriptables/script_ext_directory.h48
-rw-r--r--engines/wintermute/module.mk1
-rw-r--r--engines/wintermute/persistent.cpp2
8 files changed, 250 insertions, 0 deletions
diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp
index 576f8e60ba..0c9862fa0d 100644
--- a/engines/wintermute/base/base_game.cpp
+++ b/engines/wintermute/base/base_game.cpp
@@ -105,6 +105,7 @@ BaseGame::BaseGame(const Common::String &targetName) : BaseObject(this), _target
_keyboardState = nullptr;
_mathClass = nullptr;
+ _directoryClass = nullptr;
_debugLogFile = nullptr;
_debugDebugMode = false;
@@ -244,6 +245,7 @@ BaseGame::~BaseGame() {
delete _cachedThumbnail;
delete _mathClass;
+ delete _directoryClass;
delete _transMgr;
delete _scEngine;
@@ -261,6 +263,7 @@ BaseGame::~BaseGame() {
_cachedThumbnail = nullptr;
_mathClass = nullptr;
+ _directoryClass = nullptr;
_transMgr = nullptr;
_scEngine = nullptr;
@@ -415,6 +418,11 @@ bool BaseGame::initialize1() {
break;
}
+ _directoryClass = makeSXDirectory(this);
+ if (_directoryClass == nullptr) {
+ break;
+ }
+
#if EXTENDED_DEBUGGER_ENABLED
_scEngine = new DebuggableScEngine(this);
#else
@@ -451,6 +459,7 @@ bool BaseGame::initialize1() {
return STATUS_OK;
} else {
delete _mathClass;
+ delete _directoryClass;
delete _keyboardState;
delete _transMgr;
delete _surfaceStorage;
@@ -2747,6 +2756,16 @@ bool BaseGame::externalCall(ScScript *script, ScStack *stack, ScStack *thisStack
}
//////////////////////////////////////////////////////////////////////////
+ // Directory
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(name, "Directory") == 0) {
+ thisObj = thisStack->getTop();
+
+ thisObj->setNative(makeSXDirectory(_gameRef));
+ stack->pushNULL();
+ }
+
+ //////////////////////////////////////////////////////////////////////////
// Date
//////////////////////////////////////////////////////////////////////////
else if (strcmp(name, "Date") == 0) {
diff --git a/engines/wintermute/base/base_game.h b/engines/wintermute/base/base_game.h
index 46484cc5ca..b9ce201cb6 100644
--- a/engines/wintermute/base/base_game.h
+++ b/engines/wintermute/base/base_game.h
@@ -60,6 +60,7 @@ class BaseKeyboardState;
class BaseGameSettings;
class ScEngine;
class SXMath;
+class SXDirectory;
class UIWindow;
class VideoPlayer;
class VideoTheoraPlayer;
@@ -158,6 +159,7 @@ public:
ScEngine *_scEngine;
#endif
BaseScriptable *_mathClass;
+ BaseScriptable *_directoryClass;
BaseSurfaceStorage *_surfaceStorage;
BaseFontStorage *_fontStorage;
BaseGame(const Common::String &targetName);
diff --git a/engines/wintermute/base/base_scriptable.h b/engines/wintermute/base/base_scriptable.h
index 7b4f269871..0baf45b7cf 100644
--- a/engines/wintermute/base/base_scriptable.h
+++ b/engines/wintermute/base/base_scriptable.h
@@ -73,6 +73,7 @@ public:
BaseScriptable *makeSXArray(BaseGame *inGame, ScStack *stack);
BaseScriptable *makeSXDate(BaseGame *inGame, ScStack *stack);
BaseScriptable *makeSXFile(BaseGame *inGame, ScStack *stack);
+BaseScriptable *makeSXDirectory(BaseGame *inGame);
BaseScriptable *makeSXMath(BaseGame *inGame);
BaseScriptable *makeSXMemBuffer(BaseGame *inGame, ScStack *stack);
BaseScriptable *makeSXObject(BaseGame *inGame, ScStack *stack);
diff --git a/engines/wintermute/base/scriptables/script_engine.cpp b/engines/wintermute/base/scriptables/script_engine.cpp
index 0e16006d46..3a62d2e644 100644
--- a/engines/wintermute/base/scriptables/script_engine.cpp
+++ b/engines/wintermute/base/scriptables/script_engine.cpp
@@ -67,6 +67,13 @@ ScEngine::ScEngine(BaseGame *inGame) : BaseClass(inGame) {
_globals->setProp("Math", &val);
}
+ // register 'Directory' as global variable
+ if (!_globals->propExists("Directory")) {
+ ScValue val(_gameRef);
+ val.setNative(_gameRef->_directoryClass, true);
+ _globals->setProp("Directory", &val);
+ }
+
// prepare script cache
for (int i = 0; i < MAX_CACHED_SCRIPTS; i++) {
_cachedScripts[i] = nullptr;
diff --git a/engines/wintermute/base/scriptables/script_ext_directory.cpp b/engines/wintermute/base/scriptables/script_ext_directory.cpp
new file mode 100644
index 0000000000..2926edb31f
--- /dev/null
+++ b/engines/wintermute/base/scriptables/script_ext_directory.cpp
@@ -0,0 +1,170 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+/*
+ * This file is based on WME Lite.
+ * http://dead-code.org/redir.php?target=wmelite
+ * Copyright (c) 2011 Jan Nedoma
+ */
+
+#include "engines/wintermute/base/scriptables/script_ext_directory.h"
+#include "engines/wintermute/base/scriptables/script_stack.h"
+#include "engines/wintermute/base/scriptables/script_value.h"
+#include "engines/wintermute/persistent.h"
+
+namespace Wintermute {
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+
+IMPLEMENT_PERSISTENT(SXDirectory, true)
+
+BaseScriptable *makeSXDirectory(BaseGame *inGame) {
+ return new SXDirectory(inGame);
+}
+
+//////////////////////////////////////////////////////////////////////////
+SXDirectory::SXDirectory(BaseGame *inGame) : BaseScriptable(inGame) {
+
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+SXDirectory::~SXDirectory() {
+
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+bool SXDirectory::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *name) {
+ //////////////////////////////////////////////////////////////////////////
+ // Create
+ //////////////////////////////////////////////////////////////////////////
+ if (strcmp(name, "Create") == 0) {
+ stack->correctParams(1);
+ const char *path = stack->pop()->getString();
+
+ warning("Directory.Create is not implemented! Returning false...");
+
+ stack->pushBool(false);
+ return STATUS_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Delete
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(name, "Delete") == 0) {
+ stack->correctParams(1);
+ const char *path = stack->pop()->getString();
+
+ warning("Directory.Delete is not implemented! Returning false...");
+
+ stack->pushBool(false);
+ return STATUS_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // GetFiles / GetDirectories
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(name, "GetFiles") == 0 || strcmp(name, "GetDirectories") == 0) {
+ stack->correctParams(2);
+ const char *path = stack->pop()->getString();
+ const char *mask = stack->pop()->getString();
+
+ stack->pushInt(0);
+ BaseScriptable *array = makeSXArray(_gameRef, stack);
+
+ warning("Directory.%s is not implemented! Returning empty array...", name);
+
+ stack->pushNative(array, false);
+ return STATUS_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // GetDrives
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(name, "GetDrives") == 0) {
+ stack->correctParams(0);
+
+ warning("Directory.GetDrives is not implemented! Returning empty array...");
+
+ stack->pushInt(0);
+ stack->pushNative(makeSXArray(_gameRef, stack), false);
+ return STATUS_OK;
+ } else {
+ return STATUS_FAILED;
+ }
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+ScValue *SXDirectory::scGetProperty(const Common::String &name) {
+ _scValue->setNULL();
+
+ //////////////////////////////////////////////////////////////////////////
+ // Type
+ //////////////////////////////////////////////////////////////////////////
+ if (name == "Type") {
+ _scValue->setString("directory");
+ return _scValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // PathSeparator
+ //////////////////////////////////////////////////////////////////////////
+ else if (name == "PathSeparator") {
+ _scValue->setString("\\");
+ return _scValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // CurrentDirectory
+ //////////////////////////////////////////////////////////////////////////
+ else if (name == "CurrentDirectory") {
+ warning("Directory.CurrentDirectory is not implemented! Returning 'saves'...");
+ _scValue->setString(""); // See also: BaseGame::scGetProperty("SaveDirectory")
+ return _scValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // TempDirectory
+ //////////////////////////////////////////////////////////////////////////
+ else if (name == "TempDirectory") {
+ warning("Directory.TempDirectory is not implemented! Returning 'saves'...");
+ _scValue->setString("temp"); // See also: BaseGame::scGetProperty("SaveDirectory")
+ return _scValue;
+ } else {
+ return _scValue;
+ }
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+bool SXDirectory::persist(BasePersistenceManager *persistMgr) {
+
+ BaseScriptable::persist(persistMgr);
+ return STATUS_OK;
+}
+
+} // End of namespace Wintermute
diff --git a/engines/wintermute/base/scriptables/script_ext_directory.h b/engines/wintermute/base/scriptables/script_ext_directory.h
new file mode 100644
index 0000000000..e29c3ffd19
--- /dev/null
+++ b/engines/wintermute/base/scriptables/script_ext_directory.h
@@ -0,0 +1,48 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+/*
+ * This file is based on WME Lite.
+ * http://dead-code.org/redir.php?target=wmelite
+ * Copyright (c) 2011 Jan Nedoma
+ */
+
+#ifndef WINTERMUTE_SXDIRECTORY_H
+#define WINTERMUTE_SXDIRECTORY_H
+
+
+#include "engines/wintermute/base/base_scriptable.h"
+
+namespace Wintermute {
+
+class SXDirectory : public BaseScriptable {
+public:
+ DECLARE_PERSISTENT(SXDirectory, BaseScriptable)
+ SXDirectory(BaseGame *inGame);
+ virtual ~SXDirectory();
+ virtual ScValue *scGetProperty(const Common::String &name);
+ virtual bool scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *name);
+};
+
+} // End of namespace Wintermute
+
+#endif
diff --git a/engines/wintermute/module.mk b/engines/wintermute/module.mk
index 2c9c2e0180..49484ac62d 100644
--- a/engines/wintermute/module.mk
+++ b/engines/wintermute/module.mk
@@ -35,6 +35,7 @@ MODULE_OBJS := \
base/scriptables/script_value.o \
base/scriptables/script_ext_array.o \
base/scriptables/script_ext_date.o \
+ base/scriptables/script_ext_directory.o \
base/scriptables/script_ext_file.o \
base/scriptables/script_ext_math.o \
base/scriptables/script_ext_object.o \
diff --git a/engines/wintermute/persistent.cpp b/engines/wintermute/persistent.cpp
index 558fb82a0f..af36ff49d2 100644
--- a/engines/wintermute/persistent.cpp
+++ b/engines/wintermute/persistent.cpp
@@ -75,6 +75,7 @@
#include "engines/wintermute/base/scriptables/script_value.h"
#include "engines/wintermute/base/scriptables/script_ext_array.h"
#include "engines/wintermute/base/scriptables/script_ext_date.h"
+#include "engines/wintermute/base/scriptables/script_ext_directory.h"
#include "engines/wintermute/base/scriptables/script_ext_file.h"
#include "engines/wintermute/base/scriptables/script_ext_math.h"
#include "engines/wintermute/base/scriptables/script_ext_mem_buffer.h"
@@ -149,6 +150,7 @@ void SystemClassRegistry::registerClasses() {
REGISTER_CLASS(ScValue, false)
REGISTER_CLASS(SXArray, false)
REGISTER_CLASS(SXDate, false)
+ REGISTER_CLASS(SXDirectory, true)
REGISTER_CLASS(SXFile, false)
REGISTER_CLASS(SXMath, true)
REGISTER_CLASS(SXMemBuffer, false)