You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Lower only the jump sound. Use a per-clip gain override in the shared level.gd. A change to the shared -12 value, the SFX bus, or the Master bus would affect unrelated sounds.
Start at -18 dB, a 6 dB reduction. Set the final value with a fixed-settings listening check in all three modes.
Add a focused regression test that follows the existing exact-gain test pattern. Confirm the jump attenuation and that the jump sound is not muted. Confirm that the other SFX gains and routing are unchanged.
Run the existing platformer and theme-music suites. Confirm that music, movement, and other audio behavior did not change.
Design ChoicesDesign Choice 1: Where should the jump attenuation be applied?
Options Considered:
Change the shared -12 value in the player-creation loop. This also lowers "hurt" and "boss_down".
Lower the SFX or Master bus in audio_service.gd or in the saved defaults. This affects all SFX, the UI tones, or all audio.
Edit jump.wav to lower its amplitude. This changes a shared third-party asset, and the value is difficult to tune or test.
Add a per-clip gain override in level.gd. Only "jump" receives a lower volume_db, and the other clips keep -12.
Chosen Option: 4
Rationale: Several layers can control the jump loudness. Only one layer isolates the jump sound. It is the narrowest control, follows the existing per-clip SFX dictionary pattern, applies to all three modes through the shared base script, and can be tested.
Design Choice 2: What override structure should be used?
Options Considered:
Add a conditional for "jump" inside the creation loop.
Add a small constant dictionary keyed by clip name next to SFX. The loop reads each clip's value and uses -12 as the default.
Chosen Option: 2
Rationale: A single special case and a small lookup table are both possible. It mirrors the existing SFX dictionary, keeps the loop free of clip-specific branches, and lets a test read the intended value.
Design Choice 3: What target gain should the jump sound use?
Options Considered:
-15 dB (3 dB reduction). This is a small change and may not fix the complaint.
-18 dB (6 dB reduction). This halves the amplitude and gives a clear change. The sound stays well above inaudible levels.
-22 dB (10 dB reduction). This is about half the perceived loudness and risks making the jump too quiet against the music.
Chosen Option: 2
Rationale: The ticket does not give a target value. The final value depends on a listening check. Use -18 dB as the starting value. Then adjust it in steps of 1–2 dB during the listening check, and do not go below about -24 dB.
💡 User Tips
Regenerate the plan with different choices with @coderabbitai <feedback>.
Implementation Steps
Phase 1: Isolate and lower the jump sound gain
Give the jump sound its own gain in the shared platformer base. Keep the other platformer SFX, music, UI tones, and bus settings unchanged. All three modes inherit the change because they share _setup_session().
Task 1: Add a per-clip SFX gain override in the shared level script
Add one jump-only gain value.
Update hoppys-adventure-arcade/modes/platformer/level.gd. Next to the SFX dictionary, add a small constant dictionary of per-clip gain overrides. Use the same clip names as keys.
Add one entry: "jump" with the chosen attenuated value. Start at -18.0 dB.
In the AudioStreamPlayer creation loop in _setup_session() (about lines 507–513), set volume_db from the override dictionary. If a clip has no entry, use the existing -12 default.
Keep bus = "SFX", the stream assignment, and the sfx_players[clip] storage unchanged.
Do not change _sound(), the jumped connection, player.gd, audio_service.gd, jump.wav, or the three mode scripts.
Task 2: Confirm there is no per-mode override
Confirm that one change covers all three modes.
Search the full project for other writes to sfx_players or to the jump player's volume_db. The earlier search covered only modes/platformer and scenes/platformer.
If a mode script or another file overrides the jump gain, align that override with the new value. If no override exists, make no further change.
🤖 Prompt for AI agents
Add a jump-only gain override in the shared platformer base. Keep all other clip
gains, routing, and volume settings unchanged.
- In `hoppys-adventure-arcade/modes/platformer/level.gd`, add a small constant
dictionary next to `SFX`. Use `SFX` clip names as keys and add only `"jump"`
with an initial value of `-18.0` dB.
- In the `AudioStreamPlayer` creation loop in `_setup_session()` (about lines
507–513), read `volume_db` from this dictionary. If a clip has no override, use
`-12`.
- Preserve `bus = "SFX"`, stream assignment, and `sfx_players[clip]` storage. Do
not change `_sound()`, the `jumped` connection, `player.gd`, `audio_service.gd`,
`jump.wav`, bus defaults, or saved volume defaults.
- Search the full project for other writes to `sfx_players` or the jump player's
`volume_db`. If another file overrides the jump gain, align that override with
the new value. Otherwise, make no further changes, including to the three mode
scripts.
Phase 2: Verify balance, routing, and audibility
Add an automated regression test for the targeted gain change. Define a manual listening check because a gain assertion does not prove perceived audibility.
Task 1: Add a focused regression test for platformer SFX gains
Confirm that only the jump gain changed and that the jump sound is not muted.
Create a small suite in hoppys-adventure-arcade/tests/, for example, platformer_sfx_balance.gd. Use the level construction and teardown steps from platformer_knockout.gd. Settle AudioService before quitting, as CONTRIBUTING.md requires.
Use a name that contains platformer so that the existing -k platformer filter selects the suite. Check tools/tests/suites.toml to confirm whether new suites need an entry.
After _setup_session(), assert the following:
The "jump" player exists, has the jump.wav stream, and uses the SFX bus.
The jump volume_db equals the override value in level.gd.
The jump volume_db is lower than -12 and higher than a "not muted" floor of about -30 dB.
The "hurt" and "boss_down" players still have -12 dB and the SFX bus.
If the setup cost is low, run the assertions for all three modes. If the setup cost is high, use one mode because all three modes share level.gd.
Optional: Emit jumped and assert that the jump player starts to play. This confirms that the signal connection still works.
Task 2: Run the existing platformer and audio suites
Confirm that no existing behavior changed.
From the repository root, run python3 tools/tests/run_tests.py --godot <path> -k platformer -k theme_music. Use Godot 4.7.1.
Confirm that the music gain checks still pass: the knockout duck of 12 dB, the -13 dB restore, and the stage-clear routing. Confirm that the jump movement checks in platformer_smoke.gd and platformer_traversal.gd still pass.
Task 3: Do a manual listening check and tune the value
Confirm that the jump sound is still audible but no longer too loud.
Keep the Master, Music, and SFX sliders at fixed values for the full check. Use the defaults, or record the values that you use.
In each mode (Bay Area Blitz, The Enchanted Repo, Orbital Ops), do repeated full jumps and short jumps during traversal music. Also do jumps during a boss encounter.
Confirm that the jump sound is clearly audible and less prominent than before. Confirm that hurt, swipe/UI, boss-down, and stage-clear sounds have not changed.
If the jump sound is too quiet or too loud, change only the "jump" override value in steps of 1–2 dB. Then run Task 2.1 again.
If possible, do one check on booth hardware at venue volume, as docs/booth-runbook.md describes.
🤖 Prompt for AI agents
Add a focused regression test for jump attenuation and unchanged SFX routing.
Run the existing suites and use a fixed-settings listening check to confirm
audibility.
- Add a small suite in `hoppys-adventure-arcade/tests/`, such as
`platformer_sfx_balance.gd`. Include `platformer` in its name. Follow the level
construction and teardown in `platformer_knockout.gd`, and settle `AudioService`
before quitting as required by `CONTRIBUTING.md`.
- Check `tools/tests/suites.toml`. If the runner requires registration, register
the suite.
- After `_setup_session()`, assert that the `"jump"` player exists, retains
`jump.wav`, uses the `SFX` bus, and has `volume_db` equal to the override in
`level.gd`. Assert that this gain is below `-12` and above about `-30` dB.
- Assert that `"hurt"` and `"boss_down"` remain at `-12` dB on `SFX`.
- If setup cost is low, test all three modes. Otherwise, test one mode because
all three share `level.gd`. Optionally emit `jumped` and assert that playback
starts.
- From the repository root, run `python3 tools/tests/run_tests.py --godot <path>
-k platformer -k theme_music` with Godot 4.7.1. Confirm the 12 dB knockout duck,
`-13 dB` restore, stage-clear routing, and movement checks in
`platformer_smoke.gd` and `platformer_traversal.gd`.
- Keep Master, Music, and SFX sliders fixed during listening checks. Use
defaults or record the values. In Bay Area Blitz, The Enchanted Repo, and
Orbital Ops, test repeated full and short jumps during traversal music and jumps
during a boss encounter.
- Confirm that jump remains clearly audible and is less prominent than before.
Confirm that hurt, swipe/UI, boss-down, and stage-clear sounds are unchanged.
- If tuning is needed, change only the `"jump"` override in 1–2 dB steps. Do not
go below about `-24 dB`. Rerun the focused regression test after tuning.
- If possible, check booth hardware at venue volume as described in
`docs/booth-runbook.md`. Review the diff to confirm that only the jump player's
gain changed.
Research
Ticket Summary
Lower the platformer jump sound effect so that it is less prominent than the other gameplay audio. Keep the jump sound clearly audible. Do not affect other sounds, buses, or volume settings.
Codebase Summary
The Godot project in hoppys-adventure-arcade/ uses the shared platformer base script modes/platformer/level.gd. Three modes extend this script: scenes/platformer/bay_area_blitz.gd, enchanted_repo.gd, and orbital_ops.gd. Each mode calls _setup_session().
The jump sound follows this path:
modes/platformer/player.gd emits the jumped signal when the player presses jump.
level.gd (_setup_session(), about line 495) connects jumped to _sound("jump").
The SFX dictionary in level.gd (about line 11) preloads jump.wav. A loop in level.gd (about lines 507–513) creates one AudioStreamPlayer for each clip. Each player has bus = "SFX" and volume_db = -12. The "jump", "hurt", and "boss_down" players share this gain. No jump-only gain exists at this time.
app/audio_service.gd creates the Music and SFX buses. It also applies the user's saved Master, Music, and SFX volumes. A change to these buses would affect unrelated sounds.
The tests are in hoppys-adventure-arcade/tests/. platformer_knockout.gd already asserts exact music gains. Use this test as the precedent for exact gain assertions. tools/tests/run_tests.py runs the suites. The -k filters select suites by name.
File-Level Change Summary and Follow-Up Instructions
Impacted files
hoppys-adventure-arcade/modes/platformer/level.gd (modify): Add a per-clip SFX gain override dictionary next to SFX. Add one entry for "jump", starting at -18.0. The player-creation loop in _setup_session() reads this dictionary and uses -12 as the default. Make no other changes to this file.
hoppys-adventure-arcade/tests/platformer_sfx_balance.gd (new): Assert the jump gain, stream, and bus. Assert that the jump sound is not muted. Assert that "hurt" and "boss_down" keep -12 dB on SFX.
tools/tests/suites.toml (modify only if needed): If the runner does not discover suites automatically, register the new suite.
Files that must not change
modes/platformer/player.gd
app/audio_service.gd
The bus defaults and the saved volume defaults
jump.wav
The three mode scripts in scenes/platformer/, unless Task 1.2 finds an override
Instructions for follow-up agents
Implementation agent: "In modes/platformer/level.gd, add a constant dictionary of per-clip volume_db overrides keyed by SFX clip names. Set "jump" to -18.0. In the _setup_session() player-creation loop, use the override value if it exists. If no override exists, use -12. Do not change bus routing, _sound(), the signal connections, or any other clip's gain."
Test agent: "Add tests/platformer_sfx_balance.gd. Use the level setup and teardown from tests/platformer_knockout.gd. After _setup_session(), assert that the "jump" player uses the SFX bus, keeps its stream, and has volume_db equal to the override value. That value must be lower than -12 and higher than -30. Assert that "hurt" and "boss_down" remain at -12 on SFX. Then run run_tests.py -k platformer -k theme_music."
Reviewer: "Confirm that the diff changes only the jump player's gain. Confirm that the manual listening check was done at fixed slider values in all three modes."
🚀 Next Steps
🤖 All AI agent prompts combined
Task: 1
Add a jump-only gain override in the shared platformer base. Keep all other clip
gains, routing, and volume settings unchanged.
- In `hoppys-adventure-arcade/modes/platformer/level.gd`, add a small constant
dictionary next to `SFX`. Use `SFX` clip names as keys and add only `"jump"`
with an initial value of `-18.0` dB.
- In the `AudioStreamPlayer` creation loop in `_setup_session()` (about lines
507–513), read `volume_db` from this dictionary. If a clip has no override, use
`-12`.
- Preserve `bus = "SFX"`, stream assignment, and `sfx_players[clip]` storage. Do
not change `_sound()`, the `jumped` connection, `player.gd`, `audio_service.gd`,
`jump.wav`, bus defaults, or saved volume defaults.
- Search the full project for other writes to `sfx_players` or the jump player's
`volume_db`. If another file overrides the jump gain, align that override with
the new value. Otherwise, make no further changes, including to the three mode
scripts.
===============================================================================
Task: 2
Add a focused regression test for jump attenuation and unchanged SFX routing.
Run the existing suites and use a fixed-settings listening check to confirm
audibility.
- Add a small suite in `hoppys-adventure-arcade/tests/`, such as
`platformer_sfx_balance.gd`. Include `platformer` in its name. Follow the level
construction and teardown in `platformer_knockout.gd`, and settle `AudioService`
before quitting as required by `CONTRIBUTING.md`.
- Check `tools/tests/suites.toml`. If the runner requires registration, register
the suite.
- After `_setup_session()`, assert that the `"jump"` player exists, retains
`jump.wav`, uses the `SFX` bus, and has `volume_db` equal to the override in
`level.gd`. Assert that this gain is below `-12` and above about `-30` dB.
- Assert that `"hurt"` and `"boss_down"` remain at `-12` dB on `SFX`.
- If setup cost is low, test all three modes. Otherwise, test one mode because
all three share `level.gd`. Optionally emit `jumped` and assert that playback
starts.
- From the repository root, run `python3 tools/tests/run_tests.py --godot <path>
-k platformer -k theme_music` with Godot 4.7.1. Confirm the 12 dB knockout duck,
`-13 dB` restore, stage-clear routing, and movement checks in
`platformer_smoke.gd` and `platformer_traversal.gd`.
- Keep Master, Music, and SFX sliders fixed during listening checks. Use
defaults or record the values. In Bay Area Blitz, The Enchanted Repo, and
Orbital Ops, test repeated full and short jumps during traversal music and jumps
during a boss encounter.
- Confirm that jump remains clearly audible and is less prominent than before.
Confirm that hurt, swipe/UI, boss-down, and stage-clear sounds are unchanged.
- If tuning is needed, change only the `"jump"` override in 1–2 dB steps. Do not
go below about `-24 dB`. Rerun the focused regression test after tuning.
- If possible, check booth hardware at venue volume as described in
`docs/booth-runbook.md`. Review the diff to confirm that only the jump player's
gain changed.
💡 Iterate on the plan with:
@coderabbitai <feedback>
Example Feedback
- @coderabbitai You can skip phase 3. Add a simple unit test case for phase 2.
- @coderabbitai For design choice 1 go ahead with option 3 and replan.
Activity
juanpflores commentedon Oct 20, 2026
@coderabbitai plan
coderabbitai commentedon Oct 20, 2026
Coding Plan
Summary
level.gd. A change to the shared-12value, the SFX bus, or the Master bus would affect unrelated sounds.-18 dB, a 6 dB reduction. Set the final value with a fixed-settings listening check in all three modes.Design Choices
Design Choice 1: Where should the jump attenuation be applied?
Options Considered:
-12value in the player-creation loop. This also lowers"hurt"and"boss_down".audio_service.gdor in the saved defaults. This affects all SFX, the UI tones, or all audio.jump.wavto lower its amplitude. This changes a shared third-party asset, and the value is difficult to tune or test.level.gd. Only"jump"receives a lowervolume_db, and the other clips keep-12.Chosen Option: 4
Rationale: Several layers can control the jump loudness. Only one layer isolates the jump sound. It is the narrowest control, follows the existing per-clip
SFXdictionary pattern, applies to all three modes through the shared base script, and can be tested.Design Choice 2: What override structure should be used?
Options Considered:
"jump"inside the creation loop.SFX. The loop reads each clip's value and uses-12as the default.Chosen Option: 2
Rationale: A single special case and a small lookup table are both possible. It mirrors the existing
SFXdictionary, keeps the loop free of clip-specific branches, and lets a test read the intended value.Design Choice 3: What target gain should the jump sound use?
Options Considered:
-15 dB(3 dB reduction). This is a small change and may not fix the complaint.-18 dB(6 dB reduction). This halves the amplitude and gives a clear change. The sound stays well above inaudible levels.-22 dB(10 dB reduction). This is about half the perceived loudness and risks making the jump too quiet against the music.Chosen Option: 2
Rationale: The ticket does not give a target value. The final value depends on a listening check. Use
-18 dBas the starting value. Then adjust it in steps of 1–2 dB during the listening check, and do not go below about-24 dB.💡 User Tips
Regenerate the plan with different choices with
@coderabbitai <feedback>.Implementation Steps
Phase 1: Isolate and lower the jump sound gain
Give the jump sound its own gain in the shared platformer base. Keep the other platformer SFX, music, UI tones, and bus settings unchanged. All three modes inherit the change because they share
_setup_session().Task 1: Add a per-clip SFX gain override in the shared level script
Add one jump-only gain value.
hoppys-adventure-arcade/modes/platformer/level.gd. Next to theSFXdictionary, add a small constant dictionary of per-clip gain overrides. Use the same clip names as keys."jump"with the chosen attenuated value. Start at-18.0dB.AudioStreamPlayercreation loop in_setup_session()(about lines 507–513), setvolume_dbfrom the override dictionary. If a clip has no entry, use the existing-12default.bus = "SFX", the stream assignment, and thesfx_players[clip]storage unchanged._sound(), thejumpedconnection,player.gd,audio_service.gd,jump.wav, or the three mode scripts.Task 2: Confirm there is no per-mode override
Confirm that one change covers all three modes.
sfx_playersor to the jump player'svolume_db. The earlier search covered onlymodes/platformerandscenes/platformer.🤖 Prompt for AI agents
Phase 2: Verify balance, routing, and audibility
Add an automated regression test for the targeted gain change. Define a manual listening check because a gain assertion does not prove perceived audibility.
Task 1: Add a focused regression test for platformer SFX gains
Confirm that only the jump gain changed and that the jump sound is not muted.
hoppys-adventure-arcade/tests/, for example,platformer_sfx_balance.gd. Use the level construction and teardown steps fromplatformer_knockout.gd. SettleAudioServicebefore quitting, asCONTRIBUTING.mdrequires.platformerso that the existing-k platformerfilter selects the suite. Checktools/tests/suites.tomlto confirm whether new suites need an entry._setup_session(), assert the following:"jump"player exists, has thejump.wavstream, and uses theSFXbus.volume_dbequals the override value inlevel.gd.volume_dbis lower than-12and higher than a "not muted" floor of about-30dB."hurt"and"boss_down"players still have-12dB and theSFXbus.level.gd.jumpedand assert that the jump player starts to play. This confirms that the signal connection still works.Task 2: Run the existing platformer and audio suites
Confirm that no existing behavior changed.
python3 tools/tests/run_tests.py --godot <path> -k platformer -k theme_music. Use Godot 4.7.1.-13 dBrestore, and the stage-clear routing. Confirm that the jump movement checks inplatformer_smoke.gdandplatformer_traversal.gdstill pass.Task 3: Do a manual listening check and tune the value
Confirm that the jump sound is still audible but no longer too loud.
"jump"override value in steps of 1–2 dB. Then run Task 2.1 again.docs/booth-runbook.mddescribes.🤖 Prompt for AI agents
Research
Ticket Summary
Lower the platformer jump sound effect so that it is less prominent than the other gameplay audio. Keep the jump sound clearly audible. Do not affect other sounds, buses, or volume settings.
Codebase Summary
The Godot project in
hoppys-adventure-arcade/uses the shared platformer base scriptmodes/platformer/level.gd. Three modes extend this script:scenes/platformer/bay_area_blitz.gd,enchanted_repo.gd, andorbital_ops.gd. Each mode calls_setup_session().The jump sound follows this path:
modes/platformer/player.gdemits thejumpedsignal when the player presses jump.level.gd(_setup_session(), about line 495) connectsjumpedto_sound("jump")._sound(clip)(about lines 341–342) callssfx_players[clip].play().The
SFXdictionary inlevel.gd(about line 11) preloadsjump.wav. A loop inlevel.gd(about lines 507–513) creates oneAudioStreamPlayerfor each clip. Each player hasbus = "SFX"andvolume_db = -12. The"jump","hurt", and"boss_down"players share this gain. No jump-only gain exists at this time.app/audio_service.gdcreates the Music and SFX buses. It also applies the user's saved Master, Music, and SFX volumes. A change to these buses would affect unrelated sounds.The tests are in
hoppys-adventure-arcade/tests/.platformer_knockout.gdalready asserts exact music gains. Use this test as the precedent for exact gain assertions.tools/tests/run_tests.pyruns the suites. The-kfilters select suites by name.File-Level Change Summary and Follow-Up Instructions
Impacted files
hoppys-adventure-arcade/modes/platformer/level.gd(modify): Add a per-clip SFX gain override dictionary next toSFX. Add one entry for"jump", starting at-18.0. The player-creation loop in_setup_session()reads this dictionary and uses-12as the default. Make no other changes to this file.hoppys-adventure-arcade/tests/platformer_sfx_balance.gd(new): Assert the jump gain, stream, and bus. Assert that the jump sound is not muted. Assert that"hurt"and"boss_down"keep-12dB onSFX.tools/tests/suites.toml(modify only if needed): If the runner does not discover suites automatically, register the new suite.Files that must not change
modes/platformer/player.gdapp/audio_service.gdjump.wavscenes/platformer/, unless Task 1.2 finds an overrideInstructions for follow-up agents
modes/platformer/level.gd, add a constant dictionary of per-clipvolume_dboverrides keyed bySFXclip names. Set"jump"to-18.0. In the_setup_session()player-creation loop, use the override value if it exists. If no override exists, use-12. Do not change bus routing,_sound(), the signal connections, or any other clip's gain."tests/platformer_sfx_balance.gd. Use the level setup and teardown fromtests/platformer_knockout.gd. After_setup_session(), assert that the"jump"player uses theSFXbus, keeps its stream, and hasvolume_dbequal to the override value. That value must be lower than-12and higher than-30. Assert that"hurt"and"boss_down"remain at-12onSFX. Then runrun_tests.py -k platformer -k theme_music."🚀 Next Steps
🤖 All AI agent prompts combined
💡 Iterate on the plan with:
@coderabbitai <feedback>Start Coding →