# inFAMOUS 2 v1.04 (PPU-41a7d047c573c78c0307506c9d1b52d15a66e4f5): function entries that get a
# run-time hook slot (PPU_HOOK_FILE, toolkit tools/ppu_fastpath.py), used by cheats.cpp.
# Title knowledge for v1.04, published with the port (credits: cheats/NOTES.md).
001578F8   # Cole's character, per-frame update (via thunk 0066FECC; r3 = the character)
00363904   # SetHealth(r3 character, f1 new health) -- every health change of every character
00364044   # TakeDamage(r3 character, r4 damage object: +0x7C amount (float, > 0), +0x64 source)
0012FC6C   # AddKarma(r3 progress struct G = 0x00A64E20, f1 delta (+ hero / - infamous), r5 reason or -1)
0009B780   # battery energy bonus(r3 shard progress) -> f1 = level * energy per level; only caller: 0x154E10
0019BB20   # UpdateGravity(r3 jump/fall controller A, [A+0x1C] = its character): A+0x60 = the gravity vector;
           # in fall state Float (A+0x120 == 2, the Static Thrusters) z = max(character gravity z, -350)
00196508   # the max of a 30-sample (time, value) ring within a time window: walks back with no lap bound,
           # so all 30 samples newer than the cut = an endless loop (the m19-fight hang); cheats.cpp hook_ring_max
0007E0A4   # [mouse] the free camera's input step (r3 = camera driver D: +0x1C0 yaw, +0x1C4 pitch); from func_00082964
00098A00   # [mouse] the aim camera, once a frame while aiming (r3 = aim camera A: +0x254 yaw, +0x258 pitch)
0008D7C8   # [mouse] stick -> target turn rates (aim assist): only the cameras' manual paths call it
0019609C   # [mouse] pad vtable +0x38, the camera stick (r4 1 = right; r5/r6 <- x|x|, y|y|, the game's invert)
002BB874   # [L_] SubmitDraws(r3 renderer, r4 pass, r5 n, r6 -> n shader variants, r7 shader reference, r8 instance,
           # r9 -> bounds); Black lightning swaps r5/r6/r7 for the electric arc renderer's call only (lr 0x002CFA40)
0019B274   # [L_] the glide's forward speed (r3 = jump/fall controller A; f1 = A+0x44, or 1350 with a thrusters upgrade)
0019B350   # [L_] the glide's vertical-speed floor (r3 = A; v2 = 0, or splat(-1000) with the last thrusters upgrade)
0012D18C   # [powers] a power's word as the game reads it (r3 G = 0x00A64E20, r4 power 0..95): G+0x40+4p, its 1 bit hidden
           # for a karma power whose rank was never reached; "Karma powers of both sides" returns the stored word
0012D6C8   # [powers] karma allows power r4 now (r3 G): evil ones at their rank or worse, hero ones at theirs or better;
           # "Karma powers of both sides" returns 1 (the game's own answer once both endings are done)
0054C8B8   # [workers] the WwsJob manager adds its SPURS workload (r5 -> the 8 per-SPU priority bytes; 0 = that SPU never runs it)
0047D820   # [fov] SetFov(r3 camera, f1 fov): if changed, C+0x29C = fov, tan(fov/2) -> C+0x2AC, x aspect -> C+0x2A8 (probe only)
0047D8D8   # [fov] SetFovNow(r3 camera, f1 fov): C+0x2CC = fov, C+0x2D4 = 0, then SetFov (a tail jump)
0047D018   # [fov] SetFovTarget(r3 camera, f1 fov, f2 rate): C+0x2CC / C+0x2D0 (the free camera only)
00480750   # [fov] the camera's update (a virtual, r3 camera): moves C+0x29C to C+0x2CC, then the LOD factor 0x0047D8EC
0048E980   # [fov] the render walk's camera copy (r3 the copy, r4 the camera: fov, aspect, near, far ...)
00082964   # [fov] camera mode frames (vtable slot 3; r3 the mode, +0x108 its camera): the free camera driver
0008DC94   # [fov]   mode 0x00938CCC
00090188   # [fov]   mode 0x00938DBC
000926B0   # [fov]   mode 0x00938BCC
000931DC   # [fov]   mode 0x009389EC
00093B34   # [fov]   mode 0x00938ADC (the aim camera 0x00098A00 has its slot above)
0008BEB4   # [fov] camera mode starts (vtable slot 2; r3 the mode, r4 the camera taken over): mode 0x00938DBC
00099B68   # [fov]   the aim camera's start (keeps C+0x29C at A+0x25C)
