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 "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<QString, bool> Event::getExpectedFields()
{"script", true},
};
} else if (type == EventType::HiddenItem) {
return QMap<QString, bool> {
{"type", true},
{"x", true},
{"y", true},
{"elevation", true},
{"item", true},
{"flag", true},
};
if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) {
return QMap<QString, bool> {
{"type", true},
{"x", true},
{"y", true},
{"elevation", 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) {
return QMap<QString, bool> {
{"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;

View file

@ -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<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") {
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.

View file

@ -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") {