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 @@
+
+
@@ -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;