#pragma once #ifndef METATILE_H #define METATILE_H #include "tile.h" #include "config.h" #include "bitpacker.h" #include #include #include class Project; enum { METATILE_LAYER_MIDDLE_TOP, METATILE_LAYER_BOTTOM_MIDDLE, METATILE_LAYER_BOTTOM_TOP, NUM_METATILE_LAYER_TYPES }; enum { ENCOUNTER_NONE, ENCOUNTER_LAND, ENCOUNTER_WATER, NUM_METATILE_ENCOUNTER_TYPES }; enum { TERRAIN_NONE, TERRAIN_GRASS, TERRAIN_WATER, TERRAIN_WATERFALL, NUM_METATILE_TERRAIN_TYPES }; class Metatile { public: Metatile() = default; Metatile(const Metatile &other) = default; Metatile &operator=(const Metatile &other) = default; Metatile(const int numTiles); enum Attr { Behavior, TerrainType, EncounterType, LayerType, Unused, // Preserve bits not used by the other attributes }; public: QList tiles; uint32_t getAttributes() const; uint32_t getAttribute(Metatile::Attr attr) const { return this->attributes.value(attr, 0); } void setAttributes(uint32_t data); void setAttributes(uint32_t data, BaseGameVersion version); void setAttribute(Metatile::Attr attr, uint32_t value); // For convenience uint32_t behavior() const { return this->getAttribute(Attr::Behavior); } uint32_t terrainType() const { return this->getAttribute(Attr::TerrainType); } uint32_t encounterType() const { return this->getAttribute(Attr::EncounterType); } uint32_t layerType() const { return this->getAttribute(Attr::LayerType); } void setBehavior(int value) { this->setAttribute(Attr::Behavior, static_cast(value)); } void setTerrainType(int value) { this->setAttribute(Attr::TerrainType, static_cast(value)); } void setEncounterType(int value) { this->setAttribute(Attr::EncounterType, static_cast(value)); } void setLayerType(int value) { this->setAttribute(Attr::LayerType, static_cast(value)); } static int getIndexInTileset(int); static QPoint coordFromPixmapCoord(const QPointF &pixelCoord); static uint32_t getDefaultAttributesMask(BaseGameVersion version, Metatile::Attr attr); static uint32_t getMaxAttributesMask(); static int getDefaultAttributesSize(BaseGameVersion version); static void setLayout(Project*); static QString getMetatileIdString(uint16_t metatileId); static QString getMetatileIdStrings(const QList metatileIds); inline bool operator==(const Metatile &other) { return this->tiles == other.tiles && this->attributes == other.attributes; } inline bool operator!=(const Metatile &other) { return !(operator==(other)); } private: QMap attributes; }; #endif // METATILE_H