Cleanup DungeonEditor Update routine
This commit is contained in:
@@ -30,60 +30,12 @@ using ImGui::TableSetupColumn;
|
|||||||
|
|
||||||
absl::Status DungeonEditor::Update() {
|
absl::Status DungeonEditor::Update() {
|
||||||
if (!is_loaded_ && rom()->is_loaded()) {
|
if (!is_loaded_ && rom()->is_loaded()) {
|
||||||
for (int i = 0; i < 0x100 + 40; i++) {
|
RETURN_IF_ERROR(Initialize());
|
||||||
rooms_.emplace_back(zelda3::dungeon::Room(i));
|
|
||||||
rooms_[i].LoadHeader();
|
|
||||||
rooms_[i].LoadRoomFromROM();
|
|
||||||
if (flags()->kDrawDungeonRoomGraphics) {
|
|
||||||
rooms_[i].LoadRoomGraphics();
|
|
||||||
}
|
|
||||||
|
|
||||||
room_size_pointers_.push_back(rooms_[i].room_size_ptr());
|
|
||||||
if (rooms_[i].room_size_ptr() != 0x0A8000) {
|
|
||||||
room_size_addresses_[i] = rooms_[i].room_size_ptr();
|
|
||||||
}
|
|
||||||
|
|
||||||
auto dungeon_palette_ptr = rom()->paletteset_ids[rooms_[i].palette][0];
|
|
||||||
ASSIGN_OR_RETURN(auto palette_id,
|
|
||||||
rom()->ReadWord(0xDEC4B + dungeon_palette_ptr));
|
|
||||||
int p_id = palette_id / 180;
|
|
||||||
auto color = rom()->palette_group("dungeon_main")[p_id][3];
|
|
||||||
|
|
||||||
room_palette_[rooms_[i].palette] = color.rgb();
|
|
||||||
}
|
|
||||||
|
|
||||||
LoadDungeonRoomSize();
|
|
||||||
LoadRoomEntrances();
|
|
||||||
|
|
||||||
// Load the palette group and palette for the dungeon
|
|
||||||
full_palette_ =
|
|
||||||
rom()->palette_group("dungeon_main")[current_palette_group_id_];
|
|
||||||
ASSIGN_OR_RETURN(current_palette_group_,
|
|
||||||
gfx::CreatePaletteGroupFromLargePalette(full_palette_));
|
|
||||||
|
|
||||||
graphics_bin_ = *rom()->mutable_bitmap_manager();
|
|
||||||
// Create a vector of pointers to the current block bitmaps
|
|
||||||
for (int block : rooms_[current_room_id_].blocks()) {
|
|
||||||
room_gfx_sheets_.emplace_back(graphics_bin_[block].get());
|
|
||||||
}
|
|
||||||
|
|
||||||
is_loaded_ = true;
|
is_loaded_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (refresh_graphics_) {
|
if (refresh_graphics_) {
|
||||||
for (int i = 0; i < 8; i++) {
|
RETURN_IF_ERROR(RefreshGraphics());
|
||||||
int block = rooms_[current_room_id_].blocks()[i];
|
|
||||||
graphics_bin_[block].get()->ApplyPaletteWithTransparent(
|
|
||||||
current_palette_group_[current_palette_id_], 0);
|
|
||||||
rom()->UpdateBitmap(graphics_bin_[block].get(), true);
|
|
||||||
}
|
|
||||||
for (int i = 9; i < 16; i++) {
|
|
||||||
int block = rooms_[current_room_id_].blocks()[i];
|
|
||||||
graphics_bin_[block].get()->ApplyPaletteWithTransparent(
|
|
||||||
rom()->palette_group("sprites_aux1")[current_palette_id_], 0);
|
|
||||||
rom()->UpdateBitmap(graphics_bin_[block].get(), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
refresh_graphics_ = false;
|
refresh_graphics_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,6 +58,61 @@ absl::Status DungeonEditor::Update() {
|
|||||||
return absl::OkStatus();
|
return absl::OkStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
absl::Status DungeonEditor::Initialize() {
|
||||||
|
for (int i = 0; i < 0x100 + 40; i++) {
|
||||||
|
rooms_.emplace_back(zelda3::dungeon::Room(i));
|
||||||
|
rooms_[i].LoadHeader();
|
||||||
|
rooms_[i].LoadRoomFromROM();
|
||||||
|
if (flags()->kDrawDungeonRoomGraphics) {
|
||||||
|
rooms_[i].LoadRoomGraphics();
|
||||||
|
}
|
||||||
|
|
||||||
|
room_size_pointers_.push_back(rooms_[i].room_size_ptr());
|
||||||
|
if (rooms_[i].room_size_ptr() != 0x0A8000) {
|
||||||
|
room_size_addresses_[i] = rooms_[i].room_size_ptr();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto dungeon_palette_ptr = rom()->paletteset_ids[rooms_[i].palette][0];
|
||||||
|
ASSIGN_OR_RETURN(auto palette_id,
|
||||||
|
rom()->ReadWord(0xDEC4B + dungeon_palette_ptr));
|
||||||
|
int p_id = palette_id / 180;
|
||||||
|
auto color = rom()->palette_group("dungeon_main")[p_id][3];
|
||||||
|
|
||||||
|
room_palette_[rooms_[i].palette] = color.rgb();
|
||||||
|
}
|
||||||
|
|
||||||
|
LoadDungeonRoomSize();
|
||||||
|
LoadRoomEntrances();
|
||||||
|
|
||||||
|
// Load the palette group and palette for the dungeon
|
||||||
|
full_palette_ =
|
||||||
|
rom()->palette_group("dungeon_main")[current_palette_group_id_];
|
||||||
|
ASSIGN_OR_RETURN(current_palette_group_,
|
||||||
|
gfx::CreatePaletteGroupFromLargePalette(full_palette_));
|
||||||
|
|
||||||
|
graphics_bin_ = *rom()->mutable_bitmap_manager();
|
||||||
|
// Create a vector of pointers to the current block bitmaps
|
||||||
|
for (int block : rooms_[current_room_id_].blocks()) {
|
||||||
|
room_gfx_sheets_.emplace_back(graphics_bin_[block].get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
absl::Status DungeonEditor::RefreshGraphics() {
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
int block = rooms_[current_room_id_].blocks()[i];
|
||||||
|
graphics_bin_[block].get()->ApplyPaletteWithTransparent(
|
||||||
|
current_palette_group_[current_palette_id_], 0);
|
||||||
|
rom()->UpdateBitmap(graphics_bin_[block].get(), true);
|
||||||
|
}
|
||||||
|
for (int i = 9; i < 16; i++) {
|
||||||
|
int block = rooms_[current_room_id_].blocks()[i];
|
||||||
|
graphics_bin_[block].get()->ApplyPaletteWithTransparent(
|
||||||
|
rom()->palette_group("sprites_aux1")[current_palette_id_], 0);
|
||||||
|
rom()->UpdateBitmap(graphics_bin_[block].get(), true);
|
||||||
|
}
|
||||||
|
return absl::OkStatus();
|
||||||
|
}
|
||||||
|
|
||||||
void DungeonEditor::LoadDungeonRoomSize() {
|
void DungeonEditor::LoadDungeonRoomSize() {
|
||||||
std::map<int, std::vector<int>> rooms_by_bank;
|
std::map<int, std::vector<int>> rooms_by_bank;
|
||||||
for (const auto& room : room_size_addresses_) {
|
for (const auto& room : room_size_addresses_) {
|
||||||
@@ -483,7 +490,7 @@ void DungeonEditor::DrawDungeonCanvas(int room_id) {
|
|||||||
|
|
||||||
void DungeonEditor::DrawRoomGraphics() {
|
void DungeonEditor::DrawRoomGraphics() {
|
||||||
const auto height = 0x40;
|
const auto height = 0x40;
|
||||||
room_gfx_canvas_.DrawBackground(ImVec2(256 + 1, 0x10 * 0x40 + 1));
|
room_gfx_canvas_.DrawBackground(ImVec2(0x100 + 1, 0x10 * 0x40 + 1));
|
||||||
room_gfx_canvas_.DrawContextMenu();
|
room_gfx_canvas_.DrawContextMenu();
|
||||||
room_gfx_canvas_.DrawTileSelector(32);
|
room_gfx_canvas_.DrawTileSelector(32);
|
||||||
if (is_loaded_) {
|
if (is_loaded_) {
|
||||||
@@ -593,26 +600,19 @@ void DungeonEditor::LoadRoomEntrances() {
|
|||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
void DungeonEditor::CalculateUsageStats() {
|
void DungeonEditor::CalculateUsageStats() {
|
||||||
// Create a hash map of the usage for elements of each Dungeon Room such as
|
|
||||||
// the blockset, spriteset, palette, etc. This is so we can keep track of
|
|
||||||
// which graphics sets and palette sets are in use and which are not.
|
|
||||||
|
|
||||||
for (const auto& room : rooms_) {
|
for (const auto& room : rooms_) {
|
||||||
// Blockset
|
|
||||||
if (blockset_usage_.find(room.blockset) == blockset_usage_.end()) {
|
if (blockset_usage_.find(room.blockset) == blockset_usage_.end()) {
|
||||||
blockset_usage_[room.blockset] = 1;
|
blockset_usage_[room.blockset] = 1;
|
||||||
} else {
|
} else {
|
||||||
blockset_usage_[room.blockset] += 1;
|
blockset_usage_[room.blockset] += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Spriteset
|
|
||||||
if (spriteset_usage_.find(room.spriteset) == spriteset_usage_.end()) {
|
if (spriteset_usage_.find(room.spriteset) == spriteset_usage_.end()) {
|
||||||
spriteset_usage_[room.spriteset] = 1;
|
spriteset_usage_[room.spriteset] = 1;
|
||||||
} else {
|
} else {
|
||||||
spriteset_usage_[room.spriteset] += 1;
|
spriteset_usage_[room.spriteset] += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Palette
|
|
||||||
if (palette_usage_.find(room.palette) == palette_usage_.end()) {
|
if (palette_usage_.find(room.palette) == palette_usage_.end()) {
|
||||||
palette_usage_[room.palette] = 1;
|
palette_usage_[room.palette] = 1;
|
||||||
} else {
|
} else {
|
||||||
@@ -756,22 +756,14 @@ void DungeonEditor::DrawUsageStats() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DungeonEditor::DrawUsageGrid() {
|
void DungeonEditor::DrawUsageGrid() {
|
||||||
// Create a grid of 295 small squares which is 16 squares wide
|
|
||||||
// Each square represents a room in the game
|
|
||||||
// When you hover a square it should show a hover tooltip with the properties
|
|
||||||
// of the room such as the blockset, spriteset, palette, etc. Calculate the
|
|
||||||
// number of rows
|
|
||||||
int totalSquares = 296;
|
int totalSquares = 296;
|
||||||
int squaresWide = 16;
|
int squaresWide = 16;
|
||||||
int squaresTall = (totalSquares + squaresWide - 1) /
|
int squaresTall = (totalSquares + squaresWide - 1) /
|
||||||
squaresWide; // Ceiling of totalSquares/squaresWide
|
squaresWide; // Ceiling of totalSquares/squaresWide
|
||||||
|
|
||||||
// Loop through each row
|
|
||||||
for (int row = 0; row < squaresTall; ++row) {
|
for (int row = 0; row < squaresTall; ++row) {
|
||||||
// Start a new line for each row
|
|
||||||
ImGui::NewLine();
|
ImGui::NewLine();
|
||||||
|
|
||||||
// Loop through each column in the row
|
|
||||||
for (int col = 0; col < squaresWide; ++col) {
|
for (int col = 0; col < squaresWide; ++col) {
|
||||||
// Check if we have reached 295 squares
|
// Check if we have reached 295 squares
|
||||||
if (row * squaresWide + col >= totalSquares) {
|
if (row * squaresWide + col >= totalSquares) {
|
||||||
|
|||||||
@@ -46,6 +46,9 @@ class DungeonEditor : public Editor,
|
|||||||
void add_room(int i) { active_rooms_.push_back(i); }
|
void add_room(int i) { active_rooms_.push_back(i); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
absl::Status Initialize();
|
||||||
|
absl::Status RefreshGraphics();
|
||||||
|
|
||||||
void LoadDungeonRoomSize();
|
void LoadDungeonRoomSize();
|
||||||
|
|
||||||
void UpdateDungeonRoomView();
|
void UpdateDungeonRoomView();
|
||||||
|
|||||||
Reference in New Issue
Block a user