initial rework

This commit is contained in:
grimsace
2026-05-11 15:58:47 -05:00
parent d21e532ca1
commit ea340c558b
3 changed files with 133 additions and 116 deletions
-24
View File
@@ -1178,30 +1178,6 @@ pub fn populate_random_markers(mut layout: DungeonLayout, settings: &UiSettings)
layout layout
} }
// Return the manual marker size.
pub fn manual_marker_size(settings: &UiSettings, is_start: bool) -> usize {
if is_start {
settings
.min_start_marker_size
.min(settings.max_start_marker_size)
} else {
settings
.min_end_marker_size
.min(settings.max_end_marker_size)
}
.clamp(1, 10)
}
// Return the manual trap size.
pub fn manual_trap_marker_size(_settings: &UiSettings) -> usize {
1
}
// Return the manual monster size.
pub fn manual_monster_marker_size(_settings: &UiSettings) -> usize {
1
}
// Pick a deterministic inclusive random value. // Pick a deterministic inclusive random value.
fn random_range_inclusive(min: usize, max: usize, seed_value: u64) -> usize { fn random_range_inclusive(min: usize, max: usize, seed_value: u64) -> usize {
let min = min.max(1); let min = min.max(1);
+11 -16
View File
@@ -13,7 +13,6 @@ use eframe::egui;
use egui::{Color32, Stroke}; use egui::{Color32, Stroke};
use layout::{ use layout::{
DoorSettings, DungeonLayout, WindowSettings, blocked_room_cells, corridor_cells, DoorSettings, DungeonLayout, WindowSettings, blocked_room_cells, corridor_cells,
manual_marker_size, manual_monster_marker_size, manual_trap_marker_size,
populate_random_markers, populate_stairs, shortest_path_cells, populate_random_markers, populate_stairs, shortest_path_cells,
}; };
use ui::{AddTool, UiSettings, draw_legend_panel, draw_level_tabs, draw_side_panel}; use ui::{AddTool, UiSettings, draw_legend_panel, draw_level_tabs, draw_side_panel};
@@ -1002,8 +1001,8 @@ impl DungeonApp {
} }
let layout = &mut self.levels[self.settings.active_level_index]; let layout = &mut self.levels[self.settings.active_level_index];
let width = self.settings.min_room_size.max(1); let width = self.settings.add_room_width.max(1);
let height = self.settings.min_room_size.max(1); let height = self.settings.add_room_height.max(1);
if cell.0 >= self.settings.cols || cell.1 >= self.settings.rows { if cell.0 >= self.settings.cols || cell.1 >= self.settings.rows {
return; return;
} }
@@ -1067,7 +1066,7 @@ impl DungeonApp {
.max() .max()
.unwrap_or(0) .unwrap_or(0)
.wrapping_add(1); .wrapping_add(1);
let width = self.settings.min_corridor_width.max(1); let width = self.settings.add_corridor_width.max(1);
layout.corridors.push(layout::Corridor { layout.corridors.push(layout::Corridor {
id: next_id, id: next_id,
@@ -1107,7 +1106,7 @@ impl DungeonApp {
layout.text_labels.push(layout::TextLabel { layout.text_labels.push(layout::TextLabel {
cell, cell,
text, text,
font_size: 18, font_size: self.settings.add_text_font_size,
}); });
} }
@@ -1122,12 +1121,7 @@ impl DungeonApp {
return; return;
} }
let size = match kind { let size = self.settings.add_marker_size.max(1);
MarkerKind::Start => manual_marker_size(&self.settings, true),
MarkerKind::End => manual_marker_size(&self.settings, false),
MarkerKind::Trap => manual_trap_marker_size(&self.settings),
MarkerKind::Monster => manual_monster_marker_size(&self.settings),
};
let origin = centered_marker_origin(cell, size, self.settings.cols, self.settings.rows); let origin = centered_marker_origin(cell, size, self.settings.cols, self.settings.rows);
let marker = layout::AreaMarker { cell: origin, size }; let marker = layout::AreaMarker { cell: origin, size };
@@ -1149,16 +1143,17 @@ impl DungeonApp {
return; return;
} }
let size = self.settings.manual_stair_size.max(1); let width = self.settings.add_stair_width.max(1);
let max_x = self.settings.cols.saturating_sub(size); let height = self.settings.add_stair_height.max(1);
let max_y = self.settings.rows.saturating_sub(size); let max_x = self.settings.cols.saturating_sub(width);
let max_y = self.settings.rows.saturating_sub(height);
let origin_x = cell.0.min(max_x); let origin_x = cell.0.min(max_x);
let origin_y = cell.1.min(max_y); let origin_y = cell.1.min(max_y);
let stair = layout::Staircase { let stair = layout::Staircase {
cell: (origin_x, origin_y), cell: (origin_x, origin_y),
width: size, width,
height: size, height,
}; };
if self.settings.sync_stairs_across_levels { if self.settings.sync_stairs_across_levels {
+122 -76
View File
@@ -135,6 +135,13 @@ pub struct UiSettings {
pub last_export_path: Option<String>, pub last_export_path: Option<String>,
pub add_tool: AddTool, pub add_tool: AddTool,
pub add_text_value: String, pub add_text_value: String,
pub add_text_font_size: u16,
pub add_room_width: usize,
pub add_room_height: usize,
pub add_corridor_width: usize,
pub add_stair_width: usize,
pub add_stair_height: usize,
pub add_marker_size: usize,
pub min_start_marker_size: usize, pub min_start_marker_size: usize,
pub max_start_marker_size: usize, pub max_start_marker_size: usize,
pub min_end_marker_size: usize, pub min_end_marker_size: usize,
@@ -160,7 +167,6 @@ pub struct UiSettings {
pub min_stairs_per_level: usize, pub min_stairs_per_level: usize,
pub max_stairs_per_level: usize, pub max_stairs_per_level: usize,
pub sync_stairs_across_levels: bool, pub sync_stairs_across_levels: bool,
pub manual_stair_size: usize,
active_tab: Tab, active_tab: Tab,
} }
@@ -201,6 +207,13 @@ impl Default for UiSettings {
last_export_path: None, last_export_path: None,
add_tool: AddTool::None, add_tool: AddTool::None,
add_text_value: String::from("Text"), add_text_value: String::from("Text"),
add_text_font_size: 18,
add_room_width: 5,
add_room_height: 5,
add_corridor_width: 2,
add_stair_width: 2,
add_stair_height: 2,
add_marker_size: 1,
min_start_marker_size: 1, min_start_marker_size: 1,
max_start_marker_size: 3, max_start_marker_size: 3,
min_end_marker_size: 1, min_end_marker_size: 1,
@@ -225,7 +238,6 @@ impl Default for UiSettings {
min_stairs_per_level: 1, min_stairs_per_level: 1,
max_stairs_per_level: 2, max_stairs_per_level: 2,
sync_stairs_across_levels: false, sync_stairs_across_levels: false,
manual_stair_size: 2,
export_level_index: 0, export_level_index: 0,
active_tab: Tab::Generate, active_tab: Tab::Generate,
} }
@@ -1067,94 +1079,128 @@ fn draw_add_tab(ui: &mut egui::Ui, settings: &mut UiSettings, result: &mut SideP
ui.label(RichText::new("Add Tools").strong()); ui.label(RichText::new("Add Tools").strong());
ui.add_space(8.0); ui.add_space(8.0);
ui.label(RichText::new("Layout").strong()); ui.label(RichText::new("Structure").strong());
ui.add_space(4.0); ui.add_space(4.0);
ui.horizontal(|ui| { ui.horizontal(|ui| {
ui.selectable_value(&mut settings.add_tool, AddTool::Room, "Add Room"); ui.selectable_value(&mut settings.add_tool, AddTool::Room, "Room");
ui.selectable_value(&mut settings.add_tool, AddTool::Corridor, "Add Corridor"); ui.selectable_value(&mut settings.add_tool, AddTool::Corridor, "Corridor");
ui.selectable_value(&mut settings.add_tool, AddTool::Staircase, "Stairs");
}); });
ui.add_space(2.0); if ui.button("Add New Level").clicked() {
ui.horizontal(|ui| { result.new_level_clicked = true;
ui.selectable_value(&mut settings.add_tool, AddTool::Staircase, "Add Stairs"); }
if ui
.add(egui::Button::new("Add Level").frame(false)) ui.add_space(8.0);
.clicked() ui.label(RichText::new("Passages").strong());
{ ui.add_space(4.0);
result.new_level_clicked = true; ui.horizontal_wrapped(|ui| {
} ui.selectable_value(&mut settings.add_tool, AddTool::Archway, "Archway");
ui.selectable_value(&mut settings.add_tool, AddTool::Door, "Door");
ui.selectable_value(&mut settings.add_tool, AddTool::LockedDoor, "Locked");
ui.selectable_value(&mut settings.add_tool, AddTool::SecretDoor, "Secret");
}); });
ui.add_space(8.0); ui.add_space(8.0);
ui.label(RichText::new("Doors").strong()); ui.label(RichText::new("Markers & Annotation").strong());
ui.add_space(4.0); ui.add_space(4.0);
ui.horizontal(|ui| { ui.horizontal_wrapped(|ui| {
ui.selectable_value(&mut settings.add_tool, AddTool::Archway, "Add Archway"); ui.selectable_value(&mut settings.add_tool, AddTool::StartMarker, "Start");
ui.selectable_value(&mut settings.add_tool, AddTool::Door, "Add Door"); ui.selectable_value(&mut settings.add_tool, AddTool::EndMarker, "End");
}); ui.selectable_value(&mut settings.add_tool, AddTool::TrapMarker, "Trap");
ui.add_space(2.0); ui.selectable_value(&mut settings.add_tool, AddTool::MonsterMarker, "Monster");
ui.horizontal(|ui| { ui.selectable_value(&mut settings.add_tool, AddTool::Text, "Text");
ui.selectable_value(
&mut settings.add_tool,
AddTool::LockedDoor,
"Add Locked Door",
);
ui.selectable_value(
&mut settings.add_tool,
AddTool::SecretDoor,
"Add Secret Door",
);
}); });
ui.add_space(12.0);
ui.separator();
ui.add_space(8.0); ui.add_space(8.0);
ui.label(RichText::new("Features").strong());
ui.add_space(4.0);
ui.horizontal(|ui| {
ui.selectable_value(&mut settings.add_tool, AddTool::StartMarker, "Place Start");
ui.selectable_value(&mut settings.add_tool, AddTool::EndMarker, "Place End");
});
ui.add_space(2.0);
ui.horizontal(|ui| {
ui.selectable_value(&mut settings.add_tool, AddTool::TrapMarker, "Place Trap");
ui.selectable_value(
&mut settings.add_tool,
AddTool::MonsterMarker,
"Place Monster",
);
});
ui.add_space(2.0);
ui.horizontal(|ui| {
ui.selectable_value(&mut settings.add_tool, AddTool::Text, "Add Text");
});
ui.add_space(8.0); if settings.add_tool != AddTool::None {
ui.label("Left click to place, Right click/Escape to cancel"); ui.label(RichText::new("Tool Options").strong());
ui.add_space(4.0);
ui.add_space(6.0); match settings.add_tool {
match settings.add_tool { AddTool::Room => {
AddTool::Room => ui.label("Click to place a room at the grid cell."), ui.label("Room Width");
AddTool::Corridor => ui.label("Click-drag to place a corridor between two cells."), ui.add(egui::Slider::new(&mut settings.add_room_width, 1..=30));
AddTool::Staircase => { ui.label("Room Height");
ui.label("Click the grid to place stairs (visible on current and adjacent levels).") ui.add(egui::Slider::new(&mut settings.add_room_height, 1..=30));
}
AddTool::Corridor => {
ui.label("Corridor Width");
ui.add(egui::Slider::new(&mut settings.add_corridor_width, 1..=10));
}
AddTool::Staircase => {
ui.label("Stair Width");
ui.add(egui::Slider::new(&mut settings.add_stair_width, 1..=10));
ui.label("Stair Height");
ui.add(egui::Slider::new(&mut settings.add_stair_height, 1..=10));
}
AddTool::StartMarker
| AddTool::EndMarker
| AddTool::TrapMarker
| AddTool::MonsterMarker => {
ui.label("Marker Size");
ui.add(egui::Slider::new(&mut settings.add_marker_size, 1..=10));
}
AddTool::Text => {
ui.label("Text Label");
ui.text_edit_singleline(&mut settings.add_text_value);
ui.label("Font Size");
ui.add(egui::Slider::new(&mut settings.add_text_font_size, 8..=96));
}
_ => {
ui.label("No additional options for this tool.");
}
} }
AddTool::Archway => ui.label("Click a valid room or corridor edge to place an archway."), ui.add_space(8.0);
AddTool::Door => ui.label("Click a room/corridor edge to place a door."), ui.label(RichText::new("Instructions:").italics());
AddTool::LockedDoor => ui.label("Click a room/corridor edge to place a locked door."), match settings.add_tool {
AddTool::SecretDoor => ui.label("Click a room/corridor edge to place a secret door."), AddTool::Room => {
AddTool::Text => { ui.label("Click to place a room at the grid cell.");
ui.label("Enter the label text, then click a grid cell to place it."); }
ui.add_space(6.0); AddTool::Corridor => {
ui.label("Text"); ui.label("Click-drag to place a corridor between two cells.");
let response = ui.text_edit_singleline(&mut settings.add_text_value); }
ui.add_space(4.0); AddTool::Staircase => {
ui.label("Note: Left click on the canvas to place the text."); ui.label(
response "Click the grid to place stairs (visible on current and adjacent levels).",
);
}
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::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::Text => {
ui.label("Click a grid cell to place the text label.");
}
AddTool::StartMarker => {
ui.label("Click the grid to place the start marker.");
}
AddTool::EndMarker => {
ui.label("Click the grid to place the end marker.");
}
AddTool::TrapMarker => {
ui.label("Click the grid to place a trap marker.");
}
AddTool::MonsterMarker => {
ui.label("Click the grid to place a monster marker.");
}
_ => {}
} }
AddTool::StartMarker => ui.label("Click the grid to place the start marker."), ui.add_space(4.0);
AddTool::EndMarker => ui.label("Click the grid to place the end marker."), ui.label("Left click to place, Right click/Escape to cancel.");
AddTool::TrapMarker => ui.label("Click the grid to place a trap marker."), } else {
AddTool::MonsterMarker => ui.label("Click the grid to place a monster marker."), ui.label("Select a tool above to start building manually.");
AddTool::None => ui.label("Select a tool to add rooms or corridors."), }
};
} }
// Draw a colored legend entry. // Draw a colored legend entry.