Browse Source

Maintain master and working copies of data structures, to enable saving single maps at a time

Marcus Huderle 6 years ago
parent
commit
e4c5d53ffd
4 changed files with 116 additions and 224 deletions
  1. 2
    1
      editor.cpp
  2. 14
    12
      mainwindow.cpp
  3. 91
    205
      project.cpp
  4. 9
    6
      project.h

+ 2
- 1
editor.cpp View File

9
 
9
 
10
 void Editor::saveProject() {
10
 void Editor::saveProject() {
11
     if (project) {
11
     if (project) {
12
-        project->saveAllDataStructures();
13
         project->saveAllMaps();
12
         project->saveAllMaps();
13
+        project->saveAllDataStructures();
14
     }
14
     }
15
 }
15
 }
16
 
16
 
17
 void Editor::save() {
17
 void Editor::save() {
18
     if (project && map) {
18
     if (project && map) {
19
         project->saveMap(map);
19
         project->saveMap(map);
20
+        project->saveAllDataStructures();
20
     }
21
     }
21
 }
22
 }
22
 
23
 

+ 14
- 12
mainwindow.cpp View File

73
 
73
 
74
 QString MainWindow::getDefaultMap() {
74
 QString MainWindow::getDefaultMap() {
75
     if (editor && editor->project) {
75
     if (editor && editor->project) {
76
-        QList<QStringList*> *names = editor->project->groupedMapNames;
77
-        if (names) {
76
+        QList<QStringList> names = editor->project->groupedMapNames;
77
+        if (!names.isEmpty()) {
78
             QSettings settings;
78
             QSettings settings;
79
             QString key = "project:" + editor->project->root;
79
             QString key = "project:" + editor->project->root;
80
             if (settings.contains(key)) {
80
             if (settings.contains(key)) {
81
                 QMap<QString, QVariant> qmap = settings.value(key).toMap();
81
                 QMap<QString, QVariant> qmap = settings.value(key).toMap();
82
                 if (qmap.contains("recent_map")) {
82
                 if (qmap.contains("recent_map")) {
83
                     QString map_name = qmap.value("recent_map").toString();
83
                     QString map_name = qmap.value("recent_map").toString();
84
-                    for (int i = 0; i < names->length(); i++) {
85
-                        if (names->value(i)->contains(map_name)) {
84
+                    for (int i = 0; i < names.length(); i++) {
85
+                        if (names.value(i).contains(map_name)) {
86
                             return map_name;
86
                             return map_name;
87
                         }
87
                         }
88
                     }
88
                     }
89
                 }
89
                 }
90
             }
90
             }
91
             // Failing that, just get the first map in the list.
91
             // Failing that, just get the first map in the list.
92
-            for (int i = 0; i < names->length(); i++) {
93
-                QStringList *list = names->value(i);
94
-                if (list->length()) {
95
-                    return list->value(0);
92
+            for (int i = 0; i < names.length(); i++) {
93
+                QStringList list = names.value(i);
94
+                if (list.length()) {
95
+                    return list.value(0);
96
                 }
96
                 }
97
             }
97
             }
98
         }
98
         }
327
         group->setData(i, MapListUserRoles::GroupRole);
327
         group->setData(i, MapListUserRoles::GroupRole);
328
         maps->appendRow(group);
328
         maps->appendRow(group);
329
         mapGroupsModel->append(group);
329
         mapGroupsModel->append(group);
330
-        QStringList *names = project->groupedMapNames->value(i);
331
-        for (int j = 0; j < names->length(); j++) {
332
-            QString map_name = names->value(j);
330
+        QStringList names = project->groupedMapNames.value(i);
331
+        for (int j = 0; j < names.length(); j++) {
332
+            QString map_name = names.value(j);
333
             QStandardItem *map = createMapItem(map_name, i, j);
333
             QStandardItem *map = createMapItem(map_name, i, j);
334
             group->appendRow(map);
334
             group->appendRow(map);
335
         }
335
         }
387
     QStandardItem* groupItem = mapGroupsModel->at(groupNum);
387
     QStandardItem* groupItem = mapGroupsModel->at(groupNum);
388
 
388
 
389
     QString newMapName = editor->project->getNewMapName();
389
     QString newMapName = editor->project->getNewMapName();
390
-    editor->project->addNewMapToGroup(newMapName, groupNum);
390
+    Map* newMap = editor->project->addNewMapToGroup(newMapName, groupNum);
391
+    editor->project->saveMap(newMap);
392
+    editor->project->saveAllDataStructures();
391
 
393
 
392
     int numMapsInGroup = groupItem->rowCount();
394
     int numMapsInGroup = groupItem->rowCount();
393
     QStandardItem *newMapItem = createMapItem(newMapName, groupNum, numMapsInGroup);
395
     QStandardItem *newMapItem = createMapItem(newMapName, groupNum, numMapsInGroup);

+ 91
- 205
project.cpp View File

17
 {
17
 {
18
     groupNames = new QStringList;
18
     groupNames = new QStringList;
19
     map_groups = new QMap<QString, int>;
19
     map_groups = new QMap<QString, int>;
20
-    groupedMapNames = new QList<QStringList*>;
21
     mapNames = new QStringList;
20
     mapNames = new QStringList;
22
     map_cache = new QMap<QString, Map*>;
21
     map_cache = new QMap<QString, Map*>;
23
     mapConstantsToMapNames = new QMap<QString, QString>;
22
     mapConstantsToMapNames = new QMap<QString, QString>;
24
     mapNamesToMapConstants = new QMap<QString, QString>;
23
     mapNamesToMapConstants = new QMap<QString, QString>;
25
-    mapAttributesTable = new QMap<int, QString>;
26
-    mapAttributes = new QMap<QString, QMap<QString, QString>*>;
27
     tileset_cache = new QMap<QString, Tileset*>;
24
     tileset_cache = new QMap<QString, Tileset*>;
28
 }
25
 }
29
 
26
 
36
 }
33
 }
37
 
34
 
38
 Map* Project::loadMap(QString map_name) {
35
 Map* Project::loadMap(QString map_name) {
39
-    // New maps are saved to actual files yet, so we need to fetch their data from the map_cache.
40
     Map *map;
36
     Map *map;
41
-    if (map_cache->contains(map_name) && !map_cache->value(map_name)->isPersistedToFile) {
37
+    if (map_cache->contains(map_name)) {
42
         map = map_cache->value(map_name);
38
         map = map_cache->value(map_name);
39
+        if (map->hasUnsavedChanges()) {
40
+            return map;
41
+        }
43
     } else {
42
     } else {
44
         map = new Map;
43
         map = new Map;
45
         map->setName(map_name);
44
         map->setName(map_name);
228
                 // Strip off "_MapAttributes" from the label if it's a real map label.
227
                 // Strip off "_MapAttributes" from the label if it's a real map label.
229
                 mapName = mapName.remove(mapName.length() - 14, 14);
228
                 mapName = mapName.remove(mapName.length() - 14, 14);
230
             }
229
             }
231
-            mapAttributesTable->insert(curMapIndex, mapName);
230
+            mapAttributesTable.insert(curMapIndex, mapName);
232
             curMapIndex++;
231
             curMapIndex++;
233
         }
232
         }
234
     }
233
     }
