diff --git a/CHANGELOG.md b/CHANGELOG.md index 950e22e..68cfb13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,272 +1,219 @@ # Changelog -All notable changes to Nightcap. The format follows -[Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Release notes on -GitHub are taken from the matching section here. +All notable changes to Nightcap. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). +Release notes on GitHub are taken from the matching section here. ## [Unreleased] ### Changed -- The Flatpak build asks for the X11 socket only when there is no Wayland - session, as before 0.3.3. +- The Flatpak build asks for the X11 socket only when there is no Wayland session, as before 0.3.3. ### Fixed -- Fixed a random crash on Wayland with NVIDIA drivers, where the game window - closed after you let go of the camera or left mouse lock. The log showed - `wp_linux_drm_syncobj_surface_v1` error 3. -- Fixed some menu actions being ignored. The Chat button on a profile now - opens the Party tab with that player, and clicking a search suggestion now - runs the search instead of closing the search menu. -- Fixed possible crashes when the game calls an Android function Nightcap did - not provide, or releases the same reference twice. -- Fixed a possible hang on close when a web view process stayed open. Nightcap - now stops waiting for the log writer after 2 seconds. -- Fixed a possible missing picture on graphics drivers that reject the - low-latency present mode. Nightcap now retries with the game's own mode. -- Fixed a possible Wayland crash when the window first appears on the OpenGL - graphics path. -- Fixed a missing picture on machines where the graphics card runs a different - driver than the one Nightcap picked, such as an NVIDIA card on nouveau or a - laptop with an Intel chip and an older second card. Nightcap now picks the - Vulkan driver that matches the running kernel driver, and says so when no - card can run Vulkan. +- Fixed a random crash on Wayland with NVIDIA drivers, where the game window closed after you let go of the + camera or left mouse lock. The log showed `wp_linux_drm_syncobj_surface_v1` error 3. +- Fixed some menu actions being ignored. The Chat button on a profile now opens the Party tab with that + player, and clicking a search suggestion now runs the search instead of closing the search menu. +- Fixed possible crashes when the game calls an Android function Nightcap did not provide, or releases the + same reference twice. +- Fixed a possible hang on close when a web view process stayed open. Nightcap now stops waiting for the log + writer after 2 seconds. +- Fixed a possible missing picture on graphics drivers that reject the low-latency present mode. Nightcap now + retries with the game's own mode. +- Fixed a possible Wayland crash when the window first appears on the OpenGL graphics path. +- Fixed a missing picture on machines where the graphics card runs a different driver than the one Nightcap + picked, such as an NVIDIA card on nouveau or a laptop with an Intel chip and an older second card. Nightcap + now picks the Vulkan driver that matches the running kernel driver, and says so when no card can run Vulkan. ## [0.3.3] - 2026-10-04 ### Added -- Joining a friend from a Roblox "follow user" link now works. Nightcap looks - up which game they are in and joins it. +- Joining a friend from a Roblox "follow user" link now works. Nightcap looks up which game they are in and + joins it. - Nix users get a desktop entry for the app. ### Changed -- Roblox textures now decode about 3 times faster, which shortens the stalls - when a place loads and when new parts of the map stream in. Thanks to - @glook9001. +- Roblox textures now decode about 3 times faster, which shortens the stalls when a place loads and when new + parts of the map stream in. Thanks to @glook9001. ### Fixed -- `make update-roblox` no longer deletes your previous Roblox install when an - import fails partway through. If a step fails, the old files are put back, - or kept in a folder whose path is printed. Thanks to @kimlherme. -- A failed Roblox update now restores your previous version's records instead - of leaving them half switched. A damaged version file is rejected instead of - being half read, and a temporary failure to start the startup check no longer - marks a working Roblox build as broken for good. Thanks to @kimlherme. -- Fixed a possible crash when Roblox clears its audio queue while sound is - still playing, and a memory leak in lists of objects passed to Roblox's Java - code. Thanks to @kimlherme. -- Fixed a possible crash when the text overlay shuts down, a freeze when Roblox - releases the mouse lock while another release is already in progress, and - network lookups that misread Roblox's options. Thanks to @kimlherme. -- Fixed the sky sometimes rendering with the wrong textures in the Vulkan - renderer. -- Clicking while a Roblox text box has focus no longer closes it. Only Roblox - decides when a click ends typing. -- Going to another page in the web view, such as Friends from a profile, no - longer closes the web view. It crashed on every page change on Wayland - systems whose GL setup GTK could not use. -- Fixed a crash when Roblox's saved dark or light theme setting was missing or - damaged. +- `make update-roblox` no longer deletes your previous Roblox install when an import fails partway through. If + a step fails, the old files are put back, or kept in a folder whose path is printed. Thanks to @kimlherme. +- A failed Roblox update now restores your previous version's records instead of leaving them half switched. A + damaged version file is rejected instead of being half read, and a temporary failure to start the startup + check no longer marks a working Roblox build as broken for good. Thanks to @kimlherme. +- Fixed a possible crash when Roblox clears its audio queue while sound is still playing, and a memory leak in + lists of objects passed to Roblox's Java code. Thanks to @kimlherme. +- Fixed a possible crash when the text overlay shuts down, a freeze when Roblox releases the mouse lock while + another release is already in progress, and network lookups that misread Roblox's options. Thanks to + @kimlherme. +- Fixed the sky sometimes rendering with the wrong textures in the Vulkan renderer. +- Clicking while a Roblox text box has focus no longer closes it. Only Roblox decides when a click ends + typing. +- Going to another page in the web view, such as Friends from a profile, no longer closes the web view. It + crashed on every page change on Wayland systems whose GL setup GTK could not use. +- Fixed a crash when Roblox's saved dark or light theme setting was missing or damaged. ## [0.3.2] - 2026-09-29 ### Added -- Performance recordings made with `--profile` now show how busy the CPU was - during each frame, which makes it easier to tell what caused a stutter. -- Experimental support for ARM64 (`aarch64`) Linux, running Roblox's Android - `arm64-v8a` client. +- Performance recordings made with `--profile` now show how busy the CPU was during each frame, which makes it + easier to tell what caused a stutter. +- Experimental support for ARM64 (`aarch64`) Linux, running Roblox's Android `arm64-v8a` client. ### Fixed -- When Roblox asks for a Google Play device check during login, Nightcap now - answers right away that it isn't supported. Before, the "Verifying you're - not a bot" screen waited about a minute for an answer and then sent you - back to the login screen. -- Solving a login challenge now closes its window. Before, Roblox's - "challenge completed" signal was ignored and the window stayed open. - Thanks to @glook9001. -- Login no longer stalls after you pass a verification check. Before, Roblox - only saw the page's "challenge completed" signal after a one-minute - timeout, so it gave up and the login failed. On a Roblox build Nightcap - can't handle this way, the log says "WebViewProtocol getter not - recognized" and web pages behave as before. -- Login check windows and other web pages get 5 seconds to start instead of - 3, so a slow start no longer closes them. The log says how long each one - took to open. -- Less stutter while joining a game and while textures load in. In Blade - Ball, loading hitches dropped by about half, and the worst one went from - 0.8 seconds to 0.55 seconds. -- Clicking Play on a private server now joins right away. Before, nothing - happened until you clicked a sidebar tab like Home. +- When Roblox asks for a Google Play device check during login, Nightcap now answers right away that it isn't + supported. Before, the "Verifying you're not a bot" screen waited about a minute for an answer and then sent + you back to the login screen. +- Solving a login challenge now closes its window. Before, Roblox's "challenge completed" signal was ignored + and the window stayed open. Thanks to @glook9001. +- Login no longer stalls after you pass a verification check. Before, Roblox only saw the page's "challenge + completed" signal after a one-minute timeout, so it gave up and the login failed. On a Roblox build Nightcap + can't handle this way, the log says "WebViewProtocol getter not recognized" and web pages behave as before. +- Login check windows and other web pages get 5 seconds to start instead of 3, so a slow start no longer + closes them. The log says how long each one took to open. +- Less stutter while joining a game and while textures load in. In Blade Ball, loading hitches dropped by + about half, and the worst one went from 0.8 seconds to 0.55 seconds. +- Clicking Play on a private server now joins right away. Before, nothing happened until you clicked a sidebar + tab like Home. - Middle click now reaches Roblox as the middle mouse button. - Scrolling follows your system's natural scrolling setting. -- Fixed a crash on some x86_64 hosts when Roblox asked about a thread other - than the one making the call. -- Roblox updates no longer mix up the ARM64 and x86_64 compatibility profiles - for the same version. -- A partial or out-of-range user id in `MOCKTAIL_ROBLOX_USER_ID` or - `MOCKTAIL_LOCAL_STORAGE_CURRENT_USER_ID` is now ignored instead of being - partly read. +- Fixed a crash on some x86_64 hosts when Roblox asked about a thread other than the one making the call. +- Roblox updates no longer mix up the ARM64 and x86_64 compatibility profiles for the same version. +- A partial or out-of-range user id in `MOCKTAIL_ROBLOX_USER_ID` or `MOCKTAIL_LOCAL_STORAGE_CURRENT_USER_ID` + is now ignored instead of being partly read. ### Changed -- `make flatpak` and `scripts/build_flatpak.sh` now build with 2 jobs by - default instead of 4, so a local Flatpak build is less likely to run out - of memory. Set `FLATPAK_JOBS` or `MOCKTAIL_FLATPAK_JOBS` to use more. - Thanks to @glook9001. +- `make flatpak` and `scripts/build_flatpak.sh` now build with 2 jobs by default instead of 4, so a local + Flatpak build is less likely to run out of memory. Set `FLATPAK_JOBS` or `MOCKTAIL_FLATPAK_JOBS` to use + more. Thanks to @glook9001. ## [0.3.1] - 2026-09-20 ### Added -- Each release carries a DEB, an RPM, and a pacman package beside the - AppImage, with a `.sha256` for every file. They install `/usr/bin/mocktail` - and conflict with each other and with upstream's `mocktail` package. - Nightcap is in no distribution repository or the AUR; the recipes under - `packaging/aur/nightcap{,-bin,-git}` build from this repository locally. -- The AppStream metadata lists the Nightcap releases, so software centres - show the release history instead of upstream's. +- Each release carries a DEB, an RPM, and a pacman package beside the AppImage, with a `.sha256` for every + file. They install `/usr/bin/mocktail` and conflict with each other and with upstream's `mocktail` package. + Nightcap is in no distribution repository or the AUR; the recipes under `packaging/aur/nightcap{,-bin,-git}` + build from this repository locally. +- The AppStream metadata lists the Nightcap releases, so software centres show the release history instead of + upstream's. ### Fixed -- ETC2 texture decoding no longer blocks the thread that submits the frame. - Uploads decode on a background dispatcher and the submit carries a timeline - semaphore wait, so the GPU waits for the texture instead of the render - thread. Reading the application's compressed bytes moves to that dispatcher - too whenever they are already mapped. In Blade Ball the worst - `vkQueueSubmit` fell from 140ms to 1ms, its p99 from 4.9ms to 0.05ms, and - the total time spent in submits from 2534ms to 309ms. Frame interval is - unchanged: the remaining tail is the engine's own main-thread step. A device - without the `timelineSemaphore` feature decodes inline as before, as does a - submit whose `pNext` already sizes arrays by its semaphore counts. -- The mouse pointer jumped when a right-click camera drag ended, and drifted - to the viewport edge during one. The input router inferred pointer capture - from SDL reporting zero absolute coordinates, which holds on X11 but not on - Wayland, where the reported position accumulates the relative deltas and - leaves the window. Motion, button, and wheel events now carry the window's - relative mouse mode. The right-click camera fallback also only captures - inside an experience, so the cursor stays free over the app surface. -- Shutting the window down while an experience was starting or leaving could - free the pointer capture owner underneath the thread using it. Callers off - the SDL thread now hold a reference for the length of their call. -- The TextBox caret did not move when a trailing space was typed in a - single-line field. The final cluster rect SDL_ttf reports stops at the last - inked glyph, so the laid-out width is used there instead. Wrapped layouts - keep the clamp, because their width is the widest line rather than the last. -- Every TextBox keystroke re-ran `TTF_Init`, a fontconfig sort, six - `TTF_OpenFont` calls, and `TTF_Quit` on the render thread. The overlay holds - its opened fonts and reopens them only when the Roblox font or the point - size changes, keeping the current set when a reopen fails. Measured over 100 - rasters, 1.59ms to 0.12ms per keystroke. -- Staged ETC2 copies now carry an explicit host-write barrier. A queue - submission only makes host writes from before it visible to the device, and - an asynchronous decode writes after the submit, so without the barrier those - texels were not guaranteed to reach the copy that reads them. +- ETC2 texture decoding no longer blocks the thread that submits the frame. Uploads decode on a background + dispatcher and the submit carries a timeline semaphore wait, so the GPU waits for the texture instead of the + render thread. Reading the application's compressed bytes moves to that dispatcher too whenever they are + already mapped. In Blade Ball the worst `vkQueueSubmit` fell from 140ms to 1ms, its p99 from 4.9ms to + 0.05ms, and the total time spent in submits from 2534ms to 309ms. Frame interval is unchanged: the remaining + tail is the engine's own main-thread step. A device without the `timelineSemaphore` feature decodes inline + as before, as does a submit whose `pNext` already sizes arrays by its semaphore counts. +- The mouse pointer jumped when a right-click camera drag ended, and drifted to the viewport edge during one. + The input router inferred pointer capture from SDL reporting zero absolute coordinates, which holds on X11 + but not on Wayland, where the reported position accumulates the relative deltas and leaves the window. + Motion, button, and wheel events now carry the window's relative mouse mode. The right-click camera fallback + also only captures inside an experience, so the cursor stays free over the app surface. +- Shutting the window down while an experience was starting or leaving could free the pointer capture owner + underneath the thread using it. Callers off the SDL thread now hold a reference for the length of their + call. +- The TextBox caret did not move when a trailing space was typed in a single-line field. The final cluster + rect SDL_ttf reports stops at the last inked glyph, so the laid-out width is used there instead. Wrapped + layouts keep the clamp, because their width is the widest line rather than the last. +- Every TextBox keystroke re-ran `TTF_Init`, a fontconfig sort, six `TTF_OpenFont` calls, and `TTF_Quit` on + the render thread. The overlay holds its opened fonts and reopens them only when the Roblox font or the + point size changes, keeping the current set when a reopen fails. Measured over 100 rasters, 1.59ms to 0.12ms + per keystroke. +- Staged ETC2 copies now carry an explicit host-write barrier. A queue submission only makes host writes from + before it visible to the device, and an asynchronous decode writes after the submit, so without the barrier + those texels were not guaranteed to reach the copy that reads them. ### Changed -- `docs/PERFORMANCE.md` documents the GameMode settings to run with. A - `desiredgov=powersave` in `~/.config/gamemode.ini` overrides the packaged - `performance` default and clocks the CPU down for the whole session while - still reporting an active performance request. +- `docs/PERFORMANCE.md` documents the GameMode settings to run with. A `desiredgov=powersave` in + `~/.config/gamemode.ini` overrides the packaged `performance` default and clocks the CPU down for the whole + session while still reporting an active performance request. ## [0.3.0] - 2026-09-18 ### Added -- Custom Discord presence. `integrations.discord_rpc.text.title` replaces the - name in "Playing Nightcap", and `integrations.discord_rpc.images` sets the - large and small icons and their hover text. Text and image fields accept - `{place_name}`, `{place_icon}`, and `{creator_name}`. A field that expands - an empty placeholder is left out, and `text.state: ""` hides the state line. -- The default Discord card now matches Sober: the title is "Roblox", the - details line is "Playing ", the state is "by ", and - the Roblox badge sits inside the experience icon. The creator comes from the - same Roblox games request that already fetches the experience name. With - `show_place_name: false` the creator is hidden too, so the card shows only - the title and timer. -- `--profile ` writes a Chrome-format trace of the Vulkan adapter's - work: presents, GPU waits, submits, ETC2 texture decode, and pipeline and - shader creation. Open it in ui.perfetto.dev. `docs/BENCHMARKING.md` - describes the benchmark runs, and `scripts/summarize_profile_trace.py` - turns traces into a before and after table. +- Custom Discord presence. `integrations.discord_rpc.text.title` replaces the name in "Playing Nightcap", and + `integrations.discord_rpc.images` sets the large and small icons and their hover text. Text and image fields + accept `{place_name}`, `{place_icon}`, and `{creator_name}`. A field that expands an empty placeholder is + left out, and `text.state: ""` hides the state line. +- The default Discord card now matches Sober: the title is "Roblox", the details line is "Playing + ", the state is "by ", and the Roblox badge sits inside the experience icon. The + creator comes from the same Roblox games request that already fetches the experience name. With + `show_place_name: false` the creator is hidden too, so the card shows only the title and timer. +- `--profile ` writes a Chrome-format trace of the Vulkan adapter's work: presents, GPU waits, submits, + ETC2 texture decode, and pipeline and shader creation. Open it in ui.perfetto.dev. `docs/BENCHMARKING.md` + describes the benchmark runs, and `scripts/summarize_profile_trace.py` turns traces into a before and after + table. ### Fixed -- Texture uploads stalled the frame they were submitted on. ETC2 batches - decoded on worker threads but were then resampled one upload at a time on - the submitting thread, which at the default 4x upscale is sixteen times the - decoded texels. Resampling now runs on the same worker pool, in two passes so - mip level 0 still resolves before the mips built from it. In a 70k-part - place the worst `vkQueueSubmit` fell from 167ms to 92ms. -- Most ETC2 batches decoded on a single thread. Workers were created and - joined per batch, so the parallel floor had to cover that cost and sat at a - 1024x1024 image; batches under it ran on the caller, which was 54% of all - decode time in a 70k-part place. Decode workers are now a persistent pool, - and the floor drops to a 128x128 image. Mean decode time in that place fell - from 8.2ms to 4.7ms, and 11.8ms before both texture fixes. -- On CPUs with a wide core-speed spread, Feral GameMode pinned the process to - the few fastest cores, concentrating Roblox's worker pool onto them instead - of spreading it. With `performance.gamemode: auto`, a request that narrows - the CPU affinity is now released again, which releases the pin. Set - `pin_cores=no` in `~/.config/gamemode.ini` to keep GameMode without the - pinning, or `performance.gamemode: on` to accept it. See - `docs/PERFORMANCE.md`. -- With `show_place_name: false`, Discord no longer shows the experience - thumbnail or its name on hover. -- The host main thread no longer spins on the engine's message pump, which - cost about half a core and 146,000 empty calls a second. It now rests 100 µs - between polls: sleeping when the governor is `performance`, parking the - core with TPAUSE on CPUs that have it, spinning otherwise. With GameMode - setting the governor, process CPU in a 60k-part place fell from 216% to - 107% at the same 120 fps. `MOCKTAIL_ENGINE_PUMP_REST` forces a mode; see - `docs/PERFORMANCE.md`. -- ETC2 uploads with a `bufferRowLength` or `bufferImageHeight` larger than - the image read the padded rows as packed data and decoded garbage. -- ETC2 resampling created and joined worker threads on every batch. It now - runs on the persistent decode pool. -- A failed trace write left the profile writer thread waking every 250 ms - for the rest of the session. It now exits. -- The `--profile` trace gains a `pump` slice for the engine's main-thread - step. +- Texture uploads stalled the frame they were submitted on. ETC2 batches decoded on worker threads but were + then resampled one upload at a time on the submitting thread, which at the default 4x upscale is sixteen + times the decoded texels. Resampling now runs on the same worker pool, in two passes so mip level 0 still + resolves before the mips built from it. In a 70k-part place the worst `vkQueueSubmit` fell from 167ms to + 92ms. +- Most ETC2 batches decoded on a single thread. Workers were created and joined per batch, so the parallel + floor had to cover that cost and sat at a 1024x1024 image; batches under it ran on the caller, which was 54% + of all decode time in a 70k-part place. Decode workers are now a persistent pool, and the floor drops to a + 128x128 image. Mean decode time in that place fell from 8.2ms to 4.7ms, and 11.8ms before both texture + fixes. +- On CPUs with a wide core-speed spread, Feral GameMode pinned the process to the few fastest cores, + concentrating Roblox's worker pool onto them instead of spreading it. With `performance.gamemode: auto`, a + request that narrows the CPU affinity is now released again, which releases the pin. Set `pin_cores=no` in + `~/.config/gamemode.ini` to keep GameMode without the pinning, or `performance.gamemode: on` to accept it. + See `docs/PERFORMANCE.md`. +- With `show_place_name: false`, Discord no longer shows the experience thumbnail or its name on hover. +- The host main thread no longer spins on the engine's message pump, which cost about half a core and 146,000 + empty calls a second. It now rests 100 µs between polls: sleeping when the governor is `performance`, + parking the core with TPAUSE on CPUs that have it, spinning otherwise. With GameMode setting the governor, + process CPU in a 60k-part place fell from 216% to 107% at the same 120 fps. `MOCKTAIL_ENGINE_PUMP_REST` + forces a mode; see `docs/PERFORMANCE.md`. +- ETC2 uploads with a `bufferRowLength` or `bufferImageHeight` larger than the image read the padded rows as + packed data and decoded garbage. +- ETC2 resampling created and joined worker threads on every batch. It now runs on the persistent decode pool. +- A failed trace write left the profile writer thread waking every 250 ms for the rest of the session. It now + exits. +- The `--profile` trace gains a `pump` slice for the engine's main-thread step. ## [0.2.0] - 2026-09-16 ### Added - FAQ covering Discord RPC, log locations, and VR, adapted from upstream. -- `input.raw_mouse` in `config.yaml` sends mouse look deltas in the host's - own units. Turn it on when first-person aiming feels too slow or too fast - under fractional display scaling. Off by default. -- Nightly AppImage builds, published as the `continuous` prerelease. They are - untested; use a tagged release for normal play. +- `input.raw_mouse` in `config.yaml` sends mouse look deltas in the host's own units. Turn it on when + first-person aiming feels too slow or too fast under fractional display scaling. Off by default. +- Nightly AppImage builds, published as the `continuous` prerelease. They are untested; use a tagged release + for normal play. ### Changed -- Values in `fflags.json` now win over the performance preset instead of - stopping the launch. Startup prints each key it kept. -- Discord Rich Presence uses Nightcap's own Discord application, so it shows - as "Playing Nightcap". Terms and privacy pages for it live on the - project site. -- Discord Rich Presence is on by default. Set - `integrations.discord_rpc.enabled: false` to turn it off. -- The AppImage build verifies its reduced dependency packages against digests - taken at build time, rather than a digest list kept in the repository. +- Values in `fflags.json` now win over the performance preset instead of stopping the launch. Startup prints + each key it kept. +- Discord Rich Presence uses Nightcap's own Discord application, so it shows as "Playing Nightcap". Terms and + privacy pages for it live on the project site. +- Discord Rich Presence is on by default. Set `integrations.discord_rpc.enabled: false` to turn it off. +- The AppImage build verifies its reduced dependency packages against digests taken at build time, rather than + a digest list kept in the repository. ### Fixed -- Mouse look keeps responding after a long turn. The tracked pointer position - could drift past the edge of the view, which swallowed every reversal until - the mouse travelled all the way back. -- Nightcap no longer refuses to start with `cannot lock appStorage`. It - created its own credential directory using the process umask, then rejected - that directory for being group writable. Systems with a permissive umask, - such as `002`, failed on first run. +- Mouse look keeps responding after a long turn. The tracked pointer position could drift past the edge of the + view, which swallowed every reversal until the mouse travelled all the way back. +- Nightcap no longer refuses to start with `cannot lock appStorage`. It created its own credential directory + using the process umask, then rejected that directory for being group writable. Systems with a permissive + umask, such as `002`, failed on first run. ## [0.1.0] - 2026-09-15 @@ -274,35 +221,29 @@ First Nightcap release, forked from komaruworld/mocktail. ### Added -- ETC2 and EAC texture emulation on Vulkan, so games that use compressed - mobile textures render correctly on desktop GPUs. Decoding runs on worker - threads to avoid stutter. -- PNG texture overrides in `~/.config/mocktail/textures`, keyed by upload - hash, with a dump mode to find the texture you want to replace. -- Small textures are upscaled 4x by default. Set - `MOCKTAIL_SMALL_TEXTURE_UPSCALE=1` to turn it off. -- AppImage and signed Flatpak builds on every release tag. The Flatpak repo - is published at https://coderdayton.github.io/nightcap/. +- ETC2 and EAC texture emulation on Vulkan, so games that use compressed mobile textures render correctly on + desktop GPUs. Decoding runs on worker threads to avoid stutter. +- PNG texture overrides in `~/.config/mocktail/textures`, keyed by upload hash, with a dump mode to find the + texture you want to replace. +- Small textures are upscaled 4x by default. Set `MOCKTAIL_SMALL_TEXTURE_UPSCALE=1` to turn it off. +- AppImage and signed Flatpak builds on every release tag. The Flatpak repo is published at + https://coderdayton.github.io/nightcap/. - Roadmap in `docs/ROADMAP.md`. ### Changed -- Frames are presented as soon as they are ready instead of waiting in a - queue, which lowers input latency. -- Roblox now sees the real host RAM and display size instead of a low-end - phone profile. -- App ID is `io.github.CoderDayton.nightcap`, so Nightcap installs next to - upstream Mocktail. The binary and config paths keep the `mocktail` name. +- Frames are presented as soon as they are ready instead of waiting in a queue, which lowers input latency. +- Roblox now sees the real host RAM and display size instead of a low-end phone profile. +- App ID is `io.github.CoderDayton.nightcap`, so Nightcap installs next to upstream Mocktail. The binary and + config paths keep the `mocktail` name. - New name, icon, and colors. - The desktop entry launches on Wayland and points at the installed binary. ### Fixed - Servers no longer kick with error 319 shortly after joining. -- The FMOD output-device bridge is optional, so the updater no longer fails - without it. -- The AppImage build no longer fails on stale checksums for the slimmed - Arch packages. +- The FMOD output-device bridge is optional, so the updater no longer fails without it. +- The AppImage build no longer fails on stale checksums for the slimmed Arch packages. [Unreleased]: https://github.com/CoderDayton/nightcap/compare/v0.3.3...HEAD [0.3.3]: https://github.com/CoderDayton/nightcap/releases/tag/v0.3.3 diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index e35028f..7f98550 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -22,20 +22,6 @@ what you are playing and you can switch it all off in one click. Done when every option in `config/mocktail.example.yaml` that a player would touch can be set without a text editor. -## 2. Controller button glyphs - -Upstream added Xbox and PlayStation gamepad support through SDL. Controllers -already hot-plug and release their held inputs when unplugged. One rough edge -is left. - -- Correct button glyphs for the connected pad. `SDL_GetGamepadType` is only -read for Xbox and PlayStation pads, so a Switch Pro, a GameCube pad, or any -generic pad SDL reports as `SDL_GAMEPAD_TYPE_STANDARD` reaches Roblox as -type 0 and draws generic glyphs. `SDL_GetRealGamepadType`, and the vendor -and product IDs, are available and unused. - -Done when a plugged-in pad shows its own buttons. - ## Shipped - Lower input latency: frames are presented as soon as they are ready. diff --git a/lefthook.yml b/lefthook.yml index f6c259f..bd91824 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -13,6 +13,11 @@ pre-commit: desktop-entry: glob: "*.desktop" run: desktop-file-validate {staged_files} + changelog-width: + glob: "CHANGELOG.md" + run: >- + git diff --cached -U0 -- CHANGELOG.md | + awk '/^\+[^+]/ && length($0) > 111 { print "CHANGELOG.md: added line over 110 characters: " substr($0, 2); bad = 1 } END { exit bad }' pre-push: commands: