Need help getting started? Try the player guide. These notes include older work; the game overview explains what’s ready now.

Continuous weapon audio and ballistic PC rockets/Prion/cannon shots

Floating cannon flight, floor rolling and ceiling impacts

Type67 cannonballs retain original no-gravity flight, including Gunrilla shots. The PC rolling_cannonballs option now changes only floor contact: after the original vertical step clamps a cannonball to a valid floor, clear downward Z velocity and report successful motion so it continues rolling horizontally. It does not add gravity, drag or alter airborne XYZ velocity. The option defaults off in recovery runtimes and is enabled by the playable composition. Original ceiling handling, wall reflection, damage, penetration and owner exclusion remain. The earlier launch-detachment fix remains: looking or moving after firing cannot steer the projectile. Level/up/down shots preserve their constructed XYZ velocity.

ceiling_impacts makes rocket65 and Prion69 movement stop when the swept top of the projectile reaches the ceiling, including exact contact and larger timesteps. The adapter places it at the contact height and returns ordinary impact: rockets apply their existing explosion/damage/particle, while Prion shots are removed without converting an unrelated enemy or inventing blast damage. This option defaults off in standalone recovery runtimes; recovered physics/controllers are unchanged.

The focused checks cover12 rocket/Prion ceiling contacts across both view modes (exact touch, overshoot and larger timestep), plus six launch cases per weapon. Cannon trajectories assert constant XYZ velocity and exact per-tick positions during large mouse turns, walking and jumps. The fixture checks requested view mode; actual camera retraction at nearby walls remains valid. Gunrilla cases check constant airborne height in eight headings and retain return/wall/player/ enemy impacts. Twelve floor cases cover player/enemy ownership, both view modes, exact contact, overshoot and larger timesteps, then eight further rolling frames per case with unchanged XY velocity and no-gravity flags. GCC ASan/UBSan/leak and MSVC agree on128390 focused checks. The Windows Gunrilla fixture passes446 checks with the new option enabled, preserving floating shots in eight headings and return/wall/player/enemy impacts. All121Windows libraries/frontend rebuild. Current hashes are in the reports below. No full campaign replay or new matching claim. ROM SHA-1 remains 4ff48d8c18b70a5184758f1917343ae85a70858e.

Commands: tests/test_weapon_fixes.py, tests/test_gunrilla.py and tests/test_projectile_runtime.py under WSL; Windows scripts/test-native-weapon-fixes.ps1 -SkipBuild, ssa_native_gunrilla_check.exe orig/SSA.gba and scripts/test-native-startup.ps1 -SkipBuild. Reports: weapon-fixes-validation.json, windows-weapon-fixes-validation.json, gunrilla-validation.json, native-projectile-runtime-validation.json and windows-native-startup-validation.json. Earlier counts below describe prior launch/audio fixes before these requested surface behaviors.

Earlier launch and audio corrections

The native host now owns the local continuous weapon voice explicitly. Original minigun wind-down (sound 0x1A) stops firing loop 0x19 before playing its ending; chainsaw 0x13 similarly stops 0x12. The original controller assumed the shared GBA hardware voice would replace the prior sound. Independent native effect instances require this explicit cleanup. Machine gun loop 0x16 shares the same lifetime tracking.

After each simulation frame the host checks firing, weapon handoff, ammunition, focus, input enablement, pause, health and gameplay music state. It stops a stale local loop without stopping other sources or music. Unbinding audio also stops the tracked loop. Source-aware sinks use local identity 1; legacy sinks retain the play/stop callback contract. Wind-down cues remain audible. This changes presentation ownership, not original firing cadence or the recovered controller.

The PC composition opts into SsaProjectileRuntime.ballistic_player_rockets. Committing a player type-65 rocket clears original attachment flag 0x4000 immediately. Its constructed position and full XYZ velocity now remain independent of subsequent player view/movement from launch. Owner exclusion flag 0x100 and player index remain intact. Enemy rockets and unlimited player range retain their existing behavior. The default recovery runtime leaves the option zero, preserving the original motion oracle and its attachment quirk.

