38 ind =
static_cast<var8>(data[
"ind"].toDouble());
40 if (data[
"split"].isString())
41 split = data[
"split"].toString();
42 if (data[
"splitAt"].isDouble())
43 splitAt =
static_cast<var8>(data[
"splitAt"].toDouble());
44 if (data[
"setWN"].isDouble())
45 setWN =
static_cast<var8>(data[
"setWN"].toDouble());
46 if (data[
"setES"].isDouble())
47 setES =
static_cast<var8>(data[
"setES"].toDouble());
49 if (data[
"sprites"].isArray())
50 for (
const auto& s : data[
"sprites"].toArray())
60 if (!s) qCritical() <<
"SpriteSetDB: sprite" << name <<
"could not be deep linked.";
67 if (!
toSetWN) qCritical() <<
"SpriteSetDB: setWN" << *
setWN <<
"could not be deep linked.";
74 if (!
toSetES) qCritical() <<
"SpriteSetDB: setES" << *
setES <<
"could not be deep linked.";
91 static SpriteSetDB* _inst =
new SpriteSetDB;
101 if (idx < 0 || idx >= store.size())
return nullptr;
102 return store.at(idx);
107 return ind.value(key,
nullptr);
112 static bool once =
false;
115 for (QJsonValue entry : jsonData.array())
122 static bool once =
false;
124 for (
auto* entry : store)
125 ind.insert(QString::number(entry->ind), entry);
131 static bool once =
false;
133 for (
auto* entry : store)
143void SpriteSetDB::qmlRegister()
const
145 static bool once =
false;
147 qmlRegisterUncreatableType<SpriteSetDB>(
"PSE.DB.SpriteSetDB", 1, 0,
"SpriteSetDB",
"Can't instantiate in QML");
151SpriteSetDB::SpriteSetDB()
const QJsonDocument json(const QString filename) const
Parsed document for filename.
static GameData * inst()
The process-wide GameData singleton.
int getStoreSize() const
Set count.
void deepLink()
Resolve sprites, split neighbours, and maps.
void load()
Load sprite-sets from JSON.
static SpriteSetDB * inst()
< Number of sprite-sets.
const QVector< SpriteSetDBEntry * > getStore() const
All sprite-sets.
const QHash< QString, SpriteSetDBEntry * > getInd() const
Name->entry index.
SpriteSetDBEntry * getStoreAt(int idx) const
Set by store index (for QML).
void index()
Build the name->entry index.
SpriteSetDBEntry * getIndAt(const QString &key) const
Set by name key (for QML).
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
static SpritesDB * inst()
< Number of sprites.
SpriteDBEntry * getIndAt(const QString &key) const
Sprite by name key (for QML).
static void qmlProtectUtil(const QObject *const obj, const QQmlEngine *const engine)
Pin obj to C++ ownership so the QML engine never garbage-collects it.
var8e var8
Everyday 8-bit alias. Exact (not "fastest") to dodge the pointer-width bug noted above.
One sprite-set: the pre-loaded sprite group for an outdoor area.
SpriteSetDBEntry()
Empty entry.
QVector< SpriteDBEntry * > toSprites
Resolved sprites (deepLink).
SpriteSetDBEntry * toSetES
Resolved East/South set (deepLink).
bool isDynamic() const
True if this set is split by coordinate.
void deepLink()
Resolve sprite list + split neighbours + maps.
QVector< SpriteDBEntry * > getSprites(var8 x, var8 y) const
Sprites active at (x,y).
std::optional< var8 > splitAt
Coordinate the set splits at, if dynamic.
QVector< QString > spriteList
Sprite names in this set.
std::optional< var8 > setES
East/South sub-set index, if split.
std::optional< var8 > setWN
West/North sub-set index, if split.
SpriteSetDBEntry * toSetWN
Resolved West/North set (deepLink).
QString split
Split descriptor.