Add block layout to config

This commit is contained in:
GriffinR 2023-12-12 19:14:39 -05:00
parent 2228f78117
commit 19e5e681e5
4 changed files with 112 additions and 1 deletions

View file

@ -370,7 +370,7 @@
<x>0</x>
<y>0</y>
<width>531</width>
<height>490</height>
<height>566</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_16">
@ -579,6 +579,57 @@
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_MapDataLayout">
<property name="title">
<string>Map Data Layout</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_MetatileIdMask">
<property name="text">
<string>Metatile ID</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_CollisionMask">
<property name="text">
<string>Collision</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_ElevationMask">
<property name="text">
<string>Elevation</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="UIntHexSpinBox" name="spinBox_MetatileIdMask" native="true">
<property name="toolTip">
<string>The mask used to read/write metatile IDs in map data.</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="UIntHexSpinBox" name="spinBox_CollisionMask" native="true">
<property name="toolTip">
<string>The mask used to read/write collision values in map data.</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="UIntHexSpinBox" name="spinBox_ElevationMask" native="true">
<property name="toolTip">
<string>The mask used to read/write elevation values in map data.</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_MapFields">
<property name="title">

View file

@ -243,6 +243,9 @@ public:
this->collisionSheetPath = QString();
this->collisionSheetWidth = 2;
this->collisionSheetHeight = 16;
this->blockMetatileIdMask = 0x03FF;
this->blockCollisionMask = 0x0C00;
this->blockElevationMask = 0xF000;
this->readKeys.clear();
}
static const QMap<ProjectFilePath, std::pair<QString, QString>> defaultPaths;
@ -313,6 +316,12 @@ public:
void setMetatileTerrainTypeMask(uint32_t mask);
void setMetatileEncounterTypeMask(uint32_t mask);
void setMetatileLayerTypeMask(uint32_t mask);
uint16_t getBlockMetatileIdMask();
uint16_t getBlockCollisionMask();
uint16_t getBlockElevationMask();
void setBlockMetatileIdMask(uint16_t mask);
void setBlockCollisionMask(uint16_t mask);
void setBlockElevationMask(uint16_t mask);
bool getMapAllowFlagsEnabled();
void setMapAllowFlagsEnabled(bool enabled);
void setEventIconPath(Event::Group group, const QString &path);
@ -364,6 +373,9 @@ private:
uint32_t metatileTerrainTypeMask;
uint32_t metatileEncounterTypeMask;
uint32_t metatileLayerTypeMask;
uint16_t blockMetatileIdMask;
uint16_t blockCollisionMask;
uint16_t blockElevationMask;
bool enableMapAllowFlags;
QMap<Event::Group, QString> eventIconPaths;
QHash<QString, QString> pokemonIconPaths;

View file