234
+
235
+    mapAttributesTableMaster = mapAttributesTable;
236
+    mapAttributesTableMaster.detach();
235
 }
237
 }
236
 
238
 
237
 void Project::saveMapAttributesTable() {
239
 void Project::saveMapAttributesTable() {
238
     QString text = "";
240
     QString text = "";
239
     text += QString("\t.align 2\n");
241
     text += QString("\t.align 2\n");
240
     text += QString("gMapAttributes::\n");
242
     text += QString("gMapAttributes::\n");
241
-    for (int i = 0; i < mapAttributesTable->count(); i++) {
243
+    for (int i = 0; i < mapAttributesTableMaster.count(); i++) {
242
         int mapIndex = i + 1;
244
         int mapIndex = i + 1;
243
-        QString mapName = mapAttributesTable->value(mapIndex);
245
+        QString mapName = mapAttributesTableMaster.value(mapIndex);
244
         if (!mapName.contains("UnknownMapAttributes")) {
246
         if (!mapName.contains("UnknownMapAttributes")) {
245
             text += QString("\t.4byte %1_MapAttributes\n").arg(mapName);
247
             text += QString("\t.4byte %1_MapAttributes\n").arg(mapName);
246
         } else {
248
         } else {
275
 }
277
 }
276
 
278
 
277
 void Project::readAllMapAttributes() {
279
 void Project::readAllMapAttributes() {
278
-    mapAttributes->clear();
280
+    mapAttributes.clear();
279
 
281
 
280
     Asm *parser = new Asm;
282
     Asm *parser = new Asm;
281
     QString assets_text = readTextFile(getMapAssetsFilepath());
283
     QString assets_text = readTextFile(getMapAssetsFilepath());
307
             mapName = borderLabel.replace("Border", "Attributes");
309
             mapName = borderLabel.replace("Border", "Attributes");
308
         }
310
         }
309
 
311
 
310
-        QMap<QString, QString>* attrs = new QMap<QString, QString>;
311
-        mapAttributes->insert(mapName, attrs);
312
-        attrs->insert("border_label", borderParams.value(1));
312
+        mapAttributes[mapName].insert("border_label", borderParams.value(1));
313
         borderParams = commands->value(i++);
313
         borderParams = commands->value(i++);
314
-        attrs->insert("border_filepath", borderParams.value(1).replace("\"", ""));
314
+        mapAttributes[mapName].insert("border_filepath", borderParams.value(1).replace("\"", ""));
315
 
315
 
316
         // Read MapBlockData assets.
316
         // Read MapBlockData assets.
317
         QStringList blockDataParams = commands->value(i++);
317
         QStringList blockDataParams = commands->value(i++);
321
             continue;
321
             continue;
322
         }
322
         }
323
         QString blockDataLabel = blockDataParams.value(1);
323
         QString blockDataLabel = blockDataParams.value(1);
324
-        attrs->insert("blockdata_label", blockDataLabel);
324
+        mapAttributes[mapName].insert("blockdata_label", blockDataLabel);
325
         blockDataParams = commands->value(i++);
325
         blockDataParams = commands->value(i++);
326
-        attrs->insert("blockdata_filepath", blockDataParams.value(1).replace("\"", ""));
326
+        mapAttributes[mapName].insert("blockdata_filepath", blockDataParams.value(1).replace("\"", ""));
327
 
327
 
328
         // Read MapAttributes assets.
328
         // Read MapAttributes assets.
329
         i++; // skip .align
329
         i++; // skip .align
354
             if (!altMapName.startsWith("UnknownMapAttributes_")) {
354
             if (!altMapName.startsWith("UnknownMapAttributes_")) {
355
                 altMapName.remove(altMapName.length() - 14, 14);
355
                 altMapName.remove(altMapName.length() - 14, 14);
356
             }
356
             }
357
-            if (!mapAttributes->contains(altMapName)) {
358
-                mapAttributes->insert(altMapName, new QMap<QString, QString>);
357
+            if (!mapAttributes.contains(altMapName)) {
358
+                mapAttributes.insert(altMapName, QMap<QString, QString>());
359
             }
359
             }
360
-            mapAttributes->value(altMapName)->insert("attributes_label", attributeMapLabel);
361
-            mapAttributes->value(altMapName)->insert("width", attrWidth);
362
-            mapAttributes->value(altMapName)->insert("height", attrHeight);
363
-            mapAttributes->value(altMapName)->insert("border_label", attrBorderLabel);
364
-            mapAttributes->value(altMapName)->insert("blockdata_label", attrBlockdataLabel);
365
-            mapAttributes->value(altMapName)->insert("tileset_primary", attrTilesetPrimary);
366
-            mapAttributes->value(altMapName)->insert("tileset_secondary", attrTilesetSecondary);
360
+            mapAttributes[altMapName]["attributes_label"] = attributeMapLabel;
361
+            mapAttributes[altMapName].insert("attributes_label", attributeMapLabel);
362
+            mapAttributes[altMapName].insert("width", attrWidth);
363
+            mapAttributes[altMapName].insert("height", attrHeight);
364
+            mapAttributes[altMapName].insert("border_label", attrBorderLabel);
365
+            mapAttributes[altMapName].insert("blockdata_label", attrBlockdataLabel);
366
+            mapAttributes[altMapName].insert("tileset_primary", attrTilesetPrimary);
367
+            mapAttributes[altMapName].insert("tileset_secondary", attrTilesetSecondary);
367
 
368
 
368
             if (sharedAttrMaps->length() > 1) {
369
             if (sharedAttrMaps->length() > 1) {
369
-                mapAttributes->value(altMapName)->insert("shared_attr_maps", sharedAttrMaps->join(":"));
370
+                mapAttributes[altMapName].insert("shared_attr_maps", sharedAttrMaps->join(":"));
370
             }
371
             }
371
         }
372
         }
