1#ifndef YAZE_APP_EDITOR_SPRITE_ZSPRITE_H
2#define YAZE_APP_EDITOR_SPRITE_ZSPRITE_H
9#include "absl/status/status.h"
32 is.read(
reinterpret_cast<char*
>(&
byte), 1);
33 if (!is.good())
return "";
34 length |= (
byte & 0x7F) << shift;
36 }
while (
byte & 0x80);
38 std::string result(length,
'\0');
40 is.read(&result[0], length);
49 uint32_t length =
static_cast<uint32_t
>(str.size());
53 uint8_t
byte = length & 0x7F;
58 os.write(
reinterpret_cast<const char*
>(&
byte), 1);
63 os.write(str.data(), str.size());
69 OamTile(uint8_t
x, uint8_t
y,
bool mx,
bool my, uint16_t
id, uint8_t pal,
113 :
name(std::move(n)),
code(std::move(c)) {}
134 absl::Status
Load(
const std::string& filename) {
135 std::ifstream fs(filename, std::ios::binary);
137 return absl::NotFoundError(
"File not found: " + filename);
144 int32_t animation_count = 0;
145 fs.read(
reinterpret_cast<char*
>(&animation_count),
sizeof(int32_t));
148 for (
int i = 0; i < animation_count; i++) {
150 uint8_t afs, afe, afspeed;
151 fs.read(
reinterpret_cast<char*
>(&afs),
sizeof(uint8_t));
152 fs.read(
reinterpret_cast<char*
>(&afe),
sizeof(uint8_t));
153 fs.read(
reinterpret_cast<char*
>(&afspeed),
sizeof(uint8_t));
154 animations.emplace_back(afs, afe, afspeed, aname);
158 int32_t frame_count = 0;
159 fs.read(
reinterpret_cast<char*
>(&frame_count),
sizeof(int32_t));
162 for (
int i = 0; i < frame_count; i++) {
165 int32_t tile_count = 0;
166 fs.read(
reinterpret_cast<char*
>(&tile_count),
sizeof(int32_t));
168 for (
int j = 0; j < tile_count; j++) {
170 uint8_t tpal, tprior, tx, ty, tz;
171 bool tmx, tmy, tsize;
173 fs.read(
reinterpret_cast<char*
>(&tid),
sizeof(uint16_t));
174 fs.read(
reinterpret_cast<char*
>(&tpal),
sizeof(uint8_t));
175 fs.read(
reinterpret_cast<char*
>(&tmx),
sizeof(
bool));
176 fs.read(
reinterpret_cast<char*
>(&tmy),
sizeof(
bool));
177 fs.read(
reinterpret_cast<char*
>(&tprior),
sizeof(uint8_t));
178 fs.read(
reinterpret_cast<char*
>(&tsize),
sizeof(
bool));
179 fs.read(
reinterpret_cast<char*
>(&tx),
sizeof(uint8_t));
180 fs.read(
reinterpret_cast<char*
>(&ty),
sizeof(uint8_t));
181 fs.read(
reinterpret_cast<char*
>(&tz),
sizeof(uint8_t));
183 OamTile tile(tx, ty, tmx, tmy, tid, tpal, tsize, tprior);
212 uint8_t prize, palette, oamnbr, hitbox, health, damage;
213 fs.read(
reinterpret_cast<char*
>(&prize),
sizeof(uint8_t));
214 fs.read(
reinterpret_cast<char*
>(&palette),
sizeof(uint8_t));
215 fs.read(
reinterpret_cast<char*
>(&oamnbr),
sizeof(uint8_t));
216 fs.read(
reinterpret_cast<char*
>(&hitbox),
sizeof(uint8_t));
217 fs.read(
reinterpret_cast<char*
>(&health),
sizeof(uint8_t));
218 fs.read(
reinterpret_cast<char*
>(&damage),
sizeof(uint8_t));
228 if (fs.peek() != EOF) {
232 int32_t routine_count = 0;
233 fs.read(
reinterpret_cast<char*
>(&routine_count),
sizeof(int32_t));
235 for (
int i = 0; i < routine_count; i++) {
243 if (fs.peek() != EOF) {
248 return absl::OkStatus();
254 absl::Status
Save(
const std::string& filename) {
255 std::ofstream fs(filename, std::ios::binary);
257 return absl::InternalError(
"Failed to open file for writing: " + filename);
261 int32_t anim_count =
static_cast<int32_t
>(
animations.size());
262 fs.write(
reinterpret_cast<const char*
>(&anim_count),
sizeof(int32_t));
267 fs.write(
reinterpret_cast<const char*
>(&anim.frame_start),
sizeof(uint8_t));
268 fs.write(
reinterpret_cast<const char*
>(&anim.frame_end),
sizeof(uint8_t));
269 fs.write(
reinterpret_cast<const char*
>(&anim.frame_speed),
sizeof(uint8_t));
273 int32_t frame_count =
static_cast<int32_t
>(
editor.
Frames.size());
274 fs.write(
reinterpret_cast<const char*
>(&frame_count),
sizeof(int32_t));
278 int32_t tile_count =
static_cast<int32_t
>(frame.Tiles.size());
279 fs.write(
reinterpret_cast<const char*
>(&tile_count),
sizeof(int32_t));
281 for (
const auto& tile : frame.Tiles) {
282 fs.write(
reinterpret_cast<const char*
>(&tile.id),
sizeof(uint16_t));
283 fs.write(
reinterpret_cast<const char*
>(&tile.palette),
sizeof(uint8_t));
284 fs.write(
reinterpret_cast<const char*
>(&tile.mirror_x),
sizeof(bool));
285 fs.write(
reinterpret_cast<const char*
>(&tile.mirror_y),
sizeof(bool));
286 fs.write(
reinterpret_cast<const char*
>(&tile.priority),
sizeof(uint8_t));
287 fs.write(
reinterpret_cast<const char*
>(&tile.size),
sizeof(bool));
288 fs.write(
reinterpret_cast<const char*
>(&tile.x),
sizeof(uint8_t));
289 fs.write(
reinterpret_cast<const char*
>(&tile.y),
sizeof(uint8_t));
290 fs.write(
reinterpret_cast<const char*
>(&tile.z),
sizeof(uint8_t));
324 fs.write(
reinterpret_cast<const char*
>(&prize),
sizeof(uint8_t));
325 fs.write(
reinterpret_cast<const char*
>(&palette),
sizeof(uint8_t));
326 fs.write(
reinterpret_cast<const char*
>(&oamnbr),
sizeof(uint8_t));
327 fs.write(
reinterpret_cast<const char*
>(&hitbox),
sizeof(uint8_t));
328 fs.write(
reinterpret_cast<const char*
>(&health),
sizeof(uint8_t));
329 fs.write(
reinterpret_cast<const char*
>(&damage),
sizeof(uint8_t));
335 int32_t routine_count =
static_cast<int32_t
>(
userRoutines.size());
336 fs.write(
reinterpret_cast<const char*
>(&routine_count),
sizeof(int32_t));
346 return absl::OkStatus();
std::string ReadDotNetString(std::istream &is)
Read a .NET BinaryReader format string (7-bit encoded length prefix).
void WriteDotNetString(std::ostream &os, const std::string &str)
Write a .NET BinaryWriter format string (7-bit encoded length prefix).
std::vector< OamTile > Tiles
AnimationGroup(uint8_t fs, uint8_t fe, uint8_t fsp, std::string fn)
std::vector< OamTile > Tiles
OamTile(uint8_t x, uint8_t y, bool mx, bool my, uint16_t id, uint8_t pal, bool s, uint8_t p)
std::vector< Frame > Frames
std::vector< UserRoutine > user_routines
UserRoutine(std::string n, std::string c)
std::vector< UserRoutine > userRoutines
void Reset()
Reset all sprite data to defaults.
SpriteProperty property_persist
absl::Status Save(const std::string &filename)
Save a ZSM file to disk.
SpriteProperty property_hitbox
SpriteProperty property_isboss
SpriteProperty property_impervious
SpriteProperty property_collisionlayer
SpriteProperty property_prize
SpriteProperty property_imperviousarrow
SpriteProperty property_smallshadow
SpriteProperty property_blockable
SpriteProperty property_shadow
absl::Status Load(const std::string &filename)
Load a ZSM file from disk.
SpriteProperty property_deflectarrows
SpriteProperty property_customdeath
SpriteProperty property_imperviousmelee
SpriteProperty property_fast
SpriteProperty property_oamnbr
SpriteProperty property_interaction
SpriteProperty property_watersprite
SpriteProperty property_statue
SpriteProperty property_sprname
SpriteProperty property_damagesound
SpriteProperty property_damage
std::vector< AnimationGroup > animations
SpriteProperty property_palette
SpriteProperty property_harmless
SpriteProperty property_health
SpriteProperty property_canfall
SpriteProperty property_statis
SpriteProperty property_deflectprojectiles
SpriteProperty property_sprid