| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- #include "map_catalog.h"
- #include <QDir>
- #include <QFile>
- #include <QFileInfo>
- #include <QJsonArray>
- #include <QJsonDocument>
- #include <QJsonObject>
- #include <QSet>
- #include <QStringList>
- #include <QTimer>
- #include <QVariantMap>
- #include <algorithm>
- namespace Game {
- namespace Map {
- MapCatalog::MapCatalog(QObject *parent) : QObject(parent) {}
- QVariantList MapCatalog::availableMaps() {
- QVariantList list;
- QDir mapsDir(QStringLiteral("assets/maps"));
- if (!mapsDir.exists())
- return list;
- QStringList files =
- mapsDir.entryList(QStringList() << "*.json", QDir::Files, QDir::Name);
- for (const QString &f : files) {
- QString path = mapsDir.filePath(f);
- QFile file(path);
- QString name = f;
- QString desc;
- QSet<int> playerIds;
- if (file.open(QIODevice::ReadOnly)) {
- QByteArray data = file.readAll();
- file.close();
- QJsonParseError err;
- QJsonDocument doc = QJsonDocument::fromJson(data, &err);
- if (err.error == QJsonParseError::NoError && doc.isObject()) {
- QJsonObject obj = doc.object();
- if (obj.contains("name") && obj["name"].isString())
- name = obj["name"].toString();
- if (obj.contains("description") && obj["description"].isString())
- desc = obj["description"].toString();
- if (obj.contains("spawns") && obj["spawns"].isArray()) {
- QJsonArray spawns = obj["spawns"].toArray();
- for (const QJsonValue &spawnVal : spawns) {
- if (spawnVal.isObject()) {
- QJsonObject spawn = spawnVal.toObject();
- if (spawn.contains("playerId")) {
- int playerId = spawn["playerId"].toInt();
- if (playerId > 0) {
- playerIds.insert(playerId);
- }
- }
- }
- }
- }
- }
- }
- QVariantMap entry;
- entry["name"] = name;
- entry["description"] = desc;
- entry["path"] = path;
- entry["playerCount"] = playerIds.size();
- QVariantList playerIdList;
- QList<int> sortedIds = playerIds.values();
- std::sort(sortedIds.begin(), sortedIds.end());
- for (int id : sortedIds) {
- playerIdList.append(id);
- }
- entry["playerIds"] = playerIdList;
- QString thumbnail;
- if (file.open(QIODevice::ReadOnly)) {
- QByteArray data = file.readAll();
- file.close();
- QJsonParseError err;
- QJsonDocument doc = QJsonDocument::fromJson(data, &err);
- if (err.error == QJsonParseError::NoError && doc.isObject()) {
- QJsonObject obj = doc.object();
- if (obj.contains("thumbnail") && obj["thumbnail"].isString()) {
- thumbnail = obj["thumbnail"].toString();
- }
- }
- }
- if (thumbnail.isEmpty()) {
- QString baseName = QFileInfo(f).baseName();
- thumbnail = QString("assets/maps/%1_thumb.png").arg(baseName);
- if (!QFileInfo::exists(thumbnail)) {
- thumbnail = "";
- }
- }
- entry["thumbnail"] = thumbnail;
- list.append(entry);
- }
- return list;
- }
- void MapCatalog::loadMapsAsync() {
- if (m_loading)
- return;
- m_maps.clear();
- m_pendingFiles.clear();
- m_loading = true;
- emit loadingChanged(true);
- QDir mapsDir(QStringLiteral("assets/maps"));
- if (!mapsDir.exists()) {
- m_loading = false;
- emit loadingChanged(false);
- emit allMapsLoaded();
- return;
- }
- m_pendingFiles =
- mapsDir.entryList(QStringList() << "*.json", QDir::Files, QDir::Name);
- if (m_pendingFiles.isEmpty()) {
- m_loading = false;
- emit loadingChanged(false);
- emit allMapsLoaded();
- return;
- }
- QTimer::singleShot(0, this, &MapCatalog::loadNextMap);
- }
- void MapCatalog::loadNextMap() {
- if (m_pendingFiles.isEmpty()) {
- m_loading = false;
- emit loadingChanged(false);
- emit allMapsLoaded();
- return;
- }
- QString fileName = m_pendingFiles.takeFirst();
- QDir mapsDir(QStringLiteral("assets/maps"));
- QString path = mapsDir.filePath(fileName);
- QVariantMap entry = loadSingleMap(path);
- if (!entry.isEmpty()) {
- m_maps.append(entry);
- emit mapLoaded(entry);
- }
- if (!m_pendingFiles.isEmpty()) {
- QTimer::singleShot(10, this, &MapCatalog::loadNextMap);
- } else {
- m_loading = false;
- emit loadingChanged(false);
- emit allMapsLoaded();
- }
- }
- QVariantMap MapCatalog::loadSingleMap(const QString &path) {
- QFile file(path);
- QString name = QFileInfo(path).fileName();
- QString desc;
- QSet<int> playerIds;
- if (file.open(QIODevice::ReadOnly)) {
- QByteArray data = file.readAll();
- file.close();
- QJsonParseError err;
- QJsonDocument doc = QJsonDocument::fromJson(data, &err);
- if (err.error == QJsonParseError::NoError && doc.isObject()) {
- QJsonObject obj = doc.object();
- if (obj.contains("name") && obj["name"].isString())
- name = obj["name"].toString();
- if (obj.contains("description") && obj["description"].isString())
- desc = obj["description"].toString();
- if (obj.contains("spawns") && obj["spawns"].isArray()) {
- QJsonArray spawns = obj["spawns"].toArray();
- for (const QJsonValue &spawnVal : spawns) {
- if (spawnVal.isObject()) {
- QJsonObject spawn = spawnVal.toObject();
- if (spawn.contains("playerId")) {
- int playerId = spawn["playerId"].toInt();
- if (playerId > 0) {
- playerIds.insert(playerId);
- }
- }
- }
- }
- }
- }
- }
- QVariantMap entry;
- entry["name"] = name;
- entry["description"] = desc;
- entry["path"] = path;
- entry["playerCount"] = playerIds.size();
- QVariantList playerIdList;
- QList<int> sortedIds = playerIds.values();
- std::sort(sortedIds.begin(), sortedIds.end());
- for (int id : sortedIds) {
- playerIdList.append(id);
- }
- entry["playerIds"] = playerIdList;
- QString thumbnail;
- if (file.open(QIODevice::ReadOnly)) {
- QByteArray data = file.readAll();
- file.close();
- QJsonParseError err;
- QJsonDocument doc = QJsonDocument::fromJson(data, &err);
- if (err.error == QJsonParseError::NoError && doc.isObject()) {
- QJsonObject obj = doc.object();
- if (obj.contains("thumbnail") && obj["thumbnail"].isString()) {
- thumbnail = obj["thumbnail"].toString();
- }
- }
- }
- if (thumbnail.isEmpty()) {
- QString baseName = QFileInfo(path).baseName();
- thumbnail = QString("assets/maps/%1_thumb.png").arg(baseName);
- if (!QFileInfo::exists(thumbnail)) {
- thumbnail = "";
- }
- }
- entry["thumbnail"] = thumbnail;
- return entry;
- }
- } // namespace Map
- } // namespace Game
|