3078 Commits

Author SHA1 Message Date
rafalekkB efb21c3e8c [jak3] polish translation (#4431)
<img width="1913" height="1073" alt="image"
src="https://github.com/user-attachments/assets/584ec767-d612-4634-a677-6853fad76924"
/>

- translates base game text in jak3 to polish
- minor fixes for jak2 polish translation
- fixes an error in game_text.gp where every line referenced jak2 folder
instead of jak3
- increases text heap size to 128KB so the game doesn't crash when
loading the translated file
2026-09-30 14:52:29 -04:00
OpenGOAL Bot d6f33ab506 CI: Periodic Controller Database Update (#4432)
Updating Controller Database

Co-authored-by: OpenGOALBot <OpenGOALBot@users.noreply.github.com>
2026-09-29 11:01:59 -04:00
Matt Dallmeyer 76e8eeca35 [jak3] logior! instead of set! HERO_MODE_FEATURES (#4425)
For Act 2/3/Post-game, `set!`-ing the features ends up removing some
features given by task progression (e.g. `darkjak-smack`). Fix is to use
`logior!` instead so that we upsert the hero mode features and leave
task progression features alone.
2026-09-22 14:44:54 +02:00
Tyler Wilding 6445b4a50a ci: use gh instead of git in release-pipeline (#4423)
CI sure is fun
v0.3.8
2026-09-20 00:13:09 -04:00
Tyler Wilding 24c9aa9f93 ci: ensure explicit tag is pushed in release pipeline (#4422)
while `gh release create` will create the tag for you, it only gets
created after the release is published. Which means the final step that
uploads the artifacts fails (it tries to checkout the tag, and it fails,
since it doesn't exist yet)
2026-09-20 00:10:10 -04:00
tripp 9f0be81a23 extractor: dont default to x86 instructions on arm64 (#4420)
Co-authored-by: Tyler Wilding <xtvaser@gmail.com>
2026-09-19 23:10:25 -04:00
Tyler Wilding 9bd79e5d8a ci: allow explicitly providing the release tag (#4421)
Last release was bad, went to delete it and remake it. Found out that
immutable releases also means an implicit tag protection that you cannot
disable. This is a good thing, unfortunate that I forgot about it before
deleting the tag.

Anyway...this will resolve it (allows me to push 0.3.8 and it'll still
generate the release notes with the last tag (0.3.6), atleast that's the
theory
2026-09-19 22:26:24 -04:00
tripp 64b3bb9068 goalc: default to arm64 when built for ARM (#4419) 2026-09-19 21:53:50 -04:00
tripp 712cdfbaa2 decompiler: limit level extraction workers to hardware concurrency (#4417)
fixes an issue from my previous pull request #4278.
this change restores the previous behavior prior and prevents the level
extraction process from creating too many threads, ultimately resulting
in the decompiler failing.
2026-09-19 19:37:05 -04:00
Alex 31c3733673 jak2: fix language change not working through progress menu (#4418)
The game only actually changes audio language if the settings engine
notices it has changed, so `user-current` can't be changed here.
2026-09-18 15:29:08 +01:00
Jordan d04ac9d787 Time Of Day Colors for GLBs (#4111)
With help from @gratefulforest, I've implemented storing colours for
each time of day for meshes,
and updated the code to store 32 channel colours (8 times of day * 4
rgba channels).


https://github.com/user-attachments/assets/5d2fb82c-40b7-44ad-976f-acd5d4d57e1c

In addition, I've implemented a system @gratefulforest suggested which
makes adding different times of day
really easy for developers.
- If some times of day are missing, they use the closest time of day
that is defined, defaulting to the earlier of the two if there are two
equally closest defined times of day.
- If no times of day are defined, COLOR_0 is used, otherwise white is
used.

Log messages are concise and very informative:
```
[46:23:278] [info] Reading gltf mesh: /home/jakjm/git/jak-project/custom_assets/jak1/levels/test-zone/test-zone2.glb
[46:23:278] [warn] Plane missing some times of day, using sunrise:_EVENING, morning:_EVENING, noon:_TWILIGHT, afternoon:_TWILIGHT, sunset:_TWILIGHT, twilight:_TWILIGHT, evening:_EVENING, green sun:_EVENING
[46:23:278] [error] Cube.001 didn't have any colors, using white.
[46:23:278] [warn] Cube.002 had colors but no times of day, using COLOR_0.
[46:23:278] [warn] Cube.003 missing some times of day, using sunrise:_SUNRISE, morning:_SUNRISE, noon:_SUNRISE, afternoon:_SUNSET, sunset:_SUNSET, twilight:_SUNSET, evening:_SUNSET, green sun:_SUNRISE
[46:23:278] [warn] Cube.004 had colors but no times of day, using COLOR_0.
[46:23:278] [error] Cube.005 didn't have any colors, using white.
```

---------

Co-authored-by: Tyler Wilding <xtvaser@gmail.com>
2026-09-16 19:54:08 -04:00
Jordan 76e4bcb8bc [decompiler] Extracting Sound Effects and Music (#4401)
This PR adds the ability to extract sound effects to .wav files for each
of the four games, and music to .wav files for Jak1 and Jak2.

Basically what I have done is create a "fake player" which works the
same as the player from Player.cpp except we just take the raw audio
samples that would be sent to cubeb and then write them to wave files.

I shamelessly stole @Hat-Kid's code for flavas, for parsing the sound
effect names and for finding where the sound banks start for Jak 1 lol.
2026-09-16 19:29:11 -04:00
BreakPoints 613a8b22cd cmake: point to correct draco_features.h location (#4410)
Fixes the following error when running the "Install Jak" option in VS:
```
  CMake Error at third-party/draco/cmake_install.cmake:841 (file):
    file INSTALL cannot find
    "C:/Users/{WindowsUsername}/Documents/Coding/jak-project/out/build/Release/draco/draco_features.h":
    No error.
  Call Stack (most recent call first):
    cmake_install.cmake:48 (include)
  
  
  FAILED: [code=1] CMakeFiles/install.util 
  C:\WINDOWS\system32\cmd.exe /C "cd /D C:\Users\Jack\Documents\Coding\jak-project\out\build\Release && "C:\Program Files\Microsoft Visual Studio\18\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -P cmake_install.cmake"
  ninja: build stopped: subcommand failed.
Install succeeded.
```

The build was still useable but the error was bugging me.

Our version of `draco_features.h` is stored in
`third-party/draco/src/draco/draco_features.h` but `draco_install.cmake`
was not updated to reflect this change. Use the already defined
`${draco_features_file_name}` from `draco_options.cmake` to point to the
right place.

Disclosure: I didn't want to spend too much time dealing with cmake so I
pointed Qwen at the problem and it found a very simple solution. Using
`${draco_features_file_name}` to avoid hardcoding is neat. I fully
understand the fix, have tested it and all the descriptions were written
by me.
(AI Assisted)

---------

Co-authored-by: Tyler Wilding <xtvaser@gmail.com>
2026-09-16 19:23:45 -04:00
OpenGOAL Bot 78c14a9532 CI: Periodic Controller Database Update (#4416)
Updating Controller Database

Co-authored-by: OpenGOALBot <OpenGOALBot@users.noreply.github.com>
2026-09-16 19:10:25 -04:00
Gogoașă Cristian a42c071996 fix(docs): Update path for project-overview iso_data-help file (#4407)
Was trying to go through the README and the documentation on the project
to eventually start contributing and I noticed that this picture wasn't
rendering due to a faulty path in the markdown file.
2026-09-09 18:39:30 -04:00
Tyler Wilding 450b9449fe ci: fix issues in offline test workflow when running for an untrusted author (#4411) 2026-09-09 18:37:41 -04:00
OpenGOAL Bot 90ee91fcf0 CI: Periodic Controller Database Update (#4408)
Updating Controller Database

Co-authored-by: OpenGOALBot <OpenGOALBot@users.noreply.github.com>
2026-09-09 18:35:45 -04:00
Matt Dallmeyer ce97ce959b [jak3] game-score decomp cleanup, track minigame rank in autosplitter instead of task status (#4409)
The current autosplit options for side missions that track
bronze/gold/silver don't actually work (other than the explicit gold
options I added in #4398). This reworks these to track the player's best
rank in these missions (0=unranked, 1=bronze, 2=silver, 3=gold), and I
have the [corresponding autosplitter script
changes](https://github.com/open-goal/speedrunning/pull/35) to split
when reaching gold (rank 3). Should be okay to repurpose some of these
autosplitter fields since we haven't cut a release using them yet.

Along the way I filled out the `game-score` enum, made use of this enum
in place of uints throughout the code, and renamed things for a few
related `game-info` methods.
2026-09-08 04:50:53 +02:00
Tyler Wilding 6c719ae000 d/jx: Disassemble and compare VU programs, add reference tests, create a diff report (#4406)
All VU programs are unchanged except:

- `ocean-near-vu1` DIFFERENT
- `sparks-vu1` NEW
- `sprite-glow-vu1` DIFFERENT
- `tnear-vu1` DIFFERENT

And `hfrag`, `ocean` and `ocean-texture` have been removed.

A full breakdown:
```
================================================================================
Checking: background-vu0.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: bones-vu0.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: collide-vu0.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: emerc-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: etie-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: etn-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: foreground-vu0.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: generic-vu0.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: generic-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: merc-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: mercneric-vu0.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: ocean-mid-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: ocean-near-vu1.txt
================================================================================
!!! DIFFERENT !!!

--- ocean-near-vu1.txt
+++ ../jak3/ocean-near-vu1.txt
@@ -78,10 +78,20 @@
 .word 0x2ff
 .word 0x800206bc
 .word 0x2ff
+.word 0x903100a
+.word 0x2ff
+.word 0x884100a
+.word 0x2ff
 .word 0x80050032
 .word 0x2ff
 .word 0x800701f2
 .word 0x2ff
+.word 0x1fc1820
+.word 0x2ff
+.word 0x1fd1821
+.word 0x2ff
+.word 0x1fe2020
+.word 0x2ff
 .word 0x1f82922
 .word 0x2ff
 .word 0x1f92925
@@ -91,23 +101,23 @@
 .word 0x1fb292b
 .word 0x2ff
 .word 0x1ec292e
-.word 0x800601
+.word 0x9c0600
 .word 0x1ed2931
-.word 0x800641
+.word 0x9c0641
 .word 0x1ee2934
-.word 0x800681
+.word 0x9c0682
 .word 0x1ef2937
-.word 0x8006c1
+.word 0x9c06c3
 .word 0x1e8293a
-.word 0x800301
+.word 0x9d0300
 .word 0x3e5c122
-.word 0x800341
+.word 0x9d0341
 .word 0x3e5c925
-.word 0x800381
+.word 0x9d0382
 .word 0x3e5d128
-.word 0x8003c1
+.word 0x9d03c3
 .word 0x3e5d92b
-.word 0x800201
+.word 0x9e0200
 .word 0x3e5612e
 .word 0x2ff
 .word 0x3e56931
@@ -118,12 +128,26 @@
 .word 0x2ff
 .word 0x3e5413a
 .word 0x2ff
+.word 0x80031a32
+.word 0x2ff
+.word 0x80042232
+.word 0x2ff
 .word 0x1005281b
 .word 0x2ff
-.word 0x5a003fec
+.word 0x5a003fe7
 .word 0x2ff
 .word 0x80073ff2
 .word 0x2ff
+.word 0x843100a
+.word 0x2ff
+.word 0x824100a
+.word 0x2ff
+.word 0x1fc1820
+.word 0x2ff
+.word 0x1fd1821
+.word 0x2ff
+.word 0x1fe2020
+.word 0x2ff
 .word 0x1f82922
 .word 0x2ff
 .word 0x1f92925
@@ -133,23 +157,23 @@
 .word 0x1fb292b
 .word 0x2ff
 .word 0x1ec292e
-.word 0x800601
+.word 0x9c0600
 .word 0x1ed2931
-.word 0x800641
+.word 0x9c0641
 .word 0x1ee2934
-.word 0x800681
+.word 0x9c0682
 .word 0x1ef2937
-.word 0x8006c1
+.word 0x9c06c3
 .word 0x1e8293a
-.word 0x800301
+.word 0x9d0300
 .word 0x3e5c122
-.word 0x800341
+.word 0x9d0341
 .word 0x3e5c925
-.word 0x800381
+.word 0x9d0382
 .word 0x3e5d128
-.word 0x8003c1
+.word 0x9d03c3
 .word 0x3e5d92b
-.word 0x800201
+.word 0x9e0200
 .word 0x3e5612e
 .word 0x2ff
 .word 0x3e56931

================================================================================
Checking: shadow-vu0.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: shadow-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: shrub-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: sparks-vu1.txt
================================================================================
!!! MISSING: ../jak3/sparks-vu1.txt
!!! MISSING: sparks-vu1.txt does not exist in ../jak3

================================================================================
Checking: sprite-distort-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: sprite-glow-vu1.txt
================================================================================
!!! DIFFERENT !!!

--- sprite-glow-vu1.txt
+++ ../jak3/sprite-glow-vu1.txt
@@ -1,4 +1,4 @@
-.word 0x1005031e
+.word 0x10050320
 .word 0x2ff
 .word 0x1f903dc
 .word 0x2ff
@@ -66,17 +66,17 @@
 .word 0x2ff
 .word 0x1ed2004
 .word 0x1042101
-.word 0x3e54845
+.word 0x3e54844
 .word 0x5b1159
 .word 0x8025033c
 .word 0x410083
-.word 0x3e55046
+.word 0x3e55045
 .word 0x20025c
-.word 0x3e55847
-.word 0x2ff
-.word 0x3e56048
+.word 0x3e55846
+.word 0x2ff
+.word 0x3e56047
 .word 0x1002117
-.word 0x3e56849
+.word 0x3e56848
 .word 0x2ff
 .word 0x80000030
 .word 0x290247
@@ -178,7 +178,7 @@
 .word 0x18aa52f
 .word 0x80000030
 .word 0x1e5f1bf
-.word 0x3e5184c
+.word 0x3e5184b
 .word 0x1e5fc0a
 .word 0x3c5580b
 .word 0x191a46c
@@ -230,33 +230,33 @@
 .word 0x1ed697d
 .word 0x80000030
 .word 0x1ee717d
-.word 0x385583e
+.word 0x385583d
 .word 0x1f1897d
-.word 0x385603f
+.word 0x385603e
 .word 0x1f2917d
-.word 0x3856840
+.word 0x385683f
 .word 0x1f3997d
-.word 0x3857041
+.word 0x3857040
 .word 0x1f4a17d
-.word 0x3858819
-.word 0x2ff
-.word 0x385901b
+.word 0x3858818
+.word 0x2ff
+.word 0x385901a
 .word 0x2ff
 .word 0x3859808
 .word 0x2ff
 .word 0x385a009
 .word 0x2ff
-.word 0x385584e
-.word 0x2ff
-.word 0x3856050
-.word 0x2ff
-.word 0x3856852
-.word 0x2ff
-.word 0x3857054
+.word 0x385584d
+.word 0x2ff
+.word 0x385604f
+.word 0x2ff
+.word 0x3856851
+.word 0x2ff
+.word 0x3857053
 .word 0x2ff
 .word 0x80002efc
 .word 0x2ff
-.word 0x10010691
+.word 0x10010694
 .word 0x2ff
 .word 0x52001f8c
 .word 0x2ff

================================================================================
Checking: sprite-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: tfrag-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: tie-near-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: tie-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: tnear-vu1.txt
================================================================================
!!! DIFFERENT !!!

--- tnear-vu1.txt
+++ ../jak3/tnear-vu1.txt
@@ -1421,9 +1421,9 @@
 .word 0x1916800
 .word 0x400403
 .word 0x40000008
+.word 0x2ff
+.word 0x1927000
 .word 0x400443
-.word 0x1927000
-.word 0x2ff
 .word 0x3eb802d
 .word 0x2ff
 .word 0x3eb882e
@@ -1435,39 +1435,39 @@
 .word 0x1916948
 .word 0x400403
 .word 0x40000001
+.word 0x2ff
+.word 0x1927148
 .word 0x400443
-.word 0x1927148
-.word 0x2ff
 .word 0x3eba02a
 .word 0x400483
 .word 0x3eba82b
+.word 0x2ff
+.word 0x3ebb02c
+.word 0x2ff
+.word 0x1f4581d
 .word 0x1998407
-.word 0x3ebb02c
+.word 0x1f55820
 .word 0x1998c47
-.word 0x1f4581d
-.word 0x1f6e93c
-.word 0x1f55820
+.word 0x3eb6027
 .word 0x1999487
-.word 0x3eb6027
-.word 0x191876f
 .word 0x3eb6828
-.word 0x19187ab
+.word 0x2ff
 .word 0x3eb801e
 .word 0x1f4a13c
 .word 0x3eb8821
 .word 0x1f5a93c
 .word 0x3eb9024
-.word 0x192ef6f
+.word 0x1f6e93c
 .word 0x3eb7029
-.word 0x192f7ab
+.word 0x2ff
+.word 0x3eba01d
+.word 0x2ff
+.word 0x3eba820
+.word 0x2ff
 .word 0x3ebb023
 .word 0x2ff
 .word 0x800e5872
 .word 0x2ff
-.word 0x3eba01d
-.word 0x2ff
-.word 0x3eba820
-.word 0x19de97c
 .word 0x1ff0297
 .word 0x2ff
 .word 0xb0f03fe
@@ -1475,7 +1475,7 @@
 .word 0x80040032
 .word 0x2ff
 .word 0x420f0007
-.word 0x19de93c
+.word 0x2ff
 .word 0x1006581c
 .word 0x2ff
 .word 0x420f0005
@@ -1541,20 +1541,20 @@
 .word 0x2c010002
 .word 0x2ff
 .word 0x2c0d0002
-.word 0x2ff
+.word 0x3eef87
 .word 0x5200080c
 .word 0x2ff
 .word 0x1f13002
 .word 0x2ff
 .word 0x52006803
 .word 0x2ff
-.word 0x80000030
+.word 0x81feebbc
 .word 0x2ff
 .word 0x400007e3
 .word 0x2ff
 .word 0x800841f2
 .word 0x2ff
-.word 0x420a0082
+.word 0x420a0077
 .word 0x2ff
 .word 0x80064072
 .word 0x2ff
@@ -1570,7 +1570,7 @@
 .word 0x2ff
 .word 0x5200681c
 .word 0x2ff
-.word 0x80000030
+.word 0x81feebbc
 .word 0x2ff
 .word 0x420a006e
 .word 0x2ff
@@ -1594,16 +1594,16 @@
 .word 0x2ff
 .word 0x80064772
 .word 0x2ff
+.word 0x1ec3000
+.word 0x2ff
+.word 0x1f43001
+.word 0x2ff
 .word 0x1f03002
 .word 0x2ff
-.word 0x1ec3000
-.word 0x2ff
-.word 0x1f43001
-.word 0x2ff
 .word 0x80042072
 .word 0x2ff
 .word 0x80000030
-.word 0x19d842c
+.word 0x2ff
 .word 0x81ec03bc
 .word 0x1ff632a
 .word 0x80000030
@@ -1671,14 +1671,14 @@
 .word 0x2c010002
 .word 0x2ff
 .word 0x2c0d0002
-.word 0x2ff
+.word 0x3eef87
 .word 0x500d0818
 .word 0x2ff
 .word 0x1f13802
 .word 0x2ff
 .word 0x5000080c
 .word 0x2ff
-.word 0x80000030
+.word 0x81feebbc
 .word 0x2ff
 .word 0x420a0038
 .word 0x2ff
@@ -1702,7 +1702,7 @@
 .word 0x2ff
 .word 0x80006235
 .word 0x2ff
-.word 0x420a0038
+.word 0x420a002d
 .word 0x2ff
 .word 0x80000030
 .word 0x2ff
@@ -1795,10 +1795,6 @@
 .word 0x80000030
 .word 0x2d6f86
 .word 0x80000030
-.word 0x3eef87
-.word 0x81feebbc
-.word 0x2ff
-.word 0x80000030
 .word 0x1ec6bac
 .word 0x80000030
 .word 0x1f4adac
@@ -1816,25 +1812,3 @@
 .word 0x1f6a5a8
 .word 0x80000030
 .word 0x1f284a8
-.word 0x80000030
-.word 0x3eef47
-.word 0x81fdf3bc
-.word 0x2ff
-.word 0x80000030
-.word 0x1ed63ac
-.word 0x80000030
-.word 0x1f5a5ac
-.word 0x80000030
-.word 0x1f184ac
-.word 0x800003bf
-.word 0x1e0739c
-.word 0x80000030
-.word 0x1e0b59c
-.word 0x80000030
-.word 0x1e0949c
-.word 0x80000030
-.word 0x1ee6bac
-.word 0x48005000
-.word 0x1f6adac
-.word 0x80000030
-.word 0x1f28cac
```
2026-09-04 23:01:17 -04:00
tripp 7bad6c10a9 decompiler: fix missing merc and shrub texture replacements (#4405)
fixes a regression introduced in #4278
2026-09-04 09:29:19 -04:00
Matt Dallmeyer e08d934dbd [jak3] Add autosplits for side mission golds, orbs per level (#4398)
For hundo, all satellite, all open orbs gamers

Goes along with https://github.com/open-goal/speedrunning/pull/35
2026-09-04 09:28:59 -04:00
Matt Dallmeyer 2796e0974b Add imgui option to restart in retail mode (#4404) 2026-09-04 09:28:21 -04:00
Tyler Wilding 9c86c86c74 d/jx: More files (#4360)
Breaks the 300 file milestone, also includes the majority of mips2c
functions carried forward. Some functions need some fixes in the c++
code to mips2c properly, and a small handful of the mips2c functions
require manual patching -- all spots were marked with `TODO - fix` that
had to be commented out to get things compiling.
2026-09-04 09:27:06 -04:00
Jordan 65fc564c16 Added missing <algorithm> header to fix compiler error. (#4396)
When compiling today, I had this error on Arch Linux x86-64 due to the
missing <algorithm> header.
<img width="1952" height="1079" alt="Screenshot from 2026-08-27
22-53-33"
src="https://github.com/user-attachments/assets/c0101a23-ac2a-40a5-a1b9-b1e926e600a7"
/>

Adding the header fixes it.

---------

Co-authored-by: Tyler Wilding <xtvaser@gmail.com>
2026-08-31 22:52:59 -04:00
OpenGOAL Bot 91e8864a89 CI: Periodic Controller Database Update (#4403)
Updating Controller Database

Co-authored-by: OpenGOALBot <OpenGOALBot@users.noreply.github.com>
2026-08-31 22:52:44 -04:00
Matt Dallmeyer c115da577c [jak3] Extend speedrun menus for selecting secrets (#4397)
extends the secret selection menu to other categories (act 2, 3, etc)
and adds hero mode categories for act 2 and 3
2026-08-30 21:45:25 -04:00
Jordan 427c952558 [Jak 2 and Jak 3]: Fixing menu text boundaries and drawing alignments for Automatic and Custom aspect ratios (#4380)
This PR fixes 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. It also cleans up some of the relevant functions which
are used to draw these menus (although I'm still learning how to clean
goal code).

I mostly used french text for testing (since the french text seems to
push the font boundaries to their limits a bit more).
I used Automatic 16:9 and Custom 4:1 aspect ratios for testing to see if
my changes scale to other aspect ratios properly, comparing with PS2 4:3
for reference.



### Jak 3

### Image Color Scale

Before:
- The black/white color scale would get stretched (beyond the limits of
the menu in 4x1)
<img width="1280" height="758" alt="color-scale-16x9-broken"
src="https://github.com/user-attachments/assets/4b3b897e-1417-42da-86a1-dd78926ccb73"
/>
<img width="1283" height="747" alt="color-scale-4x1-broken"
src="https://github.com/user-attachments/assets/44d192ba-5afe-43ae-9419-021123478a31"
/>

Reference (PS2 4:3 in OpenGoal):
<img width="1278" height="773" alt="color-scale-reference"
src="https://github.com/user-attachments/assets/d9bd8f4e-8f69-49a9-8a99-3fcd3d7a4097"
/>

After fixes:

<img width="1283" height="765" alt="color-scale-16x9-fixed"
src="https://github.com/user-attachments/assets/99422d7f-d688-4d91-8ce0-6ad0b7cb10df"
/>
<img width="1282" height="762" alt="color-scale-4x1-fixed"
src="https://github.com/user-attachments/assets/6011f30a-0c31-4ea9-afe1-735ec36f3d32"
/>




### Secrets menu

Before:
- The secret titles touch their costs (#4233).
- The alignment of the top line showing orbs available/cost and total
orbs collected is broken (more noticeable in 4:1)
- The alignment of the titles for groups of secrets is broken (more
noticeable in 4:1)
- The indentation for secret titles relative to the group of secrets is
also broken (again, more noticeable in 4:1)
<img width="1286" height="758" alt="secrets-broken-16x9"
src="https://github.com/user-attachments/assets/bd6c7dab-ce95-4349-bf1d-2a09f82fcbfe"
/>
<img width="1287" height="751" alt="secrets-broken-4x1"
src="https://github.com/user-attachments/assets/3e1ce842-19ba-49b3-92f9-52034ae1982f"
/>

Reference (PS2 4:3 in OpenGoal):

<img width="1280" height="761" alt="Screenshot from 2026-08-16 22-58-22"
src="https://github.com/user-attachments/assets/7326a1c7-b479-4fb7-9450-377a05ab7963"
/>

After fixes:
<img width="1280" height="722" alt="secrets-fixed-16x9"
src="https://github.com/user-attachments/assets/0a66d45f-3aa3-4cc8-ac88-c6aef20f1319"
/>
<img width="1286" height="713" alt="secrets-fixed-4x1"
src="https://github.com/user-attachments/assets/e8740739-42ac-4a12-aad1-e6620dfc73ed"
/>



### Secrets purchase menu

Before: 

- The text for the secret you're purchasing can get cut off if too big.
- As before, the top line showing orb cost/orbs collected is misaligned.
<img width="1288" height="754" alt="secrets-purchase-broken-16x9"
src="https://github.com/user-attachments/assets/49b709e3-c015-42ba-b0aa-034769286d77"
/>
<img width="1281" height="756" alt="secrets-purchase-broken-4x1"
src="https://github.com/user-attachments/assets/0c3c5e02-048a-4188-ada7-2413c384224b"
/>

Reference (PS2 4:3 in OpenGoal):

<img width="1286" height="753" alt="secrets-purchase-reference"
src="https://github.com/user-attachments/assets/bb0b1d1a-87f6-4343-8a82-2e1f968943cd"
/>

After fixes:
<img width="1286" height="759" alt="secrets-purchase-fixed-16x9"
src="https://github.com/user-attachments/assets/1d73593f-1d58-407e-9ce6-2da5bf0fd84b"
/>
<img width="1283" height="750" alt="secrets-purchase-fixed-4x1"
src="https://github.com/user-attachments/assets/85c7e14d-c6b2-4b21-83e5-173af5cba185"
/>


### Save/Load/Create Hero Mode Save menu

Here I show the load game screen only but the bugs were the same among
all 3 as the code is shared. The fixes apply to all 3 as well 😃

Before:

- The header text is cut off in french. 
- There is a faint red rectangle to the right of the menu (look closely!
It's a bit clearer and goes beyond the menu in 4x1).
- The left yellow boxes around the save-games that are not selected do
not scale properly (more noticeable in 4x1).

<img width="1284" height="749" alt="load-broken-Automatic"
src="https://github.com/user-attachments/assets/2ae3bd8b-42ec-49bc-9851-cbaace4ce64b"
/>
<img width="1285" height="751" alt="load-broken-4x1"
src="https://github.com/user-attachments/assets/655de844-748c-43f9-a2e8-d779fe3a8e19"
/>

Reference (PS2 4:3 in OpenGoal):
<img width="1281" height="762" alt="load-screen-4x3"
src="https://github.com/user-attachments/assets/e4e320c9-999a-44a7-8b3e-34cfdbeef5a1"
/>



After Fixes:

- Now headers that exceed the width of the menu screen will be shrunken
down to fit. This will hopefully work for any other menus that need it
as well 😃
- No more red rectangle on the right, and the yellow box to the left
around the save games scales properly.

<img width="1286" height="754" alt="load-fixed-automatic"
src="https://github.com/user-attachments/assets/1a48d811-5684-4f7e-a12a-19e896e30b48"
/>
<img width="1288" height="749" alt="load-fixed-4x1"
src="https://github.com/user-attachments/assets/f5a68cb1-576a-4927-977b-b3419aaf7c23"
/>


### Missions menu 

Before:

- Mission text is sometimes cut off on the right
- Mission text is shifted to the right (more noticeable in 4x1)

<img width="1286" height="753" alt="missions-alignment-broken-16x9"
src="https://github.com/user-attachments/assets/37175eb7-e191-4c09-bb72-b40819acd99b"
/>
<img width="1281" height="750" alt="missions-alignment-broken-16x9-2"
src="https://github.com/user-attachments/assets/482f351a-7386-4211-8434-cf60c0691fdb"
/>
<img width="1286" height="756" alt="missions-broken-4x1"
src="https://github.com/user-attachments/assets/4cbfa4d0-999b-4265-bed0-957958663037"
/>
<img width="1290" height="750" alt="missions-broken-4x1-2"
src="https://github.com/user-attachments/assets/4889b498-d6aa-4e6c-87fc-4dfadeac5827"
/>

Reference (PS2 4:3 in OpenGoal):
<img width="1284" height="768" alt="missions-reference-1"
src="https://github.com/user-attachments/assets/91a526c8-08c2-4a62-8219-09e967fab9c2"
/>
<img width="1276" height="755" alt="missions-reference-2"
src="https://github.com/user-attachments/assets/65c4e944-5b1f-479a-bf7c-eca19c81f5d6"
/>


After:
<img width="1281" height="760" alt="missions-fixed-16x9"
src="https://github.com/user-attachments/assets/a972daf0-1872-46f0-a829-cd8d292df1d6"
/>
<img width="1282" height="750" alt="missions-fixed-16x9-2"
src="https://github.com/user-attachments/assets/973611d6-a72c-43f8-b2f3-034e83f6c416"
/>
<img width="1289" height="760" alt="missions-alignment-fixed-4x1"
src="https://github.com/user-attachments/assets/699c5dbc-8c39-468d-9e14-94007a789e48"
/>
<img width="1281" height="755" alt="missions-alignment-fixed-4x1-2"
src="https://github.com/user-attachments/assets/89216187-d453-4d3e-8e8b-5ae365e7227d"
/>


### Jak 2 

### Secrets menu orb icon
Position was wrong in Automatic and some (but strangely, not all) Custom
Aspect ratios. A correction for the aspect ratio was also being applied
in the setter.

Before:
<img width="1284" height="755" alt="image"
src="https://github.com/user-attachments/assets/0a15e238-1d98-4ba7-86ce-b295e8d78d7a"
/>

After:
<img width="1283" height="755" alt="image"
src="https://github.com/user-attachments/assets/bd97de44-ef41-426c-a76f-d4fe99a35285"
/>

### Missions menu
- Indentation was not working, even in 4:3, due to a typo.
- Width was broken in Automatic and Custom

Before:
<img width="1281" height="753" alt="Screenshot from 2026-08-19 01-05-54"
src="https://github.com/user-attachments/assets/6f5e3cc4-3522-45a5-a45b-34a46a7db544"
/>

After:
<img width="1287" height="761" alt="image"
src="https://github.com/user-attachments/assets/cae5498b-6ca4-40ab-a31c-feb8899bc1e7"
/>
2026-08-28 16:42:47 +02:00
Tyler Wilding bebfb0cec8 ci: revert change to compilation check (#4394)
Not required anymore.

Eventually this test should be ran on the ARM version of the compiler in
addition to the x86 one, but im not in a rush, especially since it's
likely that the ARM backend will be less stable as it's literally brand
new.
2026-08-24 23:53:32 -04:00
Parker de25f39439 arm64: Apple Silicon support (#4390)
Got OpenGOAL building and running natively on Apple Silicon.

This is the rest of the port after the smaller arm64 emitter PRs. I was
told pushing one big PR was okay. This covers goalc, the runtime,
linker, kernel and the GOAL asm.

The new paths have native tests. I also found four more emitter bugs
while running it. They're in scalar sqrt, 128-bit stores, scalar max and
indexed stores above 4 GB.

Spent a while cleaning it up so it's easier to read. 4am gotta sleep lol

Closes #3841

---------

Co-authored-by: Tyler Wilding <xtvaser@gmail.com>
2026-08-24 23:22:47 -04:00
Tyler Wilding 553a713aed ci: fix another macOS dependency (http2) (#4393)
These dependencies only crop up under the static build i suppose, brotli
was fixed, but now http/2 support is the new failure. Will actually
verify they will work here before merging this time.
v0.3.6
2026-08-24 22:52:11 -04:00
Tyler Wilding d28a8e998e ci: install brotli explicitly on macOS runners (#4392)
Another out of no-where regression on the macOS runners...
https://github.com/open-goal/jak-project/actions/runs/32795420246
```
ld: library 'brotlidec' not found
```
2026-08-24 21:58:04 -04:00
Jordan 1c9262842f [Jak 3]: Fixing spelling of precursor in french. (#4381)
Fixed spelling mistake that occurs in the original game. précuseur ->
précurseur
2026-08-24 20:57:16 -04:00
Parker b59a6d1cf3 goalc: arm64 vector loads and stores with a register offset were wrong (#4386)
Some neon tests, plus the fix they needed to run at all.

`ldr q` and `str q` with a register offset had a bad option field so
they don't
decode. The s8 load was ignoring addr2 and reading from the base on its
own. A
few used post indexed forms, which move the address register.

Rest of the avx list to come.
2026-08-22 17:00:13 -04:00
Parker 8c926caa23 goalc: arm64 SIMD encoders emitted the wrong instructions (#4385)
Alters the opcode constants and the lane index maths, so the pext,
vector shift, shuffle, blend and splat helpers now emit the correct
ZIP1/ZIP2, SHL/SSHR/USHR, INS and DUP machine encodings for 128-bit
vector operations.

Adds an Imm5 field helper, which the lane-insert and duplicate encodings
need.

Follows #4384, from the same Apple Silicon work.
2026-08-22 16:34:00 -04:00
Parker 9e5ecef614 goalc: arm64 vector float ops were not float ops (#4384)
Alters the opcode constants in Base, so these helpers now emit the
correct FADD/FMAX/FMIN machine encodings for 4×f32 vector operations.

Found these while getting OpenGOAL running natively on Apple Silicon.
2026-08-21 18:39:37 -04:00
OpenGOAL Bot 04b256e9e0 CI: Periodic Controller Database Update (#4382)
Updating Controller Database

Co-authored-by: OpenGOALBot <OpenGOALBot@users.noreply.github.com>
2026-08-17 18:56:22 -04:00
Tyler Wilding bfc4c18ada goalc: replicate tests for the majority of ARM64 non-simd cases (#4377)
- Adds `capstone` as a disassembling library that could eventually
replace Zydis (for now left that alone)
- Replicates all of the existing x86 tests to ARM64, fixed a bunch of
underlying issues along the way
- There are a very small handful of tests remaining that need to be
enabled / fixed
2026-08-16 15:34:37 -04:00
Jordan 8565ddfbdd Fixed mirror world hud alignment. (#4373)
This PR fixes the hud icon positions in mirror world, resolving #4362. 
Now the orb and skull-gem icons are correctly positioned on the left
whether or not mirror world is active.

Normal:
<img width="1918" height="1042" alt="Screenshot from 2026-08-03
13-01-26"
src="https://github.com/user-attachments/assets/a33ef81f-43e7-4e8d-900d-2e7331588402"
/>
<img width="1922" height="1079" alt="Screenshot from 2026-08-03
13-05-17"
src="https://github.com/user-attachments/assets/06ce1b16-7e40-44e8-a144-25d654a089c8"
/>
Mirror world:
<img width="1924" height="1041" alt="Screenshot from 2026-08-03
12-59-31"
src="https://github.com/user-attachments/assets/68ed1d70-8314-4ef0-bdac-3a7de81a2d57"
/>
<img width="1924" height="1078" alt="Screenshot from 2026-08-03
13-05-35"
src="https://github.com/user-attachments/assets/b3b0a02c-fe11-4ed8-abe1-cbcad214379f"
/>

Closes #4362
2026-08-16 15:02:16 -04:00
Tyler Wilding 787e360fa9 cmake: look in /usr/lib64 for libraries as well (#4379) 2026-08-16 15:01:12 -04:00
OpenGOAL Bot 62a7494a10 CI: Periodic Controller Database Update (#4374)
Updating Controller Database

Co-authored-by: OpenGOALBot <OpenGOALBot@users.noreply.github.com>
2026-08-15 23:09:18 -04:00
Hat Kid 641fb572e8 decompiler: misc gltf exporter fixes (#4371)
This PR adds various fixes to the GLTF exporter:

- 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 width="1630" height="1716" alt="image"
src="https://github.com/user-attachments/assets/2ce31795-a445-4a0d-982d-413fd51833b2"
/>
<img width="497" height="291" alt="image"
src="https://github.com/user-attachments/assets/a8b44073-a33e-4c40-a5d7-2c7a328a86b4"
/>
<img width="484" height="750" alt="image"
src="https://github.com/user-attachments/assets/15392b94-60f3-4fee-97c5-cc6a50d298d5"
/>
<img width="525" height="684" alt="image"
src="https://github.com/user-attachments/assets/e3814105-7538-4028-9129-63b21d432528"
/>
<img width="1221" height="1298" alt="image"
src="https://github.com/user-attachments/assets/7aefa662-890a-4be8-9540-3e63fff52f28"
/>
2026-07-31 06:15:24 +02:00
tripp a4cb1ac1f0 fix: typo in decompression error checking (#4370) 2026-07-28 05:00:51 +02:00
Hat Kid f9a4c5b33f custom levels: fix potential use after free in custom region generation on windows (#4369)
On Windows, the pairs produced by custom regions all become bogus,
probably due to some compiler differences.
Changing the pairs that get stored in the regions to not be pointers
should hopefully resolve this.
To be extra sure, I also pulled some `add_word(0)`s out into locals to
avoid any argument evaluation order shenanigans.

---------

Co-authored-by: Tyler Wilding <xtvaser@gmail.com>
2026-07-28 03:23:46 +02:00
SilversHotsuin a53a526b78 Jak1: Changed one line to fit the screen in 4X3 (Galician) (#4363)
Changed the line "PREME O BOTÓN START" (PRESS START) to fit the 1 line
preference regarding the menu strings
2026-07-27 19:19:47 -04:00
Alexander J. Semenuk 5d5e35fb9b fix: Windows toolchain compatibility (curl 8.21 re-vendor, endless reconfigure loop) (#4355)
## Problem

Windows builds break with a current local toolchain (Scoop LLVM 22.1.8,
CMake 4.4.0, VS 2026), in two independent ways:

1. The build stops at curl's deliberate guard: `#error "no non-blocking
method was found/used/set"` in `third-party/curl/lib/nonblock.c`.
2. From the second configure onward, `cmake --build` re-runs CMake in an
endless loop (observed 42 consecutive reconfigure cycles in a single
build). Likely the same mechanism behind the "endlessly building" VS
2026 note in `docs/setup/dev/vs.md`.

## Root cause

1. `third-party/curl/CMake/CurlTests.c` passes `int *` to
`ioctlsocket()`, whose third parameter is `u_long *`. Clang 22 promotes
`-Wincompatible-pointer-types` to a hard error in C, so the
`HAVE_IOCTLSOCKET_FIONBIO` try_compile silently fails and
`curl_config.h` never defines it. Upstream CI does not see this because
the windows-2022 runner image ships an older LLVM. GCC 14 promotes the
same warning to a hard error, which is very likely the `CurlTests.c.obj`
failure reported from MSYS2 in open-goal/jak-project#3551. Upstream curl
hit the identical problem with GCC 14 and fixed the probe in curl 8.8.0
(curl/curl#13578).
2. The root CMakeLists copies the build tree's `compile_commands.json`
into `<src>/build/` for clangd using `configure_file()`, which registers
its input as a configure dependency. CMake rewrites
`compile_commands.json` late in every generation, after
`CTestTestfile.cmake` and `cmake_install.cmake` (outputs of the same
Ninja regen rule), so once the dependency is registered the rule is
deterministically dirty and every `ninja` invocation re-runs CMake. A
pristine first configure is safe (the file does not exist yet, so the
`if(EXISTS ...)` guard skips the copy), which is why the loop looks
machine- or IDE-specific.

## Fix

1. Per review, re-vendor `third-party/curl` at the `curl-8_21_0` tag
(previously `curl-8_3_0`), which carries the upstream probe fix plus two
years of upstream development; `vendor.yaml` updated to match.
Adjustments the version jump forced:
- curl 8.15 removed the native macOS Secure Transport backend
(`CURL_USE_SECTRANSP`), so macOS now builds curl against OpenSSL like
Linux. The two macOS workflows install Homebrew `openssl@3` and export
`OPENSSL_ROOT_DIR` (keg-only), and the macOS setup docs gained the same
two lines.
- `CURL_BROTLI` / `CURL_ZSTD` switched to AUTO-detection in curl 8.10;
pinned OFF to keep the previous no-compression behavior and avoid
silently linking whatever the CI images happen to have.
- curl's new top-level `BUILD_EXAMPLES` cache option (default ON) leaked
into discord-rpc's identically named option and broke configure at a
nonexistent `examples/send-presence` directory; pinned OFF ahead of the
third-party subdirectories.

The diff is dominated by the mechanical tag-tree swap under
`third-party/curl` (linguist-vendored, collapsed in review). The
hand-written changes are `CMakeLists.txt`, the two macOS workflows,
`docs/setup/system/macos.md`, and `vendor.yaml`.
2. Swap `configure_file()` for `file(COPY ...)`: the same clangd copy
with no configure dependency registered. (`file(COPY_FILE ...
ONLY_IF_DIFFERENT)` would be cleaner still but requires CMake 3.21,
above the declared `cmake_minimum_required(VERSION 3.10)`.)

## Test plan

- [x] Fresh `cmake --preset Release-windows-clang` (LLVM 22, no cache
seeding) completes and logs `Enabled SSL backends: Schannel`; the
FIONBIO probe passes without the previous `#error`
- [x] Full Windows Release build from scratch in the branch worktree
(all 1422 targets)
- [x] goalc-test suite: 1509 passed, 0 failed
- [x] Second consecutive configure with `compile_commands.json` present:
the regen rule in `build.ninja` has no `compile_commands.json` input;
`<src>/build/compile_commands.json` is still refreshed for clangd
- [x] Repeated `ninja` invocations after a full build no longer re-run
CMake
- [x] macOS Intel and ARM CI green (first exercise of the OpenSSL
backend switch)

---

I work off a self-hosted forge, so this GitHub account is quiet; the
configure logs and ninja dirty-node traces from the investigation are
available if anyone wants the raw data.

(AI-assisted)
2026-07-27 19:19:18 -04:00
OpenGOAL Bot 888b300487 CI: Periodic Controller Database Update (#4368)
Updating Controller Database

Co-authored-by: OpenGOALBot <OpenGOALBot@users.noreply.github.com>
2026-07-27 19:08:06 -04:00
Hat Kid fe2086acfb goalc: add debug server (#4365)
This adds 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). Special registers (`r13`,
`r14`, `r15`, argument registers, etc.) are tracked separately and the
current process register even displays the type of the current `pp` if
possible.

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. This also works nested, so any field that is also
a reference type can also be accessed and display its fields, etc.
Dynamic arrays are also supported where possible, e.g. in
`inline-array-class` children and boxed arrays, it will figure out the
value of the `length` field and access the memory up to that point so
all the elements can be accessed and viewed from the `data` field.

Our VS Code extension implements the DAP in
open-goal/opengoal-vscode#375.

Using it is as simple as connecting a REPL to a running game instance
with `(lt)`, compiling with `(mi)` and, with the extension installed,
pressing F5 in VS Code to start the debugger. By default, it will try to
connect to the game that the active `.gc` file is from, the socket port
is different per game (8128 for Jak 1, 8129 for Jak 2, 8130 for Jak 3).
The `launch.json` was updated with two entries for this, the second
entry lets you pick the game/port manually if desired.

~~Not tested on Windows.~~ Only supports x86 for now.
2026-07-27 22:28:28 +02:00
SilversHotsuin e0dc11554d Jak 1: Add Galician base text translation as well as game_text.gp update (#4358)
Added the file to have the menus of Jak 1 translated into Galician (main
menu, options, task/missions and their states, as well as some
minigames).

Already tested, at least on Windows 10, 4x3 aspect ratio and 1920x1080p
monitor.

--------

Translated and revised by: SilversHotsuin and Aziamuth
2026-07-25 13:49:12 -04:00
Matt Dallmeyer fcbcfb549a [jak1] Reinstate NaN check in nav code (#4359)
Inadvertently removed as part of improved decompiler stack variable
support #4222

We suspect this is the reason some nav-enemies have been randomly
disappearing in recent mods/versions

Thanks Evelyn for catching the regression
2026-07-23 22:44:51 +02:00
tripp a306052e84 [jak3] fix missing Hfrag desert terrain on macOS (#4353)
Fixes #4270
2026-07-22 23:04:43 -04:00