Hannah Montana's dialog panels land a pixel higher on one run than another,
which a text-only reference can't absorb.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mode 1 puts adhocctl in the WOL state, which is for consoles in sleep mode
(Dissidia's Card Exchange asks for both to be put to sleep) and only ends with
WOL_INTERRUPT. We have no sleep mode, so it now wakes at once with that event,
as the DISCOVER state does with WOL, and the library goes on to scan and host.
WOL_INTERRUPT also allows RequestSuspend, and no
longer forces the state back to WOL.
Dissidia's Card Exchange now trades Friend Cards between two instances instead
of searching forever.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Fixes#14557
A joiner and the host see each other in their peer lists about 1.23 s
after the Join, within a few ms of each other (pspautotests
net/adhoc/pair/timing and net/adhoc/pair/joinrace). The host saw a joiner
as soon as the server told it, half a second before the joiner even
counted as connected, so in Legend of the Dragon, whose Discover host
leaves 70 ms after it sees the other console, the joiner never saw it. A
peer that leaves goes from the list about 11 ms later (vanishtiming).
Only what the game reads (GetPeerList, GetPeerInfo) waits; sends don't.
A Disconnect while another is still on its way is BUSY, with no second
event (net/adhoc/pair/joinrace).
Legend of the Dragon itself only pairs two consoles whose MAC addresses'
CRC32s, as signed numbers, are less than 2^31 apart (3 pairs in 4);
otherwise both host. Headless instances 1 and 3 are such a pair, 1 and 2
aren't.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Discover takes turns at scanning for the game's group (joining the lowest
BSSID) and creating it, for random lengths of time, until a peer is in the
group or the timeout passes, through our adhocctl like the firmware module
does. A console in mode 0 sleeps in the DISCOVER state until another is
near; we have no way to tell, so it wakes at once, which a PSP alone
doesn't (net/adhoc/discover moves to the expected failures). The result
codes were swapped: 0 is found, 2 timed out (net/adhoc/pair/discover).
The firmware module can be run instead with DisableHLEFlags
sceNetAdhocDiscover, for comparing: that needs the kernel adhocctl
functions it imports and ifhandle's allocator. Its sceNetRand import (in
sceNet_lib) stays unimplemented, which only changes when it flips between
scanning and hosting. It prints the same as the HLE in net/adhoc/discover.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
sceKernelStartModule left the status word untouched for a module without
module_start, so the caller read whatever was on its stack. The PSP writes 0
there (modules/nostart).
R-Type Tactics loads the libfont.prx on its disc after its LoadExec and gives
up on its fonts when that status is negative (0xDEADBEEF from the stack fill),
then crashes writing through a pointer it never set. This only showed once
the disc's libfont became the default over our HLE sceFont.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Recurring terms (save state, savedata, cheats, relay, rendering,
upscaling, Memory Stick, default, analog stick and so on) were
translated several ways within one file. Each file now uses the form it
already used most, or the standard term where a minority form was the
correct one. Save states and the game's own savedata are kept apart,
most visibly in zh_TW, which used one word for both. zh_TW also gets
Taiwan terms where it had mainland ones, and the same English string in
two sections now reads the same.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The previous two commits reset some values to English that were usable:
ku_SO's sensible Kurmanji strings (wrong dialect and script for the
file, but readable), Indonesian text in jv_ID, and values where only a
word or a stale suffix was off. Those are back, with the broken part
fixed where there was one. Values that were gibberish or said something
else stay in English.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Values that said something other than the English: opposite meanings
(Move Up/Down swapped, Disabled as "Enable", a lossless codec as lossy,
"(slower)" as "low latency"), the wrong sense of a word ("Recent" as
current, backend as background, Resume as summarize, Cancel as Ignore),
messages naming the wrong setting or fallback backend, swapped and
duplicated strings, and text in the wrong language (Brazilian forms in
pt_PT, Latvian in lt-LT, Hungarian in hr_HR, Tajik in tg_PH). Also a
batch of spelling mistakes.
Gibberish values that couldn't be translated with confidence, most of
them in ku_SO, lo_LA, km_KH and jv_ID, are back to the English string.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- InsufficientOpenGLDriver: now a Yes/No question about switching to
DirectX, but many languages still had the old "update your drivers"
text, which asks nothing.
- BufferedRenderingRequired still pointed at the removed rendering mode
setting, and "Skip buffer effects" kept the old "(non-buffered,
faster)" suffix.
- "Save frame dump" was still "Dump next frame to log", and Software
rendering was still "(experimental)".
- "Completed %1" (softcore) had the same text as "Mastered %1"
(hardcore) in many languages.
- The generic restart prompt named one particular setting in three
languages.
Languages I can't translate confidently go back to the English string.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The PSP dialog buttons and messages, the credits and the confirm button
setting were still stored reversed, or with their words reordered, for
text drawing without bidi support. All text drawers handle bidi now, so
they showed backwards. The two-line "Please wait" messages also get back
their line break.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Outside [DesktopUI] an & is shown as is, so accelerators copied into
labels like "Pause when not focused" appeared on screen. Also fixes
mangled \n escapes, menu accelerators placed on a space or doubled,
lines without an = (never loaded) and a doubled "Warning:" prefix.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Fixes#22982
This remaster only ever ran in the PS3's emulator, and its unofficial
Simplified Chinese translation renders no Chinese text with the
firmware's sceFont and fonts, which we now use whenever a firmware is
installed. Its entry in the HD remaster table now says so: sceFont stays
HLE'd whatever the settings and compat flags say, and the HLE sceFont
loads our fonts rather than the NAND's (and doesn't install any from the
disc's updater).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
It came after the early return for an empty NAND, so it was hidden exactly
when it matters most, before any firmware is installed. It now sits under
the description, which is there in every state.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
UmdMount deleted the old loader as soon as the new file was resolved, but
the old disc's file systems stayed mounted until MountGameISO replaced
them. A swap that then failed (an unsupported file, or an ISO
ConstructBlockDevice rejects) left the game reading its old disc through
a deleted loader, and even a successful swap could free it under a read
still going on the IO thread. Now the new disc is mounted first, which
takes pspFileSystem's lock that reads hold, and a failed swap deletes the
new loader and leaves the old disc alone.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
UmdMount gave g_loadedFile the new loader before ResolveFileLoaderTarget,
which deletes it and returns another for a PBP directory or a PS1 disc
image, and wraps it in a ZipFileLoader that owns it for a zip. After that,
the next swap deleted the dangling loader again (a Play crash report shows
it in UpdateLoadedFile), and for a zip the wrapper that was mounted had no
owner. Reproduced in headless with game.umd.insert: inserting a directory
with an EBOOT.PBP, then a disc image.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Archiving stripped their debug info before the app linked them, so the
dSYM only covered the app target's own files.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The iOS and tvOS apps no longer link MoltenVK, and the ios/MoltenVK
submodule is gone. With that, the statically linked Vulkan path
(PPSSPP_VK_STATIC) has no users and is removed. VulkanMayBeAvailable()
returns false in the iOS app, so a config that says Vulkan falls back to
Metal, which is now the tvOS default too. macOS keeps Vulkan.
The graphics settings hide the backend selector when there's only one
backend to pick, using a new SettingItem::Visible() (hidden items are
also left out of search results).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
At boot it checks for savedata space with SIZES and said there was none:
the default 16GB stick, with no save yet, comes to 2^34 bytes, which is
0 in 32 bits. Saving worked fine when told to go ahead anyway.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The loader thread writes memory, kernel objects and the symbol map
without g_frameMutex, and fires SYMBOL_MAP_UPDATED for every module it
loads. Each one made the GUI thread refill the symbol lists while the
loader went on adding symbols, so booting the XMB (which loads a long
chain of modules there) with the disassembly window open crashed in
SymbolMap::FillSymbolListBox.
Readers holding g_frameMutex now also check the new PSP_IsBooting() and
skip while it's true. BOOT_DONE refills the lists once the boot is done.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Both its lists offered everything bootable, the XMB, homebrew and PS1
games included, though only what UmdMount takes can go in the drive.
The new UMDS_ONLY browse flag keeps PSP disc images and disc folders.
ISOs and CSOs are trusted by extension so big folders stay quick to
list; CHDs and PBPs are identified, since they can be PS1 games.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
So it gets a usable portrait layout: a title bar with a back button, the
game list, and the Load button below it. Landscape keeps its old shape,
with Back replacing the Cancel button.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- A drag that only shows up in the UP event (a quick flick with few or no
MOVE events in between) now cancels the press instead of clicking.
- A press that stops a moving list only stops it, as in Android's lists.
- Android's ACTION_CANCEL is passed on as UP | CANCEL rather than a plain UP,
so a gesture the system takes over doesn't click wherever the finger was.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>