Pokered Save Editor 2
Pokemon Red & Blue save file editor - Qt 6 C++/QML
Toggle main menu visibility
Loading...
Searching...
No Matches
areatileset.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 <cstring>
24
25
#include "
./areatileset.h
"
26
#include "
../../savefile.h
"
27
#include "
../../savefiletoolset.h
"
28
#include "
../../savefileiterator.h
"
29
#include <
pse-db/mapsdb.h
>
30
#include <
pse-db/entries/mapdbentry.h
>
31
#include <
pse-db/tileset.h
>
32
#include <
pse-common/random.h
>
33
34
AreaTileset::AreaTileset
(
SaveFile
* saveFile)
35
{
36
load
(saveFile);
37
}
38
39
AreaTileset::~AreaTileset
() {}
40
41
int
AreaTileset::talkingOverTilesCount
()
42
{
43
return
maxTalkingOverTiles
;
44
}
45
46
int
AreaTileset::talkingOverTilesAt
(
int
ind)
47
{
48
return
talkingOverTiles
[ind];
49
}
50
51
void
AreaTileset::talkingOverTilesSwap
(
int
from,
int
to)
52
{
53
auto
eFrom =
talkingOverTiles
[from];
54
auto
eTo =
talkingOverTiles
[to];
55
56
talkingOverTiles
[to] = eFrom;
57
talkingOverTiles
[from] = eTo;
58
59
talkingOverTilesChanged
();
60
}
61
62
void
AreaTileset::load
(
SaveFile
* saveFile)
63
{
64
reset
();
65
66
if
(saveFile ==
nullptr
)
67
return
;
68
69
auto
toolset = saveFile->
toolset
;
70
71
current
= toolset->getByte(0x2613);
72
currentChanged
();
73
74
bank
= toolset->getByte(0x27D7);
75
bankChanged
();
76
77
blockPtr
= toolset->getWord(0x27D8,
true
);
78
blockPtrChanged
();
79
80
gfxPtr
= toolset->getWord(0x27DA,
true
);
81
gfxPtrChanged
();
82
83
collPtr
= toolset->getWord(0x27DC,
true
);
84
collPtrChanged
();
85
86
auto
savTot = toolset->getRange(0x27DE, 3);
87
for
(
var8
i = 0; i <
talkCount
; i++) {
88
talkingOverTiles
[i] = savTot[i];
89
}
90
talkingOverTilesChanged
();
91
92
grassTile
= toolset->getByte(0x27E1);
93
grassTileChanged
();
94
95
boulderIndex
= toolset->getByte(0x29C4);
96
boulderIndexChanged
();
97
98
boulderColl
= toolset->getByte(0x29C8);
99
boulderCollChanged
();
100
101
type
= toolset->getByte(0x3522);
102
typeChanged
();
103
}
104
105
void
AreaTileset::save
(
SaveFile
* saveFile)
106
{
107
auto
toolset = saveFile->
toolset
;
108
109
toolset->
setByte
(0x2613,
current
);
110
toolset->setByte(0x27D7,
bank
);
111
112
toolset->setWord(0x27D8,
blockPtr
,
true
);
113
toolset->setWord(0x27DA,
gfxPtr
,
true
);
114
toolset->setWord(0x27DC,
collPtr
,
true
);
115
116
for
(
var8
i = 0; i <
talkCount
; i++) {
117
toolset->setByte(0x27DE + i,
talkingOverTiles
[i]);
118
}
119
120
toolset->setByte(0x27E1,
grassTile
);
121
toolset->setByte(0x29C4,
boulderIndex
);
122
toolset->setByte(0x29C8,
boulderColl
);
123
124
toolset->setByte(0x3522,
type
);
125
}
126
127
void
AreaTileset::reset
()
128
{
129
current
= 0;
130
currentChanged
();
131
132
memset(
talkingOverTiles
, 0, 3 *
sizeof
(
var8
));
133
talkingOverTilesChanged
();
134
135
grassTile
= 0;
136
grassTileChanged
();
137
138
boulderIndex
= 0;
139
boulderIndexChanged
();
140
141
boulderColl
= 0;
142
boulderCollChanged
();
143
144
type
= 0;
145
typeChanged
();
146
147
bank
= 0;
148
bankChanged
();
149
150
blockPtr
= 0;
151
blockPtrChanged
();
152
153
gfxPtr
= 0;
154
gfxPtrChanged
();
155
156
collPtr
= 0;
157
collPtrChanged
();
158
}
159
160
void
AreaTileset::randomize
()
161
{
162
reset
();
163
164
// Random between types
165
type
=
Random::inst
()->
rangeInclusive
(0, 2);
166
typeChanged
();
167
}
168
169
void
AreaTileset::loadFromData
(
MapDBEntry
* map,
bool
randomType)
170
{
171
reset
();
172
173
// The ternary was inverted: when map==nullptr it dereferenced the null map
174
// (crash), and when map!=nullptr it discarded the real tileset (loaded zeros).
175
// Correct order: null map -> null tileset; real map -> its resolved tileset.
176
auto
tileset = (map ==
nullptr
)
177
?
nullptr
178
: map->
getToTileset
();
179
180
// If random, have it clear everything and randomize type
181
// Otherwise load usual type
182
if
(randomType) {
183
type
=
Random::inst
()->
rangeInclusive
(0, 2);
184
typeChanged
();
185
}
186
else
{
187
type
= (tileset ==
nullptr
)
188
? 0
189
: (
var8
)tileset->typeAsEnum();
190
typeChanged
();
191
}
192
193
// Load other usual data based on map
194
current
= (tileset ==
nullptr
)
195
? 0
196
: tileset->ind;
197
currentChanged
();
198
199
grassTile
= (tileset ==
nullptr
)
200
? 0
201
: tileset->grass;
202
grassTileChanged
();
203
204
bank
= (tileset ==
nullptr
)
205
? 0
206
: tileset->bank;
207
bankChanged
();
208
209
blockPtr
= (tileset ==
nullptr
)
210
? 0
211
: tileset->blockPtr;
212
blockPtrChanged
();
213
214
gfxPtr
= (tileset ==
nullptr
)
215
? 0
216
: tileset->gfxPtr;
217
gfxPtrChanged
();
218
219
collPtr
= (tileset ==
nullptr
)
220
? 0
221
: tileset->collPtr;
222
collPtrChanged
();
223
224
for
(
var8
i = 0; i <
talkCount
; i++) {
225
talkingOverTiles
[i] = (tileset ==
nullptr
)
226
? 0
227
: tileset->talk[i];
228
}
229
talkingOverTilesChanged
();
230
}
areatileset.h
maxTalkingOverTiles
constexpr var8 maxTalkingOverTiles
Number of "talk-over" tile slots.
Definition
areatileset.h:24
AreaTileset::reset
void reset()
Blank the tileset block.
Definition
areatileset.cpp:127
AreaTileset::boulderCollChanged
void boulderCollChanged()
AreaTileset::talkingOverTilesSwap
void talkingOverTilesSwap(int from, int to)
Reorder talk-over tiles.
Definition
areatileset.cpp:51
AreaTileset::collPtr
int collPtr
Definition
areatileset.h:112
AreaTileset::loadFromData
void loadFromData(MapDBEntry *map, bool randomType=false)
Set from map (optionally random type).
Definition
areatileset.cpp:169
AreaTileset::grassTileChanged
void grassTileChanged()
AreaTileset::typeChanged
void typeChanged()
AreaTileset::~AreaTileset
virtual ~AreaTileset()
Definition
areatileset.cpp:39
AreaTileset::type
int type
Definition
areatileset.h:102
AreaTileset::save
void save(SaveFile *saveFile)
Flatten the tileset block to the save.
Definition
areatileset.cpp:105
AreaTileset::current
int current
Definition
areatileset.h:82
AreaTileset::randomize
void randomize()
Randomize the tileset.
Definition
areatileset.cpp:160
AreaTileset::boulderIndexChanged
void boulderIndexChanged()
AreaTileset::currentChanged
protected::void currentChanged()
AreaTileset::blockPtr
int blockPtr
Definition
areatileset.h:110
AreaTileset::gfxPtr
int gfxPtr
Definition
areatileset.h:111
AreaTileset::talkingOverTilesAt
int talkingOverTilesAt(int ind)
Talk-over tile at ind.
Definition
areatileset.cpp:46
AreaTileset::bank
int bank
Definition
areatileset.h:109
AreaTileset::collPtrChanged
void collPtrChanged()
AreaTileset::talkingOverTilesCount
int talkingOverTilesCount()
Number of talk-over tile slots.
Definition
areatileset.cpp:41
AreaTileset::boulderIndex
int boulderIndex
Definition
areatileset.h:94
AreaTileset::boulderColl
int boulderColl
Definition
areatileset.h:95
AreaTileset::AreaTileset
AreaTileset(SaveFile *saveFile=nullptr)
< Active tileset id (risky to change).
Definition
areatileset.cpp:34
AreaTileset::load
void load(SaveFile *saveFile=nullptr)
Expand the tileset block from the save.
Definition
areatileset.cpp:62
AreaTileset::bankChanged
void bankChanged()
AreaTileset::gfxPtrChanged
void gfxPtrChanged()
AreaTileset::talkingOverTiles
var8 talkingOverTiles[maxTalkingOverTiles]
Definition
areatileset.h:86
AreaTileset::grassTile
int grassTile
Which tile is a grass tile? In testing I got odd results changing this.
Definition
areatileset.h:89
AreaTileset::talkingOverTilesChanged
void talkingOverTilesChanged()
AreaTileset::blockPtrChanged
void blockPtrChanged()
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
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
mapdbentry.h
mapsdb.h
random.h
savefile.h
savefileiterator.h
savefiletoolset.h
MapDBEntry
One map's complete static definition – the root of the MapDBEntry family.
Definition
mapdbentry.h:56
MapDBEntry::getToTileset
TilesetDBEntry * getToTileset() const
Definition
mapdbentry.cpp:351
tileset.h
talkCount
constexpr var8 talkCount
Number of "talk-over" tile slots per tileset.
Definition
tileset.h:33
projects
savefile
src
pse-savefile
expanded
area
areatileset.cpp
Generated by
1.17.0