@ -688,6 +688,12 @@ void ProjectConfig::parseConfigKeyValue(QString key, QString value) {
this->metatileEncounterTypeMask = getConfigUint32(key, value);
} else if (key == "metatile_layer_type_mask") {
this->metatileLayerTypeMask = getConfigUint32(key, value);
} else if (key == "block_metatile_id_mask") {
this->blockMetatileIdMask = getConfigUint32(key, value, 1, 0xFFFF);
} else if (key == "block_collision_mask") {
this->blockCollisionMask = getConfigUint32(key, value, 0, 0xFFFE);
} else if (key == "block_elevation_mask") {
this->blockElevationMask = getConfigUint32(key, value, 0, 0xFFFE);
} else if (key == "enable_map_allow_flags") {
this->enableMapAllowFlags = getConfigBool(key, value);
#ifdef CONFIG_BACKWARDS_COMPATABILITY
@ -799,6 +805,9 @@ QMap<QString, QString> ProjectConfig::getKeyValueMap() {
map.insert("metatile_terrain_type_mask", "0x" + QString::number(this->metatileTerrainTypeMask, 16).toUpper());
map.insert("metatile_encounter_type_mask", "0x" + QString::number(this->metatileEncounterTypeMask, 16).toUpper());
map.insert("metatile_layer_type_mask", "0x" + QString::number(this->metatileLayerTypeMask, 16).toUpper());
map.insert("block_metatile_id_mask", "0x" + QString::number(this->blockMetatileIdMask, 16).toUpper());
map.insert("block_collision_mask", "0x" + QString::number(this->blockCollisionMask, 16).toUpper());
map.insert("block_elevation_mask", "0x" + QString::number(this->blockElevationMask, 16).toUpper());
map.insert("enable_map_allow_flags", QString::number(this->enableMapAllowFlags));
map.insert("event_icon_path_object", this->eventIconPaths[Event::Group::Object]);
map.insert("event_icon_path_warp", this->eventIconPaths[Event::Group::Warp]);
@ -1152,6 +1161,33 @@ void ProjectConfig::setMetatileLayerTypeMask(uint32_t mask) {
this->save();
}
uint16_t ProjectConfig::getBlockMetatileIdMask() {
return this->blockMetatileIdMask;
}
uint16_t ProjectConfig::getBlockCollisionMask() {
return this->blockCollisionMask;
}
uint16_t ProjectConfig::getBlockElevationMask() {
return this->blockElevationMask;
}
void ProjectConfig::setBlockMetatileIdMask(uint16_t mask) {
this->blockMetatileIdMask = mask;
this->save();
}
void ProjectConfig::setBlockCollisionMask(uint16_t mask) {
this->blockCollisionMask = mask;
this->save();
}
void ProjectConfig::setBlockElevationMask(uint16_t mask) {
this->blockElevationMask = mask;
this->save();
}
bool ProjectConfig::getMapAllowFlagsEnabled() {
return this->enableMapAllowFlags;
}

View file

@ -102,6 +102,7 @@ void ProjectSettingsEditor::initUi() {
ui->lineEdit_BorderMetatiles->setValidator(validator);
this->setBorderMetatilesUi(projectConfig.getUseCustomBorderSize());
// Set spin box limits
int maxMetatileId = Project::getNumMetatilesTotal() - 1;
ui->spinBox_FillMetatile->setMaximum(maxMetatileId);
ui->spinBox_BorderMetatile1->setMaximum(maxMetatileId);
@ -112,6 +113,11 @@ void ProjectSettingsEditor::initUi() {
ui->spinBox_Collision->setMaximum(Project::getMaxCollision());
ui->spinBox_MaxElevation->setMaximum(Project::getMaxElevation());
ui->spinBox_MaxCollision->setMaximum(Project::getMaxCollision());
// TODO: Move to a global
ui->spinBox_MetatileIdMask->setMinimum(0x1);
ui->spinBox_MetatileIdMask->setMaximum(0xFFFF); // Metatile IDs can use all 16 bits of a block
ui->spinBox_CollisionMask->setMaximum(0xFFFE); // Collision/elevation can only use 15; metatile IDs must have at least 1 bit
ui->spinBox_ElevationMask->setMaximum(0xFFFE);
}
void ProjectSettingsEditor::setBorderMetatilesUi(bool customSize) {
@ -285,6 +291,9 @@ void ProjectSettingsEditor::refresh() {
ui->spinBox_EncounterTypeMask->setValue(projectConfig.getMetatileEncounterTypeMask());
ui->spinBox_LayerTypeMask->setValue(projectConfig.getMetatileLayerTypeMask());
ui->spinBox_TerrainTypeMask->setValue(projectConfig.getMetatileTerrainTypeMask());
ui->spinBox_MetatileIdMask->setValue(projectConfig.getBlockMetatileIdMask());
ui->spinBox_CollisionMask->setValue(projectConfig.getBlockCollisionMask());
ui->spinBox_ElevationMask->setValue(projectConfig.getBlockElevationMask());
// Set (and sync) border metatile IDs
auto metatileIds = projectConfig.getNewMapBorderMetatileIds();
@ -345,6 +354,9 @@ void ProjectSettingsEditor::save() {
projectConfig.setMetatileTerrainTypeMask(ui->spinBox_TerrainTypeMask->value());
projectConfig.setMetatileEncounterTypeMask(ui->spinBox_EncounterTypeMask->value());
projectConfig.setMetatileLayerTypeMask(ui->spinBox_LayerTypeMask->value());
projectConfig.setBlockMetatileIdMask(ui->spinBox_MetatileIdMask->value());
projectConfig.setBlockCollisionMask(ui->spinBox_CollisionMask->value());
projectConfig.setBlockElevationMask(ui->spinBox_ElevationMask->value());
// Save line edit settings
projectConfig.setPrefabFilepath(ui->lineEdit_PrefabsPath->text());