Validate map layout and tileset loading

This commit is contained in:
Marcus Huderle 2020-02-12 10:22:40 -06:00
parent 8a4456f7b0
commit cd9b8b12a5
7 changed files with 78 additions and 45 deletions

View file

@ -45,7 +45,7 @@ public:
bool setMap(QString map_name); bool setMap(QString map_name);
void saveUiFields(); void saveUiFields();
void saveEncounterTabData(); void saveEncounterTabData();
void displayMap(); bool displayMap();
void displayMetatileSelector(); void displayMetatileSelector();
void displayMapMetatiles(); void displayMapMetatiles();
void displayMapMovementPermissions(); void displayMapMovementPermissions();

View file

@ -187,7 +187,7 @@ private:
bool setMap(QString, bool scrollTreeView = false); bool setMap(QString, bool scrollTreeView = false);
void redrawMapScene(); void redrawMapScene();
bool loadDataStructures(); bool loadDataStructures();
void populateMapList(); bool populateMapList();
void sortMapList(); void sortMapList();
QString getExistingDirectory(QString); QString getExistingDirectory(QString);
bool openProject(QString dir); bool openProject(QString dir);

View file

@ -74,13 +74,13 @@ public:
QMap<QString, QStringList> tilesetLabels; QMap<QString, QStringList> tilesetLabels;
Blockdata* readBlockdata(QString); Blockdata* readBlockdata(QString);
void loadBlockdata(Map*); bool loadBlockdata(Map*);
void saveTextFile(QString path, QString text); void saveTextFile(QString path, QString text);
void appendTextFile(QString path, QString text); void appendTextFile(QString path, QString text);
void deleteFile(QString path); void deleteFile(QString path);
void readMapGroups(); bool readMapGroups();
Map* addNewMapToGroup(QString mapName, int groupNum); Map* addNewMapToGroup(QString mapName, int groupNum);
Map* addNewMapToGroup(QString, int, Map*, bool); Map* addNewMapToGroup(QString, int, Map*, bool);
QString getNewMapName(); QString getNewMapName();
@ -101,8 +101,8 @@ public:
QMap<QString, bool> getTopLevelMapFields(); QMap<QString, bool> getTopLevelMapFields();
bool loadMapData(Map*); bool loadMapData(Map*);
bool readMapLayouts(); bool readMapLayouts();
void loadMapLayout(Map*); bool loadMapLayout(Map*);
void loadMapTilesets(Map*); bool loadMapTilesets(Map*);
void loadTilesetAssets(Tileset*); void loadTilesetAssets(Tileset*);
void loadTilesetTiles(Tileset*, QImage); void loadTilesetTiles(Tileset*, QImage);
void loadTilesetMetatiles(Tileset*); void loadTilesetMetatiles(Tileset*);
@ -154,7 +154,7 @@ public:
QString getScriptFileExtension(bool usePoryScript); QString getScriptFileExtension(bool usePoryScript);
QString getScriptDefaultString(bool usePoryScript, QString mapName); QString getScriptDefaultString(bool usePoryScript, QString mapName);
void loadMapBorder(Map *map); bool loadMapBorder(Map *map);
void saveMapHealEvents(Map *map); void saveMapHealEvents(Map *map);

View file

