7#include "absl/strings/str_format.h"
18absl::StatusOr<zelda3::RoomsetUsageReport>
21 return absl::FailedPreconditionError(
22 "Load a ROM to inspect shared graphics.");
43 room_opts.
tooltip =
"Click to refocus viewer on this room";
44 room_opts.
on_click = [
this, room_id]() {
51 std::move(room_opts));
59 absl::StrFormat(
"%d rooms loaded of %d total", loaded, total);
61 absl::StrFormat(
"%d/%d", loaded, total),
62 std::move(rooms_opts));
68 "This room has pending editor changes that are not yet applied to the "
71 std::move(current_room_opts));
75 mode_opts.
tooltip =
"Click to toggle Workbench / Standalone workflow";
82 std::move(mode_opts));
108 if (room ==
nullptr) {
110 .id =
"room_not_loaded",
112 .message =
"Room data has not been materialized yet.",
120 {.id =
"graphics_entrance",
121 .label =
"Graphics entrance",
125 : fallback.entrance_id >= 0
130 {.id =
"graphics_source",
131 .label =
"Graphics source",
133 {.id =
"dungeon_owner",
134 .label =
"Dungeon owner",
140 .value = absl::StrFormat(
"main 0x%02X / room 0x%02X",
144 .label =
"Spriteset",
145 .value = absl::StrFormat(
"0x%02X", room->
spriteset())},
148 .value = absl::StrFormat(
"0x%02X", room->
palette())},
162 .value = std::to_string(room->
GetSprites().size())},
165 .value = std::to_string(room->
GetDoors().size())},
168 .value = std::to_string(room->
GetStairs().size())},
171 .value = std::to_string(room->
GetChests().size())},
173 .label =
"Pot items",
174 .value = std::to_string(room->
GetPotItems().size())},
182 .id =
"ambiguous_dungeon_graphics_owner",
184 .message = absl::StrFormat(
185 "Owner entrances disagree on main GFX. Preview: %s (0x%02X). "
186 "Select the entrance used in game to verify the walls.",
189 .action_id =
"open_entrance",
193 .id =
"dungeon_owner_unavailable",
195 .message = absl::StrFormat(
"Dungeon ownership is unavailable: %s",
202 camera.has_value()) {
205 .id =
"entrance_camera",
206 .label =
"Entrance camera",
207 .value = !validation.geometry_valid() ?
"Unsafe geometry"
208 : validation.matches_derived()
209 ?
"Matches player position"
210 : absl::StrFormat(
"%zu derived difference(s)",
211 validation.differences.size()),
213 if (!validation.geometry_valid()) {
215 .id =
"entrance_camera_invalid",
217 .message = validation.errors.front(),
218 .action_id =
"open_entrance",
220 }
else if (!validation.matches_derived()) {
222 .id =
"entrance_camera_custom",
225 "Entrance camera is safe but differs from derived values.",
226 .action_id =
"open_entrance",
235 "dungeon.room_matrix",
237 "dungeon.room_graphics",
246 {.id =
"open_matrix",
247 .label =
"Room Matrix",
248 .target =
"dungeon.room_matrix"},
249 {.id =
"open_entrance",
250 .label =
"Entrances",
251 .target =
"dungeon.entrance_properties"},
252 {.id =
"open_graphics",
253 .label =
"Room Graphics",
254 .target =
"dungeon.room_graphics"},
258 .id =
"open_minecart",
259 .label =
"Minecart Tracks",
void Publish(const T &event)
const MinecartTrackLayout & minecart_track_layout() const
bool loaded() const
Check if the manifest has been loaded.
EditorContextSnapshot BuildContextSnapshot() const override
DungeonRenderContext ResolveDungeonRenderContextForRoom(int room_id) const
std::function< const zelda3::Overworld *()> room_graphics_overworld_provider_
void ToggleWorkbenchWorkflowMode(bool show_toast=true)
void ContributeStatus(StatusBar *status_bar) override
absl::StatusOr< zelda3::RoomsetUsageReport > GetRoomGraphicsUsage(int roomset) const
bool IsWorkbenchWorkflowEnabled() const
std::optional< DungeonEntranceCameraState > GetEntranceCameraState(int slot_index) const
std::string dungeon_render_context_census_error_
static bool IsValidRoomId(int room_id)
int LoadedRoomCount() const
zelda3::GameData * game_data_
static constexpr const char * kMinecartTrackEditorId
bool CurrentRoomHasPendingChanges() const
int current_room_id() const
int TotalRoomCount() const
zelda3::Room * GetIfMaterialized(int room_id)
void ForEachLoaded(Fn &&fn)
EditorDependencies dependencies_
A session-aware status bar displayed at the bottom of the application.
void SetCustomSegment(const std::string &key, const std::string &value)
Set a custom segment with key-value pair.
void SetEditorMode(const std::string &mode)
Set the current editor mode or tool.
const std::vector< chest_data > & GetChests() const
bool HasUnsavedChanges() const
const std::vector< Door > & GetDoors() const
size_t GetTileObjectCount() const
const std::vector< staircase > & GetStairs() const
uint8_t spriteset() const
const std::vector< zelda3::Sprite > & GetSprites() const
const std::vector< PotItem > & GetPotItems() const
std::string GetRoomLabel(const project::YazeProject *project, int room_id)
constexpr const char * kStandalone
constexpr const char * kWorkbench
Editors are the view controllers for the application.
std::string DungeonEntrancePreviewLabel(int slot)
const char * DungeonRenderContextSourceName(DungeonRenderContextSource source)
void AppendResolvedGraphicsContext(EditorContextSnapshot &snapshot, const zelda3::ResolvedGraphicsContext &context)
DungeonEntranceCameraValidation ValidateDungeonEntranceCamera(const DungeonEntranceCameraState &state)
absl::StatusOr< RoomsetUsageReport > DescribeRoomsetUsage(Rom &rom, GameData &game_data, int roomset, const std::map< int, RoomGfxInfo > &rooms, const Overworld *live_overworld)
ResolvedGraphicsContext DescribeDungeonGraphicsContext(const Room &room, const GraphicsContextIdentity &identity)
std::map< int, RoomGfxInfo > CollectRoomGfx(const Rom &rom)
constexpr int kNumDungeonSpawnPoints
std::optional< Source > source
DungeonRenderContextSource source
zelda3::RoomDefaultEntrance default_entrance
bool uses_entrance() const
uint8_t effective_blockset() const
std::vector< EditorContextValue > counts
std::string pending_label
std::vector< EditorContextAction > actions
bool HasCapability(const std::string &capability) const
std::vector< EditorContextDiagnostic > diagnostics
std::string semantic_owner
std::vector< EditorContextValue > metadata
std::vector< std::string > capabilities
project::YazeProject * project
GlobalEditorContext * global_context
static JumpToRoomRequestEvent Create(int room, size_t session=0)
Optional behavior for an interactive status bar segment.
std::function< void()> on_click
core::HackManifest hack_manifest