Add support for FRLG .map files and border importing for pokefirered and custom border size supporting projects.

This commit is contained in:
ultima-soul 2020-09-21 14:26:58 -07:00
parent 38e7951f3e
commit 8575b83212
3 changed files with 38 additions and 6 deletions

View file

@ -26,7 +26,11 @@ MapLayout *MapParser::parse(QString filepath, bool *error, Project *project)
return nullptr; return nullptr;
} }
int mapDataOffset = 20; int borderWidth = static_cast<unsigned char>(in.at(16)); // 0 in RSE .map files
int borderHeight = static_cast<unsigned char>(in.at(17)); // 0 in RSE .map files
int numBorderTiles = borderWidth * borderHeight; // 0 if RSE
int mapDataOffset = 20 + (numBorderTiles * 2); // FRLG .map files store border metatile data after the header
int mapWidth = static_cast<unsigned char>(in.at(0)) | int mapWidth = static_cast<unsigned char>(in.at(0)) |
(static_cast<unsigned char>(in.at(1)) << 8) | (static_cast<unsigned char>(in.at(1)) << 8) |
(static_cast<unsigned char>(in.at(2)) << 16) | (static_cast<unsigned char>(in.at(2)) << 16) |
@ -62,7 +66,7 @@ MapLayout *MapParser::parse(QString filepath, bool *error, Project *project)
}*/ }*/
int numMetatiles = mapWidth * mapHeight; int numMetatiles = mapWidth * mapHeight;
int expectedFileSize = numMetatiles * 2 + 20; int expectedFileSize = 20 + (numBorderTiles * 2) + (numMetatiles * 2);
if (in.length() != expectedFileSize) { if (in.length() != expectedFileSize) {
*error = true; *error = true;
logError(QString(".map file is an unexpected size. Expected %1 bytes, but it has %2 bytes.").arg(expectedFileSize).arg(in.length())); logError(QString(".map file is an unexpected size. Expected %1 bytes, but it has %2 bytes.").arg(expectedFileSize).arg(in.length()));
@ -75,10 +79,23 @@ MapLayout *MapParser::parse(QString filepath, bool *error, Project *project)
blockdata->addBlock(word); blockdata->addBlock(word);
} }
Blockdata *border = nullptr;
if (numBorderTiles != 0) {
border = new Blockdata();
for (int i = 20; (i + 1) < 20 + (numBorderTiles * 2); i += 2) {
uint16_t word = static_cast<uint16_t>((in[i] & 0xff) + ((in[i + 1] & 0xff) << 8));
border->addBlock(word);
}
}
MapLayout *mapLayout = new MapLayout(); MapLayout *mapLayout = new MapLayout();
mapLayout->width = QString::number(mapWidth); mapLayout->width = QString::number(mapWidth);
mapLayout->height = QString::number(mapHeight); mapLayout->height = QString::number(mapHeight);
mapLayout->border_width = (borderWidth == 0) ? QString::number(2) : QString::number(borderWidth);
mapLayout->border_height = (borderHeight == 0) ? QString::number(2) : QString::number(borderHeight);
QList<QString> tilesets = project->tilesetLabelsOrdered; QList<QString> tilesets = project->tilesetLabelsOrdered;
if (mapPrimaryTilesetNum > tilesets.size()) if (mapPrimaryTilesetNum > tilesets.size())
mapLayout->tileset_primary_label = tilesets.at(0); mapLayout->tileset_primary_label = tilesets.at(0);
else else
@ -88,6 +105,12 @@ MapLayout *MapParser::parse(QString filepath, bool *error, Project *project)
mapLayout->tileset_secondary_label = tilesets.at(1); mapLayout->tileset_secondary_label = tilesets.at(1);
else else
mapLayout->tileset_secondary_label = tilesets.at(mapSecondaryTilesetNum); mapLayout->tileset_secondary_label = tilesets.at(mapSecondaryTilesetNum);
mapLayout->blockdata = blockdata->copy(); mapLayout->blockdata = blockdata->copy();
if (border != nullptr) {
mapLayout->border = border->copy();
}
return mapLayout; return mapLayout;
} }

View file

@ -1930,7 +1930,9 @@ Map* Project::addNewMapToGroup(QString mapName, int groupNum, Map *newMap, bool
} else { } else {
setNewMapBlockdata(map); setNewMapBlockdata(map);
} }
setNewMapBorder(map); if (map->layout->border == nullptr) {
setNewMapBorder(map);
}
} }
loadMapTilesets(map); loadMapTilesets(map);

View file

