Cutscene voices switch from Portuguese (pt-BR) to Japanese after the first boss #1460

Closed
opened 2026-11-10 03:43:15 +00:00 by deivid94 · 6 comments
deivid94 commented 2026-11-10 03:43:15 +00:00 (Migrated from github.com)

Hookshot version

v2.0.11 (source d6369f1e)

What kind of problem

Sound, controls or saves

What happened

The game is set to Brazilian Portuguese (language.txt = pt-BR, and the log says oe: language pt-BR (language.txt)), but the cutscene voices switch to another language during play.

  • The first cutscenes at the start of the game (Kokiri Forest) played with the Portuguese dub, as expected.
  • The cutscene after defeating the first boss (Gohma, Great Deku Tree) played with Japanese voices (an Asian language at least; the romfs has no Chinese or Korean voice files, so it should be JPja). Subtitles and menus stayed in Portuguese.
  • No setting was changed between the two cutscenes.

Expected: every voiced cutscene uses the Portuguese (USpt) dub.

What I checked in the game files (romfs, Voice/Resource/Stream):

  • The Portuguese dub is complete: 940 USpt_EventFlowMsg-_Dm_*.bwav files, the same count as USen, JPja, EUde and the others.
  • The Portuguese files for the Deku Tree scenes (Dm_Kokiri_0140, Dm_Kokiri_0150, Dm_Kokiri_0158) are all present, and none of them is byte-identical to its JPja_ counterpart, so the dump does not have Japanese audio under the Portuguese name.
  • The few voice files without a language prefix (EventFlowMsg-_Dm_Kokiri_0158--..._001_b.bwav etc.) are tiny (about 3 KB, short sounds), so they do not explain a whole cutscene in another language.

So the game seems to pick the voice language at runtime and, at some point after the start, it picks JPja instead of USpt.

Side note, possibly unrelated: normal NPC dialogue has no voice, which matches the files (only Dm_ cutscenes and about 45 LayoutMsg lines are voiced).

Where in the game

Great Deku Tree: the cutscene right after defeating Gohma. The intro cutscenes in Kokiri Forest earlier in the same playthrough were in Portuguese.

How often

Once so far

Graphics card and driver version

NVIDIA GeForce RTX 4060 (8 GB), NVIDIA 610.74

CPU, RAM and operating system

AMD Ryzen 7 5700X, 32 GB, Windows 11 Pro 24H2 (build 26100)

Changes from the defaults

  • language.txt: pt-BR (chosen in Hookshot Builder)
  • Built with Hookshot Builder (Windows) from a .nup, game folder at the root of a secondary drive
  • hookshot_options.ini (Insert menu):
quality_preset=0
fullscreen=1
gpu_device=1
frame_generation=2
frame_pacing=1
resolution=1
output_res=0
upscaling=1
sharpness=100
handheld_profile=1
ultrawide=1
robust_buffers=0
fps_counter=1
game_speed=1
text_speed=0
microphone=1
  • Audio: the log shows audio: device sink on mix 0, 6 channels (5.1 output on the default device).
  • No hookshot_env.txt.

Other software hooked into the game

No, nothing hooked in

hookshot_log.txt

Attaching hookshot_log.txt (the run with the Gohma cutscene) in a comment below.

Screenshots or video

No response

Before you send it

  • I'm on the newest release, or the problem is still there on it.
  • I searched the open issues for this problem.
  • I'm not attaching game files, keys, hookshot.exe, the .bin caches or saves.
