Pokered Save Editor 2
Pokemon Red & Blue save file editor - Qt 6 C++/QML
Loading...
Searching...
No Matches
areasprites.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 "./areasprites.h"
23#include "../../qmlownership.h"
25#include "../../savefile.h"
28#include <pse-db/mapsdb.h>
29#include <pse-db/sprites.h>
31
32#include <QRandomGenerator>
33
35{
36 // By default add player sprite
37 sprites.append(new SpriteData(false));
38 load(saveFile);
39}
40
42{
43 for(auto entry : sprites)
44 entry->deleteLater();
45}
46
48{
49 return sprites.size();
50}
51
53{
54 return maxSprites;
55}
56
58{
59 return qmlCppOwned(sprites.at(ind));
60}
61
62void AreaSprites::spriteSwap(int from, int to)
63{
64 auto eFrom = sprites.at(from);
65 auto eTo = sprites.at(to);
66
67 sprites.replace(from, eTo);
68 sprites.replace(to, eFrom);
69
71}
72
74{
75 // A sprite has to always have a player sprite in the first position
76 if(sprites.size() <= 1)
77 return;
78
79 sprites.at(ind)->deleteLater();
80 sprites.removeAt(ind);
82}
83
85{
86 if(sprites.size() >= maxSprites)
87 return;
88
89 sprites.append(new SpriteData);
91}
92
94{
95 reset();
96
97 if(saveFile == nullptr)
98 return;
99
100 auto toolset = saveFile->toolset;
101
102 // Total sprite count including player
103 var8 spriteCount = toolset->getByte(0x278D) + 1;
104
105 for (var8 i = 0; i < spriteCount && i < 16; i++) {
106 sprites.append(new SpriteData(false, saveFile, i));
107 }
108
110}
111
113{
114 auto toolset = saveFile->toolset;
115
116 // Save sprite count minus player
117 toolset->setByte(0x278D, sprites.size() - 1);
118 for (var8 i = 0; i < sprites.size() && i < 16; i++) {
119 sprites.at(i)->save(saveFile, i);
120 }
121
123}
124
126{
127 for(auto entry : sprites)
128 entry->deleteLater();
129
130 sprites.clear();
132}
133
134void AreaSprites::randomize(QVector<MapDBEntrySprite*> spriteData)
135{
136 reset();
137 sprites = SpriteData::randomizeAll(spriteData);
139}
140
142{
143 reset();
144
145 if(map == nullptr)
146 return;
147
150}
constexpr var8 maxSprites
Maximum sprites/NPCs on a map.
Definition areasprites.h:27
AreaSprites(SaveFile *saveFile=nullptr)
void spriteNew()
Add a fresh sprite.
void load(SaveFile *saveFile=nullptr)
Expand the sprite list from the save.
void setTo(MapDBEntry *map)
Rebuild the list from map's sprites.
void reset()
Empty the sprite list.
void spriteSwap(int from, int to)
Reorder sprites.
protected::void spritesChanged()
QVector< SpriteData * > sprites
The map's sprites/NPCs.
Definition areasprites.h:65
virtual ~AreaSprites()
int spriteMax()
Capacity (maxSprites).
void save(SaveFile *saveFile)
Flatten the sprite list to the save.
void randomize(QVector< MapDBEntrySprite * > spriteData)
Randomize sprites from spriteData.
int spriteCount()
Number of sprites.
void spriteRemove(int ind)
Remove sprite ind.
SpriteData * spriteAt(int ind)
Sprite ind (GC-protected return).
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
One on-map sprite/NPC – the most byte-level object in the area.
Definition spritedata.h:139
static QVector< SpriteData * > setToAll(QVector< MapDBEntrySprite * > spriteSigns)
Build sprites from a map's sprite list.
static void saveMissables(SaveFile *saveFile, QVector< SpriteData * > spriteData)
static QVector< SpriteData * > randomizeAll(QVector< MapDBEntrySprite * > mapSprites)
Randomize a whole map's sprites.
var8e var8
Everyday 8-bit alias. Exact (not "fastest") to dodge the pointer-width bug noted above.
Definition types.h:124
qmlCppOwned() – protect Q_INVOKABLE QObject returns from QML's GC.
static T * qmlCppOwned(T *obj)
Hand QML CppOwnership of a C++-owned QObject returned from a Q_INVOKABLE.
One map's complete static definition – the root of the MapDBEntry family.
Definition mapdbentry.h:56
const QVector< MapDBEntrySprite * > getSprites() const
Sprites on the map.