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
18// Sprite names defined in sprite.cc to avoid static initialization order issues
19extern const std::string kSpriteDefaultNames[256];
20// Expanded names (from hmagic sprname.dat, 0x11c entries). Might differ in
21// wording/coverage; consumers can choose which to use.
22extern const char* const kSpriteNames[];
23extern const size_t kSpriteNameCount;
24
25// Global preference for using hmagic names when available.
26void SetPreferHmagicSpriteNames(bool prefer);
28
29// Utility to resolve a sprite name; uses hmagic list when enabled and in range,
30// otherwise falls back to the 256-entry defaults.
31const char* ResolveSpriteName(uint16_t id);
32
37class Sprite : public GameEntity {
38 public:
39 Sprite() = default;
40 Sprite(const std::vector<uint8_t>& src, uint8_t overworld_map_id, uint8_t id,
41 uint8_t x, uint8_t y, int map_x, int map_y)
42 : map_id_(static_cast<int>(overworld_map_id)),
43 id_(id),
44 nx_(x),
45 ny_(y),
48 current_gfx_(src) {
50 entity_id_ = id;
51 x_ = map_x_;
52 y_ = map_y_;
53 overworld_ = true;
55 // Defer preview_gfx_ allocation until DrawSpriteTile() is called
56 }
57
58 Sprite(uint8_t id, uint8_t x, uint8_t y, uint8_t subtype, uint8_t layer)
59 : id_(id), nx_(x), ny_(y), subtype_(subtype), layer_(layer) {
60 x_ = x;
61 y_ = y;
63 if (((subtype & 0x07) == 0x07) && id > 0 && id <= 0x1A) {
64 name_ = kOverlordNames[id - 1];
65 overlord_ = 1;
66 }
67 }
68
69 void InitSprite(const std::vector<uint8_t>& src, uint8_t overworld_map_id,
70 uint8_t id, uint8_t x, uint8_t y, int map_x, int map_y) {
71 current_gfx_ = src;
72 overworld_ = true;
73 map_id_ = static_cast<int>(overworld_map_id);
74 id_ = id;
76 entity_id_ = id;
77 x_ = map_x_;
78 y_ = map_y_;
79 nx_ = x;
80 ny_ = y;
82 map_x_ = map_x;
83 map_y_ = map_y;
84 // Defer preview_gfx_ allocation until DrawSpriteTile() is called
85 }
86
87 void Draw();
88 void RenderPreviewGraphics(std::span<const uint8_t> graphics);
90 void DrawSpriteTile(int x, int y, int srcx, int srcy, int pal,
91 bool mirror_x = false, bool mirror_y = false,
92 int sizex = 2, int sizey = 2);
93
94 void UpdateMapProperties(uint16_t map_id,
95 const void* context = nullptr) override;
96 void UpdateCoordinates(int map_x, int map_y);
97
98 auto preview_graphics() const { return &preview_gfx_; }
99 auto id() const { return id_; }
100 auto set_id(uint8_t id) { id_ = id; }
101 auto x() const { return x_; }
102 auto y() const { return y_; }
103 auto nx() const { return nx_; }
104 auto ny() const { return ny_; }
105 auto map_id() const { return map_id_; }
106 auto map_x() const { return map_x_; }
107 auto map_y() const { return map_y_; }
108 auto game_state() const { return game_state_; }
109
110 auto layer() const { return layer_; }
111 auto subtype() const { return subtype_; }
112
113 auto width() const { return width_; }
114 auto height() const { return height_; }
115 auto name() { return name_; }
116 auto deleted() const { return deleted_; }
118 auto set_key_drop(int key) { key_drop_ = key; }
119 auto key_drop() const { return key_drop_; }
120
121 // Check if this sprite is an overlord (special sprite type with different limits)
122 bool IsOverlord() const { return overlord_ != 0; }
123
124 // Setters for editable properties
126 void set_layer(int layer) { layer_ = layer; }
127
128 private:
129 uint8_t map_id_;
130 uint8_t game_state_;
131 uint8_t id_;
132 uint8_t nx_;
133 uint8_t ny_;
134 uint8_t overlord_ = 0;
135 uint8_t lower_x_ = 32;
136 uint8_t lower_y_ = 32;
137 uint8_t higher_x_ = 0;
138 uint8_t higher_y_ = 0;
139
140 int width_ = 16;
141 int height_ = 16;
142 int map_x_ = 0;
143 int map_y_ = 0;
144 int layer_ = 0;
145 int subtype_ = 0;
146 int key_drop_ = 0;
147
148 bool deleted_ = false;
150
151 std::string name_;
152 std::vector<uint8_t> preview_gfx_;
153 std::vector<uint8_t> current_gfx_;
154 const uint8_t* external_gfx_ = nullptr;
156
158};
159
160} // namespace zelda3
161} // namespace yaze
162
163#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:37
std::vector< uint8_t > preview_gfx_
Definition sprite.h:152
auto id() const
Definition sprite.h:99
void set_subtype(int subtype)
Definition sprite.h:125
const uint8_t * external_gfx_
Definition sprite.h:154
uint8_t game_state_
Definition sprite.h:130
void RenderPreviewGraphics(std::span< const uint8_t > graphics)
Definition sprite.cc:1185
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:40
void ClearPreviewGraphics()
Definition sprite.cc:1221
void UpdateMapProperties(uint16_t map_id, const void *context=nullptr) override
Update entity properties based on map position.
Definition sprite.cc:325
auto map_x() const
Definition sprite.h:106
std::string name_
Definition sprite.h:151
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:1225
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:69
std::vector< uint8_t > current_gfx_
Definition sprite.h:153
SDL_Rect bounding_box_
Definition sprite.h:157
void UpdateCoordinates(int map_x, int map_y)
Definition sprite.cc:332
auto key_drop() const
Definition sprite.h:119
void set_layer(int layer)
Definition sprite.h:126
auto layer() const
Definition sprite.h:110
auto set_key_drop(int key)
Definition sprite.h:118
auto game_state() const
Definition sprite.h:108
bool IsOverlord() const
Definition sprite.h:122
auto map_id() const
Definition sprite.h:105
size_t external_gfx_size_
Definition sprite.h:155
auto set_id(uint8_t id)
Definition sprite.h:100
auto subtype() const
Definition sprite.h:111
Sprite(uint8_t id, uint8_t x, uint8_t y, uint8_t subtype, uint8_t layer)
Definition sprite.h:58
auto nx() const
Definition sprite.h:103
auto preview_graphics() const
Definition sprite.h:98
auto y() const
Definition sprite.h:102
auto deleted() const
Definition sprite.h:116
auto width() const
Definition sprite.h:113
auto set_deleted(bool deleted)
Definition sprite.h:117
auto x() const
Definition sprite.h:101
auto height() const
Definition sprite.h:114
auto map_y() const
Definition sprite.h:107
auto ny() const
Definition sprite.h:104
const size_t kSpriteNameCount
Definition sprite.cc:293
const char *const kSpriteNames[]
Definition sprite.cc:292
const std::string kOverlordNames[26]
Definition sprite.cc:296
const std::string kSpriteDefaultNames[256]
Definition sprite.cc:13
bool PreferHmagicSpriteNames()
Definition sprite.cc:277
void SetPreferHmagicSpriteNames(bool prefer)
Definition sprite.cc:273
const char * ResolveSpriteName(uint16_t id)
Definition sprite.cc:284
SDL2/SDL3 compatibility layer.