372
     }
373
     }
374
+
375
+    mapAttributesMaster = mapAttributes;
376
+    mapAttributesMaster.detach();
373
 }
377
 }
374
 
378
 
375
 void Project::saveAllMapAttributes() {
379
 void Project::saveAllMapAttributes() {
376
     QString text = "";
380
     QString text = "";
377
-    for (int i = 0; i < mapAttributesTable->count(); i++) {
381
+    for (int i = 0; i < mapAttributesTableMaster.count(); i++) {
378
         int mapIndex = i + 1;
382
         int mapIndex = i + 1;
379
-        QString mapName = mapAttributesTable->value(mapIndex);
380
-        QMap<QString, QString>* attrs = mapAttributes->value(mapName);
383
+        QString mapName = mapAttributesTableMaster.value(mapIndex);
384
+        QMap<QString, QString> attrs = mapAttributesMaster.value(mapName);
381
 
385
 
382
         // Find the map attributes object that contains the border data.
386
         // Find the map attributes object that contains the border data.
383
-        QMap<QString, QString>* attrsWithBorder;
384
-        if (attrs->contains("border_filepath")) {
387
+        QMap<QString, QString> attrsWithBorder;
388
+        if (attrs.contains("border_filepath")) {
385
             attrsWithBorder = attrs;
389
             attrsWithBorder = attrs;
386
         } else {
390
         } else {
387
-            QStringList labels = attrs->value("shared_attr_maps").split(":");
391
+            QStringList labels = attrs.value("shared_attr_maps").split(":");
388
             for (QString label : labels) {
392
             for (QString label : labels) {
389
                 label.remove(label.length() - 14, 14);
393
                 label.remove(label.length() - 14, 14);
390
-                if (mapAttributes->contains(label) && mapAttributes->value(label)->contains("border_filepath")) {
391
-                    attrsWithBorder = mapAttributes->value(label);
394
+                if (mapAttributesMaster.contains(label) && mapAttributesMaster.value(label).contains("border_filepath")) {
395
+                    attrsWithBorder = mapAttributesMaster.value(label);
392
                     break;
396
                     break;
393
                 }
397
                 }
394
             }
398
             }
395
         }
399
         }
396
-        if (attrsWithBorder != nullptr) {
397
-            text += QString("%1::\n").arg(attrsWithBorder->value("border_label"));
398
-            text += QString("\t.incbin \"%1\"\n").arg(attrsWithBorder->value("border_filepath"));
400
+        if (!attrsWithBorder.isEmpty()) {
401
+            text += QString("%1::\n").arg(attrsWithBorder.value("border_label"));
402
+            text += QString("\t.incbin \"%1\"\n").arg(attrsWithBorder.value("border_filepath"));
399
             text += QString("\n");
403
             text += QString("\n");
400
         }
404
         }
401
 
405
 
402
         // Find the map attributes object that contains the blockdata.
406
         // Find the map attributes object that contains the blockdata.
403
-        QMap<QString, QString>* attrsWithBlockdata;
404
-        if (attrs->contains("blockdata_filepath")) {
407
+        QMap<QString, QString> attrsWithBlockdata;
408
+        if (attrs.contains("blockdata_filepath")) {
405
             attrsWithBlockdata = attrs;
409
             attrsWithBlockdata = attrs;
406
         } else {
410
         } else {
407
-            QStringList labels = attrs->value("shared_attr_maps").split(":");
411
+            QStringList labels = attrs["shared_attr_maps"].split(":");
408
             for (QString label : labels) {
412
             for (QString label : labels) {
409
                 label.remove(label.length() - 14, 14);
413
                 label.remove(label.length() - 14, 14);
410
-                if (mapAttributes->contains(label) && mapAttributes->value(label)->contains("blockdata_filepath")) {
411
-                    attrsWithBlockdata = mapAttributes->value(label);
414
+                if (mapAttributesMaster.contains(label) && mapAttributesMaster.value(label).contains("blockdata_filepath")) {
415
+                    attrsWithBlockdata = mapAttributesMaster.value(label);
412
                     break;
416
                     break;
413
                 }
417
                 }
414
             }
418
             }
415
         }
419
         }
416
-        if (attrsWithBlockdata != nullptr) {
417
-            text += QString("%1::\n").arg(attrsWithBlockdata->value("blockdata_label"));
418
-            text += QString("\t.incbin \"%1\"\n").arg(attrsWithBorder->value("blockdata_filepath"));
420
+        if (!attrsWithBlockdata.isEmpty()) {
421
+            text += QString("%1::\n").arg(attrsWithBlockdata.value("blockdata_label"));
422
+            text += QString("\t.incbin \"%1\"\n").arg(attrsWithBorder.value("blockdata_filepath"));
419
             text += QString("\n");
423
             text += QString("\n");
420
         }
424
         }
421
 
425
 
422
         text += QString("\t.align 2\n");
426
         text += QString("\t.align 2\n");
423
-        if (attrs->contains("shared_attr_maps")) {
424
-            QStringList labels = attrs->value("shared_attr_maps").split(":");
427
+        if (attrs.contains("shared_attr_maps")) {
428
+            QStringList labels = attrs.value("shared_attr_maps").split(":");
425
             for (QString label : labels) {
429
             for (QString label : labels) {
426
                 text += QString("%1::\n").arg(label);
430
                 text += QString("%1::\n").arg(label);
427
             }
431
             }
428
         } else {
432
         } else {
429
-            text += QString("%1::\n").arg(attrs->value("attributes_label"));
433
+            text += QString("%1::\n").arg(attrs.value("attributes_label"));
430
         }
434
         }
431
-        text += QString("\t.4byte %1\n").arg(attrs->value("width"));
432
-        text += QString("\t.4byte %1\n").arg(attrs->value("height"));
433
-        text += QString("\t.4byte %1\n").arg(attrs->value("border_label"));
434
-        text += QString("\t.4byte %1\n").arg(attrs->value("blockdata_label"));
435
-        text += QString("\t.4byte %1\n").arg(attrs->value("tileset_primary"));
436
-        text += QString("\t.4byte %1\n").arg(attrs->value("tileset_secondary"));
435
+        text += QString("\t.4byte %1\n").arg(attrs.value("width"));
436
+        text += QString("\t.4byte %1\n").arg(attrs.value("height"));
437
+        text += QString("\t.4byte %1\n").arg(attrs.value("border_label"));
438
+        text += QString("\t.4byte %1\n").arg(attrs.value("blockdata_label"));
439
+        text += QString("\t.4byte %1\n").arg(attrs.value("tileset_primary"));
440
+        text += QString("\t.4byte %1\n").arg(attrs.value("tileset_secondary"));
437
         text += QString("\n");
441
         text += QString("\n");
438
     }
442
     }
439
 
443
 
453
     map->tileset_secondary_label = "gTileset_Petalburg";
457
     map->tileset_secondary_label = "gTileset_Petalburg";
454
 
458
 
455
     // Insert new entry into the global map attributes.
459
     // Insert new entry into the global map attributes.
456
-    QMap<QString, QString>* attrs = new QMap<QString, QString>;
457
-    attrs->insert("border_label", QString("%1_MapBorder").arg(map->name));
458
-    attrs->insert("border_filepath", QString("data/maps/%1/border.bin").arg(map->name));
459
-    attrs->insert("blockdata_label", QString("%1_MapBlockdata").arg(map->name));
460
-    attrs->insert("blockdata_filepath", QString("data/maps/%1/map.bin").arg(map->name));
461
-    attrs->insert("attributes_label", QString("%1_MapAttributes").arg(map->name));
462
-    attrs->insert("width", map->width);
463
-    attrs->insert("height", map->height);
464
-    attrs->insert("tileset_primary", map->tileset_primary_label);
465
-    attrs->insert("tileset_secondary", map->tileset_secondary_label);
466
-    mapAttributes->insert(map->name, attrs);
460
+    QMap<QString, QString> attrs;
461
+    attrs.insert("border_label", QString("%1_MapBorder").arg(map->name));
462
+    attrs.insert("border_filepath", QString("data/maps/%1/border.bin").arg(map->name));
463
+    attrs.insert("blockdata_label", QString("%1_MapBlockdata").arg(map->name));
464
+    attrs.insert("blockdata_filepath", QString("data/maps/%1/map.bin").arg(map->name));
465
+    attrs.insert("attributes_label", QString("%1_MapAttributes").arg(map->name));
466
+    attrs.insert("width", map->width);
467
+    attrs.insert("height", map->height);
468
+    attrs.insert("tileset_primary", map->tileset_primary_label);
469
+    attrs.insert("tileset_secondary", map->tileset_secondary_label);
470
+    mapAttributes.insert(map->name, attrs);
467
 }
471
 }
468
 
472
 
469
 void Project::saveMapGroupsTable() {
473
 void Project::saveMapGroupsTable() {
470
     QString text = "";
474
     QString text = "";
471
     int groupNum = 0;
475
     int groupNum = 0;
472
-    for (QStringList* mapNames : *groupedMapNames) {
476
+    for (QStringList mapNames : groupedMapNames) {
473
         text += QString("\t.align 2\n");
477
         text += QString("\t.align 2\n");
474
         text += QString("gMapGroup%1::\n").arg(groupNum);
478
         text += QString("gMapGroup%1::\n").arg(groupNum);
475
-        for (QString mapName : *mapNames) {
479
+        for (QString mapName : mapNames) {
476
             text += QString("\t.4byte %1\n").arg(mapName);
480
             text += QString("\t.4byte %1\n").arg(mapName);
477
         }
481
         }
478
         text += QString("\n");
482
         text += QString("\n");
610
             qDebug() << "Error: failed to create directory for new map. " << newMapDataDir;
614
             qDebug() << "Error: failed to create directory for new map. " << newMapDataDir;
611
         }
615
         }
612
 
616
 
617
+        // TODO: In the future, these files needs more structure to allow for proper parsing/saving.
613
         // Create file data/scripts/maps/<map_name>.inc
618
         // Create file data/scripts/maps/<map_name>.inc
614
         QString text = QString("%1_MapScripts::\n\t.byte 0\n").arg(map->name);
619
         QString text = QString("%1_MapScripts::\n\t.byte 0\n").arg(map->name);
615
         saveTextFile(root + "/data/scripts/maps/" + map->name + ".inc", text);
620
         saveTextFile(root + "/data/scripts/maps/" + map->name + ".inc", text);
618
         saveTextFile(root + "/data/text/maps/" + map->name + ".inc", "\n");
623
         saveTextFile(root + "/data/text/maps/" + map->name + ".inc", "\n");
619
 
624
 
620
         // Simply append to data/event_scripts.s.
625
         // Simply append to data/event_scripts.s.
621
-        // TODO: In the future, this file needs more structure to allow for proper parsing.
622
         text = QString("\n\t.include \"data/scripts/maps/%1.inc\"\n").arg(map->name);
626
         text = QString("\n\t.include \"data/scripts/maps/%1.inc\"\n").arg(map->name);
623
         text += QString("\t.include \"data/text/maps/%1.inc\"\n").arg(map->name);
627
         text += QString("\t.include \"data/text/maps/%1.inc\"\n").arg(map->name);
624
         appendTextFile(root + "/data/event_scripts.s", text);
628
         appendTextFile(root + "/data/event_scripts.s", text);
636
     saveMapHeader(map);
640
     saveMapHeader(map);
637
     saveBlockdata(map);
641
     saveBlockdata(map);
638
     saveMapEvents(map);
642
     saveMapEvents(map);
643
+
644
+    // Update global data structures with current map data.
645
+    updateMapAttributes(map);
646
+
639
     map->isPersistedToFile = true;
647
     map->isPersistedToFile = true;
640
 }
648
 }
