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:
2026-06-10 11:00:40 -04:00
parent 9395dfbede
commit 71c6d18817

View File

@@ -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 = &params.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;