Parse pokefirered metatile behaviors/layer types

This commit is contained in:
GriffinR 2020-03-15 03:03:12 -04:00
parent c0a512803e
commit ffddc35b60

View file

@ -1477,6 +1477,24 @@ void Project::loadTilesetMetatiles(Tileset* tileset) {
if (attrs_file.open(QIODevice::ReadOnly)) { if (attrs_file.open(QIODevice::ReadOnly)) {
QByteArray data = attrs_file.readAll(); QByteArray data = attrs_file.readAll();
int num_metatiles = tileset->metatiles->count(); int num_metatiles = tileset->metatiles->count();
if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) {
int num_metatileAttrs = data.length() / 4;
if (num_metatiles != num_metatileAttrs) {
logWarn(QString("Metatile count %1 does not match metatile attribute count %2 in %3").arg(num_metatiles).arg(num_metatileAttrs).arg(tileset->name));
if (num_metatileAttrs > num_metatiles)
num_metatileAttrs = num_metatiles;
}
for (int i = 0; i < num_metatileAttrs; i++) {
int value = (static_cast<unsigned char>(data.at(i * 4 + 3)) << 24) |
(static_cast<unsigned char>(data.at(i * 4 + 2)) << 16) |
(static_cast<unsigned char>(data.at(i * 4 + 1)) << 8) |
(static_cast<unsigned char>(data.at(i * 4 + 0)));
tileset->metatiles->at(i)->behavior = value & 0x1FF;
tileset->metatiles->at(i)->layerType = (value & 0x60000000) >> 29;
}
} else {
int num_metatileAttrs = data.length() / 2; int num_metatileAttrs = data.length() / 2;
if (num_metatiles != num_metatileAttrs) { if (num_metatiles != num_metatileAttrs) {
logWarn(QString("Metatile count %1 does not match metatile attribute count %2 in %3").arg(num_metatiles).arg(num_metatileAttrs).arg(tileset->name)); logWarn(QString("Metatile count %1 does not match metatile attribute count %2 in %3").arg(num_metatiles).arg(num_metatileAttrs).arg(tileset->name));
@ -1488,6 +1506,7 @@ void Project::loadTilesetMetatiles(Tileset* tileset) {
tileset->metatiles->at(i)->behavior = value & 0xFF; tileset->metatiles->at(i)->behavior = value & 0xFF;
tileset->metatiles->at(i)->layerType = (value & 0xF000) >> 12; tileset->metatiles->at(i)->layerType = (value & 0xF000) >> 12;
} }
}
} else { } else {
logError(QString("Could not open tileset metatile attributes file '%1'").arg(tileset->metatile_attrs_path)); logError(QString("Could not open tileset metatile attributes file '%1'").arg(tileset->metatile_attrs_path));
} }