fixed a problem with doors not adding and doors not able to be deleted

This commit is contained in:
grimsace
2026-04-07 11:28:34 -05:00
parent 87131d4b23
commit 7aa33c9e7c
2 changed files with 27 additions and 46 deletions
+24 -46
View File
@@ -18,6 +18,7 @@ use ui::{AddTool, UiSettings, draw_side_panel};
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
enum ManualDoorKind { enum ManualDoorKind {
Archway,
Regular, Regular,
Locked, Locked,
Secret, Secret,
@@ -642,12 +643,13 @@ impl DungeonApp {
self.settings.add_tool = AddTool::None; self.settings.add_tool = AddTool::None;
} }
} }
AddTool::Door | AddTool::LockedDoor | AddTool::SecretDoor => { AddTool::Archway | AddTool::Door | AddTool::LockedDoor | AddTool::SecretDoor => {
self.add_corridor_drag = None; self.add_corridor_drag = None;
if response.clicked() if response.clicked()
&& let Some(pointer_pos) = response.interact_pointer_pos() && let Some(pointer_pos) = response.interact_pointer_pos()
{ {
let kind = match self.settings.add_tool { let kind = match self.settings.add_tool {
AddTool::Archway => ManualDoorKind::Archway,
AddTool::Door => ManualDoorKind::Regular, AddTool::Door => ManualDoorKind::Regular,
AddTool::LockedDoor => ManualDoorKind::Locked, AddTool::LockedDoor => ManualDoorKind::Locked,
AddTool::SecretDoor => ManualDoorKind::Secret, AddTool::SecretDoor => ManualDoorKind::Secret,
@@ -1186,43 +1188,7 @@ impl DungeonApp {
return; return;
} }
let edges = door_edges_for( self.layout.doors.remove(idx);
&self.layout.doors[idx],
self.settings.cols,
self.settings.rows,
);
let mut spawned = Vec::new();
for edge in edges {
if normalized_edge(edge.0, edge.1) == target {
continue;
}
if self
.layout
.doors
.iter()
.any(|d| normalized_edge(d.from, d.to) == normalized_edge(edge.0, edge.1))
{
continue;
}
spawned.push(layout::Door {
from: edge.0,
to: edge.1,
width: 1,
span_width: false,
locked: false,
archway: true,
secret: false,
manual: true,
});
}
let door = &mut self.layout.doors[idx];
door.locked = false;
door.archway = true;
door.secret = false;
door.width = 1;
door.span_width = false;
door.manual = true;
self.layout.doors.extend(spawned);
return; return;
} }
} }
@@ -1312,7 +1278,7 @@ impl DungeonApp {
} }
let door = &mut self.layout.doors[idx]; let door = &mut self.layout.doors[idx];
door.locked = kind == ManualDoorKind::Locked; door.locked = kind == ManualDoorKind::Locked;
door.archway = false; door.archway = kind == ManualDoorKind::Archway;
door.secret = kind == ManualDoorKind::Secret; door.secret = kind == ManualDoorKind::Secret;
door.width = 1; door.width = 1;
door.span_width = false; door.span_width = false;
@@ -1325,15 +1291,12 @@ impl DungeonApp {
} }
let corridor_cells = corridor_cells(&self.layout, self.settings.cols, self.settings.rows); let corridor_cells = corridor_cells(&self.layout, self.settings.cols, self.settings.rows);
let a_in_room = room_index_at_cell(&self.layout.rooms, edge.0).is_some(); let a_room = room_index_at_cell(&self.layout.rooms, edge.0);
let b_in_room = room_index_at_cell(&self.layout.rooms, edge.1).is_some(); let b_room = room_index_at_cell(&self.layout.rooms, edge.1);
let a_in_corridor = corridor_cells.contains(&edge.0); let a_in_corridor = corridor_cells.contains(&edge.0);
let b_in_corridor = corridor_cells.contains(&edge.1); let b_in_corridor = corridor_cells.contains(&edge.1);
if !(a_in_room ^ b_in_room) { if !manual_door_edge_allowed(a_room, b_room, a_in_corridor, b_in_corridor) {
return;
}
if !(a_in_corridor ^ b_in_corridor) {
return; return;
} }
@@ -1343,7 +1306,7 @@ impl DungeonApp {
width: 1, width: 1,
span_width: false, span_width: false,
locked: kind == ManualDoorKind::Locked, locked: kind == ManualDoorKind::Locked,
archway: false, archway: kind == ManualDoorKind::Archway,
secret: kind == ManualDoorKind::Secret, secret: kind == ManualDoorKind::Secret,
manual: true, manual: true,
}); });
@@ -1883,6 +1846,21 @@ fn rooms_overlap(a: &layout::Room, b: &layout::Room) -> bool {
a.x < b_right && a_right > b.x && a.y < b_bottom && a_bottom > b.y a.x < b_right && a_right > b.x && a.y < b_bottom && a_bottom > b.y
} }
fn manual_door_edge_allowed(
a_room: Option<usize>,
b_room: Option<usize>,
a_in_corridor: bool,
b_in_corridor: bool,
) -> bool {
if matches!((a_room, b_room), (Some(a), Some(b)) if a == b) {
return false;
}
let a_is_feature = a_room.is_some() || a_in_corridor;
let b_is_feature = b_room.is_some() || b_in_corridor;
a_is_feature || b_is_feature
}
fn resize_hit_cells( fn resize_hit_cells(
room: &layout::Room, room: &layout::Room,
room_idx: usize, room_idx: usize,
+3
View File
@@ -180,6 +180,7 @@ pub enum AddTool {
None, None,
Room, Room,
Corridor, Corridor,
Archway,
Door, Door,
LockedDoor, LockedDoor,
SecretDoor, SecretDoor,
@@ -708,6 +709,7 @@ fn draw_add_tab(ui: &mut egui::Ui, settings: &mut UiSettings) {
}); });
ui.add_space(4.0); ui.add_space(4.0);
ui.horizontal(|ui| { ui.horizontal(|ui| {
ui.selectable_value(&mut settings.add_tool, AddTool::Archway, "Add Archway");
ui.selectable_value(&mut settings.add_tool, AddTool::Door, "Add Door"); ui.selectable_value(&mut settings.add_tool, AddTool::Door, "Add Door");
ui.selectable_value( ui.selectable_value(
&mut settings.add_tool, &mut settings.add_tool,
@@ -729,6 +731,7 @@ fn draw_add_tab(ui: &mut egui::Ui, settings: &mut UiSettings) {
match settings.add_tool { match settings.add_tool {
AddTool::Room => ui.label("Click to place a room at the grid cell."), AddTool::Room => ui.label("Click to place a room at the grid cell."),
AddTool::Corridor => ui.label("Click-drag to place a corridor between two cells."), AddTool::Corridor => ui.label("Click-drag to place a corridor between two cells."),
AddTool::Archway => ui.label("Click a valid room or corridor edge to place an archway."),
AddTool::Door => ui.label("Click a room/corridor edge to place a door."), AddTool::Door => ui.label("Click a room/corridor edge to place a door."),
AddTool::LockedDoor => ui.label("Click a room/corridor edge to place a locked door."), AddTool::LockedDoor => ui.label("Click a room/corridor edge to place a locked door."),
AddTool::SecretDoor => ui.label("Click a room/corridor edge to place a secret door."), AddTool::SecretDoor => ui.label("Click a room/corridor edge to place a secret door."),