#pragma once #ifndef TILESET_H #define TILESET_H #include "metatile.h" #include "tile.h" #include #include struct MetatileLabelPair { QString owned; QString shared; }; class Tileset { public: Tileset() = default; Tileset(const Tileset &other); Tileset &operator=(const Tileset &other); ~Tileset(); public: QString name; bool is_secondary; QString tiles_label; QString palettes_label; QString metatiles_label; QString metatiles_path; QString metatile_attrs_label; QString metatile_attrs_path; QString tilesImagePath; QStringList palettePaths; QHash metatileLabels; QList> palettes; QList> palettePreviews; static QString stripPrefix(const QString &fullName); static Tileset* getPaletteTileset(int, Tileset*, Tileset*); static const Tileset* getPaletteTileset(int, const Tileset*, const Tileset*); static Tileset* getMetatileTileset(int, Tileset*, Tileset*); static const Tileset* getMetatileTileset(int, const Tileset*, const Tileset*); static Tileset* getTileTileset(int, Tileset*, Tileset*); static const Tileset* getTileTileset(int, const Tileset*, const Tileset*); static Metatile* getMetatile(int, Tileset*, Tileset*); static const Metatile* getMetatile(int, const Tileset*, const Tileset*); static Tileset* getMetatileLabelTileset(int, Tileset*, Tileset*); static QString getMetatileLabel(int, Tileset *, Tileset *); static QString getOwnedMetatileLabel(int, Tileset *, Tileset *); static MetatileLabelPair getMetatileLabelPair(int metatileId, Tileset *primaryTileset, Tileset *secondaryTileset); static bool setMetatileLabel(int, QString, Tileset *, Tileset *); QString getMetatileLabelPrefix(); static QString getMetatileLabelPrefix(const QString &name); static QList> getBlockPalettes(const Tileset*, const Tileset*, bool useTruePalettes = false); static QList getPalette(int, const Tileset*, const Tileset*, bool useTruePalettes = false); static bool metatileIsValid(uint16_t metatileId, const Tileset*, const Tileset*); static QHash getHeaderMemberMap(bool usingAsm); static QString getExpectedDir(QString tilesetName, bool isSecondary); QString getExpectedDir(); bool load(); bool loadMetatiles(); bool loadMetatileAttributes(); bool loadTilesImage(QImage *importedImage = nullptr); bool loadPalettes(); bool save(); bool saveMetatileAttributes(); bool saveMetatiles(); bool saveTilesImage(); bool savePalettes(); bool appendToHeaders(const QString &filepath, const QString &friendlyName, bool usingAsm); bool appendToGraphics(const QString &filepath, const QString &friendlyName, bool usingAsm); bool appendToMetatiles(const QString &filepath, const QString &friendlyName, bool usingAsm); void setTilesImage(const QImage &image); void setMetatiles(const QList &metatiles); void addMetatile(Metatile* metatile); const QList &metatiles() const { return m_metatiles; } const Metatile* metatileAt(unsigned int i) const { return m_metatiles.at(i); } void clearMetatiles(); void resizeMetatiles(int newNumMetatiles); int numMetatiles() const { return m_metatiles.length(); } int maxMetatiles() const; uint16_t firstMetatileId() const; uint16_t lastMetatileId() const; bool containsMetatileId(uint16_t metatileId) const { return metatileId >= firstMetatileId() && metatileId <= lastMetatileId(); } uint16_t firstTileId() const; uint16_t lastTileId() const; bool containsTileId(uint16_t tileId) const { return tileId >= firstTileId() && tileId <= lastTileId(); } int numTiles() const { return m_tiles.length(); } int maxTiles() const; QImage tileImage(uint16_t tileId) const { return m_tiles.value(Tile::getIndexInTileset(tileId)); } QSet getUnusedColorIds(int paletteId, const Tileset *pairedTileset, const QSet &searchColors = {}) const; QList findMetatilesUsingColor(int paletteId, int colorId, const Tileset *pairedTileset) const; static constexpr int maxPalettes() { return 16; } static constexpr int numColorsPerPalette() { return 16; } private: QList m_metatiles; QList m_tiles; QImage m_tilesImage; bool m_hasUnsavedTilesImage = false; }; #endif // TILESET_H