The PC composition also enables ballistic_player_prion for weapon7/type69. Commit clears its attachment flag immediately, retaining owner exclusion, source, speed, conversion impact and lifetime handling. Creation removes the original40-unit sideways offset and uses the actual full player heading even when the original level-aim no-target probes finish at heading-512. The192-unit forward launch distance is projected along pitch, with Z measured from the live eye plus the aiming slope, so the projectile starts on the sight line. This works before any vertical mouse input as well as with free vertical aim. The recovered controller's target/slope selection is retained; this changes the native PC launch adapter, not the standalone recovered routines. Default recovery runtime options remain zero. No new speed or conversion rules are added.

The PC composition now also enables ballistic_player_cannon for weapon10 / type67. Commit clears attachment flag4000 at launch, preserving the constructed position, XYZ velocity, source, owner exclusion and weapon credit. Subsequent mouse look, walking and jumping cannot steer or drag the fired cannonball. Its original bounce, penetration and damage paths are unchanged. This does not change the cannon muzzle offset or aiming selection. Enemy type67 shots never enter this player-only commit policy. The default recovery option remains zero.

A changed rocket combat route exposed an existing reference-renderer boundary: a portal upper wall ending exactly at y=120 requested an offscreen row. The native column helper can now discard that single trailing row while retaining the full original sampling count. Shortening count would apply the original final-pixel correction to a visible pixel incorrectly. Ordinary raster bounds remain strict. Scene storage layout and framebuffer size are unchanged.

Validation commands:

.\decomp.ps1 test-weapon-fixes
powershell -ExecutionPolicy Bypass -File scripts/test-native-weapon-fixes.ps1
.\decomp.ps1 test-world-raster
.\decomp.ps1 test-wall-renderer
.\decomp.ps1 test-campaign
powershell -ExecutionPolicy Bypass -File scripts/test-native-campaign.ps1 -SkipBuild

The focused GCC ASan/UBSan/leak and MSVC checks agree on127,418 assertions: 46 continuous-weapon cases using the real mixer, six actual rocket launches and six actual Prion launches and six actual cannon launches, with36 trajectory frames for each weapon and rapid yaw/pitch, walking and jump input in both views. The Prion cases separately check zero lateral spawn error, the original192-unit forward offset projected along pitch, live eye height/aim slope and exact constant XYZ motion. Level aiming is tested before any mouse-pitch event, so original no-target heading probes cannot silently skew the shot. Ammunition grants exist only in the test fixture; selection, buffered click, launch and flight run through the actual native game. Audio cases cover release, selection, empty ammo, focus loss, input disable, pause, death and unbind; the chainsaw's original self-restoring ammo is excluded from the empty-ammo case. Music and another source playing the same song survive local cleanup, except the original death cue intentionally clears effects. 960 clipped columns compare every visible byte to the original raster operating on padded storage, and verify the native output guard remains untouched. Reports: weapon-fixes-validation.json, windows-weapon-fixes-validation.json. The rebuilt Windows game also passes180-frame hidden PC/reference smoke launches; see windows-prion-smoke-validation.json. Full campaign completions were not rerun for this launch correction.

The cannon regression failed before the fix on the still-attached launch flag. After the fix, all six first/third-person and level/up/down shots retain their original XYZ velocities and exact per-tick positions during immediate, large mouse movements, walking and jumping. The default projectile runtime still passes37,132 assertions on16maps, including10bounces and2penetrations. Gunrilla's 418-check /8-heading launch, return-hit, wall/player/enemy collision regression passes on GCC sanitizers and MSVC with the new PC option explicitly enabled. The rebuilt frontend passes normal PC/reference launcher/startup/restart checks. No full campaign replay was performed for this targeted cannon correction.

Original raster comparisons still pass 67,678 whole ARM calls; wall-renderer comparisons pass 14,322 solid/portal cases on all 16 maps. The default projectile runtime retains its 37,132 assertion integration proof. These are native bug fixes and requested PC behavior; they add no byte-matched functions or campaign admissions. Physical listening and mouse interaction have not been manually verified for these changes.

The current suite also covers four minigun cases during boss/post-boss music (commands19/20), with both sink types. These remain gameplay audio phases, so weapon, enemy and mover loops continue until their actual stop conditions.