Research and implement gameplay sound effects in PRK.Client
Outcome Map the original AO client's gameplay sound behavior, then implement it in PRK.Client with idiomatic modern C#. Cover weapon fire/impacts, footsteps/landing/materials, damage/death vocals and associated gameplay cues; expand to nano/item/door cues where verified. Match observable behavior and authored data, not native control flow. Implementation must not copy or directly reference original client code. User explicitly requires trigger sources, timing, cue selection and suppression rules to be established from the real client, not invented because they seem appropriate. Unverified paths remain unresolved; do not substitute distance-based footstep timers, generic health-change sounds or network-arrival shot timing. Additional confirmed scope - Connect the F12 Audio page's master/effects/music/voice volumes and existing sound/music enable preferences. Preview changes live without mutating persisted preferences; Apply saves, Cancel/close releases preview. Preserve shipped defaults and use the shared preference store/audio runtime. - Keep actor death effects (creature-specific dying sounds or standard human vocals) separate from global death music. The faction death-music cue belongs only to the local controlled player's death; an enemy death must not select it. No guessed generic boom effect on remote actor death. Reuse and constraints Reuse the existing ClientAudio/AudioCatalog/OpenAL runtime, sound-bank reader, preferences, world generations and asset decoding. Share animation-note scheduling/event ownership with visuals without making audio depend on enabled graphical effects. No separate backend, proprietary runtime dependency or committed game assets. Keep frame publication nonblocking and bounded, decode off-frame, reject malformed metadata safely and suppress stale/duplicate triggers. Existing music and environmental-audio tasks remain separate. Acceptance criteria - Trace trigger, cue selection, animation timing, material variants, gender/breed/monster voice selection, attenuation/category and lifecycle against original binaries plus installed resource data. Distinguish confirmed behavior from gaps; retain research evidence outside production implementation. - Typed data-driven gameplay adapters produce correct positional/category requests independent of graphics settings and use authoritative entity/world lifecycle. - Deterministic tests cover timing, duplicate suppression, malformed/missing data, movement/material boundaries, combat/death and reset/zoning; client build and relevant regression checks pass. - Installed-data checks and available native/AOT checks pass; audible original-client comparison and unsupported platform/behavior gates are explicit. Do not claim behavioral equivalence from unit tests alone. Starting context Clean develop working tree. Original DLLs are available in /mnt/games/Anarchy Online and imported together through ghidra_container before analysis. Existing foundation handles UI/server sounds; gameplay effects are the deferred follow-up to tsk_n87n48dj3s/tsk_vjf59g4jc2. Environmental audio is tracked in tsk_dtpk9a2xmd. Research evidence - PR #2600 is merged. After confirming a clean working tree, fetched origin/develop and fast-forwarded feature/client-gameplay-sound-effects to a00e64787. Shared environmental runtime and corrected SBF composite policies are available; no copied parser/runtime or new audio backend is needed. - Imported Gamecode/N3/SandyInterface/GameData together into /data/inbox. SHA256: Gamecode 654969a6b65946cb161f0e60aed8589260fc5eca1795488f66bb56f8fff73726; N3 8c019efd72d547879a06585b69147ab1546b9617a2fce090e5863791aec8b0bb; SandyInterface 8827f94909b31d1173edc0cc331e2b65b60b0b3138ab8a8976f17695311648ce; GameData 7b7d4a44a9bcbbd771507332e3641bbfaf0f80f2a4ff2335c6757f6653f870e3. - Gamecode 0x1003c248 obtains actual CAT-animation intervals through GetLastInterval/GetMetadata, dispatches crossed notes via 0x1003bedd -> 0x100452d3, and tracks handled notes. Missing-animation fallback dispatches only attack and selected attack/start/effect notes, not movement notes. PRK currently queues weapon visual/flinch delays from network handling while Animator has an independent 10 ms clock and no gameplay-note publication. Do not extend those independent timers blindly: gameplay events need actual animation-playhead crossing and cancellation/fallback semantics. - Footstep policy 0x100452d3 routes notes 0x26/0x36/0x38/0x39 to walk/run/swim/swim-fast banks, handles landing note 0x85 and swishes 0x73–0x76. Initialization 0x1004496c resolves exact authored names SM_Sandy_Game_Feet_Man_{Walk|Run|Swim|SwimFast|Land}, Feet_Atrox_Land and SM_Sandy_Swish_{punch|kick|tail|huge}. Surface material is queried from ground tiles only near ground height; otherwise material 5. Water state overrides material and suppresses landing audio. There are locomotion suppression/gain branches and custom-character action-map overrides still to fully name/corroborate. Note names corresponding to these IDs require DisplaySystem mapping/corpus verification; existing ActionType.LeftFoot/RightFoot are not sufficient evidence. - Weapon note dispatch 0x10068e42 -> 0x1009bd92 -> 0x1009d2b2 selects the weapon action's sound list at the note, using random selection helper 0x10045976. Attack-type selection 0x1003c7a6 has a fallback to action Attack=11; the note handler has additional ammo/mode behavior rather than a universal fallback. Disassembly corroborates the weapon-object receiver and forwarded note/character arguments; decompiler signatures are unreliable. Inspect these distinctions before a shared selector is implemented. - Hit processing 0x1009b9f3 is reached through weapon-note target dispatch 0x1009bd2f. It gates hit reactions/outcome, plays impact action sounds and hit vocals, and selects voice intensity based on damage relative to stored maximum health (5%/10% bands). Standard human voice names are SM_Sandy_Game_FemaleGetsHit/MaleGetsHit (helpers 0x1009b4e3/0x1009b504); custom-character action Impact=31 and material overrides coexist. Do not trigger generic damage voices on every health stat delta. - Death state construction CharDie_t at 0x1007b803 starts a positional sound once on state entry: standard FemaleDies/MaleDies by sex, or custom-character Terminate=30 action lookup. Exact live-death versus initial-corpse/respawn handling and categories remain to corroborate before wiring SimpleCharacter.Die/LieDead. - Sandy PlayGameSound 0x10007673 maps game material via 0x10007490 before PlaySample 0x10002d98. Mapping (also corroborated with raw disassembly): 1->1,2->2,4->4,5/14->5,6->6,7/13->7,8->8,9->9,10->10,11->11,12->15,15->12,16->13,17->14,default->3. Parser 0x10003520 resolves 46 material references from the first 184 metadata bytes. PlaySample selects normal/soft/hard variant slots (base, +30, +15), falling back to normal when the intensity slot is empty; missing material resolves slot zero if present. This is necessary for footsteps and hit voices; current AudioCatalog does not expose material/intensity selection. Exact additive-vs-replacement and category/voice-parameter semantics need complete corroboration. - No playback integration or behavioral equivalence claimed. DisplaySystem.dll was additionally imported with ResourceManager/N3/GameData; SHA256 d4dd19f3277d70ff5fc0146b5474e8c5abdd55f45e81288fe018192669046c91. Named-note mapping at 0x10075c84 maps right/left/step to action 0x26, land to 0x85, swim to 0x38, swish_punch/kick/whip/huge to 0x73–0x76, attack to 11, and attack_effect_1–4 to 0x8e–0x91. Native comparisons are case-sensitive prefixes; their ordering shadows some fast variants, so do not infer routing just from an enum name. Metadata loader 0x1006f310 and clip loader 0x10076352 call this mapping. The clip loader additionally truncates control characters and recognizes direct SM_Sandy_ sound names; routing of that latter path is not yet established. Installed read-only rdb_1000045 record 1 census: 3,653 animations, 7,206 notes, 303,256 consumed bytes plus 12 trailing bytes. Includes 1,463 step, 127 right, 122 left, 54 land, 13 swim, 1,372 attack plus 40 attack-CRLF, and 22/7/8/7 attack_effect_1/2/3/4. No stepfast or swimfast names occur in this corpus. There are 36 notes outside recorded clip duration, some malformed/unrecognized names and direct/truncated sound-name notes; preserve explicit diagnostics/coverage rather than invent aliases. This census does not establish rendered skeleton duration equivalence. Remaining research: installed action/material census, actual animation cancellation/overlap/fallback rules, custom character source, hit-quality/voice category parameters, direct sound-name notes and death lifecycle. The PR #2600 integration dependency is resolved. Proposed implementation is actual-playhead gameplay-note publication shared with visual timing, then typed cue/material/voice policy using the existing audio runtime. Production C# uses typed gameplay events/data and existing audio services, with addresses/native function names confined to research tracking. Current implementation boundary - Implementation committed as 00bbbd123 (feature: Add gameplay sound effects and live audio controls) on feature/client-gameplay-sound-effects, rebased while unpublished onto develop 4dbe350b2. Generic AnimationMarker/PublishedAnimationMarker resources, a bounded SPSC mailbox and marker timeline integrated into Animator/PoseComposition. Markers use the same playhead/bind readiness as poses; each event carries clip, layer and playback identity. Crossed markers are flushed before queued cancellation/replacement; pending resources do not start a separate request-arrival timer. Held-at-end poses emit nothing, terminal markers are processed before overlay retirement, unchanged loop requests retain phase and interrupted action overlays publish their remaining authored markers tagged Interrupted, once at cancellation time; normal future playback is stopped. Gameplay consumers apply the verified fallback filtering, so weapon notes survive eligible interruptions while locomotion never fabricates interrupted footsteps. - CharacterVisualCatalog/AnimationLoader attach typed, case-sensitive authored gameplay notes to loaded clips. Name-prefix semantics, including shadowed fast/idle variants, are retained rather than invented aliases. Direct sound-name notes remain unsupported pending verified routing. Malformed optional marker data is isolated from normal clip loading. Gameplay audio now consumes the Engine marker-read API. Action-overlay requests carry an externally assigned playback identity through deferred loading and binding, linking actual notes to combat outcomes. Existing weapon visual/flinch timers have not yet been consolidated into this event source. - Safety policy: maximum 256 markers per clip (installed maximum observed 149); fixed 128-event mailbox; overflow consumes/drops events rather than replaying them later. Long stalls retain only the latest loop interval, avoiding unbounded historical bursts. These are explicit bounded runtime policies, not a claim to reproduce native edge-case quirks. Layer arbitration, animation fallback and world-generation correlation must be established before connecting this source to actual sound playback. - Verified client build and full non-install regression: 3,233 passed, 46 conditional skips. Dedicated installed metadata test passes against GameData/rdb: all 3,653 animations can supply bounded recognized markers. Tests cover delayed resource readiness, loop windows/boundaries/unchanged requests, held corpses, overlay cancellation/replacement/end, per-layer identities, extreme stalls, metadata ownership/invalid values/counts, SPSC threaded ordering/reuse and invalid animation ticks. Warmed timeline publication/drain probe allocates zero bytes on its caller thread; this is not an engine-wide performance claim. git diff --check passes. - An earlier focused suite included an unrelated installed-body sweep without required asset-root variables and failed that single test; the subsequent explicitly non-install regression passed, and the dedicated installed marker test was run separately with its fixture. No claim that all install/platform gates were executed. - GameplayAudioDirector is now wired independently of graphical effects through Bootstrap/WorldManager and CombatSwingMessageHandler. Bounded immutable sound profiles reuse BaseListEntity sound action maps and RdbItemTemplate/RdbVisualData instead of guessing sound files. Matching action-layer markers dispatch weapon-note sounds, successful-hit action sounds and body/material impacts. Live SimpleCharacter.Die entry publishes one death event; health writes, duplicate death calls and LieDead initial-corpse setup do not. Actor death cancels pending swings; world unload clears contexts/delayed cues and existing ClientAudio generation cancellation handles queued/decode/native work. Event subscriptions are removed on actor removal/unload. - Completed additional native/disassembly corroboration: weapon firing resolves its exact note action with the energy-zero/non-NPC branch selecting action 44; target-hit lookup can fall back to Attack=11. Material impact and hurt-vocal requests carry a 0.4-second delay. PlayGameSound/ExecuteCorePlayList use master effects volume; the separate player-voice multiplier is selected by a runtime flag set by PlayPlayerFX, not because a clip sounds vocal. Gameplay hurt/death cues therefore use Effects, not an inferred Voice category. Standard gender names and custom Terminate/Impact actions remain data-driven. - GameplaySoundParameters and SoundBank.MaterialSound expose mapped surface/intensity selection across 46 material slots. AudioCatalog retains parent gain/distance/fades/path plus the selected material accent, with normal/default fallbacks and bounded cycle/reference/output validation. Gameplay requests reuse ClientAudio decoding/cache/source ownership. A refused material variant no longer suppresses all later variants of its parent sound; regression verifies a missing normal asset followed by a valid hard asset, effects gain with voice volume zero, and world reset. - Missing-animation audio fallback requires actual authored attack/effect notes for a resolved animation, rather than always inventing an immediate Attack request. When movement/posture prevents the attack pose, the visual provider can expose those authored fallback notes. Missing animation identity/metadata produces no invented cue. Additional shape-shift, pending-loading and overlap semantics still require original-client/in-game cross-checks. - Installed sampling found a valid no-immediate-policy weapon graph b595b857: flame_blast_01.wav with five interval-driven children and no all/sequential/random immediate policy. Native PlaySample leaves those children unselected on the immediate path while playing the parent. Gameplay catalog selection now does the same and does not resolve unused children. A new regression failed before this fix and passed after it; environment and ordinary catalog policies are kept separate. Independent ffprobe reports the parent at 1.593288 seconds while its first child intervals start at 2 seconds. Repeated-fire/timed-child lifetime behavior remains to establish; no generic gameplay accent scheduler is fabricated. - Read-only installed SBF census: 6,810 authored records, 6,408 final unique IDs, 1,208 nonzero material references, no unresolved material references and no self references. Installed tests validate recognized metadata for 3,653 animations, human hit/death graphs across all three intensities, and 64 authored weapon action maps with selected playback assets resolving. This is a representative sample, not a complete weapon/creature corpus or audible comparison. The sample initially exhausted the bounded profile cache by feeding all item types into it; discovery now checks authored attack maps before constructing runtime profiles, without increasing the production limit. - Final validation: client build/full non-install suite 3,252 passed and 46 conditional skips; installed metadata/weapon/voice checks plus gameplay runtime regression 4 passed. Gameplay-slice Linux NativeAOT publish (before the F12 controls) with TreatWarningsAsErrors and system SQLite passed to .dev-data/client-gameplay-effects/linux-x64. Host/null-driver --audio-check passed four codec families, source reuse/rebinding, repeated streaming resets/underruns, UI playback and world reset with zero failures. This validates packaging/backend lifecycle, not audible gameplay parity. git diff --check passes. No active game process or real audio routing was changed. - F12 Audio controls are connected through AudioOptionsModel and the existing category/presenter framework. Master, effects, music and voice sliders plus sound/music toggles preview immediately through Bootstrap's audio publication, without registry assignments during preview (so PreferenceStore autosave cannot accidentally persist them). Apply assigns validated existing preference keys and flushes the store; Cancel/F12 close/disposal clears preview and reads applied values. Defaults preserve shipped declarations; returning sliders to their baseline releases preview. Save errors remain retryable, invalid values are refused, and unsupported device/independent UI/ambient/battle-policy controls stay disabled. Full non-install regression after these changes: 3,262 passed, 46 conditional skips; client build and git diff --check pass. No native GUI/audible check of the F12 controls claimed. - Death-source review confirms Bootstrap supplies the local player record as MusicCombatSnapshot.HealthPercent, separately from opponent health. GameplayMusicPolicy chooses faction Death only on that local health transition; enemy death instead follows its separate victory policy. The actor-effects entry point is explicitly named ActorDeath and only posts gameplay sound cues, never music. Added regression for Neutral/Clan/Omni verifying enemy death does not select local death music and local death does. Existing creature Terminate action selection is preserved; no death-music policy behavior was changed speculatively. - Ground footstep/landing implementation is now wired. WorldManager supplies current actor airborne state and playfield material context to GameplayAudioDirector, which consumes actual step/land markers across the animation stream and ignores Interrupted movement markers. Standard walk/run/land bank IDs and custom creature action maps are reused; no movement-distance timer or guessed generic creature step is added. The controlled listener's currentmovementmode=6 supplies the verified quarter-gain branch for standard characters; landing doubles that gain up to unity. Airborne state is published through the existing physics pose snapshot rather than inferred from speed or added timers. - Added bounded shared RdbTileMaterial parsing for versions 1/2, numeric/name-hash material resolution, and preservation of outdoor tile_type_data. PlayfieldSoundMaterials reads the packed ground tile type (not its visual texture), strips orientation bits, supports the optional 14-bit palette lookup, then maps through main tile IDs and the material catalog. Indoor and above-terrain/raised-surface positions use material 5. Terrain-height contact uses the same quantized tile sample and +0.1 threshold traced in native disassembly. Missing/malformed metadata is isolated; material lookup performs no per-step database I/O. Wet/liquid playback is intentionally suppressed pending authoritative liquid type integration; it is not approximated with dry-ground sounds. - Additional research: N3 GetTileMaterialType 0x10018420 reads RDB type 1000024 record 1; ReadBlob 0x1001c537 establishes versioned descriptor framing and authored material-name mapping. GetTileTypeGround 0x10017a3b/0x10017b6e and DisplaySystem ground constructor helper 0x10036a54 establish high-six-bit direct type versus low-14-bit palette indexing. Gamecode raw disassembly at 0x10045334 confirms world X/Z divided by tile scale before integer conversion. Vehicle.dll imported with Collision/N3; SHA256 236083c9593e03ef3f2fe0f40e13ce1e8dd31022e2e9f82cfdcc037cfaffde80. Its falling/landing paths establish the byte +0x52 footstep gate as airborne state, and water +0x10c as liquid depth rather than a guessed movement timer. - Killing-blow investigation reproduced an actual missing-shot path: the server StopAttack on a kill reaches client LeaveCombatStance, which queues an exit animation before the attack's sound marker. The old action replacement erased that pending marker. This is not a shared audio voice being overwritten by the death squeal. Generic marker timelines now publish outstanding markers as Interrupted when actions are replaced, cleared or cut by movement; the gameplay audio adapter permits only the verified attack/effect fallback IDs and never synthetic movement cues. Actor death still clears that actor's pending swings, not the killer's. A combined actor-death + exit-animation regression failed before the fix, then passed with both authored dying sound and the shot/impact cues, without duplicate later playback. Existing cancellation tests now distinguish interruption notifications from normal future markers. - Latest validation: focused marker/gameplay/material tests 36 passed; full non-install client suite 3,268 passed, 46 conditional skips; installed checks 4 passed, including the 61-entry material table and walk/run/land graphs for its distinct materials plus existing animation/weapon/voice corpus checks. Latest Linux NativeAOT publish with warnings-as-errors/system SQLite passes and now includes F12 controls, actor-death separation, footsteps and interruption fix. Host/null-driver --audio-check again passes four codecs and shared backend/source/stream lifecycle with zero failures. git diff --check passes. No audible in-game equivalence claimed, no active client process or real audio routing changed; the running client must be rebuilt/restarted to receive these changes. - Loudness investigation: user reports very quiet footsteps/blunt/death vocals versus loud SMG, then compared against AO and reports AO may have the same imbalance. No gain boosts, asset normalization, compressor or mixer changes have been made on this hypothesis. Read-only independent FFmpeg measurements of representative supplied assets: dirt/concrete boot RMS -30.51/-26.35 dBFS, male death -22.92, male hit -21.53, LE 1H/2H blunt -18.80/-11.43, LE SMG single/burst -14.71/-17.32. These are whole-file sample measurements, not a calibrated in-game loudness comparison or all weapon families. Footstep graph c743f93d applies authored ~0.498 root gain, ~0.247–0.349 material-group gain and ~0.498 leaf gain, yielding ~0.061–0.087 before category/distance gains. Native PlaySample corroborates gain multiplication; VolumeInterpolateChildren 0x10005c3f is a no-op and SE_Set2DSoundVolume 0x10007b10 forwards channel levels to Miles. No loudness normalization was found in that traced path; do not claim the complete Miles mixer/driver path contains no processing without finishing its audit. - Further confirmed research leads: Gamecode 0x100b1f3c -> wrapper 0x10011333 sets AO's listener from controlled Vehicle.GetGlobalPos (feet) and character rotation, whereas PRK's previously approved listener uses head position/camera orientation. This can affect nearby authored attenuation and remains a compatibility/design decision rather than an automatic change to the approved listener. Native PlaySample/ExecuteCorePlayList also coalesce same-frame requests by sound definition at maximum gain and reuse one native sample, while PRK currently permits independent voices, including repeated source/target requests for one blow and overlapping SMG clips. Investigate event-level duplicate/retrigger semantics separately before treating their extra energy as authored balance. No production code changed in this read-only loudness pass; user comparison argues against adding arbitrary balancing now. - Remaining: authoritative liquid/swimming integration, special landing/Atrox and broader movement-layer arbitration checks; unarmed/swish, nano/item/door/direct-name cues; complete weapon/creature/morph census and special-attack outcome handling; reconcile captured ammunition/profile state with original live equipped-item selection at the note; timed gameplay children and authored exclusivity/coalescing/priority behavior; consolidate visual/flinch scheduling, quantify cold metadata I/O/frame/voice-pressure costs, stale marker handoff/timing tolerances and real-device/audible original-AO comparison. Windows/macOS and broad scene/performance gates remain outstanding. Task and checklist stay incomplete; changes are committed on feature/client-gameplay-sound-effects. PR publication completed after retrying the SSH signer. Commit 00bbbd123 is pushed with upstream origin/feature/client-gameplay-sound-effects; working tree clean. Post-rebase validation passed: full non-install suite 3,272 passed, 46 conditional skips; installed checks 4 passed; latest Linux NativeAOT publish with warnings-as-errors/system SQLite and host/null-driver audio check passed; complete develop comparison and diff checks inspected. Task status remains in_progress. Nano follow-up — committed increment - Nano increment committed as 489bba260 (feature: Add initial nano gather and cast sound cues), pushed to feature/client-gameplay-sound-effects. Draft PR #2630 body updated with nano scope, installed-data gaps, latest validation and remaining travel/hit gates. Same imported binary hashes as above. Gamecode CharCastNano constructor 0x1007b5cd requests template gathersound (269) at the caster position, with delay 0.2 seconds and gain 0.6. State tick 0x1007b1e3 also requests gather while gathering persists; ongoing retrigger behavior depends on native sound-definition reuse and is not implemented in this increment. - Gamecode gather-end helper 0x1004f434 requests castsound (270) immediately at the caster, then travelsound (271) with a 0.2-second delay. It is reached from release and abort/interruption paths, not only successful casts. State tick additionally requests travel while release animation is unfinished. Successful result == 1 and a resolvable target gate hit effects/hitsound (272) at actual release completion. Raw disassembly corroborates that the hit sound position in this path is the caster's Vehicle.GetGlobalPos, not an invented target-impact location. Shared sound wrapper 0x100111e6 -> Sandy PlayGameSound 0x10007673 uses Effects routing. - Implemented only the initial gather request and gather-end cast request through GameplayAudioDirector and existing GameplaySoundCue/ClientAudio. No graphics-effect dependency, parallel backend, generic asset fallback, loudness boost, travel loop or invented hit timer. NanoSoundProfile preserves authored signed-stat IDs as uint and exposes all four fields; RdbGameplaySoundProfiles caches at most 4096 nano profiles. Pending casts are capped at 256, duplicate same-caster/nano starts are suppressed and replacement/removal/death/world reset discard pending initial gather cues. Delayed initial gather preserves its request-time position. Ending gather cancels an unpublished initial gather; this is an explicit stale-cue safety policy, not native edge-case parity. - Message-handler regressions verify gather/cast audio without a graphics-effect system, ordinary success/failure/interruption and no fabricated audio for forced/instant casts. Director tests cover delay/gain, unsigned IDs/empty sentinels, duplicate/replacement behavior, actor disappearance, removal/death/zoning, invalid updates and bounded capacity/reuse. - Installed sample: 3000 parsed nano templates, 24 distinct gather/cast IDs, 22 available graphs with representative playback assets resolving; db2f0278 and 111398fe are missing from the supplied game sound bank and remain silent. The initial universal-resolution assertion exposed this real data gap; the durable census now reports missing authored references separately and validates every available sampled graph. Existing parser diagnostics include seven failed nano records and missing unrelated RDB tables; this is not a complete parse/asset coverage claim. - Validation: standard client build passed with zero warnings/errors; full non-install suite 3283 passed, 46 conditional skips; installed nano census passed; git diff --check clean. Used existing prk-client-tests:10.0 container with serial MSBuild because no host SDK is installed and parallel builds collided on shared dependency outputs. NativeAOT, real-device/audible nano comparison and platform checks were not rerun. Changes committed and pushed; working tree clean. - Next nano work: expose authoritative release-playback completion/cancellation (reuse shared animation playhead rather than the graphics release-duration timer), establish movement/missing-animation/forced-cast behavior and support native gather/travel request coalescing/retrigger/lifetime semantics before enabling travel and hit playback. Task/checklist remain incomplete. Pull request - #2630 — feature: Add gameplay sound effects and live audio controls - https://git.project-rk.com/prk/engines/pulls/2630 - PR #2630 merged into develop as 0b532ed7a. Client release tag client_v0.0.14 created and pushed at that commit. Player-facing changelog prepared at .dev-data/releases/client_v0.0.14/changelog.md, covering changes since client_v0.0.13; excludes technical work and unfinished features. CI owns release validation/build/publication; no local release-test results claimed. Remaining gameplay implementation keeps this task in_progress. - Beta tracker corrected to contain observable missing/incorrect behavior, not engineering planning: existing #15 weapon and #16 nano reports retain their original reporter text plus concise fix/verification status; #20 is narrowed to missing swimming audio (related to #14). #21–23 were closed as misplaced internal work, not fixed bugs. PR links only #15, #16 and #20; internal implementation/research follow-ups remain here. - Tasked retains implementation scope/research/status as the source of truth. User scope clarification: performance work is deferred, not a requirement or gate for this gameplay increment; basic audio-engine performance testing was already done. Earlier performance investigation proposals in this research history are not current action items. Do not create speculative beta bugs from unmeasured performance or internal validation plans. Marking the PR ready does not complete the remaining gameplay implementation.
Checklist
0 of 3 complete- Establish evidence-backed gameplay cue/timing/material/voice behavior and installed-data coverage.
- Implement shared gameplay event scheduling and typed audio adapters independent of visual effects.
- Verify deterministic regressions, installed assets, client build/native lifecycle and document audible/platform gaps.
- Area
- Project Rubi-Ka
- Project
- engines
- Kind
- Feature
- Task ID
tsk_832s5g445n- Updated