mirror of
https://github.com/open-goal/jak-project
synced 2026-08-14 20:43:54 -04:00
f3c63f26bb
Fixes https://github.com/open-goal/jak-project/issues/1821 by adding a special case for `new` method calls where the argument with type `symbol` is actually an address to uninitialized structure on the stack. Fixes https://github.com/open-goal/jak-project/issues/1849 (or at least the cause of the issue Vaser gave in chat, and one random one I found in `debug-sphere`) Fixes https://github.com/open-goal/jak-project/issues/1853 Fixes https://github.com/open-goal/jak-project/issues/1857 by moving the cast into the cond if the body is a single form and the destination type is a bitfield/enum which is likely to work well. Seems to work on the examples we could find in jak 1 and jak 2. Also fixes an issue with casts on the result of `handle->process` (a common place to use casts) the output of process->handle is a plain process. Most of the time, you end up casting this to a more specific. If you add a cast on every use of the variable, the decompiler will decide to change the type of that variable to the more specific type, and this breaks the handle cast. so previously it was impossible to get code like ``` (let* ((s2-0 (the-as swingpole (handle->process (-> self control hack)))) (gp-0 (-> s2-0 dir)) ) ``` But now it will work
268 lines
8.0 KiB
JSON
268 lines
8.0 KiB
JSON
{
|
|
////////////////////////////
|
|
// HACKS and ASM FUNCTIONS
|
|
////////////////////////////
|
|
|
|
"types_with_bad_inspect_methods": [
|
|
"game-task-event",
|
|
"game-task-control",
|
|
"predator-edge",
|
|
"manipy"
|
|
],
|
|
|
|
"no_type_analysis_functions_by_name": [],
|
|
|
|
// this limits the number of cases in a cond. The first argument is the name of the function.
|
|
// the second argument is the name of the first condition in the cond. Use print_cfg to find it out.
|
|
// The third argument is the number of cases. If you set it too small it may fail to build the CFG.
|
|
"cond_with_else_max_lengths": [
|
|
["(method 20 res-lump)", "b0", 2],
|
|
["(method 11 res-lump)", "b0", 1],
|
|
["(method 12 res-lump)", "b0", 1]
|
|
],
|
|
|
|
// if a cond with an else case is being used a value in a place where it looks wrong
|
|
// you can add the function name to this list and it will more aggressively reject this rewrite.
|
|
"aggressively_reject_cond_to_value_rewrite": [
|
|
"(method 10 res-lump)",
|
|
"(method 11 res-lump)",
|
|
"(method 12 res-lump)"
|
|
],
|
|
|
|
// this provides a hint to the decompiler that these functions will have a lot of inline assembly.
|
|
// currently it just leaves pcpyld as an asm op.
|
|
"hint_inline_assembly_functions": [],
|
|
|
|
"asm_functions_by_name": [
|
|
// checking boxed type is different now - these make the cfg stuff sad
|
|
"name=",
|
|
"(method 21 game-info)",
|
|
"cspace-inspect-tree",
|
|
"command-get-process",
|
|
"command-get-trans",
|
|
"(method 10 script-context)",
|
|
"(method 11 script-context)",
|
|
"(method 9 script-context)",
|
|
"(anon-function 64 script)",
|
|
"(anon-function 61 script)",
|
|
"(anon-function 60 script)",
|
|
"(anon-function 54 script)",
|
|
"(anon-function 52 script)",
|
|
"(anon-function 49 script)",
|
|
"(anon-function 33 script)",
|
|
"debug-menu-func-decode",
|
|
"scene-player-init",
|
|
"(method 77 spyder)",
|
|
"(method 77 flamer)",
|
|
"(method 77 grenadier)",
|
|
"(method 224 bot)",
|
|
"(method 77 rapid-gunner)",
|
|
// until loop without nop:
|
|
"cam-layout-entity-volume-info-create",
|
|
"process-drawable-shock-skel-effect",
|
|
"target-history-print",
|
|
"display-list-control",
|
|
"anim-test-anim-list-handler",
|
|
"anim-test-sequence-list-handler",
|
|
"anim-tester-get-playing-item",
|
|
"(method 9 mysql-nav-graph)",
|
|
"(method 58 nav-graph-editor)",
|
|
"(method 120 enemy)",
|
|
"start-pilot-recorder",
|
|
"(anon-function 10 pilot-recorder)",
|
|
"(method 0 hover-nav-control)",
|
|
"(method 24 nav-network)",
|
|
"(method 11 predator-manager)",
|
|
"(method 9 bot-speech-list)",
|
|
"(method 9 bot-speech-list-shuffle)",
|
|
"(anon-function 10 sig-recorder)",
|
|
"(method 14 trail-graph)",
|
|
"(method 12 trail-graph)",
|
|
"(method 11 trail-graph)",
|
|
// actual asm
|
|
"quad-copy!",
|
|
"return-from-thread",
|
|
"return-from-thread-dead",
|
|
"reset-and-call",
|
|
"(method 10 cpu-thread)",
|
|
"(method 11 cpu-thread)",
|
|
"(method 0 catch-frame)",
|
|
"throw-dispatch",
|
|
"throw",
|
|
"run-function-in-process",
|
|
"set-to-run-bootstrap",
|
|
"return-from-exception",
|
|
"exp",
|
|
"(method 17 bounding-box)",
|
|
"(method 9 bounding-box)",
|
|
"(method 9 matrix)",
|
|
"quaternion->matrix-2",
|
|
"sin-rad",
|
|
"cos-rad",
|
|
"atan-series-rad",
|
|
"sign-float",
|
|
"dma-count-until-done",
|
|
"(method 11 collide-mesh-cache)",
|
|
"cpu-delay",
|
|
"qword-read-time",
|
|
|
|
"symlink2",
|
|
"blerc-a-fragment",
|
|
"blerc-execute",
|
|
"foreground-check-longest-edge-asm",
|
|
"generic-light-proc",
|
|
"shadow-add-single-edges",
|
|
"shadow-add-facing-single-tris",
|
|
"shadow-add-double-tris",
|
|
"shadow-add-double-edges",
|
|
"(method 12 collide-mesh)",
|
|
"(method 17 collide-edge-work)",
|
|
"(method 42 collide-shape)",
|
|
"(method 12 collide-shape-prim-sphere)",
|
|
"(method 12 collide-shape-prim-mesh)",
|
|
"(method 18 collide-shape-prim-mesh)",
|
|
"(method 10 collide-cache-prim)",
|
|
"(method 17 collide-cache)",
|
|
"(method 16 ocean)",
|
|
|
|
// unknown instructions
|
|
"debug-line-clip?",
|
|
// logand with #f arg
|
|
"bugfix?",
|
|
|
|
// "reset-target-tracking",
|
|
"(anon-function 1 target)",
|
|
"find-nearest-entity",
|
|
"target-land-effect",
|
|
"(method 12 effect-control)",
|
|
"(method 11 effect-control)",
|
|
"(method 10 effect-control)",
|
|
"(anon-function 2 scene)",
|
|
"progress-trans",
|
|
"(method 10 bigmap)",
|
|
"(method 9 editable-region)",
|
|
"(method 57 enemy)",
|
|
"(anon-function 10 meet-brutter)",
|
|
"(method 154 vehicle-racer)",
|
|
"(method 188 predator)",
|
|
"(anon-function 13 sig0-course)",
|
|
"(method 228 hal-sewer)",
|
|
"(method 154 vehicle-city-racer)",
|
|
"(method 53 squid)",
|
|
"(anon-function 11 fort-floor-spike)",
|
|
"(method 29 gun-dummy)",
|
|
"vehicle-explode-post",
|
|
"(method 158 vehicle-guard)",
|
|
"(method 207 metalhead-predator)",
|
|
"(anon-function 4 gun-states)",
|
|
"(anon-function 28 grenadier)",
|
|
"(anon-function 24 grenadier)",
|
|
|
|
// no longer bug or asm, not done yet
|
|
"particle-adgif-callback"
|
|
],
|
|
|
|
// these functions use pairs and the decompiler
|
|
// will be less picky about types related to pairs.
|
|
"pair_functions_by_name": [
|
|
"ref",
|
|
"(method 4 pair)",
|
|
"last",
|
|
"member",
|
|
"nmember",
|
|
"assoc",
|
|
"assoce",
|
|
"nassoc",
|
|
"nassoce",
|
|
"append!",
|
|
"delete!",
|
|
"delete-car!",
|
|
"insert-cons!",
|
|
"sort",
|
|
"unload-package",
|
|
"display-loop-main",
|
|
"lookup-level-info",
|
|
"(method 24 level-group)",
|
|
"(method 19 level-group)",
|
|
// script
|
|
"command-get-time",
|
|
"command-get-param",
|
|
"command-get-quoted-param",
|
|
"command-get-entity",
|
|
// default-menu
|
|
"dm-scene-load-pick-func",
|
|
"debug-menu-make-continue-sub-menu",
|
|
"debug-menu-make-from-template",
|
|
"debug-menu-context-make-default-menus",
|
|
"debug-menu-make-task-menu",
|
|
"(method 19 gui-control)",
|
|
// airlock
|
|
"(method 24 com-airlock)"
|
|
],
|
|
|
|
// If format is used with the wrong number of arguments,
|
|
// it will often mess up the decompilation, as the decompiler assumes
|
|
// that they used the correct number. This will override the decompiler's
|
|
// automatic detection.
|
|
"bad_format_strings": {
|
|
"~170h~5d~220h~5d~280h~5,,2f": 3,
|
|
"~338h~5d~388h~5d~448h~5,,2f": 3,
|
|
"~30Htf: ~8D~134Hpr: ~8D~252Hsh: ~8D~370Hhd: ~8D~%": 4,
|
|
"~30Hal: ~8D~131Hwa: ~8D~252Hsp: ~8D~370Hwp: ~8D~%": 4,
|
|
"ERROR: <asg> ~A in spool anim loop for ~A ~D, but not loaded.~": 3
|
|
},
|
|
|
|
"blocks_ending_in_asm_branch": {
|
|
"closest-pt-in-triangle": [17],
|
|
// this one is all asm branches
|
|
"circle-circle-xz-intersect": [
|
|
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
|
|
],
|
|
|
|
"find-knot-span": [0, 1, 2, 3, 5, 6, 7, 8, 9],
|
|
|
|
"curve-evaluate!": [0, 2, 5, 6, 7, 8, 9],
|
|
|
|
"display-loop-main": [127, 130, 133, 136],
|
|
|
|
"real-main-draw-hook": [114, 115, 116, 118],
|
|
|
|
"sprite-draw-distorters": [4, 5],
|
|
|
|
"add-debug-box-with-transform": [0, 3],
|
|
"add-debug-line-sphere": [0],
|
|
|
|
"(method 12 perf-stat)": [0],
|
|
"(method 11 perf-stat)": [0],
|
|
"(method 22 gui-control)": [117, 121, 127, 128, 129, 139],
|
|
"bsp-camera-asm": [1, 2, 3, 4, 6, 7],
|
|
"level-remap-texture": [2, 3, 4, 5, 6]
|
|
},
|
|
|
|
// Sometimes the game might use format strings that are fetched dynamically,
|
|
// for example using the game text lookup method
|
|
// Add information about those format instructions here.
|
|
// e.g. "function-name":[[op, argc], [op, argc], ...]
|
|
// where "op" is the op number for the call to format.
|
|
"dynamic_format_arg_counts": {},
|
|
|
|
"mips2c_functions_by_name": [
|
|
"collide-do-primitives",
|
|
"moving-sphere-triangle-intersect",
|
|
"calc-animation-from-spr",
|
|
"draw-string-asm", "draw-string", "get-string-length",
|
|
"init-boundary-regs"
|
|
],
|
|
|
|
"mips2c_jump_table_functions": {},
|
|
|
|
// there are some missing textures. I don't know what the game actually does here.
|
|
// the format for entries is [level, tpage, index]
|
|
"missing_textures": [],
|
|
|
|
// some object files have garbage pad data at the end which makes the decompiler
|
|
// assume they must be different files, such as the art group for orb-cache-top.
|
|
// this just suppresses a message.
|
|
"expected_merged_objs": []
|
|
}
|