From 4bb82a8dae26e8bd56a8bc943c97959d37fb36ea Mon Sep 17 00:00:00 2001 From: lolbot-iichan Date: Sat, 29 Jun 2019 18:01:39 +0300 Subject: WINTERMUTE: Add dummy implementation of Directory global object Source: http://docs.dead-code.org/wme/generated/scripting_ref_directory.html --- engines/wintermute/base/base_game.cpp | 19 +++ engines/wintermute/base/base_game.h | 2 + engines/wintermute/base/base_scriptable.h | 1 + .../wintermute/base/scriptables/script_engine.cpp | 7 + .../base/scriptables/script_ext_directory.cpp | 170 +++++++++++++++++++++ .../base/scriptables/script_ext_directory.h | 48 ++++++ 6 files changed, 247 insertions(+) create mode 100644 engines/wintermute/base/scriptables/script_ext_directory.cpp create mode 100644 engines/wintermute/base/scriptables/script_ext_directory.h (limited to 'engines/wintermute/base') 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; @@ -2746,6 +2755,16 @@ bool BaseGame::externalCall(ScScript *script, ScStack *stack, ScStack *thisStack stack->pushNULL(); } + ////////////////////////////////////////////////////////////////////////// + // Directory + ////////////////////////////////////////////////////////////////////////// + else if (strcmp(name, "Directory") == 0) { + thisObj = thisStack->getTop(); + + thisObj->setNative(makeSXDirectory(_gameRef)); + stack->pushNULL(); + } + ////////////////////////////////////////////////////////////////////////// // Date ////////////////////////////////////////////////////////////////////////// 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 -- cgit v1.2.3