Pokered Save Editor 2
Pokemon Red & Blue save file editor - Qt 6 C++/QML
Loading...
Searching...
No Matches
savefileiterator.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2019 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 "savefileiterator.h"
23#include "savefile.h"
24#include "savefiletoolset.h"
25
30
32{
33 offset = val;
34 return this;
35}
36
38{
39 offset += val;
40 return this;
41}
42
47
49{
50 offset++;
51 return this;
52}
53
55{
56 offset--;
57 return this;
58}
59
64
66{
67 return saveFile->toolset;
68}
69
71{
72 state.append(offset);
73 return this;
74}
75
77{
78 // Default to Offset 0x0000
79 var16 val = 0x0000;
80
81 // If not empty then pop off the address and use that
82 if(!state.isEmpty())
83 val = state.takeLast();
84
85 offset = val;
86 return this;
87}
88
89QVector<var8> SaveFileIterator::getRange(var16 size, var16 padding, bool reverse)
90{
91 auto ret = toolset()->getRange(offset, size, reverse);
92 offsetBy(size + padding);
93 return ret;
94}
95
96void SaveFileIterator::copyRange(var16 size, QVector<var8> data, var16 padding, bool reverse)
97{
98 toolset()->copyRange(offset, size, data, reverse);
99 offsetBy(size + padding);
100}
101
102QString SaveFileIterator::getStr(var16 size, var8 maxLen, var16 padding)
103{
104 auto ret = toolset()->getStr(offset, size, maxLen);
105 offsetBy(size + padding);
106 return ret;
107}
108
109void SaveFileIterator::setStr(var16 size, var8 maxLen, QString str, var16 padding)
110{
111 toolset()->setStr(offset, size, maxLen, str);
112 offsetBy(size + padding);
113}
114
115QString SaveFileIterator::getHex(var16 size, var16 padding, bool reverse)
116{
117 auto ret = toolset()->getHex(offset, size, reverse);
118 offsetBy(size + padding);
119 return ret;
120}
121
122void SaveFileIterator::setHex(var16 size, QString hex, var16 padding, bool reverse)
123{
124 toolset()->setHex(offset, size, hex, reverse);
125 offsetBy(size + padding);
126}
127
129{
130 auto ret = toolset()->getBCD(offset, size);
131 offsetBy(size + padding);
132 return ret;
133}
134
135void SaveFileIterator::setBCD(var8 size, var32 val, var16 padding)
136{
137 toolset()->setBCD(offset, size, val);
138 offsetBy(size + padding);
139}
140
141bool SaveFileIterator::getBit(var8 size, var8 bit, bool reverse)
142{
143 return toolset()->
144 getBit(offset, size, bit, reverse);
145}
146
147void SaveFileIterator::setBit(var8 size, var8 bit, bool value, bool reverse)
148{
149 return toolset()->
150 setBit(offset, size, bit, value, reverse);
151}
152
154{
155 auto ret = toolset()->getWord(offset, reverse);
156 offsetBy(2 + padding);
157 return ret;
158}
159
160void SaveFileIterator::setWord(var16 val, var16 padding, bool reverse)
161{
162 toolset()->setWord(offset, val, reverse);
163 offsetBy(2 + padding);
164}
165
167{
168 auto ret = toolset()->getByte(offset);
169 offsetBy(1 + padding);
170 return ret;
171}
172
174{
175 toolset()->setByte(offset, val);
176 offsetBy(1 + padding);
177}
178
179QVector<bool> SaveFileIterator::getBitField(var16 size, var16 padding)
180{
181 auto ret = toolset()->getBitField(offset, size);
182 offsetBy(size + padding);
183 return ret;
184}
185
186void SaveFileIterator::setBitField(var16 size, QVector<bool> src, var16 padding)
187{
188 toolset()->setBitField(offset, size, src);
189 offsetBy(size + padding);
190}
void setBit(var8 size, var8 bit, bool value, bool reverse=false)
Set a bit at the cursor.
var16 getWord(var16 padding=0, bool reverse=false)
Read a 16-bit word at the cursor; advances.
void setHex(var16 size, QString hex, var16 padding=0, bool reverse=false)
Write hex at the cursor; advances.
var16 offset
Current offset in the save file. Can be freely changed directly.
SaveFileToolset * toolset()
Get the underlying address-based toolset.
void setBCD(var8 size, var32 val, var16 padding=0)
Write a BCD number at the cursor; advances.
SaveFileIterator * push()
Bookmark the current offset (push) ...
SaveFile * saveFile
The save file this cursor walks.
QVector< var8 > getRange(var16 size, var16 padding=0, bool reverse=false)
Copies a range of bytes to a buffer of size and returns them. Reads at the cursor,...
SaveFileIterator(SaveFile *saveFile)
SaveFileIterator * offsetBy(var16 val)
Move the cursor by a relative amount. Returns this for chaining.
void setStr(var16 size, var8 maxLen, QString str, var16 padding=0)
Write a font-encoded string at the cursor; advances.
QString getStr(var16 size, var8 maxLen, var16 padding=0)
Read a font-encoded string at the cursor; advances.
SaveFileIterator * pop()
... and return to the most recent bookmark (pop). Works like a FIFO stack.
QString getHex(var16 size, var16 padding=0, bool reverse=false)
Read hex at the cursor; advances.
void setBitField(var16 size, QVector< bool > src, var16 padding=0)
Write a bitfield at the cursor; advances.
QVector< bool > getBitField(var16 size, var16 padding=0)
Read a bitfield at the cursor; advances.
SaveFileIterator * skipPadding(var16 val)
Alias for code cleanliness (advance past padding).
SaveFile * file()
Get reference back to the save file.
bool getBit(var8 size, var8 bit, bool reverse=false)
Test a bit at the cursor.
QVector< var16 > state
Bookmark stack – saves places in the save file to go back to (push/pop).
SaveFileIterator * inc()
Increment the offset by one byte. Returns this.
void setByte(var8 val, var16 padding=0)
Write a byte at the cursor; advances.
var32 getBCD(var8 size, var16 padding=0)
Read a BCD number at the cursor; advances.
SaveFileIterator * dec()
Decrement the offset by one byte. Returns this.
void setWord(var16 val, var16 padding=0, bool reverse=false)
Write a 16-bit word at the cursor; advances.
void copyRange(var16 size, QVector< var8 > data, var16 padding=0, bool reverse=false)
Writes at the cursor, then advances by size + padding.
SaveFileIterator * offsetTo(var16 val)
Move the cursor to an absolute offset. Returns this for chaining.
var8 getByte(var16 padding=0)
Read a byte at the cursor; advances.
Low-level read/write primitives over a SaveFile's raw 32 KB buffer.
void copyRange(var16 addr, var16 size, QVector< var8 > data, bool reverse=false)
Copies data into the save at a particular place, going no further than the maximum size desired and/o...
QString getHex(var16 addr, var16 size, bool reverse=false)
Gets a value in hex from the save file.
void setHex(var16 addr, var16 size, QString hex, bool reverse=false)
Saves a hex value to bytes in the save file.
void setWord(var16 addr, var16 val, bool reverse=false)
Set a 16-bit value. 0x12,0x34 <=> 0x1234. If you want the reverse then reverse it.
QString getStr(var16 addr, var16 size, var8 maxLen)
Gets a string from the sav file, converted from in-game font encoding to UTF-8 for easy reading and m...
QVector< var8 > getRange(var16 from, var16 size, bool reverse=false)
Copies a range of bytes to a buffer of size and returns them.
void setBitField(var16 addr, var16 size, QVector< bool > src)
Sets an entire bitfield from a vector of bools.
void setStr(var16 addr, var16 size, var8 maxLen, QString str)
Sets a string to the sav file, converted from UTF-8 to in-game font encoding.
QVector< bool > getBitField(var16 addr, var16 size)
Gets an entire bitfield as a vector of bools.
var16 getWord(var16 addr, bool reverse=false)
Get a 16-bit value. 0x12,0x34 <=> 0x1234. If you want the reverse then reverse it.
void setByte(var16 addr, var8 val)
Simply sets a byte.
var8 getByte(var16 addr)
Simply gets a byte.
void setBCD(var16 addr, var8 size, var32 val)
Set a raw BCD val from a given number.
var32 getBCD(var16 addr, var8 size)
Get a raw BCD value as a number.
One loaded save: the raw 32 KB bytes, their expanded object tree, and the tools that move between the...
Definition savefile.h:46
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
var32e var32
Everyday 32-bit alias. Exact width to avoid the "fastest" widening bug.
Definition types.h:126