9 Commits
Author SHA1 Message Date
rijads 95653a45f9 Controller only: no mice, USB keyboards or TV remote
Rijad plays with the DualSense alone, so the SDL patches now read nothing else: the fork's USB
keyboard and TV remote input is removed, the on-screen keyboard (IME dialog) is the only keyboard,
and the mouse patch keeps only the pointer the game moves, with its cursor drawn in software
(patches/sdl 0004 and 0005, rewritten; 0006 is the touchpad patch as before). libSceMouse's stub
list goes with it.

On the console, the radial menu test and a new one that clicks a text box (console-ime) ran as
before. The sound works: Rijad heard it.
2026-10-05 11:44:32 +02:00
rijads 2193f7723a Play with the controller alone: pointer, d-pad navigation, radial menus, building, hints
patches/openrct2 0010 to 0012 (see DEVELOPMENT.md, Changes to OpenRCT2 and Controls): the left
stick moves the pointer with a curve, acceleration and friction over buttons; the d-pad jumps
between buttons, through lists, sliders and dropdowns; Circle goes back; L1/R1 switch tabs;
Options and Triangle show the build tools and park windows in radial menus; while building track
or a bridge path the d-pad picks the piece, Cross builds and Square removes; the d-pad raises
scenery; the bottom toolbar lists what the buttons do.

Test plans for each, run on the console; the older plans no longer press Triangle to close
windows (it opens the park windows now), and the quick menu and pointer plans are gone.
2026-10-05 10:14:41 +02:00
rijads 1ce01d4481 Import the game files from a browser on first start
When /app0/rct2/Data/g1.dat is missing, the title shows a screen with an address and a QR code
and receives the RollerCoaster Tycoon 2 folder from a PC or phone: src/port/upload.c (the DOOM
port's server, keeping subfolders now) stores each file below the game's own folders (Data,
ObjData, Scenarios, Tracks, Landscapes; every part a plain name) and takes a ZIP file of the
folder, which the screen unpacks with libzip. The screen draws with SDL and fonts rendered from
DejaVu Sans at build time (tools/make-font.py), since OpenRCT2 cannot draw before the game files
are there; it starts the game once they are complete.

tools/send.py sends a folder or a ZIP file the way the page does. Console test plans can point
the game at another folder (game) and remove test folders (remove); test/console-import.cfg
imports into /app0/rct2-import. On the console the screen worked and received the Data folder
before the PS5 went to rest; the transfer ran at 2.2 MB/s, so the server now asks for a 1 MiB
receive buffer and writes whole 256 KiB chunks.
2026-10-05 00:14:45 +02:00
rijads 548202da0a Quick menu on Options; test/console-quickmenu.cfg opens it and picks the footpath tool 2026-10-04 21:34:21 +02:00
rijads 4dbf91b68a Draw a frame for every refresh of a 60 Hz TV
OpenRCT2 draws one frame per 40 Hz game tick unless uncap_fps is on, which judders on a 60 Hz
TV. With it on (interpolated frames, paced by the VideoOut flip) a park runs at 56 to 58 frames
per second while scrolling and zooming. The console test harness logs the frame rate every 300
frames; test/console-perf.cfg measures it in a park.
2026-10-04 21:20:52 +02:00
rijads 6d333d03fb Saving works: a PS5 UI context, and no imports from modules a game does not load
- OpenRCT2 patch: a PS5 platform UI context. The Linux one looked for zenity through popen, which
  crashed when saving a new game.
- The stubs leave out libkernel_sys and libkernel_web as well: functions bound to them are null
  in a game process. What the game used from them (openat, unlinkat, readlink, pathconf, fork)
  is implemented in the runtime instead, so linking now fails on any such import.
- SDL and OpenRCT2 patches: USB keyboards type text; the IME dialog starts with the text being
  edited and replaces it.
- tools/symbolize.sh names crash report frames from the linked ELF ps5-link keeps.
- test/console-save.cfg starts a scenario and saves it.
2026-10-04 21:13:54 +02:00
rijads 1cb0d65e56 Controller, mouse and keyboard on the console
- SDL: the driver loads the keyboard, IME and mouse modules itself (main no longer does), reads
  USB and Bluetooth mice through libSceMouse, draws the cursor in software, reports the DualSense
  touchpad, and decodes IME results from UTF-16. Stubs for libSceMouse and libSceCommonDialog
  are generated from src/runtime/stubs.
- OpenRCT2: a gamepad pointer (left stick and touchpad move it, Cross and Square click, Circle
  speeds it up), the right stick scrolls, default controller shortcuts on the PS5, and the
  16-bit wchar_t conversion fixed (ICU and OpenRCT2 are now built with U_SIZEOF_WCHAR_T=2, which
  fixes the garbled scenario names).
- Console tests: plan lines input (scripted pad input through PS5_PadCallback) and point (put
  the pointer somewhere); plans for the pointer, starting a new game and the in-game controls.
2026-10-04 20:45:56 +02:00
rijads 1de921685f First boot on the console: the title screen at 1080p
- Runtime: stdio output goes to the log file and the kernel log (the console's printf writes
  nowhere visible); exit ends the title through sceSystemServiceLoadExec (the exit system call
  gets it killed with SIGSYS); realpath on stat (the libc's fails with EPERM, which broke libc++'s
  relative and with it OpenRCT2's case-insensitive file lookups); threads get 2 MiB of stack (the
  console's default is 64 KiB); folder listing keeps nullfs entries, whose inode is 0.
- The game relinks when the runtime changes.
- main loads the keyboard and IME dialog modules (their imports are null otherwise), selects
  SDL's software renderer, and writes a first-run config with the interface at 2x.
- The documentation (changelog) is packaged into the data folder.
- Console tests: plan lines list, stat, realpath and arg; the harness logs the renderer and how
  much of each captured frame is lit. tools/klog.py records the kernel log; tools/deploy.py
  --eboot uploads only the executable.
2026-10-04 20:00:06 +02:00
rijads 214dd87f57 Package the title with logging, a console test loop and TV defaults 2026-10-04 18:52:47 +02:00