@ -908,7 +908,7 @@ void Editor::setConnectionsVisibility(bool visible) {
} }
bool Editor::setMap(QString map_name) { bool Editor::setMap(QString map_name) {
if (map_name.isNull()) { if (map_name.isEmpty()) {
return false; return false;
} }
@ -920,7 +920,9 @@ bool Editor::setMap(QString map_name) {
map = loadedMap; map = loadedMap;
selected_events->clear(); selected_events->clear();
displayMap(); if (!displayMap()) {
return false;
}
updateSelectedEvents(); updateSelectedEvents();
} }
@ -1045,7 +1047,7 @@ void Editor::mouseEvent_collision(QGraphicsSceneMouseEvent *event, CollisionPixm
} }
} }
void Editor::displayMap() { bool Editor::displayMap() {
if (!scene) { if (!scene) {
scene = new QGraphicsScene; scene = new QGraphicsScene;
MapSceneEventFilter *filter = new MapSceneEventFilter(); MapSceneEventFilter *filter = new MapSceneEventFilter();
@ -1086,6 +1088,7 @@ void Editor::displayMap() {
if (events_group) { if (events_group) {
events_group->setVisible(false); events_group->setVisible(false);
} }
return true;
} }
void Editor::displayMetatileSelector() { void Editor::displayMetatileSelector() {

View file

@ -281,16 +281,11 @@ bool MainWindow::openProject(QString dir) {
if (!already_open) { if (!already_open) {
editor->project = new Project; editor->project = new Project;
editor->project->set_root(dir); editor->project->set_root(dir);
success = loadDataStructures(); success = loadDataStructures()
if (success) { && populateMapList()
populateMapList(); && setMap(getDefaultMap(), true);
success = setMap(getDefaultMap(), true);
}
} else { } else {
success = loadDataStructures(); success = loadDataStructures() && populateMapList();
if (success) {
populateMapList();
}
} }
if (success) { if (success) {
@ -350,7 +345,7 @@ void MainWindow::on_action_Open_Project_triggered()
bool MainWindow::setMap(QString map_name, bool scrollTreeView) { bool MainWindow::setMap(QString map_name, bool scrollTreeView) {
logInfo(QString("Setting map to '%1'").arg(map_name)); logInfo(QString("Setting map to '%1'").arg(map_name));
if (map_name.isNull()) { if (map_name.isEmpty()) {
return false; return false;
} }
@ -388,7 +383,9 @@ bool MainWindow::setMap(QString map_name, bool scrollTreeView) {
void MainWindow::redrawMapScene() void MainWindow::redrawMapScene()
{ {
editor->displayMap(); if (!editor->displayMap())
return;
on_tabWidget_currentChanged(ui->tabWidget->currentIndex()); on_tabWidget_currentChanged(ui->tabWidget->currentIndex());
double base = editor->scale_base; double base = editor->scale_base;
@ -644,9 +641,12 @@ bool MainWindow::loadDataStructures() {
return true; return true;
} }
void MainWindow::populateMapList() { bool MainWindow::populateMapList() {
editor->project->readMapGroups(); bool success = editor->project->readMapGroups();
if (success) {
sortMapList(); sortMapList();
}
return success;
} }
void MainWindow::sortMapList() { void MainWindow::sortMapList() {

View file

@ -74,10 +74,9 @@ Map* Project::loadMap(QString map_name) {
map->setName(map_name); map->setName(map_name);
} }
if (!loadMapData(map)) if (!(loadMapData(map) && loadMapLayout(map)))
return nullptr; return nullptr;
loadMapLayout(map);
map->commit(); map->commit();
map->metatileHistory.save(); map->metatileHistory.save();
map_cache->insert(map_name, map); map_cache->insert(map_name, map);
@ -387,21 +386,21 @@ void Project::setNewMapHeader(Map* map, int mapIndex) {
map->battle_scene = "MAP_BATTLE_SCENE_NORMAL"; map->battle_scene = "MAP_BATTLE_SCENE_NORMAL";
} }
void Project::loadMapLayout(Map* map) { bool Project::loadMapLayout(Map* map) {
if (!map->isPersistedToFile) { if (!map->isPersistedToFile) {
return; return true;
} }
if (!mapLayouts.contains(map->layoutId)) { if (mapLayouts.contains(map->layoutId)) {
logError(QString("Error: Map '%1' has an unknown layout '%2'").arg(map->name).arg(map->layoutId));
return;
} else {
map->layout = mapLayouts[map->layoutId]; map->layout = mapLayouts[map->layoutId];
} else {
logError(QString("Error: Map '%1' has an unknown layout '%2'").arg(map->name).arg(map->layoutId));
return false;
} }
loadMapTilesets(map); return loadMapTilesets(map)
loadBlockdata(map); && loadBlockdata(map)
loadMapBorder(map); && loadMapBorder(map);
} }
bool Project::readMapLayouts() { bool Project::readMapLayouts() {
@ -906,13 +905,23 @@ void Project::saveTilesetPalettes(Tileset *tileset, bool /*primary*/) {
} }
} }
void Project::loadMapTilesets(Map* map) { bool Project::loadMapTilesets(Map* map) {
if (map->layout->has_unsaved_changes) { if (map->layout->has_unsaved_changes) {
return; return true;
} }
map->layout->tileset_primary = getTileset(map->layout->tileset_primary_label); map->layout->tileset_primary = getTileset(map->layout->tileset_primary_label);
if (!map->layout->tileset_primary) {
logError(QString("Map layout %1 has invalid primary tileset '%2'").arg(map->layout->id).arg(map->layout->tileset_primary_label));
return false;
}
map->layout->tileset_secondary = getTileset(map->layout->tileset_secondary_label); map->layout->tileset_secondary = getTileset(map->layout->tileset_secondary_label);
if (!map->layout->tileset_secondary) {
logError(QString("Map layout %1 has invalid secondary tileset '%2'").arg(map->layout->id).arg(map->layout->tileset_secondary_label));
return false;
}
return true;
} }
Tileset* Project::loadTileset(QString label, Tileset *tileset) { Tileset* Project::loadTileset(QString label, Tileset *tileset) {
@ -939,9 +948,9 @@ Tileset* Project::loadTileset(QString label, Tileset *tileset) {
return tileset; return tileset;
} }
void Project::loadBlockdata(Map* map) { bool Project::loadBlockdata(Map* map) {
if (!map->isPersistedToFile || map->layout->has_unsaved_changes) { if (!map->isPersistedToFile || map->layout->has_unsaved_changes) {
return; return true;
} }
QString path = QString("%1/%2").arg(root).arg(map->layout->blockdata_path); QString path = QString("%1/%2").arg(root).arg(map->layout->blockdata_path);
@ -955,6 +964,7 @@ void Project::loadBlockdata(Map* map) {
.arg(map->getWidth() * map->getHeight())); .arg(map->getWidth() * map->getHeight()));
map->layout->blockdata->blocks->resize(map->getWidth() * map->getHeight()); map->layout->blockdata->blocks->resize(map->getWidth() * map->getHeight());
} }
return true;
} }
void Project::setNewMapBlockdata(Map* map) { void Project::setNewMapBlockdata(Map* map) {
@ -965,13 +975,21 @@ void Project::setNewMapBlockdata(Map* map) {
map->layout->blockdata = blockdata; map->layout->blockdata = blockdata;
} }
void Project::loadMapBorder(Map *map) { bool Project::loadMapBorder(Map *map) {
if (!map->isPersistedToFile || map->layout->has_unsaved_changes) { if (!map->isPersistedToFile || map->layout->has_unsaved_changes) {
return; return true;
} }
QString path = QString("%1/%2").arg(root).arg(map->layout->border_path); QString path = QString("%1/%2").arg(root).arg(map->layout->border_path);
map->layout->border = readBlockdata(path); map->layout->border = readBlockdata(path);
int borderLength = 4;
if (map->layout->border->blocks->count() != borderLength) {
logWarn(QString("Layout border blockdata length %1 must be %2. Resizing border blockdata.")
.arg(map->layout->border->blocks->count())
.arg(borderLength));
map->layout->border->blocks->resize(borderLength);
}
return true;
} }
void Project::setNewMapBorder(Map *map) { void Project::setNewMapBorder(Map *map) {
@ -1265,7 +1283,12 @@ void Project::loadTilesetAssets(Tileset* tileset) {
tiles_path = fixGraphicPath(tiles_path); tiles_path = fixGraphicPath(tiles_path);
tileset->tilesImagePath = tiles_path; tileset->tilesImagePath = tiles_path;
QImage image = QImage(tileset->tilesImagePath); QImage image;
if (QFile::exists(tileset->tilesImagePath)) {
image = QImage(tileset->tilesImagePath);
} else {
image = QImage(8, 8, QImage::Format_Indexed8);
}
this->loadTilesetTiles(tileset, image); this->loadTilesetTiles(tileset, image);
this->loadTilesetMetatiles(tileset); this->loadTilesetMetatiles(tileset);
this->loadTilesetMetatileLabels(tileset); this->loadTilesetMetatileLabels(tileset);
@ -1518,12 +1541,16 @@ bool Project::readWildMonData() {
return true; return true;
} }
void Project::readMapGroups() { bool Project::readMapGroups() {
mapConstantsToMapNames->clear();
mapNamesToMapConstants->clear();
map_groups->clear();
QString mapGroupsFilepath = QString("%1/data/maps/map_groups.json").arg(root); QString mapGroupsFilepath = QString("%1/data/maps/map_groups.json").arg(root);
QJsonDocument mapGroupsDoc; QJsonDocument mapGroupsDoc;
if (!parser.tryParseJsonFile(&mapGroupsDoc, mapGroupsFilepath)) { if (!parser.tryParseJsonFile(&mapGroupsDoc, mapGroupsFilepath)) {
logError(QString("Failed to read map groups from %1").arg(mapGroupsFilepath)); logError(QString("Failed to read map groups from %1").arg(mapGroupsFilepath));
return; return false;
} }
QJsonObject mapGroupsObj = mapGroupsDoc.object(); QJsonObject mapGroupsObj = mapGroupsDoc.object();
@ -1557,6 +1584,7 @@ void Project::readMapGroups() {
groupNames = groups; groupNames = groups;
groupedMapNames = groupedMaps; groupedMapNames = groupedMaps;
mapNames = maps; mapNames = maps;
return true;
} }
Map* Project::addNewMapToGroup(QString mapName, int groupNum) { Map* Project::addNewMapToGroup(QString mapName, int groupNum) {

View file

@ -157,7 +157,9 @@ void NewMapPopup::on_pushButton_NewMap_Accept_clicked() {
group = project->groupNames->indexOf(this->ui->comboBox_NewMap_Group->currentText()); group = project->groupNames->indexOf(this->ui->comboBox_NewMap_Group->currentText());
newMap->layout = layout; newMap->layout = layout;
newMap->layoutId = layout->id; newMap->layoutId = layout->id;
if (this->existingLayout) project->loadMapLayout(newMap); if (this->existingLayout) {
project->loadMapLayout(newMap);
}
newMap->group_num = QString::number(group); newMap->group_num = QString::number(group);
map = newMap; map = newMap;
emit applied(); emit applied();