Stop repeated parsing of src/data/object_events
This commit is contained in:
parent
366fb5c8a8
commit
ddc0f01460
9 changed files with 95 additions and 90 deletions
|
@ -83,7 +83,7 @@ public:
|
||||||
OrderedJson::object buildSignEventJSON();
|
OrderedJson::object buildSignEventJSON();
|
||||||
OrderedJson::object buildHiddenItemEventJSON();
|
OrderedJson::object buildHiddenItemEventJSON();
|
||||||
OrderedJson::object buildSecretBaseEventJSON();
|
OrderedJson::object buildSecretBaseEventJSON();
|
||||||
void setPixmapFromSpritesheet(QImage, int, int, int, bool);
|
void setPixmapFromSpritesheet(QImage, int, int, bool);
|
||||||
int getPixelX();
|
int getPixelX();
|
||||||
int getPixelY();
|
int getPixelY();
|
||||||
QMap<QString, bool> getExpectedFields();
|
QMap<QString, bool> getExpectedFields();
|
||||||
|
@ -99,7 +99,6 @@ public:
|
||||||
int frame = 0;
|
int frame = 0;
|
||||||
bool hFlip = false;
|
bool hFlip = false;
|
||||||
bool usingSprite;
|
bool usingSprite;
|
||||||
bool inanimate;
|
|
||||||
|
|
||||||
DraggablePixmapItem *pixmapItem = nullptr;
|
DraggablePixmapItem *pixmapItem = nullptr;
|
||||||
void setPixmapItem(DraggablePixmapItem *item) { pixmapItem = item; }
|
void setPixmapItem(DraggablePixmapItem *item) { pixmapItem = item; }
|
||||||
|
|
|
@ -18,6 +18,14 @@
|
||||||
#include <QVariant>
|
#include <QVariant>
|
||||||
#include <QFileSystemWatcher>
|
#include <QFileSystemWatcher>
|
||||||
|
|
||||||
|
struct EventGraphics
|
||||||
|
{
|
||||||
|
QImage spritesheet;
|
||||||
|
int spriteWidth;
|
||||||
|
int spriteHeight;
|
||||||
|
bool inanimate;
|
||||||
|
};
|
||||||
|
|
||||||
static QString NONE_MAP_CONSTANT = "MAP_NONE";
|
static QString NONE_MAP_CONSTANT = "MAP_NONE";
|
||||||
static QString NONE_MAP_NAME = "None";
|
static QString NONE_MAP_NAME = "None";
|
||||||
|
|
||||||
|
@ -51,6 +59,7 @@ public:
|
||||||
QMap<QString, QString> mapSecToMapHoverName;
|
QMap<QString, QString> mapSecToMapHoverName;
|
||||||
QMap<QString, int> mapSectionNameToValue;
|
QMap<QString, int> mapSectionNameToValue;
|
||||||
QMap<int, QString> mapSectionValueToName;
|
QMap<int, QString> mapSectionValueToName;
|
||||||
|
QMap<QString, EventGraphics*> eventGraphicsMap;
|
||||||
QStringList gfxNames;
|
QStringList gfxNames;
|
||||||
QStringList songNames;
|
QStringList songNames;
|
||||||
QStringList itemNames;
|
QStringList itemNames;
|
||||||
|
@ -176,8 +185,10 @@ public:
|
||||||
bool readEventScriptLabels();
|
bool readEventScriptLabels();
|
||||||
bool readObjEventGfxConstants();
|
bool readObjEventGfxConstants();
|
||||||
bool readSongNames();
|
bool readSongNames();
|
||||||
|
bool readEventGraphics();
|
||||||
|
|
||||||
|
void setEventPixmap(Event * event, bool forceLoad = false);
|
||||||
|
|
||||||
void loadEventPixmaps(QList<Event*> objects);
|
|
||||||
QString fixPalettePath(QString path);
|
QString fixPalettePath(QString path);
|
||||||
QString fixGraphicPath(QString path);
|
QString fixGraphicPath(QString path);
|
||||||
|
|
||||||
|
|
|
@ -322,7 +322,7 @@ void EventCreate::redo() {
|
||||||
|
|
||||||
map->addEvent(event);
|
map->addEvent(event);
|
||||||
|
|
||||||
editor->project->loadEventPixmaps(map->getAllEvents());
|
editor->project->setEventPixmap(event);
|
||||||
editor->addMapEvent(event);
|
editor->addMapEvent(event);
|
||||||
|
|
||||||
// select this event
|
// select this event
|
||||||
|
@ -388,8 +388,7 @@ void EventDelete::redo() {
|
||||||
void EventDelete::undo() {
|
void EventDelete::undo() {
|
||||||
for (Event *event : selectedEvents) {
|
for (Event *event : selectedEvents) {
|
||||||
map->addEvent(event);
|
map->addEvent(event);
|
||||||
|
editor->project->setEventPixmap(event);
|
||||||
editor->project->loadEventPixmaps(map->getAllEvents());
|
|
||||||
editor->addMapEvent(event);
|
editor->addMapEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -431,11 +430,7 @@ void EventDuplicate::redo() {
|
||||||
|
|
||||||
for (Event *event : selectedEvents) {
|
for (Event *event : selectedEvents) {
|
||||||
map->addEvent(event);
|
map->addEvent(event);
|
||||||
}
|
editor->project->setEventPixmap(event);
|
||||||
|
|
||||||
editor->project->loadEventPixmaps(map->getAllEvents());
|
|
||||||
|
|
||||||
for (Event *event : selectedEvents) {
|
|
||||||
editor->addMapEvent(event);
|
editor->addMapEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,8 +26,7 @@ Event::Event(const Event& toCopy) :
|
||||||
spriteHeight(toCopy.spriteHeight),
|
spriteHeight(toCopy.spriteHeight),
|
||||||
frame(toCopy.frame),
|
frame(toCopy.frame),
|
||||||
hFlip(toCopy.hFlip),
|
hFlip(toCopy.hFlip),
|
||||||
usingSprite(toCopy.usingSprite),
|
usingSprite(toCopy.usingSprite)
|
||||||
inanimate(toCopy.inanimate)
|
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
Event::Event(QJsonObject obj, QString type) : Event()
|
Event::Event(QJsonObject obj, QString type) : Event()
|
||||||
|
@ -410,13 +409,14 @@ OrderedJson::object Event::buildSecretBaseEventJSON()
|
||||||
return secretBaseObj;
|
return secretBaseObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Event::setPixmapFromSpritesheet(QImage spritesheet, int spriteWidth, int spriteHeight, int frame, bool hFlip)
|
void Event::setPixmapFromSpritesheet(QImage spritesheet, int spriteWidth, int spriteHeight, bool inanimate)
|
||||||
{
|
{
|
||||||
// Set first palette color fully transparent.
|
int frame = inanimate ? 0 : this->frame;
|
||||||
QImage img = spritesheet.copy(frame * spriteWidth % spritesheet.width(), 0, spriteWidth, spriteHeight);
|
QImage img = spritesheet.copy(frame * spriteWidth % spritesheet.width(), 0, spriteWidth, spriteHeight);
|
||||||
if (hFlip) {
|
if (this->hFlip && !inanimate) {
|
||||||
img = img.transformed(QTransform().scale(-1, 1));
|
img = img.transformed(QTransform().scale(-1, 1));
|
||||||
}
|
}
|
||||||
|
// Set first palette color fully transparent.
|
||||||
img.setColor(0, qRgba(0, 0, 0, 0));
|
img.setColor(0, qRgba(0, 0, 0, 0));
|
||||||
pixmap = QPixmap::fromImage(img);
|
pixmap = QPixmap::fromImage(img);
|
||||||
this->spriteWidth = spriteWidth;
|
this->spriteWidth = spriteWidth;
|
||||||
|
@ -428,8 +428,6 @@ void Event::setFrameFromMovement(QString facingDir) {
|
||||||
// defaults
|
// defaults
|
||||||
this->frame = 0;
|
this->frame = 0;
|
||||||
this->hFlip = false;
|
this->hFlip = false;
|
||||||
if (this->inanimate)
|
|
||||||
return;
|
|
||||||
if (facingDir == "DIR_NORTH") {
|
if (facingDir == "DIR_NORTH") {
|
||||||
this->frame = 1;
|
this->frame = 1;
|
||||||
this->hFlip = false;
|
this->hFlip = false;
|
||||||
|
|
|
@ -1498,10 +1498,7 @@ void Editor::displayMapEvents() {
|
||||||
|
|
||||||
QList<Event *> events = map->getAllEvents();
|
QList<Event *> events = map->getAllEvents();
|
||||||
for (Event *event : events) {
|
for (Event *event : events) {
|
||||||
event->setFrameFromMovement(project->facingDirections.value(event->get("movement_type")));
|
project->setEventPixmap(event);
|
||||||
}
|
|
||||||
project->loadEventPixmaps(events);
|
|
||||||
for (Event *event : events) {
|
|
||||||
addMapEvent(event);
|
addMapEvent(event);
|
||||||
}
|
}
|
||||||
//objects_group->setFiltersChildEvents(false);
|
//objects_group->setFiltersChildEvents(false);
|
||||||
|
@ -1971,7 +1968,7 @@ QList<DraggablePixmapItem *> Editor::getObjects() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::redrawObject(DraggablePixmapItem *item) {
|
void Editor::redrawObject(DraggablePixmapItem *item) {
|
||||||
if (item) {
|
if (item && item->event && !item->event->pixmap.isNull()) {
|
||||||
qreal opacity = item->event->usingSprite ? 1.0 : 0.7;
|
qreal opacity = item->event->usingSprite ? 1.0 : 0.7;
|
||||||
item->setOpacity(opacity);
|
item->setOpacity(opacity);
|
||||||
item->setPixmap(item->event->pixmap.copy(item->event->frame * item->event->spriteWidth % item->event->pixmap.width(), 0, item->event->spriteWidth, item->event->spriteHeight));
|
item->setPixmap(item->event->pixmap.copy(item->event->frame * item->event->spriteWidth % item->event->pixmap.width(), 0, item->event->spriteWidth, item->event->spriteHeight));
|
||||||
|
|
|
@ -943,6 +943,7 @@ bool MainWindow::loadDataStructures() {
|
||||||
&& project->readWildMonData()
|
&& project->readWildMonData()
|
||||||
&& project->readEventScriptLabels()
|
&& project->readEventScriptLabels()
|
||||||
&& project->readObjEventGfxConstants()
|
&& project->readObjEventGfxConstants()
|
||||||
|
&& project->readEventGraphics()
|
||||||
&& project->readSongNames();
|
&& project->readSongNames();
|
||||||
|
|
||||||
return success && loadProjectCombos();
|
return success && loadProjectCombos();
|
||||||
|
@ -2171,8 +2172,8 @@ void MainWindow::updateSelectedObjects() {
|
||||||
combo->addItem(value);
|
combo->addItem(value);
|
||||||
}
|
}
|
||||||
connect(combo, static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentTextChanged),
|
connect(combo, static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentTextChanged),
|
||||||
this, [this, item](QString value){
|
this, [item](QString value){
|
||||||
item->event->setFrameFromMovement(editor->project->facingDirections.value(value));
|
item->event->put("movement_type", value);
|
||||||
item->updatePixmap();
|
item->updatePixmap();
|
||||||
});
|
});
|
||||||
combo->addItems(editor->project->movementTypes);
|
combo->addItems(editor->project->movementTypes);
|
||||||
|
|
|
@ -2418,18 +2418,38 @@ QCompleter *Project::getEventScriptLabelCompleter(QStringList additionalScriptLa
|
||||||
return &eventScriptLabelCompleter;
|
return &eventScriptLabelCompleter;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Project::loadEventPixmaps(QList<Event*> objects) {
|
void Project::setEventPixmap(Event * event, bool forceLoad) {
|
||||||
bool needs_update = false;
|
if (!event || (!event->pixmap.isNull() && !forceLoad))
|
||||||
for (Event *object : objects) {
|
|
||||||
if (object->pixmap.isNull()) {
|
|
||||||
needs_update = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!needs_update) {
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
|
event->spriteWidth = 16;
|
||||||
|
event->spriteHeight = 16;
|
||||||
|
event->usingSprite = false;
|
||||||
|
|
||||||
|
QString event_type = event->get("event_type");
|
||||||
|
if (event_type == EventType::Object) {
|
||||||
|
QString gfxName = event->get("sprite");
|
||||||
|
EventGraphics * eventGfx = eventGraphicsMap.value(gfxName, nullptr);
|
||||||
|
if (!eventGfx || eventGfx->spritesheet.isNull()) {
|
||||||
|
// No sprite associated with this gfx constant.
|
||||||
|
// Use default sprite instead.
|
||||||
|
event->pixmap = QPixmap(":/images/Entities_16x16.png").copy(0, 0, 16, 16);
|
||||||
|
} else {
|
||||||
|
event->setFrameFromMovement(facingDirections.value(event->get("movement_type")));
|
||||||
|
event->setPixmapFromSpritesheet(eventGfx->spritesheet, eventGfx->spriteWidth, eventGfx->spriteHeight, eventGfx->inanimate);
|
||||||
|
}
|
||||||
|
} else if (event_type == EventType::Warp) {
|
||||||
|
event->pixmap = QPixmap(":/images/Entities_16x16.png").copy(16, 0, 16, 16);
|
||||||
|
} else if (event_type == EventType::Trigger || event_type == EventType::WeatherTrigger) {
|
||||||
|
event->pixmap = QPixmap(":/images/Entities_16x16.png").copy(32, 0, 16, 16);
|
||||||
|
} else if (event_type == EventType::Sign || event_type == EventType::HiddenItem || event_type == EventType::SecretBase) {
|
||||||
|
event->pixmap = QPixmap(":/images/Entities_16x16.png").copy(48, 0, 16, 16);
|
||||||
|
} else if (event_type == EventType::HealLocation) {
|
||||||
|
event->pixmap = QPixmap(":/images/Entities_16x16.png").copy(64, 0, 16, 16);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Project::readEventGraphics() {
|
||||||
fileWatcher.addPaths(QStringList() << root + "/" + "src/data/object_events/object_event_graphics_info_pointers.h"
|
fileWatcher.addPaths(QStringList() << root + "/" + "src/data/object_events/object_event_graphics_info_pointers.h"
|
||||||
<< root + "/" + "src/data/object_events/object_event_graphics_info.h"
|
<< root + "/" + "src/data/object_events/object_event_graphics_info.h"
|
||||||
<< root + "/" + "src/data/object_events/object_event_pic_tables.h"
|
<< root + "/" + "src/data/object_events/object_event_pic_tables.h"
|
||||||
|
@ -2437,63 +2457,50 @@ void Project::loadEventPixmaps(QList<Event*> objects) {
|
||||||
|
|
||||||
QMap<QString, QString> pointerHash = parser.readNamedIndexCArray("src/data/object_events/object_event_graphics_info_pointers.h", "gObjectEventGraphicsInfoPointers");
|
QMap<QString, QString> pointerHash = parser.readNamedIndexCArray("src/data/object_events/object_event_graphics_info_pointers.h", "gObjectEventGraphicsInfoPointers");
|
||||||
|
|
||||||
for (Event *object : objects) {
|
qDeleteAll(eventGraphicsMap);
|
||||||
if (!object->pixmap.isNull()) {
|
eventGraphicsMap.clear();
|
||||||
continue;
|
for (QString gfxName : this->gfxNames) {
|
||||||
}
|
EventGraphics * eventGraphics = new EventGraphics;
|
||||||
|
|
||||||
object->spriteWidth = 16;
|
QString info_label = pointerHash[gfxName].replace("&", "");
|
||||||
object->spriteHeight = 16;
|
|
||||||
object->usingSprite = false;
|
|
||||||
object->inanimate = true;
|
|
||||||
QString event_type = object->get("event_type");
|
|
||||||
if (event_type == EventType::Object) {
|
|
||||||
object->pixmap = QPixmap(":/images/Entities_16x16.png").copy(0, 0, 16, 16);
|
|
||||||
} else if (event_type == EventType::Warp) {
|
|
||||||
object->pixmap = QPixmap(":/images/Entities_16x16.png").copy(16, 0, 16, 16);
|
|
||||||
} else if (event_type == EventType::Trigger || event_type == EventType::WeatherTrigger) {
|
|
||||||
object->pixmap = QPixmap(":/images/Entities_16x16.png").copy(32, 0, 16, 16);
|
|
||||||
} else if (event_type == EventType::Sign || event_type == EventType::HiddenItem || event_type == EventType::SecretBase) {
|
|
||||||
object->pixmap = QPixmap(":/images/Entities_16x16.png").copy(48, 0, 16, 16);
|
|
||||||
} else if (event_type == EventType::HealLocation) {
|
|
||||||
object->pixmap = QPixmap(":/images/Entities_16x16.png").copy(64, 0, 16, 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event_type == EventType::Object) {
|
|
||||||
QString info_label = pointerHash[object->get("sprite")].replace("&", "");
|
|
||||||
QStringList gfx_info = parser.readCArray("src/data/object_events/object_event_graphics_info.h", info_label);
|
QStringList gfx_info = parser.readCArray("src/data/object_events/object_event_graphics_info.h", info_label);
|
||||||
object->inanimate = (gfx_info.value(8) == "TRUE");
|
|
||||||
|
eventGraphics->inanimate = (gfx_info.value(8) == "TRUE");
|
||||||
QString pic_label = gfx_info.value(14);
|
QString pic_label = gfx_info.value(14);
|
||||||
QString dimensions_label = gfx_info.value(11);
|
QString dimensions_label = gfx_info.value(11);
|
||||||
QString subsprites_label = gfx_info.value(12);
|
QString subsprites_label = gfx_info.value(12);
|
||||||
|
|
||||||
QString gfx_label = parser.readCArray("src/data/object_events/object_event_pic_tables.h", pic_label).value(0);
|
QString gfx_label = parser.readCArray("src/data/object_events/object_event_pic_tables.h", pic_label).value(0);
|
||||||
gfx_label = gfx_label.section(QRegularExpression("[\\(\\)]"), 1, 1);
|
gfx_label = gfx_label.section(QRegularExpression("[\\(\\)]"), 1, 1);
|
||||||
QString path = parser.readCIncbin("src/data/object_events/object_event_graphics.h", gfx_label);
|
QString path = parser.readCIncbin("src/data/object_events/object_event_graphics.h", gfx_label);
|
||||||
|
|
||||||
if (!path.isNull()) {
|
if (!path.isNull()) {
|
||||||
path = fixGraphicPath(path);
|
path = fixGraphicPath(path);
|
||||||
QImage spritesheet(root + "/" + path);
|
eventGraphics->spritesheet = QImage(root + "/" + path);
|
||||||
if (!spritesheet.isNull()) {
|
if (!eventGraphics->spritesheet.isNull()) {
|
||||||
// Infer the sprite dimensions from the OAM labels.
|
// Infer the sprite dimensions from the OAM labels.
|
||||||
int spriteWidth, spriteHeight;
|
|
||||||
QRegularExpression re("\\S+_(\\d+)x(\\d+)");
|
QRegularExpression re("\\S+_(\\d+)x(\\d+)");
|
||||||
QRegularExpressionMatch dimensionMatch = re.match(dimensions_label);
|
QRegularExpressionMatch dimensionMatch = re.match(dimensions_label);
|
||||||
QRegularExpressionMatch oamTablesMatch = re.match(subsprites_label);
|
QRegularExpressionMatch oamTablesMatch = re.match(subsprites_label);
|
||||||
if (oamTablesMatch.hasMatch()) {
|
if (oamTablesMatch.hasMatch()) {
|
||||||
spriteWidth = oamTablesMatch.captured(1).toInt();
|
eventGraphics->spriteWidth = oamTablesMatch.captured(1).toInt();
|
||||||
spriteHeight = oamTablesMatch.captured(2).toInt();
|
eventGraphics->spriteHeight = oamTablesMatch.captured(2).toInt();
|
||||||
} else if (dimensionMatch.hasMatch()) {
|
} else if (dimensionMatch.hasMatch()) {
|
||||||
spriteWidth = dimensionMatch.captured(1).toInt();
|
eventGraphics->spriteWidth = dimensionMatch.captured(1).toInt();
|
||||||
spriteHeight = dimensionMatch.captured(2).toInt();
|
eventGraphics->spriteHeight = dimensionMatch.captured(2).toInt();
|
||||||
} else {
|
} else {
|
||||||
spriteWidth = spritesheet.width();
|
eventGraphics->spriteWidth = eventGraphics->spritesheet.width();
|
||||||
spriteHeight = spritesheet.height();
|
eventGraphics->spriteHeight = eventGraphics->spritesheet.height();
|
||||||
}
|
|
||||||
object->setPixmapFromSpritesheet(spritesheet, spriteWidth, spriteHeight, object->frame, object->hFlip);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
eventGraphics->spritesheet = QImage();
|
||||||
|
eventGraphics->spriteWidth = 16;
|
||||||
|
eventGraphics->spriteHeight = 16;
|
||||||
}
|
}
|
||||||
|
eventGraphicsMap.insert(gfxName, eventGraphics);
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Project::readSpeciesIconPaths() {
|
bool Project::readSpeciesIconPaths() {
|
||||||
|
|
|
@ -26,10 +26,7 @@ void DraggablePixmapItem::emitPositionChanged() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DraggablePixmapItem::updatePixmap() {
|
void DraggablePixmapItem::updatePixmap() {
|
||||||
QList<Event*> objects;
|
editor->project->setEventPixmap(event, true);
|
||||||
objects.append(event);
|
|
||||||
event->pixmap = QPixmap();
|
|
||||||
editor->project->loadEventPixmaps(objects);
|
|
||||||
this->updatePosition();
|
this->updatePosition();
|
||||||
editor->redrawObject(this);
|
editor->redrawObject(this);
|
||||||
emit spriteChanged(event->pixmap);
|
emit spriteChanged(event->pixmap);
|
||||||
|
|
|
@ -368,8 +368,8 @@ QPixmap MapImageExporter::getFormattedMapPixmap(Map *map, bool ignoreBorder) {
|
||||||
// draw events
|
// draw events
|
||||||
QPainter eventPainter(&pixmap);
|
QPainter eventPainter(&pixmap);
|
||||||
QList<Event*> events = map->getAllEvents();
|
QList<Event*> events = map->getAllEvents();
|
||||||
editor->project->loadEventPixmaps(events);
|
|
||||||
for (Event *event : events) {
|
for (Event *event : events) {
|
||||||
|
editor->project->setEventPixmap(event);
|
||||||
QString group = event->get("event_group_type");
|
QString group = event->get("event_group_type");
|
||||||
if ((showObjects && group == "object_event_group")
|
if ((showObjects && group == "object_event_group")
|
||||||
|| (showWarps && group == "warp_event_group")
|
|| (showWarps && group == "warp_event_group")
|
||||||
|
|
Loading…
Reference in a new issue