yaze 0.2.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
zsprite.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_SPRITE_ZSPRITE_H
2#define YAZE_APP_EDITOR_SPRITE_ZSPRITE_H
3
4#include <cstdint>
5#include <fstream>
6#include <string>
7#include <vector>
8
9#include "absl/status/status.h"
10#include "util/macro.h"
11
12namespace yaze {
13namespace editor {
17namespace zsprite {
18
19struct OamTile {
20 OamTile(uint8_t x, uint8_t y, bool mx, bool my, uint16_t id, uint8_t pal,
21 bool s, uint8_t p)
22 : x(x),
23 y(y),
24 mirror_x(mx),
25 mirror_y(my),
26 id(id),
27 palette(pal),
28 size(s),
29 priority(p) {}
30
31 uint8_t x;
32 uint8_t y;
35 uint16_t id;
36 uint8_t palette;
37 bool size;
38 uint8_t priority;
39 uint8_t z;
40};
41
43 AnimationGroup() = default;
44 AnimationGroup(uint8_t fs, uint8_t fe, uint8_t fsp, std::string fn)
45 : frame_name(fn), frame_start(fs), frame_end(fe), frame_speed(fsp) {}
46
47 std::string frame_name;
48 uint8_t frame_start;
49 uint8_t frame_end;
50 uint8_t frame_speed;
51 std::vector<OamTile> Tiles;
52};
53
55 UserRoutine(std::string n, std::string c) : name(n), code(c) {}
56
57 std::string name;
58 std::string code;
59 int Count;
60};
61
62struct SubEditor {
63 std::vector<AnimationGroup> Frames;
64 std::vector<UserRoutine> user_routines;
65};
66
69 std::string Text;
70};
71
72struct ZSprite {
73 public:
74 absl::Status Load(const std::string& filename) {
75 std::ifstream fs(filename, std::ios::binary);
76 if (!fs.is_open()) {
77 return absl::NotFoundError("File not found");
78 }
79
80 std::vector<char> buffer(std::istreambuf_iterator<char>(fs), {});
81
82 int animation_count = *reinterpret_cast<int32_t*>(&buffer[0]);
83 int offset = sizeof(int);
84
85 for (int i = 0; i < animation_count; i++) {
86 std::string aname = std::string(&buffer[offset]);
87 offset += aname.size() + 1;
88 uint8_t afs = *reinterpret_cast<uint8_t*>(&buffer[offset]);
89 offset += sizeof(uint8_t);
90 uint8_t afe = *reinterpret_cast<uint8_t*>(&buffer[offset]);
91 offset += sizeof(uint8_t);
92 uint8_t afspeed = *reinterpret_cast<uint8_t*>(&buffer[offset]);
93 offset += sizeof(uint8_t);
94
95 animations.push_back(AnimationGroup(afs, afe, afspeed, aname));
96 }
97 // RefreshAnimations();
98
99 int frame_count = *reinterpret_cast<int32_t*>(&buffer[offset]);
100 offset += sizeof(int);
101 for (int i = 0; i < frame_count; i++) {
102 // editor.Frames[i] = new Frame();
103 editor.Frames.emplace_back();
104 // editor.AddUndo(i);
105 int tCount = *reinterpret_cast<int*>(&buffer[offset]);
106 offset += sizeof(int);
107
108 for (int j = 0; j < tCount; j++) {
109 uint16_t tid = *reinterpret_cast<uint16_t*>(&buffer[offset]);
110 offset += sizeof(uint16_t);
111 uint8_t tpal = *reinterpret_cast<uint8_t*>(&buffer[offset]);
112 offset += sizeof(uint8_t);
113 bool tmx = *reinterpret_cast<bool*>(&buffer[offset]);
114 offset += sizeof(bool);
115 bool tmy = *reinterpret_cast<bool*>(&buffer[offset]);
116 offset += sizeof(bool);
117 uint8_t tprior = *reinterpret_cast<uint8_t*>(&buffer[offset]);
118 offset += sizeof(uint8_t);
119 bool tsize = *reinterpret_cast<bool*>(&buffer[offset]);
120 offset += sizeof(bool);
121 uint8_t tx = *reinterpret_cast<uint8_t*>(&buffer[offset]);
122 offset += sizeof(uint8_t);
123 uint8_t ty = *reinterpret_cast<uint8_t*>(&buffer[offset]);
124 offset += sizeof(uint8_t);
125 uint8_t tz = *reinterpret_cast<uint8_t*>(&buffer[offset]);
126 offset += sizeof(uint8_t);
127 OamTile to(tx, ty, tmx, tmy, tid, tpal, tsize, tprior);
128 to.z = tz;
129 editor.Frames[i].Tiles.push_back(to);
130 }
131 }
132
133 // all sprites properties
134 property_blockable.IsChecked = *reinterpret_cast<bool*>(&buffer[offset]);
135 offset += sizeof(bool);
136 property_canfall.IsChecked = *reinterpret_cast<bool*>(&buffer[offset]);
137 offset += sizeof(bool);
138 property_collisionlayer.IsChecked =
139 *reinterpret_cast<bool*>(&buffer[offset]);
140 offset += sizeof(bool);
141 property_customdeath.IsChecked = *reinterpret_cast<bool*>(&buffer[offset]);
142 offset += sizeof(bool);
143 property_damagesound.IsChecked = *reinterpret_cast<bool*>(&buffer[offset]);
144 offset += sizeof(bool);
145 property_deflectarrows.IsChecked =
146 *reinterpret_cast<bool*>(&buffer[offset]);
147 offset += sizeof(bool);
149 *reinterpret_cast<bool*>(&buffer[offset]);
150 offset += sizeof(bool);
151 property_fast.IsChecked = *reinterpret_cast<bool*>(&buffer[offset]);
152 offset += sizeof(bool);
153 property_harmless.IsChecked = *reinterpret_cast<bool*>(&buffer[offset]);
154 offset += sizeof(bool);
155 property_impervious.IsChecked = *reinterpret_cast<bool*>(&buffer[offset]);
156 offset += sizeof(bool);
157 property_imperviousarrow.IsChecked =
158 *reinterpret_cast<bool*>(&buffer[offset]);
159 offset += sizeof(bool);
160 property_imperviousmelee.IsChecked =
161 *reinterpret_cast<bool*>(&buffer[offset]);
162 offset += sizeof(bool);
163 property_interaction.IsChecked = *reinterpret_cast<bool*>(&buffer[offset]);
164 offset += sizeof(bool);
165 property_isboss.IsChecked = *reinterpret_cast<bool*>(&buffer[offset]);
166 offset += sizeof(bool);
167 property_persist.IsChecked = *reinterpret_cast<bool*>(&buffer[offset]);
168 offset += sizeof(bool);
169 property_shadow.IsChecked = *reinterpret_cast<bool*>(&buffer[offset]);
170 offset += sizeof(bool);
171 property_smallshadow.IsChecked = *reinterpret_cast<bool*>(&buffer[offset]);
172 offset += sizeof(bool);
173 property_statis.IsChecked = *reinterpret_cast<bool*>(&buffer[offset]);
174 offset += sizeof(bool);
175 property_statue.IsChecked = *reinterpret_cast<bool*>(&buffer[offset]);
176 offset += sizeof(bool);
177 property_watersprite.IsChecked = *reinterpret_cast<bool*>(&buffer[offset]);
178 offset += sizeof(bool);
179
180 property_prize.Text =
181 std::to_string(*reinterpret_cast<uint8_t*>(&buffer[offset]));
182 offset += sizeof(uint8_t);
183 property_palette.Text =
184 std::to_string(*reinterpret_cast<uint8_t*>(&buffer[offset]));
185 offset += sizeof(uint8_t);
186 property_oamnbr.Text =
187 std::to_string(*reinterpret_cast<uint8_t*>(&buffer[offset]));
188 offset += sizeof(uint8_t);
189 property_hitbox.Text =
190 std::to_string(*reinterpret_cast<uint8_t*>(&buffer[offset]));
191 offset += sizeof(uint8_t);
192 property_health.Text =
193 std::to_string(*reinterpret_cast<uint8_t*>(&buffer[offset]));
194 offset += sizeof(uint8_t);
195 property_damage.Text =
196 std::to_string(*reinterpret_cast<uint8_t*>(&buffer[offset]));
197 offset += sizeof(uint8_t);
198
199 if (offset != buffer.size()) {
200 property_sprname.Text = std::string(&buffer[offset]);
201 offset += property_sprname.Text.size() + 1;
202
203 int actionL = buffer[offset];
204 offset += sizeof(int);
205 for (int i = 0; i < actionL; i++) {
206 std::string a = std::string(&buffer[offset]);
207 offset += a.size() + 1;
208 std::string b = std::string(&buffer[offset]);
209 offset += b.size() + 1;
210 userRoutines.push_back(UserRoutine(a, b));
211 }
212 }
213
214 if (offset != buffer.size()) {
215 property_sprid.Text = std::string(&buffer[offset]);
216 fs.close();
217 }
218
219 // UpdateUserRoutines();
220 // userroutinesListbox.SelectedIndex = 0;
221 // RefreshScreen();
222
223 return absl::OkStatus();
224 }
225
226 absl::Status Save(const std::string& filename) {
227 std::ofstream fs(filename, std::ios::binary);
228 if (fs.is_open()) {
229 // Write data to the file
230 fs.write(reinterpret_cast<const char*>(animations.size()), sizeof(int));
231 for (const AnimationGroup& anim : animations) {
232 fs.write(anim.frame_name.c_str(), anim.frame_name.size() + 1);
233 fs.write(reinterpret_cast<const char*>(&anim.frame_start),
234 sizeof(uint8_t));
235 fs.write(reinterpret_cast<const char*>(&anim.frame_end),
236 sizeof(uint8_t));
237 fs.write(reinterpret_cast<const char*>(&anim.frame_speed),
238 sizeof(uint8_t));
239 }
240
241 fs.write(reinterpret_cast<const char*>(editor.Frames.size()),
242 sizeof(int));
243 for (int i = 0; i < editor.Frames.size(); i++) {
244 fs.write(reinterpret_cast<const char*>(editor.Frames[i].Tiles.size()),
245 sizeof(int));
246
247 for (int j = 0; j < editor.Frames[i].Tiles.size(); j++) {
248 fs.write(reinterpret_cast<const char*>(&editor.Frames[i].Tiles[j].id),
249 sizeof(uint16_t));
250 fs.write(
251 reinterpret_cast<const char*>(&editor.Frames[i].Tiles[j].palette),
252 sizeof(uint8_t));
253 fs.write(reinterpret_cast<const char*>(
254 &editor.Frames[i].Tiles[j].mirror_x),
255 sizeof(bool));
256 fs.write(reinterpret_cast<const char*>(
257 &editor.Frames[i].Tiles[j].mirror_y),
258 sizeof(bool));
259 fs.write(reinterpret_cast<const char*>(
260 &editor.Frames[i].Tiles[j].priority),
261 sizeof(uint8_t));
262 fs.write(
263 reinterpret_cast<const char*>(&editor.Frames[i].Tiles[j].size),
264 sizeof(bool));
265 fs.write(reinterpret_cast<const char*>(&editor.Frames[i].Tiles[j].x),
266 sizeof(uint8_t));
267 fs.write(reinterpret_cast<const char*>(&editor.Frames[i].Tiles[j].y),
268 sizeof(uint8_t));
269 fs.write(reinterpret_cast<const char*>(&editor.Frames[i].Tiles[j].z),
270 sizeof(uint8_t));
271 }
272 }
273
274 // Write other properties
275 fs.write(reinterpret_cast<const char*>(&property_blockable.IsChecked),
276 sizeof(bool));
277 fs.write(reinterpret_cast<const char*>(&property_canfall.IsChecked),
278 sizeof(bool));
279 fs.write(
280 reinterpret_cast<const char*>(&property_collisionlayer.IsChecked),
281 sizeof(bool));
282 fs.write(reinterpret_cast<const char*>(&property_customdeath.IsChecked),
283 sizeof(bool));
284 fs.write(reinterpret_cast<const char*>(&property_damagesound.IsChecked),
285 sizeof(bool));
286 fs.write(reinterpret_cast<const char*>(&property_deflectarrows.IsChecked),
287 sizeof(bool));
288 fs.write(
289 reinterpret_cast<const char*>(&property_deflectprojectiles.IsChecked),
290 sizeof(bool));
291 fs.write(reinterpret_cast<const char*>(&property_fast.IsChecked),
292 sizeof(bool));
293 fs.write(reinterpret_cast<const char*>(&property_harmless.IsChecked),
294 sizeof(bool));
295 fs.write(reinterpret_cast<const char*>(&property_impervious.IsChecked),
296 sizeof(bool));
297 fs.write(
298 reinterpret_cast<const char*>(&property_imperviousarrow.IsChecked),
299 sizeof(bool));
300 fs.write(
301 reinterpret_cast<const char*>(&property_imperviousmelee.IsChecked),
302 sizeof(bool));
303 fs.write(reinterpret_cast<const char*>(&property_interaction.IsChecked),
304 sizeof(bool));
305 fs.write(reinterpret_cast<const char*>(&property_isboss.IsChecked),
306 sizeof(bool));
307 fs.write(reinterpret_cast<const char*>(&property_persist.IsChecked),
308 sizeof(bool));
309 fs.write(reinterpret_cast<const char*>(&property_shadow.IsChecked),
310 sizeof(bool));
311 fs.write(reinterpret_cast<const char*>(&property_smallshadow.IsChecked),
312 sizeof(bool));
313 fs.write(reinterpret_cast<const char*>(&property_statis.IsChecked),
314 sizeof(bool));
315 fs.write(reinterpret_cast<const char*>(&property_statue.IsChecked),
316 sizeof(bool));
317 fs.write(reinterpret_cast<const char*>(&property_watersprite.IsChecked),
318 sizeof(bool));
319
320 fs.write(reinterpret_cast<const char*>(&property_prize.Text),
321 sizeof(uint8_t));
322 fs.write(reinterpret_cast<const char*>(&property_palette.Text),
323 sizeof(uint8_t));
324 fs.write(reinterpret_cast<const char*>(&property_oamnbr.Text),
325 sizeof(uint8_t));
326 fs.write(reinterpret_cast<const char*>(&property_hitbox.Text),
327 sizeof(uint8_t));
328 fs.write(reinterpret_cast<const char*>(&property_health.Text),
329 sizeof(uint8_t));
330 fs.write(reinterpret_cast<const char*>(&property_damage.Text),
331 sizeof(uint8_t));
332
333 fs.write(sprName.c_str(), sprName.size() + 1);
334
335 fs.write(reinterpret_cast<const char*>(userRoutines.size()), sizeof(int));
336 for (const UserRoutine& userR : userRoutines) {
337 fs.write(userR.name.c_str(), userR.name.size() + 1);
338 fs.write(userR.code.c_str(), userR.code.size() + 1);
339 }
340
341 fs.write(reinterpret_cast<const char*>(&property_sprid.Text),
342 sizeof(property_sprid.Text));
343
344 fs.close();
345 }
346
347 return absl::OkStatus();
348 }
349
350 std::string sprName;
351 std::vector<AnimationGroup> animations;
352 std::vector<UserRoutine> userRoutines;
354
376
383
385};
386
387} // namespace zsprite
388} // namespace editor
389} // namespace yaze
390
391#endif // YAZE_APP_EDITOR_SPRITE_ZSPRITE_H
Namespace for the ZSprite format from Zarby's ZSpriteMaker.
Definition zsprite.h:17
Editors are the view controllers for the application.
Main namespace for the application.
Definition controller.cc:18
std::vector< OamTile > Tiles
Definition zsprite.h:51
AnimationGroup(uint8_t fs, uint8_t fe, uint8_t fsp, std::string fn)
Definition zsprite.h:44
OamTile(uint8_t x, uint8_t y, bool mx, bool my, uint16_t id, uint8_t pal, bool s, uint8_t p)
Definition zsprite.h:20
std::vector< AnimationGroup > Frames
Definition zsprite.h:63
std::vector< UserRoutine > user_routines
Definition zsprite.h:64
UserRoutine(std::string n, std::string c)
Definition zsprite.h:55
std::vector< UserRoutine > userRoutines
Definition zsprite.h:352
SpriteProperty property_persist
Definition zsprite.h:369
absl::Status Save(const std::string &filename)
Definition zsprite.h:226
SpriteProperty property_hitbox
Definition zsprite.h:380
SpriteProperty property_isboss
Definition zsprite.h:368
SpriteProperty property_impervious
Definition zsprite.h:364
SpriteProperty property_collisionlayer
Definition zsprite.h:357
SpriteProperty property_prize
Definition zsprite.h:377
SpriteProperty property_imperviousarrow
Definition zsprite.h:365
SpriteProperty property_smallshadow
Definition zsprite.h:371
SpriteProperty property_blockable
Definition zsprite.h:355
SpriteProperty property_shadow
Definition zsprite.h:370
absl::Status Load(const std::string &filename)
Definition zsprite.h:74
SpriteProperty property_deflectarrows
Definition zsprite.h:360
SpriteProperty property_customdeath
Definition zsprite.h:358
SpriteProperty property_imperviousmelee
Definition zsprite.h:366
SpriteProperty property_fast
Definition zsprite.h:362
SpriteProperty property_oamnbr
Definition zsprite.h:379
SpriteProperty property_interaction
Definition zsprite.h:367
SpriteProperty property_watersprite
Definition zsprite.h:374
SpriteProperty property_statue
Definition zsprite.h:373
SpriteProperty property_sprname
Definition zsprite.h:375
SpriteProperty property_damagesound
Definition zsprite.h:359
SpriteProperty property_damage
Definition zsprite.h:382
std::vector< AnimationGroup > animations
Definition zsprite.h:351
SpriteProperty property_palette
Definition zsprite.h:378
SpriteProperty property_harmless
Definition zsprite.h:363
SpriteProperty property_health
Definition zsprite.h:381
SpriteProperty property_canfall
Definition zsprite.h:356
SpriteProperty property_statis
Definition zsprite.h:372
SpriteProperty property_deflectprojectiles
Definition zsprite.h:361
SpriteProperty property_sprid
Definition zsprite.h:384