diff --git a/include/core/regionmap.h b/include/core/regionmap.h index f16f35f2..3c85d847 100644 --- a/include/core/regionmap.h +++ b/include/core/regionmap.h @@ -84,6 +84,7 @@ public: void save(); void saveTilemap(); void saveLayout(); + void saveConfig();// ? or do this in the editor only? void saveOptions(int id, QString sec, QString name, int x, int y); void resize(int width, int height); @@ -98,6 +99,7 @@ public: shared_ptr getTile(int x, int y); bool squareHasMap(int index); QString squareMapSection(int index); + void setSquareMapSection(int index, QString section); int squareX(int index); int squareY(int index); bool squareInLayout(int x, int y); @@ -116,6 +118,9 @@ public: QVector getTiles(); void setTiles(QVector tileIds); + QByteArray getTilemap(); + void setTilemap(QByteArray newTilemap); + QStringList getLayers() { return this->layout_layers; } void setLayer(QString layer) { this->current_layer = layer; } QString getLayer() { return this->current_layer; } @@ -142,7 +147,7 @@ public: QString fullPath(QString local); private: - + // TODO: defaults needed? tsl::ordered_map *region_map_entries = nullptr; QString alias; @@ -150,18 +155,14 @@ private: int tilemap_width; int tilemap_height; - // default is 32x20 (or 30x20 / screen size??) int region_width; int region_height; - // default is 28x15 int layout_width; int layout_height; int offset_left; int offset_top; - //int ; - //int img_height_; TilemapFormat tilemap_format; @@ -175,30 +176,22 @@ private: QString entries_path; QString layout_path; - // TODO: default values? QString layout_array_label; bool layout_uses_layers = false; - //QList layout_layers; + QStringList layout_constants; + QString layout_qualifiers; - //QList map_squares; QList> tilemap; - // what about separate array for layout - // and a pointer to an entries / map sections object (from project? or editor?) - QStringList layout_layers; + QStringList layout_layers; // TODO: is this used? QString current_layer; - // TODO: qstring, or {section name, x, y, section_id, has_map} - QMap> layouts; // key: layer, value: layout list + // TODO: just use ordered map? + QMap> layouts; // key: layer, value: layout // TODO QString city_map_tiles_path; - // todo: no???? why would i be doing this it's pointless - // let the user figure this shit out - bool region_map_png_needs_saving = false; - bool city_map_png_needs_saving = false; - int get_tilemap_index(int x, int y); int get_layout_index(int x, int y); }; diff --git a/include/ui/tilemaptileselector.h b/include/ui/tilemaptileselector.h index ab266fbc..c7e45b47 100644 --- a/include/ui/tilemaptileselector.h +++ b/include/ui/tilemaptileselector.h @@ -60,7 +60,7 @@ public: virtual void setVFlip(bool vFlip) { this->vFlip_ = vFlip; } virtual void setPalette(int palette) { this->palette_ = palette; } - virtual QString info() { + virtual QString info() const { return QString("Tile: 0x") + QString("%1 ").arg(this->id(), 4, 16, QChar('0')).toUpper(); } }; @@ -70,6 +70,8 @@ public: PlainTile(unsigned raw) : TilemapTile(raw, raw, false, false, 0) {} ~PlainTile() {} + + virtual unsigned raw () const override { return id(); } }; class BPP4Tile : public TilemapTile { @@ -84,7 +86,11 @@ public: ~BPP4Tile() {} - virtual QString info() override { + virtual unsigned raw () const override { + return (id()) | (hFlip() << 10) | (vFlip() << 11) | (palette() << 12); + } + + virtual QString info() const override { return TilemapTile::info() + QString("hFlip: %1 vFlip: %2 palette: %3").arg(this->hFlip()).arg(this->vFlip()).arg(this->palette()); } }; @@ -101,7 +107,11 @@ public: ~BPP8Tile() {} - virtual QString info() override { + virtual unsigned raw () const override { + return (id()) | (hFlip() << 10) | (vFlip() << 11); + } + + virtual QString info() const override { return TilemapTile::info() + QString("hFlip: %1 vFlip: %2").arg(this->hFlip()).arg(this->vFlip()); } }; diff --git a/src/core/regionmap.cpp b/src/core/regionmap.cpp index 88116268..f4b43933 100644 --- a/src/core/regionmap.cpp +++ b/src/core/regionmap.cpp @@ -84,43 +84,19 @@ bool RegionMap::loadTilemap(poryjson::Json tilemapJson) { this->palette_path = tilemapObject["palette"].string_value(); } - QFile tilemapFile(fullPath(tilemap_path)); + QFile tilemapFile(fullPath(this->tilemap_path)); if (!tilemapFile.open(QIODevice::ReadOnly)) { logError(QString("Failed to open region map tilemap file %1.").arg(tilemap_path)); return false; } - QDataStream dataStream(&tilemapFile); - dataStream.setByteOrder(QDataStream::LittleEndian); if (tilemapFile.size() < tilemapBytes()) { logError(QString("The region map tilemap at %1 is too small.").arg(tilemap_path)); return false; } - this->tilemap.resize(tilemapSize()); - switch (this->tilemap_format) { - case TilemapFormat::Plain: - for (int i = 0; i < tilemapBytes(); i++) { - uint8_t tile; - dataStream >> tile; - this->tilemap[i] = make_shared(tile); - } - break; - case TilemapFormat::BPP_4: - for (int i = 0; i < tilemapBytes(); i+=2) { - uint16_t tile; - dataStream >> tile; - this->tilemap[i / 2] = make_shared(tile & 0xffff); - } - break; - case TilemapFormat::BPP_8: - for (int i = 0; i < tilemapBytes(); i+=2) { - uint16_t tile; - dataStream >> tile; - this->tilemap[i / 2] = make_shared(tile & 0xffff); - } - break; - } + QByteArray newTilemap = tilemapFile.readAll(); + this->setTilemap(newTilemap); tilemapFile.close(); @@ -133,6 +109,9 @@ bool RegionMap::loadLayout(poryjson::Json layoutJson) { return true; } + // TODO: reset other values here + this->layout_constants.clear(); + poryjson::Json::object layoutObject = layoutJson.object_items(); QString layoutFormat = layoutObject["format"].string_value(); @@ -201,13 +180,16 @@ bool RegionMap::loadLayout(poryjson::Json layoutJson) { QRegularExpressionMatch match = re.match(text); if (match.hasMatch()) { // TODO: keep track of labels and consts - QString qualifiers = match.captured("qual_1") + match.captured("qual_2"); + QString qualifiers = match.captured("qual_1") + " " + match.captured("qual_2"); QString type = match.captured("type"); QString label = match.captured("label"); QStringList constants; if (!match.captured("const_1").isNull()) constants.append(match.captured("const_1")); if (!match.captured("const_2").isNull()) constants.append(match.captured("const_2")); if (!match.captured("const_3").isNull()) constants.append(match.captured("const_3")); + this->layout_constants = constants; + this->layout_qualifiers = qualifiers + " " + type; + this->layout_array_label = label; // find layers QRegularExpression reLayers("(?\\[(?