From 41f3780c8a16f5c4bf0934945d29d8601b707f82 Mon Sep 17 00:00:00 2001 From: garak Date: Tue, 15 Jan 2019 17:06:18 -0500 Subject: [PATCH] add region map data to config, fix some bugs --- forms/regionmapeditor.ui | 12 +++ include/config.h | 5 + include/core/mapconnection.h | 9 ++ include/core/regionmap.h | 8 +- include/core/regionmapgenerator.h | 77 ++++++++++++++ include/project.h | 3 +- include/ui/citymappixmapitem.h | 13 ++- include/ui/regionmapeditor.h | 9 +- porymap.pro | 2 + src/config.cpp | 21 ++++ src/core/regionmap.cpp | 111 +++++--------------- src/core/regionmapgenerator.cpp | 148 +++++++++++++++++++++++++++ src/ui/citymappixmapitem.cpp | 31 +++--- src/ui/regionmapeditor.cpp | 93 +++++++++++------ src/ui/regionmaplayoutpixmapitem.cpp | 7 +- src/ui/regionmappixmapitem.cpp | 4 - 16 files changed, 399 insertions(+), 154 deletions(-) create mode 100644 include/core/regionmapgenerator.h create mode 100644 src/core/regionmapgenerator.cpp diff --git a/forms/regionmapeditor.ui b/forms/regionmapeditor.ui index 19a8f45c..010322a1 100644 --- a/forms/regionmapeditor.ui +++ b/forms/regionmapeditor.ui @@ -1031,8 +1031,15 @@ + + + Tools + + + + @@ -1067,6 +1074,11 @@ Ctrl+R + + + Generate... + + diff --git a/include/config.h b/include/config.h index 7f63871f..624f87cd 100644 --- a/include/config.h +++ b/include/config.h @@ -4,6 +4,7 @@ #include #include #include +#include enum MapSortOrder { Group = 0, @@ -36,6 +37,7 @@ public: this->metatilesZoom = 30; this->showPlayerView = false; this->showCursorTile = true; + this->regionMapDimensions = QSize(32, 20); } void setRecentProject(QString project); void setRecentMap(QString map); @@ -46,6 +48,7 @@ public: void setMetatilesZoom(int zoom); void setShowPlayerView(bool enabled); void setShowCursorTile(bool enabled); + void setRegionMapDimensions(int width, int height); QString getRecentProject(); QString getRecentMap(); MapSortOrder getMapSortOrder(); @@ -55,6 +58,7 @@ public: int getMetatilesZoom(); bool getShowPlayerView(); bool getShowCursorTile(); + QSize getRegionMapDimensions(); protected: QString getConfigFilepath(); void parseConfigKeyValue(QString key, QString value); @@ -76,6 +80,7 @@ private: int metatilesZoom; bool showPlayerView; bool showCursorTile; + QSize regionMapDimensions; }; extern PorymapConfig porymapConfig; diff --git a/include/core/mapconnection.h b/include/core/mapconnection.h index a0fe4404..8823e7bc 100644 --- a/include/core/mapconnection.h +++ b/include/core/mapconnection.h @@ -2,6 +2,7 @@ #define MAPCONNECTION_H #include +#include class MapConnection { public: @@ -10,4 +11,12 @@ public: QString map_name; }; +inline bool operator==(const MapConnection &c1, const MapConnection &c2) { + return c1.map_name == c2.map_name; +} + +inline uint qHash(const MapConnection &key) { + return qHash(key.map_name); +} + #endif // MAPCONNECTION_H diff --git a/include/core/regionmap.h b/include/core/regionmap.h index 733c8462..ae804148 100644 --- a/include/core/regionmap.h +++ b/include/core/regionmap.h @@ -61,9 +61,13 @@ public: Project *project; - //QList map_squares; QVector map_squares; + const int padLeft = 1; + const int padRight = 3; + const int padTop = 2; + const int padBottom = 3; + History history; QString region_map_png_path; @@ -115,8 +119,6 @@ public: void resetSquare(int); - void test();// remove - // TODO: move read / write functions to private (and others) private: int layout_width_; diff --git a/include/core/regionmapgenerator.h b/include/core/regionmapgenerator.h new file mode 100644 index 00000000..54539009 --- /dev/null +++ b/include/core/regionmapgenerator.h @@ -0,0 +1,77 @@ +#ifndef GUARD_REGIONMAPGENERATOR_H +#define GUARD_REGIONMAPGENERATOR_H + +#include "project.h" +#include "regionmap.h" +#include "map.h" + +#include +#include +#include +#include +#include +#include + +class GeneratorEntry +{ + GeneratorEntry(QString name_, int x_, int y_, int width_, int height_) { + this->name = name_; + this->x = x_; + this->y = y_; + this->width = width_; + this->height = height_; + } + int x; + int y; + int width; + int height; + QString name; + friend class RegionMapGenerator; +public: + friend QDebug operator<<(QDebug, const GeneratorEntry &); +}; + +class RegionMapGenerator +{ + // +public: + // + RegionMapGenerator() = default; + RegionMapGenerator(Project *); + ~RegionMapGenerator() {}; + + Project *project = nullptr; + + QVector map_squares; + + QStack> forks;//? + QSet connections;// + // + + void generate(QString); + + void center();// center the map squares so they arent hanging over + +private: + // + int square_block_width_ = 20; + int square_block_height_ = 20; + + int width_; + int height_; + + //QPoint + + QList entries_; + QMap entries; + + void bfs(int);// breadth first search of a graph + void search(int); + void dfs(int, QVector &);// depth first search + void sort(); + void ts();// topological sort + void populateSquares(); + +}; + +#endif // GUARD_REGIONMAPGENERATOR_H diff --git a/include/project.h b/include/project.h index 5331b6aa..b4270bff 100644 --- a/include/project.h +++ b/include/project.h @@ -47,8 +47,7 @@ public: Map* loadMap(QString); Map* getMap(QString); - // other options include: InGameName, PopUpName, ???? - QMap *mapSecToMapHoverName;// {"MAPSEC_LITTLEROOT_TOWN" : "LITTLEROOT{NAME_END} TOWN"} + QMap *mapSecToMapHoverName; QMap *tileset_cache = nullptr; Tileset* loadTileset(QString, Tileset *tileset = nullptr); diff --git a/include/ui/citymappixmapitem.h b/include/ui/citymappixmapitem.h index 8162bb04..0fc461b5 100644 --- a/include/ui/citymappixmapitem.h +++ b/include/ui/citymappixmapitem.h @@ -2,6 +2,7 @@ #define CITYMAPPIXMAPITEM_H #include "tilemaptileselector.h" + #include #include @@ -18,10 +19,6 @@ public: QString file; - // TODO: make private and use access functions - int width; - int height; - QByteArray data; void init(); @@ -30,10 +27,12 @@ public: virtual void paint(QGraphicsSceneMouseEvent*); virtual void draw(); int getIndexAt(int, int); + int width(); + int height(); -//private: -// int width; -// int height; +private: + int width_; + int height_; signals: void mouseEvent(QGraphicsSceneMouseEvent *, CityMapPixmapItem *); diff --git a/include/ui/regionmapeditor.h b/include/ui/regionmapeditor.h index e41abd13..f1dd6507 100644 --- a/include/ui/regionmapeditor.h +++ b/include/ui/regionmapeditor.h @@ -29,6 +29,8 @@ public: void loadRegionMapData(); void loadCityMaps(); + void onRegionMapTileSelectorSelectedTileChanged(unsigned); + void onCityMapTileSelectorSelectedTileChanged(unsigned); void onRegionMapTileSelectorHoveredTileChanged(unsigned); void onRegionMapTileSelectorHoveredTileCleared(); @@ -47,9 +49,11 @@ private: History history; - int currIndex = 65;// TODO: automatic this from width * 2 + 1 + int currIndex; + unsigned selectedCityTile; + unsigned selectedImageTile; - double scaleUpFactor = 2.0;// TODO + double scaleUpFactor = 2.0; double scaleDownFactor = 1.0 / scaleUpFactor; double scaleRegionMapTiles = 1.0; @@ -86,6 +90,7 @@ private slots: void on_action_RegionMap_Undo_triggered(); void on_action_RegionMap_Redo_triggered(); void on_action_RegionMap_Resize_triggered(); + void on_action_RegionMap_Generate_triggered(); void on_tabWidget_Region_Map_currentChanged(int); void on_pushButton_RM_Options_save_clicked(); void on_pushButton_RM_Options_delete_clicked(); diff --git a/porymap.pro b/porymap.pro index d2101b98..7a72c3d8 100644 --- a/porymap.pro +++ b/porymap.pro @@ -30,6 +30,7 @@ SOURCES += src/core/block.cpp \ src/core/tileset.cpp \ src/core/regionmapeditor.cpp \ src/core/regionmap.cpp \ + src/core/regionmapgenerator.cpp \ src/ui/aboutporymap.cpp \ src/ui/bordermetatilespixmapitem.cpp \ src/ui/collisionpixmapitem.cpp \ @@ -87,6 +88,7 @@ HEADERS += include/core/block.h \ include/core/tileset.h \ include/core/regionmapeditor.h \ include/core/regionmap.h \ + include/core/regionmapgenerator.h \ include/ui/aboutporymap.h \ include/ui/bordermetatilespixmapitem.h \ include/ui/collisionpixmapitem.h \ diff --git a/src/config.cpp b/src/config.cpp index aa21a1af..32ad12fe 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -156,6 +156,17 @@ void PorymapConfig::parseConfigKeyValue(QString key, QString value) { if (!ok) { logWarn(QString("Invalid config value for show_cursor_tile: '%1'. Must be 0 or 1.").arg(value)); } + } else if (key == "region_map_dimensions") { + bool ok1, ok2; + QStringList dims = value.split("x"); + int w = dims[0].toInt(&ok1); + int h = dims[1].toInt(&ok2); + if (!ok1 || !ok2) { + logWarn("Cannot parse region map dimensions. Using default values instead."); + this->regionMapDimensions = QSize(32, 20); + } else { + this->regionMapDimensions = QSize(w, h); + } } else { logWarn(QString("Invalid config key found in config file %1: '%2'").arg(this->getConfigFilepath()).arg(key)); } @@ -176,6 +187,8 @@ QMap PorymapConfig::getKeyValueMap() { map.insert("metatiles_zoom", QString("%1").arg(this->metatilesZoom)); map.insert("show_player_view", this->showPlayerView ? "1" : "0"); map.insert("show_cursor_tile", this->showCursorTile ? "1" : "0"); + map.insert("region_map_dimensions", QString("%1x%2").arg(this->regionMapDimensions.width()) + .arg(this->regionMapDimensions.height())); return map; } @@ -246,6 +259,10 @@ void PorymapConfig::setShowCursorTile(bool enabled) { this->save(); } +void PorymapConfig::setRegionMapDimensions(int width, int height) { + this->regionMapDimensions = QSize(width, height);//QString("%1x%2").arg(width).arg(height); +} + QString PorymapConfig::getRecentProject() { return this->recentProject; } @@ -290,6 +307,10 @@ bool PorymapConfig::getShowCursorTile() { return this->showCursorTile; } +QSize PorymapConfig::getRegionMapDimensions() { + return this->regionMapDimensions; +} + const QMap baseGameVersionMap = { {BaseGameVersion::pokeruby, "pokeruby"}, {BaseGameVersion::pokeemerald, "pokeemerald"}, diff --git a/src/core/regionmap.cpp b/src/core/regionmap.cpp index bc70d329..7dde15dd 100644 --- a/src/core/regionmap.cpp +++ b/src/core/regionmap.cpp @@ -1,5 +1,6 @@ #include "regionmap.h" #include "log.h" +#include "config.h" #include #include @@ -9,31 +10,26 @@ -// TODO: add version arg to this from Editor Setings void RegionMap::init(Project *pro) { QString path = pro->root; this->project = pro; - // TODO: in the future, allow these to be adjustable (and save values) - // possibly use a config file? save to include/constants/region_map.h? - layout_width_ = 36;//28; - layout_height_ = 25;//15; + QSize dimensions = porymapConfig.getRegionMapDimensions(); + img_width_ = dimensions.width(); + img_height_ = dimensions.height(); - img_width_ = layout_width_ + 4; - img_height_ = layout_height_ + 5; + layout_width_ = img_width_ - this->padLeft - this->padRight; + layout_height_ = img_height_ - this->padTop - this->padBottom; region_map_bin_path = path + "/graphics/pokenav/region_map_map.bin"; region_map_png_path = path + "/graphics/pokenav/region_map.png"; region_map_entries_path = path + "/src/data/region_map/region_map_entries.h"; region_map_layout_bin_path = path + "/graphics/pokenav/region_map_section_layout.bin"; city_map_tiles_path = path + "/graphics/pokenav/zoom_tiles.png"; - // TODO: rename png to map_squares in pokeemerald readBkgImgBin(); readLayout(); readCityMaps(); - - //resize(40,30); } // TODO: if the tileId is not valid for the provided image, make sure it does not crash @@ -58,7 +54,7 @@ void RegionMap::readBkgImgBin() { } void RegionMap::saveBkgImgBin() { - QByteArray data(4096,0);// use a constant here? maybe read the original size? + QByteArray data(4096,0);// use a constant here? maybe read the original size? for (int m = 0; m < img_height_; m++) { for (int n = 0; n < img_width_; n++) { @@ -79,12 +75,7 @@ void RegionMap::readLayout() { if (!file.open(QIODevice::ReadOnly)) return; QString line; - // TODO: put these in Project, and keep in order - //QMap sMapNamesMap;// {"sMapName_LittlerootTown" : "LITTLEROOT{NAME_END} TOWN"} - //QMap mapSecToMapName;// {"MAPSEC_LITTLEROOT_TOWN" : "LITTLEROOT{NAME_END} TOWN"} - //QList<> mapSecToMapEntry;// {"MAPSEC_LITTLEROOT_TOWN" : } - // new map ffor mapSecToMapHoverName QMap *qmap = new QMap; QTextStream in(&file); @@ -103,23 +94,16 @@ void RegionMap::readLayout() { QStringList entry = reAfter.match(line).captured(1).remove(" ").split(","); QString mapsec = reBefore.match(line).captured(1); QString insertion = entry[4].remove("sMapName_"); - qmap->insert(mapsec, sMapNamesMap[insertion]); - // can make this a map, the order doesn't really matter - mapSecToMapEntry[mapsec] = - // x y width height name - {entry[0].toInt(), entry[1].toInt(), entry[2].toInt(), entry[3].toInt(), insertion} - ; - // ^ when loading this info to city maps, loop over mapSecToMapEntry and - // add x and y map sqyare when width or height >1 - // indexOf because mapsecs is just a qstringlist - //text += line.remove(" "); + qmap->insert(mapsec, sMapNamesMap.value(insertion)); + mapSecToMapEntry[mapsec] = { + // x y width height name + entry[0].toInt(), entry[1].toInt(), entry[2].toInt(), entry[3].toInt(), insertion + }; } } file.close(); - //qDebug() << "sMapNames" << sMapNames; - - project->mapSecToMapHoverName = qmap;// TODO: is this map necessary? + project->mapSecToMapHoverName = qmap; QFile binFile(region_map_layout_bin_path); if (!binFile.open(QIODevice::ReadOnly)) return; @@ -154,7 +138,8 @@ void RegionMap::saveLayout() { entries_text += "\nconst struct RegionMapLocation gRegionMapEntries[] = {\n"; - for (auto sec : mapSecToMapEntry.keys()) { + for (auto sec : *(project->regionMapSections)) { + if (!mapSecToMapEntry.contains(sec)) continue; struct RegionMapEntry entry = mapSecToMapEntry.value(sec); entries_text += " [" + sec + "] = {" + QString::number(entry.x) + ", " + QString::number(entry.y) + ", " + QString::number(entry.width) + ", " + QString::number(entry.height) + ", sMapName_" + entry.name + "},\n"; @@ -180,7 +165,7 @@ void RegionMap::readCityMaps() {} // layout coords to image index int RegionMap::img_index_(int x, int y) { - return ((x + 1) + (y + 2) * img_width_); + return ((x + this->padLeft) + (y + this->padTop) * img_width_); } // layout coords to layout index @@ -188,26 +173,6 @@ int RegionMap::layout_index_(int x, int y) { return (x + y * layout_width_); } -void RegionMap::test() { - // - bool debug_rmap = false; - - if (debug_rmap) { - for (auto square : map_squares) { - qDebug() << "(" << square.x << "," << square.y << ")" - << square.tile_img_id - << square.has_map - << square.map_name - << square.has_city_map - << square.city_map_name - ; - } - - QPixmap png(region_map_png_path); - qDebug() << "png num 8x8 tiles" << QString("0x%1").arg((png.width()/8) * (png.height() / 8), 2, 16, QChar('0')); - } -} - int RegionMap::width() { return this->img_width_; } @@ -229,12 +194,12 @@ void RegionMap::save() { logInfo("Saving region map info."); saveBkgImgBin(); saveLayout(); - // TODO: re-select proper tile - // TODO: add region map dimensions to config + porymapConfig.setRegionMapDimensions(this->img_width_, this->img_height_); } void RegionMap::saveOptions(int id, QString sec, QString name, int x, int y) { - int index = getMapSquareIndex(x + 1, y + 2); + resetSquare(id); + int index = getMapSquareIndex(x + this->padLeft, y + this->padTop); if (!sec.isEmpty()) { this->map_squares[index].has_map = true; this->map_squares[index].secid = static_cast(project->regionMapSections->indexOf(sec)); @@ -254,14 +219,12 @@ void RegionMap::saveOptions(int id, QString sec, QString name, int x, int y) { this->map_squares[index].y = y; this->map_squares[index].duplicated = false; } - resetSquare(id); + //resetSquare(id); } // from x, y of image int RegionMap::getMapSquareIndex(int x, int y) { - // int index = (x + y * img_width_); - //qDebug() << "index:" << index; return index < map_squares.length() ? index : 0; } @@ -304,7 +267,7 @@ void RegionMap::resize(int newWidth, int newHeight) { RegionMapSquare square; if (x < img_width_ && y < img_height_) { square = map_squares[getMapSquareIndex(x, y)]; - } else if (x < newWidth - 3 && y < newHeight - 3) { + } else if (x < newWidth - this->padRight && y < newHeight - this->padBottom) { square.tile_img_id = 0; square.x = x; square.y = y; @@ -319,34 +282,6 @@ void RegionMap::resize(int newWidth, int newHeight) { this->map_squares = new_squares; this->img_width_ = newWidth; this->img_height_ = newHeight; - this->layout_width_ = newWidth - 4; - this->layout_height_ = newHeight - 5; + this->layout_width_ = newWidth - this->padLeft - this->padRight; + this->layout_height_ = newHeight - this->padTop - this->padBottom; } - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/core/regionmapgenerator.cpp b/src/core/regionmapgenerator.cpp new file mode 100644 index 00000000..5cbabc8c --- /dev/null +++ b/src/core/regionmapgenerator.cpp @@ -0,0 +1,148 @@ +#include "regionmapgenerator.h" + + + +RegionMapGenerator::RegionMapGenerator(Project *project_) { + this->project = project_; +} + +QDebug operator<<(QDebug debug, const GeneratorEntry &entry) +{ + debug.nospace() << "Entry_" << entry.name + << " (" << entry.x << ", " << entry.y << ")" + << " [" << entry.width << " x " << entry.height << "]" + ; + return debug; +} + +// +void RegionMapGenerator::generate(QString mapName) { + // + int i = project->mapNames->indexOf(mapName); + //Map *map = project->loadMap(mapName); + qDebug() << "generating region map from:" << mapName; + search(i); + + populateSquares(); +} + +// use a progress bar because this is rather slow (because loadMap) +// TODO: use custom functions to load only necessary data from maps? +// need connections and dimensions +// maybe use gMapGroup0.numMaps as hint for size of progress +void RegionMapGenerator::bfs(int start) { + // + int size = project->mapNames->size(); + + //* + + QVector visited(size, false); + QList queue; + + visited[start] = true; + queue.append(start); + + while (!queue.isEmpty()) { + start = queue.first(); + + qDebug() << project->mapNames->at(start); + Map *map = project->loadMap(project->mapNames->at(start)); + + if (!map) break; + + this->entries.insert(map->location, { + map->name, 0, 0, map->getWidth() / square_block_width_, map->getHeight() / square_block_height_ + }); + + queue.removeFirst(); + + // get all connected map indexes + // if not visited, mark it visited and insert into queue + for (auto c : map->connections) { + int i = project->mapNames->indexOf(c->map_name); + if (!visited[i] && c->direction != "dive") { + visited[i] = true; + queue.append(i); + } + } + //delete map; + } + //*/ + qDebug() << "search complete";// << entries.keys(); + //return; +} + +// +void RegionMapGenerator::dfs(int start, QVector &visited) { + // + visited[start] = true; + + Map *map = project->loadMap(project->mapNames->at(start)); + //qDebug() << map->name; + this->entries.insert(map->location, { + map->name, 0, 0, map->getWidth() / square_block_width_, map->getHeight() / square_block_height_ + }); + + // place map on the grid? + + for (auto c : map->connections) { + int i = project->mapNames->indexOf(c->map_name); + if (!visited[i] && c->direction != "dive") { + dfs(i, visited); + } + } +} + +void RegionMapGenerator::search(int start) { + // + int size = project->mapNames->size(); + QVector visited(size, false); + + dfs(start, visited); +} + +void RegionMapGenerator::populateSquares() { + // + for (auto entry : entries.values()) { + qDebug() << entry;//.name << entry.width << "x" << entry.height; + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ui/citymappixmapitem.cpp b/src/ui/citymappixmapitem.cpp index f7f47b5e..b1224aa9 100644 --- a/src/ui/citymappixmapitem.cpp +++ b/src/ui/citymappixmapitem.cpp @@ -1,5 +1,6 @@ #include "citymappixmapitem.h" #include "imageproviders.h" +#include "log.h" #include #include @@ -7,11 +8,9 @@ -// read to byte array from filename void CityMapPixmapItem::init() { - // TODO: are they always 10x10 squares? - width = 10; - height = 10; + width_ = 10; + height_ = 10; QFile binFile(file); if (!binFile.open(QIODevice::ReadOnly)) return; @@ -21,13 +20,13 @@ void CityMapPixmapItem::init() { } void CityMapPixmapItem::draw() { - QImage image(width * 8, height * 8, QImage::Format_RGBA8888); + QImage image(width_ * 8, height_ * 8, QImage::Format_RGBA8888); QPainter painter(&image); for (int i = 0; i < data.size() / 2; i++) { QImage img = this->tile_selector->tileImg(data[i * 2]);// need to skip every other tile - int x = i % width; - int y = i / width; + int x = i % width_; + int y = i / width_; QPoint pos = QPoint(x * 8, y * 8); painter.drawImage(pos, img); } @@ -37,15 +36,16 @@ void CityMapPixmapItem::draw() { } void CityMapPixmapItem::save() { - // TODO: logError / logWarn if fail QFile binFile(file); - if (!binFile.open(QIODevice::WriteOnly)) return; + if (!binFile.open(QIODevice::WriteOnly)) { + logError(QString("Cannot save city map tilemap to %1.").arg(file)); + return; + } binFile.write(data); binFile.close(); } void CityMapPixmapItem::paint(QGraphicsSceneMouseEvent *event) { - // QPointF pos = event->pos(); int x = static_cast(pos.x()) / 8; int y = static_cast(pos.y()) / 8; @@ -63,6 +63,13 @@ void CityMapPixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { } int CityMapPixmapItem::getIndexAt(int x, int y) { - // - return 2 * (x + y * width); + return 2 * (x + y * this->width_); +} + +int CityMapPixmapItem::width() { + return this->width_; +} + +int CityMapPixmapItem::height() { + return this->height_; } diff --git a/src/ui/regionmapeditor.cpp b/src/ui/regionmapeditor.cpp index bde1e97e..226e7bd0 100644 --- a/src/ui/regionmapeditor.cpp +++ b/src/ui/regionmapeditor.cpp @@ -1,5 +1,7 @@ #include "regionmapeditor.h" #include "ui_regionmapeditor.h" +#include "regionmapgenerator.h" +#include "config.h" #include #include @@ -43,7 +45,7 @@ void RegionMapEditor::on_action_RegionMap_Save_triggered() { void RegionMapEditor::loadRegionMapData() { this->region_map->init(project); - this->currIndex = this->region_map->width() * 2 + 1; + this->currIndex = this->region_map->width() * this->region_map->padTop + this->region_map->padLeft; displayRegionMap(); } @@ -85,7 +87,7 @@ void RegionMapEditor::displayRegionMapImage() { this, &RegionMapEditor::onHoveredRegionMapTileCleared); this->scene_region_map_image->addItem(this->region_map_item); - //this->scene_region_map_image->setSceneRect(this->scene_region_map_image->sceneRect()); + this->scene_region_map_image->setSceneRect(this->scene_region_map_image->itemsBoundingRect()); this->ui->graphicsView_Region_Map_BkgImg->setScene(this->scene_region_map_image); this->ui->graphicsView_Region_Map_BkgImg->setFixedSize(this->region_map->imgSize() * scaleRegionMapImage); @@ -113,20 +115,24 @@ void RegionMapEditor::displayRegionMapLayout() { this->region_map_layout_item->select(this->currIndex); this->scene_region_map_layout->addItem(region_map_layout_item); - //this->scene_region_map_layout->setSceneRect(this->scene_region_map_layout->sceneRect()); + this->scene_region_map_layout->setSceneRect(this->scene_region_map_layout->itemsBoundingRect()); this->ui->graphicsView_Region_Map_Layout->setScene(this->scene_region_map_layout); this->ui->graphicsView_Region_Map_Layout->setFixedSize(this->region_map->imgSize() * scaleRegionMapImage); } void RegionMapEditor::displayRegionMapLayoutOptions() { + this->ui->comboBox_RM_ConnectedMap->clear(); this->ui->comboBox_RM_ConnectedMap->addItems(*(this->project->regionMapSections)); this->ui->frame_RM_Options->setEnabled(true); - // TODO: change these values to variables - this->ui->spinBox_RM_Options_x->setMaximum(this->region_map->width() - 5); - this->ui->spinBox_RM_Options_y->setMaximum(this->region_map->height() - 4); + this->ui->spinBox_RM_Options_x->setMaximum( + this->region_map->width() - this->region_map->padLeft - this->region_map->padRight - 1 + ); + this->ui->spinBox_RM_Options_y->setMaximum( + this->region_map->height() - this->region_map->padTop - this->region_map->padBottom - 1 + ); updateRegionMapLayoutOptions(currIndex); } @@ -134,7 +140,7 @@ void RegionMapEditor::displayRegionMapLayoutOptions() { void RegionMapEditor::updateRegionMapLayoutOptions(int index) { this->ui->spinBox_RM_Options_x->blockSignals(true); this->ui->spinBox_RM_Options_y->blockSignals(true); - this->ui->lineEdit_RM_MapName->setText(this->project->mapSecToMapHoverName->value(this->region_map->map_squares[index].mapsec));//this->region_map->map_squares[index].map_name); + this->ui->lineEdit_RM_MapName->setText(this->project->mapSecToMapHoverName->value(this->region_map->map_squares[index].mapsec)); this->ui->comboBox_RM_ConnectedMap->setCurrentText(this->region_map->map_squares[index].mapsec); this->ui->spinBox_RM_Options_x->setValue(this->region_map->map_squares[index].x); this->ui->spinBox_RM_Options_y->setValue(this->region_map->map_squares[index].y); @@ -156,6 +162,8 @@ void RegionMapEditor::displayRegionMapTileSelector() { this->scene_region_map_tiles->addItem(this->mapsquare_selector_item); + connect(this->mapsquare_selector_item, &TilemapTileSelector::selectedTileChanged, + this, &RegionMapEditor::onRegionMapTileSelectorSelectedTileChanged); connect(this->mapsquare_selector_item, &TilemapTileSelector::hoveredTileChanged, this, &RegionMapEditor::onRegionMapTileSelectorHoveredTileChanged); connect(this->mapsquare_selector_item, &TilemapTileSelector::hoveredTileCleared, @@ -164,6 +172,8 @@ void RegionMapEditor::displayRegionMapTileSelector() { this->ui->graphicsView_RegionMap_Tiles->setScene(this->scene_region_map_tiles); this->ui->graphicsView_RegionMap_Tiles->setFixedSize(this->mapsquare_selector_item->pixelWidth * scaleRegionMapTiles + 2, this->mapsquare_selector_item->pixelHeight * scaleRegionMapTiles + 2); + + this->mapsquare_selector_item->select(this->selectedImageTile); } void RegionMapEditor::displayCityMapTileSelector() { @@ -179,17 +189,15 @@ void RegionMapEditor::displayCityMapTileSelector() { this->city_map_selector_item->draw(); this->scene_city_map_tiles->addItem(this->city_map_selector_item); - this->scene_city_map_tiles->setSceneRect(this->scene_city_map_tiles->sceneRect());// ? - // TODO: - /*connect(this->city_map_selector_item, &TilemapTileSelector::hoveredTileChanged, - this, &RegionMapEditor::onRegionMapTileSelectorHoveredTileChanged); - connect(this->city_map_selector_item, &TilemapTileSelector::hoveredTileCleared, - this, &RegionMapEditor::onRegionMapTileSelectorHoveredTileCleared);*/ + connect(this->city_map_selector_item, &TilemapTileSelector::selectedTileChanged, + this, &RegionMapEditor::onCityMapTileSelectorSelectedTileChanged); this->ui->graphicsView_City_Map_Tiles->setScene(this->scene_city_map_tiles); this->ui->graphicsView_City_Map_Tiles->setFixedSize(this->city_map_selector_item->pixelWidth * scaleCityMapTiles + 2, this->city_map_selector_item->pixelHeight * scaleCityMapTiles + 2); + + this->city_map_selector_item->select(this->selectedCityTile); } void RegionMapEditor::displayCityMap(QString f) { @@ -213,8 +221,8 @@ void RegionMapEditor::displayCityMap(QString f) { scene_city_map_image->setSceneRect(this->scene_city_map_image->sceneRect()); this->ui->graphicsView_City_Map->setScene(scene_city_map_image); - this->ui->graphicsView_City_Map->setFixedSize(8 * city_map_item->width * scaleCityMapImage + 2, - 8 * city_map_item->height * scaleCityMapImage + 2); + this->ui->graphicsView_City_Map->setFixedSize(8 * city_map_item->width() * scaleCityMapImage + 2, + 8 * city_map_item->height() * scaleCityMapImage + 2); } bool RegionMapEditor::createCityMap(QString name) { @@ -222,7 +230,6 @@ bool RegionMapEditor::createCityMap(QString name) { QString file = this->project->root + "/graphics/pokenav/city_maps/" + name + ".bin"; - // TODO: use project config for these values? uint8_t filler = 0x30; uint8_t border = 0x7; uint8_t blank = 0x1; @@ -248,6 +255,14 @@ bool RegionMapEditor::createCityMap(QString name) { return !errored; } +void RegionMapEditor::onRegionMapTileSelectorSelectedTileChanged(unsigned id) { + this->selectedImageTile = id; +} + +void RegionMapEditor::onCityMapTileSelectorSelectedTileChanged(unsigned id) { + this->selectedCityTile = id; +} + void RegionMapEditor::onRegionMapTileSelectorHoveredTileChanged(unsigned tileId) { QString message = QString("Tile: 0x") + QString("%1").arg(tileId, 4, 16, QChar('0')).toUpper(); this->ui->statusbar->showMessage(message); @@ -270,7 +285,6 @@ void RegionMapEditor::onRegionMapLayoutSelectedTileChanged(int index) { } void RegionMapEditor::onRegionMapLayoutHoveredTileChanged(int index) { - // TODO: change to x, y coords not index QString message = QString(); int x = this->region_map->map_squares[index].x; int y = this->region_map->map_squares[index].y; @@ -289,7 +303,8 @@ void RegionMapEditor::onRegionMapLayoutHoveredTileCleared() { } void RegionMapEditor::onHoveredRegionMapTileChanged(int x, int y) { - QString message = QString("x: %1, y: %2 Tile: 0x").arg(x).arg(y) + QString("%1").arg(this->region_map->getTileId(x, y), 4, 16, QChar('0')).toUpper(); + QString message = QString("x: %1, y: %2 Tile: 0x").arg(x).arg(y) + + QString("%1").arg(this->region_map->getTileId(x, y), 4, 16, QChar('0')).toUpper(); this->ui->statusbar->showMessage(message); } @@ -300,7 +315,7 @@ void RegionMapEditor::onHoveredRegionMapTileCleared() { void RegionMapEditor::mouseEvent_region_map(QGraphicsSceneMouseEvent *event, RegionMapPixmapItem *item) { if (event->buttons() & Qt::RightButton) { item->select(event); - } else if (event->buttons() & Qt::MiddleButton) {// TODO + //} else if (event->buttons() & Qt::MiddleButton) {// TODO } else { QPointF pos = event->pos(); int x = static_cast(pos.x()) / 8; @@ -310,14 +325,14 @@ void RegionMapEditor::mouseEvent_region_map(QGraphicsSceneMouseEvent *event, Reg RegionMapHistoryItem *commit = new RegionMapHistoryItem(RegionMapEditorBox::BackgroundImage, index, this->region_map->map_squares[index].tile_img_id, this->mapsquare_selector_item->getSelectedTile()); history.push(commit); - item->paint(event);//*/ + item->paint(event); } } void RegionMapEditor::mouseEvent_city_map(QGraphicsSceneMouseEvent *event, CityMapPixmapItem *item) { // if (event->buttons() & Qt::RightButton) {// TODO - } else if (event->buttons() & Qt::MiddleButton) {// TODO + //} else if (event->buttons() & Qt::MiddleButton) {// TODO } else { QPointF pos = event->pos(); int x = static_cast(pos.x()) / 8; @@ -332,23 +347,34 @@ void RegionMapEditor::mouseEvent_city_map(QGraphicsSceneMouseEvent *event, CityM void RegionMapEditor::on_tabWidget_Region_Map_currentChanged(int index) { this->ui->stackedWidget_RM_Options->setCurrentIndex(index); + switch (index) + { + case 0: + this->ui->pushButton_Zoom_In_Image_Tiles->setVisible(true); + this->ui->pushButton_Zoom_Out_Image_Tiles->setVisible(true); + break; + case 1: + this->ui->pushButton_Zoom_In_Image_Tiles->setVisible(false); + this->ui->pushButton_Zoom_Out_Image_Tiles->setVisible(false); + break; + } } void RegionMapEditor::on_spinBox_RM_Options_x_valueChanged(int x) { int y = this->ui->spinBox_RM_Options_y->value(); - int red = this->region_map->getMapSquareIndex(x + 1, y + 2); + int red = this->region_map->getMapSquareIndex(x + this->region_map->padLeft, y + this->region_map->padTop); this->region_map_layout_item->highlight(x, y, red); } void RegionMapEditor::on_spinBox_RM_Options_y_valueChanged(int y) { int x = this->ui->spinBox_RM_Options_x->value(); - int red = this->region_map->getMapSquareIndex(x + 1, y + 2); + int red = this->region_map->getMapSquareIndex(x + this->region_map->padLeft, y + this->region_map->padTop); this->region_map_layout_item->highlight(x, y, red); } void RegionMapEditor::on_pushButton_RM_Options_save_clicked() { this->region_map->saveOptions( - this->region_map_layout_item->selectedTile,// TODO: remove + this->region_map_layout_item->selectedTile, this->ui->comboBox_RM_ConnectedMap->currentText(), this->ui->lineEdit_RM_MapName->text(), this->ui->spinBox_RM_Options_x->value(), @@ -356,7 +382,6 @@ void RegionMapEditor::on_pushButton_RM_Options_save_clicked() { ); this->region_map_layout_item->highlightedTile = -1; this->region_map_layout_item->draw(); - // TODO: update selected tile index } void RegionMapEditor::on_pushButton_CityMap_save_clicked() { @@ -407,7 +432,7 @@ void RegionMapEditor::on_action_RegionMap_Resize_triggered() { QSpinBox *heightSpinBox = new QSpinBox(); widthSpinBox->setMinimum(32); heightSpinBox->setMinimum(20); - widthSpinBox->setMaximum(64);// TODO: come up with real (meaningful) limits? + widthSpinBox->setMaximum(60);// w * h * 2 <= 4960 heightSpinBox->setMaximum(40); widthSpinBox->setValue(this->region_map->width()); heightSpinBox->setValue(this->region_map->height()); @@ -520,22 +545,20 @@ void RegionMapEditor::on_pushButton_Zoom_Out_City_Tiles_clicked() { void RegionMapEditor::on_pushButton_Zoom_In_City_Map_clicked() { if (scaleCityMapImage >= 8.0) return; scaleCityMapImage *= 2.0; - this->ui->graphicsView_City_Map->setFixedSize(8 * city_map_item->width * scaleCityMapImage + 2, - 8 * city_map_item->height * scaleCityMapImage + 2); + this->ui->graphicsView_City_Map->setFixedSize(8 * city_map_item->width() * scaleCityMapImage + 2, + 8 * city_map_item->height() * scaleCityMapImage + 2); this->ui->graphicsView_City_Map->scale(2.0,2.0); } void RegionMapEditor::on_pushButton_Zoom_Out_City_Map_clicked() { if (scaleCityMapImage <= 1.0) return; scaleCityMapImage /= 2.0; - this->ui->graphicsView_City_Map->setFixedSize(8 * city_map_item->width * scaleCityMapImage + 2, - 8 * city_map_item->height * scaleCityMapImage + 2); + this->ui->graphicsView_City_Map->setFixedSize(8 * city_map_item->width() * scaleCityMapImage + 2, + 8 * city_map_item->height() * scaleCityMapImage + 2); this->ui->graphicsView_City_Map->scale(0.5,0.5); } void RegionMapEditor::on_pushButton_Zoom_In_Map_Image_clicked() { - resize(40,30);// test - return; if (scaleRegionMapImage >= 8.0) return; scaleRegionMapImage *= 2.0; this->ui->graphicsView_Region_Map_BkgImg->setFixedSize(this->region_map->imgSize() * scaleRegionMapImage); @@ -552,3 +575,9 @@ void RegionMapEditor::on_pushButton_Zoom_Out_Map_Image_clicked() { this->ui->graphicsView_Region_Map_BkgImg->scale(0.5,0.5); this->ui->graphicsView_Region_Map_Layout->scale(0.5,0.5); } + +void RegionMapEditor::on_action_RegionMap_Generate_triggered() { + // + RegionMapGenerator generator(this->project); + generator.generate("LittlerootTown"); +} diff --git a/src/ui/regionmaplayoutpixmapitem.cpp b/src/ui/regionmaplayoutpixmapitem.cpp index 5f97e529..2da3ae5d 100644 --- a/src/ui/regionmaplayoutpixmapitem.cpp +++ b/src/ui/regionmaplayoutpixmapitem.cpp @@ -56,11 +56,9 @@ void RegionMapLayoutPixmapItem::select(int index) { } void RegionMapLayoutPixmapItem::highlight(int x, int y, int red) { - // TODO: check if out of bounds and return - // if it is not empty, color it red this->highlightedTile = red; draw(); - SelectablePixmapItem::select(x + 1, y + 2, 0, 0); + SelectablePixmapItem::select(x + this->region_map->padLeft, y + this->region_map->padTop, 0, 0); } void RegionMapLayoutPixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { @@ -68,7 +66,6 @@ void RegionMapLayoutPixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *event) int index = this->region_map->getMapSquareIndex(pos.x(), pos.y()); if (this->region_map->map_squares[index].x >= 0 && this->region_map->map_squares[index].y >= 0) { - //if (index > this->region_map->width() * 2) { SelectablePixmapItem::mousePressEvent(event); this->updateSelectedTile(); emit selectedTileChanged(this->selectedTile); @@ -99,4 +96,6 @@ void RegionMapLayoutPixmapItem::hoverLeaveEvent(QGraphicsSceneHoverEvent* event) void RegionMapLayoutPixmapItem::updateSelectedTile() { QPoint origin = this->getSelectionStart(); this->selectedTile = this->region_map->getMapSquareIndex(origin.x(), origin.y()); + this->highlightedTile = -1; + draw(); } diff --git a/src/ui/regionmappixmapitem.cpp b/src/ui/regionmappixmapitem.cpp index 6a685542..c75341d7 100644 --- a/src/ui/regionmappixmapitem.cpp +++ b/src/ui/regionmappixmapitem.cpp @@ -3,10 +3,6 @@ -// the function that draws the map on the scene -// (qnqlogous to Map::render) -// TODO: figure out why this is being called twice!! -// (this also affects the history) void RegionMapPixmapItem::draw() { if (!region_map) return;