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.