Pokered Save Editor 2
Pokemon Red & Blue save file editor - Qt 6 C++/QML
Loading...
Searching...
No Matches
db.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2020 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 <QQmlEngine>
24#include <QElapsedTimer>
25#include <QDebug>
26#include <pse-common/utility.h>
27
28// db.h already includes all sub-database headers.
29#include "db.h"
30
31// ── Singleton ────────────────────────────────────────────────────────────────
32
34{
35 static DB* _inst = new DB;
36 return _inst;
37}
38
39// ── Accessors ────────────────────────────────────────────────────────────────
40
41GameData* DB::json() const { return GameData::inst(); }
44EventsDB* DB::events() const { return EventsDB::inst(); }
45Examples* DB::examples() const { return Examples::inst(); }
46Names* DB::names() const { return Names::inst(); }
47FlyDB* DB::fly() const { return FlyDB::inst(); }
48FontsDB* DB::fonts() const { return FontsDB::inst(); }
52ItemsDB* DB::items() const { return ItemsDB::inst(); }
53MapsDB* DB::maps() const { return MapsDB::inst(); }
55MovesDB* DB::moves() const { return MovesDB::inst(); }
56MusicDB* DB::music() const { return MusicDB::inst(); }
63TmHmsDB* DB::tmHms() const { return TmHmsDB::inst(); }
64TradesDB* DB::trades() const { return TradesDB::inst(); }
66TypesDB* DB::types() const { return TypesDB::inst(); }
67
68// ── Bootstrap ────────────────────────────────────────────────────────────────
69
70DB::DB()
71{
72 initRes();
73 qmlRegister();
74 loadAll();
75 indexAll();
76 deepLinkAll();
77}
78
79void DB::initRes() const
80{
81 Q_INIT_RESOURCE(db);
82}
83
84void DB::qmlRegister() const
85{
86 static bool registered = false;
87 if (registered) return;
88 qmlRegisterUncreatableType<DB>("PSE.DB", 1, 0, "DB", "Can't instantiate in QML");
89 registered = true;
90}
91
92void DB::loadAll() const
93{
94 static bool once = false;
95 if (once) return;
96
97 QElapsedTimer t;
98 t.start();
99 auto lap = [&](const char* name) {
100 qDebug() << "[DB::loadAll]" << name << "—" << t.elapsed() << "ms";
101 t.restart();
102 };
103
104 TypesDB::inst()->load(); lap("TypesDB");
105 SpritesDB::inst()->load(); lap("SpritesDB");
106 MusicDB::inst()->load(); lap("MusicDB");
107 TilesetDB::inst()->load(); lap("TilesetDB");
108 TrainersDB::inst()->load(); lap("TrainersDB");
109 ItemsDB::inst()->load(); lap("ItemsDB");
110 MovesDB::inst()->load(); lap("MovesDB");
111 PokemonDB::inst()->load(); lap("PokemonDB");
112 TmHmsDB::inst()->load(); lap("TmHmsDB");
113 TradesDB::inst()->load(); lap("TradesDB");
114 StarterPokemonDB::inst()->load(); lap("StarterPokemonDB");
115 SpriteSetDB::inst()->load(); lap("SpriteSetDB");
116 ScriptsDB::inst()->load(); lap("ScriptsDB");
117 Examples::inst(); lap("Examples");
118 Names::inst(); lap("Names");
119 CreditsDB::inst()->load(); lap("CreditsDB");
120 EventPokemonDB::inst()->load(); lap("EventPokemonDB");
121 EventsDB::inst()->load(); lap("EventsDB");
122 FlyDB::inst()->load(); lap("FlyDB");
123 FontsDB::inst()->load(); lap("FontsDB");
124 GameCornerDB::inst()->load(); lap("GameCornerDB");
125 HiddenCoinsDB::inst()->load(); lap("HiddenCoinsDB");
126 HiddenItemsDB::inst()->load(); lap("HiddenItemsDB");
127 MapsDB::inst()->load(); lap("MapsDB");
128 MissablesDB::inst()->load(); lap("MissablesDB");
129
130 once = true;
131}
132
133void DB::indexAll() const
134{
135 static bool once = false;
136 if (once) return;
137
138 QElapsedTimer t;
139 t.start();
140 auto lap = [&](const char* name) {
141 qDebug() << "[DB::indexAll]" << name << "—" << t.elapsed() << "ms";
142 t.restart();
143 };
144
145 TypesDB::inst()->index(); lap("TypesDB");
146 SpritesDB::inst()->index(); lap("SpritesDB");
147 MusicDB::inst()->index(); lap("MusicDB");
148 TilesetDB::inst()->index(); lap("TilesetDB");
149 TrainersDB::inst()->index(); lap("TrainersDB");
150 ItemsDB::inst()->index(); lap("ItemsDB");
151 MovesDB::inst()->index(); lap("MovesDB");
152 PokemonDB::inst()->index(); lap("PokemonDB");
153 SpriteSetDB::inst()->index(); lap("SpriteSetDB");
154 ScriptsDB::inst()->index(); lap("ScriptsDB");
155 EventsDB::inst()->index(); lap("EventsDB");
156 FlyDB::inst()->index(); lap("FlyDB");
157 FontsDB::inst()->index(); lap("FontsDB");
158 MapsDB::inst()->index(); lap("MapsDB");
159 MissablesDB::inst()->index(); lap("MissablesDB");
160
161 once = true;
162}
163
164void DB::deepLinkAll() const
165{
166 static bool once = false;
167 if (once) return;
168
169 QElapsedTimer t;
170 t.start();
171 auto lap = [&](const char* name) {
172 qDebug() << "[DB::deepLinkAll]" << name << "—" << t.elapsed() << "ms";
173 t.restart();
174 };
175
176 MovesDB::inst()->deepLink(); lap("MovesDB");
177 PokemonDB::inst()->deepLink(); lap("PokemonDB");
178 TmHmsDB::inst()->deepLink(); lap("TmHmsDB");
179 TradesDB::inst()->deepLink(); lap("TradesDB");
180 StarterPokemonDB::inst()->deepLink(); lap("StarterPokemonDB");
181 SpriteSetDB::inst()->deepLink(); lap("SpriteSetDB");
182 ScriptsDB::inst()->deepLink(); lap("ScriptsDB");
183 EventsDB::inst()->deepLink(); lap("EventsDB");
184 FlyDB::inst()->deepLink(); lap("FlyDB");
185 GameCornerDB::inst()->deepLink(); lap("GameCornerDB");
186 HiddenCoinsDB::inst()->deepLink(); lap("HiddenCoinsDB");
187 HiddenItemsDB::inst()->deepLink(); lap("HiddenItemsDB");
188}
189
190// ── QML ownership / context ──────────────────────────────────────────────────
191
192void DB::qmlProtect(const QQmlEngine* const engine) const
193{
194 Utility::qmlProtectUtil(this, engine);
195
196 GameData::inst()->qmlProtect(engine);
197 CreditsDB::inst()->qmlProtect(engine);
199 EventsDB::inst()->qmlProtect(engine);
200 Examples::inst()->qmlProtect(engine);
201 Names::inst()->qmlProtect(engine);
202 FlyDB::inst()->qmlProtect(engine);
203 FontsDB::inst()->qmlProtect(engine);
207 ItemsDB::inst()->qmlProtect(engine);
208 MapsDB::inst()->qmlProtect(engine);
209 MissablesDB::inst()->qmlProtect(engine);
210 MovesDB::inst()->qmlProtect(engine);
211 MusicDB::inst()->qmlProtect(engine);
212 PokemonDB::inst()->qmlProtect(engine);
213 ScriptsDB::inst()->qmlProtect(engine);
214 SpriteSetDB::inst()->qmlProtect(engine);
215 SpritesDB::inst()->qmlProtect(engine);
217 TilesetDB::inst()->qmlProtect(engine);
218 TmHmsDB::inst()->qmlProtect(engine);
219 TradesDB::inst()->qmlProtect(engine);
220 TrainersDB::inst()->qmlProtect(engine);
221 TypesDB::inst()->qmlProtect(engine);
222}
223
224void DB::qmlHook(QQmlContext* const context) const
225{
226 // For some reason this demands it not be const
227 context->setContextProperty("pseDB", const_cast<DB*>(this));
228}
229
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
void load()
Load entries from loadFile.
void deepLink()
Resolve each entry's cross-DB links.
The credits/attribution database – and the canonical example of the "DB singleton" pattern every data...
Definition creditsdb.h:49
void load()
Load entries from the JSON assets.
Definition creditsdb.cpp:60
static CreditsDB * inst()
< Number of credit entries.
Definition creditsdb.cpp:33
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership (anti-GC).
Definition creditsdb.cpp:78
StarterPokemonDB * starters() const
The starters database (backs starters).
Definition db.cpp:61
SpriteSetDB * spriteSets() const
The sprite-sets database (backs spriteSets).
Definition db.cpp:59
void qmlHook(QQmlContext *const context) const
Install this DB into a QML context (exposes the db root).
Definition db.cpp:224
HiddenCoinsDB * hiddenCoins() const
The hidden-coins database (backs hiddenCoins).
Definition db.cpp:50
HiddenItemsDB * hiddenItems() const
The hidden-items database (backs hiddenItems).
Definition db.cpp:51
MissablesDB * missables() const
The missables database (backs missables).
Definition db.cpp:54
CreditsDB * credits() const
The credits database (backs credits).
Definition db.cpp:42
Examples * examples() const
The examples database (backs examples).
Definition db.cpp:45
TrainersDB * trainers() const
The trainers database (backs trainers).
Definition db.cpp:65
SpritesDB * sprites() const
The sprites database (backs sprites).
Definition db.cpp:60
void qmlProtect(const QQmlEngine *const engine) const
Pin the DB aggregate (and every sub-DB) to C++ ownership so QML never GCs them.
Definition db.cpp:192
FontsDB * fonts() const
The fonts database (backs fonts).
Definition db.cpp:48
TmHmsDB * tmHms() const
The TM/HM database (backs tmHms).
Definition db.cpp:63
EventPokemonDB * eventPokemon() const
The event-Pokemon database (backs eventPokemon).
Definition db.cpp:43
TradesDB * trades() const
The trades database (backs trades).
Definition db.cpp:64
TilesetDB * tilesets() const
The tilesets database (backs tilesets).
Definition db.cpp:62
MovesDB * moves() const
The moves database (backs moves).
Definition db.cpp:55
MapsDB * maps() const
The maps database (backs maps).
Definition db.cpp:53
EventsDB * events() const
The events database (backs events).
Definition db.cpp:44
GameCornerDB * gameCorner() const
The Game Corner database (backs gameCorner).
Definition db.cpp:49
TypesDB * types() const
The types database (backs types).
Definition db.cpp:66
GameData * json() const
The GameData JSON source (backs json).
Definition db.cpp:41
PokemonDB * pokemon() const
The Pokemon database (backs pokemon).
Definition db.cpp:57
static DB * inst()
< Raw parsed JSON assets behind every DB.
Definition db.cpp:33
MusicDB * music() const
The music database (backs music).
Definition db.cpp:56
FlyDB * fly() const
The fly-destinations database (backs fly).
Definition db.cpp:47
ScriptsDB * scripts() const
The scripts database (backs scripts).
Definition db.cpp:58
ItemsDB * items() const
The items database (backs items).
Definition db.cpp:52
Names * names() const
The names database (backs names).
Definition db.cpp:46
Database of real-world event/distribution Pokemon presets.
void load()
Load event Pokemon from JSON.
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
static EventPokemonDB * inst()
< Number of event Pokemon.
The story-events database – metadata for the 508 event flags, keyed by name.
Definition eventsdb.h:41
void deepLink()
Resolve each event's cross-DB links.
Definition eventsdb.cpp:107
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
Definition eventsdb.cpp:121
void load()
Load events from JSON.
Definition eventsdb.cpp:69
void index()
Build the name->entry index.
Definition eventsdb.cpp:91
static EventsDB * inst()
< Number of event definitions.
Definition eventsdb.cpp:35
Aggregate of the example/preset sources (player, rival, Pokemon).
Definition examples.h:36
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
Definition examples.cpp:52
static Examples * inst()
< Example player source.
Definition examples.cpp:31
The fly-destinations database – where Fly can take you, keyed by name.
Definition flydb.h:38
void deepLink()
Resolve each destination's map link.
Definition flydb.cpp:108
void index()
Build the name->entry index.
Definition flydb.cpp:92
static FlyDB * inst()
< Number of fly destinations.
Definition flydb.cpp:36
void load()
Load destinations from JSON.
Definition flydb.cpp:70
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
Definition flydb.cpp:122
The font database – the in-game character set and the text codec.
Definition fontsdb.h:50
static FontsDB * inst()
< Number of font glyphs.
Definition fontsdb.cpp:367
void load()
Load glyphs from JSON.
Definition fontsdb.cpp:32
void index()
Build the name->glyph index.
Definition fontsdb.cpp:54
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
Definition fontsdb.cpp:70
The Game Corner database – prize entries plus the coin exchange rate.
void deepLink()
Resolve each prize's item/Pokemon links.
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
void load()
Load prizes from JSON.
static GameCornerDB * inst()
< Number of prize entries.
The JSON asset loader – the raw data source behind every database.
Definition gamedata.h:36
static GameData * inst()
The process-wide GameData singleton.
Definition gamedata.cpp:71
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
Definition gamedata.cpp:56
The hidden-coins database – AbstractHiddenItemDB loaded from the coins file.
static HiddenCoinsDB * inst()
The process-wide HiddenCoinsDB singleton.
The hidden-items database – AbstractHiddenItemDB loaded from the items file.
static HiddenItemsDB * inst()
The process-wide HiddenItemsDB singleton.
The items database – every item (with prices), keyed by name.
Definition itemsdb.h:36
void load()
Load items from JSON.
Definition itemsdb.cpp:71
static ItemsDB * inst()
< Number of items.
Definition itemsdb.cpp:37
void index()
Build the name->entry index.
Definition itemsdb.cpp:93
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
Definition itemsdb.cpp:129
The maps database – every map and its full layout, keyed by name.
Definition mapsdb.h:41
static MapsDB * inst()
< Number of maps.
Definition mapsdb.cpp:35
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
Definition mapsdb.cpp:112
void index()
Build the name->map index.
Definition mapsdb.cpp:78
void load()
Load maps from JSON.
Definition mapsdb.cpp:56
The missables database – metadata for the missable-sprite flags, keyed by name.
Definition missablesdb.h:36
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
void index()
Build the name->entry index.
static MissablesDB * inst()
< Number of missable definitions.
void load()
Load missables from JSON.
The moves database – every move, keyed by name.
Definition moves.h:82
void load()
Load moves from JSON.
Definition moves.cpp:93
void deepLink()
Resolve every move's cross-DB links.
Definition moves.cpp:117
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
Definition moves.cpp:126
void index()
Build the name->entry index.
Definition moves.cpp:103
static MovesDB * inst()
< Number of moves.
Definition moves.cpp:72
The music database – every track, keyed by name.
Definition music.h:57
void load()
Load tracks from JSON.
Definition music.cpp:58
void index()
Build the name->entry index.
Definition music.cpp:68
static MusicDB * inst()
< Number of tracks.
Definition music.cpp:37
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
Definition music.cpp:79
Small aggregate of the two random-name sources (player and Pokemon).
Definition names.h:35
static Names * inst()
< Random player-name source.
Definition names.cpp:29
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
Definition names.cpp:45
The Pokemon database – all 151 species, keyed by name.
Definition pokemon.h:147
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
Definition pokemon.cpp:237
static PokemonDB * inst()
< Number of species.
Definition pokemon.cpp:183
void deepLink()
Resolve every species' cross-reference web.
Definition pokemon.cpp:228
void index()
Build the name->species index.
Definition pokemon.cpp:214
void load()
Load species from JSON.
Definition pokemon.cpp:204
The map-scripts database, keyed by name.
Definition scripts.h:63
void deepLink()
Resolve each script's map links.
Definition scripts.cpp:109
void load()
Load scripts from JSON.
Definition scripts.cpp:88
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
Definition scripts.cpp:118
static ScriptsDB * inst()
< Number of scripts.
Definition scripts.cpp:67
void index()
Build the name->entry index.
Definition scripts.cpp:98
The sprite-sets database, keyed by name.
Definition spriteSet.h:79
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
void index()
Build the name->entry index.
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
The sprites database, keyed by name.
Definition sprites.h:56
static SpritesDB * inst()
< Number of sprites.
Definition sprites.cpp:36
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
Definition sprites.cpp:78
void load()
Load sprites from JSON.
Definition sprites.cpp:57
void index()
Build the name->entry index.
Definition sprites.cpp:67
The curated list of "good starter" species, for the randomizer.
static StarterPokemonDB * inst()
< Number of starter choices.
void load()
Load the starter list from JSON.
void deepLink()
Resolve the names to species entries.
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
The tilesets database, keyed by name.
Definition tileset.h:75
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
Definition tileset.cpp:98
void load()
Load tilesets from JSON.
Definition tileset.cpp:77
static TilesetDB * inst()
< Number of tilesets.
Definition tileset.cpp:56
void index()
Build the name->entry index.
Definition tileset.cpp:87
The TM/HM database – the ordered list of TM/HM moves and their items.
Definition tmHm.h:41
void load()
Load the TM/HM list from JSON.
Definition tmHm.cpp:46
static TmHmsDB * inst()
< Number of TMs+HMs.
Definition tmHm.cpp:35
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
Definition tmHm.cpp:75
void deepLink()
Resolve the parallel item/move vectors.
Definition tmHm.cpp:56
The in-game trades database.
Definition trades.h:61
void deepLink()
Resolve each trade's species links.
Definition trades.cpp:81
static TradesDB * inst()
< Number of trades.
Definition trades.cpp:56
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
Definition trades.cpp:90
void load()
Load trades from JSON.
Definition trades.cpp:71
The trainers database – every trainer class, keyed by name.
Definition trainers.h:58
void index()
Build the name->entry index.
Definition trainers.cpp:69
static TrainersDB * inst()
< Number of trainer classes.
Definition trainers.cpp:38
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
Definition trainers.cpp:80
void load()
Load trainers from JSON.
Definition trainers.cpp:59
The types database – the type list, keyed by name.
Definition types.h:59
void load()
Load types from JSON.
Definition types.cpp:58
static TypesDB * inst()
< Number of types.
Definition types.cpp:37
void index()
Build the name->entry index.
Definition types.cpp:68
void qmlProtect(const QQmlEngine *const engine) const
Pin to C++ ownership.
Definition types.cpp:80
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