diff --git a/blog/progress-report-q3-2026/img/envmap.png b/blog/progress-report-q3-2026/img/envmap.png new file mode 100644 index 000000000..fdf47c84e Binary files /dev/null and b/blog/progress-report-q3-2026/img/envmap.png differ diff --git a/blog/progress-report-q3-2026/img/hfrag.png b/blog/progress-report-q3-2026/img/hfrag.png new file mode 100644 index 000000000..c455f0d72 Binary files /dev/null and b/blog/progress-report-q3-2026/img/hfrag.png differ diff --git a/blog/progress-report-q3-2026/img/mirror.png b/blog/progress-report-q3-2026/img/mirror.png new file mode 100644 index 000000000..ba2388297 Binary files /dev/null and b/blog/progress-report-q3-2026/img/mirror.png differ diff --git a/blog/progress-report-q3-2026/img/onin.png b/blog/progress-report-q3-2026/img/onin.png new file mode 100644 index 000000000..71da1fa6a Binary files /dev/null and b/blog/progress-report-q3-2026/img/onin.png differ diff --git a/blog/progress-report-q3-2026/img/polish_glyphs.png b/blog/progress-report-q3-2026/img/polish_glyphs.png new file mode 100644 index 000000000..551902d97 Binary files /dev/null and b/blog/progress-report-q3-2026/img/polish_glyphs.png differ diff --git a/blog/progress-report-q3-2026/img/poster.png b/blog/progress-report-q3-2026/img/poster.png new file mode 100644 index 000000000..fdf47c84e Binary files /dev/null and b/blog/progress-report-q3-2026/img/poster.png differ diff --git a/blog/progress-report-q3-2026/img/tie.png b/blog/progress-report-q3-2026/img/tie.png new file mode 100644 index 000000000..7c30d3a79 Binary files /dev/null and b/blog/progress-report-q3-2026/img/tie.png differ diff --git a/blog/progress-report-q3-2026/index.mdx b/blog/progress-report-q3-2026/index.mdx new file mode 100644 index 000000000..4786b3dba --- /dev/null +++ b/blog/progress-report-q3-2026/index.mdx @@ -0,0 +1,220 @@ +--- +title: Progress Report - Q3 2026 +date: 2026-09-30T10:00 +description: Q3 2026's OpenGOAL progress report +slug: progress-report-q3-2026 +authors: + - barg +tags: [progress-report] +image: ./img/poster.png # todo real poster +hide_table_of_contents: false +draft: false +--- + + + + + +New extractor features, and several bugs fixed - most of them from OpenGOAL, but a couple from Naughty Dog. + + + +## Release Info + +This month's OpenGOAL Tooling (`jak-project` repo) release is `0.3.8`. + +
+
+ +
+
+ + + + + +## Launcher + +### Restore external links on mod pages + +Added back the icon to jump to a mod's website/README. + +### Add swap space metric to support package + +Some Linux users have reported `Decompiler process terminated by signal 9`, which can result from the decompiler using all the RAM and swap space. Allocating more swap space results in the decompiler finishing successfully. This change added information to the support package to help identify this issue. + +### Hide (vanilla) tooling update icon while on mod page + +The launcher header shows either the currently installed version of the vanilla tooling, or the version of a particuar mod if you're on the mod's page. There is also an icon that appears in the header when there's a vanilla tooling update, but it was still showing from mod pages, causing confusion. Now it only shows while the vanilla tooling version is shown. + +## General Changes + +### Translations + +All translations from [Crowdin](https://crowdin.com/project/opengoal) should now be updated and added to the games. This includes changes for Catalan, Galician, Polish, Portuguese, Finnish, Czech, German, Spanish, Croatian, Italian, Lithuanian, Dutch, Portuguese (Brazilian), Romanian! We also improved some behavior in how translated subtitles are handled in Jak 2 and 3. + +If you're interested in contributing translations, check out [these guides](https://opengoal.dev/docs/category/contributing). + +Special thanks to `rafalekkB` for fixing up the glyphs for Polish, as well as fixing some broken filepaths copy-pasted from Jak 2 to Jak 3! + +![](./img/polish_glyphs.png) + +### Add VSCode debug adapter support + +Added a debug server to goalc that sends JSON over the socket to communicate with an external debugger using the Debug Adapter Protocol. This lets us debug GOAL code in a proper debugger with breakpoints, step over, step in and step out per line, stack frames and supports watches for global symbols, registers and local variables (local variables only work within the most recent stack frame). + +Watches that track addresses holding a reference type generate a list of field names according to the object's type. All fields will show their name, type and value and, depending on the type, will try to infer extra info like symbol names/values, function names for function fields, enum values and more. + +### Support time-of-day colors in custom levels + +Added support for storing different colors for changing time-of-day in custom level meshes. + + + +### Various GLTF exporter fixes + +- Merc and TIE envmaps now properly extract +- Changed joint offset in convert_per_vertex_data since we now export the align bone +- The bone accessor for merc models now uses TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE, fixing a decompiler crash when attempting to reimport an extracted model into the game without first importing it into Blender and re-exporting +- All model buffers now get merged into one large buffer before export, saving some space and increasing parsing speed of GLB files +- Tfrags, TIEs and shrubs are now no longer stored in one giant mesh per tree and get grouped into categories: + - Tfrags will be grouped by the tfrag tree name they come from (normal, trans, dirt, ice, etc.) and get separated by the texture their material uses (tfrags are not instanced, so this is the next best solution) + - TIEs and shrubs get grouped by tree index and separated by their proto name (TIE wind will also be grouped separately) + +![](./img/envmap.png) + +![](./img/tie.png) + +### Sound Effect & Music Extraction + +Added the ability to extract sound effects to `.wav` files for each of the four games, and music to `.wav` files for Jak 1 and Jak 2. There's a corresponding new decompiler option in the launcher settings for extracting music. + +### Fixed custom level region crash on Windows + +On Windows, the pairs produced by custom regions (Jak 2 & 3) all become bogus, probably due to some compiler differences. Changing the pairs that get stored in the regions to not be pointers should avoid a potential use-after-free bug. + +### Fixed menu text boundaries and alignments across aspect ratios + +Fixed the alignment of text and other elements in several menus of Jak 3 (as well as some of Jak 2) when using Automatic or Custom aspect ratios. + +### Fixed cloud mipmap issue + +Fixed an oversight in `TextureAnimator::run_clouds` where it would read a texture that is attached to the bound framebuffer. + +### Fixed bug ignoring texture replacements for `merc` and `shrub` + +Fixed a regression from decompiler optimization, where some texture replacements wouldn't be processed properly. + +### Limit decompiler threads by hardware concurrency + +Fixed a regression from decompiler optimization, restoring the previous behavior prior and preventing the level extraction process from creating too many threads. + +### Retail reboot from imgui menu + +Added an option to the imgui menu `Reboot in Retail Mode`, similar to the existing `Reboot in Debug Mode`. + +### ARM64 improvements and Apple Silicon support + +Various fixes for ARM64 compilation, and support for building and running the game natively on Apple Silicon. + +### Misc CI/build fixes + +Various fixes to the build process. + +## Jak X + +### VU program disassembly + +All VU programs are unchanged from Jak 3 except: +- `sparks-vu1` NEW +- `ocean-near-vu1` DIFFERENT +- `sprite-glow-vu1` DIFFERENT +- `tnear-vu1` DIFFERENT +- `hfrag` REMOVED +- `ocean` REMOVED +- `ocean-texture` REMOVED + +### More decompilation (`collide`, `debug`, `drawable`, `net`, `vehicle`, etc) + +Breaks the 300 file milestone, also includes the majority of mips2c functions carried forward from Jak 3. + +## Jak 3 + +### Fixed `def-actor` macro + +Corrected the art group version number (8) used for the Jak 3 `def-actor` macro for custom actors. It was originally copied over from Jak 2 and still using that art group version number (7). + +### Fixed missing `hfrag` desert textures on macOS + +Removed unused vertex attribute that macOS's OpenGL driver seems to dislike. + +![](./img/hfrag.png) + +### Fixed mirror world HUD alignment + +Mirror world has a custom implementation in OpenGOAL, and some vanilla code that was meant to be disabled was duplicating the mirror work for certain HUD elements. + +![](./img/mirror.png) + +### Fixed Onin's tent minimap icon showing in the desert + + +Fixed an original game bug where the minimap icon for Onin's tent would show up in the desert in the northwest, rather than showing the blue air train icon in the northeast. This icon was missing some of the flags that other Haven City icons have that tell the game to show the air train icon instead of the real icon while outside of Haven City. + +![](./img/onin.png) + +### Improved `game-score` related decomp, extended speedrun autosplitter to track ranked side missions and orbs by level + +Jak 3 has leftover, unused `money-per-level` fields in `game-info` carried over from Jak 1 - so we repurposed these fields to actually track orbs collected by level. The speedrun autosplitter was extended to track orbs by level. + +We also extended the autosplitter to track bronze/silver/gold rankings for side missions. As part of this, we filled out the `game-score` enum and cleaned up the decompilation of related code. + +```diff +- (set! (-> self game-score) (the-as uint 2)) ++ (set! (-> self game-score) (game-score turtle-race)) +- (let ((v1-6 (game-info-method-29 *game-info* (the-as int (-> self game-score)))) ++ (let ((v1-6 (get-best-rank *game-info* (-> self game-score))) +``` + +### Extended secret selection and categories in speedrun menu + +Extended the speedrun menu to allow secret selection separately for Act 2, Act 3, Post-Game, and Hero Mode categories. Also added Hero Mode Act 2 and 3 categories. + +## Jak 2 + +### Fixed broken language changing + +Fixed a bug which would cause a language change from the progress menu to be ignored. + +## Jak 1 + +### Patched debug crash in subtitle code + +Fixed a crash in subtitle code that only runs in debug mode, and tries to log information about any currently playing cutscene. The code was checking the handle `(-> *art-control* spool-lock)` rather than the process `(handle->process (-> *art-control* spool-lock))` to decide whether or not to log. While the handle may not be `#f`, this might still not resolve to a valid process, in which case the game crashes trying to log the cutscene information. + +### Patched autosave/progress locked menu + +There's an original game bug where under the right conditions, you can get stuck on a blank pause menu screen permanently, and have no choice but to reboot the game. + +The first time you collect a cell after saving to a new file, the game will show a popup telling you about the autosave feature. If you collect such a cell during a pause buffer (the brief window after pressing Start and L2/R2 on same frame), the game gets stuck waiting on conditions that will never change. + +The pause menu is waiting on the autosave to finish, but the autosave is stuck waiting on the cell cutscene to play, and the cell cutscene is stuck waiting to play because the pause menu has come up. The game is actually still running, it just has no way to get unblocked and ignores any player input (its unblocked by running code in the REPL in the video below). + + + +This isn't a bug most players would run into, but it does affect speedrunners in certain situations. So we opted to fix this bug only while speedrun mode was enabled. In speedrun mode we were already skipping the autosave popup, but not until after the code that loops until there's no pending cutscene was satisfied. We changed the order of these checks, so that we wouldn't bother with the cutscene check if we were in speedrun mode. + +### Restored NaN check in nav code + +Added back a NaN check in some common nav code which was inadvertently removed during decompiler cleanup. This was causing enemies to suddenly disappear in certain situations. \ No newline at end of file diff --git a/blog/progress-report-q3-2026/video/time_of_day.mp4 b/blog/progress-report-q3-2026/video/time_of_day.mp4 new file mode 100644 index 000000000..63db84aa6 Binary files /dev/null and b/blog/progress-report-q3-2026/video/time_of_day.mp4 differ diff --git a/docusaurus.config.js b/docusaurus.config.js index 1db2ae920..e86407594 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -86,7 +86,7 @@ const config = { ({ announcementBar: { id: "announcementBar-26", // Increment on change - content: `Check out Q2's Progress Report Here!`, + content: `Check out Q3's Progress Report Here!`, }, algolia: { // The application ID provided by Algolia diff --git a/src/components/LatestBlogs/index.js b/src/components/LatestBlogs/index.js index f55f122bc..9ef264833 100644 --- a/src/components/LatestBlogs/index.js +++ b/src/components/LatestBlogs/index.js @@ -6,6 +6,15 @@ import Typography from "@mui/material/Typography"; import { CardActionArea } from "@mui/material"; const BlogList = [ + { + title: "Progress Report - Q3 2026", + image: require("@site/blog/progress-report-q3-2026/img/poster.png") + .default, + description: ( + <>New extractor features, and several bugs fixed - most of them from OpenGOAL, but a couple from Naughty Dog. + ), + link: "/blog/progress-report-q3-2026", + }, { title: "Progress Report - Q2 2026", image: require("@site/blog/progress-report-q2-2026/img/poster.png") @@ -23,15 +32,6 @@ const BlogList = [ <>The right man in the wrong place can make all the difference in the world. ), link: "/blog/progress-report-q1-2026", - }, - { - title: "Progress Report - Q4 2025", - image: require("@site/blog/progress-report-q4-2025/img/poster.webp") - .default, - description: ( - <>Happy Holidays! - ), - link: "/blog/progress-report-q4-2025", } ];