jak-project/decompiler/config/jak2/hacks.jsonc

640 lines
18 KiB
Plaintext

{
////////////////////////////
// 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 77 spyder)",
"(method 77 flamer)",
"(method 77 grenadier)",
"(method 224 bot)",
"(method 77 rapid-gunner)",
// until loop without nop:
"target-history-print",
"display-list-control",
"anim-test-anim-list-handler",
"anim-test-sequence-list-handler",
"anim-tester-get-playing-item",
"(method 58 nav-graph-editor)",
"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",
"dma-test-func",
"move-test-func",
"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 17 collide-edge-work)",
"(method 10 collide-cache-prim)",
"(method 17 collide-cache)",
"(method 16 ocean)",
// unknown instructions
"debug-line-clip?",
// logand with #f arg
"bugfix?",
// CFG failed
"draw-inline-array-instance-shrub",
"(method 10 bigmap)",
"(method 9 editable-region)", // condition branch assert hit
"(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)",
"vehicle-explode-post",
"(method 158 vehicle-guard)",
"(method 207 metalhead-predator)",
"(anon-function 28 grenadier)",
"(anon-function 24 grenadier)",
"test-to-from-spr",
"test-from-spr",
"test-to-spr",
"test-seq-read",
"test-worst-read",
"test-seq-write",
"test-worst-write",
// texture
"adgif-shader<-texture!"
],
// 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",
"(method 9 script-context)",
"(anon-function 6 script)",
"(anon-function 49 script)",
"(anon-function 52 script)",
"(anon-function 72 script)",
"(anon-function 73 script)",
"(anon-function 74 script)",
"(anon-function 75 script)",
"(anon-function 76 script)",
"(anon-function 80 script)",
"(method 11 script-context)",
"(method 10 script-context)",
"command-get-trans",
"key-assoc",
"(anon-function 0 script)",
// 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)",
// menu
"debug-menu-rebuild",
"debug-menu-find-from-template",
"debug-menu-render",
"debug-menu-context-select-next-or-prev-item",
"debug-menu-context-select-new-item",
"debug-menu-send-msg",
// airlock
"(method 24 com-airlock)",
"(method 19 gui-control)",
"(method 28 editable)",
"execute-select",
"(method 29 editable)",
"(method 25 editable)",
// game-info
"(method 20 game-info)",
"print-continues",
// task-control
"(anon-function 55 task-control)",
"(method 17 load-state)",
"(method 12 level)",
"bg",
"update-sound-banks",
"entity-remap-names",
"(method 8 process-tree)",
"(post play-anim scene-player)",
"(method 25 scene-player)",
"(method 25 scene-player)",
"scene-player-init",
"next-continue",
"(method 25 warp-gate)",
"(code use warp-gate)",
"cspace-inspect-tree",
"(method 11 mtn-step-plat-rocks-a)",
"(method 11 mtn-step-plat-rocks-b)",
"(method 11 mtn-step-plat-rocks-c)",
"prototypes-game-visible-set!"
],
// 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,
// TODO - these should be automatic
" tfrag ~192H~5DK ~280Htfragment~456H~5DK~%": 2,
" tie-proto ~192H~5DK ~280Hsky~456H~5DK~%": 2,
" tie-instance ~192H~5DK ~280Htie-fragment~456H~5DK~%": 2,
" shrub-proto ~192H~5DK ~280Htie-scissor~456H~5DK~%": 2,
" shrub-instance ~192H~5DK ~280Hshrubbery~456H~5DK~%": 2,
" collision ~192H~5DK ~280Htie-generic~456H~5DK~%": 2,
" pris-anim ~192H~5DK ~280Hpris-generic~456H~5DK~%": 2,
" textures ~192H~5DK ~280Htextures~456H~5DK~%": 2,
" misc ~192H~5DK ~280Hsprite~456H~5DK~%": 2,
" entity ~192H~5DK~%": 1,
" pris-geo ~192H~5DK ~280Hpris-fragment~456H~5DK~%": 2,
"~33L~S~32L ~S": 2,
"~32L~S ~33L~S~1L": 2,
"~35L~S~33L ~S": 2,
"~1L~S~35L ~S": 2,
"~35L~S ~1L~S~1L": 2,
"~33L~S~35L ~S": 2,
"~33L~C~34L~S~33L~C": 3,
"~35L~S ~33L~S~1L": 2,
"~33L~S ~35L~S~1L": 2,
"~33L~C": 1
},
"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
],
"load-game-text-info": [15, 16, 17, 19, 20, 21],
"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],
"draw-drawable-tree-instance-shrub": [5, 7, 9, 11],
"add-debug-box-with-transform": [0, 3],
"add-debug-line-sphere": [0],
"(method 12 perf-stat)": [0],
"(method 11 perf-stat)": [0],
"bsp-camera-asm": [1, 2, 3, 4, 6, 7],
"(method 9 texture-page-dir)": [5, 6],
"level-remap-texture": [2, 3, 4, 5, 6],
"(method 27 nav-mesh)": [1, 2],
"(method 31 nav-mesh)": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
"(method 46 nav-mesh)": [2, 3],
"(method 32 nav-mesh)": [1, 2],
"(method 33 nav-mesh)": [1, 2],
"(method 42 nav-mesh)": [1, 2, 3, 7],
"point-poly-distance-min": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
"(method 34 nav-mesh)": [1, 2, 3, 7],
"(method 35 nav-mesh)": [2, 4],
"draw-actor-marks": [8],
"find-nearest-entity": [7, 9, 10, 11, 12, 13, 14],
"start-perf-stat-collection": [26],
"end-perf-stat-collection": [0],
"upload-vis-bits": [2, 6, 3, 0],
"set-background-regs!": [4, 3],
"draw-drawable-tree-instance-tie": [21, 23, 31, 33],
"command-get-process": [43],
"unpack-comp-rle": [1, 3, 5, 6],
"(method 16 level)": [0, 1, 5, 13, 14, 15],
"unpack-comp-huf": [2, 4, 5, 6, 7, 8, 9],
"unpack-comp-lzo": [
0,
1,
4,
5,
6,
7,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35, // branch fwd 39
39, // branch fwd no delay
43, // goto 18
45 // goto 6
],
"(method 27 conveyor)": [5, 14, 22],
"(method 44 nav-graph)": [1, 3, 6, 13, 17],
"(method 11 sparticle-launch-control)": [
18, 24, 25, 28, 29, 32, 33, 34, 36, 41, 55, 58, 93, 95
],
"(method 22 gui-control)": [
10, // goto L63 (B39)
16, // goto L58 (B27)
26, // goto L62 (B)
27, // goto L62
28, // goto L61
35, // goto L62
36, // goto L62
38, // goto L99
42, // goto L89
50, // goto L84
108, // goto L86
110, // goto L86
116, // goto L99
117, // goto L91
120
],
"(anon-function 11 game-save)": [0, 3, 4, 5],
"update-actor-hash": [0, 2, 4],
"(code target-death)": [111, 140],
"(method 13 collide-cache)": [7, 9],
"(method 11 collide-mesh)": [2, 4],
"(method 12 collide-mesh-cache)": [0, 1, 2, 3, 4, 5],
"(method 10 collide-mesh)": [2],
"(method 42 collide-shape)": [0, 1, 2, 3, 4, 7],
"(method 18 collide-shape-prim-mesh)": [2, 3, 4, 5, 6, 7],
"(method 18 collide-shape-prim-sphere)": [2, 3, 4],
"(method 15 collide-shape-prim-sphere)": [1, 2, 3, 4, 5, 6],
"(method 16 collide-shape-prim-sphere)": [0, 1, 2, 3, 4],
"(method 36 collide-shape)": [8, 9],
"(method 45 collide-shape)": [33],
"(method 40 collide-shape)": [
0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
],
"(method 12 collide-shape-prim-group)": [1, 2, 3, 4, 5, 6],
"(method 13 collide-shape-prim)": [1, 2, 3, 4, 5, 6],
"(method 12 collide-shape-prim-sphere)": [
1, 2, 3, 4, 5, 8, 10, 11, 13, 14, 15
],
"(method 12 collide-shape-prim-mesh)": [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16
],
"(method 24 grid-hash)": [39, 35, 22, 15],
"(method 12 flow-control)": [11, 12, 13, 14, 15, 18, 20, 22, 29],
"(method 19 process-drawable)": [0, 2, 3, 7, 10, 11, 30],
"find-offending-process-focusable": [16, 19],
"target-standard-event-handler": [
5, // fwd L31/7
6, // to 152
7, // fwd L38
20, // to 152
21, // fwd L39
22, // to 152
23, // to L40
24, // to 152
25, // to L45
43, // to l152
44, // to 46
45, // to l152
46, // to l114
190, // to l152
191, // to 121
210,
211,
212,
213,
214,
224,
225,
226,
227,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
255,
256,
269,
270,
285,
286,
287,
288,
289,
290
],
"bones-mtx-calc-execute": [19, 7],
"foreground-draw": [0, 1, 126],
"dma-add-process-drawable": [0, 136],
"(anon-function 3 ruins-obs)": [14],
"(anon-function 0 target-death)": [
50, // goto 52
51, // goto L65
63, // goto L47
73, // goto L25
78, // goto L46
84, // goto L42
95, // goto next
96, // goto L36
115, // goto L55
121,
131
],
"(anon-function 4 gun-states)": [94, 96, 98],
"target-board-handler": [13, 14, 18],
"find-closest-circle-ray-intersection": [0, 4, 15, 16, 17, 18],
"(method 18 nav-control)": [
11, // L283
12, // L300
19, // L295
20, // L293
31, // weird jump back
34 // weird jump no delay slot
],
"(method 19 nav-control)": [9, 10],
"(method 19 nav-mesh)": [7],
"(method 18 nav-mesh)": [9],
"(method 40 nav-state)": [1, 2],
"(method 45 nav-mesh)": [5, 6],
"(method 43 nav-mesh)": [0, 1, 2, 12, 13, 14, 15, 16, 17, 18, 19, 20],
"(anon-function 45 gungame-obs)": [0, 1, 6, 9, 14, 18, 21, 22, 30] // TODO - probably not the best
},
// 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": {
"(method 10 menu-loading-option)": [[118, 1]],
"(method 10 menu-insufficient-space-option)": [
[63, 1],
[103, 1]
],
"(method 10 menu-secrets-insufficient-space-option)": [[55, 1]],
"(method 10 menu-card-removed-option)": [[48, 1]],
"(method 10 menu-format-card-option)": [[49, 1]],
"(method 10 menu-create-game-option)": [[49, 1]],
"(method 10 menu-error-auto-saving-option)": [[72, 1]],
"(method 10 menu-error-loading-option)": [
[64, 1],
[99, 1]
],
"(method 10 menu-insert-card-option)": [[48, 1]],
"(method 16 fail-mission)": [
[68, 1],
[101, 1],
[130, 1]
],
"auto-save-post": [[158, 1]],
"(method 30 training-manager)": [[53, 0]],
"(trans course training-manager)": [
[54, 1],
[89, 1],
[124, 1],
[155, 1],
[195, 1],
[230, 1],
[261, 1],
[307, 1],
[338, 1],
[374, 1],
[409, 1],
[444, 1],
[479, 1],
[510, 1]
]
},
"mips2c_functions_by_name": [
"collide-do-primitives",
"moving-sphere-triangle-intersect",
"calc-animation-from-spr",
"draw-string-asm",
"draw-string",
"get-string-length",
"adgif-shader<-texture-with-update!",
"init-boundary-regs",
"draw-boundary-polygon",
"render-boundary-quad",
"render-boundary-tri",
"clip-polygon-against-negative-hyperplane",
"clip-polygon-against-positive-hyperplane",
"sp-init-fields!",
"particle-adgif",
"sp-launch-particles-var",
"sparticle-motion-blur",
"sp-process-block-2d",
"sp-process-block-3d",
"set-tex-offset",
"draw-large-polygon",
"render-sky-quad",
"render-sky-tri",
"(method 16 sky-work)",
"(method 17 sky-work)",
"(method 32 sky-work)",
"(method 33 sky-work)",
"(method 28 sky-work)",
"(method 29 sky-work)",
"(method 30 sky-work)",
"(method 11 collide-hash)",
"(method 12 collide-hash)",
"fill-bg-using-box-new",
"fill-bg-using-line-sphere-new",
"(method 12 collide-mesh)",
"(method 11 collide-mesh)",
"(method 14 collide-mesh)",
"(method 15 collide-mesh)",
"(method 10 collide-edge-hold-list)",
"(method 19 collide-edge-work)",
"(method 9 edge-grab-info)",
"(method 16 collide-edge-work)",
"(method 17 collide-edge-work)",
"(method 18 collide-edge-work)",
"draw-large-polygon-ocean",
"render-ocean-quad",
"init-ocean-far-regs",
"(method 14 ocean)",
"(method 15 ocean)",
"(method 16 ocean)",
"(method 18 grid-hash)",
"(method 19 grid-hash)",
"(method 20 grid-hash)",
"(method 22 grid-hash)",
"(method 28 sphere-hash)",
"(method 33 sphere-hash)",
"(method 29 sphere-hash)",
"(method 30 sphere-hash)",
"(method 31 sphere-hash)",
"(method 32 sphere-hash)",
"(method 33 spatial-hash)",
"(method 39 spatial-hash)",
"(method 36 spatial-hash)",
"(method 37 spatial-hash)",
"(method 35 spatial-hash)",
"(method 10 collide-shape-prim-mesh)",
"(method 10 collide-shape-prim-sphere)",
"(method 10 collide-shape-prim-group)",
"(method 11 collide-shape-prim-mesh)",
"(method 11 collide-shape-prim-sphere)",
"(method 11 collide-shape-prim-group)",
"(method 9 collide-cache-prim)",
"(method 10 collide-cache-prim)",
"(method 17 collide-cache)",
"(method 9 collide-puss-work)",
"(method 10 collide-puss-work)",
"bones-mtx-calc",
"foreground-check-longest-edge-asm",
"foreground-merc",
"add-light-sphere-to-light-group",
"light-hash-add-items",
"light-hash-count-items",
"light-hash-get-bucket-index",
// nav-mesh / nav-control related
// TODO - it would be nice to eventually figure out the asm blocks for the majority of these
"nav-state-patch-pointers",
"(method 20 nav-engine)",
// "find-closest-circle-ray-intersection",
// "(method 18 nav-control)",
"nav-dma-send-to-spr-no-flush",
"nav-dma-send-from-spr-no-flush",
"(method 17 nav-engine)",
"(method 18 nav-engine)",
"(method 21 nav-engine)",
"(method 39 nav-state)"
],
"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": []
}