I discovered that `yakow`s are kinda broken if you try to use them in custom levels in jak 2/3. It's due to the missing `yakow-lod0` texture and associated fix, replacing it with `yak-medfur-end`. This solution works fine for the decompiler on vanilla levels. But for building custom levels, the requested art-groups were being handled before the textures were, and so it was impossible to have `yak-medfur-end` on hand to do the replacement. You'd hit an exception here because `idx_in_level_texture` would still be `INT32_MAX`: https://github.com/open-goal/jak-project/blob/c08118509b84feba002bd9e208f49162b4218556/decompiler/level_extractor/extract_merc.cpp#L806 My fix was just to swap the order when building custom levels, and handle the textures first. I only made the changes for jak2/3, because I see @Hat-Kid has a slightly different implementation for jak1. There's one other small change relating to the `combo_id` / `pc_combo_tex_id` short-circtuiting - I think `pc_combo_tex_id` is always 0 for vanilla textures? So initially `yakow-lod0` actually ended up matching the `combo_id` of the checkerboard texture from the test-zone GLB. I just added another sanity check here that the texture names match too. (I also added yakows in the test-zone.jsonc files 🐄)
Custom Levels
Disclaimer: custom levels are still in development and are missing most features.
The first three steps are already done for "test zone", so this can be used as a starting point.
1: File Setup
To create a custom level, copy the layout of custom_assets/jak1/levels/test-zone. See test-zone.jsonc for information on how to name things. The .gd file also contains the level name.
2: Modify the engine
Modify goal_src/jak1/engine/level/level-info.gc to add level info for each custom level. There is level info for test-zone at the bottom that can be used as an example.
3: Modify the build system
Modify goal_src/jak1/game.gp and add a custom level target:
(build-custom-level "test-zone")
;; the DGO file
(custom-level-cgo "TESTZONE.DGO" "test-zone/testzone.gd")
4: Export the GLTF file from blender.
For now, all meshes are displayed and treated as ground collision. This causes buggy collision because walls shouldn't use "floor" mode.
Blender will create a .glb file, which must have the name specified in the .jsonc file and should be located in custom_assets/jak1/levels/your_level
5: Rebuild the game
Any time the .glb file is changed, you must rebuild the game. Launch the compiler (goalc) and run (mi) to rebuild everything. It's recommended to leave the compiler open - it will remember files that haven't changed and skip rebuilding them.
6: Go to the custom level
Start the game in debug mode gk.
In the compiler window, run (lt) to connect to the game. You must run this again every time you restart the game. If this doesn't work, there could be a firewall issue and you must allow goalc/gk to use the network. They don't make any outside connections.
In the compiler window, run a command like (bg-custom 'test-zone-vis) to load and start at a custom level.