fix: prevent panic on randomize when arms >= 5 causes twist floor to exceed max
Clamp effective_min to DISK_TWIST_MAX in randomize_disk() so gen_range never receives an empty range. Also guard all params.disks.len() - 1 subtractions with saturating_sub to prevent overflow if disks is empty.
This commit is contained in:
@@ -735,7 +735,7 @@ pub fn param_button_handler(
|
||||
/// Helper: get a mutable reference to the currently-selected disk.
|
||||
/// Clamps the index to the valid range as a safety measure.
|
||||
fn selected_disk_mut(params: &mut GalaxyParams, index: usize) -> &mut DiskParams {
|
||||
let idx = index.min(params.disks.len() - 1);
|
||||
let idx = index.min(params.disks.len().saturating_sub(1));
|
||||
&mut params.disks[idx]
|
||||
}
|
||||
|
||||
@@ -770,8 +770,9 @@ pub fn refresh_control_panel_values(
|
||||
mut values: Query<(&ParamValue, &mut Text)>,
|
||||
) {
|
||||
// Resolve the selected disk, clamped to a valid index.
|
||||
let disk_idx = selected_disk.0.min(params.disks.len() - 1);
|
||||
let disk = ¶ms.disks[disk_idx];
|
||||
let Some(disk) = params.disks.get(selected_disk.0.min(params.disks.len().saturating_sub(1))) else {
|
||||
return;
|
||||
};
|
||||
|
||||
for (marker, mut text) in &mut values {
|
||||
let new = match marker.0.as_str() {
|
||||
@@ -931,7 +932,7 @@ fn spawn_scroll_contents_with_tabs(
|
||||
spawn_section(scroll, "Disk");
|
||||
|
||||
// Tab bar: [1] [2] ... [+]
|
||||
let tab_bar_active = active_disk.min(params.disks.len() - 1);
|
||||
let tab_bar_active = active_disk.min(params.disks.len().saturating_sub(1));
|
||||
scroll
|
||||
.spawn(Node {
|
||||
width: Val::Percent(100.0),
|
||||
@@ -1270,7 +1271,7 @@ fn randomize_disk(rng: &mut impl rand::Rng) -> DiskParams {
|
||||
// show distinct spiral structure. The floor ensures at least ~0.6 turns
|
||||
// between adjacent arms.
|
||||
let twist_floor = disk.arms as f32 * 4.0;
|
||||
let effective_min = DISK_TWIST_MIN.max(twist_floor);
|
||||
let effective_min = DISK_TWIST_MIN.max(twist_floor).min(DISK_TWIST_MAX);
|
||||
disk.twist = rng.gen_range(effective_min..=DISK_TWIST_MAX);
|
||||
disk.twist = (disk.twist / DISK_TWIST_STEP).round() * DISK_TWIST_STEP;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user