From 6bafea09199b3ac6b52f15edf7cb673057456724 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 2 Sep 2026 17:03:50 +0700 Subject: [PATCH] your character speaks its refusals, and clicks land on the right frame MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - your character speaks its refusals: `VocalUISounds.dbc` gets an adapter, `sound::vocal` transcribes `0x4580f0`'s per-race table and `0x458250`'s play cycle — four plays of one line arm the annoyed variations, and the bus cap of one keeps the annoyed and ordinary lines from playing at once; a displayed message now carries its catalog RECORD, so its sound comes off the same row (tag 0x44 plays the named cue, anything else speaks the line), and 36 of the keys benilla raises have a voice — cast failures, inventory refusals, the quest/auction/petition lines, taxi, bank, stable, mail, the talent wipe; `EnableErrorSpeech` joins the CVars at the registrar's own default and the Audio page grows 1.12's fourth Sound checkbox with the dependency ours was missing (the master greys Ambience AND Error Speech, not Music); seven of the twelve taxi refusals turn out to be the YELLOW info line, not the red one they all took - at equal (strata, level) the hit sweep takes the EARLIER-linked frame: `0x764aa0` inserts with a strict `ja`, so equal keys are appended, and `0x7660d0` sweeps each bucket from index 0 upward — the reverse of the reverse-draw-order walk we had, so draw order is unchanged and only the hit sweep reorders within a plane; the wheel becomes its own index, and the five full-area wheel-catcher Buttons (Craft, QuestLog, Skill, TradeSkill, Trainer) are deleted, since under the true tie law each would have swallowed its whole window's clicks — a bug the Skill window's own comment had already recorded once - one rasterizer settle for the whole ground-decal family, and it is the measured one: the shipped client constructs `CGxDeviceD3d`, so the OpenGL arm holding the −4.0 slope factor is never executed (factor 0 on 2485 of 2485 captured `glPolygonOffset` calls), and every number derived from it was 256× too small; the reference groups the blob shadow with the selection RING and the footprints on their own at 10×, the reverse of ours — but ours is reversed-Z float where the bake residual is millimetre-scale and constant with distance, so `DECAL_RASTER` collapses to one value (32768: the ring and the reticle had been under their own conflict at 8192 and simply never walked on a slope) Co-Authored-By: Claude Fable 5.1 --- crates/benilla-app/assets/ui/CraftFrame.xml | 10 - crates/benilla-app/assets/ui/OptionsFrame.xml | 40 +- .../benilla-app/assets/ui/QuestLogFrame.xml | 46 +- crates/benilla-app/assets/ui/SkillFrame.xml | 13 - .../benilla-app/assets/ui/TradeSkillFrame.xml | 10 - crates/benilla-app/assets/ui/TrainerFrame.xml | 11 - crates/benilla-app/src/blob_shadow.rs | 2 +- crates/benilla-app/src/cvars.rs | 10 +- crates/benilla-app/src/footprints.rs | 2 +- crates/benilla-app/src/net/apply/auction.rs | 2 +- crates/benilla-app/src/net/apply/chat.rs | 4 +- crates/benilla-app/src/net/apply/mail.rs | 8 +- crates/benilla-app/src/net/apply/npc.rs | 2 +- crates/benilla-app/src/net/apply/quests.rs | 20 +- crates/benilla-app/src/pipe_warm/mod.rs | 7 +- crates/benilla-app/src/sound/kit.rs | 45 +- crates/benilla-app/src/sound/message.rs | 202 +++++++ crates/benilla-app/src/sound/mod.rs | 12 + crates/benilla-app/src/sound/spell.rs | 4 +- crates/benilla-app/src/sound/vocal.rs | 506 ++++++++++++++++++ crates/benilla-app/src/ui_action/errors.rs | 146 ++++- crates/benilla-app/src/ui_action/feed.rs | 40 +- .../benilla-app/src/ui_action/feed_tests.rs | 2 + crates/benilla-app/src/ui_action/mod.rs | 2 +- crates/benilla-app/src/ui_auction/mod.rs | 8 +- crates/benilla-app/src/ui_bank.rs | 76 ++- crates/benilla-app/src/ui_chat/broadcast.rs | 2 +- crates/benilla-app/src/ui_items/feed.rs | 14 +- crates/benilla-app/src/ui_mail/mod.rs | 96 +++- crates/benilla-app/src/ui_petition/feed.rs | 12 +- crates/benilla-app/src/ui_petition/lines.rs | 45 +- crates/benilla-app/src/ui_quest.rs | 11 +- crates/benilla-app/src/ui_quest_share.rs | 11 +- .../src/ui_script/options_tests.rs | 12 +- .../src/ui_script/questlog_tests.rs | 5 +- crates/benilla-app/src/ui_stable.rs | 28 +- crates/benilla-app/src/ui_talent_wipe.rs | 25 +- crates/benilla-app/src/ui_taxi/mod.rs | 54 +- crates/benilla-app/src/ui_taxi/routing.rs | 51 +- crates/benilla-app/tests/message_keys.rs | 129 +++++ crates/benilla-formats/src/lib.rs | 4 + crates/benilla-formats/src/vocal_ui_sounds.rs | 240 +++++++++ crates/benilla-ui/src/loader/scripts.rs | 15 +- crates/benilla-ui/src/order.rs | 73 ++- crates/benilla-ui/src/script/loot.rs | 5 +- crates/benilla-ui/src/script/pointer.rs | 12 +- crates/benilla-ui/src/script/tests/input.rs | 26 +- crates/benilla-ui/src/widget/mod.rs | 10 +- crates/benilla-world/src/ground_fx.rs | 6 +- crates/benilla-world/src/particles/render.rs | 28 +- crates/benilla-world/src/sky_order.rs | 128 +++-- 51 files changed, 1880 insertions(+), 392 deletions(-) create mode 100644 crates/benilla-app/src/sound/message.rs create mode 100644 crates/benilla-app/src/sound/vocal.rs create mode 100644 crates/benilla-formats/src/vocal_ui_sounds.rs diff --git a/crates/benilla-app/assets/ui/CraftFrame.xml b/crates/benilla-app/assets/ui/CraftFrame.xml index 8c3f8166..76eaa852 100644 --- a/crates/benilla-app/assets/ui/CraftFrame.xml +++ b/crates/benilla-app/assets/ui/CraftFrame.xml @@ -769,16 +769,6 @@ - - - diff --git a/crates/benilla-app/assets/ui/OptionsFrame.xml b/crates/benilla-app/assets/ui/OptionsFrame.xml index c8286026..8d43abb7 100644 --- a/crates/benilla-app/assets/ui/OptionsFrame.xml +++ b/crates/benilla-app/assets/ui/OptionsFrame.xml @@ -660,7 +660,7 @@ }, Audio = { "RowEnableAll", "RowMaster", "RowSound", "RowMusic", "RowAmbience", - "RowEnableMusic", "RowEnableAmbience", + "RowEnableMusic", "RowEnableAmbience", "RowEnableErrorSpeech", }, Graphics = { "RowUiScale", "RowFarclip", "RowWorldDetail", @@ -1249,15 +1249,21 @@ return end if key ~= "Audio" then return end + -- 1.12's own rule, both halves: SoundOptionsFrame_UpdateDependencies greys check + -- button 2 (Enable Ambience) AND button 4 (Enable Error Speech) while the master + -- enable is unticked. Enable Music is deliberately left alive — the quirk the + -- reference's own file has. local on = GetCVar("MasterSoundEffects") ~= "0" - local box = OptionsFrameContainerBodyAudioRowEnableAmbienceCheck - local label = OptionsFrameContainerBodyAudioRowEnableAmbienceLabel - if on then - box:Enable() - label:SetFontObject("GameFontNormal") - else - box:Disable() - label:SetFontObject("GameFontDisable") + for _, row in {"RowEnableAmbience", "RowEnableErrorSpeech"} do + local box = getglobal("OptionsFrameContainerBodyAudio"..row.."Check") + local label = getglobal("OptionsFrameContainerBodyAudio"..row.."Label") + if on then + box:Enable() + label:SetFontObject("GameFontNormal") + else + box:Disable() + label:SetFontObject("GameFontDisable") + end end end @@ -2321,6 +2327,22 @@ self.soundQuirk = 1 + + + + + + + + OptionsRow_OnLoad(self, "EnableErrorSpeech", "Enable Error Speech", + "OPTION_TOOLTIP_ENABLE_ERROR_SPEECH") + self.soundQuirk = 1 + + - - - - - diff --git a/crates/benilla-app/assets/ui/TrainerFrame.xml b/crates/benilla-app/assets/ui/TrainerFrame.xml index e8b1bebd..a8639e7e 100644 --- a/crates/benilla-app/assets/ui/TrainerFrame.xml +++ b/crates/benilla-app/assets/ui/TrainerFrame.xml @@ -718,17 +718,6 @@ - - -