641
 
649
 
650
+void Project::updateMapAttributes(Map* map) {
651
+    mapAttributesTableMaster.insert(map->index.toInt(nullptr, 0), map->name);
652
+
653
+    QMap<QString, QString> attrs = mapAttributes.value(map->name);
654
+    attrs.detach();
655
+    mapAttributesMaster.insert(map->name, attrs);
656
+}
657
+
642
 void Project::saveAllDataStructures() {
658
 void Project::saveAllDataStructures() {
643
     saveMapAttributesTable();
659
     saveMapAttributesTable();
644
     saveAllMapAttributes();
660
     saveAllMapAttributes();
883
         }
899
         }
884
     }
900
     }
885
 
901
 
886
-    QList<QStringList*> *groupedMaps = new QList<QStringList*>;
902
+    QList<QStringList> groupedMaps;
887
     for (int i = 0; i < groups->length(); i++) {
903
     for (int i = 0; i < groups->length(); i++) {
888
-        QStringList *list = new QStringList;
889
-        groupedMaps->append(list);
904
+        groupedMaps.append(QStringList());
890
     }
905
     }
891
 
906
 
892
     QStringList *maps = new QStringList;
907
     QStringList *maps = new QStringList;
900
             if (group != -1) {
915
             if (group != -1) {
901
                 for (int j = 1; j < params.length(); j++) {
916
                 for (int j = 1; j < params.length(); j++) {
902
                     QString mapName = params.value(j);
917
                     QString mapName = params.value(j);
903
-                    QStringList *list = groupedMaps->value(group);
904
-                    list->append(mapName);
918
+                    groupedMaps[group].append(mapName);
905
                     maps->append(mapName);
919
                     maps->append(mapName);
906
                     map_groups->insert(mapName, group);
920
                     map_groups->insert(mapName, group);
907
 
921
 
919
     mapNames = maps;
933
     mapNames = maps;
920
 }
934
 }
921
 
935
 
922
-void Project::addNewMapToGroup(QString mapName, int groupNum) {
923
-    int mapIndex = mapAttributesTable->count() + 1;
924
-    mapAttributesTable->insert(mapIndex, mapName);
936
+Map* Project::addNewMapToGroup(QString mapName, int groupNum) {
937
+    int mapIndex = mapAttributesTable.count() + 1;
938
+    mapAttributesTable.insert(mapIndex, mapName);
925
 
939
 
926
     // Setup new map in memory, but don't write to file until map is actually saved later.
940
     // Setup new map in memory, but don't write to file until map is actually saved later.
927
     mapNames->append(mapName);
941
     mapNames->append(mapName);
928
     map_groups->insert(mapName, groupNum);
942
     map_groups->insert(mapName, groupNum);
929
-    groupedMapNames->value(groupNum)->append(mapName);
943
+    groupedMapNames[groupNum].append(mapName);
930
 
944
 
931
     Map *map = new Map;
945
     Map *map = new Map;
932
     map->isPersistedToFile = false;
946
     map->isPersistedToFile = false;
942
     map->history.save();
956
     map->history.save();
943
     map_cache->insert(mapName, map);
957
     map_cache->insert(mapName, map);
944
 
958
 
945
-
946
-//    QString dataDir = QString("%1/data/").arg(root);
947
-//    QString dataMapsDir = QString("%1maps/").arg(dataDir);
948
-//    QString newMapDataDir = QString("%1%2/").arg(dataMapsDir).arg(mapName);
949
-
950
-//    // 1. Create directory data/maps/<map_name>/
951
-//    if (!QDir::root().mkdir(newMapDataDir)) {
952
-//        qDebug() << "Error: failed to create directory for new map. " << newMapDataDir;
953
-//        return;
954
-//    }
955
-
956
-//    // 2. Create file data/maps/<map_name>/border.bin
957
-//    QFile borderFile(newMapDataDir + "border.bin");
958
-//    borderFile.open(QIODevice::WriteOnly);
959
-//    QDataStream borderStream(&borderFile);
960
-//    borderStream.setByteOrder(QDataStream::LittleEndian);
961
-//    borderStream << qint16(0x01D4) << qint16(0x01D5) << qint16(0x01DC) << qint16(0x01DD);
962
-//    borderFile.close();
963
-
964
-//    // 3. Create file data/maps/<map_name>/header.inc
965
-//    QFile headerFile(newMapDataDir + "header.inc");
966
-//    headerFile.open(QIODevice::WriteOnly);
967
-//    QTextStream headerStream(&headerFile);
968
-//    headerStream << mapName << "::" << endl
969
-//                 << "\t.4byte " << mapName << "_MapAttributes" << endl
970
-//                 << "\t.4byte " << mapName << "_MapEvents" << endl
971
-//                 << "\t.4byte " << mapName << "_MapScripts" << endl
972
-//                 << "\t.4byte 0x0" << endl
973
-//                 << "\t.2byte BGM_DAN02" << endl
974
-//                 << "\t.2byte " << mapIndex << endl
975
-//                 << "\t.byte 0" << endl
976
-//                 << "\t.byte 0" << endl
977
-//                 << "\t.byte 11" << endl
978
-//                 << "\t.byte 4" << endl
979
-//                 << "\t.2byte 0" << endl
980
-//                 << "\t.byte 1" << endl
981
-//                 << "\t.byte 0" << endl;
982
-//    headerFile.close();
983
-
984
-//    // 4. Create file data/maps/<map_name>/map.bin
985
-//    QFile mapFile(newMapDataDir + "map.bin");
986
-//    mapFile.open(QIODevice::WriteOnly);
987
-//    QDataStream mapStream(&mapFile);
988
-//    mapStream.setByteOrder(QDataStream::LittleEndian);
989
-//    for (int i = 0; i < 20 * 20; i++) {
990
-//        mapStream << qint16(0x3001);
991
-//    }
992
-//    mapFile.close();
993
-
994
-//    // 5. Create file data/maps/events/<map_name>.inc
995
-//    QFile eventsFile(dataMapsDir + "events/" + mapName + ".inc");
996
-//    eventsFile.open(QIODevice::WriteOnly);
997
-//    QTextStream eventsStream(&eventsFile);
998
-//    eventsStream << mapName << "_MapEvents::" << endl
999
-//                 << "\tmap_events 0x0, 0x0, 0x0, 0x0" << endl;
1000
-//    eventsFile.close();
1001
-
1002
-//    // 6. Create file data/scripts/maps/<map_name>.inc
1003
-//    QFile scriptsFile(dataDir + "scripts/maps/" + mapName + ".inc");
1004
-//    scriptsFile.open(QIODevice::WriteOnly);
1005
-//    QTextStream scriptsStream(&scriptsFile);
1006
-//    scriptsStream << mapName << "_MapScripts::" << endl
1007
-//                  << "\t.byte 0" << endl;
1008
-//    scriptsFile.close();
1009
-
1010
-//    // 7. Create file data/text/maps/<map_name>.inc
1011
-//    QFile textFile(dataDir + "text/maps/" + mapName + ".inc");
1012
-//    textFile.open(QIODevice::WriteOnly);
1013
-//    QTextStream textStream(&textFile);
1014
-//    textStream << endl;
1015
-//    textFile.close();
1016
-
1017
-//    // 8. Modify data/event_scripts.s:
1018
-//    QFile eventScriptsFile(dataDir + "event_scripts.s");
1019
-//    eventScriptsFile.open(QIODevice::Append);
1020
-//    QTextStream eventScriptsStream(&eventScriptsFile);
1021
-//    eventScriptsStream << endl
1022
-//                       << "\t.include \"data/scripts/maps/" << mapName << ".inc\"" << endl
1023
-//                       << "\t.include \"data/text/maps/" << mapName << ".inc\"" << endl;
1024
-//    eventScriptsFile.close();
1025
-
1026
-//    // 9. Modify data/map_events.s:
1027
-//    QFile mapEventsFile(dataDir + "map_events.s");
1028
-//    mapEventsFile.open(QIODevice::Append);
1029
-//    QTextStream mapEventsStream(&mapEventsFile);
1030
-//    mapEventsStream << endl
1031
-//                    << "\t.include \"data/maps/events/" << mapName << ".inc\"" << endl;
1032
-//    mapEventsFile.close();
1033
-
1034
-//    // 10. Modify data/maps/_assets.inc
1035
-//    QFile assetsFile(dataMapsDir + "_assets.inc");
1036
-//    assetsFile.open(QIODevice::Append);
1037
-//    QTextStream assetsStream(&assetsFile);
1038
-//    assetsStream << endl
1039
-//                 << mapName << "_MapBorder::" << endl
1040
-//                 << "\t.incbin \"data/maps/" << mapName << "/border.bin\"" << endl
1041
-//                 << endl
1042
-//                 << mapName << "_MapBlockdata::" << endl
1043
-//                 << "\t.incbin \"data/maps/" << mapName << "/map.bin\"" << endl
1044
-//                 << endl
1045
-//                 << "\t.align 2" << endl
1046
-//                 << mapName << "_MapAttributes::" << endl
1047
-//                 << "\t.4byte 0x14" << endl
1048
-//                 << "\t.4byte 0x14" << endl
1049
-//                 << "\t.4byte " << mapName << "_MapBorder" << endl
1050
-//                 << "\t.4byte " << mapName << "_MapBlockdata" << endl
1051
-//                 << "\t.4byte gTileset_General" << endl
1052
-//                 << "\t.4byte gTileset_Pacifidlog" << endl
1053
-//                 << endl;
1054
-//    assetsFile.close();
1055
-
1056
-//    // 11. Modify data/maps/_groups.inc
1057
-//    // TODO:
1058
-
1059
-//    // 12. Modify data/maps/attributes_table.inc
1060
-//    QFile attributesFile(dataMapsDir + "attributes_table.inc");
1061
-//    attributesFile.open(QIODevice::Append);
1062
-//    QTextStream attributesStream(&attributesFile);
1063
-//    attributesStream << endl
1064
-//                    << "\t.4byte " << mapName << "_MapAttributes" << endl;
1065
-//    attributesFile.close();
1066
-
1067
-//    // 13. Modify data/maps/headers.inc
1068
-//    QFile headersFile(dataMapsDir + "headers.inc");
1069
-//    headersFile.open(QIODevice::Append);
1070
-//    QTextStream headersStream(&headersFile);
1071
-//    headersStream << endl
1072
-//                    << "\t.include \"data/maps/" << mapName << "/header.inc\"" << endl;
1073
-//    headersFile.close();
959
+    return map;
1074
 }
960
 }
1075
 
961
 
1076
 QString Project::getNewMapName() {
962
 QString Project::getNewMapName() {

+ 9
- 6
project.h View File

15
     QString root;
15
     QString root;
16
     QStringList *groupNames = NULL;
16
     QStringList *groupNames = NULL;
17
     QMap<QString, int> *map_groups;
17
     QMap<QString, int> *map_groups;
18
-    QList<QStringList*> *groupedMapNames = NULL;
18
+    QList<QStringList> groupedMapNames;
19
     QStringList *mapNames = NULL;
19
     QStringList *mapNames = NULL;
20
-    QMap<QString, QString> *mapConstantsToMapNames;
21
-    QMap<QString, QString> *mapNamesToMapConstants;
22
-    QMap<int, QString> *mapAttributesTable;
23
-    QMap<QString, QMap<QString, QString>*> *mapAttributes;
20
+    QMap<QString, QString>* mapConstantsToMapNames;
21
+    QMap<QString, QString>* mapNamesToMapConstants;
22
+    QMap<int, QString> mapAttributesTable;
23
+    QMap<int, QString> mapAttributesTableMaster;
24
+    QMap<QString, QMap<QString, QString>> mapAttributes;
25
+    QMap<QString, QMap<QString, QString>> mapAttributesMaster;
24
 
26
 
25
 
27
 
26
     QMap<QString, Map*> *map_cache;
28
     QMap<QString, Map*> *map_cache;
39
     void appendTextFile(QString path, QString text);
41
     void appendTextFile(QString path, QString text);
40
 
42
 
41
     void readMapGroups();
43
     void readMapGroups();
42
-    void addNewMapToGroup(QString mapName, int groupNum);
44
+    Map* addNewMapToGroup(QString mapName, int groupNum);
43
     QString getNewMapName();
45
     QString getNewMapName();
44
     QString getProjectTitle();
46
     QString getProjectTitle();
45
 
47
 
98
     QString getMapAssetsFilepath();
100
     QString getMapAssetsFilepath();
99
     void saveMapHeader(Map*);
101
     void saveMapHeader(Map*);
100
     void saveMapAttributesTable();
102
     void saveMapAttributesTable();
103
+    void updateMapAttributes(Map* map);
101
 };
104
 };
102
 
105
 
103
 #endif // PROJECT_H
106
 #endif // PROJECT_H