Pokered Save Editor 2
Pokemon Red & Blue save file editor - Qt 6 C++/QML
Toggle main menu visibility
Loading...
Searching...
No Matches
hofpokemon.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
#include "
hofpokemon.h
"
23
#include "
../../savefile.h
"
24
#include "
../../savefiletoolset.h
"
25
#include "
../../savefileiterator.h
"
26
#include <
pse-db/pokemon.h
>
27
#include <
pse-db/names.h
>
28
#include <
pse-common/random.h
>
29
30
HoFPokemon::HoFPokemon
(
SaveFile
* saveFile,
var16
recordOffset,
var16
ind)
31
{
32
load
(saveFile, recordOffset, ind);
33
}
34
35
HoFPokemon::~HoFPokemon
() {}
36
37
void
HoFPokemon::load
(
SaveFile
* saveFile,
var16
recordOffset,
var16
ind)
38
{
39
reset
();
40
41
// Null check MUST come before dereferencing saveFile. The default-constructed
42
// HoFPokemon (HoFRecord::randomize / pokemonNew use `new HoFPokemon`) passes a
43
// null saveFile; the old order read saveFile->toolset first and crashed.
44
if
(saveFile ==
nullptr
)
45
return
;
46
47
auto
toolset = saveFile->
toolset
;
48
49
// Calculate Pokemon Offset in the record
50
// Records are 0x10 in size
51
// Multiply record number with 0x10 (Record Size) and add to offset
52
// record start
53
var16
pokemonOffset = (0x10 * ind) + recordOffset;
54
58
59
// Extract Pokemon Data
60
species
= toolset->getByte(pokemonOffset + 0);
61
speciesChanged
();
62
63
level
= toolset->getByte(pokemonOffset + 1);
64
levelChanged
();
65
66
name
= toolset->getStr(pokemonOffset + 2, 0xB, 10+1);
67
nameChanged
();
68
}
69
70
void
HoFPokemon::save
(
SaveFile
* saveFile,
var16
recordOffset,
var16
ind)
71
{
72
var16
pokemonOffset = (0x10 * ind) + recordOffset;
73
auto
toolset = saveFile->
toolset
;
74
75
toolset->
setByte
(pokemonOffset + 0,
species
);
76
toolset->setByte(pokemonOffset + 1,
level
);
77
toolset->setStr(pokemonOffset + 2, 0xB, 10+1,
name
);
78
79
// Normally the Gameboy will actively zero out padding bytes
80
// but we don't set padding bytes per the strict "Only touch whats needed" rule
81
}
82
83
void
HoFPokemon::reset
()
84
{
85
species
= 0;
86
speciesChanged
();
87
88
level
= 0;
89
levelChanged
();
90
91
name
=
""
;
92
nameChanged
();
93
}
94
95
void
HoFPokemon::randomize
()
96
{
97
// Reset
98
reset
();
99
100
// Generate random dex entry and look it up to get species number
101
var8
dex =
Random::inst
()->
rangeExclusive
(1,
pokemonDexCount
);
102
auto
toPokemon =
PokemonDB::inst
()->
getIndAt
(
"dex"
+ QString::number(dex));
103
104
if
(toPokemon !=
nullptr
) {
105
species
= toPokemon->ind;
106
speciesChanged
();
107
}
108
109
// Random level between 1 - 100
110
level
=
Random::inst
()->
rangeInclusive
(5,
pokemonLevelMax
);
111
levelChanged
();
112
113
// Random name
114
name
=
Names::inst
()->
player
()->
randomExample
();
115
nameChanged
();
116
}
117
118
PokemonDBEntry
*
HoFPokemon::toSpecies
()
119
{
120
return
PokemonDB::inst
()->
getIndAt
(QString::number(
species
));
121
}
AbstractRandomString::randomExample
QString randomExample()
A random string from the list.
Definition
abstractrandomstring.cpp:80
HoFPokemon::name
QString name
Definition
hofpokemon.h:63
HoFPokemon::nameChanged
void nameChanged()
HoFPokemon::levelChanged
void levelChanged()
HoFPokemon::reset
void reset()
Blank this entry.
Definition
hofpokemon.cpp:83
HoFPokemon::save
void save(SaveFile *saveFile, var16 recordOffset, var16 ind)
Flatten to the save.
Definition
hofpokemon.cpp:70
HoFPokemon::species
int species
Definition
hofpokemon.h:61
HoFPokemon::level
int level
Definition
hofpokemon.h:62
HoFPokemon::randomize
void randomize()
Randomize this entry.
Definition
hofpokemon.cpp:95
HoFPokemon::load
void load(SaveFile *saveFile=nullptr, var16 recordOffset=0, var16 ind=0)
Expand from the save.
Definition
hofpokemon.cpp:37
HoFPokemon::HoFPokemon
HoFPokemon(SaveFile *saveFile=nullptr, var16 recordOffset=0, var16 ind=0)
< Species id.
Definition
hofpokemon.cpp:30
HoFPokemon::toSpecies
PokemonDBEntry * toSpecies()
Resolve species to its DB entry.
Definition
hofpokemon.cpp:118
HoFPokemon::~HoFPokemon
virtual ~HoFPokemon()
Definition
hofpokemon.cpp:35
HoFPokemon::speciesChanged
protected::void speciesChanged()
Names::player
NamesPlayer * player() const
The player-name source (backs player).
Definition
names.cpp:35
Names::inst
static Names * inst()
< Random player-name source.
Definition
names.cpp:29
PokemonDB::inst
static PokemonDB * inst()
< Number of species.
Definition
pokemon.cpp:183
PokemonDB::getIndAt
PokemonDBEntry * getIndAt(const QString &key) const
Species by name key (for QML).
Definition
pokemon.cpp:199
Random::rangeInclusive
int rangeInclusive(const int start, const int end) const
Random integer in the closed interval [start, end].
Definition
random.cpp:42
Random::inst
static Random * inst()
< Convenience 50% coin flip (integer path), readable from QML.
Definition
random.cpp:31
Random::rangeExclusive
int rangeExclusive(const int start, const int end) const
Random integer in the half-open interval [start, end).
Definition
random.cpp:53
SaveFileToolset::setByte
void setByte(var16 addr, var8 val)
Simply sets a byte.
Definition
savefiletoolset.cpp:237
SaveFile
One loaded save: the raw 32 KB bytes, their expanded object tree, and the tools that move between the...
Definition
savefile.h:46
SaveFile::toolset
SaveFileToolset * toolset
Tools to operate directly on the raw sav file data.
Definition
savefile.h:117
var8
var8e var8
Everyday 8-bit alias. Exact (not "fastest") to dodge the pointer-width bug noted above.
Definition
types.h:124
var16
var16e var16
Everyday 16-bit alias. Exact width to avoid the "fastest" widening bug.
Definition
types.h:125
hofpokemon.h
names.h
pokemon.h
pokemonDexCount
constexpr var8 pokemonDexCount
Number of species.
Definition
pokemon.h:28
pokemonLevelMax
constexpr var8 pokemonLevelMax
Maximum level.
Definition
pokemon.h:29
random.h
savefile.h
savefileiterator.h
savefiletoolset.h
PokemonDBEntry
One species' complete static data – the richest entry in the db layer.
Definition
pokemon.h:98
projects
savefile
src
pse-savefile
expanded
fragments
hofpokemon.cpp
Generated by
1.17.0