Add OverworldEntranceTileTypes and remove EntranceContext boiler plate
This commit is contained in:
@@ -62,7 +62,8 @@ absl::Status OverworldEditor::Update() {
|
|||||||
RETURN_IF_ERROR(tile16_editor_.InitBlockset(
|
RETURN_IF_ERROR(tile16_editor_.InitBlockset(
|
||||||
tile16_blockset_bmp_, current_gfx_bmp_, tile16_individual_,
|
tile16_blockset_bmp_, current_gfx_bmp_, tile16_individual_,
|
||||||
*overworld_.mutable_all_tiles_types()));
|
*overworld_.mutable_all_tiles_types()));
|
||||||
RETURN_IF_ERROR(LoadEntranceTileTypes(*rom()));
|
ASSIGN_OR_RETURN(entrance_tiletypes_,
|
||||||
|
zelda3::LoadEntranceTileTypes(*rom()));
|
||||||
all_gfx_loaded_ = true;
|
all_gfx_loaded_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,17 +99,21 @@ void OverworldEditor::DrawToolset() {
|
|||||||
|
|
||||||
if (toolset_table_.column_contents.empty()) {
|
if (toolset_table_.column_contents.empty()) {
|
||||||
gui::AddTableColumn(toolset_table_, "##Undo", [&]() {
|
gui::AddTableColumn(toolset_table_, "##Undo", [&]() {
|
||||||
if (Button(ICON_MD_UNDO)) status_ = Undo();
|
if (Button(ICON_MD_UNDO))
|
||||||
|
status_ = Undo();
|
||||||
});
|
});
|
||||||
gui::AddTableColumn(toolset_table_, "##Redo", [&]() {
|
gui::AddTableColumn(toolset_table_, "##Redo", [&]() {
|
||||||
if (Button(ICON_MD_REDO)) status_ = Redo();
|
if (Button(ICON_MD_REDO))
|
||||||
|
status_ = Redo();
|
||||||
});
|
});
|
||||||
gui::AddTableColumn(toolset_table_, "##Sep1", ICON_MD_MORE_VERT);
|
gui::AddTableColumn(toolset_table_, "##Sep1", ICON_MD_MORE_VERT);
|
||||||
gui::AddTableColumn(toolset_table_, "##ZoomOut", [&]() {
|
gui::AddTableColumn(toolset_table_, "##ZoomOut", [&]() {
|
||||||
if (Button(ICON_MD_ZOOM_OUT)) ow_map_canvas_.ZoomOut();
|
if (Button(ICON_MD_ZOOM_OUT))
|
||||||
|
ow_map_canvas_.ZoomOut();
|
||||||
});
|
});
|
||||||
gui::AddTableColumn(toolset_table_, "##ZoomIn", [&]() {
|
gui::AddTableColumn(toolset_table_, "##ZoomIn", [&]() {
|
||||||
if (Button(ICON_MD_ZOOM_IN)) ow_map_canvas_.ZoomIn();
|
if (Button(ICON_MD_ZOOM_IN))
|
||||||
|
ow_map_canvas_.ZoomIn();
|
||||||
});
|
});
|
||||||
gui::AddTableColumn(toolset_table_, "##Fullscreen", [&]() {
|
gui::AddTableColumn(toolset_table_, "##Fullscreen", [&]() {
|
||||||
if (Button(ICON_MD_OPEN_IN_FULL))
|
if (Button(ICON_MD_OPEN_IN_FULL))
|
||||||
@@ -163,11 +168,13 @@ void OverworldEditor::DrawToolset() {
|
|||||||
HOVER_HINT("Music");
|
HOVER_HINT("Music");
|
||||||
});
|
});
|
||||||
gui::AddTableColumn(toolset_table_, "##Tile16Editor", [&]() {
|
gui::AddTableColumn(toolset_table_, "##Tile16Editor", [&]() {
|
||||||
if (Button(ICON_MD_GRID_VIEW)) show_tile16_editor_ = !show_tile16_editor_;
|
if (Button(ICON_MD_GRID_VIEW))
|
||||||
|
show_tile16_editor_ = !show_tile16_editor_;
|
||||||
HOVER_HINT("Tile16 Editor");
|
HOVER_HINT("Tile16 Editor");
|
||||||
});
|
});
|
||||||
gui::AddTableColumn(toolset_table_, "##GfxGroupEditor", [&]() {
|
gui::AddTableColumn(toolset_table_, "##GfxGroupEditor", [&]() {
|
||||||
if (Button(ICON_MD_TABLE_CHART)) show_gfx_group = !show_gfx_group;
|
if (Button(ICON_MD_TABLE_CHART))
|
||||||
|
show_gfx_group = !show_gfx_group;
|
||||||
HOVER_HINT("Gfx Group Editor");
|
HOVER_HINT("Gfx Group Editor");
|
||||||
});
|
});
|
||||||
gui::AddTableColumn(toolset_table_, "##sep3", ICON_MD_MORE_VERT);
|
gui::AddTableColumn(toolset_table_, "##sep3", ICON_MD_MORE_VERT);
|
||||||
@@ -496,10 +503,12 @@ void OverworldEditor::CheckForOverworldEdits() {
|
|||||||
int end_x = std::floor(end.x / kTile16Size) * kTile16Size;
|
int end_x = std::floor(end.x / kTile16Size) * kTile16Size;
|
||||||
int end_y = std::floor(end.y / kTile16Size) * kTile16Size;
|
int end_y = std::floor(end.y / kTile16Size) * kTile16Size;
|
||||||
|
|
||||||
if (start_x > end_x) std::swap(start_x, end_x);
|
if (start_x > end_x)
|
||||||
if (start_y > end_y) std::swap(start_y, end_y);
|
std::swap(start_x, end_x);
|
||||||
|
if (start_y > end_y)
|
||||||
|
std::swap(start_y, end_y);
|
||||||
|
|
||||||
constexpr int local_map_size = 512; // Size of each local map
|
constexpr int local_map_size = 512; // Size of each local map
|
||||||
// Number of tiles per local map (since each tile is 16x16)
|
// Number of tiles per local map (since each tile is 16x16)
|
||||||
constexpr int tiles_per_local_map = local_map_size / kTile16Size;
|
constexpr int tiles_per_local_map = local_map_size / kTile16Size;
|
||||||
|
|
||||||
@@ -650,7 +659,8 @@ void OverworldEditor::DrawOverworldCanvas() {
|
|||||||
if (current_mode == EditingMode::DRAW_TILE) {
|
if (current_mode == EditingMode::DRAW_TILE) {
|
||||||
CheckForOverworldEdits();
|
CheckForOverworldEdits();
|
||||||
}
|
}
|
||||||
if (IsItemHovered()) status_ = CheckForCurrentMap();
|
if (IsItemHovered())
|
||||||
|
status_ = CheckForCurrentMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
ow_map_canvas_.DrawGrid();
|
ow_map_canvas_.DrawGrid();
|
||||||
@@ -1136,7 +1146,8 @@ void OverworldEditor::RefreshOverworldMap() {
|
|||||||
// We need to update the map and its siblings if it's a large map
|
// We need to update the map and its siblings if it's a large map
|
||||||
for (int i = 1; i < 4; i++) {
|
for (int i = 1; i < 4; i++) {
|
||||||
int sibling_index = overworld_.overworld_map(source_map_id)->parent() + i;
|
int sibling_index = overworld_.overworld_map(source_map_id)->parent() + i;
|
||||||
if (i >= 2) sibling_index += 6;
|
if (i >= 2)
|
||||||
|
sibling_index += 6;
|
||||||
futures.push_back(
|
futures.push_back(
|
||||||
std::async(std::launch::async, refresh_map_async, sibling_index));
|
std::async(std::launch::async, refresh_map_async, sibling_index));
|
||||||
indices[i] = sibling_index;
|
indices[i] = sibling_index;
|
||||||
@@ -1165,7 +1176,8 @@ absl::Status OverworldEditor::RefreshMapPalette() {
|
|||||||
// We need to update the map and its siblings if it's a large map
|
// We need to update the map and its siblings if it's a large map
|
||||||
for (int i = 1; i < 4; i++) {
|
for (int i = 1; i < 4; i++) {
|
||||||
int sibling_index = overworld_.overworld_map(current_map_)->parent() + i;
|
int sibling_index = overworld_.overworld_map(current_map_)->parent() + i;
|
||||||
if (i >= 2) sibling_index += 6;
|
if (i >= 2)
|
||||||
|
sibling_index += 6;
|
||||||
RETURN_IF_ERROR(
|
RETURN_IF_ERROR(
|
||||||
overworld_.mutable_overworld_map(sibling_index)->LoadPalette());
|
overworld_.mutable_overworld_map(sibling_index)->LoadPalette());
|
||||||
RETURN_IF_ERROR(
|
RETURN_IF_ERROR(
|
||||||
@@ -1408,7 +1420,7 @@ void OverworldEditor::DrawUsageGrid() {
|
|||||||
int totalSquares = 128;
|
int totalSquares = 128;
|
||||||
int squaresWide = 8;
|
int squaresWide = 8;
|
||||||
int squaresTall = (totalSquares + squaresWide - 1) /
|
int squaresTall = (totalSquares + squaresWide - 1) /
|
||||||
squaresWide; // Ceiling of totalSquares/squaresWide
|
squaresWide; // Ceiling of totalSquares/squaresWide
|
||||||
|
|
||||||
// Loop through each row
|
// Loop through each row
|
||||||
for (int row = 0; row < squaresTall; ++row) {
|
for (int row = 0; row < squaresTall; ++row) {
|
||||||
@@ -1423,9 +1435,8 @@ void OverworldEditor::DrawUsageGrid() {
|
|||||||
|
|
||||||
// Set highlight color if needed
|
// Set highlight color if needed
|
||||||
if (highlight) {
|
if (highlight) {
|
||||||
PushStyleColor(ImGuiCol_Button,
|
PushStyleColor(ImGuiCol_Button, ImVec4(1.0f, 0.5f, 0.0f,
|
||||||
ImVec4(1.0f, 0.5f, 0.0f,
|
1.0f)); // Or any highlight color
|
||||||
1.0f)); // Or any highlight color
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a button or selectable for each square
|
// Create a button or selectable for each square
|
||||||
@@ -1510,5 +1521,5 @@ void OverworldEditor::InitializeZeml() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace editor
|
} // namespace editor
|
||||||
} // namespace yaze
|
} // namespace yaze
|
||||||
|
|||||||
@@ -56,31 +56,7 @@ constexpr absl::string_view kTileSelectorTab = "##TileSelectorTabBar";
|
|||||||
constexpr absl::string_view kOWEditTable = "##OWEditTable";
|
constexpr absl::string_view kOWEditTable = "##OWEditTable";
|
||||||
constexpr absl::string_view kOWMapTable = "#MapSettingsTable";
|
constexpr absl::string_view kOWMapTable = "#MapSettingsTable";
|
||||||
|
|
||||||
constexpr int kEntranceTileTypePtrLow = 0xDB8BF;
|
|
||||||
constexpr int kEntranceTileTypePtrHigh = 0xDB917;
|
|
||||||
constexpr int kNumEntranceTileTypes = 0x2C;
|
|
||||||
|
|
||||||
class EntranceContext {
|
|
||||||
public:
|
|
||||||
absl::Status LoadEntranceTileTypes(Rom& rom) {
|
|
||||||
int offset_low = kEntranceTileTypePtrLow;
|
|
||||||
int offset_high = kEntranceTileTypePtrHigh;
|
|
||||||
|
|
||||||
for (int i = 0; i < kNumEntranceTileTypes; i++) {
|
|
||||||
// Load entrance tile types
|
|
||||||
ASSIGN_OR_RETURN(auto value_low, rom.ReadWord(offset_low + i));
|
|
||||||
entrance_tile_types_low_.push_back(value_low);
|
|
||||||
ASSIGN_OR_RETURN(auto value_high, rom.ReadWord(offset_high + i));
|
|
||||||
entrance_tile_types_low_.push_back(value_high);
|
|
||||||
}
|
|
||||||
|
|
||||||
return absl::OkStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::vector<uint16_t> entrance_tile_types_low_;
|
|
||||||
std::vector<uint16_t> entrance_tile_types_high_;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @class OverworldEditor
|
* @class OverworldEditor
|
||||||
@@ -100,8 +76,7 @@ class EntranceContext {
|
|||||||
*/
|
*/
|
||||||
class OverworldEditor : public Editor,
|
class OverworldEditor : public Editor,
|
||||||
public SharedRom,
|
public SharedRom,
|
||||||
public EntranceContext,
|
public gfx::GfxContext,
|
||||||
public GfxContext,
|
|
||||||
public core::ExperimentFlags {
|
public core::ExperimentFlags {
|
||||||
public:
|
public:
|
||||||
OverworldEditor() { type_ = EditorType::kOverworld; }
|
OverworldEditor() { type_ = EditorType::kOverworld; }
|
||||||
@@ -292,6 +267,7 @@ class OverworldEditor : public Editor,
|
|||||||
zelda3::OverworldEntrance current_entrance_;
|
zelda3::OverworldEntrance current_entrance_;
|
||||||
zelda3::OverworldExit current_exit_;
|
zelda3::OverworldExit current_exit_;
|
||||||
zelda3::OverworldItem current_item_;
|
zelda3::OverworldItem current_item_;
|
||||||
|
zelda3::OverworldEntranceTileTypes entrance_tiletypes_;
|
||||||
|
|
||||||
zelda3::GameEntity* current_entity_;
|
zelda3::GameEntity* current_entity_;
|
||||||
zelda3::GameEntity* dragged_entity_;
|
zelda3::GameEntity* dragged_entity_;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
#include "app/core/constants.h"
|
#include "app/core/constants.h"
|
||||||
|
#include "app/rom.h"
|
||||||
#include "app/zelda3/common.h"
|
#include "app/zelda3/common.h"
|
||||||
|
|
||||||
namespace yaze {
|
namespace yaze {
|
||||||
@@ -79,6 +80,27 @@ public:
|
|||||||
map_pos_ = (uint16_t)((((area_y_) << 6) | (area_x_ & 0x3F)) << 1);
|
map_pos_ = (uint16_t)((((area_y_) << 6) | (area_x_ & 0x3F)) << 1);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
constexpr int kEntranceTileTypePtrLow = 0xDB8BF;
|
||||||
|
constexpr int kEntranceTileTypePtrHigh = 0xDB917;
|
||||||
|
constexpr int kNumEntranceTileTypes = 0x2C;
|
||||||
|
|
||||||
|
struct OverworldEntranceTileTypes {
|
||||||
|
std::array<uint16_t, kNumEntranceTileTypes> low;
|
||||||
|
std::array<uint16_t, kNumEntranceTileTypes> high;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline absl::StatusOr<OverworldEntranceTileTypes>
|
||||||
|
LoadEntranceTileTypes(Rom &rom) {
|
||||||
|
OverworldEntranceTileTypes tiletypes;
|
||||||
|
for (int i = 0; i < kNumEntranceTileTypes; i++) {
|
||||||
|
ASSIGN_OR_RETURN(auto value_low, rom.ReadWord(kEntranceTileTypePtrLow + i));
|
||||||
|
tiletypes.low[i] = value_low;
|
||||||
|
ASSIGN_OR_RETURN(auto value_high,
|
||||||
|
rom.ReadWord(kEntranceTileTypePtrHigh + i));
|
||||||
|
tiletypes.high[i] = value_high;
|
||||||
|
}
|
||||||
|
return tiletypes;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace zelda3
|
} // namespace zelda3
|
||||||
} // namespace yaze
|
} // namespace yaze
|
||||||
|
|||||||
Reference in New Issue
Block a user