From 67f7fca399b5ba8f57b4e03afd1353b91ceb6d54 Mon Sep 17 00:00:00 2001 From: garak Date: Tue, 11 Sep 2018 20:37:36 -0400 Subject: [PATCH] add HealLocation fly spots --- editor.h | 1 + event.cpp | 28 +++++++ event.h | 4 + heallocation.cpp | 19 +++++ heallocation.h | 23 ++++++ mainwindow.cpp | 13 +++- map.h | 1 + neweventtoolbutton.cpp | 13 ++++ neweventtoolbutton.h | 2 + parseutil.cpp | 18 +++++ parseutil.h | 3 + pretmap.pro | 106 ++++++++++++------------- project.cpp | 117 ++++++++++++++++++++++++++++ project.h | 3 + resources/images/Entities_16x16.png | Bin 274 -> 490 bytes 15 files changed, 295 insertions(+), 56 deletions(-) create mode 100644 heallocation.cpp create mode 100644 heallocation.h diff --git a/editor.h b/editor.h index 863b096f..29b832dc 100755 --- a/editor.h +++ b/editor.h @@ -130,6 +130,7 @@ private: void updateMirroredConnection(Connection*, QString, QString, bool isDelete = false); Event* createNewObjectEvent(); Event* createNewWarpEvent(); + Event* createNewHealLocationEvent(); Event* createNewCoordScriptEvent(); Event* createNewCoordWeatherEvent(); Event* createNewSignEvent(); diff --git a/event.cpp b/event.cpp index e26b4540..c92b9a26 100755 --- a/event.cpp +++ b/event.cpp @@ -1,4 +1,5 @@ #include "event.h" +#include "map.h" QString EventType::Object = "event_object"; QString EventType::Warp = "event_warp"; @@ -7,6 +8,7 @@ QString EventType::CoordWeather = "event_trap_weather"; QString EventType::Sign = "event_sign"; QString EventType::HiddenItem = "event_hidden_item"; QString EventType::SecretBase = "event_secret_base"; +QString EventType::HealLocation = "event_heal_location"; Event::Event() { @@ -19,6 +21,8 @@ Event* Event::createNewEvent(QString event_type, QString map_name) event = createNewObjectEvent(); } else if (event_type == EventType::Warp) { event = createNewWarpEvent(map_name); + } else if (event_type == EventType::HealLocation) { + event = createNewHealLocationEvent(map_name); } else if (event_type == EventType::CoordScript) { event = createNewCoordScriptEvent(); } else if (event_type == EventType::CoordWeather) { @@ -64,6 +68,15 @@ Event* Event::createNewWarpEvent(QString map_name) return event; } +Event* Event::createNewHealLocationEvent(QString map_name) +{ + Event *event = new Event; + event->put("event_group_type", "heal_event_group"); + event->put("event_type", EventType::HealLocation); + event->put("loc_name", QString(Map::mapConstantFromName(map_name)).remove(0,4)); + return event; +} + Event* Event::createNewCoordScriptEvent() { Event *event = new Event; @@ -150,6 +163,21 @@ QString Event::buildWarpEventMacro(QMap *mapNamesToMapConstant return text; } +HealLocation Event::buildHealLocation() +{ + HealLocation hl; + hl.name = this->get("loc_name"); + try { + hl.index = this->get("index").toInt(); + } + catch(...) { + hl.index = 0; + } + hl.x = this->get("x").toInt(); + hl.y = this->get("y").toInt(); + return hl; +} + QString Event::buildCoordScriptEventMacro() { QString text = ""; diff --git a/event.h b/event.h index 03313d27..13aa114a 100755 --- a/event.h +++ b/event.h @@ -1,6 +1,7 @@ #ifndef EVENT_H #define EVENT_H +#include "heallocation.h" #include #include #include @@ -16,6 +17,7 @@ public: static QString Sign; static QString HiddenItem; static QString SecretBase; + static QString HealLocation; }; class Event @@ -54,6 +56,7 @@ public: static Event* createNewEvent(QString, QString); static Event* createNewObjectEvent(); static Event* createNewWarpEvent(QString); + static Event* createNewHealLocationEvent(QString); static Event* createNewCoordScriptEvent(); static Event* createNewCoordWeatherEvent(); static Event* createNewSignEvent(); @@ -62,6 +65,7 @@ public: QString buildObjectEventMacro(int); QString buildWarpEventMacro(QMap*); + HealLocation buildHealLocation(); QString buildCoordScriptEventMacro(); QString buildCoordWeatherEventMacro(); QString buildSignEventMacro(); diff --git a/heallocation.cpp b/heallocation.cpp new file mode 100644 index 00000000..7652b96a --- /dev/null +++ b/heallocation.cpp @@ -0,0 +1,19 @@ +#include "heallocation.h" + +//HealLocation::HealLocation() {} + +HealLocation::HealLocation(QString map, int i, size_t x0, size_t y0) { + + name = map; + index = i; + x = x0; + y = y0; + +} + +QDebug operator<<(QDebug debug, const HealLocation &hl) { + + debug << "HealLocation_" + hl.name << "(" << hl.x << ',' << hl.y << ")"; + return debug; + +} diff --git a/heallocation.h b/heallocation.h new file mode 100644 index 00000000..bf01b30a --- /dev/null +++ b/heallocation.h @@ -0,0 +1,23 @@ +#ifndef HEALLOCATION_H +#define HEALLOCATION_H + +#include +#include + +class HealLocation { + +public: + HealLocation()=default; + HealLocation(QString, int, size_t, size_t); + friend QDebug operator<<(QDebug debug, const HealLocation &hl); + +public: + //QString group; + QString name; + int index; + size_t x; + size_t y; + +}; + +#endif // HEALLOCATION_H diff --git a/mainwindow.cpp b/mainwindow.cpp index b9979dc3..06a86926 100755 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -862,11 +862,16 @@ void MainWindow::on_toolButton_deleteObject_clicked() if (editor && editor->selected_events) { if (editor->selected_events->length()) { for (DraggablePixmapItem *item : *editor->selected_events) { - editor->deleteEvent(item->event); - if (editor->scene->items().contains(item)) { - editor->scene->removeItem(item); + if (item->event->get("event_type") != EventType::HealLocation) { + editor->deleteEvent(item->event); + if (editor->scene->items().contains(item)) { + editor->scene->removeItem(item); + } + editor->selected_events->removeOne(item); + } + else { // don't allow deletion of heal locations + qDebug() << "Cannot delete event of type " << item->event->get("event_type"); } - editor->selected_events->removeOne(item); } updateSelectedObjects(); } diff --git a/map.h b/map.h index 82e70675..017c7b8b 100755 --- a/map.h +++ b/map.h @@ -128,6 +128,7 @@ public: QString layout_id; QString location; QString requiresFlash; + QString isFlyable; // TODO: implement this QString weather; QString type; QString unknown; diff --git a/neweventtoolbutton.cpp b/neweventtoolbutton.cpp index 51d4ee2b..cfd0adab 100644 --- a/neweventtoolbutton.cpp +++ b/neweventtoolbutton.cpp @@ -23,6 +23,12 @@ void NewEventToolButton::initButton() this->newWarpAction->setIcon(QIcon(":/icons/add.ico")); connect(this->newWarpAction, SIGNAL(triggered(bool)), this, SLOT(newWarp())); + /* // disable this functionality for now + this->newHealLocationAction = new QAction("New Heal Location", this); + this->newHealLocationAction->setIcon(QIcon(":/icons/add.ico")); + connect(this->newHealLocationAction, SIGNAL(triggered(bool)), this, SLOT(newHealLocation())); + */ + this->newCoordScriptAction = new QAction("New Coord Script", this); this->newCoordScriptAction->setIcon(QIcon(":/icons/add.ico")); connect(this->newCoordScriptAction, SIGNAL(triggered(bool)), this, SLOT(newCoordScript())); @@ -46,6 +52,7 @@ void NewEventToolButton::initButton() QMenu *alignMenu = new QMenu(); alignMenu->addAction(this->newObjectAction); alignMenu->addAction(this->newWarpAction); + //alignMenu->addAction(this->newHealLocationAction); alignMenu->addAction(this->newCoordScriptAction); alignMenu->addAction(this->newCoordWeatherAction); alignMenu->addAction(this->newSignAction); @@ -72,6 +79,12 @@ void NewEventToolButton::newWarp() emit newEventAdded(this->selectedEventType); } +void NewEventToolButton::newHealLocation() +{ + this->selectedEventType = EventType::HealLocation; + emit newEventAdded(this->selectedEventType); +} + void NewEventToolButton::newCoordScript() { this->selectedEventType = EventType::CoordScript; diff --git a/neweventtoolbutton.h b/neweventtoolbutton.h index f4bb7f55..d75be3b4 100644 --- a/neweventtoolbutton.h +++ b/neweventtoolbutton.h @@ -14,6 +14,7 @@ public: public slots: void newObject(); void newWarp(); + void newHealLocation(); void newCoordScript(); void newCoordWeather(); void newSign(); @@ -25,6 +26,7 @@ private: QString selectedEventType; QAction *newObjectAction; QAction *newWarpAction; + QAction *newHealLocationAction; QAction *newCoordScriptAction; QAction *newCoordWeatherAction; QAction *newSignAction; diff --git a/parseutil.cpp b/parseutil.cpp index 9b481159..15c24b16 100755 --- a/parseutil.cpp +++ b/parseutil.cpp @@ -68,6 +68,24 @@ int ParseUtil::evaluateDefine(QString define, QMap* knownDefines) return evaluatePostfix(postfixExpression); } +// arg here is the text in the file src/data/heal_locations.h +// returns a list of HealLocations (mapname, x, y) +QList* ParseUtil::parseHealLocs(QString text) { + QList *parsed = new QList; + QStringList lines = text.split('\n'); + + int i = 1; + for (auto line : lines){ + if (line.contains("MAP_GROUP")){ + QList li = line.replace(" ","").chopped(2).remove('{').split(','); + HealLocation hloc = HealLocation(li[1].remove("MAP_NUM(").remove(")"), i, li[2].toInt(), li[3].toInt()); + parsed->append(hloc); + i++; + } + } + return parsed; +} + QList ParseUtil::tokenizeExpression(QString expression, QMap* knownIdentifiers) { QList tokens; diff --git a/parseutil.h b/parseutil.h index dfd52c16..23e095fc 100755 --- a/parseutil.h +++ b/parseutil.h @@ -1,6 +1,8 @@ #ifndef PARSEUTIL_H #define PARSEUTIL_H +#include "heallocation.h" + #include #include #include @@ -35,6 +37,7 @@ public: void strip_comment(QString*); QList* parseAsm(QString); int evaluateDefine(QString, QMap*); + QList* parseHealLocs(QString); private: QList tokenizeExpression(QString expression, QMap* knownIdentifiers); QList generatePostfix(QList tokens); diff --git a/pretmap.pro b/pretmap.pro index 96014047..9d3ae04e 100755 --- a/pretmap.pro +++ b/pretmap.pro @@ -1,52 +1,54 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2016-08-31T15:19:13 -# -#------------------------------------------------- - -QT += core gui - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - -TARGET = pretmap -TEMPLATE = app - - -SOURCES += main.cpp\ - mainwindow.cpp \ - project.cpp \ - map.cpp \ - blockdata.cpp \ - block.cpp \ - tileset.cpp \ - tile.cpp \ - event.cpp \ - editor.cpp \ - objectpropertiesframe.cpp \ - graphicsview.cpp \ - parseutil.cpp \ - neweventtoolbutton.cpp \ - noscrollcombobox.cpp \ - noscrollspinbox.cpp - -HEADERS += mainwindow.h \ - project.h \ - map.h \ - blockdata.h \ - block.h \ - tileset.h \ - tile.h \ - event.h \ - editor.h \ - objectpropertiesframe.h \ - graphicsview.h \ - parseutil.h \ - neweventtoolbutton.h \ - noscrollcombobox.h \ - noscrollspinbox.h - -FORMS += mainwindow.ui \ - objectpropertiesframe.ui - -RESOURCES += \ - resources/images.qrc +#------------------------------------------------- +# +# Project created by QtCreator 2016-08-31T15:19:13 +# +#------------------------------------------------- + +QT += core gui + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +TARGET = pretmap +TEMPLATE = app + + +SOURCES += main.cpp\ + mainwindow.cpp \ + project.cpp \ + map.cpp \ + blockdata.cpp \ + block.cpp \ + tileset.cpp \ + tile.cpp \ + event.cpp \ + editor.cpp \ + objectpropertiesframe.cpp \ + graphicsview.cpp \ + parseutil.cpp \ + neweventtoolbutton.cpp \ + noscrollcombobox.cpp \ + noscrollspinbox.cpp \ + heallocation.cpp + +HEADERS += mainwindow.h \ + project.h \ + map.h \ + blockdata.h \ + block.h \ + tileset.h \ + tile.h \ + event.h \ + editor.h \ + objectpropertiesframe.h \ + graphicsview.h \ + parseutil.h \ + neweventtoolbutton.h \ + noscrollcombobox.h \ + noscrollspinbox.h \ + heallocation.h + +FORMS += mainwindow.ui \ + objectpropertiesframe.ui + +RESOURCES += \ + resources/images.qrc diff --git a/project.cpp b/project.cpp index fd352dfa..bdd4c8ec 100755 --- a/project.cpp +++ b/project.cpp @@ -501,6 +501,82 @@ void Project::saveMapConstantsHeader() { saveTextFile(root + "/include/constants/maps.h", text); } +// saves heal location coords in root + /src/data/heal_locations.h +// and indexes as defines in root + /include/constants/heal_locations.h +void Project::saveHealLocationStruct(Map *map) { + QString tab = QString(" "); + + QString data_text = QString("static const struct HealLocation sHealLocations[] =\n{\n"); + + QString constants_text = QString("#ifndef GUARD_CONSTANTS_HEAL_LOCATIONS_H\n"); + constants_text += QString("#define GUARD_CONSTANTS_HEAL_LOCATIONS_H\n\n"); + + QMap flyableMapsDupes; + QSet flyableMapsUnique; + + // erase old location from flyableMaps list + // set flyableMapsDupes and flyableMapsUnique + for (auto it = flyableMaps->begin(); it != flyableMaps->end(); it++) { + HealLocation loc = *it; + QString xname = loc.name; + if (flyableMapsUnique.contains(xname)) { + flyableMapsDupes[xname] = 1; + } + if (xname == QString(mapNamesToMapConstants->value(map->name)).remove(0,4)) { + it = flyableMaps->erase(it) - 1; + } + else { + flyableMapsUnique.insert(xname); + } + } + + // set new location in flyableMapsList + if (map->events["heal_event_group"].length() > 0) { + QList* flymaps = flyableMaps; + + for (Event *heal : map->events["heal_event_group"]) { + HealLocation hl = heal->buildHealLocation(); + flymaps->insert(hl.index - 1, hl); + } + flyableMaps = flymaps; + } + + int i = 1; + + for (auto map_in : *flyableMaps) { + data_text += QString(" {MAP_GROUP(%1), MAP_NUM(%1), %2, %3},\n") + .arg(map_in.name) + .arg(map_in.x) + .arg(map_in.y); + + QString ending = QString(""); + + // must add _1 / _2 for maps that have duplicates + if (flyableMapsDupes.keys().contains(map_in.name)) { + // map contains multiple heal locations + ending += QString("_%1").arg(flyableMapsDupes[map_in.name]); + flyableMapsDupes[map_in.name]++; + } + if (map_in.index != 0) { + constants_text += QString("#define HEAL_LOCATION_%1 %2\n") + .arg(map_in.name + ending) + .arg(map_in.index); + } + else { + constants_text += QString("#define HEAL_LOCATION_%1 %2\n") + .arg(map_in.name + ending) + .arg(i); + } + i++; + } + + data_text += QString("};\n"); + constants_text += QString("\n#endif // GUARD_CONSTANTS_HEAL_LOCATIONS_H\n"); + + saveTextFile(root + "/src/data/heal_locations.h", data_text); + saveTextFile(root + "/include/constants/heal_locations.h", constants_text); +} + void Project::loadMapTilesets(Map* map) { if (map->layout->has_unsaved_changes) { return; @@ -947,6 +1023,10 @@ void Project::readMapGroups() { groupNames = groups; groupedMapNames = groupedMaps; mapNames = maps; + + QString hltext = readTextFile(root + QString("/src/data/heal_locations.h")); + QList* hl = parser->parseHealLocs(hltext); + flyableMaps = hl; } Map* Project::addNewMapToGroup(QString mapName, int groupNum) { @@ -1221,6 +1301,8 @@ void Project::loadEventPixmaps(QList objects) { 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) { @@ -1309,6 +1391,17 @@ void Project::saveMapEvents(Map *map) { .arg(bgEventsLabel); saveTextFile(path, text); + + // save heal event changes + if (map->events["heal_event_group"].length() > 0) { + QList* flymaps = flyableMaps; + for (Event *heal : map->events["heal_event_group"]) { + HealLocation hl = heal->buildHealLocation(); + flymaps->append(hl); + } + flyableMaps = flymaps; + } + saveHealLocationStruct(map); } void Project::readMapEvents(Map *map) { @@ -1379,6 +1472,29 @@ void Project::readMapEvents(Map *map) { } } + map->events["heal_event_group"].clear(); + + for (auto it = flyableMaps->begin(); it != flyableMaps->end(); it++) { + + HealLocation loc = *it; + + //if TRUE map is flyable / has healing location + if (loc.name == QString(mapNamesToMapConstants->value(map->name)).remove(0,4)) { + Event *heal = new Event; + heal->put("map_name", map->name); + heal->put("x", loc.x); + heal->put("y", loc.y); + heal->put("loc_name", loc.name); + heal->put("index", loc.index); + heal->put("elevation", 3); // TODO: change this? + heal->put("destination_map_name", mapConstantsToMapNames->value(map->name)); + heal->put("event_group_type", "heal_event_group"); + heal->put("event_type", EventType::HealLocation); + map->events["heal_event_group"].append(heal); + } + + } + QList *coords = getLabelMacros(parseAsm(text), coordEventsLabel); map->events["coord_event_group"].clear(); for (QStringList command : *coords) { @@ -1455,6 +1571,7 @@ void Project::readMapEvents(Map *map) { void Project::setNewMapEvents(Map *map) { map->events["object_event_group"].clear(); map->events["warp_event_group"].clear(); + map->events["heal_event_group"].clear(); map->events["coord_event_group"].clear(); map->events["bg_event_group"].clear(); } diff --git a/project.h b/project.h index 90796295..d965e4c6 100755 --- a/project.h +++ b/project.h @@ -3,6 +3,7 @@ #include "map.h" #include "blockdata.h" +#include "heallocation.h" #include #include @@ -17,6 +18,7 @@ public: QMap *map_groups; QList groupedMapNames; QStringList *mapNames = NULL; + QList *flyableMaps = NULL; // can't be a QMap because duplicates QMap* mapConstantsToMapNames; QMap* mapNamesToMapConstants; QList mapLayoutsTable; @@ -77,6 +79,7 @@ public: void saveAllMapLayouts(); void saveMapGroupsTable(); void saveMapConstantsHeader(); + void saveHealLocationStruct(Map*); QList* parseAsm(QString text); QStringList getSongNames(); diff --git a/resources/images/Entities_16x16.png b/resources/images/Entities_16x16.png index db480f6e7b609a066e504367fb1338fe629d60b2..2d35d31d63e3699af7a0d0bd8880ac270403fa75 100755 GIT binary patch literal 490 zcmVME?3!eUtof542}5RoeLxW;q`|R-+mYv@ht$WOS2^V>Gd7J;=E1r z--aCkwdFOE-+S%?uxpHgf{_Bh$kLbDxQJvzyL77kX9 zM%&%leeM#2meS3+$=4IOuG8;l4Z{rof>KIE7PijI*kBQfr(pO&>zk>RazwnwL<_JA zks$JaT$50U)%uns4T?p5{N)7_R{*N&$JE zN5hg-kuKOM!1_3pw?XlF<~4iOYFGmJYl$o>WrHlv1r#mbWW6;dnH*=hC=aYL#xfIV z&hEMgK*TZHBclxeINtP^lM`8EjAcyLQj>lDa$++~lB4vd4yW|EcZ~y=R literal 274 zcmV+t0qy>YP)J5hbP53Dm7H1u76_11A|jb<0Px6M14y4S z`HKMD>;lMj*8re*z=^N{xKlFx41lkm7LwoI1_-whU*`qDV>JvFfNz@@01RLIr!d5R zfLwhg0Hd8O0DlWr1>i-;0765|Pr1?z