Repository navigation
Description
Guardians of the Galaxy (PPSA01748, US release) opens on a language picker. On main the voice row offers English, French, German, Spanish and the rest, but the text row offers only Arabic, Korean and the Chinese variants, so the whole game runs in Chinese. With scePlayGoGetSupportedOptionalChunk and scePlayGoGetOptionalChunk reporting every optional chunk as installed, every text language appears, English included. Fix branch below.
Title: Marvel's Guardians of the Galaxy (PPSA01748 v01.006.000)
Where it shows: the first screen, on main bebff8b0e; 9f03c4fe0 has the same two functions. Linux, RTX 4090. 3 of 3 runs.
What the game asks
With a trace on the two functions, the title calls scePlayGoGetSupportedOptionalChunk twice and scePlayGoGetOptionalChunk once, all with type 0, before the picker appears. It never imports scePlayGoGetLanguageMask. Both functions return 0 with an empty bitmask, which reads as "this package has no language packs and none are installed".
The title's sce_sys/playgo-scenario.json lists ten chunk languages:
"chunkSupportedLanguages": ["en-US", "fr-FR", "it-IT", "de-DE", "es-ES", "pl-PL", "ru-RU", "es-419", "pt-BR", "ja-JP"]
The text row hides exactly the languages in that list and keeps the ones param.json lists outside it (ar-AE, ko-KR, zh-Hans, zh-Hant). scePlayGoGetLocus is not the cause: the scenario file already makes main accept chunks 0 to 59 as LOCAL_FAST.
Fix
Branch: https://github.com/Tamalero/AnyPS5/tree/fix/playgo-optional-chunks-installed (one commit on 9f03c4fe0).
A dump is fully installed, so both functions now set every bit, the same answer scePlayGoGetLanguageMask already gives for languages. type stays ignored. The bit layout and the type values are not known, and that is recorded in docs/dev/debt/libScePlayGo.md.
--- a/core/libs/prx/libScePlayGo/Export.cpp
+++ b/core/libs/prx/libScePlayGo/Export.cpp
@@ -19,6 +19,7 @@
static constexpr uint64_t PLAYGO_LANGUAGE_MASK_ALL = ~0ull;
+static constexpr uint64_t PLAYGO_OPTIONAL_CHUNK_MASK_ALL = ~0ull;
@@ -160,7 +161,7 @@ int APS5_VABI scePlayGoGetOptionalChunk(int handle, int32_t type, PlayGoOptional
- option->bitmask = 0;
+ option->bitmask = PLAYGO_OPTIONAL_CHUNK_MASK_ALL;
@@ -177,7 +178,7 @@ int APS5_VABI scePlayGoGetSupportedOptionalChunk(int handle, int32_t type, PlayG
- option->bitmask = 0;
+ option->bitmask = PLAYGO_OPTIONAL_CHUNK_MASK_ALL;core/libs/tests/GuestPlayGo.cpp gains a check for both functions (bad handle, null pointer, all bits set).
Details and tests
- Title run:
mainbebff8b0eplus a local env switch that returns~0ullfrom both functions (same values as the branch); Linux (CachyOS), RTX 4090, Release. Without it: text row = Arabic / Korean / Chinese only, 3 of 3 runs. With it: every language inparam.json, English included, 1 of 1 run, and the title goes on past the picker. - Branch:
guest_playgopasses; withExport.cppreverted tomainthe new check aborts (negative check).tools/check_conventions.py --base origin/mainpasses. - Not tested: Windows, and a package that ships no optional chunks on a console.
- I have fewer than 10 merged PRs, so this is an issue with the branch rather than a PR. Related: feat(libScePlayGo): fix error codes, implement the language mask and to-do list #238 (language mask), fix(libScePlayGo): answer chunk ids from the package layout #4491 and fix(libScePlayGo): report missing chunk metadata #5494 (chunk ids, different functions).
Tested and written by Claude (AI assistant) on a contributor's machine.
Activity
milescoviello commentedon Oct 14, 2026
Carried in #6033 with your commit and authorship unchanged (rebased onto
main411e5e6).guest_playgopasses there and fails withmain'sExport.cpp; the title evidence in that PR is yours, since I do not have PPSA01748. Thanks for the clear write-up.AI-assisted: yes