Pokered Save Editor 2
Pokemon Red & Blue save file editor - Qt 6 C++/QML
Loading...
Searching...
No Matches
spriteSet.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2019 Twilight
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15*/
16
22
23#include <QJsonArray>
24#include <QQmlEngine>
25#include <pse-common/utility.h>
26
27#ifdef QT_DEBUG
28#include <QtDebug>
29#endif
30
31#include "./spriteSet.h"
32#include "./util/gamedata.h"
33#include "./sprites.h"
34
37{
38 ind = static_cast<var8>(data["ind"].toDouble());
39
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());
48
49 if (data["sprites"].isArray())
50 for (const auto& s : data["sprites"].toArray())
51 spriteList.append(s.toString());
52}
53
55{
56 for (const auto& name : spriteList) {
57 auto* s = SpritesDB::inst()->getIndAt(name);
58 toSprites.append(s);
59#ifdef QT_DEBUG
60 if (!s) qCritical() << "SpriteSetDB: sprite" << name << "could not be deep linked.";
61#endif
62 }
63 if (setWN) {
64 toSetWN = const_cast<SpriteSetDBEntry*>(
65 SpriteSetDB::inst()->getIndAt(QString::number(*setWN)));
66#ifdef QT_DEBUG
67 if (!toSetWN) qCritical() << "SpriteSetDB: setWN" << *setWN << "could not be deep linked.";
68#endif
69 }
70 if (setES) {
71 toSetES = const_cast<SpriteSetDBEntry*>(
72 SpriteSetDB::inst()->getIndAt(QString::number(*setES)));
73#ifdef QT_DEBUG
74 if (!toSetES) qCritical() << "SpriteSetDB: setES" << *setES << "could not be deep linked.";
75#endif
76 }
77}
78
79bool SpriteSetDBEntry::isDynamic() const { return ind >= 0xF1; }
80
81QVector<SpriteDBEntry*> SpriteSetDBEntry::getSprites(var8 x, var8 y) const
82{
83 if (!isDynamic()) return toSprites;
84 if (split == "horz")
85 return (y < splitAt) ? toSetWN->toSprites : toSetES->toSprites;
86 return (x < splitAt) ? toSetWN->toSprites : toSetES->toSprites;
87}
88
89SpriteSetDB* SpriteSetDB::inst()
90{
91 static SpriteSetDB* _inst = new SpriteSetDB;
92 return _inst;
93}
94
95const QVector<SpriteSetDBEntry*> SpriteSetDB::getStore() const { return store; }
96const QHash<QString, SpriteSetDBEntry*> SpriteSetDB::getInd() const { return ind; }
97int SpriteSetDB::getStoreSize() const { return store.size(); }
98
100{
101 if (idx < 0 || idx >= store.size()) return nullptr;
102 return store.at(idx);
103}
104
105SpriteSetDBEntry* SpriteSetDB::getIndAt(const QString& key) const
106{
107 return ind.value(key, nullptr);
108}
109
111{
112 static bool once = false;
113 if (once) return;
114 auto jsonData = GameData::inst()->json("spriteSet");
115 for (QJsonValue entry : jsonData.array())
116 store.append(new SpriteSetDBEntry(entry));
117 once = true;
118}
119
121{
122 static bool once = false;
123 if (once) return;
124 for (auto* entry : store)
125 ind.insert(QString::number(entry->ind), entry);
126 once = true;
127}
128
130{
131 static bool once = false;
132 if (once) return;
133 for (auto* entry : store)
134 entry->deepLink();
135 once = true;
136}
137
138void SpriteSetDB::qmlProtect(const QQmlEngine* const engine) const
139{
140 Utility::qmlProtectUtil(this, engine);
141}
142
143void SpriteSetDB::qmlRegister() const
144{
145 static bool once = false;
146 if (once) return;
147 qmlRegisterUncreatableType<SpriteSetDB>("PSE.DB.SpriteSetDB", 1, 0, "SpriteSetDB", "Can't instantiate in QML");
148 once = true;
149}
150
151SpriteSetDB::SpriteSetDB()
152{
153 qmlRegister();
154}
const QJsonDocument json(const QString filename) const
Parsed document for filename.
Definition gamedata.cpp:45
static GameData * inst()
The process-wide GameData singleton.
Definition gamedata.cpp:71
int getStoreSize() const
Set count.
Definition spriteSet.cpp:97
void deepLink()
Resolve sprites, split neighbours, and maps.
void load()
Load sprite-sets from JSON.
static SpriteSetDB * inst()
< Number of sprite-sets.
Definition spriteSet.cpp:89
const QVector< SpriteSetDBEntry * > getStore() const
All sprite-sets.
Definition spriteSet.cpp:95
const QHash< QString, SpriteSetDBEntry * > getInd() const
Name->entry index.
Definition spriteSet.cpp:96
SpriteSetDBEntry * getStoreAt(int idx) const
Set by store index (for QML).
Definition spriteSet.cpp:99
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.
Definition sprites.cpp:36
SpriteDBEntry * getIndAt(const QString &key) const
Sprite by name key (for QML).
Definition sprites.cpp:52
static void qmlProtectUtil(const QObject *const obj, const QQmlEngine *const engine)
Pin obj to C++ ownership so the QML engine never garbage-collects it.
Definition utility.cpp:63
var8e var8
Everyday 8-bit alias. Exact (not "fastest") to dodge the pointer-width bug noted above.
Definition types.h:124
One sprite-set: the pre-loaded sprite group for an outdoor area.
Definition spriteSet.h:47
SpriteSetDBEntry()
Empty entry.
Definition spriteSet.cpp:35
QVector< SpriteDBEntry * > toSprites
Resolved sprites (deepLink).
Definition spriteSet.h:59
SpriteSetDBEntry * toSetES
Resolved East/South set (deepLink).
Definition spriteSet.h:66
bool isDynamic() const
True if this set is split by coordinate.
Definition spriteSet.cpp:79
void deepLink()
Resolve sprite list + split neighbours + maps.
Definition spriteSet.cpp:54
QVector< SpriteDBEntry * > getSprites(var8 x, var8 y) const
Sprites active at (x,y).
Definition spriteSet.cpp:81
std::optional< var8 > splitAt
Coordinate the set splits at, if dynamic.
Definition spriteSet.h:61
QVector< QString > spriteList
Sprite names in this set.
Definition spriteSet.h:58
std::optional< var8 > setES
East/South sub-set index, if split.
Definition spriteSet.h:63
std::optional< var8 > setWN
West/North sub-set index, if split.
Definition spriteSet.h:62
var8 ind
Set index.
Definition spriteSet.h:55
SpriteSetDBEntry * toSetWN
Resolved West/North set (deepLink).
Definition spriteSet.h:65
QString split
Split descriptor.
Definition spriteSet.h:56