Pokered Save Editor 2
Pokemon Red & Blue save file editor - Qt 6 C++/QML
Loading...
Searching...
No Matches
pokemonbox.h
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#pragma once
17
18#include <QObject>
19#include <QVector>
20#include <QString>
21#include <pse-common/types.h>
23
24// PlayerBasics is used as a slot/Q_INVOKABLE parameter below; include the full
25// type so its QMetaType resolves now that it is no longer
26// Q_DECLARE_OPAQUE_POINTER'd.
28
29class SaveFile;
31struct PokemonDBEntry;
32class PokemonDB;
33struct MoveDBEntry;
34class PlayerBasics;
35
42struct SAVEFILE_AUTOPORT PokemonStats : public QObject
43{
44 Q_OBJECT
45 Q_ENUMS(PokemonStats_)
46
47public:
56};
57
58// Natures were not in gen 1 but Pokemon has released a formula for determining
59// gen 1 natures mainly for bank on the virtual console
101
106struct SAVEFILE_AUTOPORT PokemonRandom : public QObject
107{
108 Q_OBJECT
109 Q_ENUMS(PokemonRandom_)
110
111public:
119};
120
121class PokemonBox;
122
132class SAVEFILE_AUTOPORT PokemonMove : public QObject
133{
134 Q_OBJECT
135
136 Q_PROPERTY(int moveID MEMBER moveID NOTIFY moveIDChanged)
137 Q_PROPERTY(int pp MEMBER pp NOTIFY ppChanged)
138 Q_PROPERTY(int ppUp MEMBER ppUp NOTIFY ppUpChanged)
139
140 Q_PROPERTY(bool isMaxPP READ isMaxPP NOTIFY ppCapChanged)
141 Q_PROPERTY(int getMaxPP READ getMaxPP NOTIFY ppCapChanged)
142 Q_PROPERTY(bool isMaxPpUps READ isMaxPpUps NOTIFY ppCapChanged)
143
144 Q_PROPERTY(bool isInvalid READ isInvalid NOTIFY moveIDChanged)
145 Q_PROPERTY(bool isDuplicateMove READ isDuplicateMove NOTIFY moveIDChanged)
146 Q_PROPERTY(QString moveType READ moveType NOTIFY moveIDChanged)
147
148public:
150 PokemonMove(PokemonBox* parentMon, var8 move = 0, var8 pp = 0, var8 ppUp = 0);
151
153
154 bool isMaxPP();
155 int getMaxPP();
156 bool isMaxPpUps();
157 bool isInvalid();
158
159 QString moveType();
160
161 void onMoveIdChanged();
162
163 QVector<int> allValidMoves();
164 QVector<int> validMovesLeft();
165 bool isDuplicateMove();
166
167signals:
169 void ppChanged();
173
174public slots:
175 void randomize();
176 void maxPpUp();
177 void raisePpUp();
178 void lowerPpUp();
179 void resetPpUp();
180 void restorePP();
181 void changeMove(int move = 0, int pp = 0, int ppUp = 0);
182 void correctMove();
183
184public:
185 int moveID;
186 int pp;
187 int ppUp;
189};
190
191constexpr var8 maxMoves = 4;
192constexpr var8 maxDV = 4;
193
212class SAVEFILE_AUTOPORT PokemonBox : public QObject
213{
214 Q_OBJECT
215
216 Q_PROPERTY(int species MEMBER species NOTIFY speciesChanged)
217 Q_PROPERTY(int hp MEMBER hp NOTIFY hpChanged)
218 Q_PROPERTY(int level MEMBER level NOTIFY levelChanged)
219 Q_PROPERTY(int status MEMBER status NOTIFY statusChanged)
220 Q_PROPERTY(int type1 MEMBER type1 NOTIFY type1Changed)
221 Q_PROPERTY(int type2 MEMBER type2 NOTIFY type2Changed)
222 Q_PROPERTY(int catchRate MEMBER catchRate NOTIFY catchRateChanged)
223 Q_PROPERTY(int otID MEMBER otID NOTIFY otIDChanged)
224 Q_PROPERTY(unsigned int exp MEMBER exp NOTIFY expChanged)
225 Q_PROPERTY(int hpExp MEMBER hpExp NOTIFY hpExpChanged)
226 Q_PROPERTY(int atkExp MEMBER atkExp NOTIFY atkExpChanged)
227 Q_PROPERTY(int defExp MEMBER defExp NOTIFY defExpChanged)
228 Q_PROPERTY(int spdExp MEMBER spdExp NOTIFY spdExpChanged)
229 Q_PROPERTY(int spExp MEMBER spExp NOTIFY spExpChanged)
230 Q_PROPERTY(QString otName MEMBER otName NOTIFY otNameChanged)
231 Q_PROPERTY(QString nickname MEMBER nickname NOTIFY nicknameChanged)
232 Q_PROPERTY(bool type2Explicit MEMBER type2Explicit NOTIFY type2ExplicitChanged)
233
234 Q_PROPERTY(bool isValidBool READ isValidBool NOTIFY speciesChanged)
235 Q_PROPERTY(unsigned int expLevelRangeStart READ expLevelRangeStart NOTIFY expRangeChanged)
236 Q_PROPERTY(unsigned int expLevelRangeEnd READ expLevelRangeEnd NOTIFY expRangeChanged)
237 Q_PROPERTY(float expLevelRangePercent READ expLevelRangePercent NOTIFY expRangeChanged)
238
239 Q_PROPERTY(int hpDV READ hpDV NOTIFY dvChanged)
240 Q_PROPERTY(int hpStat READ hpStat NOTIFY statChanged)
241
242 Q_PROPERTY(bool isAfflicted READ isAfflicted NOTIFY statusChanged)
243 Q_PROPERTY(bool isHealed READ isHealed NOTIFY healedChanged)
244 Q_PROPERTY(bool isMaxHp READ isMaxHp NOTIFY statChanged)
245 Q_PROPERTY(bool hasNickname READ hasNickname NOTIFY hasNicknameChanged)
246
247 Q_PROPERTY(bool hasEvolution READ hasEvolution NOTIFY speciesChanged)
248 Q_PROPERTY(bool hasDeEvolution READ hasDeEvolution NOTIFY speciesChanged)
249 Q_PROPERTY(bool isMaxLevel READ isMaxLevel NOTIFY levelChanged)
250 Q_PROPERTY(bool isMaxPP READ isMaxPP NOTIFY movesChanged)
251 Q_PROPERTY(bool isMaxPpUps READ isMaxPpUps NOTIFY movesChanged)
252 Q_PROPERTY(bool isMaxEVs READ isMaxEVs NOTIFY evChanged)
253 Q_PROPERTY(bool isMinEvs READ isMinEvs NOTIFY evChanged)
254 Q_PROPERTY(bool isMaxDVs READ isMaxDVs NOTIFY dvChanged)
255 Q_PROPERTY(bool isMinDVs READ isMinDVs NOTIFY dvChanged)
256 Q_PROPERTY(bool isPokemonReset READ isPokemonReset NOTIFY pokemonResetChanged)
257 Q_PROPERTY(bool isMaxedOut READ isMaxedOut NOTIFY pokemonResetChanged)
258 Q_PROPERTY(bool isCorrected READ isCorrected NOTIFY pokemonResetChanged)
259
260 Q_PROPERTY(bool isShiny READ isShiny NOTIFY dvChanged)
261 Q_PROPERTY(int getNature READ getNature NOTIFY expChanged)
262
263 Q_PROPERTY(int atkStat READ atkStat NOTIFY statChanged)
264 Q_PROPERTY(int defStat READ defStat NOTIFY statChanged)
265 Q_PROPERTY(int spdStat READ spdStat NOTIFY statChanged)
266 Q_PROPERTY(int spStat READ spStat NOTIFY statChanged)
267
268 Q_PROPERTY(int dexNum READ dexNum NOTIFY speciesChanged)
269 Q_PROPERTY(QString speciesName READ speciesName NOTIFY speciesChanged)
270
271public:
275 PokemonBox(SaveFile* saveFile = nullptr,
276 var16 startOffset = 0,
277 var16 nicknameStartOffset = 0,
278 var16 otNameStartOffset = 0,
279 var8 index = 0,
280 var8 recordSize = 0x21);
281
282 virtual ~PokemonBox();
283
285 virtual SaveFileIterator* load(SaveFile* saveFile = nullptr,
286 var16 startOffset = 0,
287 var16 nicknameStartOffset = 0,
288 var16 otNameStartOffset = 0,
289 var8 index = 0,
290
291 // Unless overridden, the record size for box data is 0x21
292 var8 recordSize = 0x21);
293
295 virtual SaveFileIterator* save(SaveFile* saveFile = nullptr,
296 var16 startOffset = 0,
297 svar32 speciesStartOffset = 0, // -1 if doesn't exist
298 var16 nicknameStartOffset = 0,
299 var16 otNameStartOffset = 0,
300 var8 index = 0,
301
302 // Unless overridden, the record size for box data is 0x21
303 var8 recordSize = 0x21);
304
305 // Creates a new Pokemon without a nickname and, if a saveFile is provided,
306 // not traded. Depending on the species everything else is filled out
307 // accordingly such as the chosen species type, catch rate, and initial moves.
308 // It's level will be level 5. The random species chosen depends.
309
310 // The first overloaded method allows you to get a random a species.
311 // One of the 3 starters, A pokemon that feels "startery", any Pokemon from
312 // the Pokedex, or any Pokemon at all including MissingNo's and glitch Pokemon
313
314 // A "startery" Pokemon is one that's not legendary, a base evolution and
315 // feels "startery"
316
317 // The second overloaded method allows you to give a data record which will be
318 // used.
320 static PokemonBox* newPokemon(PokemonDBEntry* pkmnData, PlayerBasics* basics = nullptr);
321
322 // Is this a valid Pokemon? (Is it even in the Pokedex?)
324 bool isValidBool();
325
326 Q_INVOKABLE unsigned int levelToExp(int level = -1);
327 unsigned int expLevelRangeStart();
328 unsigned int expLevelRangeEnd();
329 float expLevelRangePercent();
330
331 int hpDV(); // Get HP DV
332 int hpStat(); // Get HP Stat
333 Q_INVOKABLE int nonHpStat(PokemonStats::PokemonStats_ stat); // Get Non-HP Stat
334
335 // Performs Pokecenter Heal
336 bool isAfflicted();
337 bool isHealed();
338 bool isMaxHp();
339 bool hasNickname();
340 Q_INVOKABLE bool hasTradeStatus(PlayerBasics* basics = nullptr);
341
342 bool hasEvolution();
343 bool hasDeEvolution();
344 bool isMaxLevel();
345 bool isMaxPP();
346 bool isMaxPpUps();
347 bool isMaxEVs();
348 bool isMinEvs();
349 bool isMaxDVs();
350 bool isMinDVs();
351 bool isPokemonReset();
352
353 bool isMaxedOut();
354 bool isCorrected();
355
356 int dexNum();
357 QString speciesName();
358
359 // Gen 1 does not have shinies or natures
360 // However Pokemon has released a formula for determining them in gen 1
361 // This mainly applies to the bank for the virtual consoles
362
363 // It's important to note that this program is not designed or intended
364 // to be used to modify vc versions especially for bank. If you choose to
365 // use it for that then I take no responsibility for any reprocussions
366 // Any issues that may come up from using it for that I'm not going to fix
367 // because that's not the purpose of this program
368 bool isShiny();
369 int getNature(); // Use nature enum
370
371 virtual void copyFrom(PokemonBox* pkmn);
373
374 int atkStat();
375 int defStat();
376 int spdStat();
377 int spStat();
378
379 int movesCount();
380 int movesMax();
381 Q_INVOKABLE PokemonMove* movesAt(int ind);
382
383 int dvCount();
384 Q_INVOKABLE int dvAt(int ind);
385 Q_INVOKABLE void dvSet(int ind, int val);
386
387signals:
389 void hpChanged();
402 void dvChanged();
407
412 void evChanged();
413
415
416public slots:
417 virtual void reset();
418 virtual void randomize(PlayerBasics* basics = nullptr);
419 void clearMoves();
420 void resetExp();
421
422 // Re-calculate stats and resetting them to updated values
423 // HP and Exp are optional because their values will be lost if updated
424 // Type needs to be updated in certain cases but not always
427 virtual void update(bool resetHp = false,
428 bool resetExp = false,
429 bool resetType = false,
430 bool resetCatchRate = false,
431 bool correctMoves = false);
432
436 Q_INVOKABLE void correctTypes();
437
438 void heal();
439
440 // Remove or Randomize nickname/ OT Data
441 // Removing requires saveFile
442 void changeName(bool removeNickname = false);
443 void changeOtData(bool removeOtData = false, PlayerBasics* basics = nullptr);
444 void changeTrade(bool removeTradeStatus = false, PlayerBasics* basics = nullptr);
445
446 void evolve();
447 void deEvolve();
448 void maxLevel();
449 void maxPpUps();
450 void maxEVs();
451 void resetEVs();
452 void reRollEVs();
453 void maxDVs();
454 void reRollDVs();
455 void resetDVs();
456 void maxOut();
457 void randomizeMoves();
458 void resetPokemon();
459 void rollShiny();
460 void rollNonShiny();
461 void makeShiny();
462 void unmakeShiny();
463 void setNature(int nature); // Use nature enum
464 void cleanupMoves();
465 void correctMoves();
466
467 // It's critical that party mon are not added into box mon and vice-versa
468 // This directly says if the class SAVEFILE_AUTOPORT is actually has the extra party mon data
469 // and methods or if it's a pure box mon
470 // Box mon have to be in box data and party mon have to be in party data
471 virtual bool isBoxMon();
472
473 void changeMove(int ind, int moveID = 0, int pp = 0, int ppUp = 0);
474
477 Q_INVOKABLE void deleteMoveAt(int ind);
478
481 Q_INVOKABLE void clearMovesButFirst();
482
486 Q_INVOKABLE void correctMoveAt(int ind);
487
495 Q_INVOKABLE void reorderMove(int from, int to);
496
497 void manualSpeciesChanged();
498 void manualLevelChanged();
499
500public:
502 int hp;
503 int level;
504 int status;
505 int type1;
506 int type2;
508 int otID;
509 unsigned int exp;
510 int hpExp;
511 int atkExp;
512 int defExp;
513 int spdExp;
514 int spExp;
516 QString otName;
517 QString nickname;
518
520
521 // Sometimes type 2 is a duplicate of type 1 and
522 // sometimes it's explicitly 0xFF, this is which one
523
524 // Honestly this all started because I tried to load up a played through SAV
525 // file from someone else which I didn't realize was tampered with. This was
526 // one of the changes I made. After i realized it was tampered with I regret
527 // adding in this feature because the real SAV file only saves types one way
528 // never one or the other. Basically I've forgotten how the real save file
529 // saves them so I leave it in.
531};
The trainer's headline values: name, ID, money, coins, badges, starter.
A single Pokemon record – the most property-rich object in the tree.
Definition pokemonbox.h:213
PokemonMove * movesAt(int ind)
Move slot ind (GC-protected return).
bool isMaxPpUps()
All moves at max PP-Ups.
PokemonMove * moves[4]
The four move slots.
Definition pokemonbox.h:519
void rollShiny()
Randomize DVs until shiny.
void rollNonShiny()
Randomize DVs until not shiny.
void hpExpChanged()
void resetDVs()
Zero all DVs.
void type2ExplicitChanged()
void levelChanged()
void expChanged()
void heal()
Pokecenter heal: full HP, clear status.
bool isValidBool()
Convenience bool form of isValid().
int dvAt(int ind)
DV value at ind.
void reRollDVs()
Randomize DVs.
void movesChanged()
void manualLevelChanged()
UI hook: level edited directly.
virtual void randomize(PlayerBasics *basics=nullptr)
Randomize this Pokemon (constrained).
void dvSet(int ind, int val)
Set DV ind.
void makeShiny()
Force DVs to a shiny combination.
bool isHealed()
Fully healed (HP + status). (heal() performs a Pokecenter heal.).
bool isMinEvs()
All stat-exp zero.
bool hasEvolution()
Species can evolve.
void expRangeChanged()
void reorderMove(int from, int to)
Reorder the filled move slots: take the move at from and re-insert it before slot to (drop-slot conve...
void resetEVs()
Zero all stat-exp.
int dvCount()
Number of stored DVs (maxDV).
void healedChanged()
bool hasDeEvolution()
Species has a pre-evolution.
int spdStat()
Computed Speed stat.
unsigned int expLevelRangeStart()
EXP at the start of the current level.
void maxLevel()
Set to level 100.
unsigned int exp
Definition pokemonbox.h:509
void otIDChanged()
void type2Changed()
void defExpChanged()
void evolve()
Evolve to the next species.
void cleanupMoves()
Remove invalid/duplicate moves.
bool hasTradeStatus(PlayerBasics *basics=nullptr)
Counts as traded relative to basics.
bool isMaxHp()
HP equals computed max.
bool isMaxedOut()
Level/EV/DV/PP all maxed.
void evChanged()
protected::void speciesChanged()
int spStat()
Computed Special stat.
virtual void update(bool resetHp=false, bool resetExp=false, bool resetType=false, bool resetCatchRate=false, bool correctMoves=false)
Recompute derived stats.
void changeMove(int ind, int moveID=0, int pp=0, int ppUp=0)
Set move slot ind.
QString nickname
Definition pokemonbox.h:517
void pokemonResetChanged()
QString otName
Definition pokemonbox.h:516
virtual SaveFileIterator * save(SaveFile *saveFile=nullptr, var16 startOffset=0, svar32 speciesStartOffset=0, var16 nicknameStartOffset=0, var16 otNameStartOffset=0, var8 index=0, var8 recordSize=0x21)
Flatten one Pokemon back to the save.
unsigned int levelToExp(int level=-1)
EXP needed for level (current level if -1).
void resetExp()
Reset EXP to the current level's baseline.
void randomizeMoves()
Randomize the move set.
int dexNum()
Pokedex number.
void correctTypes()
Reset type1/type2 to this species' DB-default type(s) (e.g.
void maxOut()
Max level/EV/DV/PP at once.
void catchRateChanged()
void manualSpeciesChanged()
UI hook: species edited directly.
void changeName(bool removeNickname=false)
Randomize or (if true) remove the nickname.
void hpChanged()
void correctMoves()
Repair move/PP inconsistencies.
void spExpChanged()
void statChanged()
void clearMoves()
Empty all move slots.
void nicknameChanged()
void changeTrade(bool removeTradeStatus=false, PlayerBasics *basics=nullptr)
Toggle traded status.
void otNameChanged()
void unmakeShiny()
Force DVs to a non-shiny combination.
int movesCount()
Number of non-empty move slots.
void hasNicknameChanged()
void reRollEVs()
Randomize stat-exp.
void clearMovesButFirst()
Remove every move except the first one (slots 1..3 cleared).
bool isPokemonReset()
Matches the reset baseline.
void statusChanged()
virtual SaveFileIterator * load(SaveFile *saveFile=nullptr, var16 startOffset=0, var16 nicknameStartOffset=0, var16 otNameStartOffset=0, var8 index=0, var8 recordSize=0x21)
Expand one Pokemon from the save.
PokemonDBEntry * toData()
The species' DB entry for this mon.
PokemonDBEntry * isValid()
The species' DB entry, or null if not a real Pokedex species.
bool type2Explicit
Definition pokemonbox.h:530
unsigned int expLevelRangeEnd()
EXP at the next level.
virtual void copyFrom(PokemonBox *pkmn)
Deep-copy another mon's values into this one.
void correctMoveAt(int ind)
Make the move in slot ind valid (PokemonMove::correctMove) THEN compact: correctMove can clear an inv...
static PokemonBox * newPokemon(PokemonRandom::PokemonRandom_ list=PokemonRandom::Random_Starters, PlayerBasics *basics=nullptr)
void maxEVs()
Max all stat-exp.
bool isMaxLevel()
Level 100.
bool hasNickname()
Carries a real nickname.
void resetPokemon()
Reset to the baseline state.
void atkExpChanged()
bool isShiny()
Shiny per the VC-era DV formula (see disclaimer above).
void changeOtData(bool removeOtData=false, PlayerBasics *basics=nullptr)
Randomize or remove OT data.
void setNature(int nature)
QString speciesName()
Species display name.
int atkStat()
Computed Attack stat.
void deleteMoveAt(int ind)
Delete the move in slot ind, then compact so there is no gap in the move list (the slots after it sli...
void deEvolve()
Revert to the prior species.
float expLevelRangePercent()
Fractional progress through the level.
var8 dv[maxDV]
Stored DVs (Atk/Def/Spd/Spc); HP DV is derived.
Definition pokemonbox.h:515
void spdExpChanged()
void maxDVs()
Max all DVs.
void dvChanged()
virtual bool isBoxMon()
True for a pure box mon; PokemonParty overrides to false.
void maxPpUps()
Max every move's PP-Ups.
int defStat()
Computed Defense stat.
bool isMaxDVs()
All DVs maxed.
int nonHpStat(PokemonStats::PokemonStats_ stat)
PokemonBox(SaveFile *saveFile=nullptr, var16 startOffset=0, var16 nicknameStartOffset=0, var16 otNameStartOffset=0, var8 index=0, var8 recordSize=0x21)
< Species id (raw save value).
bool isCorrected()
Values internally consistent (see correct* slots).
bool isMaxEVs()
All stat-exp maxed.
void type1Changed()
virtual void reset()
Blank this Pokemon.
int movesMax()
Move-slot capacity (maxMoves).
bool isAfflicted()
Has any status condition.
bool isMinDVs()
All DVs zero.
bool isMaxPP()
All moves at max PP.
The Pokemon database – all 151 species, keyed by name.
Definition pokemon.h:147
One of a Pokemon's four move slots: move id, PP, and PP-Ups.
Definition pokemonbox.h:133
int pp
Current PP (backs property).
Definition pokemonbox.h:186
void ppChanged()
void ppCapChanged()
protected::void moveIDChanged()
void raisePpUp()
+1 PP-Up.
PokemonBox * parentMon
Owning Pokemon (for cross-slot validation).
Definition pokemonbox.h:188
PokemonMove(PokemonBox *parentMon, var8 move=0, var8 pp=0, var8 ppUp=0)
< Move id (indexes the moves DB).
MoveDBEntry * toMove()
Resolve moveID to its DB entry.
bool isMaxPpUps()
Are PP-Ups at max?
void ppUpChanged()
void invalidChanged()
void lowerPpUp()
-1 PP-Up.
QString moveType()
The move's elemental type name.
int moveID
Move id (backs property).
Definition pokemonbox.h:185
QVector< int > validMovesLeft()
Legal moves not already used by the mon.
int getMaxPP()
PP cap for this move given PP-Ups.
void resetPpUp()
PP-Ups to 0.
bool isInvalid()
Is the move id out of range / not a real move?
void randomize()
Pick a random valid move.
void maxPpUp()
Set PP-Ups to max.
bool isDuplicateMove()
Is this move a duplicate within the mon's set?
void onMoveIdChanged()
Recompute derived state after the move id changes.
int ppUp
PP-Ups (backs property).
Definition pokemonbox.h:187
QVector< int > allValidMoves()
Every legal move id for this slot.
void restorePP()
Refill PP to the cap.
bool isMaxPP()
Is current PP at the cap?
void correctMove()
Clamp/repair inconsistent values.
void changeMove(int move=0, int pp=0, int ppUp=0)
Replace this slot's values.
A moving cursor over a SaveFile, layering auto-advancing reads/writes on top of SaveFileToolset.
One loaded save: the raw 32 KB bytes, their expanded object tree, and the tools that move between the...
Definition savefile.h:46
Project-wide fixed-width integer aliases (var8, var16, ...).
svar32e svar32
Signed, exactly 32-bit (shorthand for svar32e).
Definition types.h:111
var8e var8
Everyday 8-bit alias. Exact (not "fastest") to dodge the pointer-width bug noted above.
Definition types.h:124
var16e var16
Everyday 16-bit alias. Exact width to avoid the "fastest" widening bug.
Definition types.h:125
constexpr var8 maxMoves
Move slots per Pokemon.
Definition pokemonbox.h:191
constexpr var8 maxDV
DV entries stored (Atk/Def/Spd/Spc; HP DV is derived).
Definition pokemonbox.h:192
Import/export macro for the savefile library, plus the central list of QObject types kept deliberatel...
#define SAVEFILE_AUTOPORT
Expands to the correct dllexport/dllimport decoration for this library.
One move's static data (type, power, accuracy, PP, TM/HM), with links.
Definition moves.h:46
One species' complete static data – the richest entry in the db layer.
Definition pokemon.h:98
The 25 natures, QML-visible.
Definition pokemonbox.h:67
Scope selector for "new random Pokemon", QML-visible.
Definition pokemonbox.h:107
@ Random_Starters
A "startery"-feeling Pokemon (non-legendary base evo).
Definition pokemonbox.h:115
@ Random_All
Any species at all, including MissingNo / glitch mons.
Definition pokemonbox.h:117
@ Random_Pokedex
Any Pokedex species.
Definition pokemonbox.h:116
@ Random_Starters3
One of the three canonical starters.
Definition pokemonbox.h:114
The five battle stats, in their save/index order, exposed to QML.
Definition pokemonbox.h:43
@ Special
Special (single stat in Gen 1).
Definition pokemonbox.h:53
@ Defense
Physical defense.
Definition pokemonbox.h:51
@ HP
Hit points.
Definition pokemonbox.h:54
@ Attack
Physical attack.
Definition pokemonbox.h:50
@ Speed
Speed.
Definition pokemonbox.h:52