Add OverworldExit editor skeleton
This commit is contained in:
@@ -323,8 +323,115 @@ void OverworldEditor::DrawOverworldEntrances(ImVec2 canvas_p0,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
namespace {
|
||||||
|
bool IsMouseHoveringOverExit(const zelda3::OverworldExit &exit,
|
||||||
|
ImVec2 canvas_p0, ImVec2 scrolling) {
|
||||||
|
// Get the mouse position relative to the canvas
|
||||||
|
const ImGuiIO &io = ImGui::GetIO();
|
||||||
|
const ImVec2 origin(canvas_p0.x + scrolling.x, canvas_p0.y + scrolling.y);
|
||||||
|
const ImVec2 mouse_pos(io.MousePos.x - origin.x, io.MousePos.y - origin.y);
|
||||||
|
|
||||||
|
// Check if the mouse is hovering over the entrance
|
||||||
|
if (mouse_pos.x >= exit.x_ && mouse_pos.x <= exit.x_ + 16 &&
|
||||||
|
mouse_pos.y >= exit.y_ && mouse_pos.y <= exit.y_ + 16) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call this function when you need to open the popup
|
||||||
|
void OpenExitEditorPopup() { ImGui::OpenPopup("Exit editor"); }
|
||||||
|
|
||||||
|
// This function should be called within your main GUI loop
|
||||||
|
void DrawExitEditorPopup(zelda3::OverworldExit &exit) {
|
||||||
|
if (ImGui::BeginPopupModal("Exit editor", NULL,
|
||||||
|
ImGuiWindowFlags_AlwaysAutoResize)) {
|
||||||
|
static int room = 385;
|
||||||
|
static int scrollY = 0, centerY = 143, yPos = 128;
|
||||||
|
static int scrollX = 256, centerX = 397, xPos = 496;
|
||||||
|
static int doorType = 0; // Normal door: None = 0, Wooden = 1, Bombable = 2
|
||||||
|
static int fancyDoorType =
|
||||||
|
0; // Fancy door: None = 0, Sanctuary = 1, Palace = 2
|
||||||
|
static int map = 128, unk1 = 0, unk2 = 0;
|
||||||
|
static int linkPosture = 2, spriteGFX = 12;
|
||||||
|
static int bgGFX = 47, palette = 10, sprPal = 8;
|
||||||
|
static int top = 0, bottom = 32, left = 256, right = 256;
|
||||||
|
static int leftEdgeOfMap = 0;
|
||||||
|
|
||||||
|
ImGui::InputScalar("Room", ImGuiDataType_U8, &exit.room_id_);
|
||||||
|
ImGui::InputInt("Scroll Y", &scrollY);
|
||||||
|
ImGui::InputInt("Center Y", ¢erY);
|
||||||
|
ImGui::InputInt("Y pos", &yPos);
|
||||||
|
ImGui::InputInt("Scroll X", &scrollX);
|
||||||
|
ImGui::InputInt("Center X", ¢erX);
|
||||||
|
ImGui::InputInt("X pos", &xPos);
|
||||||
|
|
||||||
|
ImGui::RadioButton("None", &doorType, 0);
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::RadioButton("Wooden", &doorType, 1);
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::RadioButton("Bombable", &doorType, 2);
|
||||||
|
// If door type is not None, input positions
|
||||||
|
if (doorType != 0) {
|
||||||
|
ImGui::InputInt("Door X pos",
|
||||||
|
&xPos); // Placeholder for door's X position
|
||||||
|
ImGui::InputInt("Door Y pos",
|
||||||
|
&yPos); // Placeholder for door's Y position
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::RadioButton("None##Fancy", &fancyDoorType, 0);
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::RadioButton("Sanctuary", &fancyDoorType
|
||||||
|
|
||||||
|
,
|
||||||
|
1);
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::RadioButton("Palace", &fancyDoorType, 2);
|
||||||
|
// If fancy door type is not None, input positions
|
||||||
|
if (fancyDoorType != 0) {
|
||||||
|
ImGui::InputInt("Fancy Door X pos",
|
||||||
|
&xPos); // Placeholder for fancy door's X position
|
||||||
|
ImGui::InputInt("Fancy Door Y pos",
|
||||||
|
&yPos); // Placeholder for fancy door's Y position
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::InputInt("Map", &map);
|
||||||
|
ImGui::InputInt("Unk1", &unk1);
|
||||||
|
ImGui::InputInt("Unk2", &unk2);
|
||||||
|
|
||||||
|
ImGui::InputInt("Link's posture", &linkPosture);
|
||||||
|
ImGui::InputInt("Sprite GFX", &spriteGFX);
|
||||||
|
ImGui::InputInt("BG GFX", &bgGFX);
|
||||||
|
ImGui::InputInt("Palette", &palette);
|
||||||
|
ImGui::InputInt("Spr Pal", &sprPal);
|
||||||
|
|
||||||
|
ImGui::InputInt("Top", &top);
|
||||||
|
ImGui::InputInt("Bottom", &bottom);
|
||||||
|
ImGui::InputInt("Left", &left);
|
||||||
|
ImGui::InputInt("Right", &right);
|
||||||
|
|
||||||
|
ImGui::InputInt("Left edge of map", &leftEdgeOfMap);
|
||||||
|
|
||||||
|
if (ImGui::Button("OK")) {
|
||||||
|
// Implement what happens when OK is pressed
|
||||||
|
ImGui::CloseCurrentPopup();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::SameLine();
|
||||||
|
|
||||||
|
if (ImGui::Button("Cancel")) {
|
||||||
|
// Implement what happens when Cancel is pressed
|
||||||
|
|
||||||
|
ImGui::CloseCurrentPopup();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::EndPopup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
void OverworldEditor::DrawOverworldExits(ImVec2 canvas_p0, ImVec2 scrolling) {
|
void OverworldEditor::DrawOverworldExits(ImVec2 canvas_p0, ImVec2 scrolling) {
|
||||||
|
int i = 0;
|
||||||
for (auto &each : overworld_.Exits()) {
|
for (auto &each : overworld_.Exits()) {
|
||||||
if (each.map_id_ < 0x40 + (current_world_ * 0x40) &&
|
if (each.map_id_ < 0x40 + (current_world_ * 0x40) &&
|
||||||
each.map_id_ >= (current_world_ * 0x40)) {
|
each.map_id_ >= (current_world_ * 0x40)) {
|
||||||
@@ -332,8 +439,18 @@ void OverworldEditor::DrawOverworldExits(ImVec2 canvas_p0, ImVec2 scrolling) {
|
|||||||
ImVec4(255, 255, 255, 150));
|
ImVec4(255, 255, 255, 150));
|
||||||
std::string str = absl::StrFormat("%#x", each.entrance_id_);
|
std::string str = absl::StrFormat("%#x", each.entrance_id_);
|
||||||
ow_map_canvas_.DrawText(str, each.x_ - 4, each.y_ - 2);
|
ow_map_canvas_.DrawText(str, each.x_ - 4, each.y_ - 2);
|
||||||
|
|
||||||
|
// Check if this entrance is being clicked and dragged
|
||||||
|
if (IsMouseHoveringOverExit(each, canvas_p0, scrolling) &&
|
||||||
|
ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) {
|
||||||
|
current_exit_ = i;
|
||||||
|
OpenExitEditorPopup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawExitEditorPopup(overworld_.mutable_exits()->at(current_exit_));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OverworldEditor::IsMouseHoveringOverEntrance(
|
bool OverworldEditor::IsMouseHoveringOverEntrance(
|
||||||
|
|||||||
@@ -132,6 +132,7 @@ class OverworldEditor : public Editor,
|
|||||||
int current_tile16_ = 0;
|
int current_tile16_ = 0;
|
||||||
int selected_tile_ = 0;
|
int selected_tile_ = 0;
|
||||||
int game_state_ = 0;
|
int game_state_ = 0;
|
||||||
|
int current_exit_ = 0;
|
||||||
char map_gfx_[3] = "";
|
char map_gfx_[3] = "";
|
||||||
char map_palette_[3] = "";
|
char map_palette_[3] = "";
|
||||||
char spr_gfx_[3] = "";
|
char spr_gfx_[3] = "";
|
||||||
|
|||||||
Reference in New Issue
Block a user