From 290196946dab0ee60498be16d8e33bb911e5a166 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 8 Dec 2018 16:54:31 -0800 Subject: GLK: GLULXE: Skeleton sub-engine --- engines/glk/glulxe/detection.cpp | 111 ++++++++++++++++++++++++++++++++++ engines/glk/glulxe/detection.h | 71 ++++++++++++++++++++++ engines/glk/glulxe/detection_tables.h | 57 +++++++++++++++++ engines/glk/glulxe/glulxe.cpp | 48 +++++++++++++++ engines/glk/glulxe/glulxe.h | 66 ++++++++++++++++++++ 5 files changed, 353 insertions(+) create mode 100644 engines/glk/glulxe/detection.cpp create mode 100644 engines/glk/glulxe/detection.h create mode 100644 engines/glk/glulxe/detection_tables.h create mode 100644 engines/glk/glulxe/glulxe.cpp create mode 100644 engines/glk/glulxe/glulxe.h (limited to 'engines/glk/glulxe') diff --git a/engines/glk/glulxe/detection.cpp b/engines/glk/glulxe/detection.cpp new file mode 100644 index 0000000000..0e1ec1f907 --- /dev/null +++ b/engines/glk/glulxe/detection.cpp @@ -0,0 +1,111 @@ +/* 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. + * + */ + +#include "glk/glulxe/detection.h" +#include "glk/glulxe/detection_tables.h" +#include "common/debug.h" +#include "common/file.h" +#include "common/md5.h" +#include "engines/game.h" + +namespace Glk { +namespace Glulxe { + +void GlulxeMetaEngine::getSupportedGames(PlainGameList &games) { + for (const GlulxeDescriptor *pd = GLULXE_GAME_LIST; pd->gameId; ++pd) { + games.push_back(*pd); + } +} + +GlulxeDescriptor GlulxeMetaEngine::findGame(const char *gameId) { + for (const GlulxeDescriptor *pd = GLULXE_GAME_LIST; pd->gameId; ++pd) { + if (!strcmp(gameId, pd->gameId)) + return *pd; + } + + return GlulxeDescriptor(); +} + +bool GlulxeMetaEngine::detectGames(const Common::FSList &fslist, DetectedGames &gameList) { + const char *const EXTENSIONS[3] = { ".ulx", ".blb", ".gblorb" }; + + // Loop through the files of the folder + for (Common::FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) { + // Check for a recognised filename + if (file->isDirectory()) + continue; + Common::String filename = file->getName(); + bool hasExt = false; + for (int idx = 0; idx < 3 && !hasExt; ++idx) + hasExt = filename.hasSuffixIgnoreCase(EXTENSIONS[idx]); + if (!hasExt) + continue; + + // Open up the file and calculate the md5 + Common::File gameFile; + if (!gameFile.open(*file)) + continue; + Common::String md5 = Common::computeStreamMD5AsString(gameFile, 5000); + size_t filesize = gameFile.size(); + gameFile.close(); + + // Check for known games + const GlulxeGameDescription *p = GLULXE_GAMES; + while (p->_gameId && (md5 != p->_md5 || filesize != p->_filesize)) + ++p; + + DetectedGame gd; + if (!p->_gameId) { + if (filename.hasSuffixIgnoreCase(".blb")) + continue; + + if (gDebugLevel > 0) { + // Print an entry suitable for putting into the detection_tables.h, using the + // name of the parent folder the game is in as the presumed game Id + Common::String folderName = file->getParent().getName(); + if (folderName.hasSuffix("\\")) + folderName.deleteLastChar(); + Common::String fname = filename; + const char *dot = strchr(fname.c_str(), '.'); + if (dot) + fname = Common::String(fname.c_str(), dot); + + debug("ENTRY0(\"%s\", \"%s\", %lu),", + fname.c_str(), md5.c_str(), filesize); + } + const PlainGameDescriptor &desc = GLULXE_GAME_LIST[0]; + gd = DetectedGame(desc.gameId, desc.description, Common::UNK_LANG, Common::kPlatformUnknown); + } else { + PlainGameDescriptor gameDesc = findGame(p->_gameId); + gd = DetectedGame(p->_gameId, gameDesc.description, p->_language, Common::kPlatformUnknown, p->_extra); + gd.setGUIOptions(GUIO4(GUIO_NOSPEECH, GUIO_NOSFX, GUIO_NOMUSIC, GUIO_NOSUBTITLES)); + } + + gd.addExtraEntry("filename", filename); + gameList.push_back(gd); + } + + return !gameList.empty(); +} + +} // End of namespace Glulxe +} // End of namespace Glk diff --git a/engines/glk/glulxe/detection.h b/engines/glk/glulxe/detection.h new file mode 100644 index 0000000000..d6d5c6a9ad --- /dev/null +++ b/engines/glk/glulxe/detection.h @@ -0,0 +1,71 @@ +/* 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. + * + */ + +#ifndef GLK_GLULXE_DETECTION +#define GLK_GLULXE_DETECTION + +#include "common/fs.h" +#include "engines/game.h" + +namespace Glk { +namespace Glulxe { + +/** + * Glulxe game descriptior + */ +struct GlulxeDescriptor { + const char *gameId; + const char *description; + + operator PlainGameDescriptor() const { + PlainGameDescriptor pd; + pd.gameId = gameId; + pd.description = description; + return pd; + } +}; + +/** + * Meta engine for Glulxe interpreter + */ +class GlulxeMetaEngine { +public: + /** + * Get a list of supported games + */ + static void getSupportedGames(PlainGameList &games); + + /** + * Returns a game description for the given game Id, if it's supported + */ + static GlulxeDescriptor findGame(const char *gameId); + + /** + * Detect supported games + */ + static bool detectGames(const Common::FSList &fslist, DetectedGames &gameList); +}; + +} // End of namespace Glulxe +} // End of namespace Glk + +#endif diff --git a/engines/glk/glulxe/detection_tables.h b/engines/glk/glulxe/detection_tables.h new file mode 100644 index 0000000000..17c5ffd55b --- /dev/null +++ b/engines/glk/glulxe/detection_tables.h @@ -0,0 +1,57 @@ +/* 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. + * + */ + +#include "engines/game.h" +#include "common/gui_options.h" +#include "common/language.h" + +namespace Glk { +namespace Glulxe { + +/** + * Game description + */ +struct GlulxeGameDescription { + const char *const _gameId; + const char *const _extra; + const char *const _md5; + size_t _filesize; + Common::Language _language; +}; + +const GlulxeDescriptor GLULXE_GAME_LIST[] = { + { "glulxe", "Glulxe Game" }, + { "cragne", "Cragne Manor" }, + + { nullptr, nullptr } +}; + +#define ENTRY0(ID, MD5, FILESIZE) { ID, nullptr, MD5, FILESIZE, Common::EN_ANY } +#define TABLE_END_MARKER { nullptr, nullptr, nullptr, 0, Common::EN_ANY } + +const GlulxeGameDescription GLULXE_GAMES[] = { + ENTRY0("cragne", "082f518c0120d2323ce340bef8a2d5a9", 8869096), + TABLE_END_MARKER +}; + +} // End of namespace Glulxe +} // End of namespace Glk diff --git a/engines/glk/glulxe/glulxe.cpp b/engines/glk/glulxe/glulxe.cpp new file mode 100644 index 0000000000..25af4c2f4d --- /dev/null +++ b/engines/glk/glulxe/glulxe.cpp @@ -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. + * + */ + +#include "glk/glulxe/glulxe.h" +#include "common/config-manager.h" +#include "common/translation.h" + +namespace Glk { +namespace Glulxe { + +Glulxe::Glulxe(OSystem *syst, const GlkGameDescription &gameDesc) : GlkAPI(syst, gameDesc) { +} + +void Glulxe::runGame(Common::SeekableReadStream *gameFile) { + // TODO +} + +Common::Error Glulxe::loadGameData(strid_t file) { + // TODO + return Common::kNoError; +} + +Common::Error Glulxe::saveGameData(strid_t file, const Common::String &desc) { + // TODO + return Common::kNoError; +} + +} // End of namespace Glulxe +} // End of namespace Glk diff --git a/engines/glk/glulxe/glulxe.h b/engines/glk/glulxe/glulxe.h new file mode 100644 index 0000000000..eb4aaf3657 --- /dev/null +++ b/engines/glk/glulxe/glulxe.h @@ -0,0 +1,66 @@ +/* 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. + * + */ + +#ifndef GLK_GLULXE +#define GLK_GLULXE + +#include "common/scummsys.h" +#include "glk/glk_api.h" + +namespace Glk { +namespace Glulxe { + +/** + * Glulxe game interpreter + */ +class Glulxe : public GlkAPI { +public: + /** + * Constructor + */ + Glulxe(OSystem *syst, const GlkGameDescription &gameDesc); + + /** + * Run the game + */ + void runGame(Common::SeekableReadStream *gameFile); + + /** + * Returns the running interpreter type + */ + virtual InterpreterType getInterpreterType() const override { return INTERPRETER_GLULXE; } + + /** + * Load a savegame from the passed stream + */ + virtual Common::Error loadGameData(strid_t file) override; + + /** + * Save the game to the passed stream + */ + virtual Common::Error saveGameData(strid_t file, const Common::String &desc) override; +}; + +} // End of namespace Glulxe +} // End of namespace Glk + +#endif -- cgit v1.2.3