fix(game): restore the original plunger launch

Start each ball at the recovered right-lane coordinates and charge the
plunger while Down is held, firing only on release. Render all eleven frames
of resource 901, preserve object 25 as the returning-ball catch, and use the
object table's center-contact extents without adding the art radius twice.

Test Plan:
- cargo fmt --all -- --check
- cargo test
- cargo clippy --all-targets --all-features -- -D warnings
- runtime smoke: start, hold Down, release, and inspect the right shooter lane
This commit is contained in:
2026-08-22 17:37:28 +02:00
parent f904977ae4
commit 91ae8cdfd8
6 changed files with 169 additions and 51 deletions
+10 -3
View File
@@ -5,6 +5,9 @@
//! objects use `(param_34, param_32 - 20)` and `(param_30, param_28 - 20)`;
//! relative objects accumulate those values from the preceding endpoint.
//! The old port used `478 - x`, which mirrored the complete table vertically.
//! Circle sizes are already center-contact extents: `FUN_1008_0138` expands
//! each object's bounds by `param_26`. They must not be enlarged again by the
//! radius of the rendered ball.
use crate::geometry::Segment;
use macroquad::prelude::Vec2;
@@ -30,12 +33,16 @@ impl TableSegment {
pub struct StaticCircle {
pub id: u8,
pub center: Vec2,
pub radius: f32,
pub contact_radius: f32,
}
impl StaticCircle {
const fn new(id: u8, center: Vec2, radius: f32) -> Self {
Self { id, center, radius }
const fn new(id: u8, center: Vec2, contact_radius: f32) -> Self {
Self {
id,
center,
contact_radius,
}
}
}