Pokered Save Editor 2
Pokemon Red & Blue save file editor - Qt 6 C++/QML
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"
29#include <pse-db/mapsdb.h>
31#include <pse-db/tileset.h>
32#include <pse-common/random.h>
33
35{
36 load(saveFile);
37}
38
40
45
47{
48 return talkingOverTiles[ind];
49}
50
52{
53 auto eFrom = talkingOverTiles[from];
54 auto eTo = talkingOverTiles[to];
55
56 talkingOverTiles[to] = eFrom;
57 talkingOverTiles[from] = eTo;
58
60}
61
63{
64 reset();
65
66 if(saveFile == nullptr)
67 return;
68
69 auto toolset = saveFile->toolset;
70
71 current = toolset->getByte(0x2613);
73
74 bank = toolset->getByte(0x27D7);
76
77 blockPtr = toolset->getWord(0x27D8, true);
79
80 gfxPtr = toolset->getWord(0x27DA, true);
82
83 collPtr = toolset->getWord(0x27DC, true);
85
86 auto savTot = toolset->getRange(0x27DE, 3);
87 for(var8 i = 0; i < talkCount; i++) {
88 talkingOverTiles[i] = savTot[i];
89 }
91
92 grassTile = toolset->getByte(0x27E1);
94
95 boulderIndex = toolset->getByte(0x29C4);
97
98 boulderColl = toolset->getByte(0x29C8);
100
101 type = toolset->getByte(0x3522);
102 typeChanged();
103}
104
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
128{
129 current = 0;
131
132 memset(talkingOverTiles, 0, 3 * sizeof(var8));
134
135 grassTile = 0;
137
138 boulderIndex = 0;
140
141 boulderColl = 0;
143
144 type = 0;
145 typeChanged();
146
147 bank = 0;
148 bankChanged();
149
150 blockPtr = 0;
152
153 gfxPtr = 0;
155
156 collPtr = 0;
158}
159
161{
162 reset();
163
164 // Random between types
166 typeChanged();
167}
168
169void 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) {
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;
198
199 grassTile = (tileset == nullptr)
200 ? 0
201 : tileset->grass;
203
204 bank = (tileset == nullptr)
205 ? 0
206 : tileset->bank;
207 bankChanged();
208
209 blockPtr = (tileset == nullptr)
210 ? 0
211 : tileset->blockPtr;
213
214 gfxPtr = (tileset == nullptr)
215 ? 0
216 : tileset->gfxPtr;
218
219 collPtr = (tileset == nullptr)
220 ? 0
221 : tileset->collPtr;
223
224 for(var8 i = 0; i < talkCount; i++) {
225 talkingOverTiles[i] = (tileset == nullptr)
226 ? 0
227 : tileset->talk[i];
228 }
230}
constexpr var8 maxTalkingOverTiles
Number of "talk-over" tile slots.
Definition areatileset.h:24
void reset()
Blank the tileset block.
void boulderCollChanged()
void talkingOverTilesSwap(int from, int to)
Reorder talk-over tiles.
void loadFromData(MapDBEntry *map, bool randomType=false)
Set from map (optionally random type).
void grassTileChanged()
void typeChanged()
virtual ~AreaTileset()
void save(SaveFile *saveFile)
Flatten the tileset block to the save.
void randomize()
Randomize the tileset.
void boulderIndexChanged()
protected::void currentChanged()
int talkingOverTilesAt(int ind)
Talk-over tile at ind.
void collPtrChanged()
int talkingOverTilesCount()
Number of talk-over tile slots.
AreaTileset(SaveFile *saveFile=nullptr)
< Active tileset id (risky to change).
void load(SaveFile *saveFile=nullptr)
Expand the tileset block from the save.
void bankChanged()
void gfxPtrChanged()
var8 talkingOverTiles[maxTalkingOverTiles]
Definition areatileset.h:86
int grassTile
Which tile is a grass tile? In testing I got odd results changing this.
Definition areatileset.h:89
void talkingOverTilesChanged()
void blockPtrChanged()
int rangeInclusive(const int start, const int end) const
Random integer in the closed interval [start, end].
Definition random.cpp:42
static Random * inst()
< Convenience 50% coin flip (integer path), readable from QML.
Definition random.cpp:31
void setByte(var16 addr, var8 val)
Simply sets a byte.
One loaded save: the raw 32 KB bytes, their expanded object tree, and the tools that move between the...
Definition savefile.h:46
SaveFileToolset * toolset
Tools to operate directly on the raw sav file data.
Definition savefile.h:117
var8e var8
Everyday 8-bit alias. Exact (not "fastest") to dodge the pointer-width bug noted above.
Definition types.h:124
One map's complete static definition – the root of the MapDBEntry family.
Definition mapdbentry.h:56
TilesetDBEntry * getToTileset() const
constexpr var8 talkCount
Number of "talk-over" tile slots per tileset.
Definition tileset.h:33