yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
sprite.h
Go to the documentation of this file.
1#ifndef YAZE_APP_ZELDA3_SPRITE_H
2#define YAZE_APP_ZELDA3_SPRITE_H
3
5
6#include <cstddef>
7#include <cstdint>
8#include <span>
9#include <string>
10#include <vector>
11
12#include "zelda3/common.h"
14
15namespace yaze {
16namespace zelda3 {
17
18struct SpriteOamLayout;
19
20// Sprite names defined in sprite.cc to avoid static initialization order issues
21extern const std::string kSpriteDefaultNames[256];
22// Expanded names (from hmagic sprname.dat, 0x11c entries). Might differ in
23// wording/coverage; consumers can choose which to use.
24extern const char* const kSpriteNames[];
25extern const size_t kSpriteNameCount;
26
27// Global preference for using hmagic names when available.
28void SetPreferHmagicSpriteNames(bool prefer);
30
31// Utility to resolve a sprite name; uses hmagic list when enabled and in range,
32// otherwise falls back to the 256-entry defaults.
33const char* ResolveSpriteName(uint16_t id);
34
39class Sprite : public GameEntity {
40 public:
41 Sprite() = default;
42 Sprite(const std::vector<uint8_t>& src, uint8_t overworld_map_id, uint8_t id,
43 uint8_t x, uint8_t y, int map_x, int map_y)
44 : map_id_(static_cast<int>(overworld_map_id)),
45 id_(id),
46 nx_(x),
47 ny_(y),
50 current_gfx_(src) {
52 entity_id_ = id;
53 x_ = map_x_;
54 y_ = map_y_;
55 overworld_ = true;
57 // Defer preview_gfx_ allocation until DrawSpriteTile() is called
58 }
59
60 Sprite(uint8_t id, uint8_t x, uint8_t y, uint8_t subtype, uint8_t layer)
61 : id_(id), nx_(x), ny_(y), subtype_(subtype), layer_(layer) {
62 x_ = x;
63 y_ = y;
65 if (((subtype & 0x07) == 0x07) && id > 0 && id <= 0x1A) {
66 name_ = kOverlordNames[id - 1];
67 overlord_ = 1;
68 }
69 }
70
71 void InitSprite(const std::vector<uint8_t>& src, uint8_t overworld_map_id,
72 uint8_t id, uint8_t x, uint8_t y, int map_x, int map_y) {
73 current_gfx_ = src;
74 overworld_ = true;
75 map_id_ = static_cast<int>(overworld_map_id);
76 id_ = id;
78 entity_id_ = id;
79 x_ = map_x_;
80 y_ = map_y_;
81 nx_ = x;
82 ny_ = y;
84 map_x_ = map_x;
85 map_y_ = map_y;
86 // Defer preview_gfx_ allocation until DrawSpriteTile() is called
87 }
88
89 void Draw();
90 // Optional source-backed static layout; omitted layouts keep vanilla drawing.
91 void RenderPreviewGraphics(std::span<const uint8_t> graphics,
92 const SpriteOamLayout* layout_override = nullptr,
93 std::span<const uint8_t> graphics_resource = {});
95 void DrawSpriteTile(int x, int y, int srcx, int srcy, int pal,
96 bool mirror_x = false, bool mirror_y = false,
97 int sizex = 2, int sizey = 2);
98
99 void UpdateMapProperties(uint16_t map_id,
100 const void* context = nullptr) override;
101 void UpdateCoordinates(int map_x, int map_y);
102
103 auto preview_graphics() const { return &preview_gfx_; }
104 // Pixel-buffer extent relative to the sprite's room anchor. External
105 // previews may grow beyond the legacy 64x64 extent; use w as the row stride.
106 SDL_Rect preview_bounds() const { return preview_bounds_; }
107 auto id() const { return id_; }
108 auto set_id(uint8_t id) { id_ = id; }
109 auto x() const { return x_; }
110 auto y() const { return y_; }
111 auto nx() const { return nx_; }
112 auto ny() const { return ny_; }
113 auto map_id() const { return map_id_; }
114 auto map_x() const { return map_x_; }
115 auto map_y() const { return map_y_; }
116 auto game_state() const { return game_state_; }
117
118 auto layer() const { return layer_; }
119 auto subtype() const { return subtype_; }
120
121 auto width() const { return width_; }
122 auto height() const { return height_; }
123 auto name() { return name_; }
124 auto deleted() const { return deleted_; }
126 auto set_key_drop(int key) { key_drop_ = key; }
127 auto key_drop() const { return key_drop_; }
128
129 // Check if this sprite is an overlord (special sprite type with different limits)
130 bool IsOverlord() const { return overlord_ != 0; }
131
132 // Setters for editable properties
134 void set_layer(int layer) { layer_ = layer; }
135
136 private:
137 uint8_t map_id_;
138 uint8_t game_state_;
139 uint8_t id_;
140 uint8_t nx_;
141 uint8_t ny_;
142 uint8_t overlord_ = 0;
143 uint8_t lower_x_ = 32;
144 uint8_t lower_y_ = 32;
145 uint8_t higher_x_ = 0;
146 uint8_t higher_y_ = 0;
147
148 int width_ = 16;
149 int height_ = 16;
150 int map_x_ = 0;
151 int map_y_ = 0;
152 int layer_ = 0;
153 int subtype_ = 0;
154 int key_drop_ = 0;
155
156 bool deleted_ = false;
158
159 std::string name_;
160 static constexpr SDL_Rect kDefaultPreviewBounds = {-16, -16, 64, 64};
163 std::vector<uint8_t> preview_gfx_;
164 std::vector<uint8_t> current_gfx_;
165 const uint8_t* external_gfx_ = nullptr;
167
168 SDL_Rect bounding_box_{};
169};
170
171} // namespace zelda3
172} // namespace yaze
173
174#endif
Base class for all overworld and dungeon entities.
Definition common.h:31
enum yaze::zelda3::GameEntity::EntityType entity_type_
A class for managing sprites in the overworld and underworld.
Definition sprite.h:39
std::vector< uint8_t > preview_gfx_
Definition sprite.h:163
auto id() const
Definition sprite.h:107
void set_subtype(int subtype)
Definition sprite.h:133
const uint8_t * external_gfx_
Definition sprite.h:165
void RenderPreviewGraphics(std::span< const uint8_t > graphics, const SpriteOamLayout *layout_override=nullptr, std::span< const uint8_t > graphics_resource={})
Definition sprite.cc:1194
uint8_t game_state_
Definition sprite.h:138
Sprite(const std::vector< uint8_t > &src, uint8_t overworld_map_id, uint8_t id, uint8_t x, uint8_t y, int map_x, int map_y)
Definition sprite.h:42
void ClearPreviewGraphics()
Definition sprite.cc:1281
void UpdateMapProperties(uint16_t map_id, const void *context=nullptr) override
Update entity properties based on map position.
Definition sprite.cc:328
bool measuring_preview_bounds_
Definition sprite.h:162
auto map_x() const
Definition sprite.h:114
std::string name_
Definition sprite.h:159
void DrawSpriteTile(int x, int y, int srcx, int srcy, int pal, bool mirror_x=false, bool mirror_y=false, int sizex=2, int sizey=2)
Definition sprite.cc:1286
void InitSprite(const std::vector< uint8_t > &src, uint8_t overworld_map_id, uint8_t id, uint8_t x, uint8_t y, int map_x, int map_y)
Definition sprite.h:71
std::vector< uint8_t > current_gfx_
Definition sprite.h:164
SDL_Rect bounding_box_
Definition sprite.h:168
void UpdateCoordinates(int map_x, int map_y)
Definition sprite.cc:335
auto key_drop() const
Definition sprite.h:127
void set_layer(int layer)
Definition sprite.h:134
auto layer() const
Definition sprite.h:118
auto set_key_drop(int key)
Definition sprite.h:126
auto game_state() const
Definition sprite.h:116
bool IsOverlord() const
Definition sprite.h:130
auto map_id() const
Definition sprite.h:113
size_t external_gfx_size_
Definition sprite.h:166
auto set_id(uint8_t id)
Definition sprite.h:108
auto subtype() const
Definition sprite.h:119
Sprite(uint8_t id, uint8_t x, uint8_t y, uint8_t subtype, uint8_t layer)
Definition sprite.h:60
auto nx() const
Definition sprite.h:111
auto preview_graphics() const
Definition sprite.h:103
auto y() const
Definition sprite.h:110
auto deleted() const
Definition sprite.h:124
auto width() const
Definition sprite.h:121
static constexpr SDL_Rect kDefaultPreviewBounds
Definition sprite.h:160
auto set_deleted(bool deleted)
Definition sprite.h:125
auto x() const
Definition sprite.h:109
SDL_Rect preview_bounds() const
Definition sprite.h:106
auto height() const
Definition sprite.h:122
auto map_y() const
Definition sprite.h:115
auto ny() const
Definition sprite.h:112
SDL_Rect preview_bounds_
Definition sprite.h:161
const size_t kSpriteNameCount
Definition sprite.cc:296
const char *const kSpriteNames[]
Definition sprite.cc:295
const std::string kOverlordNames[26]
Definition sprite.cc:299
const std::string kSpriteDefaultNames[256]
Definition sprite.cc:16
bool PreferHmagicSpriteNames()
Definition sprite.cc:280
void SetPreferHmagicSpriteNames(bool prefer)
Definition sprite.cc:276
const char * ResolveSpriteName(uint16_t id)
Definition sprite.cc:287
SDL2/SDL3 compatibility layer.
Complete OAM layout for a vanilla sprite.