From fba2ade2bbb7fc6a9662c0be67c9ae7832dc9ab6 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Fri, 13 Jul 2018 20:33:49 -0500 Subject: [PATCH] Provide populated comboboxes and tooltips for (mostly) everything --- event.cpp | 6 +- mainwindow.cpp | 79 ++++++-- mainwindow.h | 2 + mainwindow.ui | 400 ++++++++++++++++++++------------------- map.h | 2 +- objectpropertiesframe.ui | 12 ++ project.cpp | 78 ++++---- project.h | 12 +- 8 files changed, 328 insertions(+), 263 deletions(-) diff --git a/event.cpp b/event.cpp index c254d7af..51efc917 100755 --- a/event.cpp +++ b/event.cpp @@ -42,14 +42,14 @@ Event* Event::createNewObjectEvent() Event *event = new Event; event->put("event_group_type", "object_event_group"); event->put("event_type", EventType::Object); - event->put("sprite", "EVENT_OBJ_GFX_BOY_1"); + event->put("sprite", "MOVEMENT_TYPE_LOOK_AROUND"); event->put("movement_type", "1"); event->put("radius_x", 0); event->put("radius_y", 0); event->put("script_label", "NULL"); event->put("event_flag", "0"); event->put("replacement", "0"); - event->put("trainer_see_type", "0"); + event->put("is_trainer", "FALSE"); event->put("sight_radius_tree_id", 0); return event; } @@ -130,7 +130,7 @@ QString Event::buildObjectEventMacro(int item_index) text += QString(", %1").arg(this->get("movement_type")); text += QString(", %1").arg(radius_x); text += QString(", %1").arg(radius_y); - text += QString(", %1").arg(this->get("trainer_see_type")); + text += QString(", %1").arg(this->get("is_trainer")); text += QString(", %1").arg(this->get("sight_radius_tree_id")); text += QString(", %1").arg(this->get("script_label")); text += QString(", %1").arg(this->get("event_flag")); diff --git a/mainwindow.cpp b/mainwindow.cpp index 1fb79ad1..038e829b 100755 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -244,7 +244,7 @@ void MainWindow::setRecentMap(QString map_name) { void MainWindow::displayMapProperties() { ui->comboBox_Song->clear(); ui->comboBox_Location->clear(); - ui->comboBox_Visibility->clear(); + ui->checkBox_Visibility->setChecked(false); ui->comboBox_Weather->clear(); ui->comboBox_Type->clear(); ui->comboBox_BattleScene->clear(); @@ -263,7 +263,7 @@ void MainWindow::displayMapProperties() { ui->comboBox_Song->addItems(songs); ui->comboBox_Song->setCurrentText(map->song); - ui->comboBox_Location->addItems(project->getLocations()); + ui->comboBox_Location->addItems(*project->regionMapSections); ui->comboBox_Location->setCurrentText(map->location); QMap tilesets = project->getTilesets(); @@ -272,16 +272,15 @@ void MainWindow::displayMapProperties() { ui->comboBox_SecondaryTileset->addItems(tilesets.value("secondary")); ui->comboBox_SecondaryTileset->setCurrentText(map->layout->tileset_secondary_label); - ui->comboBox_Visibility->addItems(project->getVisibilities()); - ui->comboBox_Visibility->setCurrentText(map->visibility); + ui->checkBox_Visibility->setChecked(map->requiresFlash.toInt() > 0 || map->requiresFlash == "TRUE"); - ui->comboBox_Weather->addItems(project->getWeathers()); + ui->comboBox_Weather->addItems(*project->weatherNames); ui->comboBox_Weather->setCurrentText(map->weather); - ui->comboBox_Type->addItems(project->getMapTypes()); + ui->comboBox_Type->addItems(*project->mapTypes); ui->comboBox_Type->setCurrentText(map->type); - ui->comboBox_BattleScene->addItems(project->getBattleScenes()); + ui->comboBox_BattleScene->addItems(*project->mapBattleScenes); ui->comboBox_BattleScene->setCurrentText(map->battle_scene); ui->checkBox_ShowLocation->setChecked(map->show_location.toInt() > 0 || map->show_location == "TRUE"); @@ -301,10 +300,10 @@ void MainWindow::on_comboBox_Location_activated(const QString &location) } } -void MainWindow::on_comboBox_Visibility_activated(const QString &visibility) +void MainWindow::on_comboBox_Visibility_activated(const QString &requiresFlash) { if (editor && editor->map) { - editor->map->visibility = visibility; + editor->map->requiresFlash = requiresFlash; } } @@ -329,6 +328,17 @@ void MainWindow::on_comboBox_BattleScene_activated(const QString &battle_scene) } } +void MainWindow::on_checkBox_Visibility_clicked(bool checked) +{ + if (editor && editor->map) { + if (checked) { + editor->map->requiresFlash = "TRUE"; + } else { + editor->map->requiresFlash = "FALSE"; + } + } +} + void MainWindow::on_checkBox_ShowLocation_clicked(bool checked) { if (editor && editor->map) { @@ -344,10 +354,14 @@ void MainWindow::loadDataStructures() { Project *project = editor->project; project->readMapLayoutsTable(); project->readAllMapLayouts(); + project->readRegionMapSections(); project->readItemNames(); project->readFlagNames(); project->readVarNames(); project->readMovementTypes(); + project->readMapTypes(); + project->readMapBattleScenes(); + project->readWeatherNames(); project->readCoordEventWeatherNames(); project->readSecretBaseIds(); project->readBgEventFacingDirections(); @@ -642,11 +656,10 @@ void MainWindow::updateSelectedObjects() { QMap field_labels; field_labels["script_label"] = "Script"; field_labels["event_flag"] = "Event Flag"; - field_labels["replacement"] = "Replacement"; field_labels["movement_type"] = "Movement"; field_labels["radius_x"] = "Movement Radius X"; field_labels["radius_y"] = "Movement Radius Y"; - field_labels["trainer_see_type"] = "Trainer See Type"; + field_labels["is_trainer"] = "Trainer"; field_labels["sight_radius_tree_id"] = "Sight Radius / Berry Tree ID"; field_labels["destination_warp"] = "Destination Warp"; field_labels["destination_map_name"] = "Destination Map"; @@ -684,8 +697,7 @@ void MainWindow::updateSelectedObjects() { fields << "radius_y"; fields << "script_label"; fields << "event_flag"; - fields << "replacement"; - fields << "trainer_see_type"; + fields << "is_trainer"; fields << "sight_radius_tree_id"; } else if (event_type == EventType::Warp) { @@ -713,18 +725,38 @@ void MainWindow::updateSelectedObjects() { } for (QString key : fields) { + QString value = item->event->get(key); QWidget *widget = new QWidget(frame); QFormLayout *fl = new QFormLayout(widget); fl->setContentsMargins(9, 0, 9, 0); + + // is_trainer is the only non-combobox item. + if (key == "is_trainer") { + QCheckBox *checkbox = new QCheckBox(widget); + checkbox->setEnabled(true); + checkbox->setChecked(value.toInt() != 0 && value != "FALSE"); + checkbox->setToolTip("Whether or not this object is trainer."); + fl->addRow(new QLabel(field_labels[key], widget), checkbox); + widget->setLayout(fl); + frame->layout()->addWidget(widget); + connect(checkbox, &QCheckBox::stateChanged, [=](int state) { + QString isTrainer = state == Qt::Checked ? "TRUE" : "FALSE"; + item->event->put("is_trainer", isTrainer); + }); + continue; + } + NoScrollComboBox *combo = new NoScrollComboBox(widget); combo->setEditable(true); - QString value = item->event->get(key); if (key == "destination_map_name") { if (!editor->project->mapNames->contains(value)) { combo->addItem(value); } combo->addItems(*editor->project->mapNames); + combo->setToolTip("The destination map name of the warp."); + } else if (key == "destination_warp") { + combo->setToolTip("The warp id on the destination map."); } else if (key == "item") { if (!editor->project->itemNames->contains(value)) { combo->addItem(value); @@ -735,31 +767,50 @@ void MainWindow::updateSelectedObjects() { combo->addItem(value); } combo->addItems(*editor->project->flagNames); + if (key == "flag") + combo->setToolTip("The flag which is set when the hidden item is picked up."); + else if (key == "event_flag") + combo->setToolTip("The flag which hides the object when set."); } else if (key == "script_var") { if (!editor->project->varNames->contains(value)) { combo->addItem(value); } combo->addItems(*editor->project->varNames); + combo->setToolTip("The variable by which the script is triggered. The script is triggered when this variable's value matches 'Var Value'."); + } else if (key == "script_var_value") { + combo->setToolTip("The variable's value which triggers the script."); } else if (key == "movement_type") { if (!editor->project->movementTypes->contains(value)) { combo->addItem(value); } combo->addItems(*editor->project->movementTypes); + combo->setToolTip("The object's natural movement behavior when the player is not interacting with it."); } else if (key == "weather") { if (!editor->project->coordEventWeatherNames->contains(value)) { combo->addItem(value); } combo->addItems(*editor->project->coordEventWeatherNames); + combo->setToolTip("The weather that starts when the player steps on this spot."); } else if (key == "secret_base_id") { if (!editor->project->secretBaseIds->contains(value)) { combo->addItem(value); } combo->addItems(*editor->project->secretBaseIds); + combo->setToolTip("The secret base id which is inside this secret base entrance. Secret base ids are meant to be unique to each and every secret base entrance."); } else if (key == "player_facing_direction") { if (!editor->project->bgEventFacingDirections->contains(value)) { combo->addItem(value); } combo->addItems(*editor->project->bgEventFacingDirections); + combo->setToolTip("The direction which the player must be facing to be able to interact with this event."); + } else if (key == "radius_x") { + combo->setToolTip("The maximum number of metatiles this object is allowed to move left or right during its normal movement behavior actions."); + } else if (key == "radius_y") { + combo->setToolTip("The maximum number of metatiles this object is allowed to move up or down during its normal movement behavior actions."); + } else if (key == "script_label") { + combo->setToolTip("The script which is executed with this event."); + } else if (key == "sight_radius_tree_id") { + combo->setToolTip("The maximum sight range of a trainer, OR the unique id of the berry tree."); } else { combo->addItem(value); } diff --git a/mainwindow.h b/mainwindow.h index 7d9c908f..f7a3fe0e 100755 --- a/mainwindow.h +++ b/mainwindow.h @@ -99,6 +99,8 @@ private slots: void on_checkBox_smartPaths_stateChanged(int selected); + void on_checkBox_Visibility_clicked(bool checked); + private: Ui::MainWindow *ui; QStandardItemModel *mapListModel; diff --git a/mainwindow.ui b/mainwindow.ui index 08ce7819..1c0ab3c7 100755 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -69,6 +69,9 @@ false + + + :/icons/map.ico:/icons/map.ico @@ -76,6 +79,9 @@ Map + + <html><head/><body><p>Edit the map layout.</p><p>Select metatiles or collision attributes from the right panel, and paint them onto the map.</p></body></html> + 0 @@ -164,6 +170,9 @@ true + + <html><head/><body><p>Pencil</p><p>Click and drag to draw on the map.</p></body></html> + Paint @@ -187,6 +196,9 @@ true + + <html><head/><body><p>Pointer</p><p>Does nothing</p></body></html> + Select @@ -201,6 +213,9 @@ + + <html><head/><body><p>Flood Fill</p><p>Fills all similar tiles in a region with the selected metatiles or collision attributes</p></body></html> + Fill @@ -215,6 +230,9 @@ + + <html><head/><body><p>Eye Dropper</p><p>Click to select a metatile or collision attribute.</p></body></html> + Dropper @@ -229,6 +247,9 @@ + + <html><head/><body><p>Smart-path mode allows easier drawing of paths. If a 3x3 metatile block is selcted in the right panel, then smart path mode will automatically form a pathway using those selected blocks.</p><p>When smart-path mode is <span style=" font-weight:600;">not</span> enabled, clicking and dragging a selection will tile it in a grid.</p></body></html> + margin-left: 10px @@ -239,6 +260,9 @@ + + <html><head/><body><p>Toggles a grid over the map's metatile boundaries.</p></body></html> + @@ -262,6 +286,9 @@ + + <html><head/><body><p>Change a map layout's width and height.</p></body></html> + Change Dimensions @@ -494,6 +521,9 @@ Qt::StrongFocus + + <html><head/><body><p>Primary Tileset</p><p>Defines the first 0x200 metatiles available for the map.</p></body></html> + true @@ -511,6 +541,9 @@ Qt::StrongFocus + + <html><head/><body><p>Secondary Tileset</p><p>Defines the second 0x200 metatiles available for the map.</p></body></html> + true @@ -580,6 +613,9 @@ 48 + + <html><head/><body><p>The border is a 2x2 metatile which is repeated outside of the map layout's boundary. Draw on this border area to modify it.</p></body></html> + QFrame::StyledPanel @@ -852,7 +888,10 @@ true - Objects + Events + + + <html><head/><body><p>Edit the map's events.</p><p>View and modify objects, warps, signs, etc.</p></body></html> @@ -1113,6 +1152,9 @@ 32 + + <html><head/><body><p>Add a new event to the map.</p></body></html> + New Object @@ -1139,6 +1181,9 @@ 32 + + <html><head/><body><p>Delete the selected event from the map.</p></body></html> + Delete @@ -1178,7 +1223,7 @@ - Attributes + Header @@ -1188,211 +1233,146 @@ 10 10 - 301 - 251 + 381 + 311 + + + 0 + 0 + + QFrame::StyledPanel QFrame::Raised - - - - 20 - 30 - 47 - 21 - + + + 12 - - Song - - - - - - 20 - 60 - 47 - 21 - - - - Location - - - - - - 20 - 90 - 47 - 21 - - - - Visibility - - - - - - 20 - 120 - 47 - 21 - - - - Weather - - - - - - 20 - 150 - 47 - 21 - - - - Type - - - - - - 20 - 180 - 101 - 21 - - - - Show location name - - - - - - 20 - 210 - 81 - 21 - - - - Battle scene - - - - - - 80 - 60 - 211 - 22 - - - - true - - - - - - 80 - 90 - 211 - 22 - - - - true - - - - - - 80 - 30 - 211 - 22 - - - - true - - - - - - 80 - 120 - 211 - 22 - - - - true - - - - - - 80 - 150 - 211 - 22 - - - - true - - - - - - 90 - 210 - 201 - 22 - - - - true - - - - - - 130 - 180 - 161 - 21 - - - - - - - - - - 0 - 0 - 47 - 13 - - - - Header - - + + + + Song + + + + + + + <html><head/><body><p>The default background music for this map.</p></body></html> + + + true + + + + + + + Location + + + + + + + <html><head/><body><p>The section of the region map which the map is grouped under. This also determines the name of the map that is display when the player enters it.</p></body></html> + + + true + + + + + + + Requires Flash + + + + + + + Weather + + + + + + + <html><head/><body><p>The default weather for this map.</p></body></html> + + + true + + + + + + + Type + + + + + + + <html><head/><body><p>The map type is a general attribute, which is used for many different things. For example. it determines whether biking or running is allowed.</p></body></html> + + + true + + + + + + + Show Location Name + + + + + + + <html><head/><body><p>Whether or not to display the location name when the player enters the map.</p></body></html> + + + + + + + + + + Battle scene + + + + + + + <html><head/><body><p>Determines the type of battle scene graphics to use.</p></body></html> + + + true + + + + + + + <html><head/><body><p>Whether or not the map is dark and requires Flash to illuminate.</p></body></html> + + + + + + + @@ -1486,6 +1466,9 @@ 0 + + <html><head/><body><p>Add a new connection.</p></body></html> + @@ -1498,6 +1481,9 @@ + + <html><head/><body><p>Remove the currently-selected connection.</p></body></html> + @@ -1546,6 +1532,9 @@ 0 + + <html><head/><body><p>If enabled, connections will automatically be updated on the connected map.</p></body></html> + Mirror @@ -1608,6 +1597,9 @@ + + <html><head/><body><p>The direction of the connection.</p></body></html> + up @@ -1655,6 +1647,9 @@ + + <html><head/><body><p>The destination map name of the connection.</p></body></html> + true @@ -1669,6 +1664,9 @@ + + <html><head/><body><p>The number of metatiles to offset the connection.</p></body></html> + -999 @@ -1846,6 +1844,9 @@ + + <html><head/><body><p>Destination map name when using <span style=" font-weight:600;">Dive</span>. If empty, no such connection will exist.</p></body></html> + true @@ -1860,6 +1861,9 @@ + + <html><head/><body><p>Destination map name when emerging using <span style=" font-weight:600;">Dive</span>. If empty, no such connection will exist.</p></body></html> + true diff --git a/map.h b/map.h index 1270ce3b..e634f556 100755 --- a/map.h +++ b/map.h @@ -127,7 +127,7 @@ public: QString song; QString layout_id; QString location; - QString visibility; + QString requiresFlash; QString weather; QString type; QString unknown; diff --git a/objectpropertiesframe.ui b/objectpropertiesframe.ui index 70c22186..5ff1fa32 100755 --- a/objectpropertiesframe.ui +++ b/objectpropertiesframe.ui @@ -109,6 +109,9 @@ Qt::StrongFocus + + <html><head/><body><p>The X coordinate of this object.</p></body></html> + -32768 @@ -136,6 +139,9 @@ Qt::StrongFocus + + <html><head/><body><p>The Y coordinate of this object.</p></body></html> + -32768 @@ -163,6 +169,9 @@ Qt::StrongFocus + + <html><head/><body><p>The elevation of this object.</p></body></html> + 15 @@ -232,6 +241,9 @@ Qt::StrongFocus + + <html><head/><body><p>The sprite graphics to use for this object.</p></body></html> + true diff --git a/project.cpp b/project.cpp index e23f308d..fd352dfa 100755 --- a/project.cpp +++ b/project.cpp @@ -17,10 +17,14 @@ Project::Project() groupNames = new QStringList; map_groups = new QMap; mapNames = new QStringList; + regionMapSections = new QStringList; itemNames = new QStringList; flagNames = new QStringList; varNames = new QStringList; movementTypes = new QStringList; + mapTypes = new QStringList; + mapBattleScenes = new QStringList; + weatherNames = new QStringList; coordEventWeatherNames = new QStringList; secretBaseIds = new QStringList; bgEventFacingDirections = new QStringList; @@ -168,7 +172,7 @@ void Project::readMapHeader(Map* map) { map->song = header->value(4); map->layout_id = header->value(5); map->location = header->value(6); - map->visibility = header->value(7); + map->requiresFlash = header->value(7); map->weather = header->value(8); map->type = header->value(9); map->unknown = header->value(10); @@ -183,13 +187,13 @@ void Project::setNewMapHeader(Map* map, int mapIndex) { map->connections_label = "0x0"; map->song = "MUS_DAN02"; map->layout_id = QString("%1").arg(mapIndex); - map->location = "0"; - map->visibility = "0"; - map->weather = "2"; - map->type = "1"; + map->location = "MAPSEC_LITTLEROOT_TOWN"; + map->requiresFlash = "FALSE"; + map->weather = "WEATHER_SUNNY"; + map->type = "MAP_TYPE_TOWN"; map->unknown = "0"; - map->show_location = "1"; - map->battle_scene = "0"; + map->show_location = "TRUE"; + map->battle_scene = "MAP_BATTLE_SCENE_NORMAL"; } void Project::saveMapHeader(Map *map) { @@ -211,7 +215,7 @@ void Project::saveMapHeader(Map *map) { text += QString("\t.2byte %1\n").arg(map->song); text += QString("\t.2byte %1\n").arg(map->layout_id); text += QString("\t.byte %1\n").arg(map->location); - text += QString("\t.byte %1\n").arg(map->visibility); + text += QString("\t.byte %1\n").arg(map->requiresFlash); text += QString("\t.byte %1\n").arg(map->weather); text += QString("\t.byte %1\n").arg(map->type); text += QString("\t.2byte %1\n").arg(map->unknown); @@ -986,15 +990,6 @@ QList* Project::parseAsm(QString text) { return parser->parseAsm(text); } -QStringList Project::getLocations() { - // TODO - QStringList names; - for (int i = 0; i < 88; i++) { - names.append(QString("%1").arg(i)); - } - return names; -} - QStringList Project::getVisibilities() { // TODO QStringList names; @@ -1045,31 +1040,10 @@ QMap Project::getTilesets() { return allTilesets; } -QStringList Project::getWeathers() { - // TODO - QStringList names; - for (int i = 0; i < 16; i++) { - names.append(QString("%1").arg(i)); - } - return names; -} - -QStringList Project::getMapTypes() { - // TODO - QStringList names; - for (int i = 0; i < 16; i++) { - names.append(QString("%1").arg(i)); - } - return names; -} - -QStringList Project::getBattleScenes() { - // TODO - QStringList names; - for (int i = 0; i < 16; i++) { - names.append(QString("%1").arg(i)); - } - return names; +void Project::readRegionMapSections() { + QString filepath = root + "/include/constants/region_map_sections.h"; + QStringList prefixes = (QStringList() << "MAPSEC_"); + readCDefinesSorted(filepath, prefixes, regionMapSections); } void Project::readItemNames() { @@ -1096,6 +1070,24 @@ void Project::readMovementTypes() { readCDefinesSorted(filepath, prefixes, movementTypes); } +void Project::readMapTypes() { + QString filepath = root + "/include/constants/map_types.h"; + QStringList prefixes = (QStringList() << "MAP_TYPE_"); + readCDefinesSorted(filepath, prefixes, mapTypes); +} + +void Project::readMapBattleScenes() { + QString filepath = root + "/include/constants/map_types.h"; + QStringList prefixes = (QStringList() << "MAP_BATTLE_SCENE_"); + readCDefinesSorted(filepath, prefixes, mapBattleScenes); +} + +void Project::readWeatherNames() { + QString filepath = root + "/include/constants/weather.h"; + QStringList prefixes = (QStringList() << "WEATHER_"); + readCDefinesSorted(filepath, prefixes, weatherNames); +} + void Project::readCoordEventWeatherNames() { QString filepath = root + "/include/constants/weather.h"; QStringList prefixes = (QStringList() << "COORD_EVENT_WEATHER_"); @@ -1352,7 +1344,7 @@ void Project::readMapEvents(Map *map) { object->put("movement_type", command.value(i++)); object->put("radius_x", command.value(i++).toInt(nullptr, 0)); object->put("radius_y", command.value(i++).toInt(nullptr, 0)); - object->put("trainer_see_type", command.value(i++)); + object->put("is_trainer", command.value(i++)); object->put("sight_radius_tree_id", command.value(i++)); object->put("script_label", command.value(i++)); object->put("event_flag", command.value(i++)); diff --git a/project.h b/project.h index d7ed0f3e..90796295 100755 --- a/project.h +++ b/project.h @@ -23,10 +23,14 @@ public: QList mapLayoutsTableMaster; QMap mapLayouts; QMap mapLayoutsMaster; + QStringList *regionMapSections = NULL; QStringList *itemNames = NULL; QStringList *flagNames = NULL; QStringList *varNames = NULL; QStringList *movementTypes = NULL; + QStringList *mapTypes = NULL; + QStringList *mapBattleScenes = NULL; + QStringList *weatherNames = NULL; QStringList *coordEventWeatherNames = NULL; QStringList *secretBaseIds = NULL; QStringList *bgEventFacingDirections = NULL; @@ -76,16 +80,16 @@ public: QList* parseAsm(QString text); QStringList getSongNames(); - QStringList getLocations(); QStringList getVisibilities(); QMap getTilesets(); - QStringList getWeathers(); - QStringList getMapTypes(); - QStringList getBattleScenes(); + void readRegionMapSections(); void readItemNames(); void readFlagNames(); void readVarNames(); void readMovementTypes(); + void readMapTypes(); + void readMapBattleScenes(); + void readWeatherNames(); void readCoordEventWeatherNames(); void readSecretBaseIds(); void readBgEventFacingDirections();