Repository navigation
Releases
MonZaMac v0.3.1
Discord status for online players, and a set of fixes.
Lumiose Online (online edition)
- Discord status (optional): Settings > Show on Discord (off until you turn it on) shows on your Discord profile that you are playing MonZaMac, through the Discord app on your Mac, with "Exploring Lumiose" and, after five minutes without input, "Relaxing in Lumiose". Nothing else is shared: no name, save or game data. Thanks to DarthMDev for the first version.
- When a new version of the mod is downloaded and the online version was prepared before, the start screen says Updating the online version (the quick one) instead of Preparing the online version, which stays for a first preparation.
- Online play does not load RomFS mods (
mods/<name>/romfs), so the game is the same for every player. Offline play loads them as before.
Graphics
- Frame generation follows your display's current refresh rate: with the screen set to a fixed 60 Hz, 60 -> 120 fps no longer stays on. On an adaptive (ProMotion) screen nothing changes.
Start screen
- Saves: on a save with no progress, Copy and Export now look disabled and Rename and Delete stay available; the toolbar showed the state of the previous button. Disabled buttons are dimmer everywhere.
Safety
- A damaged RomFS index, a broken mod patch file or a save name with a path in it can no longer read or write outside where it should; copying a save handles interrupted writes. The online setup trusts a downloaded mod from its cache only if its full checksum matches.
MonZaMac v0.3.0
A new look for the start screen and the settings, and the app now speaks 11 languages.
Languages
- The whole app is translated: English, Italian, French, Spanish, German, Portuguese (Brazil), Japanese, Chinese (Simplified and Traditional), Korean and Russian. It follows your Mac's language at first. Change it from the flag in the top bar or in Settings; the in-game menu shows the game's own language as a flag. The game still asks for its language itself, as on the Switch.
- The translations were written without native review. Corrections are welcome on GitHub.
Start screen and settings
- One top bar for the whole app; the logo takes you back to the start screen.
- A cleaner Play online card with the new Lumiose banner, and a modern save card and buttons.
- Settings, Saves and the first-start screen share one style. Dialog buttons grow to fit longer texts.
- A loading screen with a spinning Poké Ball while the game starts. Going back to the menu no longer closes and reopens the window; only switching between the offline and the online game still does.
Release 0.2.3
Ready for Lumiose Online 1.5.2. Recommended for everyone who plays online.
Lumiose Online (online edition)
- Lumiose Online 1.5.2 fixes the battle zone crash itself, so MonZaMac now leaves its own fix off for that version and later ones. With 0.2.2 the two fixes together could, rarely, freeze the game; older versions of the mod keep MonZaMac's fix.
- The developer benchmark option Uncapped FPS is never active online, so the game always runs at its normal speed next to other players.
- After updating, the next Play online prepares the online version again (a few minutes, with a progress bar).
Release 0.2.2
A fix for online play: the game no longer crashes when entering the battle zone with Lumiose Online.
Lumiose Online (online edition)
- Entering the battle zone no longer crashes the game. Two parts of the mod could write numbers at the same time and get in each other's way; now they take turns. Thanks to DarthMDev for finding the cause and testing the fix. New versions of the mod should keep the fix without a MonZaMac update.
- After updating, the next Play online prepares the online version again (a few minutes, with a progress bar).
Release 0.2.1
MonZaMac now also starts on macOS 27, the mouse works in online play, shadow edges are smooth in close-ups, and a set of smaller fixes. After updating, run Prepare all shaders again (the All shaders badge turns yellow): the shadows changed.
macOS 27
- The game starts on macOS 27, where it used to stop right at launch. Tried on macOS 27.2.1 in a virtual machine: offline and online, with existing saves. Thanks to DarthMDev for reporting it and finding the cause. macOS 15 and 26 work as before.
Mouse
- Online play: the cursor is visible in game, so you can click the buttons and lists of Lumiose Online. The left button works as the touch screen for the mod. When the left button also turns the camera, a click is a touch and a drag turns the camera.
- The cursor hides after 5 seconds without moving, and comes back as soon as you move it. Settings > Controls > Hide the idle cursor sets the time (never, 5, 10, 30 or 60 seconds); it shows only in the online edition. A two-finger swipe on the trackpad turns the camera and does not bring the cursor back.
- Offline play keeps the cursor hidden in game, as before.
Graphics
- Smoother shadow edges in close-ups and cutscenes: the edge of a shadow no longer shows steps.
Start screen
- The cursor is back when you return to the start screen from a game.
- Compile all shaders goes back to the start screen when it finishes, is stopped or fails, instead of carrying on into a new game. While it runs, the cursor stays visible, so Stop can be clicked.
Fixes
- Saves: an existing backup is kept when an export fails, an imported save is always checked, and the save cards update right after a change.
- Online preparation: a failed or stopped preparation is no longer reported as finished, folders with any character in their name work, and every download goes over a secure connection.
- Several smaller robustness fixes in file handling and in the developer tools.
Release 0.2.0
A new start screen, and Lumiose Online: optional online play with the multiplayer mod of the same name, in a separate online edition. The offline edition is the one you know, with the new start screen. After updating, the game code is rebuilt once on its own (a few minutes, with a progress bar), because the generator changed.
Start screen
- The bottom bar says whether the optional Mega Dimension DLC was found. The guided setup has an optional DLC file row (the Mega Dimension
.nsp), and an installed game can get it later with Add DLC... in the bottom bar, a screen that says which two files to choose (no rebuild);tools/extract_game.shtakes it as a third argument; the README no longer claims the DLC is required. - Landscape layout: a header across the top (logo, name, All shaders, Shader catalog, Legal notice, Settings and Quit), the Play offline column in the middle (the save card, Continue, New game, Saves) and a bar along the bottom with the state of the game files and the version. The shader chips moved from the bottom to the header and show their state with an icon.
- Saves now only chooses the save and goes back to the start screen; Continue and the card use the chosen save, or the most recent one.
- Settings outside the game fill the window under the header, with a Back button instead of the X and more room around the rows. The in-game menu is unchanged.
- When only the game code is out of date after an update, the rebuild starts by itself instead of waiting for Update game code.
Lumiose Online (online edition)
- Play online in a second column: the first press asks for your consent (your game data is shared with Lumiose Online, a separate service run by its own team, not by MonZaMac), prepares the online version on your Mac (a few minutes, with a progress bar) and starts the game with the mod. It is available only with the game files of version 2.0.2.
- Every later press first checks for a newer module from the Lumiose Online team (a download checked against the SHA-256 they publish) and prepares it before starting. The server is the team's,
lumioseonline.site; offline play never contacts it. - The mod's text starts at 120% so it is less grainy at 1080p; a size you set yourself is kept.
- Quit to start screen from an online session restarts the program, so Continue there plays offline, without the mod.
- The online edition keeps the game code build (about 1.3 GB more on disk) to prepare the mod quickly; Delete game files removes it.
- Microphone for the mod's voice chat: the game can use the Mac's microphone, and macOS asks for the permission the first time. The voice itself has not been heard by another player yet.
- Not verified yet: chat text entry and delivery, play against Windows or Linux players, and every optional feature of MonZaMac together with the mod.
- A new build of the Lumiose Online module is prepared without a MonZaMac update: the app reads what it needs from the module itself. A build that works differently and does not start is not activated. An update the mod installs by itself in the game is prepared on the next Play online, even if the site has not got it yet.
Audio settings
- Microphone section in Settings > Audio: the input device (the Mac's default or any microphone it finds), the microphone volume (0 to 200%) and a Microphone test with a live level bar, for the voice chat of Lumiose Online. If nothing is heard, the page says to check the permission in System Settings > Privacy & Security > Microphone.
- Room reverb and Movie audio are gone from the Audio page: the first never did anything in this game, and the second's help text still spoke of the first game this project was made from. The movies keep their sound.
Defaults
- New installs start with the two-finger trackpad swipe turning the camera (Controls > Mouse). An existing
larecomp.inikeeps its own choice. The other graphics defaults are unchanged: fullscreen, fixed 1080p, 60 fps, SMAA, MetalFX spatial upscaling, smooth distant animation, sharper textures, frame generation off.
Fixes
- The game code build takes about half the time and less disk:
zig ccwas turning-O1into-O2with full debug info. It now compiles at-O1. - Pressing Esc a few times with a controller connected could stop the app (an ImGui assertion in the menu). The menu now cancels a layer toggle it cannot finish.
- Export and import of a save now include the mod's folder (
sdcard: Lumiose Online's settings and data) next to the save itself, so a backup or a move to another Mac keeps them; copying a save already did. A zip from before, or from JKSV, still imports as just the save. - The key 0 no longer does anything: it wrote a dump of the next frame into
build/for every player. F9 does it only withLARECOMP_DEVTOOLS.
Release 0.1.7
0.1.7
MetalFX temporal upscaling, a Video page in sections with a clearer help panel, a fix for animations flickering between two poses with smooth distant animation, and a shader translator fix. After updating, run Prepare all shaders again.
Smoother
- MetalFX temporal (experimental, macOS 13 or later; Video > Upscaling and AA), a new Upscaler choice next to bilinear and MetalFX spatial, which also works together with frame generation (30 to 60 and 60 to 120). The game is drawn at a lower resolution and rebuilt from the frames before it; the generated frames use the same motion and depth. Measured at a 2880x1620 picture on an Apple M5 in the station walk, one run per configuration: without frame generation 82.7 fps at 1920x1080 input against 75.5 native; with 60 to 120 generation 97.4 shown fps against 84.5. Small artifacts remain at character edges and where something uncovered appears; moving foliage, particles, water and transparency, combat and older Macs have not been checked. While it is selected the other anti-aliasing and the generated-frame Performance quality are inactive, and your saved choices are kept. Defaults are unchanged.
Menu
- Video settings reorganized into six sections: Display, Rendering resolution, Frame rate and generation, Upscaling and AA, Game effects, and Shadows. Rows, shortcuts, defaults and saved choices are unchanged; the same page serves the launcher and the in-game menu.
- The help of Resolution mode (Video > Rendering resolution) now gives both sizes when they differ: "Rendering at 2880 x 1620, shown at 3600 x 2025", the resolution the game draws and the size of the picture in the window. With MetalFX temporal this is the size it reconstructs from and to. The F3 overlay shows it too: "render 2880 x 1620 -> 3600 x 2025".
- The help text of the Video settings has paragraph and line breaks: one line per choice for Upscaler, Frame rate, Frame generation quality and Resolution mode, and a paragraph per idea elsewhere. No wording of the settings changes.
Fixes
- Smooth distant animation no longer makes some animated characters and Pokémon flicker between two poses at certain camera positions (a head, for example). The option now relaxes the game's two per-frame animation channels together, through their four update policies, instead of forcing one flag at the update. Z-A v2.0.2 only,
LARECOMP_SMOOTH_ANIM=0still turns it off for a run. The second channel now runs every frame too; its CPU cost was not measured. - The shader translator honors the directed rounding modes (toward negative infinity, toward positive infinity, toward zero) of 32-bit integer to float (
I2F) and float to half (F2F) conversions, instead of always rounding to nearest. Conversions rounded to nearest, and every shader that does not use these modes, translate exactly as before. Whether the game's shaders use them, and what that changes on screen, was not measured. The translated code of shaders that use them changes, so Prepare all shaders has to be run again (the All shaders badge turns yellow; the precompile version is 5). Directed rounding of 64-bit integer conversions and of integer to half conversions is not covered yet.
Release 0.1.6
0.1.6
Optional frame generation up to 120 fps, shadows without the sharp-to-blurry step at the cascade boundary, smoother distant animation, simpler defaults, and shader work. After updating, run Prepare all shaders again (the All shaders badge turns yellow): the translated shaders changed.
Smoother
- Optional frame generation up to 120 fps (macOS 26, experimental): MetalFX adds an intermediate frame, so 30 real fps are shown at 60 and 60 real fps at 120. Pick it in Video > Frame generation; it is off by default and needs a GPU with MetalFX frame interpolation and a 60 or 120 Hz screen (the row is greyed out, with the reason, when it is unavailable). The game keeps its original speed and input timing, the HUD is composited separately, and missing inputs fall back to real frames. Skinned characters and Pokémon give their previous vertex positions as motion (in docked and handheld mode), the rest uses camera and depth, so small edge artifacts and particles can still show. A Frame generation quality option (Native or Performance) caps only the generated frames at 1920 pixels wide to save GPU time. It needs GPU headroom: at 1.5x on an M5 it reached about 80 to 100 displayed fps from 60. See
docs/frame-generation.md. - Smooth distant animation (Video > Rendering, on by default): characters and Pokémon away from the camera animate every frame instead of in visible steps. The game's per-frame animation update skips the full path for entities outside a small selected set (about 24 of 70 in the station), chosen by distance and view; a per-entity flag decides it, and the option sets that flag before the update, so the game's own logic is untouched. Applied as a runtime override of the update and its vtable stub, with no change to the game library; Z-A v2.0.2 only (the row is greyed out on the other versions).
LARECOMP_SMOOTH_ANIM=0turns it off for a run. At the station the CPU and GPU cost was not measurable.
Picture
- Consistent shadow filtering across cascades: keeps the filter's world-space width consistent in both materials and the deferred shadow mask, removing the abrupt sharp-to-blurry boundary seen at the station. Cascade distances stay unchanged; distant shadow detail still depends on map resolution. See
docs/shadow-cascades.md. - Shadow resolution applies at once: changing it in Video > Rendering makes the shadow maps again at the new size while the game runs, instead of from the next start (the maps are drawn again every frame, so nothing is lost; at 4x they take about 240 MB while it is on)
Menu and defaults
- New installs start with a fixed 1080p internal resolution instead of Dynamic up to 1080p. Dynamic is still one choice away in Video > Resolution mode, and an existing
larecomp.inikeeps its own choice. - The Aspect ratio option is gone for now: the picture is always the game's original 16:9, with bars on other windows. A saved "Unlocked" choice is ignored, so nobody is left on a framing the menu can no longer change. (The separate Wider view option is unchanged.)
- The save being played can be reloaded from the in-game Saves tab (Reload this save, with the same confirmation as playing another one): the game restarts from its last save there, to undo what happened since. Before, only the other saves could be played
- A menu row with ◀ ▶ arrows no longer shows the arrow that has nowhere to go (first or last choice, minimum or maximum).
Shaders and loading
- Prepare all shaders also builds the game's compute programs (57), with the texture setup the game really uses, so the first attack effects in a battle no longer stall: in a replay of the first battle the compute programs took 0.4 to 0.6 ms each to build instead of 350 to 380 ms, and no frame took more than 50 ms after loading.
- The shader translator honors
.FTZon the floating-point compares FSET, FSETP and FCMP: subnormal operands are flushed to zero before the comparison, as the hardware does. Compares without.FTZtranslate exactly as before. - Compute programs are shared by content: the same compute shader streamed to another address, or registered again, reuses the program already translated and built instead of making another one. Identity is the shader bytes, the code/constants split, the texture and image types, the workgroup size and the memory window, the same one Prepare all shaders uses, so prepared programs are found too. Nothing is hashed on the dispatch path.
- Scene draws wait up to 1 ms (6 ms a frame, less when the frame has no room left) for a shader program or pipeline that is being built, instead of being skipped for a frame. In a replay of the first battle with warm caches, skipped draws fell from 49 to 32 in every one of three pairs, every wait was answered in time (0.15 ms on average, 0.26 ms at most, 10 to 11 ms in total over the run) and the frame rate did not change. A shader built for the first time still takes longer than that and is skipped as before.
LARECOMP_SCENE_WAIT_MS=0turns it off. - Shader preparation workers are also bounded by the number of compilations Metal accepts at once (
maximumConcurrentCompilationTaskCount), not only by the CPU count. No change on a 10-core M5, where both are 10; it matters on machines where Metal allows fewer.
Performance
- The renderer reuses its retired 64 MB upload buffers instead of allocating a new one on every wrap (about 46 allocations in 1500 frames). Measured on a station walk replay, uncapped at 1x: 83.1, 87.1, 89.4 fps without it and 87.9, 89.4, 90.9 with it, alternating runs, so about 3% more, a small margin.
LARECOMP_NO_RING_POOL=1turns it off. - Sampled textures whose full contents are unchanged no longer recompute their sampled-change hash, which saves a little CPU per frame. Nothing visible changes: first uploads and changed textures still refresh both hashes.
Fixes
- The error applet (
ILibraryAppletCreator, applet0x0e) now answers like the real system: the game gets an applet object with its events, start, completion and an empty result, and the error is acknowledged without a dialog (only numeric fields are logged, never the message text). Other applets and unsupported commands now fail with an error instead of reporting success. Malformed or oversized IPC messages (handle counts, domain input ids, declared body length) are rejected. No native error dialog is shown.
Developer tools
- Developer log: a file of warnings for the developers (
logs/devlog.txt, orLARECOMP_DEVLOG_FILE), apart from the normal log, every line with its date and time and the file empty while all is well. It is the Developer log switch of the Developer tab (dev_loginlarecomp.ini), orLARECOMP_DEVLOG=<subjects>; nothing is written when it is off. First subject,compute: a compute program the game builds with a key that the precompilation does not cover. - Record a route (Developer tab, Tests): asks for a name, copies the save in use to
routes/<name>/saveand records every pad change intoroutes/<name>/route.txtuntil you stop. Routes are not in the save list.LARECOMP_ROUTE=<name>plays one back on a fresh copy of its starting save each time, so an autosave during the replay never touches it;LARECOMP_INPUT_REPLAY_AT=<frame>delays the start (the game needs about 600 frames to load a save and press Continue). For repeatable performance tests.
Release 0.1.5
0.1.5
Shaders
Fewer stalls the first time you see a scene. Nothing here uploads anything; everything is rebuilt on your Mac from your own
game files.
- Prepare all shaders: the All shaders badge at the top right of the start screen (green check when done and
current, yellow triangle when not done or out of date) explains the cost and offers Compile all shaders or Cancel.
Compiling starts the game, which reads every shader from your game files (about 40 s), translates them with their usual
settings and compiles their Metal libraries on all cores (about 4.5 minutes on a 10-core M5), behind a progress page with
a Stop button; what was compiled is kept. It leaves about 370 MB in Metal's shader cache and deletes its 115 MB of
temporary files. A stamp records the precompile version, macOS, the GPU and the game files, so the badge turns yellow when
any of them changes. Cold-cache station walk on an M5, nothing else: the worst frame while entering the station went from
about 16 s to 0.57 s. Seedocs/shader-precompile.md. - Compile shaders early (Shaders tab, on by default): when the game registers a shader that a catalog or your own
recipe journal knows, it is translated and compiled on background workers before its first draw, and the draw shares that
work if it comes first. Misses compile normally. Cold station walk with a catalog: the worst frame entering the station
fell from about 8 s to 1.4 s and the walk compiled nothing.docs/shader-early-experiment.md. - Prepare known shaders (Shaders tab, off by default, needs a catalog): before the game starts, rebuilds the shaders a
catalog lists (hashes and offsets, never code) from your game files and builds their pipelines, on workers sized to the CPU
count behind a progress page. With the precompile done it takes 1.3 s instead of 9 s. A small native decoder
(oozextract, MIT; notices packaged) reads the game's compressed archives.docs/shader-first-install.md. - Collect new shader recipes (Shaders tab, on by default, local): the pipelines the game builds that no catalog covers
are saved as hashes and numbers incache/shader-recipes/recipes.jsonl, written off the render thread, no limit on how
many (100 MiB of file). Export shader recipes writes a metadata-only JSON to share by hand; Contribute recipes on
GitHub opens the issue form. Seedocs/shader-recipe-contributions.md. - Update shader catalog (Shaders tab) checks the project's official releases for a
shader-catalog.jsonasset only when
you press it, verifies size, SHA-256 and schema, rebuilds the inputs from your files and installs it atomically (the
previous one stays if anything fails). The Shader catalog badge on the start screen shows whether yours is current and
stays hidden until a catalog is published. No catalog is published yet. - Compute programs join the rest: their pipelines go into the pipeline archive and their source into the warm-up cache,
and compute recipes (shader hash, texture-type masks, workgroup size) are collected, exported, put in catalogs and
prepared. No count limit in the catalog, the preparation or the journal.
Fixes
- Ansha's donuts show up:
std::chrono::system_clock::nowanswers from the Mac's clock. The SDK's own path read ~0,
and the game files a donut stamped 0 as an empty slot, so new donuts never appeared and each overwrote the last.
Found and fixed by Hexveil404 in
PokeZ-ARecomp. - The Royale profile photo is no longer black:
nvnTextureReadTexels[Strided]read the texture back, and a copy into a
pitch-linear texture also reaches guest memory (the game reads that memory and encodes the photo itself). After the fix in
PokeZ-ARecomp by Hexveil404. - Indirect draws with parameters no draw can have (a count over 4M, a base instance past an instance buffer) are skipped
instead of drawn (LARECOMP_IB_GUARD=0draws them). After the same fix in PokeZ-ARecomp by
Hexveil404. - Playing another save from the in-game menu, or going back to the start screen, no longer aborts the game: the reboot
freed a CPU state that belonged to a thread. - Pipeline archive (Metal): a new archive is built after each save, and the archive stays off after a save that crashed
inside Metal (issue #101). The first save of a session was always fine; the next one crashed on some Macs. - The shader preparation page lays itself out with the window, so the game is no longer left pinned to the left of a
fullscreen window afterwards.
Start screen and saves
- Import and export saves (SAVES page): Export makes a .zip of the selected save, named after the save, its play time
and the day (Main save - 12h34 - 2026-10-31.zip); Import takes a .zip or a folder (our export, a JKSV backup, a copy from
a console), shows whose save it is (trainer, play time, money, team) and adds it as a new save: one of our exports gets its
old name back, anything else " - - ". Nothing existing is replaced; Copy duplicates a save. - Saves tab in the in-game menu: the save being played (trainer, play time, coins, team), with Copy and Export; every
other save, each with a window to play it (after a yes, the game restarts with it), copy, export, rename or delete it;
Import, and a New game in a new save. A reboot into the game keeps the save it was playing. - Legal notice button at the top right: MonZaMac is independent and unofficial, you need your own copy of the game and
the right to use the files and keys you provide, and no game files or keys come with the app.
Settings and menu
- Resolution mode (Fixed / Dynamic) is its own choice, above Internal resolution. Dynamic goes up to 1080p,
up to 1620p or up to match display (up to 1080p is new,resolution = dynamic 1x). Sizes are named in lines:
1080p, 1620p, 2160p... (720p and up in handheld mode); Match display shows its lines too; every list is in order of lines. - 25% / 50% / 75% are shares of the game's own 1080p (270p / 540p / 810p; before, of the display's resolution).
Existinglarecomp.inivalues keep working. New installs start at Dynamic, up to 1080p. - Moving the cursor onto a menu tab with the keyboard or a pad opens it, like L / R and Q / E. The mouse still needs a click.
Rendering
- Fragment programs that only branch forward (no jump tables) run as structured code instead of the
switch (pc)loop:
63.2 -> 64.7 fps (+2.4%) uncapped in the starting scene at 1.5x. Programs that read the facing flag keep the loop. - Texture change checks hash in four parallel chains: about 1.1 ms less CPU per frame at 1.5x (65.2 fps uncapped).
- The uniform snapshot cache holds 4096 entries instead of 128: bytes copied fell 57%. Uncapped: 99.0 -> 100.4 fps at 1x,
65.0 -> 65.6 at 1.5x.
Developer tools
- Shader diagnostics (off unless
LARECOMP_SHADER_TRACE=<new directory>): metadata only, each registered shader's hash,
stage, where it was read from, and when it was registered and compiled. Shader dumps need a separate opt-in. See
docs/shader-diagnostics.md. - The shader preparation prototype (
LARECOMP_SHADER_PREP/LARECOMP_SHADER_INPUTS) and
tools/shader_catalog_from_journal.sh, which grows a local catalog from the journal after each session.
Release 0.1.4
0.1.4
Rendering
- Shadow resolution and shadow sharpness (Settings > Rendering): the sun's shadow maps can be drawn 2x, 3x or 4x
bigger (from the next start), and the filter 2x to 4x narrower (at once, up to the resolution): smooth, crisp shadow
edges. They replace "4K shadows", which is gone from the menu: agame_shadows_4k = 1inlarecomp.inibecomes 4x for
both. Off ("Game's") by default.
Start screen and saves
- Crashes are explained: when the app is opened by double click and the game stops on an error, an alert says in plain
words what happened and what to do (graphics driver, the game's own check, a bug in MonZaMac), and points to
logs/play.log(the previous run:play-anterior.log) to attach to a report. - The save card shows the trainer's data: name, trainer ID, play time, money and the team, read from the save
itself (read only), laid out in two columns. The SAVES list shows the same for every save. - Each save can open its team: a button on the right of the card (or Y / I) lists every Pokémon with its ball
(gold for a shiny), name and level. Names in another script use a macOS system font when the launcher starts; the
Pokédex number stands in for a character that font lacks.
Controls
- Mouse settings (Settings > Controls, a Mouse section): the camera turns with the mouse while a button is held (right,
left, middle or any), always, or not at all; a two-finger trackpad drag turns it too; each axis can be
inverted; the speed is adjustable (100% is the default, a higher base than before). In the game the cursor is hidden
and held in place, so the camera never stops at the window's edge; the menu gives it back. The right stick snap
(0 = off) sits with the d-pad.
Stability
- Game file paths stay inside the mounted folder: a path with
..is refused as not found instead of reaching
outside the save directory. - File service: short writes are completed, errors are returned to the game instead of being dropped, and file
descriptors are released when the game closes them. - Loading and generation checks: executable sizes are checked before they are read, truncated shader headers are
refused, SIMD batches in the generated code no longer overwrite a guest register with the flags, and the renderer's
program and pipeline indexes can no longer loop when full. - Build helpers stop on a failed step and rebuild when the compile flags change.
Developer
- CPU and GPU frame time log (
LARECOMP_PERF_LOG) and a scene benchmark (tools/perf_scene.py), with the measured
cost of the shadow options indocs/performance-shadows.md.