diff --git a/apps/game/src/gameplay/galaxy/ui.rs b/apps/game/src/gameplay/galaxy/ui.rs index 5838394..e1db94a 100644 --- a/apps/game/src/gameplay/galaxy/ui.rs +++ b/apps/game/src/gameplay/galaxy/ui.rs @@ -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;