Read tileset graphics paths from C
This commit is contained in:
parent
70528bbc56
commit
9b4c55106b
4 changed files with 55 additions and 14 deletions
|
@ -48,8 +48,10 @@ public:
|
||||||
QStringList readCArray(const QString &text, const QString &label);
|
QStringList readCArray(const QString &text, const QString &label);
|
||||||
QMap<QString, QString> readNamedIndexCArray(const QString &text, const QString &label);
|
QMap<QString, QString> readNamedIndexCArray(const QString &text, const QString &label);
|
||||||
QString readCIncbin(const QString &text, const QString &label);
|
QString readCIncbin(const QString &text, const QString &label);
|
||||||
|
QStringList readCIncbinArray(const QString &filename, const QString &label);
|
||||||
QMap<QString, int> readCDefines(const QString &filename, const QStringList &prefixes, QMap<QString, int> = { });
|
QMap<QString, int> readCDefines(const QString &filename, const QStringList &prefixes, QMap<QString, int> = { });
|
||||||
QStringList readCDefinesSorted(const QString&, const QStringList&, const QMap<QString, int>& = { });
|
QStringList readCDefinesSorted(const QString&, const QStringList&, const QMap<QString, int>& = { });
|
||||||
|
QMap<QString, QMap<QString, QString>> readCStructs(const QString &, const QString & = "", const QHash<int, QString> = { });
|
||||||
QList<QStringList> getLabelMacros(const QList<QStringList>&, const QString&);
|
QList<QStringList> getLabelMacros(const QList<QStringList>&, const QString&);
|
||||||
QStringList getLabelValues(const QList<QStringList>&, const QString&);
|
QStringList getLabelValues(const QList<QStringList>&, const QString&);
|
||||||
bool tryParseJsonFile(QJsonDocument *out, const QString &filepath);
|
bool tryParseJsonFile(QJsonDocument *out, const QString &filepath);
|
||||||
|
@ -70,7 +72,6 @@ public:
|
||||||
|
|
||||||
static QStringList splitShellCommand(QStringView command);
|
static QStringList splitShellCommand(QStringView command);
|
||||||
static bool gameStringToBool(QString gameString);
|
static bool gameStringToBool(QString gameString);
|
||||||
static QMap<QString, QMap<QString, QString>> readCStructs(const QString &filePath, const QString &target = "", const QHash<int, QString> memberMap = { });
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString root;
|
QString root;
|
||||||
|
|
|
@ -270,6 +270,30 @@ QString ParseUtil::readCIncbin(const QString &filename, const QString &label) {
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QStringList ParseUtil::readCIncbinArray(const QString &filename, const QString &label) {
|
||||||
|
QStringList paths;
|
||||||
|
|
||||||
|
if (label.isNull()) {
|
||||||
|
return paths;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->text = readTextFile(this->root + "/" + filename);
|
||||||
|
|
||||||
|
// Get the text starting after the label all the way to the definition's end
|
||||||
|
QRegularExpression re(QString("\\b%1\\b(.*?)};").arg(label), QRegularExpression::DotMatchesEverythingOption);
|
||||||
|
QRegularExpressionMatch arrayMatch = re.match(this->text);
|
||||||
|
if (!arrayMatch.hasMatch())
|
||||||
|
return paths;
|
||||||
|
|
||||||
|
// Extract incbin paths from the array
|
||||||
|
re.setPattern("INCBIN_[US][0-9][0-9]?\\(\\s*\"([^\"]*)\"\\s*\\)");
|
||||||
|
QRegularExpressionMatchIterator iter = re.globalMatch(arrayMatch.captured(1));
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
paths.append(iter.next().captured(1));
|
||||||
|
}
|
||||||
|
return paths;
|
||||||
|
}
|
||||||
|
|
||||||
QMap<QString, int> ParseUtil::readCDefines(const QString &filename,
|
QMap<QString, int> ParseUtil::readCDefines(const QString &filename,
|
||||||
const QStringList &prefixes,
|
const QStringList &prefixes,
|
||||||
QMap<QString, int> allDefines)
|
QMap<QString, int> allDefines)
|
||||||
|
@ -389,14 +413,15 @@ bool ParseUtil::gameStringToBool(QString gameString) {
|
||||||
return num != 0;
|
return num != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
QMap<QString, QMap<QString, QString>> ParseUtil::readCStructs(const QString &filePath, const QString &target, const QHash<int, QString> memberMap) {
|
QMap<QString, QMap<QString, QString>> ParseUtil::readCStructs(const QString &filename, const QString &label, const QHash<int, QString> memberMap) {
|
||||||
|
QString filePath = this->root + "/" + filename;
|
||||||
auto cParser = fex::Parser();
|
auto cParser = fex::Parser();
|
||||||
auto tokens = fex::Lexer().LexFile(filePath.toStdString());
|
auto tokens = fex::Lexer().LexFile(filePath.toStdString());
|
||||||
auto structs = cParser.ParseTopLevelObjects(tokens);
|
auto structs = cParser.ParseTopLevelObjects(tokens);
|
||||||
QMap<QString, QMap<QString, QString>> structMaps;
|
QMap<QString, QMap<QString, QString>> structMaps;
|
||||||
for (auto it = structs.begin(); it != structs.end(); it++) {
|
for (auto it = structs.begin(); it != structs.end(); it++) {
|
||||||
QString structLabel = QString::fromStdString(it->first);
|
QString structLabel = QString::fromStdString(it->first);
|
||||||
if (!target.isEmpty() && target != structLabel) continue; // Speed up parsing if only looking for a particular symbol
|
if (!label.isEmpty() && label != structLabel) continue; // Speed up parsing if only looking for a particular symbol
|
||||||
QMap<QString, QString> values;
|
QMap<QString, QString> values;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (const fex::ArrayValue &v : it->second.values()) {
|
for (const fex::ArrayValue &v : it->second.values()) {
|
||||||
|
|
|
@ -169,6 +169,7 @@ bool Tileset::appendToHeaders(QString root, QString friendlyName, bool usingAsm)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Interpet isSecondary to remove primary argument here and below
|
// TODO: Interpet isSecondary to remove primary argument here and below
|
||||||
|
// TODO: friendlyName.toLower() is not the usual format for tileset folders
|
||||||
bool Tileset::appendToGraphics(QString root, QString friendlyName, bool primary, bool usingAsm) {
|
bool Tileset::appendToGraphics(QString root, QString friendlyName, bool primary, bool usingAsm) {
|
||||||
QString graphicsFile = root + "/" + (usingAsm ? projectConfig.getFilePath(ProjectFilePath::tilesets_graphics_asm)
|
QString graphicsFile = root + "/" + (usingAsm ? projectConfig.getFilePath(ProjectFilePath::tilesets_graphics_asm)
|
||||||
: projectConfig.getFilePath(ProjectFilePath::tilesets_graphics));
|
: projectConfig.getFilePath(ProjectFilePath::tilesets_graphics));
|
||||||
|
|
|
@ -1153,7 +1153,7 @@ Tileset* Project::loadTileset(QString label, Tileset *tileset) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Read C tileset header
|
// Read C tileset header
|
||||||
QMap<QString, QMap<QString, QString>> structs = ParseUtil::readCStructs(this->root + "/" + projectConfig.getFilePath(ProjectFilePath::tilesets_headers), label);
|
QMap<QString, QMap<QString, QString>> structs = parser.readCStructs(projectConfig.getFilePath(ProjectFilePath::tilesets_headers), label);
|
||||||
if (!structs.contains(label)) {
|
if (!structs.contains(label)) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -1519,12 +1519,26 @@ void Project::readTilesetPaths(Tileset* tileset) {
|
||||||
tileset->metatiles_path = root + '/' + metatiles_values.value(0).section('"', 1, 1);
|
tileset->metatiles_path = root + '/' + metatiles_values.value(0).section('"', 1, 1);
|
||||||
if (!metatile_attrs_values.isEmpty())
|
if (!metatile_attrs_values.isEmpty())
|
||||||
tileset->metatile_attrs_path = root + '/' + metatile_attrs_values.value(0).section('"', 1, 1);
|
tileset->metatile_attrs_path = root + '/' + metatile_attrs_values.value(0).section('"', 1, 1);
|
||||||
for (const auto &value : palettes_values) {
|
for (const auto &value : palettes_values)
|
||||||
tileset->palettePaths.append(this->fixPalettePath(root + '/' + value.section('"', 1, 1)));
|
tileset->palettePaths.append(this->fixPalettePath(root + '/' + value.section('"', 1, 1)));
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// Read C tileset data files
|
// Read C tileset data files
|
||||||
// TODO
|
const QString graphicsFile = projectConfig.getFilePath(ProjectFilePath::tilesets_graphics);
|
||||||
|
const QString metatilesFile = projectConfig.getFilePath(ProjectFilePath::tilesets_metatiles);
|
||||||
|
|
||||||
|
const QString tilesImagePath = parser.readCIncbin(graphicsFile, tileset->tiles_label);
|
||||||
|
const QStringList palettePaths = parser.readCIncbinArray(graphicsFile, tileset->palettes_label);
|
||||||
|
const QString metatilesPath = parser.readCIncbin(metatilesFile, tileset->metatiles_label);
|
||||||
|
const QString metatileAttrsPath = parser.readCIncbin(metatilesFile, tileset->metatile_attrs_label);
|
||||||
|
|
||||||
|
if (!tilesImagePath.isEmpty())
|
||||||
|
tileset->tilesImagePath = this->fixGraphicPath(root + '/' + tilesImagePath);
|
||||||
|
if (!metatilesPath.isEmpty())
|
||||||
|
tileset->metatiles_path = root + '/' + metatilesPath;
|
||||||
|
if (!metatileAttrsPath.isEmpty())
|
||||||
|
tileset->metatile_attrs_path = root + '/' + metatileAttrsPath;
|
||||||
|
for (const auto &path : palettePaths)
|
||||||
|
tileset->palettePaths.append(this->fixPalettePath(root + '/' + path));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Construct the expected path of the tileset's graphics, in case Porymap couldn't find any paths.
|
// Construct the expected path of the tileset's graphics, in case Porymap couldn't find any paths.
|
||||||
|
@ -1934,13 +1948,13 @@ bool Project::readTilesetLabels() {
|
||||||
this->tilesetLabels.insert("secondary", secondaryTilesets);
|
this->tilesetLabels.insert("secondary", secondaryTilesets);
|
||||||
this->tilesetLabelsOrdered.clear();
|
this->tilesetLabelsOrdered.clear();
|
||||||
|
|
||||||
QString filename = this->root + "/" + projectConfig.getFilePath(ProjectFilePath::tilesets_headers);
|
QString filename = projectConfig.getFilePath(ProjectFilePath::tilesets_headers);
|
||||||
QFileInfo fileInfo(filename);
|
QFileInfo fileInfo(this->root + "/" + filename);
|
||||||
if (!fileInfo.exists() || !fileInfo.isFile()) {
|
if (!fileInfo.exists() || !fileInfo.isFile()) {
|
||||||
// If the tileset headers file is missing, the user may still have the old assembly format.
|
// If the tileset headers file is missing, the user may still have the old assembly format.
|
||||||
this->usingAsmTilesets = true;
|
this->usingAsmTilesets = true;
|
||||||
QString asm_filename = this->root + "/" + projectConfig.getFilePath(ProjectFilePath::tilesets_headers_asm);
|
QString asm_filename = projectConfig.getFilePath(ProjectFilePath::tilesets_headers_asm);
|
||||||
QString text = parser.readTextFile(asm_filename);
|
QString text = parser.readTextFile(this->root + "/" + asm_filename);
|
||||||
if (text.isEmpty()) {
|
if (text.isEmpty()) {
|
||||||
logError(QString("Failed to read tileset labels from '%1' or '%2'.").arg(filename).arg(asm_filename));
|
logError(QString("Failed to read tileset labels from '%1' or '%2'.").arg(filename).arg(asm_filename));
|
||||||
return false;
|
return false;
|
||||||
|
@ -1959,7 +1973,7 @@ bool Project::readTilesetLabels() {
|
||||||
filename = asm_filename; // For error reporting further down
|
filename = asm_filename; // For error reporting further down
|
||||||
} else {
|
} else {
|
||||||
this->usingAsmTilesets = false;
|
this->usingAsmTilesets = false;
|
||||||
QMap<QString, QMap<QString, QString>> structs = ParseUtil::readCStructs(filename);
|
QMap<QString, QMap<QString, QString>> structs = parser.readCStructs(filename);
|
||||||
QStringList labels = structs.keys();
|
QStringList labels = structs.keys();
|
||||||
for (const auto tilesetLabel : labels) {
|
for (const auto tilesetLabel : labels) {
|
||||||
if (tilesetLabel.isEmpty()) continue;
|
if (tilesetLabel.isEmpty()) continue;
|
||||||
|
@ -2525,8 +2539,8 @@ bool Project::readEventGraphics() {
|
||||||
{14, "images"},
|
{14, "images"},
|
||||||
};
|
};
|
||||||
|
|
||||||
QString filepath = root + "/" + projectConfig.getFilePath(ProjectFilePath::data_obj_event_gfx_info);
|
QString filepath = projectConfig.getFilePath(ProjectFilePath::data_obj_event_gfx_info);
|
||||||
QMap<QString, QMap<QString, QString>> gfxInfos = ParseUtil::readCStructs(filepath, "", gfxInfoMemberMap);
|
QMap<QString, QMap<QString, QString>> gfxInfos = parser.readCStructs(filepath, "", gfxInfoMemberMap);
|
||||||
for (QString gfxName : gfxNames) {
|
for (QString gfxName : gfxNames) {
|
||||||
EventGraphics * eventGraphics = new EventGraphics;
|
EventGraphics * eventGraphics = new EventGraphics;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue