porymap/include/core/metatile.h
2023-12-15 14:33:01 -05:00

101 lines
3.1 KiB
C++

#pragma once
#ifndef METATILE_H
#define METATILE_H
#include "tile.h"
#include "config.h"
#include "bitpacker.h"
#include <QImage>
#include <QPoint>
#include <QString>
class Project;
// TODO: Reevaluate enums
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<Tile> 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<uint32_t>(value)); }
void setTerrainType(int value) { this->setAttribute(Attr::TerrainType, static_cast<uint32_t>(value)); }
void setEncounterType(int value) { this->setAttribute(Attr::EncounterType, static_cast<uint32_t>(value)); }
void setLayerType(int value) { this->setAttribute(Attr::LayerType, static_cast<uint32_t>(value)); }
static int getIndexInTileset(int);
static QPoint coordFromPixmapCoord(const QPointF &pixelCoord);
static uint32_t getDefaultAttributesMask(BaseGameVersion version, Metatile::Attr attr);
static int getDefaultAttributesSize(BaseGameVersion version);
static void setLayout(Project*);
static QString getMetatileIdString(uint16_t metatileId) {
return "0x" + QString("%1").arg(metatileId, 3, 16, QChar('0')).toUpper();
};
static QString getMetatileIdStringList(const QList<uint16_t> metatileIds) {
QStringList metatiles;
for (auto metatileId : metatileIds)
metatiles << Metatile::getMetatileIdString(metatileId);
return metatiles.join(",");
};
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<Metatile::Attr, uint32_t> attributes;
static bool doMasksOverlap(QList<uint32_t>);
};
#endif // METATILE_H