### Hookshot version v2.0.11 (source d6369f1e) ### What kind of problem Sound, controls or saves ### What happened The game is set to Brazilian Portuguese (`language.txt` = `pt-BR`, and the log says `oe: language pt-BR (language.txt)`), but the cutscene voices switch to another language during play. - The first cutscenes at the start of the game (Kokiri Forest) played with the **Portuguese** dub, as expected. - The cutscene after defeating the first boss (Gohma, Great Deku Tree) played with **Japanese** voices (an Asian language at least; the romfs has no Chinese or Korean voice files, so it should be `JPja`). Subtitles and menus stayed in Portuguese. - No setting was changed between the two cutscenes. Expected: every voiced cutscene uses the Portuguese (`USpt`) dub. What I checked in the game files (romfs, `Voice/Resource/Stream`): - The Portuguese dub is complete: 940 `USpt_EventFlowMsg-_Dm_*.bwav` files, the same count as `USen`, `JPja`, `EUde` and the others. - The Portuguese files for the Deku Tree scenes (`Dm_Kokiri_0140`, `Dm_Kokiri_0150`, `Dm_Kokiri_0158`) are all present, and none of them is byte-identical to its `JPja_` counterpart, so the dump does not have Japanese audio under the Portuguese name. - The few voice files without a language prefix (`EventFlowMsg-_Dm_Kokiri_0158--..._001_b.bwav` etc.) are tiny (about 3 KB, short sounds), so they do not explain a whole cutscene in another language. So the game seems to pick the voice language at runtime and, at some point after the start, it picks `JPja` instead of `USpt`. Side note, possibly unrelated: normal NPC dialogue has no voice, which matches the files (only `Dm_` cutscenes and about 45 `LayoutMsg` lines are voiced). ### Where in the game Great Deku Tree: the cutscene right after defeating Gohma. The intro cutscenes in Kokiri Forest earlier in the same playthrough were in Portuguese. ### How often Once so far ### Graphics card and driver version NVIDIA GeForce RTX 4060 (8 GB), NVIDIA 610.74 ### CPU, RAM and operating system AMD Ryzen 7 5700X, 32 GB, Windows 11 Pro 24H2 (build 26100) ### Changes from the defaults - `language.txt`: `pt-BR` (chosen in Hookshot Builder) - Built with Hookshot Builder (Windows) from a `.nup`, game folder at the root of a secondary drive - `hookshot_options.ini` (Insert menu): ``` quality_preset=0 fullscreen=1 gpu_device=1 frame_generation=2 frame_pacing=1 resolution=1 output_res=0 upscaling=1 sharpness=100 handheld_profile=1 ultrawide=1 robust_buffers=0 fps_counter=1 game_speed=1 text_speed=0 microphone=1 ``` - Audio: the log shows `audio: device sink on mix 0, 6 channels` (5.1 output on the default device). - No `hookshot_env.txt`. ### Other software hooked into the game No, nothing hooked in ### hookshot_log.txt Attaching `hookshot_log.txt` (the run with the Gohma cutscene) in a comment below. ### Screenshots or video _No response_ ### Before you send it - [x] I'm on the newest release, or the problem is still there on it. - [x] I searched the open issues for this problem. - [x] I'm not attaching game files, keys, hookshot.exe, the .bin caches or saves.
deivid94 commented 2026-11-10 03:46:37 +00:00 (Migrated from github.com)
[hookshot_log.txt](https://github.com/user-attachments/files/34610858/hookshot_log.txt)
Joey-Magnus commented 2026-11-10 19:10:49 +00:00 (Migrated from github.com)

Notes from reading the game data and the host code, so nobody has to redo it. I haven't run the game for this yet.

Ruled out:

  • The dump. All the Portuguese voice files for the Gohma ending are present: Voice/Resource/USpt_EventFlowMsg-_Dm_Kokiri_0160.bars.zs and its six Stream/USpt_..._Dm_Kokiri_0160_Text_00{0-5}_b.bwav files, the same set as USen, JPja and the rest.
  • The movie's audio. The scene after Gohma uses Event/Movie/Dm_Kokiri_0160.webm, but that file has one AV1 video stream and no audio track. The voices come from the .bwav files above, played alongside it, not from the movie player.
  • The voice table. Voice/VoiceSettingInfo.Product.111.byml.zs (zstd with zs.zsdic) has a LanguageMapping of 10 entries, one of them to USpt. Its Resources entry for EventFlowMsg-_Dm_Kokiri_0160 looks the same as the earlier Kokiri scenes' entries, which play in Portuguese.
  • The language Hookshot reports. nn::oe::GetDesiredLanguage (host/nn_applet.c) reads language.txt once and caches it, and the log shows pt-BR (language.txt). Hookshot implements no nn::settings calls, and the reporter's log has no unimplemented import to do with language or region.

Lead: the choice of voice set is made in the game's own code. In nn::settings::Language, Japanese is value 0. Some lookup on this scene's path (movie events, perhaps) getting 0 or a "not found" would come out as JPja.

Next step, needs the game: a save just before the Deku Tree's death scene, plus a log of the voice files opened, to see which prefix the game asks for there. If anyone has such a save, please attach it here.

Notes from reading the game data and the host code, so nobody has to redo it. I haven't run the game for this yet. **Ruled out:** - **The dump.** All the Portuguese voice files for the Gohma ending are present: `Voice/Resource/USpt_EventFlowMsg-_Dm_Kokiri_0160.bars.zs` and its six `Stream/USpt_..._Dm_Kokiri_0160_Text_00{0-5}_b.bwav` files, the same set as `USen`, `JPja` and the rest. - **The movie's audio.** The scene after Gohma uses `Event/Movie/Dm_Kokiri_0160.webm`, but that file has one AV1 video stream and no audio track. The voices come from the `.bwav` files above, played alongside it, not from the movie player. - **The voice table.** `Voice/VoiceSettingInfo.Product.111.byml.zs` (zstd with `zs.zsdic`) has a `LanguageMapping` of 10 entries, one of them to `USpt`. Its `Resources` entry for `EventFlowMsg-_Dm_Kokiri_0160` looks the same as the earlier Kokiri scenes' entries, which play in Portuguese. - **The language Hookshot reports.** `nn::oe::GetDesiredLanguage` (`host/nn_applet.c`) reads `language.txt` once and caches it, and the log shows `pt-BR (language.txt)`. Hookshot implements no `nn::settings` calls, and the reporter's log has no unimplemented import to do with language or region. **Lead:** the choice of voice set is made in the game's own code. In `nn::settings::Language`, Japanese is value 0. Some lookup on this scene's path (movie events, perhaps) getting 0 or a "not found" would come out as `JPja`. **Next step, needs the game:** a save just before the Deku Tree's death scene, plus a log of the voice files opened, to see which prefix the game asks for there. If anyone has such a save, please attach it here.
mooki000 commented 2026-11-11 03:53:45 +00:00 (Migrated from github.com)

A lead on where the voice set is chosen. I traced this on the same game build (e0f3ccfa) earlier, for a voice-language setting in another port of this game. It is not reproduced on Hookshot yet; I am setting up a build here and can run it.

The game has a Voice Language option of its own, apart from the text language:

  • It is on the game's own Options screen. Its texts are VoiceLanguage_Title and VoiceLanguage_00 to _08 in LayoutMsg/SystemOption_00.msbt: Japanese, English, French (France), French (Canada), German, Spanish (Spain), Spanish (Latin America), Italian, Portuguese (Brazil).
  • It is the enum flag OptionData.VoiceLanguage of the game's flag database (GameData/GameDataList), its default is Japanese, and it is saved in option.sav.
  • With no option.sav yet, the game's voice manager sets the flag once, on its first update, from the desired language (main+0x9b48c0, through a 17-entry table at main+0x3f0fd28 that has a Portuguese_Brazil entry). What I saw on a new profile with English text: the flag read Japanese, then English, before the title. A loaded option.sav then replaces the value.
  • The voice manager watches the flag and switches when it changes. For an event it loads the bars of all nine languages and opens only the streams of the flag's language.

So Japanese voices under Portuguese text is what the game does while that flag holds its default. I saw the same pair the other way round: save folders whose option.sav held Japanese played JPja voices under en-US text.

A check that needs no save from before the scene. @deivid94, could you open the game's own Options screen and say what Voice Language shows now? If it shows Japanese, setting it to Portuguese there should bring the dub back (the game stores it in option.sav when it saves its options), and it would tell us that the option's value changed, not that the wrong files were picked for one scene.

What that would leave open is how the value got back to the default between the opening (Portuguese) and the scene after Gohma: a load of option.sav that holds or yields the default, or the game's option data being reset. I have not looked at that in Hookshot's code. With a build here I can start a new pt-BR profile, log the flag and the voice files opened, and watch it across the first saves and a restart.

Corrected 2026-11-11 16:33 UTC: above I wrote that the game sets the option from the system language only when there is no option.sav yet. On Hookshot it does so at every start, before it reads option.sav (seven runs, in my next comment). The rest of this comment was a lead from another port and is replaced by those runs.

A lead on where the voice set is chosen. I traced this on the same game build (`e0f3ccfa`) earlier, for a voice-language setting in another port of this game. It is not reproduced on Hookshot yet; I am setting up a build here and can run it. **The game has a Voice Language option of its own, apart from the text language:** - It is on the game's own Options screen. Its texts are `VoiceLanguage_Title` and `VoiceLanguage_00` to `_08` in `LayoutMsg/SystemOption_00.msbt`: Japanese, English, French (France), French (Canada), German, Spanish (Spain), Spanish (Latin America), Italian, Portuguese (Brazil). - It is the enum flag `OptionData.VoiceLanguage` of the game's flag database (`GameData/GameDataList`), its **default is `Japanese`**, and it is saved in `option.sav`. - With no `option.sav` yet, the game's voice manager sets the flag once, on its first update, from the desired language (`main+0x9b48c0`, through a 17-entry table at `main+0x3f0fd28` that has a `Portuguese_Brazil` entry). What I saw on a new profile with English text: the flag read `Japanese`, then `English`, before the title. A loaded `option.sav` then replaces the value. - The voice manager watches the flag and switches when it changes. For an event it loads the `bars` of all nine languages and opens only the streams of the flag's language. So Japanese voices under Portuguese text is what the game does while that flag holds its default. I saw the same pair the other way round: save folders whose `option.sav` held `Japanese` played `JPja` voices under `en-US` text. **A check that needs no save from before the scene.** @deivid94, could you open the game's own Options screen and say what Voice Language shows now? If it shows Japanese, setting it to Portuguese there should bring the dub back (the game stores it in `option.sav` when it saves its options), and it would tell us that the option's value changed, not that the wrong files were picked for one scene. **What that would leave open** is how the value got back to the default between the opening (Portuguese) and the scene after Gohma: a load of `option.sav` that holds or yields the default, or the game's option data being reset. I have not looked at that in Hookshot's code. With a build here I can start a new `pt-BR` profile, log the flag and the voice files opened, and watch it across the first saves and a restart. *Corrected 2026-11-11 16:33 UTC: above I wrote that the game sets the option from the system language only when there is no `option.sav` yet. On Hookshot it does so at every start, before it reads `option.sav` (seven runs, in my next comment). The rest of this comment was a lead from another port and is replaced by those runs.*
mooki000 commented 2026-11-11 16:33:09 +00:00 (Migrated from github.com)

I owed a reproduction here. I ran it on Hookshot main (bdfe09c plus logging only), Linux, RTX 4090 with NVIDIA
615.78.08, headless, language.txt = pt-BR. The added logging wrote the game's own
Voice Language option every time it changed, every call on the save files, and the language prefix of every voice
file the game opened.

Run What Voice Language option Voice files opened option.sav
1 New profile, New Game, the opening, the game's first save Portuguese (Brazil) from the first frame to the end (550 s) (not logged in this run) written with Portuguese (Brazil)
2 Restart, Continue on that save Portuguese (Brazil) throughout (no voiced scene) read, left as it was
3 That save with option.sav emptied (0 bytes), Continue Portuguese (Brazil) throughout (no voiced scene) found empty, not rewritten
4 That save with option.sav cut to half its size, Continue Portuguese (Brazil) throughout (no voiced scene) the half file read, not rewritten
5 New profile, New Game into the opening narration Portuguese (Brazil) throughout 7 of 7 narration lines USpt (none yet)
6 A save in Gohma's room (option Portuguese), the blue warp, the Deku Tree, the movie after it Portuguese (Brazil) throughout (360 s) the movie's narration: 15 of 15 lines USpt; the narration right after it: 4 of 4 USpt read, left as it was

In every run the characters' voice sets the game loaded were the Portuguese ones, and the game never opened or
created anything in its temporary storage (user\temp).

Portuguese text and voices from the opening to the movie after Gohma

So on current main the scene after Gohma plays the Portuguese dub while the option holds Portuguese: the scene does
not pick its voices some other way. And the option did not fall back to Japanese on its own: at every start the
game sets Voice Language from the system language (pt-BR) before it reads option.sav, and an empty or half-written
option.sav (what closing the game in the middle of a save could leave, runs 3 and 4) left that Portuguese value in
place.

That leaves one way I can see for Japanese voices under Portuguese text: an option.sav that holds Japanese, which the
game reads at the start of a session and then uses for every scene. @deivid94, two questions:

  • What does the game's own Options screen show for Voice Language now? If it shows Japanese, setting it back to
    Portuguese there should fix it for good.
  • Between the session where the opening played in Portuguese and the one with Gohma, did your save folder
    (user\save\...) come from anywhere else, for example copied from an emulator or another port, or with
    scripts/oot_saves.py?

Your log is of the Gohma session only, and Hookshot's release build does not log save-file calls, so it cannot show
how option.sav looked when that session started.

Not tested: Windows, your version (v2.0.11; I ran current main), a full-size option.sav of zeros (what a power cut
can leave).

I owed a reproduction here. I ran it on Hookshot main (`bdfe09c` plus logging only), Linux, RTX 4090 with NVIDIA 615.78.08, headless, `language.txt` = `pt-BR`. The added logging wrote the game's own Voice Language option every time it changed, every call on the save files, and the language prefix of every voice file the game opened. | Run | What | Voice Language option | Voice files opened | `option.sav` | |---|---|---|---|---| | 1 | New profile, New Game, the opening, the game's first save | Portuguese (Brazil) from the first frame to the end (550 s) | (not logged in this run) | written with Portuguese (Brazil) | | 2 | Restart, Continue on that save | Portuguese (Brazil) throughout | (no voiced scene) | read, left as it was | | 3 | That save with `option.sav` emptied (0 bytes), Continue | Portuguese (Brazil) throughout | (no voiced scene) | found empty, not rewritten | | 4 | That save with `option.sav` cut to half its size, Continue | Portuguese (Brazil) throughout | (no voiced scene) | the half file read, not rewritten | | 5 | New profile, New Game into the opening narration | Portuguese (Brazil) throughout | 7 of 7 narration lines `USpt` | (none yet) | | 6 | A save in Gohma's room (option Portuguese), the blue warp, the Deku Tree, the movie after it | Portuguese (Brazil) throughout (360 s) | the movie's narration: 15 of 15 lines `USpt`; the narration right after it: 4 of 4 `USpt` | read, left as it was | In every run the characters' voice sets the game loaded were the Portuguese ones, and the game never opened or created anything in its temporary storage (`user\temp`). ![Portuguese text and voices from the opening to the movie after Gohma](https://gist.githubusercontent.com/mooki000/b86bd3f35969803fb032f71f035844f8/raw/b1c10285ac12ff2370935ada201032fab7b6bde4/hookshot-voicelang-1460-ptbr.jpg) So on current main the scene after Gohma plays the Portuguese dub while the option holds Portuguese: the scene does not pick its voices some other way. And the option did not fall back to Japanese on its own: at every start the game sets Voice Language from the system language (pt-BR) *before* it reads `option.sav`, and an empty or half-written `option.sav` (what closing the game in the middle of a save could leave, runs 3 and 4) left that Portuguese value in place. That leaves one way I can see for Japanese voices under Portuguese text: an `option.sav` that holds Japanese, which the game reads at the start of a session and then uses for every scene. @deivid94, two questions: - What does the game's own Options screen show for Voice Language now? If it shows Japanese, setting it back to Portuguese there should fix it for good. - Between the session where the opening played in Portuguese and the one with Gohma, did your save folder (`user\save\...`) come from anywhere else, for example copied from an emulator or another port, or with `scripts/oot_saves.py`? Your log is of the Gohma session only, and Hookshot's release build does not log save-file calls, so it cannot show how `option.sav` looked when that session started. Not tested: Windows, your version (v2.0.11; I ran current main), a full-size `option.sav` of zeros (what a power cut can leave).
deivid94 commented 2026-11-11 20:37:41 +00:00 (Migrated from github.com)

well guys i will play the game later.
but awanser the questions

i rebuild the game, because i was things of resolution I thought you could build with NVIDIA DLSS.

but i descovery what these options was native from build . (at least was the claude say it )

so i copy the save and after paste again .
about the audio into the configure is portuguese
but my windows 11 is set to english

i will print or record the issue. if continue .
I will make the changes that you suggested. later in this issue

well guys i will play the game later. but awanser the questions i rebuild the game, because i was things of resolution I thought you could build with NVIDIA DLSS. but i descovery what these options was native from build . (at least was the claude say it ) so i copy the save and after paste again . about the audio into the configure is portuguese but my windows 11 is set to english i will print or record the issue. if continue . I will make the changes that you suggested. later in this issue
NotRexed commented 2026-11-11 21:22:44 +00:00 (Migrated from github.com)

Thanks for the report. Reports of the same problem are now collected in #2506, which lists this one with your details and links back here, so one fix closes them together and the open list stays readable. Follow #2506 for the fix, and add new details there (or here). If this turns out to be a separate problem it will be reopened.

Thanks for the report. Reports of the same problem are now collected in #2506, which lists this one with your details and links back here, so one fix closes them together and the open list stays readable. Follow #2506 for the fix, and add new details there (or here). If this turns out to be a separate problem it will be reopened.
Commenting is not possible because the repository is archived.
No milestone
No assignees
1 participant
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
MagicBeanDev/Hookshot#1460
No description provided.