Add underfoot and quantity to hidden items

This commit is contained in:
GriffinR 2020-03-11 16:23:07 -04:00
parent eb44201f5b
commit 7125cd7c8d
3 changed files with 92 additions and 17 deletions

View file

@ -1,6 +1,7 @@
#include "event.h" #include "event.h"
#include "map.h" #include "map.h"
#include "project.h" #include "project.h"
#include "config.h"
QString EventType::Object = "event_object"; QString EventType::Object = "event_object";
QString EventType::Warp = "event_warp"; QString EventType::Warp = "event_warp";
@ -131,6 +132,10 @@ Event* Event::createNewHiddenItemEvent(Project *project)
event->put("item", project->itemNames->first()); event->put("item", project->itemNames->first());
event->put("flag", project->flagNames->first()); event->put("flag", project->flagNames->first());
event->put("elevation", 3); event->put("elevation", 3);
if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) {
event->put("quantity", 1);
event->put("underfoot", false);
}
return event; return event;
} }
@ -207,14 +212,27 @@ QMap<QString, bool> Event::getExpectedFields()
{"script", true}, {"script", true},
}; };
} else if (type == EventType::HiddenItem) { } else if (type == EventType::HiddenItem) {
return QMap<QString, bool> { if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) {
{"type", true}, return QMap<QString, bool> {
{"x", true}, {"type", true},
{"y", true}, {"x", true},
{"elevation", true}, {"y", true},
{"item", true}, {"elevation", true},
{"flag", true}, {"item", true},
}; {"flag", true},
{"quantity", true},
{"underfoot", true},
};
} else {
return QMap<QString, bool> {
{"type", true},
{"x", true},
{"y", true},
{"elevation", true},
{"item", true},
{"flag", true},
};
}
} else if (type == EventType::SecretBase) { } else if (type == EventType::SecretBase) {
return QMap<QString, bool> { return QMap<QString, bool> {
{"type", true}, {"type", true},
@ -331,6 +349,10 @@ QJsonObject Event::buildHiddenItemEventJSON()
hiddenItemObj["elevation"] = this->getInt("elevation"); hiddenItemObj["elevation"] = this->getInt("elevation");
hiddenItemObj["item"] = this->get("item"); hiddenItemObj["item"] = this->get("item");
hiddenItemObj["flag"] = this->get("flag"); 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); this->addCustomValuesTo(&hiddenItemObj);
return hiddenItemObj; return hiddenItemObj;

View file

@ -1407,8 +1407,8 @@ void MainWindow::updateSelectedObjects() {
field_labels["script_var_value"] = "Var Value"; field_labels["script_var_value"] = "Var Value";
field_labels["player_facing_direction"] = "Player Facing Direction"; field_labels["player_facing_direction"] = "Player Facing Direction";
field_labels["item"] = "Item"; field_labels["item"] = "Item";
field_labels["item_unknown5"] = "Unknown 5"; field_labels["quantity"] = "Quantity";
field_labels["item_unknown6"] = "Unknown 6"; field_labels["underfoot"] = "Requires Itemfinder";
field_labels["weather"] = "Weather"; field_labels["weather"] = "Weather";
field_labels["flag"] = "Flag"; field_labels["flag"] = "Flag";
field_labels["secret_base_id"] = "Secret Base Id"; field_labels["secret_base_id"] = "Secret Base Id";
@ -1459,6 +1459,10 @@ void MainWindow::updateSelectedObjects() {
else if (event_type == EventType::HiddenItem) { else if (event_type == EventType::HiddenItem) {
fields << "item"; fields << "item";
fields << "flag"; fields << "flag";
if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) {
fields << "quantity";
fields << "underfoot";
}
} }
else if (event_type == EventType::SecretBase) { else if (event_type == EventType::SecretBase) {
fields << "secret_base_id"; fields << "secret_base_id";
@ -1476,8 +1480,19 @@ void MainWindow::updateSelectedObjects() {
fl->setContentsMargins(9, 0, 9, 0); fl->setContentsMargins(9, 0, 9, 0);
fl->setRowWrapPolicy(QFormLayout::WrapLongRows); fl->setRowWrapPolicy(QFormLayout::WrapLongRows);
NoScrollComboBox *combo = new NoScrollComboBox(widget); NoScrollSpinBox *spin;
combo->setEditable(true); 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. // trainer_type has custom values, so it has special signal logic.
if (key == "trainer_type") { if (key == "trainer_type") {
@ -1515,6 +1530,25 @@ void MainWindow::updateSelectedObjects() {
combo->addItem(value); combo->addItem(value);
} }
combo->addItems(*editor->project->itemNames); 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<int>::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") { } else if (key == "flag" || key == "event_flag") {
if (!editor->project->flagNames->contains(value)) { if (!editor->project->flagNames->contains(value)) {
combo->addItem(value); combo->addItem(value);
@ -1585,13 +1619,28 @@ void MainWindow::updateSelectedObjects() {
} else { } else {
combo->addItem(value); combo->addItem(value);
} }
combo->setCurrentText(value);
fl->addRow(new QLabel(field_labels[key], widget), combo); if (key == "quantity") {
widget->setLayout(fl); spin->setValue(value.toInt());
frame->layout()->addWidget(widget);
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. // Custom fields table.

View file

@ -325,6 +325,10 @@ bool Project::loadMapData(Map* map) {
bg->put("elevation", QString::number(event["elevation"].toInt())); bg->put("elevation", QString::number(event["elevation"].toInt()));
bg->put("item", event["item"].toString()); bg->put("item", event["item"].toString());
bg->put("flag", event["flag"].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"); bg->put("event_group_type", "bg_event_group");
map->events["bg_event_group"].append(bg); map->events["bg_event_group"].append(bg);
} else if (type == "secret_base") { } else if (type == "secret_base") {