|
@@ -261,7 +261,7 @@ void Project::readMapAttributes(Map* map) {
|
261
|
261
|
|
262
|
262
|
Asm *parser = new Asm;
|
263
|
263
|
|
264
|
|
- QString assets_text = readTextFile(root + "/data/maps/_assets.inc");
|
|
264
|
+ QString assets_text = readTextFile(getMapAssetsFilepath());
|
265
|
265
|
if (assets_text.isNull()) {
|
266
|
266
|
return;
|
267
|
267
|
}
|
|
@@ -278,7 +278,7 @@ void Project::readAllMapAttributes() {
|
278
|
278
|
mapAttributes->clear();
|
279
|
279
|
|
280
|
280
|
Asm *parser = new Asm;
|
281
|
|
- QString assets_text = readTextFile(root + "/data/maps/_assets.inc");
|
|
281
|
+ QString assets_text = readTextFile(getMapAssetsFilepath());
|
282
|
282
|
if (assets_text.isNull()) {
|
283
|
283
|
return;
|
284
|
284
|
}
|
|
@@ -306,10 +306,12 @@ void Project::readAllMapAttributes() {
|
306
|
306
|
// Unknown map name has to match the MapAttributes label.
|
307
|
307
|
mapName = borderLabel.replace("Border", "Attributes");
|
308
|
308
|
}
|
309
|
|
- mapAttributes->insert(mapName, new QMap<QString, QString>);
|
310
|
|
- mapAttributes->value(mapName)->insert("border_label", borderParams.value(1));
|
|
309
|
+
|
|
310
|
+ QMap<QString, QString>* attrs = new QMap<QString, QString>;
|
|
311
|
+ mapAttributes->insert(mapName, attrs);
|
|
312
|
+ attrs->insert("border_label", borderParams.value(1));
|
311
|
313
|
borderParams = commands->value(i++);
|
312
|
|
- mapAttributes->value(mapName)->insert("border_filepath", borderParams.value(1).replace("\"", ""));
|
|
314
|
+ attrs->insert("border_filepath", borderParams.value(1).replace("\"", ""));
|
313
|
315
|
|
314
|
316
|
// Read MapBlockData assets.
|
315
|
317
|
QStringList blockDataParams = commands->value(i++);
|
|
@@ -319,21 +321,24 @@ void Project::readAllMapAttributes() {
|
319
|
321
|
continue;
|
320
|
322
|
}
|
321
|
323
|
QString blockDataLabel = blockDataParams.value(1);
|
322
|
|
- mapAttributes->value(mapName)->insert("blockdata_label", blockDataLabel);
|
|
324
|
+ attrs->insert("blockdata_label", blockDataLabel);
|
323
|
325
|
blockDataParams = commands->value(i++);
|
324
|
|
- mapAttributes->value(mapName)->insert("blockdata_filepath", blockDataParams.value(1).replace("\"", ""));
|
|
326
|
+ attrs->insert("blockdata_filepath", blockDataParams.value(1).replace("\"", ""));
|
325
|
327
|
|
326
|
328
|
// Read MapAttributes assets.
|
327
|
329
|
i++; // skip .align
|
328
|
330
|
// Maps can share MapAttributes, so gather a list of them.
|
329
|
331
|
QStringList attributeMapLabels;
|
330
|
332
|
QStringList attributesParams;
|
|
333
|
+ QStringList* sharedAttrMaps = new QStringList;
|
331
|
334
|
while (i < commands->length()) {
|
332
|
335
|
attributesParams = commands->value(i);
|
333
|
336
|
if (attributesParams.value(0) != ".label") {
|
334
|
337
|
break;
|
335
|
338
|
}
|
336
|
|
- attributeMapLabels.append(attributesParams.value(1));
|
|
339
|
+ QString attrLabel = attributesParams.value(1);
|
|
340
|
+ attributeMapLabels.append(attrLabel);
|
|
341
|
+ sharedAttrMaps->append(attrLabel);
|
337
|
342
|
i++;
|
338
|
343
|
}
|
339
|
344
|
|
|
@@ -359,10 +364,86 @@ void Project::readAllMapAttributes() {
|
359
|
364
|
mapAttributes->value(altMapName)->insert("blockdata_label", attrBlockdataLabel);
|
360
|
365
|
mapAttributes->value(altMapName)->insert("tileset_primary", attrTilesetPrimary);
|
361
|
366
|
mapAttributes->value(altMapName)->insert("tileset_secondary", attrTilesetSecondary);
|
|
367
|
+
|
|
368
|
+ if (sharedAttrMaps->length() > 1) {
|
|
369
|
+ mapAttributes->value(altMapName)->insert("shared_attr_maps", sharedAttrMaps->join(":"));
|
|
370
|
+ }
|
362
|
371
|
}
|
363
|
372
|
}
|
364
|
373
|
}
|
365
|
374
|
|
|
375
|
+void Project::saveAllMapAttributes() {
|
|
376
|
+ QString text = "";
|
|
377
|
+ for (int i = 0; i < mapAttributesTable->count(); i++) {
|
|
378
|
+ int mapIndex = i + 1;
|
|
379
|
+ QString mapName = mapAttributesTable->value(mapIndex);
|
|
380
|
+ QMap<QString, QString>* attrs = mapAttributes->value(mapName);
|
|
381
|
+
|
|
382
|
+ // Find the map attributes object that contains the border data.
|
|
383
|
+ QMap<QString, QString>* attrsWithBorder;
|
|
384
|
+ if (attrs->contains("border_filepath")) {
|
|
385
|
+ attrsWithBorder = attrs;
|
|
386
|
+ } else {
|
|
387
|
+ QStringList labels = attrs->value("shared_attr_maps").split(":");
|
|
388
|
+ for (QString label : labels) {
|
|
389
|
+ label.remove(label.length() - 14, 14);
|
|
390
|
+ if (mapAttributes->contains(label) && mapAttributes->value(label)->contains("border_filepath")) {
|
|
391
|
+ attrsWithBorder = mapAttributes->value(label);
|
|
392
|
+ break;
|
|
393
|
+ }
|
|
394
|
+ }
|
|
395
|
+ }
|
|
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"));
|
|
399
|
+ text += QString("\n");
|
|
400
|
+ }
|
|
401
|
+
|
|
402
|
+ // Find the map attributes object that contains the blockdata.
|
|
403
|
+ QMap<QString, QString>* attrsWithBlockdata;
|
|
404
|
+ if (attrs->contains("blockdata_filepath")) {
|
|
405
|
+ attrsWithBlockdata = attrs;
|
|
406
|
+ } else {
|
|
407
|
+ QStringList labels = attrs->value("shared_attr_maps").split(":");
|
|
408
|
+ for (QString label : labels) {
|
|
409
|
+ label.remove(label.length() - 14, 14);
|
|
410
|
+ if (mapAttributes->contains(label) && mapAttributes->value(label)->contains("blockdata_filepath")) {
|
|
411
|
+ attrsWithBlockdata = mapAttributes->value(label);
|
|
412
|
+ break;
|
|
413
|
+ }
|
|
414
|
+ }
|
|
415
|
+ }
|
|
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"));
|
|
419
|
+ text += QString("\n");
|
|
420
|
+ }
|
|
421
|
+
|
|
422
|
+ text += QString("\t.align 2\n");
|
|
423
|
+ if (attrs->contains("shared_attr_maps")) {
|
|
424
|
+ QStringList labels = attrs->value("shared_attr_maps").split(":");
|
|
425
|
+ for (QString label : labels) {
|
|
426
|
+ text += QString("%1::\n").arg(label);
|
|
427
|
+ }
|
|
428
|
+ } else {
|
|
429
|
+ text += QString("%1::\n").arg(attrs->value("attributes_label"));
|
|
430
|
+ }
|
|
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"));
|
|
437
|
+ text += QString("\n");
|
|
438
|
+ }
|
|
439
|
+
|
|
440
|
+ saveTextFile(getMapAssetsFilepath(), text);
|
|
441
|
+}
|
|
442
|
+
|
|
443
|
+QString Project::getMapAssetsFilepath() {
|
|
444
|
+ return root + "/data/maps/_assets.inc";
|
|
445
|
+}
|
|
446
|
+
|
366
|
447
|
void Project::setNewMapAttributes(Map* map) {
|
367
|
448
|
map->width = "20";
|
368
|
449
|
map->height = "20";
|
|
@@ -400,7 +481,7 @@ Tileset* Project::loadTileset(QString label) {
|
400
|
481
|
}
|
401
|
482
|
|
402
|
483
|
QString Project::getBlockdataPath(Map* map) {
|
403
|
|
- QString text = readTextFile(root + "/data/maps/_assets.inc");
|
|
484
|
+ QString text = readTextFile(getMapAssetsFilepath());
|
404
|
485
|
QStringList *values = getLabelValues(parse(text), map->blockdata_label);
|
405
|
486
|
QString path;
|
406
|
487
|
if (!values->isEmpty()) {
|
|
@@ -412,7 +493,7 @@ QString Project::getBlockdataPath(Map* map) {
|
412
|
493
|
}
|
413
|
494
|
|
414
|
495
|
QString Project::getMapBorderPath(Map *map) {
|
415
|
|
- QString text = readTextFile(root + "/data/maps/_assets.inc");
|
|
496
|
+ QString text = readTextFile(getMapAssetsFilepath());
|
416
|
497
|
QStringList *values = getLabelValues(parse(text), map->border_label);
|
417
|
498
|
QString path;
|
418
|
499
|
if (!values->isEmpty()) {
|
|
@@ -489,6 +570,7 @@ void Project::saveMap(Map *map) {
|
489
|
570
|
|
490
|
571
|
void Project::saveAllDataStructures() {
|
491
|
572
|
saveMapAttributesTable();
|
|
573
|
+ saveAllMapAttributes();
|
492
|
574
|
}
|
493
|
575
|
|
494
|
576
|
void Project::loadTilesetAssets(Tileset* tileset) {
|