27802 Commits

Author SHA1 Message Date
Zephyron
69f3225fa8 fix: correct Little Nightmares 3 TitleID check for PC to LR recovery
The TitleID check was broken due to using || operator which evaluated
to 1 instead of a title ID value, preventing the recovery mechanism
from working.

- Fix title_ids.h: Replace incorrect || expression with proper
  LittleNightmares3Base constant (0x010066101A55A000)
- Update physical_core.cpp: Use GetBaseTitleID() to match both
  base and update title ID variants

This now correctly identifies Little Nightmares 3 and enables the
recovery mechanism that sets PC to LR when detecting null pointer
execution loops.

Signed-off-by: Zephyron <zephyron@citron-emu.org>
2025-11-11 20:05:07 +10:00
Zephyron
57e6141d4a Fix QJsonValue conversion ambiguity in game_list_worker.cpp
Explicitly cast modification_time to qint64 to resolve Linux build
error where std::int64_t conversion to QJsonValue is ambiguous.

Signed-off-by: Zephyron <zephyron@citron-emu.org>
2025-11-11 19:11:15 +10:00
Zephyron
e91b22511f Merge pull request 'Add Firmware 20.0.0-21.0.0 IPC support and stubs' (#37) from feature/firmware-20-21-support into main
Reviewed-on: https://git.citron-emu.org/Citron/Emulator/pulls/37
2025-11-11 08:53:20 +00:00
Zephyron
d59eb9a1a8 Add Firmware 20.0.0-21.0.0 IPC support and stubs
This commit implements comprehensive firmware 20.0.0 through 21.0.0
support for Citron, including:

- Updated firmware version constants to 21.0.0 in api_version.h
- Updated HID service firmware version string to 21.0.0
- Added IPC command stubs for firmware 20.0.0+ in:
  * ISystemSettingsServer (commands 263, 264, 282, 283, 289, 300, 301, 306, 307)
  * IFirmwareDebugSettingsServer (command 24)
  * IApplicationFunctions (command 330)
  * IOlscServiceForSystemService (command 914)
  * IRemoteStorageController (commands 28, 901)
  * IService (migration) (commands 2250, 2260)
  * IAudioController (command 10200)

- Created new service interfaces with proper stubs:
  * IContinuousRecorder (grcsrv) - command 5 [20.2.0+] with 0x20-byte input
  * IDownloadContext (news) - command 4 [20.0.0+]
  * INotifyService (pdm:ntfy) - commands 100, 101 [20.0.0+] returning outinterfaces

- Added all new source files to CMakeLists.txt build system
- Fixed logging tag usage (Service_Migration instead of Service_MIG)
- Added required CMIF serialization headers for proper template instantiation

All stubs return success explicitly, eliminating the need for auto-stubbing.
All implementations follow Switchbrew documentation as closely as possible.

Based on Switchbrew documentation:
- https://switchbrew.org/wiki/21.0.0
- https://switchbrew.org/wiki/20.5.0
- https://switchbrew.org/wiki/20.4.0
- https://switchbrew.org/wiki/20.3.0
- https://switchbrew.org/wiki/20.2.0
- https://switchbrew.org/wiki/20.1.5
- https://switchbrew.org/wiki/20.1.1
- https://switchbrew.org/wiki/20.1.0
- https://switchbrew.org/wiki/20.0.1
- https://switchbrew.org/wiki/20.0.0

Signed-off-by: Zephyron <zephyron@citron-emu.org>
2025-11-11 18:52:10 +10:00
Zephyron
1127d30fd8 Fix: Restrict PC return recovery to Little Nightmares 3 with adjusted threshold
Only applies to Little Nightmares 3 (title ID: 010066101A55A800).

Signed-off-by: Zephyron <zephyron@citron-emu.org>
2025-11-10 20:55:54 +10:00
Zephyron
85a41cba46 Fix: Make PC return recovery title-specific for Little Nightmares 3
The PC < 0x1000 recovery mechanism introduced in commit fbb4f5c0
was causing issues for other games. This change restricts the recovery
to only apply when the title ID matches Little Nightmares 3.

- Add LittleNightmares3 title ID constant to title_ids.h
- Check program ID before applying PC return recovery in physical_core.cpp
- Recovery now only triggers for Little Nightmares 3 (010066101A55A800)
  to avoid affecting other games

Fixes issues caused by the general PC return recovery in other titles.

Signed-off-by: Zephyron <zephyron@citron-emu.org>
2025-11-10 20:00:55 +10:00
Zephyron
d78c598927 ui: Add modern toolbar to game list with view controls and sorting
Add a toolbar to the game list with:
- List/Grid view toggle buttons with icons and rounded corners
- Icon size slider for adjusting game icon sizes in real-time
- A-Z sort button that toggles between ascending/descending order
- Rounded corners styling throughout for a modern appearance

Key improvements:
- Fix games vanishing when adjusting slider during filtered search by
  updating icons in-place instead of recreating the model
- Preserve scroll position and selection when updating icon sizes
- Reuse filtered model instead of deleting/recreating to prevent view flicker
- Ensure consistent rounded icon rendering at exact target sizes
- Sync sort button state with Name column header sort order
- Preserve active filters when repopulating the game list

The toolbar uses themed icons with Qt standard icon fallbacks for
cross-platform compatibility.

Signed-off-by: Zephyron <zephyron@citron-emu.org>
2025-11-10 19:54:57 +10:00
Zephyron
9a64d5d072 perf: Add game metadata caching to speed up library loading
Implement a comprehensive caching system for game title metadata to
significantly improve game list loading performance for large libraries.

- Add CachedGameMetadata structure to store program ID, file type,
  size, title, icon, and modification time
- Implement LoadGameMetadataCache() and SaveGameMetadataCache() to
  persist cache to disk as JSON
- Integrate cache into ScanFileSystem() to skip expensive ReadIcon()
  and ReadTitle() operations when cached data is available
- Add automatic cache invalidation based on file modification time
- Cache respects existing UISettings::values.cache_game_list setting

The cache is stored in the game_list directory and automatically
invalidates entries when files are modified, ensuring data accuracy
while providing substantial performance improvements for subsequent
library scans.

Signed-off-by: Zephyron <zephyron@citron-emu.org>
2025-11-10 18:14:33 +10:00
Zephyron
0b0720671c Merge pull request 'fix: Multiplayer network fixes and airplane mode' (#35) from fix/multiplayer-network-improvements into main
Reviewed-on: https://git.citron-emu.org/Citron/Emulator/pulls/35
2025-11-10 07:19:29 +00:00
Zephyron
be5c2f772c fix: Multiplayer network fixes and airplane mode
- Auto-select network interface for direct connect/host room
- Always recreate ENet client on join for fresh bindings
- Add airplane mode toggle (Desktop & Android)
- Fix JWT verification with empty verify_uid
- Improve content-type handling for JWT endpoints

Signed-off-by: Zephyron <zephyron@citron-emu.org>
2025-11-10 17:16:45 +10:00
Zephyron
2943eebc9c Merge pull request 'feat(ui): add per-game cheat management tab with bulk toggle controls' (#30) from feature/cheat-toggle-ui into main
Reviewed-on: https://git.citron-emu.org/Citron/Emulator/pulls/30
2025-11-07 09:18:17 +00:00
Zephyron
09f8c3a643 feat(ui): add per-game cheat management tab with bulk toggle controls
Signed-off-by: Zephyron <zephyron@citron-emu.org>
2025-11-07 19:17:07 +10:00
Zephyron
5e1a136aa8 Merge pull request 'feat: implement multiplayer networking improvements for reduced latency' (#27) from feature/multiplayer-networking-improvements into main
Reviewed-on: https://git.citron-emu.org/Citron/Emulator/pulls/27
2025-11-05 08:52:46 +00:00
Zephyron
5117ff3702 feat: implement multiplayer networking improvements for reduced latency
Major networking enhancements to improve multiplayer performance and
reduce desync issues in games like Mario Kart 8 Deluxe:

Network Performance:
- Add socket connection pooling in BSD service to reduce overhead
- Implement unreliable packet delivery for latency-sensitive game data
- Add packet reliability control for both ProxyPacket and LDNPacket
- Use ENET_PACKET_FLAG_UNSEQUENCED for small UDP packets (<1200 bytes)

Monitoring & Debugging:
- Add PacketStatistics struct to track sent/received/dropped packets
- Enhanced logging for proxy packet handling and socket lifecycle
- Periodic stats logging every 100 packets for diagnostics

Configuration:
- Update lobby_api_url and web_api_url to https://api.ynet-fun.xyz
- Add lobby API URL configuration support

Socket Management:
- Implement SocketPoolKey for efficient socket reuse
- Store domain/type/protocol info in FileDescriptor
- Max pool size limit (8 sockets per type) to prevent memory bloat
- Return closed sockets to pool when room is still connected

Protocol Updates:
- Add 'reliable' field to ProxyPacket and LDNPacket structures
- Update room.cpp packet handlers to respect reliability flags
- Maintain backward compatibility with default reliable=true

These changes significantly reduce packet latency for real-time game
traffic while maintaining reliability for control packets.

Signed-off-by: Zephyron <zephyron@citron-emu.org>
2025-11-05 18:52:06 +10:00
Zephyron
ee124b44e3 Merge pull request 'feat: add Snapdragon 8 Elite support and implement shader features' (#25) from feature/snapdragon-8-elite-support-and-shader-improvements into main
Reviewed-on: https://git.citron-emu.org/Citron/Emulator/pulls/25
2025-11-04 10:43:32 +00:00
Zephyron
652a6a56ef feat: add Snapdragon 8 Elite support and implement shader features
- Add device detection for Snapdragon 8 Elite (device ID 0x43052c01)
- Disable shader float controls and 64-bit integer atomics on Qualcomm
  proprietary drivers to work around driver limitations
- Enable native BGR format support on S8 Elite (similar to S8 Gen 2)
- Implement VOTE_vtg instruction for vertex/tessellation/geometry shaders
  with proper single-thread semantics
- Replace stub warnings with detailed comments for FCSM_TR flow test and
  SR_WSCALEFACTOR special registers to document expected behavior

These changes improve compatibility with Qualcomm Snapdragon 8 Elite
devices and reduce spurious warnings by documenting shader features
that are correctly handled as conservative defaults.

Signed-off-by: Zephyron <zephyron@citron-emu.org>
2025-11-04 20:41:13 +10:00
Zephyron
4211689683 fix(set): stub ISettingsServer function 12 to fix AVGN 8-bit crash
Signed-off-by: Zephyron <zephyron@citron-emu.org>
2025-11-04 17:43:52 +10:00
Collecting
b8021fa7e7 fix: Make Multiplayer Room Work even out of Game
Annoyed a few people that the Overlay was non-functional unless they were in-game. Now it works when not in-game.

Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-04 00:42:18 +00:00
Collecting
28a512eed0 revert/vcpkg
Tried adding ARM64 required stuff to see if it'd help but alas.

Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-03 21:16:57 +00:00
Collecting
c271b4f734 Update vcpkg.json
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-03 20:55:12 +00:00
Collecting
91369fb82d fix/arm64
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-03 20:48:54 +00:00
Collecting
2416632c32 revert/variable-fix
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-03 20:48:23 +00:00
Collecting
3ebed49194 fix/arm64
Last time i'm touching

Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-03 20:23:26 +00:00
Collecting
4e9e0f9e65 fix/arm64
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-03 19:34:34 +00:00
Collecting
9571c14274 fix/arm64
Hopefully, otherwise I need to branch and figure this out.

Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-03 19:05:32 +00:00
Collecting
d52dd29233 fix/arm64
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-03 18:33:21 +00:00
Collecting
c85d9cfd57 fix/arm-64
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-03 18:25:00 +00:00
Collecting
a3a9d004a6 fix: ARM64 Support
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-03 17:08:01 +00:00
Collecting
38f8b04c04 add: ARM64 support for Windows
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-03 13:37:12 +00:00
Zephyron
a5024bb218 kernel: Use CheckMemoryStateContiguous in UnmapCodeMemory
Signed-off-by: Zephyron <zephyron@citron-emu.org>
2025-11-03 16:19:46 +10:00
Collecting
e097974a66 fix: Race Condition when Updating UI/OS Theme
Testing and fiddling with our recent overhaul for changing OS/UI themes and updating on the fly resulting in a segmentation fault that also would not allow you to re-open the emulator unless changing back to the theme previously known by Citron, which obviously we don't want. Grabbed the core dump.

The backtrace pointed to a race condition in GMainWindow::UpdateUITheme, where a QTextStream was reading from a Qt resource stylesheet (.qss) that was being simultaneously reloaded by the theme change event. This led to an attempt to read from a dangling pointer.

This change resolves the issue by reading the entire stylesheet into memory in a single, atomic operation using f.readAll(). This prevents the underlying resource from becoming invalid during the read. The resulting QByteArray is explicitly converted to a QString via QString::fromUtf8 to satisfy Qt 6's stricter type requirements.

Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-03 03:05:28 +00:00
Collecting
424e4060bb Merge pull request 'fix(updater): Add General Tab Re-enable Checkbox For Updates If Previously Disabled For Start-up' (#20) from fix/re-enable-updater into main
Reviewed-on: https://git.citron-emu.org/Citron/Emulator/pulls/20
2025-11-03 00:55:32 +00:00
Collecting
73094cdcdb fix/re-enable-updates
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-03 00:54:08 +00:00
Collecting
56ec56aa37 fix/re-enable-updates
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-03 00:53:37 +00:00
Collecting
846ae25af9 Merge pull request 'feat(updater): Add 'Don't check on startup' to update notification' (#19) from fix/auto-updater-check into main
Reviewed-on: https://git.citron-emu.org/Citron/Emulator/pulls/19
2025-11-03 00:17:37 +00:00
Collecting
d1d93b7629 fix/check-for-updates
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-03 00:15:42 +00:00
Collecting
6aa483a9d2 fix/check-for-updates
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-03 00:14:47 +00:00
Zephyron
8c2865fe0f Update README.md
Signed-off-by: Zephyron <zephyron@noreply.localhost>
2025-11-02 05:59:22 +00:00
Collecting
94287b27cd Merge pull request 'fix: Adjust & Update Theming for Specific Files from Previous Commit' (#17) from fix/add-updated-files-themes into main
Reviewed-on: https://git.citron-emu.org/Citron/Emulator/pulls/17
2025-11-02 05:19:24 +00:00
Collecting
729764ebe2 fix/themes
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-02 05:17:44 +00:00
Collecting
577385c98c fix/themes
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-02 05:17:11 +00:00
Collecting
6d9e18eb3a fix/adjusted-themes
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-02 05:15:49 +00:00
Collecting
34cdd95f45 Merge pull request 'feat(ui): Implement theme-aware overlays and fix UI color bugs' (#16) from fix/stylesheets-overlays-themes into main
Reviewed-on: https://git.citron-emu.org/Citron/Emulator/pulls/16
2025-11-02 04:48:14 +00:00
Collecting
4e8c43e894 fix/adaptive-styling
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-02 04:45:21 +00:00
Collecting
800f791e79 fix/themes
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-02 04:44:31 +00:00
Collecting
ec6468553b fix/adaptive-styling
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-02 04:40:16 +00:00
Collecting
1a07eb4ad1 fix/themes
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-02 04:39:05 +00:00
Collecting
3413912a94 fix/themes
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-02 04:37:27 +00:00
Collecting
c4fcf0dfc7 fix/dynamic-themes
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-02 04:36:42 +00:00
Collecting
fbaa366065 fix/dynamic-themes
Signed-off-by: Collecting <collecting@noreply.localhost>
2025-11-02 04:35:43 +00:00