@ -181,13 +181,10 @@ void NewMapPopup::setDefaultValuesImportMap(MapLayout *mapLayout) {
ui->comboBox_NewMap_Group->addItems(*project->groupNames); ui->comboBox_NewMap_Group->addItems(*project->groupNames);
ui->comboBox_NewMap_Group->setCurrentText(project->groupNames->at(0)); ui->comboBox_NewMap_Group->setCurrentText(project->groupNames->at(0));
ui->spinBox_NewMap_Width->setValue(mapLayout->width.toInt(nullptr, 0)); ui->spinBox_NewMap_Width->setValue(mapLayout->width.toInt(nullptr, 0));
ui->spinBox_NewMap_Height->setValue(mapLayout->height.toInt(nullptr, 0)); ui->spinBox_NewMap_Height->setValue(mapLayout->height.toInt(nullptr, 0));
ui->comboBox_NewMap_Primary_Tileset->setCurrentText(mapLayout->tileset_primary_label); ui->comboBox_NewMap_Primary_Tileset->setCurrentText(mapLayout->tileset_primary_label);
ui->comboBox_NewMap_Secondary_Tileset->setCurrentText(mapLayout->tileset_secondary_label); ui->comboBox_NewMap_Secondary_Tileset->setCurrentText(mapLayout->tileset_secondary_label);
ui->spinBox_NewMap_BorderWidth->setValue(DEFAULT_BORDER_WIDTH);
ui->spinBox_NewMap_BorderHeight->setValue(DEFAULT_BORDER_HEIGHT);
ui->comboBox_NewMap_Type->addItems(*project->mapTypes); ui->comboBox_NewMap_Type->addItems(*project->mapTypes);
ui->comboBox_NewMap_Location->addItems(project->mapSectionValueToName.values()); ui->comboBox_NewMap_Location->addItems(project->mapSectionValueToName.values());
@ -223,11 +220,15 @@ void NewMapPopup::setDefaultValuesImportMap(MapLayout *mapLayout) {
break; break;
} }
if (projectConfig.getUseCustomBorderSize()) { if (projectConfig.getUseCustomBorderSize()) {
ui->spinBox_NewMap_BorderWidth->setValue(mapLayout->border_width.toInt(nullptr, 0));
ui->spinBox_NewMap_BorderHeight->setValue(mapLayout->border_height.toInt(nullptr, 0));
ui->spinBox_NewMap_BorderWidth->setVisible(true); ui->spinBox_NewMap_BorderWidth->setVisible(true);
ui->spinBox_NewMap_BorderHeight->setVisible(true); ui->spinBox_NewMap_BorderHeight->setVisible(true);
ui->label_NewMap_BorderWidth->setVisible(true); ui->label_NewMap_BorderWidth->setVisible(true);
ui->label_NewMap_BorderHeight->setVisible(true); ui->label_NewMap_BorderHeight->setVisible(true);
} else { } else {
ui->spinBox_NewMap_BorderWidth->setValue(DEFAULT_BORDER_WIDTH);
ui->spinBox_NewMap_BorderHeight->setValue(DEFAULT_BORDER_HEIGHT);
ui->spinBox_NewMap_BorderWidth->setVisible(false); ui->spinBox_NewMap_BorderWidth->setVisible(false);
ui->spinBox_NewMap_BorderHeight->setVisible(false); ui->spinBox_NewMap_BorderHeight->setVisible(false);
ui->label_NewMap_BorderWidth->setVisible(false); ui->label_NewMap_BorderWidth->setVisible(false);
@ -244,6 +245,10 @@ void NewMapPopup::setDefaultValuesImportMap(MapLayout *mapLayout) {
map = new Map(); map = new Map();
map->layout = new MapLayout(); map->layout = new MapLayout();
map->layout->blockdata = mapLayout->blockdata->copy(); map->layout->blockdata = mapLayout->blockdata->copy();
if (mapLayout->border != nullptr) {
map->layout->border = mapLayout->border->copy();
}
} }
void NewMapPopup::on_lineEdit_NewMap_Name_textChanged(const QString &text) { void NewMapPopup::on_lineEdit_NewMap_Name_textChanged(const QString &text) {
@ -305,6 +310,8 @@ void NewMapPopup::on_pushButton_NewMap_Accept_clicked() {
if (this->importedMap) { if (this->importedMap) {
layout->blockdata = map->layout->blockdata->copy(); layout->blockdata = map->layout->blockdata->copy();
if (map->layout->border != nullptr)
layout->border = map->layout->border->copy();
} }
if (this->ui->checkBox_NewMap_Flyable->isChecked()) { if (this->ui->checkBox_NewMap_Flyable->isChecked()) {