porymap/src/core/tileset.cpp

134 lines
5.6 KiB
C++
Raw Normal View History

2018-09-25 01:12:29 +01:00
#include "tileset.h"
#include "metatile.h"
#include "project.h"
2019-03-21 23:50:50 +00:00
#include "log.h"
#include "config.h"
#include <QPainter>
#include <QImage>
2018-10-03 01:01:15 +01:00
Tileset* Tileset::getBlockTileset(int metatile_index, Tileset *primaryTileset, Tileset *secondaryTileset) {
if (metatile_index < Project::getNumMetatilesPrimary()) {
return primaryTileset;
} else {
return secondaryTileset;
}
}
Metatile* Tileset::getMetatile(int index, Tileset *primaryTileset, Tileset *secondaryTileset) {
Tileset *tileset = Tileset::getBlockTileset(index, primaryTileset, secondaryTileset);
int local_index = Metatile::getBlockIndex(index);
2021-02-17 02:45:54 +00:00
if (!tileset) {
return nullptr;
}
2021-02-17 02:45:54 +00:00
return tileset->metatiles.value(local_index, nullptr);
}
bool Tileset::metatileIsValid(uint16_t metatileId, Tileset *primaryTileset, Tileset *secondaryTileset) {
if (metatileId >= Project::getNumMetatilesTotal())
return false;
2021-02-17 02:45:54 +00:00
if (metatileId < Project::getNumMetatilesPrimary() && metatileId >= primaryTileset->metatiles.length())
return false;
2021-02-17 02:45:54 +00:00
if (metatileId >= Project::getNumMetatilesPrimary() + secondaryTileset->metatiles.length())
return false;
return true;
}
2020-05-03 16:31:44 +01:00
QList<QList<QRgb>> Tileset::getBlockPalettes(Tileset *primaryTileset, Tileset *secondaryTileset, bool useTruePalettes) {
QList<QList<QRgb>> palettes;
2020-05-03 16:31:44 +01:00
auto primaryPalettes = useTruePalettes ? primaryTileset->palettes : primaryTileset->palettePreviews;
for (int i = 0; i < Project::getNumPalettesPrimary(); i++) {
2021-02-17 02:45:54 +00:00
palettes.append(primaryPalettes.at(i));
}
2020-05-03 16:31:44 +01:00
auto secondaryPalettes = useTruePalettes ? secondaryTileset->palettes : secondaryTileset->palettePreviews;
for (int i = Project::getNumPalettesPrimary(); i < Project::getNumPalettesTotal(); i++) {
2021-02-17 02:45:54 +00:00
palettes.append(secondaryPalettes.at(i));
}
return palettes;
}
2020-05-03 16:31:44 +01:00
QList<QRgb> Tileset::getPalette(int paletteId, Tileset *primaryTileset, Tileset *secondaryTileset, bool useTruePalettes) {
QList<QRgb> paletteTable;
Tileset *tileset = paletteId < Project::getNumPalettesPrimary()
? primaryTileset
: secondaryTileset;
2020-05-03 16:31:44 +01:00
auto palettes = useTruePalettes ? tileset->palettes : tileset->palettePreviews;
2021-02-17 02:45:54 +00:00
for (int i = 0; i < palettes.at(paletteId).length(); i++) {
paletteTable.append(palettes.at(paletteId).at(i));
}
return paletteTable;
}
2019-03-21 23:50:50 +00:00
bool Tileset::appendToHeaders(QString headerFile, QString friendlyName){
QFile file(headerFile);
if (!file.open(QIODevice::WriteOnly | QIODevice::Append)) {
logError(QString("Could not write to file \"%1\"").arg(headerFile));
return false;
}
2019-03-22 02:33:53 +00:00
QString dataString = "\n\t.align 2\n";
dataString.append(QString("%1::\n").arg(this->name));
dataString.append(QString("\t.byte %1 @ is compressed\n").arg(this->is_compressed));
dataString.append(QString("\t.byte %1 @ is secondary\n").arg(this->is_secondary));
2019-03-23 14:17:44 +00:00
dataString.append(QString("\t.2byte %1\n").arg(this->padding));
2019-03-22 02:33:53 +00:00
dataString.append(QString("\t.4byte gTilesetTiles_%1\n").arg(friendlyName));
dataString.append(QString("\t.4byte gTilesetPalettes_%1\n").arg(friendlyName));
dataString.append(QString("\t.4byte gMetatiles_%1\n").arg(friendlyName));
if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) {
dataString.append("\t.4byte NULL\n");
dataString.append(QString("\t.4byte gMetatileAttributes_%1\n").arg(friendlyName));
} else {
dataString.append(QString("\t.4byte gMetatileAttributes_%1\n").arg(friendlyName));
dataString.append("\t.4byte NULL\n");
}
2019-03-21 23:50:50 +00:00
file.write(dataString.toUtf8());
file.flush();
file.close();
return true;
}
bool Tileset::appendToGraphics(QString graphicsFile, QString friendlyName, bool primary) {
QString primaryString = primary ? "primary" : "secondary";
QFile file(graphicsFile);
if (!file.open(QIODevice::WriteOnly | QIODevice::Append)) {
logError(QString("Could not write to file \"%1\"").arg(graphicsFile));
return false;
}
2019-03-22 02:33:53 +00:00
QString dataString = "\n\t.align 2\n";
dataString.append(QString("gTilesetPalettes_%1::\n").arg(friendlyName));
for(int i = 0; i < Project::getNumPalettesTotal(); ++i) {
2020-08-27 01:42:42 +01:00
QString paletteString = QString("%1.gbapal").arg(i, 2, 10, QLatin1Char('0'));
2019-03-22 02:33:53 +00:00
dataString.append(QString("\t.incbin \"data/tilesets/%1/%2/palettes/%3\"\n").arg(primaryString, friendlyName.toLower(), paletteString));
2019-03-21 23:50:50 +00:00
}
2019-03-22 02:33:53 +00:00
dataString.append("\n\t.align 2\n");
dataString.append(QString("gTilesetTiles_%1::\n").arg(friendlyName));
dataString.append(QString("\t.incbin \"data/tilesets/%1/%2/tiles.4bpp.lz\"\n").arg(primaryString, friendlyName.toLower()));
2019-03-21 23:50:50 +00:00
file.write(dataString.toUtf8());
file.flush();
file.close();
return true;
}
bool Tileset::appendToMetatiles(QString metatileFile, QString friendlyName, bool primary) {
QString primaryString = primary ? "primary" : "secondary";
QFile file(metatileFile);
if (!file.open(QIODevice::WriteOnly | QIODevice::Append)) {
logError(QString("Could not write to file \"%1\"").arg(metatileFile));
return false;
}
2019-03-22 02:33:53 +00:00
QString dataString = "\n\t.align 1\n";
dataString.append(QString("gMetatiles_%1::\n").arg(friendlyName));
dataString.append(QString("\t.incbin \"data/tilesets/%1/%2/metatiles.bin\"\n").arg(primaryString, friendlyName.toLower()));
dataString.append(QString("\n\t.align 1\n"));
dataString.append(QString("gMetatileAttributes_%1::\n").arg(friendlyName));
2019-03-21 23:50:50 +00:00
dataString.append(QString("\t.incbin \"data/tilesets/%1/%2/metatile_attributes.bin\"").arg(primaryString, friendlyName.toLower()));
file.write(dataString.toUtf8());
file.flush();
file.close();
return true;
}