From 2428c4f3780544a3fa8742d01a5364d4df44d156 Mon Sep 17 00:00:00 2001 From: KartikShrivastava Date: Sun, 7 Aug 2022 17:27:08 +0530 Subject: [PATCH 1/5] First commit of EGM importer --- qbs/imports/libEGM.qbs | 12 ++++ src/plugins/egm/egm.qbs | 16 +++++ src/plugins/egm/egm_global.h | 29 ++++++++ src/plugins/egm/egmplugin.cpp | 83 +++++++++++++++++++++++ src/plugins/egm/egmplugin.h | 51 ++++++++++++++ src/plugins/egm/modules/libEGM/libEGM.qbs | 14 ++++ src/plugins/egm/plugin.json | 1 + src/plugins/plugins.qbs | 1 + 8 files changed, 207 insertions(+) create mode 100644 qbs/imports/libEGM.qbs create mode 100644 src/plugins/egm/egm.qbs create mode 100644 src/plugins/egm/egm_global.h create mode 100644 src/plugins/egm/egmplugin.cpp create mode 100644 src/plugins/egm/egmplugin.h create mode 100644 src/plugins/egm/modules/libEGM/libEGM.qbs create mode 100644 src/plugins/egm/plugin.json diff --git a/qbs/imports/libEGM.qbs b/qbs/imports/libEGM.qbs new file mode 100644 index 0000000000..6f01e9ae48 --- /dev/null +++ b/qbs/imports/libEGM.qbs @@ -0,0 +1,12 @@ +import qbs 1.0 + +Module { + Depends { name: "cpp" } + cpp.includePaths: ["/home/kash/github/RadialGM/Submodules/enigma-dev/CommandLine/libEGM"] + Properties { + cpp.staticLibraries: ["/home/kash/github/RadialGM/Submodules/enigma-dev/libEGM.so", + "/home/kash/github/RadialGM/Submodules/enigma-dev/libENIGMAShared.so", + "/home/kash/github/RadialGM/Submodules/enigma-dev/libProtocols.so", + "/home/kash/github/RadialGM/Submodules/enigma-dev/libcompileEGMf.so"] + } +} diff --git a/src/plugins/egm/egm.qbs b/src/plugins/egm/egm.qbs new file mode 100644 index 0000000000..a4a6eb3238 --- /dev/null +++ b/src/plugins/egm/egm.qbs @@ -0,0 +1,16 @@ +import qbs 1.0 + +TiledPlugin { + cpp.defines: base.concat(["EGM_LIBRARY"]) + + files: [ + "egm_global.h", + "egmplugin.cpp", + "egmplugin.h", + "plugin.json", + ] + + qbsSearchPaths: "./" + + Depends { name: "libEGM" } +} diff --git a/src/plugins/egm/egm_global.h b/src/plugins/egm/egm_global.h new file mode 100644 index 0000000000..9711c2ae4a --- /dev/null +++ b/src/plugins/egm/egm_global.h @@ -0,0 +1,29 @@ +/* + * EGM(Enigma) Tiled Plugin + * Copyright 2022, Kartik Shrivastava + * + * This file is part of Tiled. + * + * 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, see . + */ + +#pragma once + +#include + +#if defined(EGM_LIBRARY) +# define EGMSHARED_EXPORT Q_DECL_EXPORT +#else +# define EGMSHARED_EXPORT Q_DECL_IMPORT +#endif diff --git a/src/plugins/egm/egmplugin.cpp b/src/plugins/egm/egmplugin.cpp new file mode 100644 index 0000000000..c9379b3ae7 --- /dev/null +++ b/src/plugins/egm/egmplugin.cpp @@ -0,0 +1,83 @@ +/* + * EGM(Enigma) Tiled Plugin + * Copyright 2022, Kartik Shrivastava + * + * This file is part of Tiled. + * + * 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, see . + */ + +#include "egmplugin.h" +#include "egm.h" + +#include + +using namespace Tiled; + +namespace Egm { + +EgmPlugin::EgmPlugin() +{ +} + +std::unique_ptr EgmPlugin::read(const QString &fileName) +{ + QFile file(fileName); + + if (!file.open (QIODevice::ReadOnly)) { + mError = QCoreApplication::translate("File Errors", "Could not open file for reading."); + return nullptr; + } + + // default to values of the original Flare alpha game. + Map::Parameters mapParameters; + mapParameters.orientation = Map::Isometric; + mapParameters.width = 256; + mapParameters.height = 256; + mapParameters.tileWidth = 64; + mapParameters.tileHeight = 32; + + auto map = std::make_unique(mapParameters); + + return map; +} + +bool EgmPlugin::supportsFile(const QString &fileName) const +{ + return fileName.endsWith(QLatin1String(".egm"), Qt::CaseInsensitive); +} + +QString EgmPlugin::nameFilter() const +{ + return tr("EGM project files (*.egm)"); +} + +QString EgmPlugin::shortName() const +{ + return QStringLiteral("egm"); +} + +QString EgmPlugin::errorString() const +{ + return mError; +} + +bool EgmPlugin::write(const Tiled::Map *map, const QString &fileName, Options options) +{ + Q_UNUSED(options) + + return true; +} + +} diff --git a/src/plugins/egm/egmplugin.h b/src/plugins/egm/egmplugin.h new file mode 100644 index 0000000000..d6943be0ab --- /dev/null +++ b/src/plugins/egm/egmplugin.h @@ -0,0 +1,51 @@ +/* + * EGM(Enigma) Tiled Plugin + * Copyright 2022, Kartik Shrivastava + * + * This file is part of Tiled. + * + * 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, see . + */ + +#pragma once + +#include "mapformat.h" + +#include "egm_global.h" + +namespace Egm { + +class EGMSHARED_EXPORT EgmPlugin : public Tiled::MapFormat +{ + Q_OBJECT + Q_INTERFACES(Tiled::MapFormat) + Q_PLUGIN_METADATA(IID "org.mapeditor.MapFormat" FILE "plugin.json") + +public: + EgmPlugin(); + + std::unique_ptr read(const QString &fileName) override; + bool supportsFile(const QString &fileName) const override; + + bool write(const Tiled::Map *map, const QString &fileName, Options options) override; + QString nameFilter() const override; + QString shortName() const override; + QString errorString() const override; + +private: + + QString mError; +}; + +} diff --git a/src/plugins/egm/modules/libEGM/libEGM.qbs b/src/plugins/egm/modules/libEGM/libEGM.qbs new file mode 100644 index 0000000000..dde3f437e4 --- /dev/null +++ b/src/plugins/egm/modules/libEGM/libEGM.qbs @@ -0,0 +1,14 @@ +import qbs 1.0 + +Module { + Depends { name: "cpp" } + cpp.includePaths: ["/home/kash/github/RadialGM/Submodules/enigma-dev/CommandLine/libEGM", + "/home/kash/github/RadialGM/Submodules/enigma-dev/shared/protos/.eobjs", + "/home/kash/github/RadialGM/Submodules/enigma-dev/shared"] + Properties { + cpp.staticLibraries: ["/home/kash/github/RadialGM/Submodules/enigma-dev/libEGM.so", + "/home/kash/github/RadialGM/Submodules/enigma-dev/libENIGMAShared.so", + "/home/kash/github/RadialGM/Submodules/enigma-dev/libProtocols.so", + "/home/kash/github/RadialGM/Submodules/enigma-dev/libcompileEGMf.so"] + } +} diff --git a/src/plugins/egm/plugin.json b/src/plugins/egm/plugin.json new file mode 100644 index 0000000000..5e0f4eb8f6 --- /dev/null +++ b/src/plugins/egm/plugin.json @@ -0,0 +1 @@ +{ "defaultEnable": false } diff --git a/src/plugins/plugins.qbs b/src/plugins/plugins.qbs index 2de4b7664b..28802e7ef7 100644 --- a/src/plugins/plugins.qbs +++ b/src/plugins/plugins.qbs @@ -6,6 +6,7 @@ Project { "defold", "defoldcollection", "droidcraft", + "egm", "flare", "gmx", "json", From 16122241fb7737369d1703d4a6b826c8717e80ad Mon Sep 17 00:00:00 2001 From: KartikShrivastava Date: Tue, 23 Aug 2022 20:05:56 +0530 Subject: [PATCH 2/5] Rename plugin from egm to enigma --- qbs/imports/libEGM.qbs | 12 ------- src/plugins/egm/egm.qbs | 16 --------- src/plugins/egm/modules/libEGM/libEGM.qbs | 14 -------- src/plugins/enigma/enigma.qbs | 16 +++++++++ .../egm_global.h => enigma/enigma_global.h} | 8 ++--- .../egmplugin.cpp => enigma/enigmaplugin.cpp} | 34 +++++++++++++------ .../egmplugin.h => enigma/enigmaplugin.h} | 10 +++--- .../enigma/modules/libEnigma/libEnigma.qbs | 27 +++++++++++++++ src/plugins/{egm => enigma}/plugin.json | 0 src/plugins/plugins.qbs | 2 +- 10 files changed, 77 insertions(+), 62 deletions(-) delete mode 100644 qbs/imports/libEGM.qbs delete mode 100644 src/plugins/egm/egm.qbs delete mode 100644 src/plugins/egm/modules/libEGM/libEGM.qbs create mode 100644 src/plugins/enigma/enigma.qbs rename src/plugins/{egm/egm_global.h => enigma/enigma_global.h} (85%) rename src/plugins/{egm/egmplugin.cpp => enigma/enigmaplugin.cpp} (63%) rename src/plugins/{egm/egmplugin.h => enigma/enigmaplugin.h} (89%) create mode 100644 src/plugins/enigma/modules/libEnigma/libEnigma.qbs rename src/plugins/{egm => enigma}/plugin.json (100%) diff --git a/qbs/imports/libEGM.qbs b/qbs/imports/libEGM.qbs deleted file mode 100644 index 6f01e9ae48..0000000000 --- a/qbs/imports/libEGM.qbs +++ /dev/null @@ -1,12 +0,0 @@ -import qbs 1.0 - -Module { - Depends { name: "cpp" } - cpp.includePaths: ["/home/kash/github/RadialGM/Submodules/enigma-dev/CommandLine/libEGM"] - Properties { - cpp.staticLibraries: ["/home/kash/github/RadialGM/Submodules/enigma-dev/libEGM.so", - "/home/kash/github/RadialGM/Submodules/enigma-dev/libENIGMAShared.so", - "/home/kash/github/RadialGM/Submodules/enigma-dev/libProtocols.so", - "/home/kash/github/RadialGM/Submodules/enigma-dev/libcompileEGMf.so"] - } -} diff --git a/src/plugins/egm/egm.qbs b/src/plugins/egm/egm.qbs deleted file mode 100644 index a4a6eb3238..0000000000 --- a/src/plugins/egm/egm.qbs +++ /dev/null @@ -1,16 +0,0 @@ -import qbs 1.0 - -TiledPlugin { - cpp.defines: base.concat(["EGM_LIBRARY"]) - - files: [ - "egm_global.h", - "egmplugin.cpp", - "egmplugin.h", - "plugin.json", - ] - - qbsSearchPaths: "./" - - Depends { name: "libEGM" } -} diff --git a/src/plugins/egm/modules/libEGM/libEGM.qbs b/src/plugins/egm/modules/libEGM/libEGM.qbs deleted file mode 100644 index dde3f437e4..0000000000 --- a/src/plugins/egm/modules/libEGM/libEGM.qbs +++ /dev/null @@ -1,14 +0,0 @@ -import qbs 1.0 - -Module { - Depends { name: "cpp" } - cpp.includePaths: ["/home/kash/github/RadialGM/Submodules/enigma-dev/CommandLine/libEGM", - "/home/kash/github/RadialGM/Submodules/enigma-dev/shared/protos/.eobjs", - "/home/kash/github/RadialGM/Submodules/enigma-dev/shared"] - Properties { - cpp.staticLibraries: ["/home/kash/github/RadialGM/Submodules/enigma-dev/libEGM.so", - "/home/kash/github/RadialGM/Submodules/enigma-dev/libENIGMAShared.so", - "/home/kash/github/RadialGM/Submodules/enigma-dev/libProtocols.so", - "/home/kash/github/RadialGM/Submodules/enigma-dev/libcompileEGMf.so"] - } -} diff --git a/src/plugins/enigma/enigma.qbs b/src/plugins/enigma/enigma.qbs new file mode 100644 index 0000000000..4aec832de2 --- /dev/null +++ b/src/plugins/enigma/enigma.qbs @@ -0,0 +1,16 @@ +import qbs 1.0 + +TiledPlugin { + cpp.defines: base.concat(["ENIGMA_LIBRARY"]) + + files: [ + "enigma_global.h", + "enigmaplugin.cpp", + "enigmaplugin.h", + "plugin.json", + ] + + qbsSearchPaths: "./" + + Depends { name: "libEnigma" } +} diff --git a/src/plugins/egm/egm_global.h b/src/plugins/enigma/enigma_global.h similarity index 85% rename from src/plugins/egm/egm_global.h rename to src/plugins/enigma/enigma_global.h index 9711c2ae4a..24f704ae8a 100644 --- a/src/plugins/egm/egm_global.h +++ b/src/plugins/enigma/enigma_global.h @@ -1,5 +1,5 @@ /* - * EGM(Enigma) Tiled Plugin + * Enigma Tiled Plugin * Copyright 2022, Kartik Shrivastava * * This file is part of Tiled. @@ -22,8 +22,8 @@ #include -#if defined(EGM_LIBRARY) -# define EGMSHARED_EXPORT Q_DECL_EXPORT +#if defined(ENIGMA_LIBRARY) +# define ENIGMASHARED_EXPORT Q_DECL_EXPORT #else -# define EGMSHARED_EXPORT Q_DECL_IMPORT +# define ENIGMASHARED_EXPORT Q_DECL_IMPORT #endif diff --git a/src/plugins/egm/egmplugin.cpp b/src/plugins/enigma/enigmaplugin.cpp similarity index 63% rename from src/plugins/egm/egmplugin.cpp rename to src/plugins/enigma/enigmaplugin.cpp index c9379b3ae7..edf7d71876 100644 --- a/src/plugins/egm/egmplugin.cpp +++ b/src/plugins/enigma/enigmaplugin.cpp @@ -1,5 +1,5 @@ /* - * EGM(Enigma) Tiled Plugin + * Enigma Tiled Plugin * Copyright 2022, Kartik Shrivastava * * This file is part of Tiled. @@ -18,20 +18,23 @@ * this program. If not, see . */ -#include "egmplugin.h" +#include "enigmaplugin.h" #include "egm.h" +#include "tmx.h" #include using namespace Tiled; +using namespace egm; -namespace Egm { +namespace Enigma { -EgmPlugin::EgmPlugin() +EnigmaPlugin::EnigmaPlugin() { + std::cout << "Constructor called" << std::endl; } -std::unique_ptr EgmPlugin::read(const QString &fileName) +std::unique_ptr EnigmaPlugin::read(const QString &fileName) { QFile file(fileName); @@ -50,30 +53,41 @@ std::unique_ptr EgmPlugin::read(const QString &fileName) auto map = std::make_unique(mapParameters); + std::cout << "Trying to read egm file" << std::endl; + + EGMFileFormat egmFileFormat(NULL); + + std::filesystem::path fPath(fileName.toStdString()); + std::unique_ptr project = egmFileFormat.LoadProject(fPath); + if(project) + std::cout << "Object group size " << project->game().root().room().objectgroups_size() << std::endl; + else + std::cout << "Project is null" << std::endl; + return map; } -bool EgmPlugin::supportsFile(const QString &fileName) const +bool EnigmaPlugin::supportsFile(const QString &fileName) const { return fileName.endsWith(QLatin1String(".egm"), Qt::CaseInsensitive); } -QString EgmPlugin::nameFilter() const +QString EnigmaPlugin::nameFilter() const { return tr("EGM project files (*.egm)"); } -QString EgmPlugin::shortName() const +QString EnigmaPlugin::shortName() const { return QStringLiteral("egm"); } -QString EgmPlugin::errorString() const +QString EnigmaPlugin::errorString() const { return mError; } -bool EgmPlugin::write(const Tiled::Map *map, const QString &fileName, Options options) +bool EnigmaPlugin::write(const Tiled::Map *map, const QString &fileName, Options options) { Q_UNUSED(options) diff --git a/src/plugins/egm/egmplugin.h b/src/plugins/enigma/enigmaplugin.h similarity index 89% rename from src/plugins/egm/egmplugin.h rename to src/plugins/enigma/enigmaplugin.h index d6943be0ab..f85b4c4b7a 100644 --- a/src/plugins/egm/egmplugin.h +++ b/src/plugins/enigma/enigmaplugin.h @@ -1,5 +1,5 @@ /* - * EGM(Enigma) Tiled Plugin + * Enigma Tiled Plugin * Copyright 2022, Kartik Shrivastava * * This file is part of Tiled. @@ -22,18 +22,18 @@ #include "mapformat.h" -#include "egm_global.h" +#include "enigma_global.h" -namespace Egm { +namespace Enigma { -class EGMSHARED_EXPORT EgmPlugin : public Tiled::MapFormat +class ENIGMASHARED_EXPORT EnigmaPlugin : public Tiled::MapFormat { Q_OBJECT Q_INTERFACES(Tiled::MapFormat) Q_PLUGIN_METADATA(IID "org.mapeditor.MapFormat" FILE "plugin.json") public: - EgmPlugin(); + EnigmaPlugin(); std::unique_ptr read(const QString &fileName) override; bool supportsFile(const QString &fileName) const override; diff --git a/src/plugins/enigma/modules/libEnigma/libEnigma.qbs b/src/plugins/enigma/modules/libEnigma/libEnigma.qbs new file mode 100644 index 0000000000..4b8e9a6171 --- /dev/null +++ b/src/plugins/enigma/modules/libEnigma/libEnigma.qbs @@ -0,0 +1,27 @@ +import qbs 1.0 + +Module { + Depends { name: "cpp" } + + cpp.includePaths: ["/home/kash/github/RadialGM/Submodules/enigma-dev/CommandLine/libEGM", + "/home/kash/github/RadialGM/Submodules/enigma-dev/shared/protos/.eobjs", + "/home/kash/github/RadialGM/Submodules/enigma-dev/shared", + "/home/kash/github/RadialGM/Submodules/enigma-dev/shared/event_reader"] + + /*cpp.dynamicLibraries: ["/home/kash/github/RadialGM/Submodules/enigma-dev/libEGM.so", + "/home/kash/github/RadialGM/Submodules/enigma-dev/libENIGMAShared.so", + "/home/kash/github/RadialGM/Submodules/enigma-dev/libProtocols.so", + "/home/kash/github/RadialGM/Submodules/enigma-dev/libcompileEGMf.so"]*/ + + cpp.libraryPaths: ["/home/kash/github/RadialGM/Submodules/enigma-dev"] + + cpp.rpaths: ["/home/kash/github/RadialGM/Submodules/enigma-dev"] + + cpp.dynamicLibraries: ["EGM", "ENIGMAShared", "Protocols", "compileEGMf"] + + /*Properties { + cpp.libraryPaths: ["/home/kash/github/RadialGM/Submodules/enigma-dev"] + + cpp.dynamicLibraries: ["EGM", "ENIGMAShared", "Protocols", "compileEGMf"] + }*/ +} diff --git a/src/plugins/egm/plugin.json b/src/plugins/enigma/plugin.json similarity index 100% rename from src/plugins/egm/plugin.json rename to src/plugins/enigma/plugin.json diff --git a/src/plugins/plugins.qbs b/src/plugins/plugins.qbs index 28802e7ef7..d47abee763 100644 --- a/src/plugins/plugins.qbs +++ b/src/plugins/plugins.qbs @@ -6,7 +6,7 @@ Project { "defold", "defoldcollection", "droidcraft", - "egm", + "enigma", "flare", "gmx", "json", From d1187934bc9c5d929f92b054431281f5f5f04e28 Mon Sep 17 00:00:00 2001 From: KartikShrivastava Date: Wed, 24 Aug 2022 22:24:57 +0530 Subject: [PATCH 3/5] Add egm import functionality 1 --- src/plugins/enigma/enigmaplugin.cpp | 180 +++++++++++++++++++++++++--- src/plugins/enigma/enigmaplugin.h | 10 +- 2 files changed, 173 insertions(+), 17 deletions(-) diff --git a/src/plugins/enigma/enigmaplugin.cpp b/src/plugins/enigma/enigmaplugin.cpp index edf7d71876..873ac2ff28 100644 --- a/src/plugins/enigma/enigmaplugin.cpp +++ b/src/plugins/enigma/enigmaplugin.cpp @@ -19,19 +19,132 @@ */ #include "enigmaplugin.h" -#include "egm.h" -#include "tmx.h" +#include "layer.h" +#include "objectgroup.h" +#include "mapobject.h" +#include "tilesetmanager.h" #include using namespace Tiled; using namespace egm; +using TypeCase = buffers::TreeNode::TypeCase; + namespace Enigma { EnigmaPlugin::EnigmaPlugin() { - std::cout << "Constructor called" << std::endl; +} + +Cell EnigmaPlugin::cellForGid(unsigned gid, GidMapper &mGidMapper) +{ + bool ok; + const Cell result = mGidMapper.gidToCell(gid, ok); + + if (!ok) { + if (mGidMapper.isEmpty()) + std::cout << "Tile used but no tilesets specified" << std::endl; + else + std::cout << "Invalid tile: " << gid << std::endl; + } + + return result; +} + +void EnigmaPlugin::addObject(const buffers::resources::EGMRoom_ObjectGroup_Object &obj, Layer *objectGroupLayer, GidMapper &mGidMapper) +{ + const QString name = obj.name().c_str(); + const QString classname = obj.class_().c_str(); + + const qreal x = obj.x(); + // correct the origin which was adjusted in RGM + const qreal y = obj.y() + obj.height(); + const qreal width = obj.width(); + const qreal height = obj.height(); + const QPointF pos(x, y); + const QSizeF size(width, height); + + std::unique_ptr mapObject = std::make_unique(name, classname, pos, size); + mapObject->setId(obj.id()); + + if (obj.has_rotation()) { + mapObject->setRotation(obj.rotation()); + mapObject->setPropertyChanged(MapObject::RotationProperty); + } + + if (obj.has_gid()) { + mapObject->setCell(cellForGid(obj.gid(), mGidMapper)); + mapObject->setPropertyChanged(MapObject::CellProperty); + } + + objectGroupLayer->asObjectGroup()->addObject(std::move(mapObject)); +} + +void EnigmaPlugin::addObjectGroup(const buffers::resources::EGMRoom_ObjectGroup &objGrp, Map *map, GidMapper &mGidMapper) +{ + const QString name = objGrp.name().c_str(); + std::unique_ptr objectGroupLayer = std::make_unique(name, 0, 0); + + objectGroupLayer->setId(objGrp.id()); + + QPointF parallaxFactor(1.0, 1.0); + if(objGrp.has_parallaxx()) + parallaxFactor.setX(objGrp.parallaxx()); + if(objGrp.has_parallaxy()) + parallaxFactor.setY(objGrp.parallaxy()); + objectGroupLayer->setParallaxFactor(parallaxFactor); + + if(objGrp.has_opacity()) + objectGroupLayer->setOpacity(objGrp.opacity()); + + if(objGrp.has_visible()) + objectGroupLayer->setVisible(objGrp.visible()); + + for(int i=0; iaddLayer(std::move(objectGroupLayer)); +} + +SharedTileset EnigmaPlugin::readExternalTileset(const QString &source, QString *error) +{ + return TilesetManager::instance()->loadTileset(source, error); +} + +void EnigmaPlugin::addTileset(const buffers::resources::EGMRoom_Tileset &tilesetProto, Map *map, GidMapper &mGidMapper) +{ + const QString absoluteSource = tilesetProto.source().c_str(); + QString error; + SharedTileset tileset = readExternalTileset(absoluteSource, &error); + + if (!tileset) { + // Insert a placeholder to allow the map to load + tileset = Tileset::create(QFileInfo(absoluteSource).completeBaseName(), 32, 32); + tileset->setFileName(absoluteSource); + tileset->setStatus(LoadingError); + } + + if (tileset)// && !mReadingExternalTileset) + mGidMapper.insert(tilesetProto.firstgid(), tileset); + + map->addTileset(tileset); +} + +int EnigmaPlugin::flattenTree(const buffers::TreeNode &root, buffers::resources::EGMRoom &egmRoom) +{ + if(root.type_case() == TypeCase::kRoom) { + egmRoom = root.room(); + return 0; + } + + for (int i=0; i < root.folder().children_size(); ++i) { + int res = flattenTree(root.folder().children(i), egmRoom); + if (res) return res; + } + + return 0; // success } std::unique_ptr EnigmaPlugin::read(const QString &fileName) @@ -43,24 +156,59 @@ std::unique_ptr EnigmaPlugin::read(const QString &fileName) return nullptr; } - // default to values of the original Flare alpha game. - Map::Parameters mapParameters; - mapParameters.orientation = Map::Isometric; - mapParameters.width = 256; - mapParameters.height = 256; - mapParameters.tileWidth = 64; - mapParameters.tileHeight = 32; - - auto map = std::make_unique(mapParameters); - - std::cout << "Trying to read egm file" << std::endl; + std::unique_ptr map; EGMFileFormat egmFileFormat(NULL); std::filesystem::path fPath(fileName.toStdString()); std::unique_ptr project = egmFileFormat.LoadProject(fPath); - if(project) - std::cout << "Object group size " << project->game().root().room().objectgroups_size() << std::endl; + + if(project) { + buffers::resources::EGMRoom egmRoom = project->game().root().room(); + flattenTree(project->game().root(), egmRoom); + + Map::Parameters mapParameters; + + mapParameters.orientation = Tiled::orientationFromString(egmRoom.orientation().c_str()); + mapParameters.renderOrder = Tiled::renderOrderFromString(egmRoom.renderorder().c_str()); + mapParameters.width = egmRoom.width() / egmRoom.tilewidth(); + mapParameters.height = egmRoom.height() / egmRoom.tileheight(); + mapParameters.tileWidth = egmRoom.tilewidth(); + mapParameters.tileHeight = egmRoom.tileheight(); + mapParameters.infinite = egmRoom.infinite(); + + QPointF parallaxOrigin(1.0, 1.0); + if(egmRoom.has_parallaxoriginx()) + parallaxOrigin.setX(egmRoom.parallaxoriginx()); + if(egmRoom.has_parallaxoriginy()) + parallaxOrigin.setY(egmRoom.parallaxoriginy()); + mapParameters.parallaxOrigin = parallaxOrigin; + + // convert int color to hex string + int intColor = egmRoom.color(); + std::string hexColorStr; + std::stringstream strStream; + strStream << std::hex << intColor; + hexColorStr = strStream.str(); + hexColorStr = "#" + hexColorStr; + const QString backgroundColor = hexColorStr.c_str(); + if (QColor::isValidColor(backgroundColor)) + mapParameters.backgroundColor = QColor(backgroundColor); + + map = std::make_unique(mapParameters); + + map->setNextLayerId(egmRoom.nextlayerid()); + map->setNextObjectId(egmRoom.nextobjectid()); + + GidMapper mGidMapper; + for(int i=0; i Date: Tue, 30 Aug 2022 21:48:22 +0530 Subject: [PATCH 4/5] Add internal tileset and chunk support --- src/plugins/enigma/enigmaplugin.cpp | 469 +++++++++++++++++++++------- src/plugins/enigma/enigmaplugin.h | 16 +- 2 files changed, 367 insertions(+), 118 deletions(-) diff --git a/src/plugins/enigma/enigmaplugin.cpp b/src/plugins/enigma/enigmaplugin.cpp index 873ac2ff28..384ae111a3 100644 --- a/src/plugins/enigma/enigmaplugin.cpp +++ b/src/plugins/enigma/enigmaplugin.cpp @@ -37,51 +37,238 @@ EnigmaPlugin::EnigmaPlugin() { } -Cell EnigmaPlugin::cellForGid(unsigned gid, GidMapper &mGidMapper) +std::unique_ptr EnigmaPlugin::read(const QString &fileName) { - bool ok; - const Cell result = mGidMapper.gidToCell(gid, ok); + QFile file(fileName); + QDir dirPath; - if (!ok) { - if (mGidMapper.isEmpty()) - std::cout << "Tile used but no tilesets specified" << std::endl; - else - std::cout << "Invalid tile: " << gid << std::endl; + if (!file.open (QIODevice::ReadOnly)) { + mError = QCoreApplication::translate("File Errors", "Could not open file for reading."); + return nullptr; } - return result; + dirPath.setPath(fileName); + std::unique_ptr map; + + EGMFileFormat egmFileFormat(NULL); + + std::filesystem::path fPath(fileName.toStdString()); + std::unique_ptr project = egmFileFormat.LoadProject(fPath); + + if(project) { + std::unordered_map backgroundNamePtrMap; + readBackgrounds(project->mutable_game()->mutable_root(), backgroundNamePtrMap); + + buffers::resources::EGMRoom *egmRoom = NULL; + readRoom(project->mutable_game()->mutable_root(), egmRoom); + + if(egmRoom) { + Map::Parameters mapParameters; + + mapParameters.orientation = Tiled::orientationFromString(egmRoom->orientation().c_str()); + mapParameters.renderOrder = Tiled::renderOrderFromString(egmRoom->renderorder().c_str()); + + // corrent width height of map which was updated in egm to suit RGM rendering + if(mapParameters.orientation == Map::Orientation::Orthogonal || mapParameters.orientation == Map::Orientation::Isometric) { + mapParameters.width = egmRoom->width() / egmRoom->tilewidth(); + mapParameters.height = egmRoom->height() / egmRoom->tileheight(); + } + else if(mapParameters.orientation == Map::Orientation::Hexagonal) { + mapParameters.hexSideLength = egmRoom->hexsidelength(); + mapParameters.staggerAxis = Tiled::staggerAxisFromString(egmRoom->staggeraxis().c_str()); + mapParameters.staggerIndex = Tiled::staggerIndexFromString(egmRoom->staggerindex().c_str()); + + if(mapParameters.staggerAxis == Map::StaggerAxis::StaggerX) { + mapParameters.width = (2 * egmRoom->width() - egmRoom->hexsidelength()) / (3 * egmRoom->hexsidelength()); + mapParameters.height = (egmRoom->height() - egmRoom->hexsidelength()) / egmRoom->tileheight(); + } + else if(mapParameters.staggerAxis == Map::StaggerAxis::StaggerY) { + mapParameters.width = (egmRoom->width() - egmRoom->hexsidelength()) / egmRoom->tilewidth(); + mapParameters.height = (2 * egmRoom->height() - egmRoom->hexsidelength()) / (3 * egmRoom->hexsidelength()); + } + } + else if(mapParameters.orientation == Map::Orientation::Staggered){ + mapParameters.staggerAxis = Tiled::staggerAxisFromString(egmRoom->staggeraxis().c_str()); + mapParameters.staggerIndex = Tiled::staggerIndexFromString(egmRoom->staggerindex().c_str()); + + if(mapParameters.staggerAxis == Map::StaggerAxis::StaggerX) { + mapParameters.width = egmRoom->width() * 2 / egmRoom->tilewidth(); + mapParameters.height = egmRoom->height() / egmRoom->tileheight(); + } + else if(mapParameters.staggerAxis == Map::StaggerAxis::StaggerY) { + mapParameters.width = egmRoom->width() / egmRoom->tilewidth(); + mapParameters.height = egmRoom->height() * 2 / egmRoom->tileheight(); + } + } + + mapParameters.tileWidth = egmRoom->tilewidth(); + mapParameters.tileHeight = egmRoom->tileheight(); + mapParameters.infinite = egmRoom->infinite(); + + if(egmRoom->has_parallaxoriginx()) + mapParameters.parallaxOrigin.setX(egmRoom->parallaxoriginx()); + if(egmRoom->has_parallaxoriginy()) + mapParameters.parallaxOrigin.setY(egmRoom->parallaxoriginy()); + + if(egmRoom->has_color()) { + const QString backgroundColor = parseIntColor(egmRoom->color()); + if (QColor::isValidColor(backgroundColor)) + mapParameters.backgroundColor = QColor(backgroundColor); + } + + map = std::make_unique(mapParameters); + + if(egmRoom->has_nextlayerid()) + map->setNextLayerId(egmRoom->nextlayerid()); + if(egmRoom->has_nextobjectid()) + map->setNextObjectId(egmRoom->nextobjectid()); + + GidMapper gidMapper; + for(int i=0; itilesets_size(); ++i) { + addTileset(egmRoom->tilesets(i), map.get(), gidMapper, backgroundNamePtrMap); + } + + for(int i=0; iobjectgroups_size(); ++i) { + addObjectGroup(egmRoom->objectgroups(i), map.get(), gidMapper); + } + + for(int i=0; itilelayers_size(); ++i) { + addTileLayer(egmRoom->tilelayers(i), map.get(), gidMapper); + } + } + } + else + std::cout << "Project is null" << std::endl; + + return map; } -void EnigmaPlugin::addObject(const buffers::resources::EGMRoom_ObjectGroup_Object &obj, Layer *objectGroupLayer, GidMapper &mGidMapper) +int EnigmaPlugin::readBackgrounds(buffers::TreeNode *root, std::unordered_map &backgroundNamePtrMap) { - const QString name = obj.name().c_str(); - const QString classname = obj.class_().c_str(); + if(root->type_case() == TypeCase::kBackground) { + if(root->background().name().empty()) { + std::cout << "Error background name not set properly" << std::endl; + return -1; + } + backgroundNamePtrMap[root->background().name()] = root->mutable_background(); + return 0; + } - const qreal x = obj.x(); - // correct the origin which was adjusted in RGM - const qreal y = obj.y() + obj.height(); - const qreal width = obj.width(); - const qreal height = obj.height(); - const QPointF pos(x, y); - const QSizeF size(width, height); + for (int i=0; i < root->folder().children_size(); ++i) { + int res = readBackgrounds(root->mutable_folder()->mutable_children(i), backgroundNamePtrMap); + if (res) return res; + } - std::unique_ptr mapObject = std::make_unique(name, classname, pos, size); - mapObject->setId(obj.id()); + return 0; // success +} - if (obj.has_rotation()) { - mapObject->setRotation(obj.rotation()); - mapObject->setPropertyChanged(MapObject::RotationProperty); +int EnigmaPlugin::readRoom(buffers::TreeNode *root, buffers::resources::EGMRoom *&egmRoom) +{ + if(root->type_case() == TypeCase::kRoom) { + egmRoom = root->mutable_room(); + return 0; } - if (obj.has_gid()) { - mapObject->setCell(cellForGid(obj.gid(), mGidMapper)); - mapObject->setPropertyChanged(MapObject::CellProperty); + for (int i=0; i < root->folder().children_size(); ++i) { + int res = readRoom(root->mutable_folder()->mutable_children(i), egmRoom); + if (res) return res; } - objectGroupLayer->asObjectGroup()->addObject(std::move(mapObject)); + return 0; // success +} + +QString EnigmaPlugin::parseIntColor(int intColor) +{ + // convert int color to hex string + std::string hexColorStr; + std::stringstream strStream; + strStream << std::hex << intColor; + hexColorStr = strStream.str(); + hexColorStr = "#" + hexColorStr; + QString backgroundColor = hexColorStr.c_str(); + + return backgroundColor; +} + +void EnigmaPlugin::addTileset(const buffers::resources::EGMRoom_Tileset &tilesetProto, Map *map, GidMapper &gidMapper, + std::unordered_map backgroundNamePtrMap) +{ + SharedTileset tileset; + + const QString absoluteSource = tilesetProto.source().c_str(); + const unsigned firstGid = tilesetProto.firstgid(); + + // read internal/embedded tileset + if(absoluteSource.isEmpty()) { + const QString name = tilesetProto.name().c_str(); + + // TODO: Add element support to internal tileset + // if there is no direct match of name in backgroundNamePtrMap then, the tileset was a collection of individual + // images (tile) prior to conversion to background, so iterate over all backgrounds starting with name + if(backgroundNamePtrMap.find(tilesetProto.name()) == backgroundNamePtrMap.end()) { + + } + // otherwise this internal tileset is made out of a single image so mostly straightforward thingy + else { + const int tileWidth = tilesetProto.tilewidth(); + const int tileHeight = tilesetProto.tileheight(); + + if (tileWidth < 0 || tileHeight < 0 || firstGid == 0) {//== 0 && !mReadingExternalTileset)) { + std::cout <<"Invalid tileset parameters for tileset " << name.toStdString(); + return; + } + + buffers::resources::Background *bgProto = backgroundNamePtrMap[name.toStdString()]; + + const int tileSpacing = bgProto->horizontal_spacing(); // also same as bgProto.vertical_spacing + const int margin = bgProto->horizontal_offset(); // also same as bgProto.vertical_offset + const int columns = bgProto->columns(); + + tileset = Tileset::create(name, tileWidth, tileHeight, tileSpacing, margin); + + tileset->setColumnCount(columns); + + // TODO: Add properties as required + // tileset->setClassName(className); + // if (QColor::isValidColor(backgroundColor)) + // tileset->setBackgroundColor(QColor(backgroundColor)); + // tileset->setObjectAlignment(alignmentFromString(alignment)); + // tileset->setTileRenderSize(Tileset::tileRenderSizeFromString(tileRenderSize)); + // tileset->setFillMode(Tileset::fillModeFromString(fillMode)); + + ImageReference image; + image.source = QUrl(bgProto->image().c_str()); + image.size = QSize(bgProto->width(), bgProto->height()); + + tileset->setImageReference(image); + tileset->setImageSource(bgProto->image().c_str()); + + // TODO: Add other properties of internal tilesets + } + } + // read external tileset + else { + QString error; + tileset = TilesetManager::instance()->loadTileset(absoluteSource, &error); + + if (!tileset) { + // Insert a placeholder to allow the map to load + tileset = Tileset::create(QFileInfo(absoluteSource).completeBaseName(), 32, 32); + tileset->setFileName(absoluteSource); + tileset->setStatus(LoadingError); + } + } + + if(tileset) { + gidMapper.insert(tilesetProto.firstgid(), tileset); + map->addTileset(tileset); + // Try to load the tileset images for embedded tilesets + tileset->loadImage(); + } } -void EnigmaPlugin::addObjectGroup(const buffers::resources::EGMRoom_ObjectGroup &objGrp, Map *map, GidMapper &mGidMapper) +void EnigmaPlugin::addObjectGroup(const buffers::resources::EGMRoom_ObjectGroup &objGrp, Map *map, GidMapper &gidMapper) { const QString name = objGrp.name().c_str(); std::unique_ptr objectGroupLayer = std::make_unique(name, 0, 0); @@ -102,117 +289,173 @@ void EnigmaPlugin::addObjectGroup(const buffers::resources::EGMRoom_ObjectGroup objectGroupLayer->setVisible(objGrp.visible()); for(int i=0; iaddLayer(std::move(objectGroupLayer)); } -SharedTileset EnigmaPlugin::readExternalTileset(const QString &source, QString *error) +void EnigmaPlugin::addObject(const buffers::resources::EGMRoom_ObjectGroup_Object &obj, Layer *objectGroupLayer, + GidMapper &gidMapper) { - return TilesetManager::instance()->loadTileset(source, error); + const QString name = obj.name().c_str(); + const QString classname = obj.class_().c_str(); + + const qreal x = obj.x(); + // correct the origin which was adjusted in RGM + const qreal y = obj.y() + obj.height(); + const qreal width = obj.width(); + const qreal height = obj.height(); + const QPointF pos(x, y); + const QSizeF size(width, height); + + std::unique_ptr mapObject = std::make_unique(name, classname, pos, size); + mapObject->setId(obj.id()); + + if (obj.has_rotation()) { + mapObject->setRotation(obj.rotation()); + mapObject->setPropertyChanged(MapObject::RotationProperty); + } + + if (obj.has_gid()) { + mapObject->setCell(cellForGid(obj.gid(), gidMapper)); + mapObject->setPropertyChanged(MapObject::CellProperty); + } + + objectGroupLayer->asObjectGroup()->addObject(std::move(mapObject)); } -void EnigmaPlugin::addTileset(const buffers::resources::EGMRoom_Tileset &tilesetProto, Map *map, GidMapper &mGidMapper) +Cell EnigmaPlugin::cellForGid(unsigned gid, GidMapper &gidMapper) { - const QString absoluteSource = tilesetProto.source().c_str(); - QString error; - SharedTileset tileset = readExternalTileset(absoluteSource, &error); - - if (!tileset) { - // Insert a placeholder to allow the map to load - tileset = Tileset::create(QFileInfo(absoluteSource).completeBaseName(), 32, 32); - tileset->setFileName(absoluteSource); - tileset->setStatus(LoadingError); - } + bool ok; + const Cell result = gidMapper.gidToCell(gid, ok); - if (tileset)// && !mReadingExternalTileset) - mGidMapper.insert(tilesetProto.firstgid(), tileset); + if (!ok) { + if (gidMapper.isEmpty()) + std::cout << "Tile used but no tilesets specified" << std::endl; + else + std::cout << "Invalid tile: " << gid << std::endl; + } - map->addTileset(tileset); + return result; } -int EnigmaPlugin::flattenTree(const buffers::TreeNode &root, buffers::resources::EGMRoom &egmRoom) +void EnigmaPlugin::addTileLayer(const buffers::resources::EGMRoom_TileLayer &tileLayer, Map *map, GidMapper &gidMapper) { - if(root.type_case() == TypeCase::kRoom) { - egmRoom = root.room(); - return 0; + const QString name = tileLayer.name().c_str(); + + const int x = tileLayer.x(); + const int y = tileLayer.y(); + const int width = tileLayer.width(); + const int height = tileLayer.height(); + + std::unique_ptr tileLayerTiled = std::make_unique(name, x, y, width, height); + + tileLayerTiled->setClassName(tileLayer.class_().c_str()); + + if(tileLayer.has_id()) + tileLayerTiled->setId(tileLayer.id()); + + if(tileLayer.has_opacity()) + tileLayerTiled->setOpacity(tileLayer.opacity()); + + if(tileLayer.has_tintcolor()) { + const QString tintColor = tileLayer.tintcolor().c_str(); + if (!tintColor.isEmpty()) + tileLayerTiled->setTintColor(QColor(tintColor)); } - for (int i=0; i < root.folder().children_size(); ++i) { - int res = flattenTree(root.folder().children(i), egmRoom); - if (res) return res; + if(tileLayer.has_visible()) + tileLayerTiled->setVisible(tileLayer.visible()); + + if(tileLayer.has_locked()) + tileLayerTiled->setLocked(tileLayer.locked()); + + if(tileLayer.has_offsetx() && tileLayer.has_offsety()) { + const QPointF offset(tileLayer.offsetx(), tileLayer.offsety()); + tileLayerTiled->setOffset(offset); } - return 0; // success -} + QPointF parallaxFactor(1.0, 1.0); + if(tileLayer.has_parallaxx()) + parallaxFactor.setX(tileLayer.parallaxx()); + if(tileLayer.has_parallaxy()) + parallaxFactor.setX(tileLayer.parallaxy()); + + tileLayerTiled->setParallaxFactor(parallaxFactor); + + if(tileLayer.has_data()) { + const QString encoding = tileLayer.data().encoding().c_str(); + const QString compression = tileLayer.data().compression().c_str(); + + Map::LayerDataFormat layerDataFormat; + if (encoding.isEmpty()) { + layerDataFormat = Map::XML; + } else if (encoding == QLatin1String("csv")) { + layerDataFormat = Map::CSV; + } else if (encoding == QLatin1String("base64")) { + if (compression.isEmpty()) { + layerDataFormat = Map::Base64; + } else if (compression == QLatin1String("gzip")) { + layerDataFormat = Map::Base64Gzip; + } else if (compression == QLatin1String("zlib")) { + layerDataFormat = Map::Base64Zlib; + } else if (compression == QLatin1String("zstd")) { + layerDataFormat = Map::Base64Zstandard; + } else { + std::cout << "Compression method " << compression.toStdString() << " not supported" << std::endl; + return; + } + } else { + std::cout << "Unknown encoding: " << encoding.toStdString() << std::endl; + return; + } -std::unique_ptr EnigmaPlugin::read(const QString &fileName) -{ - QFile file(fileName); + map->setLayerDataFormat(layerDataFormat); - if (!file.open (QIODevice::ReadOnly)) { - mError = QCoreApplication::translate("File Errors", "Could not open file for reading."); - return nullptr; + // cell x and y positions + int x = 0; + int y = 0; + + // iterate over all tiles present inside data node + for(int i = 0; i < tileLayer.data().tiles_size(); ++i, ++x) { + if(x == height) { + x=0; + y++; + } + + if(!tileLayer.data().tiles(i).has_gid()) + continue; + + unsigned int gid = tileLayer.data().tiles(i).gid(); + + tileLayerTiled->setCell(x, y, cellForGid(gid, gidMapper)); } - std::unique_ptr map; + // iterate over all chunks and subsequent tiles present inside it + for(int i = 0; i < tileLayer.data().chunks_size(); ++i) { + int xStart = tileLayer.data().chunks(i).x(); + x = xStart; + y = tileLayer.data().chunks(i).y(); - EGMFileFormat egmFileFormat(NULL); + int chunkHeight = tileLayer.data().chunks(i).height(); - std::filesystem::path fPath(fileName.toStdString()); - std::unique_ptr project = egmFileFormat.LoadProject(fPath); + for(int j = 0; j < tileLayer.data().chunks(i).tiles_size(); ++j, ++x) { + if(x == xStart + chunkHeight) { + x = xStart; + y++; + } - if(project) { - buffers::resources::EGMRoom egmRoom = project->game().root().room(); - flattenTree(project->game().root(), egmRoom); - - Map::Parameters mapParameters; - - mapParameters.orientation = Tiled::orientationFromString(egmRoom.orientation().c_str()); - mapParameters.renderOrder = Tiled::renderOrderFromString(egmRoom.renderorder().c_str()); - mapParameters.width = egmRoom.width() / egmRoom.tilewidth(); - mapParameters.height = egmRoom.height() / egmRoom.tileheight(); - mapParameters.tileWidth = egmRoom.tilewidth(); - mapParameters.tileHeight = egmRoom.tileheight(); - mapParameters.infinite = egmRoom.infinite(); - - QPointF parallaxOrigin(1.0, 1.0); - if(egmRoom.has_parallaxoriginx()) - parallaxOrigin.setX(egmRoom.parallaxoriginx()); - if(egmRoom.has_parallaxoriginy()) - parallaxOrigin.setY(egmRoom.parallaxoriginy()); - mapParameters.parallaxOrigin = parallaxOrigin; - - // convert int color to hex string - int intColor = egmRoom.color(); - std::string hexColorStr; - std::stringstream strStream; - strStream << std::hex << intColor; - hexColorStr = strStream.str(); - hexColorStr = "#" + hexColorStr; - const QString backgroundColor = hexColorStr.c_str(); - if (QColor::isValidColor(backgroundColor)) - mapParameters.backgroundColor = QColor(backgroundColor); - - map = std::make_unique(mapParameters); - - map->setNextLayerId(egmRoom.nextlayerid()); - map->setNextObjectId(egmRoom.nextobjectid()); - - GidMapper mGidMapper; - for(int i=0; isetCell(x, y, cellForGid(gid, gidMapper)); } } - else - std::cout << "Project is null" << std::endl; - - return map; + } + map->addLayer(std::move(tileLayerTiled)); } bool EnigmaPlugin::supportsFile(const QString &fileName) const @@ -239,7 +482,7 @@ bool EnigmaPlugin::write(const Tiled::Map *map, const QString &fileName, Options { Q_UNUSED(options) - return true; + return false; } } diff --git a/src/plugins/enigma/enigmaplugin.h b/src/plugins/enigma/enigmaplugin.h index 0e1f3fbb75..fc42aa0ae2 100644 --- a/src/plugins/enigma/enigmaplugin.h +++ b/src/plugins/enigma/enigmaplugin.h @@ -48,12 +48,18 @@ class ENIGMASHARED_EXPORT EnigmaPlugin : public Tiled::MapFormat private: QString mError; - Tiled::Cell cellForGid(unsigned gid, Tiled::GidMapper &mGidMapper); - void addObject(const buffers::resources::EGMRoom_ObjectGroup_Object &obj, Tiled::Layer *objectGroupLayer, Tiled::GidMapper &mGidMapper); + int readBackgrounds(buffers::TreeNode *root, std::unordered_map &backgroundNamePtrMap); + int readRoom(buffers::TreeNode *root, buffers::resources::EGMRoom *&egmRoom); + void addTileset(const buffers::resources::EGMRoom_Tileset &tilesetProto, Tiled::Map *map, Tiled::GidMapper &mGidMapper, + std::unordered_map backgroundNamePtrMap); + QString parseIntColor(int intColor); void addObjectGroup(const buffers::resources::EGMRoom_ObjectGroup &objGrp, Tiled::Map *map, Tiled::GidMapper &mGidMapper); - Tiled::SharedTileset readExternalTileset(const QString &source, QString *error); - void addTileset(const buffers::resources::EGMRoom_Tileset &tilesetProto, Tiled::Map *map, Tiled::GidMapper &mGidMapper); - int flattenTree(const buffers::TreeNode &root, buffers::resources::EGMRoom &egmRoom); + void addObject(const buffers::resources::EGMRoom_ObjectGroup_Object &obj, Tiled::Layer *objectGroupLayer, + Tiled::GidMapper &mGidMapper); + Tiled::Cell cellForGid(unsigned gid, Tiled::GidMapper &mGidMapper); + void addTileLayer(const buffers::resources::EGMRoom_TileLayer &tileLayer, Tiled::Map *map, Tiled::GidMapper &mGidMapper); + }; } From d0b408404c19cfbc7a2cd9619b8b9af463b48319 Mon Sep 17 00:00:00 2001 From: KartikShrivastava Date: Tue, 6 Sep 2022 22:11:51 +0530 Subject: [PATCH 5/5] Replace hardcoded path with env var in qbs --- .../enigma/modules/libEnigma/libEnigma.qbs | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/plugins/enigma/modules/libEnigma/libEnigma.qbs b/src/plugins/enigma/modules/libEnigma/libEnigma.qbs index 4b8e9a6171..d421418d27 100644 --- a/src/plugins/enigma/modules/libEnigma/libEnigma.qbs +++ b/src/plugins/enigma/modules/libEnigma/libEnigma.qbs @@ -1,27 +1,19 @@ -import qbs 1.0 +import qbs +import qbs.Environment Module { Depends { name: "cpp" } - cpp.includePaths: ["/home/kash/github/RadialGM/Submodules/enigma-dev/CommandLine/libEGM", - "/home/kash/github/RadialGM/Submodules/enigma-dev/shared/protos/.eobjs", - "/home/kash/github/RadialGM/Submodules/enigma-dev/shared", - "/home/kash/github/RadialGM/Submodules/enigma-dev/shared/event_reader"] + property string enigmaPath: Environment.getEnv("ENIGMA_PATH") - /*cpp.dynamicLibraries: ["/home/kash/github/RadialGM/Submodules/enigma-dev/libEGM.so", - "/home/kash/github/RadialGM/Submodules/enigma-dev/libENIGMAShared.so", - "/home/kash/github/RadialGM/Submodules/enigma-dev/libProtocols.so", - "/home/kash/github/RadialGM/Submodules/enigma-dev/libcompileEGMf.so"]*/ + cpp.includePaths: [enigmaPath + "/CommandLine/libEGM", + enigmaPath + "/shared/protos/.eobjs", + enigmaPath + "/shared", + enigmaPath + "/shared/event_reader"] - cpp.libraryPaths: ["/home/kash/github/RadialGM/Submodules/enigma-dev"] + cpp.libraryPaths: [enigmaPath] - cpp.rpaths: ["/home/kash/github/RadialGM/Submodules/enigma-dev"] + cpp.rpaths: [enigmaPath] cpp.dynamicLibraries: ["EGM", "ENIGMAShared", "Protocols", "compileEGMf"] - - /*Properties { - cpp.libraryPaths: ["/home/kash/github/RadialGM/Submodules/enigma-dev"] - - cpp.dynamicLibraries: ["EGM", "ENIGMAShared", "Protocols", "compileEGMf"] - }*/ }