diff --git a/src/core/event.cpp b/src/core/event.cpp index 1015cc5e..e8750971 100644 --- a/src/core/event.cpp +++ b/src/core/event.cpp @@ -1,6 +1,7 @@ #include "event.h" #include "map.h" #include "project.h" +#include "config.h" QString EventType::Object = "event_object"; QString EventType::Warp = "event_warp"; @@ -131,6 +132,10 @@ Event* Event::createNewHiddenItemEvent(Project *project) event->put("item", project->itemNames->first()); event->put("flag", project->flagNames->first()); event->put("elevation", 3); + if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + event->put("quantity", 1); + event->put("underfoot", false); + } return event; } @@ -207,14 +212,27 @@ QMap Event::getExpectedFields() {"script", true}, }; } else if (type == EventType::HiddenItem) { - return QMap { - {"type", true}, - {"x", true}, - {"y", true}, - {"elevation", true}, - {"item", true}, - {"flag", true}, - }; + if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + return QMap { + {"type", true}, + {"x", true}, + {"y", true}, + {"elevation", true}, + {"item", true}, + {"flag", true}, + {"quantity", true}, + {"underfoot", true}, + }; + } else { + return QMap { + {"type", true}, + {"x", true}, + {"y", true}, + {"elevation", true}, + {"item", true}, + {"flag", true}, + }; + } } else if (type == EventType::SecretBase) { return QMap { {"type", true}, @@ -331,6 +349,10 @@ QJsonObject Event::buildHiddenItemEventJSON() hiddenItemObj["elevation"] = this->getInt("elevation"); hiddenItemObj["item"] = this->get("item"); hiddenItemObj["flag"] = this->get("flag"); + if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + hiddenItemObj["quantity"] = this->getInt("quantity"); + hiddenItemObj["underfoot"] = this->getInt("underfoot") > 0 || this->get("underfoot") == "TRUE"; + } this->addCustomValuesTo(&hiddenItemObj); return hiddenItemObj; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 4fe9f98b..15f74808 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1407,8 +1407,8 @@ void MainWindow::updateSelectedObjects() { field_labels["script_var_value"] = "Var Value"; field_labels["player_facing_direction"] = "Player Facing Direction"; field_labels["item"] = "Item"; - field_labels["item_unknown5"] = "Unknown 5"; - field_labels["item_unknown6"] = "Unknown 6"; + field_labels["quantity"] = "Quantity"; + field_labels["underfoot"] = "Requires Itemfinder"; field_labels["weather"] = "Weather"; field_labels["flag"] = "Flag"; field_labels["secret_base_id"] = "Secret Base Id"; @@ -1459,6 +1459,10 @@ void MainWindow::updateSelectedObjects() { else if (event_type == EventType::HiddenItem) { fields << "item"; fields << "flag"; + if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + fields << "quantity"; + fields << "underfoot"; + } } else if (event_type == EventType::SecretBase) { fields << "secret_base_id"; @@ -1476,8 +1480,19 @@ void MainWindow::updateSelectedObjects() { fl->setContentsMargins(9, 0, 9, 0); fl->setRowWrapPolicy(QFormLayout::WrapLongRows); - NoScrollComboBox *combo = new NoScrollComboBox(widget); - combo->setEditable(true); + NoScrollSpinBox *spin; + NoScrollComboBox *combo; + QCheckBox *check; + + // Some keys shouldn't use a combobox. This isn't very scalable + if (key == "quantity") { + spin = new NoScrollSpinBox(widget); + } else if (key == "underfoot") { + check = new QCheckBox(widget); + } else { + combo = new NoScrollComboBox(widget); + combo->setEditable(true); + } // trainer_type has custom values, so it has special signal logic. if (key == "trainer_type") { @@ -1515,6 +1530,25 @@ void MainWindow::updateSelectedObjects() { combo->addItem(value); } combo->addItems(*editor->project->itemNames); + } else if (key == "quantity") { + spin->setToolTip("The number of items received when the hidden item is picked up."); + spin->setMaximum(127); + connect(spin, QOverload::of(&NoScrollSpinBox::valueChanged), [item, key](int value) { + item->event->put(key, value); + }); + } else if (key == "underfoot") { + check->setToolTip("If checked, hidden item can only be picked up using the Itemfinder"); + connect(check, &QCheckBox::stateChanged, [item, key](int state) { + switch (state) + { + case Qt::Checked: + item->event->put(key, true); + break; + case Qt::Unchecked: + item->event->put(key, false); + break; + } + }); } else if (key == "flag" || key == "event_flag") { if (!editor->project->flagNames->contains(value)) { combo->addItem(value); @@ -1585,13 +1619,28 @@ void MainWindow::updateSelectedObjects() { } else { combo->addItem(value); } - combo->setCurrentText(value); - fl->addRow(new QLabel(field_labels[key], widget), combo); - widget->setLayout(fl); - frame->layout()->addWidget(widget); + if (key == "quantity") { + spin->setValue(value.toInt()); - item->bind(combo, key); + fl->addRow(new QLabel(field_labels[key], widget), spin); + widget->setLayout(fl); + frame->layout()->addWidget(widget); + } else if (key == "underfoot") { + check->setChecked(value.toInt()); + + fl->addRow(new QLabel(field_labels[key], widget), check); + widget->setLayout(fl); + frame->layout()->addWidget(widget); + } else { + combo->setCurrentText(value); + + fl->addRow(new QLabel(field_labels[key], widget), combo); + widget->setLayout(fl); + frame->layout()->addWidget(widget); + + item->bind(combo, key); + } } // Custom fields table. diff --git a/src/project.cpp b/src/project.cpp index 83de74f1..3906f0a6 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -325,6 +325,10 @@ bool Project::loadMapData(Map* map) { bg->put("elevation", QString::number(event["elevation"].toInt())); bg->put("item", event["item"].toString()); bg->put("flag", event["flag"].toString()); + if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + bg->put("quantity", event["quantity"].toInt()); + bg->put("underfoot", event["underfoot"].toBool()); + } bg->put("event_group_type", "bg_event_group"); map->events["bg_event_group"].append(bg); } else if (type == "secret_base") {