diff --git a/decompiler/config/jak2/all-types.gc b/decompiler/config/jak2/all-types.gc index 656bf5a2e2..41ca21c8ef 100644 --- a/decompiler/config/jak2/all-types.gc +++ b/decompiler/config/jak2/all-types.gc @@ -16054,6 +16054,7 @@ (declare-type collide-cache-prim structure) (declare-type collide-shape-prim-group structure) +(declare-type collide-cache basic) (deftype collide-shape-prim (basic) ((cshape collide-shape :offset-assert 4) @@ -16078,7 +16079,7 @@ (:methods (new (symbol type collide-shape uint int) _type_ 0) (debug-draw (_type_) none 9) - (add-fg-prim-using-box () none 10) + (add-fg-prim-using-box (_type_ collide-cache) none 10) (add-fg-prim-using-line-sphere () none 11) (overlaps-others-test (_type_ overlaps-others-params collide-shape-prim) symbol 12) (overlaps-others-group (_type_ overlaps-others-params collide-shape-prim-group) symbol 13) @@ -18410,6 +18411,7 @@ (prim-index uint16 :offset 56) (user16 uint16 :offset 58) (user32 uint32 :offset 60) + (clear-flags uint128 :offset 48) ) :method-count-assert 9 :size-assert #x40 @@ -18471,7 +18473,7 @@ (probe-using-spheres (_type_ collide-query) symbol 17) ;; (initialize (_type_) none 17) (fill-from-bg (_type_ (function collide-hash int collide-list collide-query int) (function collide-cache collide-list collide-query none) collide-query) none 18) ;; (probe-using-line-sphere (_type_ vector vector float collide-kind collide-tri-result pat-surface) float 18) (fill-from-fg-boxes (_type_) none 19) ;; (probe-using-spheres (_type_ collide-using-spheres-params) symbol 19) - (fill-from-fg-line-sphere (_type_) none 20) ;; (probe-using-y-probe (_type_ vector float collide-kind collide-tri-result pat-surface) float 20) + (fill-from-fg-line-sphere (_type_ collide-query) none 20) ;; (probe-using-y-probe (_type_ vector float collide-kind collide-tri-result pat-surface) float 20) (fill-from-water (_type_ water-control) none 21) ;; (fill-from-background (_type_ (function bsp-header int collide-list none) (function collide-cache object none)) none 21) (collide-cache-method-22 () none 22) ;; (fill-from-foreground-using-box (_type_) none 22) (collide-cache-method-23 () none 23) ;; (fill-from-foreground-using-line-sphere (_type_) none 23) @@ -22794,11 +22796,11 @@ (:methods (new (symbol type int int) _type_ 0) (add-an-object (_type_ vector hash-object-info) int 34) - (spatial-hash-method-35 (_type_) none 35) + (fill-actor-list-for-box (_type_ bounding-box (pointer collide-shape) int) int 35) (fill-actor-list-for-sphere (_type_ sphere (pointer collide-shape) int) int 36) - (spatial-hash-method-37 (_type_) none 37) - (fill-actor-list-for-vec+r (_type_ vector (pointer collide-shape) int) none 38) - (spatial-hash-method-39 (_type_ object hash-object-info) none 39) + (fill-actor-list-for-line-sphere (_type_ vector vector float (pointer collide-shape) int int) int 37) + (fill-actor-list-for-vec+r (_type_ vector (pointer collide-shape) int) int 38) + (spatial-hash-method-39 (_type_ object hash-object-info) int 39) (validate-objects (_type_) none 40) ) ) diff --git a/decompiler/config/jak2/hacks.jsonc b/decompiler/config/jak2/hacks.jsonc index bd923f065b..abf0bf6aaa 100644 --- a/decompiler/config/jak2/hacks.jsonc +++ b/decompiler/config/jak2/hacks.jsonc @@ -541,7 +541,18 @@ "(method 39 spatial-hash)", "(method 36 spatial-hash)", "(method 37 spatial-hash)", - "(method 35 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)" ], "mips2c_jump_table_functions": {}, diff --git a/decompiler/config/jak2/stack_structures.jsonc b/decompiler/config/jak2/stack_structures.jsonc index 4ed20522e3..e222dd2102 100644 --- a/decompiler/config/jak2/stack_structures.jsonc +++ b/decompiler/config/jak2/stack_structures.jsonc @@ -1192,5 +1192,8 @@ "(enter cam-launcher-longfall)": [[16, "vector"]], "explosion-init-by-other": [[16, "traffic-danger-info"]], "process-drawable-shock-skel-effect": [[176, "matrix"], [256, "vector"], [272, "vector"], - [288, "vector"], [304, "quaternion"], [384, "vector"]] + [288, "vector"], [304, "quaternion"], [384, "vector"]], + "(method 20 collide-cache)": [ + [16, "matrix"] + ] } diff --git a/decompiler/config/jak2/type_casts.jsonc b/decompiler/config/jak2/type_casts.jsonc index ee49966ca2..311c956111 100644 --- a/decompiler/config/jak2/type_casts.jsonc +++ b/decompiler/config/jak2/type_casts.jsonc @@ -3138,7 +3138,7 @@ "memcard-unlocked-secrets?": [[50, "s5", "int"]], "(method 10 progress)": [[45, "t9", "(function progress none)"]], "load-game-text-info": [[4, "v1", "game-text-info"]], - "(method 16 camera-master)": [[[11, 15], "a2", "target"]], + "(method 16 camera-master)": [[[11, 15], "a2", "target"], [[16, 18], "v1", "int"]], "master-choose-entity": [ ["_stack_", 96, "res-tag"], [[87, 247], "s3", "(pointer camera-slave)"] @@ -4931,5 +4931,23 @@ [642, "v1", "(pointer process)"], [698, "v1", "(pointer process)"], [68, "a0", "vector"] + ], + "(method 21 collide-cache)": [ + [[62, 86], "a3", "(inline-array collide-cache-tri)"] + ], + "(method 13 collide-cache)": [ + [303, "v1", "process-drawable"] + ], + "(method 19 collide-cache)": [ + [26, "a0", "connection"], + [27, "a0", "collide-shape"], + [105, "a0", "connection"], + [106, "a0", "collide-shape"] + ], + "(method 20 collide-cache)": [ + [50, "v1", "connection"], + [51, "s1", "collide-shape"], + [114, "v1", "connection"], + [115, "s1", "collide-shape"] ] } diff --git a/game/CMakeLists.txt b/game/CMakeLists.txt index 5499726c49..c62dd6fc56 100644 --- a/game/CMakeLists.txt +++ b/game/CMakeLists.txt @@ -82,6 +82,7 @@ set(RUNTIME_SOURCE mips2c/jak1_functions/tfrag.cpp mips2c/jak1_functions/tie_methods.cpp mips2c/jak1_functions/time_of_day.cpp + mips2c/jak2_functions/collide_cache.cpp mips2c/jak2_functions/collide_edge_grab.cpp mips2c/jak2_functions/collide_func.cpp mips2c/jak2_functions/collide_hash.cpp diff --git a/game/common/vu.h b/game/common/vu.h index ffecbdda5b..b6c2b84bbb 100644 --- a/game/common/vu.h +++ b/game/common/vu.h @@ -95,6 +95,13 @@ struct alignas(16) Vf { data[3] = 0; } + void set_u32s(u32 xx, u32 yy, u32 zz, u32 ww) { + memcpy(&data[0], &xx, 4); + memcpy(&data[1], &yy, 4); + memcpy(&data[2], &zz, 4); + memcpy(&data[3], &ww, 4); + } + u16 x_as_u16() const { u16 result; memcpy(&result, &data[0], 2); diff --git a/game/kernel/jak2/kscheme.cpp b/game/kernel/jak2/kscheme.cpp index 4fdcaa0878..58286a3d4a 100644 --- a/game/kernel/jak2/kscheme.cpp +++ b/game/kernel/jak2/kscheme.cpp @@ -1769,9 +1769,11 @@ u64 loadc(const char* /*file_name*/, kheapinfo* /*heap*/, u32 /*flags*/) { return 0; } -u64 loado(u32 /*file_name_in*/, u32 /*heap_in*/) { - ASSERT(false); - return 0; +u64 loado(u32 file_name_in, u32 /*heap_in*/) { + // ASSERT(false); + Ptr file_name(file_name_in); + printf("****** CALL TO loado(%s) ******\n", file_name->data()); + return s7.offset; } /*! diff --git a/game/mips2c/jak2_functions/collide_cache.cpp b/game/mips2c/jak2_functions/collide_cache.cpp new file mode 100644 index 0000000000..b074931aae --- /dev/null +++ b/game/mips2c/jak2_functions/collide_cache.cpp @@ -0,0 +1,1874 @@ +//--------------------------MIPS2C--------------------- +// clang-format off +#include "game/mips2c/mips2c_private.h" +#include "game/kernel/jak2/kscheme.h" +using ::jak2::intern_from_c; +namespace Mips2C::jak2 { +namespace method_10_collide_shape_prim_mesh { +struct Cache { + void* cheat_mode; // *cheat-mode* + void* fake_scratchpad_data; // *fake-scratchpad-data* + void* debug; // debug + void* format; // format + void* print_exceeded_max_cache_tris; // print-exceeded-max-cache-tris +} cache; + +u64 execute(void* ctxt) { + auto* c = (ExecutionContext*)ctxt; + bool bc = false; + u32 call_addr = 0; + c->daddiu(sp, sp, -96); // daddiu sp, sp, -96 + c->sd(ra, 0, sp); // sd ra, 0(sp) + c->sd(fp, 8, sp); // sd fp, 8(sp) + c->mov64(fp, t9); // or fp, t9, r0 + c->sq(s2, 16, sp); // sq s2, 16(sp) + c->sq(s3, 32, sp); // sq s3, 32(sp) + c->sq(s4, 48, sp); // sq s4, 48(sp) + c->sq(s5, 64, sp); // sq s5, 64(sp) + c->sq(gp, 80, sp); // sq gp, 80(sp) + c->mov64(s5, a0); // or s5, a0, r0 + c->mov64(gp, a1); // or gp, a1, r0 + // nop // sll r0, r0, 0 + c->lwu(s3, 60, s5); // lwu s3, 60(s5) + c->daddiu(v1, gp, 108); // daddiu v1, gp, 108 + c->lwu(a0, 4, gp); // lwu a0, 4(gp) + bc = c->sgpr64(s3) == c->sgpr64(s7); // beq s3, s7, L91 + // nop // sll r0, r0, 0 + if (bc) {goto block_14;} // branch non-likely + + c->addiu(a1, r0, 100); // addiu a1, r0, 100 + c->dsll(a2, a0, 1); // dsll a2, a0, 1 + bc = c->sgpr64(a0) == c->sgpr64(a1); // beq a0, a1, L89 + c->daddu(a0, a2, a0); // daddu a0, a2, a0 + if (bc) {goto block_11;} // branch non-likely + + c->dsll(a0, a0, 4); // dsll a0, a0, 4 + c->daddu(s4, v1, a0); // daddu s4, v1, a0 + c->mov64(a0, s3); // or a0, s3, r0 + c->lwu(v1, -4, a0); // lwu v1, -4(a0) + c->lwu(t9, 72, v1); // lwu t9, 72(v1) + c->lwu(v1, 0, s5); // lwu v1, 0(s5) + c->lwu(v1, 136, v1); // lwu v1, 136(v1) + c->lwu(v1, 128, v1); // lwu v1, 128(v1) + c->lb(a1, 8, s5); // lb a1, 8(s5) + c->dsll(a1, a1, 5); // dsll a1, a1, 5 + c->daddu(v1, v1, a1); // daddu v1, v1, a1 + c->lwu(v1, 28, v1); // lwu v1, 28(v1) + c->daddu(a1, r0, v1); // daddu a1, r0, v1 + get_fake_spad_addr2(a2, cache.fake_scratchpad_data, 0, c);// lui a2, 28672 + call_addr = c->gprs[t9].du32[0]; // function call: + c->sll(v0, ra, 0); // sll v0, ra, 0 + c->jalr(call_addr); // jalr ra, t9 + c->mov64(v1, v0); // or v1, v0, r0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->lwu(a1, 4, gp); // lwu a1, 4(gp) + c->addiu(a2, r0, 460); // addiu a2, r0, 460 + c->lwu(v1, 0, gp); // lwu v1, 0(gp) + c->dsll32(a0, a1, 0); // dsll32 a0, a1, 0 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf1, a0); // qmtc2.i vf1, a0 + // nop // sll r0, r0, 0 + c->dsubu(a0, a2, v1); // dsubu a0, a2, v1 + c->dsll(t2, v1, 6); // dsll t2, v1, 6 + bc = ((s64)c->sgpr64(a0)) < 0; // bltz a0, L90 + c->daddiu(a3, s3, 28); // daddiu a3, s3, 28 + if (bc) {goto block_12;} // branch non-likely + + c->mov64(a0, v1); // or a0, v1, r0 + c->lwu(t0, 4, s3); // lwu t0, 4(s3) + c->daddiu(t3, gp, 4908); // daddiu t3, gp, 4908 + c->lq(t1, 60, gp); // lq t1, 60(gp) + c->daddu(t2, t3, t2); // daddu t2, t3, t2 + c->lq(t3, 76, gp); // lq t3, 76(gp) + get_fake_spad_addr2(t4, cache.fake_scratchpad_data, 0, c);// lui t4, 28672 + c->lwu(t5, 8, gp); // lwu t5, 8(gp) + c->vsub(DEST::zw, vf1, vf0, vf0); // vsub.zw vf1, vf0, vf0 + // nop // sll r0, r0, 0 + + block_4: + bc = c->sgpr64(t0) == 0; // beq t0, r0, L88 + c->lbu(t6, 0, a3); // lbu t6, 0(a3) + if (bc) {goto block_9;} // branch non-likely + + c->daddiu(t0, t0, -1); // daddiu t0, t0, -1 + c->lbu(t7, 1, a3); // lbu t7, 1(a3) + c->dsll(t9, t6, 5); // dsll t9, t6, 5 + c->lbu(t6, 2, a3); // lbu t6, 2(a3) + c->dsll(t8, t7, 5); // dsll t8, t7, 5 + c->daddu(t7, t9, t4); // daddu t7, t9, t4 + c->dsll(t6, t6, 5); // dsll t6, t6, 5 + // nop // sll r0, r0, 0 + c->daddu(t8, t8, t4); // daddu t8, t8, t4 + c->lq(ra, 16, t7); // lq ra, 16(t7) + c->daddu(t6, t6, t4); // daddu t6, t6, t4 + c->lq(s2, 16, t8); // lq s2, 16(t8) + c->pminw(s3, ra, s2); // pminw s3, ra, s2 + c->lq(t9, 16, t6); // lq t9, 16(t6) + c->pmaxw(ra, ra, s2); // pmaxw ra, ra, s2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pminw(s3, s3, t9); // pminw s3, s3, t9 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pmaxw(t9, ra, t9); // pmaxw t9, ra, t9 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcgtw(ra, s3, t3); // pcgtw ra, s3, t3 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcgtw(s3, t1, t9); // pcgtw s3, t1, t9 + c->lwu(t9, 4, a3); // lwu t9, 4(a3) + c->por(ra, ra, s3); // por ra, ra, s3 + c->lq(t7, 0, t7); // lq t7, 0(t7) + c->ppach(ra, r0, ra); // ppach ra, r0, ra + c->lq(t8, 0, t8); // lq t8, 0(t8) + c->dsll(ra, ra, 16); // dsll ra, ra, 16 + c->lq(t6, 0, t6); // lq t6, 0(t6) + bc = c->sgpr64(ra) != 0; // bne ra, r0, L87 + c->daddiu(a3, a3, 8); // daddiu a3, a3, 8 + if (bc) {goto block_4;} // branch non-likely + + bc = c->sgpr64(v1) == c->sgpr64(a2); // beq v1, a2, L90 + c->sqc2(vf1, 48, t2); // sqc2 vf1, 48(t2) + if (bc) {goto block_12;} // branch non-likely + + c->and_(ra, t9, t5); // and ra, t9, t5 + c->sw(t9, 48, t2); // sw t9, 48(t2) + c->sw(s5, 52, t2); // sw s5, 52(t2) + c->sh(a1, 56, t2); // sh a1, 56(t2) + bc = c->sgpr64(ra) != 0; // bne ra, r0, L87 + c->sq(t7, 0, t2); // sq t7, 0(t2) + if (bc) {goto block_4;} // branch non-likely + + // nop // sll r0, r0, 0 + c->sq(t8, 16, t2); // sq t8, 16(t2) + c->daddiu(v1, v1, 1); // daddiu v1, v1, 1 + c->sq(t6, 32, t2); // sq t6, 32(t2) + //beq r0, r0, L87 // beq r0, r0, L87 + c->daddiu(t2, t2, 64); // daddiu t2, t2, 64 + goto block_4; // branch always + + + block_9: + c->dsubu(a3, v1, a0); // dsubu a3, v1, a0 + c->lwu(t0, 4, gp); // lwu t0, 4(gp) + bc = c->sgpr64(a3) == 0; // beq a3, r0, L91 + c->lq(a1, 12, s5); // lq a1, 12(s5) + if (bc) {goto block_14;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lq(a2, 28, s5); // lq a2, 28(s5) + // nop // sll r0, r0, 0 + c->sq(r0, 32, s4); // sq r0, 32(s4) + // nop // sll r0, r0, 0 + c->sh(a3, 42, s4); // sh a3, 42(s4) + // nop // sll r0, r0, 0 + c->sw(gp, 32, s4); // sw gp, 32(s4) + // nop // sll r0, r0, 0 + c->sw(s5, 36, s4); // sw s5, 36(s4) + // nop // sll r0, r0, 0 + c->sh(a0, 40, s4); // sh a0, 40(s4) + c->daddiu(a0, t0, 1); // daddiu a0, t0, 1 + c->sq(a1, 0, s4); // sq a1, 0(s4) + // nop // sll r0, r0, 0 + c->sq(a2, 16, s4); // sq a2, 16(s4) + // nop // sll r0, r0, 0 + c->sw(a0, 4, gp); // sw a0, 4(gp) + //beq r0, r0, L91 // beq r0, r0, L91 + c->sw(v1, 0, gp); // sw v1, 0(gp) + goto block_14; // branch always + + + block_11: + c->load_symbol2(t9, cache.format); // lw t9, format(s7) + c->addiu(a0, r0, 0); // addiu a0, r0, 0 + // daddiu a1, fp, L172 // daddiu a1, fp, L172 + call_addr = c->gprs[t9].du32[0]; // function call: + c->sll(v0, ra, 0); // sll v0, ra, 0 + // c->jalr(call_addr); // jalr ra, t9 + printf("ERROR: Exceeded max number of collide-cache prims!\n"); + //beq r0, r0, L91 // beq r0, r0, L91 + // nop // sll r0, r0, 0 + goto block_14; // branch always + + + block_12: + c->load_symbol_addr(v1, cache.debug); // daddiu v1, s7, debug + c->load_symbol2(a0, cache.cheat_mode); // lw a0, *cheat-mode*(s7) + bc = c->sgpr64(a0) != c->sgpr64(v1); // bne a0, v1, L91 + c->mov64(v1, s7); // or v1, s7, r0 + if (bc) {goto block_14;} // branch non-likely + + c->load_symbol2(t9, cache.print_exceeded_max_cache_tris);// lw t9, print-exceeded-max-cache-tris(s7) + call_addr = c->gprs[t9].du32[0]; // function call: + c->sll(v0, ra, 0); // sll v0, ra, 0 + c->jalr(call_addr); // jalr ra, t9 + c->mov64(v1, v0); // or v1, v0, r0 + + block_14: + c->gprs[v0].du64[0] = 0; // or v0, r0, r0 + c->ld(ra, 0, sp); // ld ra, 0(sp) + c->ld(fp, 8, sp); // ld fp, 8(sp) + c->lq(gp, 80, sp); // lq gp, 80(sp) + c->lq(s5, 64, sp); // lq s5, 64(sp) + c->lq(s4, 48, sp); // lq s4, 48(sp) + c->lq(s3, 32, sp); // lq s3, 32(sp) + c->lq(s2, 16, sp); // lq s2, 16(sp) + //jr ra // jr ra + c->daddiu(sp, sp, 96); // daddiu sp, sp, 96 + goto end_of_function; // return + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + end_of_function: + return c->gprs[v0].du64[0]; +} + +void link() { + cache.cheat_mode = intern_from_c("*cheat-mode*").c(); + cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); + cache.debug = intern_from_c("debug").c(); + cache.format = intern_from_c("format").c(); + cache.print_exceeded_max_cache_tris = intern_from_c("print-exceeded-max-cache-tris").c(); + gLinkedFunctionTable.reg("(method 10 collide-shape-prim-mesh)", execute, 256); +} + +} // namespace method_10_collide_shape_prim_mesh +} // namespace Mips2C + +//--------------------------MIPS2C--------------------- +// clang-format off +#include "game/mips2c/mips2c_private.h" +#include "game/kernel/jak2/kscheme.h" +using ::jak2::intern_from_c; +namespace Mips2C::jak2 { +namespace method_10_collide_shape_prim_sphere { +struct Cache { + void* format; // format +} cache; + +u64 execute(void* ctxt) { + auto* c = (ExecutionContext*)ctxt; + bool bc = false; + u32 call_addr = 0; + c->daddiu(sp, sp, -16); // daddiu sp, sp, -16 + c->sd(ra, 0, sp); // sd ra, 0(sp) + c->sd(fp, 8, sp); // sd fp, 8(sp) + c->mov64(fp, t9); // or fp, t9, r0 + // nop // sll r0, r0, 0 + c->daddiu(t0, a1, 108); // daddiu t0, a1, 108 + c->lwu(a3, 4, a1); // lwu a3, 4(a1) + c->addiu(t1, r0, 100); // addiu t1, r0, 100 + c->lq(v1, 12, a0); // lq v1, 12(a0) + c->dsll(t2, a3, 1); // dsll t2, a3, 1 + c->lq(a2, 28, a0); // lq a2, 28(a0) + bc = c->sgpr64(a3) == c->sgpr64(t1); // beq a3, t1, L84 + c->daddu(t1, t2, a3); // daddu t1, t2, a3 + if (bc) {goto block_2;} // branch non-likely + + c->dsll(t1, t1, 4); // dsll t1, t1, 4 + c->daddu(t0, t0, t1); // daddu t0, t0, t1 + c->daddiu(a3, a3, 1); // daddiu a3, a3, 1 + c->sq(r0, 32, t0); // sq r0, 32(t0) + // nop // sll r0, r0, 0 + c->sw(a0, 36, t0); // sw a0, 36(t0) + // nop // sll r0, r0, 0 + c->sq(v1, 0, t0); // sq v1, 0(t0) + // nop // sll r0, r0, 0 + c->sq(a2, 16, t0); // sq a2, 16(t0) + // nop // sll r0, r0, 0 + c->sw(a3, 4, a1); // sw a3, 4(a1) + // nop // sll r0, r0, 0 + c->sw(a1, 32, t0); // sw a1, 32(t0) + c->mov64(v0, s7); // or v0, s7, r0 + //beq r0, r0, L85 // beq r0, r0, L85 + // nop // sll r0, r0, 0 + goto block_3; // branch always + + + block_2: + c->load_symbol2(t9, cache.format); // lw t9, format(s7) + c->addiu(a0, r0, 0); // addiu a0, r0, 0 + // daddiu a1, fp, L172 // daddiu a1, fp, L172 + call_addr = c->gprs[t9].du32[0]; // function call: + c->sll(v0, ra, 0); // sll v0, ra, 0 + // c->jalr(call_addr); // jalr ra, t9 + printf("ERROR: Exceeded max number of collide-cache prims!\n"); + + block_3: + c->ld(ra, 0, sp); // ld ra, 0(sp) + c->ld(fp, 8, sp); // ld fp, 8(sp) + //jr ra // jr ra + c->daddiu(sp, sp, 16); // daddiu sp, sp, 16 + goto end_of_function; // return + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + end_of_function: + return c->gprs[v0].du64[0]; +} + +void link() { + cache.format = intern_from_c("format").c(); + gLinkedFunctionTable.reg("(method 10 collide-shape-prim-sphere)", execute, 128); +} + +} // namespace method_10_collide_shape_prim_sphere +} // namespace Mips2C +//--------------------------MIPS2C--------------------- +// clang-format off +#include "game/mips2c/mips2c_private.h" +#include "game/kernel/jak2/kscheme.h" +using ::jak2::intern_from_c; +namespace Mips2C::jak2 { +namespace method_10_collide_shape_prim_group { +u64 execute(void* ctxt) { + auto* c = (ExecutionContext*)ctxt; + bool bc = false; + u32 call_addr = 0; + c->daddiu(sp, sp, -112); // daddiu sp, sp, -112 + c->sd(ra, 0, sp); // sd ra, 0(sp) + c->sq(s1, 16, sp); // sq s1, 16(sp) + c->sq(s2, 32, sp); // sq s2, 32(sp) + c->sq(s3, 48, sp); // sq s3, 48(sp) + c->sq(s4, 64, sp); // sq s4, 64(sp) + c->sq(s5, 80, sp); // sq s5, 80(sp) + c->sq(gp, 96, sp); // sq gp, 96(sp) + c->mov64(gp, a1); // or gp, a1, r0 + c->mov64(s5, a0); // or s5, a0, r0 + c->lbu(s4, 60, a0); // lbu s4, 60(a0) + // nop // sll r0, r0, 0 + c->lq(s3, 60, gp); // lq s3, 60(gp) + // nop // sll r0, r0, 0 + c->lq(s2, 76, gp); // lq s2, 76(gp) + // nop // sll r0, r0, 0 + c->lwu(s1, 92, gp); // lwu s1, 92(gp) + + block_1: + bc = c->sgpr64(s4) == 0; // beq s4, r0, L82 + c->daddiu(s5, s5, 80); // daddiu s5, s5, 80 + if (bc) {goto block_5;} // branch non-likely + + + block_2: + c->daddiu(s4, s4, -1); // daddiu s4, s4, -1 + c->lqc2(vf1, 12, s5); // lqc2 vf1, 12(s5) + // nop // sll r0, r0, 0 + c->lwu(v1, 28, s5); // lwu v1, 28(s5) + c->vsub_bc(DEST::xyzw, BC::w, vf2, vf1, vf1); // vsubw.xyzw vf2, vf1, vf1 + c->and_(v1, s1, v1); // and v1, s1, v1 + c->vadd_bc(DEST::xyzw, BC::w, vf3, vf1, vf1); // vaddw.xyzw vf3, vf1, vf1 + // nop // sll r0, r0, 0 + bc = c->sgpr64(v1) == 0; // beq v1, r0, L80 + // nop // sll r0, r0, 0 + if (bc) {goto block_1;} // branch non-likely + + c->vftoi0(DEST::xyzw, vf4, vf2); // vftoi0.xyzw vf4, vf2 + c->vftoi0(DEST::xyzw, vf5, vf3); // vftoi0.xyzw vf5, vf3 + c->mov128_gpr_vf(a0, vf4); // qmfc2.i a0, vf4 + c->mov128_gpr_vf(v1, vf5); // qmfc2.i v1, vf5 + c->pcgtw(a0, a0, s2); // pcgtw a0, a0, s2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcgtw(v1, s3, v1); // pcgtw v1, s3, v1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->por(v1, a0, v1); // por v1, a0, v1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->ppach(v1, r0, v1); // ppach v1, r0, v1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->dsll(v1, v1, 16); // dsll v1, v1, 16 + // nop // sll r0, r0, 0 + bc = c->sgpr64(v1) != 0; // bne v1, r0, L80 + // nop // sll r0, r0, 0 + if (bc) {goto block_1;} // branch non-likely + + c->mov64(a0, s5); // or a0, s5, r0 + c->lwu(v1, -4, a0); // lwu v1, -4(a0) + c->lwu(t9, 56, v1); // lwu t9, 56(v1) + c->mov64(a1, gp); // or a1, gp, r0 + call_addr = c->gprs[t9].du32[0]; // function call: + c->sll(v0, ra, 0); // sll v0, ra, 0 + c->jalr(call_addr); // jalr ra, t9 + c->mov64(v1, v0); // or v1, v0, r0 + bc = c->sgpr64(s4) != 0; // bne s4, r0, L81 + c->daddiu(s5, s5, 80); // daddiu s5, s5, 80 + if (bc) {goto block_2;} // branch non-likely + + + block_5: + c->gprs[v0].du64[0] = 0; // or v0, r0, r0 + c->ld(ra, 0, sp); // ld ra, 0(sp) + c->lq(gp, 96, sp); // lq gp, 96(sp) + c->lq(s5, 80, sp); // lq s5, 80(sp) + c->lq(s4, 64, sp); // lq s4, 64(sp) + c->lq(s3, 48, sp); // lq s3, 48(sp) + c->lq(s2, 32, sp); // lq s2, 32(sp) + c->lq(s1, 16, sp); // lq s1, 16(sp) + //jr ra // jr ra + c->daddiu(sp, sp, 112); // daddiu sp, sp, 112 + goto end_of_function; // return + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + end_of_function: + return c->gprs[v0].du64[0]; +} + +void link() { + gLinkedFunctionTable.reg("(method 10 collide-shape-prim-group)", execute, 128); +} + +} // namespace method_10_collide_shape_prim_group +} // namespace Mips2C + +//--------------------------MIPS2C--------------------- +// clang-format off +#include "game/mips2c/mips2c_private.h" +#include "game/kernel/jak2/kscheme.h" +using ::jak2::intern_from_c; +namespace Mips2C::jak2 { +namespace method_11_collide_shape_prim_mesh { +struct Cache { + void* cheat_mode; // *cheat-mode* + void* fake_scratchpad_data; // *fake-scratchpad-data* + void* debug; // debug + void* format; // format + void* print_exceeded_max_cache_tris; // print-exceeded-max-cache-tris +} cache; + +u64 execute(void* ctxt) { + auto* c = (ExecutionContext*)ctxt; + bool bc = false; + u32 call_addr = 0; + c->daddiu(sp, sp, -96); // daddiu sp, sp, -96 + c->sd(ra, 0, sp); // sd ra, 0(sp) + c->sd(fp, 8, sp); // sd fp, 8(sp) + c->mov64(fp, t9); // or fp, t9, r0 + c->sq(s2, 16, sp); // sq s2, 16(sp) + c->sq(s3, 32, sp); // sq s3, 32(sp) + c->sq(s4, 48, sp); // sq s4, 48(sp) + c->sq(s5, 64, sp); // sq s5, 64(sp) + c->sq(gp, 80, sp); // sq gp, 80(sp) + c->mov64(s5, a0); // or s5, a0, r0 + c->mov64(gp, a1); // or gp, a1, r0 + c->mov64(s3, a2); // or s3, a2, r0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->lwu(s2, 60, s5); // lwu s2, 60(s5) + c->daddiu(v1, gp, 108); // daddiu v1, gp, 108 + c->lwu(a0, 4, gp); // lwu a0, 4(gp) + bc = c->sgpr64(s2) == c->sgpr64(s7); // beq s2, s7, L62 + // nop // sll r0, r0, 0 + if (bc) {goto block_14;} // branch non-likely + + c->addiu(a1, r0, 100); // addiu a1, r0, 100 + c->dsll(a2, a0, 1); // dsll a2, a0, 1 + bc = c->sgpr64(a0) == c->sgpr64(a1); // beq a0, a1, L60 + c->daddu(a0, a2, a0); // daddu a0, a2, a0 + if (bc) {goto block_11;} // branch non-likely + + c->dsll(a0, a0, 4); // dsll a0, a0, 4 + c->daddu(s4, v1, a0); // daddu s4, v1, a0 + c->mov64(a0, s2); // or a0, s2, r0 + c->lwu(v1, -4, a0); // lwu v1, -4(a0) + c->lwu(t9, 76, v1); // lwu t9, 76(v1) + c->lwu(v1, 0, s5); // lwu v1, 0(s5) + c->lwu(v1, 136, v1); // lwu v1, 136(v1) + c->lwu(v1, 128, v1); // lwu v1, 128(v1) + c->lb(a1, 8, s5); // lb a1, 8(s5) + c->dsll(a1, a1, 5); // dsll a1, a1, 5 + c->daddu(v1, v1, a1); // daddu v1, v1, a1 + c->lwu(v1, 28, v1); // lwu v1, 28(v1) + c->daddu(a1, r0, v1); // daddu a1, r0, v1 + c->daddiu(a2, s3, 288); // daddiu a2, s3, 288 + get_fake_spad_addr2(a3, cache.fake_scratchpad_data, 0, c);// lui a3, 28672 + call_addr = c->gprs[t9].du32[0]; // function call: + c->sll(v0, ra, 0); // sll v0, ra, 0 + c->jalr(call_addr); // jalr ra, t9 + c->mov64(v1, v0); // or v1, v0, r0 + // nop // sll r0, r0, 0 + c->lwu(a0, 4, gp); // lwu a0, 4(gp) + c->addiu(a1, r0, 460); // addiu a1, r0, 460 + c->lwu(v1, 0, gp); // lwu v1, 0(gp) + c->dsll32(a0, a0, 0); // dsll32 a0, a0, 0 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf1, a0); // qmtc2.i vf1, a0 + // nop // sll r0, r0, 0 + c->dsubu(a0, a1, v1); // dsubu a0, a1, v1 + c->dsll(t1, v1, 6); // dsll t1, v1, 6 + bc = ((s64)c->sgpr64(a0)) < 0; // bltz a0, L61 + c->daddiu(a2, s2, 28); // daddiu a2, s2, 28 + if (bc) {goto block_12;} // branch non-likely + + c->mov64(a0, v1); // or a0, v1, r0 + c->lwu(a3, 4, s2); // lwu a3, 4(s2) + c->daddiu(t2, gp, 4908); // daddiu t2, gp, 4908 + c->lq(t0, 368, s3); // lq t0, 368(s3) + c->daddu(t1, t2, t1); // daddu t1, t2, t1 + c->lq(t2, 384, s3); // lq t2, 384(s3) + get_fake_spad_addr2(t3, cache.fake_scratchpad_data, 0, c);// lui t3, 28672 + c->lwu(t4, 8, gp); // lwu t4, 8(gp) + c->vsub(DEST::zw, vf1, vf0, vf0); // vsub.zw vf1, vf0, vf0 + // nop // sll r0, r0, 0 + + block_4: + bc = c->sgpr64(a3) == 0; // beq a3, r0, L59 + c->lbu(t5, 0, a2); // lbu t5, 0(a2) + if (bc) {goto block_9;} // branch non-likely + + c->daddiu(a3, a3, -1); // daddiu a3, a3, -1 + c->lbu(t6, 1, a2); // lbu t6, 1(a2) + c->dsll(t8, t5, 5); // dsll t8, t5, 5 + c->lbu(t5, 2, a2); // lbu t5, 2(a2) + c->dsll(t7, t6, 5); // dsll t7, t6, 5 + c->daddu(t6, t8, t3); // daddu t6, t8, t3 + c->dsll(t5, t5, 5); // dsll t5, t5, 5 + // nop // sll r0, r0, 0 + c->daddu(t7, t7, t3); // daddu t7, t7, t3 + c->lq(t9, 16, t6); // lq t9, 16(t6) + c->daddu(t5, t5, t3); // daddu t5, t5, t3 + c->lq(s3, 16, t7); // lq s3, 16(t7) + // nop // sll r0, r0, 0 + c->lq(t8, 16, t5); // lq t8, 16(t5) + c->pminw(ra, t9, s3); // pminw ra, t9, s3 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pmaxw(t9, t9, s3); // pmaxw t9, t9, s3 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pminw(ra, ra, t8); // pminw ra, ra, t8 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pmaxw(t8, t9, t8); // pmaxw t8, t9, t8 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcgtw(t9, ra, t2); // pcgtw t9, ra, t2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcgtw(ra, t0, t8); // pcgtw ra, t0, t8 + c->lwu(t8, 4, a2); // lwu t8, 4(a2) + c->por(t9, t9, ra); // por t9, t9, ra + c->lq(t6, 0, t6); // lq t6, 0(t6) + c->ppach(t9, r0, t9); // ppach t9, r0, t9 + c->lq(t7, 0, t7); // lq t7, 0(t7) + c->dsll(t9, t9, 16); // dsll t9, t9, 16 + c->lq(t5, 0, t5); // lq t5, 0(t5) + bc = c->sgpr64(t9) != 0; // bne t9, r0, L58 + c->daddiu(a2, a2, 8); // daddiu a2, a2, 8 + if (bc) {goto block_4;} // branch non-likely + + bc = c->sgpr64(v1) == c->sgpr64(a1); // beq v1, a1, L61 + c->sqc2(vf1, 48, t1); // sqc2 vf1, 48(t1) + if (bc) {goto block_12;} // branch non-likely + + c->and_(t9, t8, t4); // and t9, t8, t4 + c->sw(t8, 48, t1); // sw t8, 48(t1) + // nop // sll r0, r0, 0 + c->sw(s5, 52, t1); // sw s5, 52(t1) + bc = c->sgpr64(t9) != 0; // bne t9, r0, L58 + c->sq(t6, 0, t1); // sq t6, 0(t1) + if (bc) {goto block_4;} // branch non-likely + + c->daddiu(v1, v1, 1); // daddiu v1, v1, 1 + c->sq(t7, 16, t1); // sq t7, 16(t1) + // nop // sll r0, r0, 0 + c->sq(t5, 32, t1); // sq t5, 32(t1) + //beq r0, r0, L58 // beq r0, r0, L58 + c->daddiu(t1, t1, 64); // daddiu t1, t1, 64 + goto block_4; // branch always + + + block_9: + c->dsubu(a3, v1, a0); // dsubu a3, v1, a0 + c->lwu(t0, 4, gp); // lwu t0, 4(gp) + bc = c->sgpr64(a3) == 0; // beq a3, r0, L62 + c->lq(a1, 12, s5); // lq a1, 12(s5) + if (bc) {goto block_14;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lq(a2, 28, s5); // lq a2, 28(s5) + // nop // sll r0, r0, 0 + c->sq(r0, 32, s4); // sq r0, 32(s4) + // nop // sll r0, r0, 0 + c->sh(a3, 42, s4); // sh a3, 42(s4) + // nop // sll r0, r0, 0 + c->sw(gp, 32, s4); // sw gp, 32(s4) + // nop // sll r0, r0, 0 + c->sw(s5, 36, s4); // sw s5, 36(s4) + // nop // sll r0, r0, 0 + c->sh(a0, 40, s4); // sh a0, 40(s4) + c->daddiu(a0, t0, 1); // daddiu a0, t0, 1 + c->sq(a1, 0, s4); // sq a1, 0(s4) + // nop // sll r0, r0, 0 + c->sq(a2, 16, s4); // sq a2, 16(s4) + // nop // sll r0, r0, 0 + c->sw(a0, 4, gp); // sw a0, 4(gp) + //beq r0, r0, L62 // beq r0, r0, L62 + c->sw(v1, 0, gp); // sw v1, 0(gp) + goto block_14; // branch always + + + block_11: + c->load_symbol2(t9, cache.format); // lw t9, format(s7) + c->addiu(a0, r0, 0); // addiu a0, r0, 0 + // daddiu a1, fp, L172 // daddiu a1, fp, L172 + call_addr = c->gprs[t9].du32[0]; // function call: + c->sll(v0, ra, 0); // sll v0, ra, 0 + // c->jalr(call_addr); // jalr ra, t9 + printf("ERROR: Exceeded max number of collide-cache prims!\n"); + //beq r0, r0, L62 // beq r0, r0, L62 + // nop // sll r0, r0, 0 + goto block_14; // branch always + + + block_12: + c->load_symbol_addr(v1, cache.debug); // daddiu v1, s7, debug + c->load_symbol2(a0, cache.cheat_mode); // lw a0, *cheat-mode*(s7) + bc = c->sgpr64(a0) != c->sgpr64(v1); // bne a0, v1, L62 + c->mov64(v1, s7); // or v1, s7, r0 + if (bc) {goto block_14;} // branch non-likely + + c->load_symbol2(t9, cache.print_exceeded_max_cache_tris);// lw t9, print-exceeded-max-cache-tris(s7) + call_addr = c->gprs[t9].du32[0]; // function call: + c->sll(v0, ra, 0); // sll v0, ra, 0 + c->jalr(call_addr); // jalr ra, t9 + c->mov64(v1, v0); // or v1, v0, r0 + + block_14: + c->gprs[v0].du64[0] = 0; // or v0, r0, r0 + c->ld(ra, 0, sp); // ld ra, 0(sp) + c->ld(fp, 8, sp); // ld fp, 8(sp) + c->lq(gp, 80, sp); // lq gp, 80(sp) + c->lq(s5, 64, sp); // lq s5, 64(sp) + c->lq(s4, 48, sp); // lq s4, 48(sp) + c->lq(s3, 32, sp); // lq s3, 32(sp) + c->lq(s2, 16, sp); // lq s2, 16(sp) + //jr ra // jr ra + c->daddiu(sp, sp, 96); // daddiu sp, sp, 96 + goto end_of_function; // return + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + end_of_function: + return c->gprs[v0].du64[0]; +} + +void link() { + cache.cheat_mode = intern_from_c("*cheat-mode*").c(); + cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); + cache.debug = intern_from_c("debug").c(); + cache.format = intern_from_c("format").c(); + cache.print_exceeded_max_cache_tris = intern_from_c("print-exceeded-max-cache-tris").c(); + gLinkedFunctionTable.reg("(method 11 collide-shape-prim-mesh)", execute, 128); +} + +} // namespace method_11_collide_shape_prim_mesh +} // namespace Mips2C + +//--------------------------MIPS2C--------------------- +// clang-format off +#include "game/mips2c/mips2c_private.h" +#include "game/kernel/jak2/kscheme.h" +using ::jak2::intern_from_c; +namespace Mips2C::jak2 { +namespace method_11_collide_shape_prim_sphere { +struct Cache { + void* format; // format +} cache; + +u64 execute(void* ctxt) { + auto* c = (ExecutionContext*)ctxt; + bool bc = false; + u32 call_addr = 0; + c->daddiu(sp, sp, -16); // daddiu sp, sp, -16 + c->sd(ra, 0, sp); // sd ra, 0(sp) + c->sd(fp, 8, sp); // sd fp, 8(sp) + c->mov64(fp, t9); // or fp, t9, r0 + // nop // sll r0, r0, 0 + c->daddiu(t0, a1, 108); // daddiu t0, a1, 108 + c->lwu(a3, 4, a1); // lwu a3, 4(a1) + c->addiu(t1, r0, 100); // addiu t1, r0, 100 + c->lq(v1, 12, a0); // lq v1, 12(a0) + c->dsll(t2, a3, 1); // dsll t2, a3, 1 + c->lq(a2, 28, a0); // lq a2, 28(a0) + bc = c->sgpr64(a3) == c->sgpr64(t1); // beq a3, t1, L55 + c->daddu(t1, t2, a3); // daddu t1, t2, a3 + if (bc) {goto block_2;} // branch non-likely + + c->dsll(t1, t1, 4); // dsll t1, t1, 4 + c->daddu(t0, t0, t1); // daddu t0, t0, t1 + c->daddiu(a3, a3, 1); // daddiu a3, a3, 1 + c->sq(r0, 32, t0); // sq r0, 32(t0) + // nop // sll r0, r0, 0 + c->sw(a0, 36, t0); // sw a0, 36(t0) + // nop // sll r0, r0, 0 + c->sq(v1, 0, t0); // sq v1, 0(t0) + // nop // sll r0, r0, 0 + c->sq(a2, 16, t0); // sq a2, 16(t0) + // nop // sll r0, r0, 0 + c->sw(a3, 4, a1); // sw a3, 4(a1) + // nop // sll r0, r0, 0 + c->sw(a1, 32, t0); // sw a1, 32(t0) + c->mov64(v0, s7); // or v0, s7, r0 + //beq r0, r0, L56 // beq r0, r0, L56 + // nop // sll r0, r0, 0 + goto block_3; // branch always + + + block_2: + c->load_symbol2(t9, cache.format); // lw t9, format(s7) + c->addiu(a0, r0, 0); // addiu a0, r0, 0 + // daddiu a1, fp, L172 // daddiu a1, fp, L172 + call_addr = c->gprs[t9].du32[0]; // function call: + c->sll(v0, ra, 0); // sll v0, ra, 0 + // c->jalr(call_addr); // jalr ra, t9 + printf("ERROR: Exceeded max number of collide-cache prims!\n"); + + block_3: + c->ld(ra, 0, sp); // ld ra, 0(sp) + c->ld(fp, 8, sp); // ld fp, 8(sp) + //jr ra // jr ra + c->daddiu(sp, sp, 16); // daddiu sp, sp, 16 + goto end_of_function; // return + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + end_of_function: + return c->gprs[v0].du64[0]; +} + +void link() { + cache.format = intern_from_c("format").c(); + gLinkedFunctionTable.reg("(method 11 collide-shape-prim-sphere)", execute, 128); +} + +} // namespace method_11_collide_shape_prim_sphere +} // namespace Mips2C + + +//--------------------------MIPS2C--------------------- +// clang-format off +#include "game/mips2c/mips2c_private.h" +#include "game/kernel/jak2/kscheme.h" +using ::jak2::intern_from_c; +namespace Mips2C::jak2 { +namespace method_11_collide_shape_prim_group { +u64 execute(void* ctxt) { + auto* c = (ExecutionContext*)ctxt; + bool bc = false; + u32 call_addr = 0; + c->daddiu(sp, sp, -128); // daddiu sp, sp, -128 + c->sd(ra, 0, sp); // sd ra, 0(sp) + c->sq(s0, 16, sp); // sq s0, 16(sp) + c->sq(s1, 32, sp); // sq s1, 32(sp) + c->sq(s2, 48, sp); // sq s2, 48(sp) + c->sq(s3, 64, sp); // sq s3, 64(sp) + c->sq(s4, 80, sp); // sq s4, 80(sp) + c->sq(s5, 96, sp); // sq s5, 96(sp) + c->sq(gp, 112, sp); // sq gp, 112(sp) + c->mov64(gp, a1); // or gp, a1, r0 + c->mov64(s5, a2); // or s5, a2, r0 + c->mov64(s4, a0); // or s4, a0, r0 + c->lbu(s3, 60, a0); // lbu s3, 60(a0) + // nop // sll r0, r0, 0 + c->lq(s2, 368, s5); // lq s2, 368(s5) + // nop // sll r0, r0, 0 + c->lq(s1, 384, s5); // lq s1, 384(s5) + // nop // sll r0, r0, 0 + c->lwu(s0, 92, gp); // lwu s0, 92(gp) + // nop // sll r0, r0, 0 + c->lqc2(vf28, 288, s5); // lqc2 vf28, 288(s5) + // nop // sll r0, r0, 0 + c->lqc2(vf29, 304, s5); // lqc2 vf29, 304(s5) + // nop // sll r0, r0, 0 + c->lqc2(vf30, 320, s5); // lqc2 vf30, 320(s5) + // nop // sll r0, r0, 0 + c->lqc2(vf31, 336, s5); // lqc2 vf31, 336(s5) + + block_1: + bc = c->sgpr64(s3) == 0; // beq s3, r0, L53 + c->daddiu(s4, s4, 80); // daddiu s4, s4, 80 + if (bc) {goto block_5;} // branch non-likely + + + block_2: + c->daddiu(s3, s3, -1); // daddiu s3, s3, -1 + c->lqc2(vf1, 12, s4); // lqc2 vf1, 12(s4) + // nop // sll r0, r0, 0 + c->lwu(v1, 28, s4); // lwu v1, 28(s4) + c->vmula_bc(DEST::xyzw, BC::w, vf31, vf0); // vmulaw.xyzw acc, vf31, vf0 + // nop // sll r0, r0, 0 + c->vmadda_bc(DEST::xyzw, BC::x, vf28, vf1); // vmaddax.xyzw acc, vf28, vf1 + c->and_(v1, s0, v1); // and v1, s0, v1 + c->vmadda_bc(DEST::xyzw, BC::y, vf29, vf1); // vmadday.xyzw acc, vf29, vf1 + // nop // sll r0, r0, 0 + bc = c->sgpr64(v1) == 0; // beq v1, r0, L51 + c->vmadd_bc(DEST::xyzw, BC::z, vf10, vf30, vf1); // vmaddz.xyzw vf10, vf30, vf1 + if (bc) {goto block_1;} // branch non-likely + + c->vsub_bc(DEST::xyz, BC::w, vf2, vf10, vf1); // vsubw.xyz vf2, vf10, vf1 + // nop // sll r0, r0, 0 + c->vadd_bc(DEST::xyz, BC::w, vf3, vf10, vf1); // vaddw.xyz vf3, vf10, vf1 + // nop // sll r0, r0, 0 + c->vftoi0(DEST::xyzw, vf4, vf2); // vftoi0.xyzw vf4, vf2 + // nop // sll r0, r0, 0 + c->vftoi0(DEST::xyzw, vf5, vf3); // vftoi0.xyzw vf5, vf3 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(a0, vf4); // qmfc2.i a0, vf4 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(v1, vf5); // qmfc2.i v1, vf5 + // nop // sll r0, r0, 0 + c->pcgtw(a0, a0, s1); // pcgtw a0, a0, s1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcgtw(v1, s2, v1); // pcgtw v1, s2, v1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->por(v1, a0, v1); // por v1, a0, v1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->ppach(v1, r0, v1); // ppach v1, r0, v1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->dsll(v1, v1, 16); // dsll v1, v1, 16 + // nop // sll r0, r0, 0 + bc = c->sgpr64(v1) != 0; // bne v1, r0, L51 + // nop // sll r0, r0, 0 + if (bc) {goto block_1;} // branch non-likely + + c->mov64(a0, s4); // or a0, s4, r0 + c->lwu(v1, -4, a0); // lwu v1, -4(a0) + c->lwu(t9, 60, v1); // lwu t9, 60(v1) + c->mov64(a1, gp); // or a1, gp, r0 + c->mov64(a2, s5); // or a2, s5, r0 + call_addr = c->gprs[t9].du32[0]; // function call: + c->sll(v0, ra, 0); // sll v0, ra, 0 + c->jalr(call_addr); // jalr ra, t9 + c->mov64(v1, v0); // or v1, v0, r0 + bc = c->sgpr64(s3) != 0; // bne s3, r0, L52 + c->daddiu(s4, s4, 80); // daddiu s4, s4, 80 + if (bc) {goto block_2;} // branch non-likely + + + block_5: + c->gprs[v0].du64[0] = 0; // or v0, r0, r0 + c->ld(ra, 0, sp); // ld ra, 0(sp) + c->lq(gp, 112, sp); // lq gp, 112(sp) + c->lq(s5, 96, sp); // lq s5, 96(sp) + c->lq(s4, 80, sp); // lq s4, 80(sp) + c->lq(s3, 64, sp); // lq s3, 64(sp) + c->lq(s2, 48, sp); // lq s2, 48(sp) + c->lq(s1, 32, sp); // lq s1, 32(sp) + c->lq(s0, 16, sp); // lq s0, 16(sp) + //jr ra // jr ra + c->daddiu(sp, sp, 128); // daddiu sp, sp, 128 + goto end_of_function; // return + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + end_of_function: + return c->gprs[v0].du64[0]; +} + +void link() { + gLinkedFunctionTable.reg("(method 11 collide-shape-prim-group)", execute, 256); +} + +} // namespace method_11_collide_shape_prim_group +} // namespace Mips2C +//--------------------------MIPS2C--------------------- +// clang-format off +#include "game/mips2c/mips2c_private.h" +#include "game/kernel/jak2/kscheme.h" +using ::jak2::intern_from_c; +namespace Mips2C::jak2 { +namespace method_9_collide_cache_prim { +struct Cache { + void* moving_sphere_triangle_intersect; // moving-sphere-triangle-intersect +} cache; + +u64 execute(void* ctxt) { + auto* c = (ExecutionContext*)ctxt; + bool bc = false; + u32 call_addr = 0; + bool cop1_bc = false; + c->daddiu(sp, sp, -672); // daddiu sp, sp, -672 + c->sd(ra, 0, sp); // sd ra, 0(sp) + c->sq(s1, 576, sp); // sq s1, 576(sp) + c->sq(s2, 592, sp); // sq s2, 592(sp) + c->sq(s3, 608, sp); // sq s3, 608(sp) + c->sq(s4, 624, sp); // sq s4, 624(sp) + c->sq(s5, 640, sp); // sq s5, 640(sp) + c->sq(gp, 656, sp); // sq gp, 656(sp) + c->mov64(gp, a1); // or gp, a1, r0 + c->mov64(s5, a2); // or s5, a2, r0 + c->mov64(s4, a3); // or s4, a3, r0 + c->daddiu(s3, sp, 16); // daddiu s3, sp, 16 + // nop // sll r0, r0, 0 + c->mtc1(f0, r0); // mtc1 f0, r0 + c->sw(t1, 8, s3); // sw t1, 8(s3) + c->mtc1(f1, t0); // mtc1 f1, t0 + c->lhu(v1, 40, a0); // lhu v1, 40(a0) + // nop // sll r0, r0, 0 + c->lwu(a1, 32, a0); // lwu a1, 32(a0) + cop1_bc = c->fprs[f0] <= c->fprs[f1]; // c.le.s f0, f1 + c->dsll(v1, v1, 6); // dsll v1, v1, 6 + bc = cop1_bc; // bc1t L37 + c->daddiu(a1, a1, 4908); // daddiu a1, a1, 4908 + if (bc) {goto block_2;} // branch non-likely + + c->lui(a2, 16384); // lui a2, 16384 + c->mtc1(f1, a2); // mtc1 f1, a2 + + block_2: + c->daddu(s2, a1, v1); // daddu s2, a1, v1 + c->swc1(f1, 0, s3); // swc1 f1, 0(s3) + // nop // sll r0, r0, 0 + c->lhu(s1, 42, a0); // lhu s1, 42(a0) + // nop // sll r0, r0, 0 + c->swc1(f1, 4, s3); // swc1 f1, 4(s3) + + block_3: + bc = c->sgpr64(s1) == 0; // beq s1, r0, L40 + c->daddiu(s1, s1, -1); // daddiu s1, s1, -1 + if (bc) {goto block_14;} // branch non-likely + + c->load_symbol2(t9, cache.moving_sphere_triangle_intersect);// lw t9, moving-sphere-triangle-intersect(s7) + c->mov64(a0, s5); // or a0, s5, r0 + c->mov64(a1, s4); // or a1, s4, r0 + c->lwc1(f0, 12, s5); // lwc1 f0, 12(s5) + c->mfc1(a2, f0); // mfc1 a2, f0 + c->daddu(a3, r0, s2); // daddu a3, r0, s2 + c->daddiu(t0, s3, 64); // daddiu t0, s3, 64 + c->daddiu(t1, s3, 80); // daddiu t1, s3, 80 + call_addr = c->gprs[t9].du32[0]; // function call: + c->sll(v0, ra, 0); // sll v0, ra, 0 + c->jalr(call_addr); // jalr ra, t9 + c->mov64(v1, v0); // or v1, v0, r0 + // nop // sll r0, r0, 0 + c->mtc1(f0, r0); // mtc1 f0, r0 + c->lqc2(vf1, 0, s4); // lqc2 vf1, 0(s4) + c->mtc1(f2, v1); // mtc1 f2, v1 + c->lwc1(f1, 0, s3); // lwc1 f1, 0(s3) + cop1_bc = c->fprs[f2] < c->fprs[f0]; // c.lt.s f2, f0 + c->lqc2(vf2, 80, s3); // lqc2 vf2, 80(s3) + if (cop1_bc) { // bc1tl L38 + c->daddiu(s2, s2, 64); // daddiu s2, s2, 64 + goto block_3; + } + + block_6: + cop1_bc = c->fprs[f1] <= c->fprs[f2]; // c.le.s f1, f2 + c->lqc2(vf3, 64, s3); // lqc2 vf3, 64(s3) + if (cop1_bc) { // bc1tl L38 + c->daddiu(s2, s2, 64); // daddiu s2, s2, 64 + goto block_3; + } + + block_8: + c->vmul(DEST::xyzw, vf5, vf1, vf2); // vmul.xyzw vf5, vf1, vf2 + c->lqc2(vf4, 0, s5); // lqc2 vf4, 0(s5) + // nop // sll r0, r0, 0 + c->lwu(v1, 8, s3); // lwu v1, 8(s3) + c->vsub(DEST::xyzw, vf7, vf4, vf3); // vsub.xyzw vf7, vf4, vf3 + c->andi(v1, v1, 1); // andi v1, v1, 1 + bc = c->sgpr64(v1) == 0; // beq v1, r0, L39 + c->vadd_bc(DEST::x, BC::y, vf5, vf5, vf5); // vaddy.x vf5, vf5, vf5 + if (bc) {goto block_13;} // branch non-likely + + c->vmul(DEST::xyzw, vf6, vf7, vf2); // vmul.xyzw vf6, vf7, vf2 + // nop // sll r0, r0, 0 + c->vadd_bc(DEST::x, BC::z, vf5, vf5, vf5); // vaddz.x vf5, vf5, vf5 + // nop // sll r0, r0, 0 + c->vadd_bc(DEST::x, BC::y, vf6, vf6, vf6); // vaddy.x vf6, vf6, vf6 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(v1, vf5); // qmfc2.i v1, vf5 + // nop // sll r0, r0, 0 + c->mtc1(f3, v1); // mtc1 f3, v1 + // nop // sll r0, r0, 0 + cop1_bc = c->fprs[f0] <= c->fprs[f3]; // c.le.s f0, f3 + // nop // sll r0, r0, 0 + if (cop1_bc) { // bc1tl L38 + c->daddiu(s2, s2, 64); // daddiu s2, s2, 64 + goto block_3; + } + + block_11: + c->vadd_bc(DEST::x, BC::z, vf6, vf6, vf6); // vaddz.x vf6, vf6, vf6 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(v1, vf6); // qmfc2.i v1, vf6 + // nop // sll r0, r0, 0 + c->mtc1(f4, v1); // mtc1 f4, v1 + // nop // sll r0, r0, 0 + cop1_bc = c->fprs[f4] < c->fprs[f0]; // c.lt.s f4, f0 + // nop // sll r0, r0, 0 + if (cop1_bc) { // bc1tl L38 + c->daddiu(s2, s2, 64); // daddiu s2, s2, 64 + goto block_3; + } + + block_13: + c->lqc2(vf8, 0, s2); // lqc2 vf8, 0(s2) + c->lqc2(vf9, 16, s2); // lqc2 vf9, 16(s2) + c->lqc2(vf10, 32, s2); // lqc2 vf10, 32(s2) + c->lwu(v1, 48, s2); // lwu v1, 48(s2) + c->lw(a0, 52, s2); // lw a0, 52(s2) + c->swc1(f2, 0, s3); // swc1 f2, 0(s3) + c->sqc2(vf3, 48, gp); // sqc2 vf3, 48(gp) + c->sqc2(vf2, 64, gp); // sqc2 vf2, 64(gp) + c->sqc2(vf8, 0, gp); // sqc2 vf8, 0(gp) + c->sqc2(vf9, 16, gp); // sqc2 vf9, 16(gp) + c->sqc2(vf10, 32, gp); // sqc2 vf10, 32(gp) + c->sw(v1, 80, gp); // sw v1, 80(gp) + c->sw(a0, 84, gp); // sw a0, 84(gp) + //beq r0, r0, L38 // beq r0, r0, L38 + c->daddiu(s2, s2, 64); // daddiu s2, s2, 64 + goto block_3; // branch always + + + block_14: + c->lwc1(f1, 0, s3); // lwc1 f1, 0(s3) + c->lwc1(f5, 4, s3); // lwc1 f5, 4(s3) + cop1_bc = c->fprs[f1] == c->fprs[f5]; // c.eq.s f1, f5 + if (!cop1_bc) { // bc1fl L41 + c->mfc1(v0, f1); // mfc1 v0, f1 + goto block_17; + } + + block_16: + c->lui(v0, -13122); // lui v0, -13122 + c->ori(v0, v0, 48160); // ori v0, v0, 48160 + + block_17: + c->ld(ra, 0, sp); // ld ra, 0(sp) + c->lq(gp, 656, sp); // lq gp, 656(sp) + c->lq(s5, 640, sp); // lq s5, 640(sp) + c->lq(s4, 624, sp); // lq s4, 624(sp) + c->lq(s3, 608, sp); // lq s3, 608(sp) + c->lq(s2, 592, sp); // lq s2, 592(sp) + c->lq(s1, 576, sp); // lq s1, 576(sp) + //jr ra // jr ra + c->daddiu(sp, sp, 672); // daddiu sp, sp, 672 + goto end_of_function; // return + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + end_of_function: + return c->gprs[v0].du64[0]; +} + +void link() { + cache.moving_sphere_triangle_intersect = intern_from_c("moving-sphere-triangle-intersect").c(); + gLinkedFunctionTable.reg("(method 9 collide-cache-prim)", execute, 1024); +} + +} // namespace method_9_collide_cache_prim +} // namespace Mips2C + +//--------------------------MIPS2C--------------------- +// clang-format off +#include "game/mips2c/mips2c_private.h" +#include "game/kernel/jak2/kscheme.h" +using ::jak2::intern_from_c; +namespace Mips2C::jak2 { +namespace method_10_collide_cache_prim { +struct Cache { + void* moving_sphere_sphere_intersect; // moving-sphere-sphere-intersect +} cache; + +u64 execute(void* ctxt) { + auto* c = (ExecutionContext*)ctxt; + bool bc = false; + u32 call_addr = 0; + bool cop1_bc = false; + c->daddiu(sp, sp, -128); // daddiu sp, sp, -128 + c->sd(ra, 0, sp); // sd ra, 0(sp) + c->sd(fp, 8, sp); // sd fp, 8(sp) + c->mov64(fp, t9); // or fp, t9, r0 + c->sq(s1, 32, sp); // sq s1, 32(sp) + c->sq(s2, 48, sp); // sq s2, 48(sp) + c->sq(s3, 64, sp); // sq s3, 64(sp) + c->sq(s4, 80, sp); // sq s4, 80(sp) + c->sq(s5, 96, sp); // sq s5, 96(sp) + c->sq(gp, 112, sp); // sq gp, 112(sp) + c->mov64(s3, a0); // or s3, a0, r0 + c->mov64(gp, a1); // or gp, a1, r0 + c->mov64(s5, a3); // or s5, a3, r0 + c->mov64(s2, t0); // or s2, t0, r0 + c->mov64(s4, t1); // or s4, t1, r0 + c->daddiu(s1, sp, 16); // daddiu s1, sp, 16 + c->load_symbol2(t9, cache.moving_sphere_sphere_intersect);// lw t9, moving-sphere-sphere-intersect(s7) + c->mov64(a0, a2); // or a0, a2, r0 + c->mov64(a1, s5); // or a1, s5, r0 + c->daddu(a2, r0, s3); // daddu a2, r0, s3 + c->mov64(a3, s1); // or a3, s1, r0 + call_addr = c->gprs[t9].du32[0]; // function call: + c->sll(v0, ra, 0); // sll v0, ra, 0 + c->jalr(call_addr); // jalr ra, t9 + c->mtc1(f3, v0); // mtc1 f3, v0 + c->lui(v1, -13122); // lui v1, -13122 + c->ori(v1, v1, 48160); // ori v1, v1, 48160 + c->mtc1(f4, v1); // mtc1 f4, v1 + c->mtc1(f0, r0); // mtc1 f0, r0 + c->lqc2(vf4, 0, s1); // lqc2 vf4, 0(s1) + c->movs(f1, f3); // mov.s f1, f3 + c->lqc2(vf5, 0, s3); // lqc2 vf5, 0(s3) + cop1_bc = c->fprs[f1] < c->fprs[f0]; // c.lt.s f1, f0 + c->vmove(DEST::xyzw, vf1, vf0); // vmove.xyzw vf1, vf0 + bc = cop1_bc; // bc1t L35 + c->mtc1(f2, s2); // mtc1 f2, s2 + if (bc) {goto block_11;} // branch non-likely + + cop1_bc = c->fprs[f2] < c->fprs[f0]; // c.lt.s f2, f0 + c->vsub(DEST::xyz, vf1, vf4, vf5); // vsub.xyz vf1, vf4, vf5 + bc = cop1_bc; // bc1t L32 + c->lwu(v1, 36, s3); // lwu v1, 36(s3) + if (bc) {goto block_4;} // branch non-likely + + cop1_bc = c->fprs[f2] <= c->fprs[f1]; // c.le.s f2, f1 + // nop // sll r0, r0, 0 + if (cop1_bc) { // bc1tl L35 + c->movs(f3, f4); // mov.s f3, f4 + goto block_11; + } + + block_4: + c->andi(a0, s4, 1); // andi a0, s4, 1 + // nop // sll r0, r0, 0 + bc = c->sgpr64(a0) == 0; // beq a0, r0, L33 + c->lqc2(vf15, 0, s5); // lqc2 vf15, 0(s5) + if (bc) {goto block_7;} // branch non-likely + + c->vmul(DEST::xyzw, vf16, vf15, vf1); // vmul.xyzw vf16, vf15, vf1 + c->vadd_bc(DEST::y, BC::x, vf16, vf16, vf16); // vaddx.y vf16, vf16, vf16 + c->vadd_bc(DEST::y, BC::z, vf16, vf16, vf16); // vaddz.y vf16, vf16, vf16 + c->mov128_gpr_vf(a0, vf16); // qmfc2.i a0, vf16 + if (((s64)c->sgpr64(a0)) >= 0) { // bgezl a0, L35 + c->movs(f3, f4); // mov.s f3, f4 + goto block_11; + } + + block_7: + // daddiu a0, fp, L168 // daddiu a0, fp, L168 +// L168: +// .word 0x0 +// .word 0x45800000 +// .word 0x0 +// .word 0x3f800000 + +// .word 0x0 +// .word 0xc5800000 +// .word 0x45800000 +// .word 0x3f800000 + +// .word 0x0 +// .word 0xc5800000 +// .word 0xc5800000 +// .word 0x3f800000 + // nop // sll r0, r0, 0 + c->vmul(DEST::xyzw, vf12, vf1, vf1); // vmul.xyzw vf12, vf1, vf1 + c->sqc2(vf4, 48, gp); // sqc2 vf4, 48(gp) + c->vmula_bc(DEST::w, BC::x, vf0, vf12); // vmulax.w acc, vf0, vf12 + //c->lqc2(vf9, 0, a0); // lqc2 vf9, 0(a0) + c->vfs[9].vf.set_u32s(0, 0x45800000, 0, 0x3f800000); + c->vmadda_bc(DEST::w, BC::y, vf0, vf12); // vmadday.w acc, vf0, vf12 + //c->lqc2(vf10, 16, a0); // lqc2 vf10, 16(a0) + c->vfs[10].vf.set_u32s(0, 0xc5800000, 0x45800000, 0x3f800000); + c->vmadd_bc(DEST::w, BC::z, vf12, vf0, vf12); // vmaddz.w vf12, vf0, vf12 + //c->lqc2(vf11, 32, a0); // lqc2 vf11, 32(a0) + c->vfs[11].vf.set_u32s(0, 0xc5800000, 0xc5800000, 0x3f800000); + c->vrsqrt(vf0, BC::w, vf12, BC::w); // vrsqrt Q, vf0.w, vf12.w + // nop // sll r0, r0, 0 + c->vwaitq(); // vwaitq + c->lwu(a0, 60, v1); // lwu a0, 60(v1) + c->vmulq(DEST::xyz, vf1, vf1); // vmulq.xyz vf1, vf1, Q + // nop // sll r0, r0, 0 + c->vmul(DEST::xyzw, vf14, vf1, vf1); // vmul.xyzw vf14, vf1, vf1 + c->sqc2(vf1, 64, gp); // sqc2 vf1, 64(gp) + c->vabs(DEST::xyzw, vf13, vf1); // vabs.xyzw vf13, vf1 + c->sw(a0, 80, gp); // sw a0, 80(gp) + c->vmove(DEST::xyzw, vf2, vf0); // vmove.xyzw vf2, vf0 + c->sw(v1, 84, gp); // sw v1, 84(gp) + c->vadd_bc(DEST::x, BC::y, vf14, vf14, vf14); // vaddy.x vf14, vf14, vf14 + c->mov128_gpr_vf(v1, vf13); // qmfc2.i v1, vf13 + if (((s64)c->sgpr64(v1)) == ((s64)0)) { // beql v1, r0, L34 + c->vadd_bc(DEST::x, BC::z, vf2, vf0, vf1); // vaddz.x vf2, vf0, vf1 + goto block_10; + } + + block_9: + c->vsub_bc(DEST::x, BC::y, vf2, vf0, vf1); // vsuby.x vf2, vf0, vf1 + // nop // sll r0, r0, 0 + c->vrsqrt(vf0, BC::w, vf14, BC::x); // vrsqrt Q, vf0.w, vf14.x + // nop // sll r0, r0, 0 + c->vadd_bc(DEST::y, BC::x, vf2, vf0, vf1); // vaddx.y vf2, vf0, vf1 + // nop // sll r0, r0, 0 + c->vwaitq(); // vwaitq + // nop // sll r0, r0, 0 + c->vmulq(DEST::xy, vf2, vf2); // vmulq.xy vf2, vf2, Q + // nop // sll r0, r0, 0 + + block_10: + c->vopmula(vf1, vf2); // vopmula.xyz acc, vf1, vf2 + // nop // sll r0, r0, 0 + c->vopmsub(vf3, vf2, vf1); // vopmsub.xyz vf3, vf2, vf1 + // nop // sll r0, r0, 0 + c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0 + // nop // sll r0, r0, 0 + c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf9); // vmaddax.xyzw acc, vf1, vf9 + // nop // sll r0, r0, 0 + c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf9); // vmadday.xyzw acc, vf2, vf9 + // nop // sll r0, r0, 0 + c->vmadd_bc(DEST::xyz, BC::z, vf9, vf3, vf9); // vmaddz.xyz vf9, vf3, vf9 + // nop // sll r0, r0, 0 + c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0 + // nop // sll r0, r0, 0 + c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf10); // vmaddax.xyzw acc, vf1, vf10 + // nop // sll r0, r0, 0 + c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf10); // vmadday.xyzw acc, vf2, vf10 + // nop // sll r0, r0, 0 + c->vmadd_bc(DEST::xyz, BC::z, vf10, vf3, vf10); // vmaddz.xyz vf10, vf3, vf10 + // nop // sll r0, r0, 0 + c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0 + // nop // sll r0, r0, 0 + c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf11); // vmaddax.xyzw acc, vf1, vf11 + // nop // sll r0, r0, 0 + c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf11); // vmadday.xyzw acc, vf2, vf11 + // nop // sll r0, r0, 0 + c->vmadd_bc(DEST::xyz, BC::z, vf11, vf3, vf11); // vmaddz.xyz vf11, vf3, vf11 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->sqc2(vf9, 0, gp); // sqc2 vf9, 0(gp) + // nop // sll r0, r0, 0 + c->sqc2(vf10, 16, gp); // sqc2 vf10, 16(gp) + // nop // sll r0, r0, 0 + c->sqc2(vf11, 32, gp); // sqc2 vf11, 32(gp) + c->gprs[v1].du64[0] = 0; // or v1, r0, r0 + + block_11: + c->mfc1(v0, f3); // mfc1 v0, f3 + c->ld(ra, 0, sp); // ld ra, 0(sp) + c->ld(fp, 8, sp); // ld fp, 8(sp) + c->lq(gp, 112, sp); // lq gp, 112(sp) + c->lq(s5, 96, sp); // lq s5, 96(sp) + c->lq(s4, 80, sp); // lq s4, 80(sp) + c->lq(s3, 64, sp); // lq s3, 64(sp) + c->lq(s2, 48, sp); // lq s2, 48(sp) + c->lq(s1, 32, sp); // lq s1, 32(sp) + //jr ra // jr ra + c->daddiu(sp, sp, 128); // daddiu sp, sp, 128 + goto end_of_function; // return + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + end_of_function: + return c->gprs[v0].du64[0]; +} + +void link() { + cache.moving_sphere_sphere_intersect = intern_from_c("moving-sphere-sphere-intersect").c(); + gLinkedFunctionTable.reg("(method 10 collide-cache-prim)", execute, 256); +} + +} // namespace method_10_collide_cache_prim +} // namespace Mips2C + +//--------------------------MIPS2C--------------------- +// clang-format off +#include "game/mips2c/mips2c_private.h" +#include "game/kernel/jak2/kscheme.h" +using ::jak2::intern_from_c; +namespace Mips2C::jak2 { +namespace method_17_collide_cache { +struct Cache { + void* fake_scratchpad_data; // *fake-scratchpad-data* + void* collide_puss_work; // collide-puss-work + void* format; // format +} cache; + +u64 execute(void* ctxt) { + auto* c = (ExecutionContext*)ctxt; + bool bc = false; + u32 call_addr = 0; + c->daddiu(sp, sp, -96); // daddiu sp, sp, -96 + c->sd(ra, 0, sp); // sd ra, 0(sp) + c->sd(fp, 8, sp); // sd fp, 8(sp) + c->mov64(fp, t9); // or fp, t9, r0 + c->sq(s2, 16, sp); // sq s2, 16(sp) + c->sq(s3, 32, sp); // sq s3, 32(sp) + c->sq(s4, 48, sp); // sq s4, 48(sp) + c->sq(s5, 64, sp); // sq s5, 64(sp) + c->sq(gp, 80, sp); // sq gp, 80(sp) + c->mov64(gp, a1); // or gp, a1, r0 + get_fake_spad_addr2(s5, cache.fake_scratchpad_data, 0, c);// lui s5, 28672 + c->addiu(a3, r0, 64); // addiu a3, r0, 64 + c->lwu(a2, 116, gp); // lwu a2, 116(gp) + c->daddiu(v1, s5, 96); // daddiu v1, s5, 96 + c->lwu(a1, 112, gp); // lwu a1, 112(gp) + c->dsubu(a3, a2, a3); // dsubu a3, a2, a3 + // nop // sll r0, r0, 0 + bc = ((s64)c->sgpr64(a3)) > 0; // bgtz a3, L26 + // nop // sll r0, r0, 0 + if (bc) {goto block_20;} // branch non-likely + + bc = c->sgpr64(a2) == 0; // beq a2, r0, L19 + c->lqc2(vf1, 0, a1); // lqc2 vf1, 0(a1) + if (bc) {goto block_5;} // branch non-likely + + c->daddiu(a2, a2, -1); // daddiu a2, a2, -1 + c->daddiu(a1, a1, 16); // daddiu a1, a1, 16 + c->vsub_bc(DEST::xyz, BC::w, vf2, vf1, vf1); // vsubw.xyz vf2, vf1, vf1 + c->sqc2(vf1, 0, v1); // sqc2 vf1, 0(v1) + c->vadd_bc(DEST::xyz, BC::w, vf3, vf1, vf1); // vaddw.xyz vf3, vf1, vf1 + c->daddiu(v1, v1, 48); // daddiu v1, v1, 48 + c->vftoi0(DEST::xyzw, vf4, vf2); // vftoi0.xyzw vf4, vf2 + // nop // sll r0, r0, 0 + c->vftoi0(DEST::xyzw, vf5, vf3); // vftoi0.xyzw vf5, vf3 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->sqc2(vf4, -32, v1); // sqc2 vf4, -32(v1) + // nop // sll r0, r0, 0 + c->sqc2(vf5, -16, v1); // sqc2 vf5, -16(v1) + + block_3: + bc = c->sgpr64(a2) == 0; // beq a2, r0, L19 + c->lqc2(vf1, 0, a1); // lqc2 vf1, 0(a1) + if (bc) {goto block_5;} // branch non-likely + + c->daddiu(a2, a2, -1); // daddiu a2, a2, -1 + c->daddiu(a1, a1, 16); // daddiu a1, a1, 16 + c->vsub_bc(DEST::xyz, BC::w, vf4, vf1, vf1); // vsubw.xyz vf4, vf1, vf1 + c->sqc2(vf1, 0, v1); // sqc2 vf1, 0(v1) + c->vadd_bc(DEST::xyz, BC::w, vf5, vf1, vf1); // vaddw.xyz vf5, vf1, vf1 + // nop // sll r0, r0, 0 + c->vmini(DEST::xyz, vf2, vf2, vf4); // vmini.xyz vf2, vf2, vf4 + // nop // sll r0, r0, 0 + c->vmax(DEST::xyz, vf3, vf3, vf5); // vmax.xyz vf3, vf3, vf5 + // nop // sll r0, r0, 0 + c->vftoi0(DEST::xyzw, vf4, vf4); // vftoi0.xyzw vf4, vf4 + // nop // sll r0, r0, 0 + c->vftoi0(DEST::xyzw, vf5, vf5); // vftoi0.xyzw vf5, vf5 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->sqc2(vf4, 16, v1); // sqc2 vf4, 16(v1) + // nop // sll r0, r0, 0 + c->sqc2(vf5, 32, v1); // sqc2 vf5, 32(v1) + //beq r0, r0, L18 // beq r0, r0, L18 + c->daddiu(v1, v1, 48); // daddiu v1, v1, 48 + goto block_3; // branch always + + + block_5: + c->vftoi0(DEST::xyzw, vf2, vf2); // vftoi0.xyzw vf2, vf2 + // nop // sll r0, r0, 0 + c->vftoi0(DEST::xyzw, vf3, vf3); // vftoi0.xyzw vf3, vf3 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->sqc2(vf2, 64, s5); // sqc2 vf2, 64(s5) + // nop // sll r0, r0, 0 + c->sqc2(vf3, 80, s5); // sqc2 vf3, 80(s5) + c->daddiu(s4, a0, 108); // daddiu s4, a0, 108 + c->lwu(s3, 100, gp); // lwu s3, 100(gp) + c->lw(s2, 4, a0); // lw s2, 4(a0) + //beq r0, r0, L25 // beq r0, r0, L25 + // nop // sll r0, r0, 0 + goto block_18; // branch always + + + block_6: + c->daddiu(s2, s2, -1); // daddiu s2, s2, -1 + c->lwu(v1, 16, s4); // lwu v1, 16(s4) + c->and_(v1, s3, v1); // and v1, s3, v1 + bc = c->sgpr64(v1) == 0; // beq v1, r0, L24 + c->mov64(v1, s7); // or v1, s7, r0 + if (bc) {goto block_17;} // branch non-likely + + c->lwu(v1, 120, gp); // lwu v1, 120(gp) + if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(v1))) {// beql s7, v1, L21 + c->daddiu(v1, s7, 4); // daddiu v1, s7, 4 + goto block_10; + } + + block_9: + c->daddiu(v1, s7, 4); // daddiu v1, s7, 4 + c->lwu(a0, 24, s4); // lwu a0, 24(s4) + c->andi(a0, a0, 1); // andi a0, a0, 1 + c->movz(v1, s7, a0); // movz v1, s7, a0 + + block_10: + bc = c->sgpr64(s7) == c->sgpr64(v1); // beq s7, v1, L24 + c->mov64(v1, s7); // or v1, s7, r0 + if (bc) {goto block_17;} // branch non-likely + + c->mov64(v1, s7); // or v1, s7, r0 + c->lb(v1, 28, s4); // lb v1, 28(s4) + c->slt(v1, v1, r0); // slt v1, v1, r0 + bc = c->sgpr64(v1) != 0; // bne v1, r0, L22 + // nop // sll r0, r0, 0 + if (bc) {goto block_13;} // branch non-likely + + c->mov64(a0, s5); // or a0, s5, r0 + c->load_symbol2(v1, cache.collide_puss_work); // lw v1, collide-puss-work(s7) + c->lwu(t9, 52, v1); // lwu t9, 52(v1) + c->mov64(a1, s4); // or a1, s4, r0 + c->mov64(a2, gp); // or a2, gp, r0 + call_addr = c->gprs[t9].du32[0]; // function call: + c->sll(v0, ra, 0); // sll v0, ra, 0 + c->jalr(call_addr); // jalr ra, t9 + c->mov64(v1, v0); // or v1, v0, r0 + c->mov64(a0, v1); // or a0, v1, r0 + //beq r0, r0, L23 // beq r0, r0, L23 + // nop // sll r0, r0, 0 + goto block_14; // branch always + + + block_13: + c->mov64(a0, s5); // or a0, s5, r0 + c->load_symbol2(v1, cache.collide_puss_work); // lw v1, collide-puss-work(s7) + c->lwu(t9, 56, v1); // lwu t9, 56(v1) + c->mov64(a1, s4); // or a1, s4, r0 + c->mov64(a2, gp); // or a2, gp, r0 + call_addr = c->gprs[t9].du32[0]; // function call: + c->sll(v0, ra, 0); // sll v0, ra, 0 + c->jalr(call_addr); // jalr ra, t9 + c->mov64(v1, v0); // or v1, v0, r0 + c->mov64(a0, v1); // or a0, v1, r0 + + block_14: + bc = c->sgpr64(s7) == c->sgpr64(v1); // beq s7, v1, L24 + c->mov64(v1, s7); // or v1, s7, r0 + if (bc) {goto block_17;} // branch non-likely + + c->daddiu(v1, s7, 4); // daddiu v1, s7, #t + c->mov64(v0, v1); // or v0, v1, r0 + //beq r0, r0, L28 // beq r0, r0, L28 + // nop // sll r0, r0, 0 + goto block_22; // branch always + + c->gprs[v1].du64[0] = 0; // or v1, r0, r0 + + block_17: + c->daddiu(s4, s4, 48); // daddiu s4, s4, 48 + + block_18: + bc = c->sgpr64(s2) != 0; // bne s2, r0, L20 + // nop // sll r0, r0, 0 + if (bc) {goto block_6;} // branch non-likely + + c->mov64(v1, s7); // or v1, s7, r0 + c->mov64(v1, s7); // or v1, s7, r0 + //beq r0, r0, L27 // beq r0, r0, L27 + // nop // sll r0, r0, 0 + goto block_21; // branch always + + + block_20: + c->load_symbol2(t9, cache.format); // lw t9, format(s7) + c->addiu(a0, r0, 0); // addiu a0, r0, 0 + // daddiu a1, fp, L167 // daddiu a1, fp, L167 + call_addr = c->gprs[t9].du32[0]; // function call: + c->sll(v0, ra, 0); // sll v0, ra, 0 + // c->jalr(call_addr); // jalr ra, t9 + printf("ERROR: Exceeded max # of spheres in collide-cache::probe-using-spheres!\n"); + + block_21: + c->mov64(v0, s7); // or v0, s7, r0 + + block_22: + c->ld(ra, 0, sp); // ld ra, 0(sp) + c->ld(fp, 8, sp); // ld fp, 8(sp) + c->lq(gp, 80, sp); // lq gp, 80(sp) + c->lq(s5, 64, sp); // lq s5, 64(sp) + c->lq(s4, 48, sp); // lq s4, 48(sp) + c->lq(s3, 32, sp); // lq s3, 32(sp) + c->lq(s2, 16, sp); // lq s2, 16(sp) + //jr ra // jr ra + c->daddiu(sp, sp, 96); // daddiu sp, sp, 96 + goto end_of_function; // return + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + end_of_function: + return c->gprs[v0].du64[0]; +} + +void link() { + cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); + cache.collide_puss_work = intern_from_c("collide-puss-work").c(); + cache.format = intern_from_c("format").c(); + gLinkedFunctionTable.reg("(method 17 collide-cache)", execute, 128); +} + +} // namespace method_17_collide_cache +} // namespace Mips2C + +//--------------------------MIPS2C--------------------- +// clang-format off +#include "game/mips2c/mips2c_private.h" +#include "game/kernel/jak2/kscheme.h" +using ::jak2::intern_from_c; +namespace Mips2C::jak2 { +namespace method_9_collide_puss_work { +struct Cache { + void* closest_pt_in_triangle; // closest-pt-in-triangle +} cache; + +u64 execute(void* ctxt) { + auto* c = (ExecutionContext*)ctxt; + bool bc = false; + u32 call_addr = 0; + c->daddiu(sp, sp, -128); // daddiu sp, sp, -128 + c->sd(ra, 0, sp); // sd ra, 0(sp) + c->sq(s0, 16, sp); // sq s0, 16(sp) + c->sq(s1, 32, sp); // sq s1, 32(sp) + c->sq(s2, 48, sp); // sq s2, 48(sp) + c->sq(s3, 64, sp); // sq s3, 64(sp) + c->sq(s4, 80, sp); // sq s4, 80(sp) + c->sq(s5, 96, sp); // sq s5, 96(sp) + c->sq(gp, 112, sp); // sq gp, 112(sp) + c->mov64(gp, a0); // or gp, a0, r0 + c->mov64(s5, a2); // or s5, a2, r0 + // nop // sll r0, r0, 0 + c->lwu(a0, 32, a1); // lwu a0, 32(a1) + // nop // sll r0, r0, 0 + c->lhu(v1, 40, a1); // lhu v1, 40(a1) + c->daddiu(a0, a0, 4908); // daddiu a0, a0, 4908 + c->lhu(s4, 42, a1); // lhu s4, 42(a1) + c->dsll(v1, v1, 6); // dsll v1, v1, 6 + // nop // sll r0, r0, 0 + c->daddu(s3, a0, v1); // daddu s3, a0, v1 + // nop // sll r0, r0, 0 + + block_1: + bc = c->sgpr64(s4) == 0; // beq s4, r0, L15 + c->lqc2(vf1, 0, s3); // lqc2 vf1, 0(s3) + if (bc) {goto block_12;} // branch non-likely + + c->daddiu(s4, s4, -1); // daddiu s4, s4, -1 + c->lqc2(vf2, 16, s3); // lqc2 vf2, 16(s3) + // nop // sll r0, r0, 0 + c->lqc2(vf3, 32, s3); // lqc2 vf3, 32(s3) + c->vsub(DEST::xyzw, vf4, vf2, vf1); // vsub.xyzw vf4, vf2, vf1 + c->lq(a1, 64, gp); // lq a1, 64(gp) + c->vsub(DEST::xyzw, vf5, vf3, vf1); // vsub.xyzw vf5, vf3, vf1 + c->lq(v1, 80, gp); // lq v1, 80(gp) + c->vmini(DEST::xyzw, vf6, vf1, vf2); // vmini.xyzw vf6, vf1, vf2 + // nop // sll r0, r0, 0 + c->vmax(DEST::xyzw, vf7, vf1, vf2); // vmax.xyzw vf7, vf1, vf2 + // nop // sll r0, r0, 0 + c->vopmula(vf4, vf5); // vopmula.xyz acc, vf4, vf5 + // nop // sll r0, r0, 0 + c->vmove(DEST::xyzw, vf8, vf0); // vmove.xyzw vf8, vf0 + // nop // sll r0, r0, 0 + c->vmini(DEST::xyzw, vf6, vf6, vf3); // vmini.xyzw vf6, vf6, vf3 + // nop // sll r0, r0, 0 + c->vmax(DEST::xyzw, vf7, vf7, vf3); // vmax.xyzw vf7, vf7, vf3 + // nop // sll r0, r0, 0 + c->vopmsub(vf8, vf5, vf4); // vopmsub.xyz vf8, vf5, vf4 + // nop // sll r0, r0, 0 + c->vftoi0(DEST::xyzw, vf6, vf6); // vftoi0.xyzw vf6, vf6 + // nop // sll r0, r0, 0 + c->vftoi0(DEST::xyzw, vf7, vf7); // vftoi0.xyzw vf7, vf7 + // nop // sll r0, r0, 0 + c->vmul(DEST::xyzw, vf9, vf8, vf8); // vmul.xyzw vf9, vf8, vf8 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(a0, vf6); // qmfc2.i a0, vf6 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(a2, vf7); // qmfc2.i a2, vf7 + // nop // sll r0, r0, 0 + c->vmula_bc(DEST::w, BC::x, vf0, vf9); // vmulax.w acc, vf0, vf9 + c->sqc2(vf6, 32, gp); // sqc2 vf6, 32(gp) + c->vmadda_bc(DEST::w, BC::y, vf0, vf9); // vmadday.w acc, vf0, vf9 + c->sqc2(vf7, 48, gp); // sqc2 vf7, 48(gp) + c->vmadd_bc(DEST::w, BC::z, vf9, vf0, vf9); // vmaddz.w vf9, vf0, vf9 + // nop // sll r0, r0, 0 + c->pcgtw(a1, a1, a2); // pcgtw a1, a1, a2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcgtw(v1, a0, v1); // pcgtw v1, a0, v1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->por(v1, a1, v1); // por v1, a1, v1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->vrsqrt(vf0, BC::w, vf9, BC::w); // vrsqrt Q, vf0.w, vf9.w + // nop // sll r0, r0, 0 + c->ppach(v1, r0, v1); // ppach v1, r0, v1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->dsll(v1, v1, 16); // dsll v1, v1, 16 + // nop // sll r0, r0, 0 + if (((s64)c->sgpr64(v1)) != ((s64)0)) { // bnel v1, r0, L13 + c->daddiu(s3, s3, 64); // daddiu s3, s3, 64 + goto block_1; + } + + block_4: + c->vwaitq(); // vwaitq + // nop // sll r0, r0, 0 + c->vmulq(DEST::xyz, vf8, vf8); // vmulq.xyz vf8, vf8, Q + c->daddiu(s2, gp, 96); // daddiu s2, gp, 96 + // nop // sll r0, r0, 0 + c->lwu(s1, 116, s5); // lwu s1, 116(s5) + c->gprs[s0].du64[0] = 0; // or s0, r0, r0 + c->sqc2(vf8, 16, gp); // sqc2 vf8, 16(gp) + + block_5: + if (((s64)c->sgpr64(s0)) == ((s64)c->sgpr64(s1))) {// beql s0, s1, L13 + c->daddiu(s3, s3, 64); // daddiu s3, s3, 64 + goto block_1; + } + + block_7: + c->daddiu(s0, s0, 1); // daddiu s0, s0, 1 + c->lq(a1, 16, s2); // lq a1, 16(s2) + // nop // sll r0, r0, 0 + c->lq(a2, 48, gp); // lq a2, 48(gp) + // nop // sll r0, r0, 0 + c->lq(v1, 32, s2); // lq v1, 32(s2) + // nop // sll r0, r0, 0 + c->lq(a0, 32, gp); // lq a0, 32(gp) + c->pcgtw(a1, a1, a2); // pcgtw a1, a1, a2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcgtw(v1, a0, v1); // pcgtw v1, a0, v1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->por(v1, a1, v1); // por v1, a1, v1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->ppach(v1, r0, v1); // ppach v1, r0, v1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->dsll(v1, v1, 16); // dsll v1, v1, 16 + // nop // sll r0, r0, 0 + if (((s64)c->sgpr64(v1)) != ((s64)0)) { // bnel v1, r0, L14 + c->daddiu(s2, s2, 48); // daddiu s2, s2, 48 + goto block_5; + } + + block_9: + c->load_symbol2(t9, cache.closest_pt_in_triangle);// lw t9, closest-pt-in-triangle(s7) + c->daddu(a0, r0, gp); // daddu a0, r0, gp + c->daddu(a1, r0, s2); // daddu a1, r0, s2 + c->daddu(a2, r0, s3); // daddu a2, r0, s3 + c->daddiu(a3, gp, 16); // daddiu a3, gp, 16 + call_addr = c->gprs[t9].du32[0]; // function call: + c->sll(v0, ra, 0); // sll v0, ra, 0 + c->jalr(call_addr); // jalr ra, t9 + c->lqc2(vf10, 0, gp); // lqc2 vf10, 0(gp) + c->lqc2(vf11, 0, s2); // lqc2 vf11, 0(s2) + c->daddiu(s2, s2, 48); // daddiu s2, s2, 48 + c->vsub(DEST::xyz, vf9, vf10, vf11); // vsub.xyz vf9, vf10, vf11 + c->vmul(DEST::w, vf11, vf11, vf11); // vmul.w vf11, vf11, vf11 + c->vmul(DEST::xyzw, vf9, vf9, vf9); // vmul.xyzw vf9, vf9, vf9 + c->vmula_bc(DEST::w, BC::x, vf0, vf9); // vmulax.w acc, vf0, vf9 + c->vmadda_bc(DEST::w, BC::y, vf0, vf9); // vmadday.w acc, vf0, vf9 + c->vmadd_bc(DEST::w, BC::z, vf9, vf0, vf9); // vmaddz.w vf9, vf0, vf9 + c->vsub(DEST::w, vf9, vf9, vf11); // vsub.w vf9, vf9, vf11 + c->mov128_gpr_vf(v1, vf9); // qmfc2.i v1, vf9 + c->pcpyud(v1, v1, v1); // pcpyud v1, v1, v1 + if (((s64)c->sgpr64(v1)) > 0) { // bgtzl v1, L14 + // nop // sll r0, r0, 0 + goto block_5; + } + + block_11: + c->daddiu(v1, s7, 4); // daddiu v1, s7, #t + c->mov64(v0, v1); // or v0, v1, r0 + //beq r0, r0, L16 // beq r0, r0, L16 + // nop // sll r0, r0, 0 + goto block_14; // branch always + + + block_12: + c->mov64(v0, s7); // or v0, s7, r0 + //beq r0, r0, L16 // beq r0, r0, L16 + // nop // sll r0, r0, 0 + goto block_14; // branch always + + c->gprs[v0].du64[0] = 0; // or v0, r0, r0 + + block_14: + c->ld(ra, 0, sp); // ld ra, 0(sp) + c->lq(gp, 112, sp); // lq gp, 112(sp) + c->lq(s5, 96, sp); // lq s5, 96(sp) + c->lq(s4, 80, sp); // lq s4, 80(sp) + c->lq(s3, 64, sp); // lq s3, 64(sp) + c->lq(s2, 48, sp); // lq s2, 48(sp) + c->lq(s1, 32, sp); // lq s1, 32(sp) + c->lq(s0, 16, sp); // lq s0, 16(sp) + //jr ra // jr ra + c->daddiu(sp, sp, 128); // daddiu sp, sp, 128 + goto end_of_function; // return + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + end_of_function: + return c->gprs[v0].du64[0]; +} + +void link() { + cache.closest_pt_in_triangle = intern_from_c("closest-pt-in-triangle").c(); + gLinkedFunctionTable.reg("(method 9 collide-puss-work)", execute, 256); +} + +} // namespace method_9_collide_puss_work +} // namespace Mips2C + +//--------------------------MIPS2C--------------------- +// clang-format off +#include "game/mips2c/mips2c_private.h" +#include "game/kernel/jak2/kscheme.h" +using ::jak2::intern_from_c; +namespace Mips2C::jak2 { +namespace method_10_collide_puss_work { +u64 execute(void* ctxt) { + auto* c = (ExecutionContext*)ctxt; + bool bc = false; + u32 call_addr = 0; + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->lwu(v1, 116, a2); // lwu v1, 116(a2) + c->daddiu(a2, a0, 96); // daddiu a2, a0, 96 + c->lqc2(vf1, 0, a1); // lqc2 vf1, 0(a1) + bc = c->sgpr64(v1) == 0; // beq v1, r0, L10 + c->lq(a1, 64, a0); // lq a1, 64(a0) + if (bc) {goto block_12;} // branch non-likely + + c->vmax_bc(DEST::xyzw, BC::w, vf4, vf0, vf0); // vmaxw.xyzw vf4, vf0, vf0 + c->lq(a3, 80, a0); // lq a3, 80(a0) + c->vsub_bc(DEST::xyz, BC::w, vf2, vf1, vf1); // vsubw.xyz vf2, vf1, vf1 + c->gprs[a0].du64[0] = 0; // or a0, r0, r0 + c->vadd_bc(DEST::xyz, BC::w, vf3, vf1, vf1); // vaddw.xyz vf3, vf1, vf1 + c->lqc2(vf5, 0, a2); // lqc2 vf5, 0(a2) + c->vftoi0(DEST::xyzw, vf2, vf2); // vftoi0.xyzw vf2, vf2 + c->lqc2(vf6, 48, a2); // lqc2 vf6, 48(a2) + c->vftoi0(DEST::xyzw, vf3, vf3); // vftoi0.xyzw vf3, vf3 + c->lqc2(vf7, 96, a2); // lqc2 vf7, 96(a2) + // nop // sll r0, r0, 0 + c->vsub_bc(DEST::w, BC::w, vf1, vf0, vf1); // vsubw.w vf1, vf0, vf1 + c->mov128_gpr_vf(t0, vf2); // qmfc2.i t0, vf2 + c->lqc2(vf8, 144, a2); // lqc2 vf8, 144(a2) + c->mov128_gpr_vf(t1, vf3); // qmfc2.i t1, vf3 + // nop // sll r0, r0, 0 + c->pcgtw(a1, a1, t1); // pcgtw a1, a1, t1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcgtw(a3, t0, a3); // pcgtw a3, t0, a3 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->por(a1, a1, a3); // por a1, a1, a3 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->ppach(a1, r0, a1); // ppach a1, r0, a1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->dsll(a1, a1, 16); // dsll a1, a1, 16 + // nop // sll r0, r0, 0 + bc = c->sgpr64(a1) != 0; // bne a1, r0, L10 + // nop // sll r0, r0, 0 + if (bc) {goto block_12;} // branch non-likely + + + block_2: + c->vsub(DEST::xyzw, vf9, vf5, vf1); // vsub.xyzw vf9, vf5, vf1 + c->daddiu(a2, a2, 192); // daddiu a2, a2, 192 + c->vsub(DEST::xyzw, vf10, vf6, vf1); // vsub.xyzw vf10, vf6, vf1 + c->lqc2(vf5, 0, a2); // lqc2 vf5, 0(a2) + c->vsub(DEST::xyzw, vf11, vf7, vf1); // vsub.xyzw vf11, vf7, vf1 + c->lqc2(vf6, 48, a2); // lqc2 vf6, 48(a2) + c->vsub(DEST::xyzw, vf12, vf8, vf1); // vsub.xyzw vf12, vf8, vf1 + c->lqc2(vf7, 96, a2); // lqc2 vf7, 96(a2) + c->vmul(DEST::xyzw, vf9, vf9, vf9); // vmul.xyzw vf9, vf9, vf9 + c->lqc2(vf8, 144, a2); // lqc2 vf8, 144(a2) + c->vmul(DEST::xyzw, vf10, vf10, vf10); // vmul.xyzw vf10, vf10, vf10 + // nop // sll r0, r0, 0 + c->vmul(DEST::xyzw, vf11, vf11, vf11); // vmul.xyzw vf11, vf11, vf11 + // nop // sll r0, r0, 0 + c->vmul(DEST::xyzw, vf12, vf12, vf12); // vmul.xyzw vf12, vf12, vf12 + // nop // sll r0, r0, 0 + c->vmula_bc(DEST::xyzw, BC::x, vf4, vf9); // vmulax.xyzw acc, vf4, vf9 + // nop // sll r0, r0, 0 + c->vmadda_bc(DEST::xyzw, BC::y, vf4, vf9); // vmadday.xyzw acc, vf4, vf9 + // nop // sll r0, r0, 0 + c->vmadda_bc(DEST::xyzw, BC::z, vf4, vf9); // vmaddaz.xyzw acc, vf4, vf9 + // nop // sll r0, r0, 0 + c->vmsub_bc(DEST::xyzw, BC::w, vf9, vf4, vf9); // vmsubw.xyzw vf9, vf4, vf9 + // nop // sll r0, r0, 0 + c->vmula_bc(DEST::xyzw, BC::x, vf4, vf10); // vmulax.xyzw acc, vf4, vf10 + // nop // sll r0, r0, 0 + c->vmadda_bc(DEST::xyzw, BC::y, vf4, vf10); // vmadday.xyzw acc, vf4, vf10 + // nop // sll r0, r0, 0 + c->vmadda_bc(DEST::xyzw, BC::z, vf4, vf10); // vmaddaz.xyzw acc, vf4, vf10 + // nop // sll r0, r0, 0 + c->vmsub_bc(DEST::xyzw, BC::w, vf10, vf4, vf10); // vmsubw.xyzw vf10, vf4, vf10 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(a1, vf9); // qmfc2.i a1, vf9 + c->daddiu(a0, a0, 1); // daddiu a0, a0, 1 + bc = ((s64)c->sgpr64(a1)) <= 0; // blez a1, L9 + c->vmula_bc(DEST::xyzw, BC::x, vf4, vf11); // vmulax.xyzw acc, vf4, vf11 + if (bc) {goto block_11;} // branch non-likely + + bc = c->sgpr64(a0) == c->sgpr64(v1); // beq a0, v1, L10 + c->vmadda_bc(DEST::xyzw, BC::y, vf4, vf11); // vmadday.xyzw acc, vf4, vf11 + if (bc) {goto block_12;} // branch non-likely + + c->vmadda_bc(DEST::xyzw, BC::z, vf4, vf11); // vmaddaz.xyzw acc, vf4, vf11 + // nop // sll r0, r0, 0 + c->vmsub_bc(DEST::xyzw, BC::w, vf11, vf4, vf11); // vmsubw.xyzw vf11, vf4, vf11 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(a1, vf10); // qmfc2.i a1, vf10 + c->daddiu(a0, a0, 1); // daddiu a0, a0, 1 + bc = ((s64)c->sgpr64(a1)) <= 0; // blez a1, L9 + c->vmula_bc(DEST::xyzw, BC::x, vf4, vf12); // vmulax.xyzw acc, vf4, vf12 + if (bc) {goto block_11;} // branch non-likely + + bc = c->sgpr64(a0) == c->sgpr64(v1); // beq a0, v1, L10 + c->vmadda_bc(DEST::xyzw, BC::y, vf4, vf12); // vmadday.xyzw acc, vf4, vf12 + if (bc) {goto block_12;} // branch non-likely + + c->vmadda_bc(DEST::xyzw, BC::z, vf4, vf12); // vmaddaz.xyzw acc, vf4, vf12 + // nop // sll r0, r0, 0 + c->vmsub_bc(DEST::xyzw, BC::w, vf12, vf4, vf12); // vmsubw.xyzw vf12, vf4, vf12 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(a1, vf11); // qmfc2.i a1, vf11 + c->daddiu(a0, a0, 1); // daddiu a0, a0, 1 + bc = ((s64)c->sgpr64(a1)) <= 0; // blez a1, L9 + // nop // sll r0, r0, 0 + if (bc) {goto block_11;} // branch non-likely + + bc = c->sgpr64(a0) == c->sgpr64(v1); // beq a0, v1, L10 + // nop // sll r0, r0, 0 + if (bc) {goto block_12;} // branch non-likely + + c->mov128_gpr_vf(a1, vf12); // qmfc2.i a1, vf12 + c->daddiu(a0, a0, 1); // daddiu a0, a0, 1 + bc = ((s64)c->sgpr64(a1)) <= 0; // blez a1, L9 + // nop // sll r0, r0, 0 + if (bc) {goto block_11;} // branch non-likely + + bc = c->sgpr64(a0) != c->sgpr64(v1); // bne a0, v1, L8 + // nop // sll r0, r0, 0 + if (bc) {goto block_2;} // branch non-likely + + //beq r0, r0, L10 // beq r0, r0, L10 + // nop // sll r0, r0, 0 + goto block_12; // branch always + + + block_11: + c->daddiu(v1, s7, 4); // daddiu v1, s7, #t + c->mov64(v0, v1); // or v0, v1, r0 + //beq r0, r0, L11 // beq r0, r0, L11 + // nop // sll r0, r0, 0 + goto block_14; // branch always + + + block_12: + c->mov64(v0, s7); // or v0, s7, r0 + //beq r0, r0, L11 // beq r0, r0, L11 + // nop // sll r0, r0, 0 + goto block_14; // branch always + + c->gprs[v0].du64[0] = 0; // or v0, r0, r0 + + block_14: + //jr ra // jr ra + c->daddu(sp, sp, r0); // daddu sp, sp, r0 + goto end_of_function; // return + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + end_of_function: + return c->gprs[v0].du64[0]; +} + +void link() { + gLinkedFunctionTable.reg("(method 10 collide-puss-work)", execute, 256); +} + +} // namespace method_10_collide_puss_work +} // namespace Mips2C diff --git a/game/mips2c/mips2c_table.cpp b/game/mips2c/mips2c_table.cpp index 1a9bb15e5b..8a83002af7 100644 --- a/game/mips2c/mips2c_table.cpp +++ b/game/mips2c/mips2c_table.cpp @@ -181,7 +181,17 @@ namespace method_39_spatial_hash { extern void link(); } namespace method_36_spatial_hash { extern void link(); } namespace method_37_spatial_hash { extern void link(); } namespace method_35_spatial_hash { extern void link(); } - +namespace method_10_collide_shape_prim_mesh { extern void link(); } +namespace method_10_collide_shape_prim_sphere { extern void link(); } +namespace method_10_collide_shape_prim_group { extern void link(); } +namespace method_11_collide_shape_prim_mesh { extern void link(); } +namespace method_11_collide_shape_prim_sphere { extern void link(); } +namespace method_11_collide_shape_prim_group { extern void link(); } +namespace method_9_collide_cache_prim { extern void link(); } +namespace method_10_collide_cache_prim { extern void link(); } +namespace method_17_collide_cache { extern void link(); } +namespace method_9_collide_puss_work { extern void link(); } +namespace method_10_collide_puss_work { extern void link(); } } // clang-format on @@ -300,7 +310,16 @@ PerGameVersion>> gMips2C jak2::method_31_sphere_hash::link, jak2::method_32_sphere_hash::link, jak2::method_33_spatial_hash::link, jak2::method_39_spatial_hash::link, jak2::method_36_spatial_hash::link, jak2::method_37_spatial_hash::link, - jak2::method_35_spatial_hash::link, jak2::method_33_sphere_hash::link}}}, + jak2::method_35_spatial_hash::link, jak2::method_33_sphere_hash::link}}, + {"collide-cache", + {jak2::method_10_collide_shape_prim_mesh::link, + jak2::method_10_collide_shape_prim_sphere::link, + jak2::method_10_collide_shape_prim_group::link, + jak2::method_11_collide_shape_prim_mesh::link, + jak2::method_11_collide_shape_prim_sphere::link, + jak2::method_11_collide_shape_prim_group::link, jak2::method_9_collide_cache_prim::link, + jak2::method_10_collide_cache_prim::link, jak2::method_17_collide_cache::link, + jak2::method_9_collide_puss_work::link, jak2::method_10_collide_puss_work::link}}}, }; void LinkedFunctionTable::reg(const std::string& name, u64 (*exec)(void*), u32 stack_size) { diff --git a/goal_src/jak2/engine/camera/cam-master.gc b/goal_src/jak2/engine/camera/cam-master.gc index 45ad2de18b..36a3d9c5ec 100644 --- a/goal_src/jak2/engine/camera/cam-master.gc +++ b/goal_src/jak2/engine/camera/cam-master.gc @@ -6,10 +6,23 @@ ;; dgos: ENGINE, GAME -;;og:ignore-form:camera-master-method-16 - ;; DECOMP BEGINS +(defmethod camera-master-method-16 camera-master ((obj camera-master) (arg0 symbol)) + (let ((a2-0 (the-as target (handle->process (-> obj focus handle)))) + (v1-4 0) + ) + (if a2-0 + (set! v1-4 (logand (the-as int (-> a2-0 control pat-ignore-mask)) 112)) + ) + (logior (if arg0 + #x9010002 + #x9000002 + ) + v1-4 + ) + ) + ) (defbehavior reset-follow camera-master () (let ((a0-1 (handle->process (-> self focus handle)))) diff --git a/goal_src/jak2/engine/collide/collide-cache-h.gc b/goal_src/jak2/engine/collide/collide-cache-h.gc index 0775291c60..b2d57dbeed 100644 --- a/goal_src/jak2/engine/collide/collide-cache-h.gc +++ b/goal_src/jak2/engine/collide/collide-cache-h.gc @@ -46,6 +46,7 @@ (prim-index uint16 :offset 56) (user16 uint16 :offset 58) (user32 uint32 :offset 60) + (clear-flags uint128 :offset 48) ) :method-count-assert 9 :size-assert #x40 @@ -105,7 +106,7 @@ (probe-using-spheres (_type_ collide-query) symbol 17) (fill-from-bg (_type_ (function collide-hash int collide-list collide-query int) (function collide-cache collide-list collide-query none) collide-query) none 18) (fill-from-fg-boxes (_type_) none 19) - (fill-from-fg-line-sphere (_type_) none 20) + (fill-from-fg-line-sphere (_type_ collide-query) none 20) (fill-from-water (_type_ water-control) none 21) (collide-cache-method-22 () none 22) (collide-cache-method-23 () none 23) diff --git a/goal_src/jak2/engine/collide/collide-cache.gc b/goal_src/jak2/engine/collide/collide-cache.gc index e479adfa13..613ad5ca46 100644 --- a/goal_src/jak2/engine/collide/collide-cache.gc +++ b/goal_src/jak2/engine/collide/collide-cache.gc @@ -7,3 +7,879 @@ ;; DECOMP BEGINS +(defmethod reset collide-cache ((obj collide-cache)) + (set! (-> obj num-tris) 0) + (set! (-> obj num-prims) 0) + (set! (-> obj ignore-processes 0) #f) + (set! (-> obj ignore-processes 1) #f) + (set! *already-printed-exeeded-max-cache-tris* #f) + 0 + (none) + ) + +(defmethod fill-from-bg collide-cache ((obj collide-cache) + (arg0 (function collide-hash int collide-list collide-query int)) + (arg1 (function collide-cache collide-list collide-query none)) + (arg2 collide-query) + ) + (set! *already-printed-exeeded-max-cache-tris* #f) + (set! (-> *collide-list* num-items) 0) + (if *collide-list-boxes* + (add-debug-box + #t + (bucket-id debug2) + (the-as vector (-> arg2 bbox)) + (-> arg2 bbox max) + (new 'static 'rgba :g #xff :b #xff :a #x80) + ) + ) + (dotimes (s2-0 (-> *level* length)) + (let ((v1-7 (-> *level* level s2-0))) + (if (= (-> v1-7 status) 'active) + (arg0 (-> v1-7 bsp collide-hash) 0 *collide-list* arg2) + ) + ) + ) + (when (> (-> *collide-list* num-items) 0) + (arg1 *collide-cache* *collide-list* arg2) + (let ((a0-8 (-> obj num-tris))) + (when (> a0-8 0) + (let ((v1-16 (-> obj prims)) + (a1-6 *collide-shape-prim-backgnd*) + ) + (set! (-> v1-16 0 num-tris) (the-as uint a0-8)) + (set! (-> v1-16 0 prim) a1-6) + (set! (-> obj num-prims) 1) + (set! (-> v1-16 0 first-tri) (the-as uint 0)) + (set! (-> v1-16 0 ccache) obj) + (set! (-> v1-16 0 prim-core world-sphere quad) (-> a1-6 prim-core world-sphere quad)) + (set! (-> v1-16 0 prim-core quad 1) (-> a1-6 prim-core quad 1)) + ) + ) + ) + ) + 0 + (none) + ) + +(defmethod fill-from-water collide-cache ((obj collide-cache) (arg0 water-control)) + (rlet ((vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + (vf3 :class vf) + (vf4 :class vf) + (vf5 :class vf) + ) + (init-vf0-vector) + (when (= (-> obj num-prims) 100) + (if (= *cheat-mode* 'debug) + (format 0 "ERROR: Exceeded max number of collide-cache prims!~%") + ) + (return #f) + ) + (when (< 460 (+ (-> obj num-tris) 2)) + (if (= *cheat-mode* 'debug) + (print-exceeded-max-cache-tris) + ) + (return #f) + ) + (if (not (and (logtest? (-> arg0 flags) (water-flags active)) + (logtest? (-> arg0 flags) (water-flags can-ground)) + (logtest? (-> arg0 flags) (water-flags swim-ground under-water)) + (logtest? (water-flags over-water) (-> arg0 flags)) + (zero? (logand (water-flags jump-out) (-> arg0 flags))) + ) + ) + (return #f) + ) + (let ((v1-24 (-> arg0 collide-height))) + (.lvf vf1 (&-> obj collide-box min quad)) + (.lvf vf3 (&-> obj collide-box max quad)) + (let ((a2-6 (-> obj num-prims-u32)) + (a3-4 (the-as (inline-array collide-cache-tri) (-> obj tris (-> obj num-tris)))) + ) + (.mov vf5 v1-24) + (.add.x.vf vf1 vf0 vf5 :mask #b10) + (set! (-> a3-4 0 clear-flags) (the-as uint128 0)) + (set! (-> a3-4 0 prim-index) a2-6) + (.add.x.vf vf3 vf0 vf5 :mask #b10) + (set! (-> a3-4 1 clear-flags) (the-as uint128 0)) + (set! (-> a3-4 1 prim-index) a2-6) + (.mov.vf vf2 vf1) + (.mov.vf vf4 vf1) + (.add.z.vf vf2 vf0 vf3 :mask #b100) + (.add.x.vf vf4 vf0 vf3 :mask #b1) + (.svf (&-> a3-4 0 vertex 0 quad) vf1) + (.svf (&-> a3-4 0 vertex 1 quad) vf2) + (.svf (&-> a3-4 0 vertex 2 quad) vf3) + (set! (-> a3-4 0 pat) (new 'static 'pat-surface :material (pat-material waterbottom))) + (set! (-> a3-4 0 collide-ptr) arg0) + (.svf (&-> a3-4 1 vertex 0 quad) vf1) + (.svf (&-> a3-4 1 vertex 1 quad) vf3) + (.svf (&-> a3-4 1 vertex 2 quad) vf4) + (set! (-> a3-4 1 pat) (new 'static 'pat-surface :material (pat-material waterbottom))) + (set! (-> a3-4 1 collide-ptr) arg0) + ) + ) + (let ((v1-27 *collide-shape-prim-water*) + (a1-5 (-> obj prims (-> obj num-prims))) + ) + (set! (-> a1-5 first-tri) (the-as uint (-> obj num-tris))) + (set! (-> a1-5 num-tris) (the-as uint 2)) + (set! (-> a1-5 prim) v1-27) + (set! (-> a1-5 ccache) obj) + (set! (-> a1-5 prim-core world-sphere quad) (-> v1-27 prim-core world-sphere quad)) + (set! (-> a1-5 prim-core quad 1) (-> v1-27 prim-core quad 1)) + ) + (+! (-> obj num-prims) 1) + (+! (-> obj num-tris) 2) + 0 + (none) + ) + ) + +(defmethod fill-using-bounding-box collide-cache ((obj collide-cache) (arg0 collide-query)) + (rlet ((vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + (vf3 :class vf) + (vf4 :class vf) + ) + (init-vf0-vector) + (+! (-> *collide-stats* calls) 1) + (new 'static 'vector :x 0.5) + (nop!) + (nop!) + (let ((v1-4 (-> arg0 collide-with-s32))) + (nop!) + (let ((a0-2 (-> arg0 ignore-process0))) + (nop!) + (let ((a1-1 (-> arg0 ignore-process1))) + (nop!) + (let ((a2-0 (-> arg0 ignore-pat-s32))) + (nop!) + (.lvf vf1 (&-> arg0 bbox min quad)) + (nop!) + (.lvf vf2 (&-> arg0 bbox max quad)) + (nop!) + (set! (-> obj ignore-processes 0) (the-as process a0-2)) + (nop!) + (set! (-> obj ignore-processes 1) (the-as process a1-1)) + (.mov.vf vf1 vf0 :mask #b1000) + (nop!) + (.mov.vf vf2 vf0 :mask #b1000) + (set! (-> obj ignore-mask) (the-as pat-surface a2-0)) + ) + ) + ) + (.ftoi.vf vf3 vf1) + (nop!) + (.ftoi.vf vf4 vf2) + (set! (-> obj num-tris) 0) + (nop!) + (.svf (&-> obj collide-box min quad) vf1) + (nop!) + (.svf (&-> obj collide-box max quad) vf2) + (nop!) + (.svf (&-> obj collide-box4w min quad) vf3) + (nop!) + (.svf (&-> obj collide-box4w max quad) vf4) + (nop!) + (.svf (&-> arg0 bbox4w min quad) vf3) + (nop!) + (.svf (&-> arg0 bbox4w max quad) vf4) + (nop!) + (set! (-> obj num-prims) 0) + (nop!) + (set! (-> obj collide-with) (the-as collide-spec v1-4)) + ) + 0 + (when (logtest? (-> arg0 collide-with) (collide-spec backgnd)) + (fill-from-bg + obj + (method-of-type collide-hash fill-collide-list-from-box) + collide-list-fill-bg-using-box + arg0 + ) + (+! (-> *collide-stats* output) (-> obj num-tris)) + ) + (when (logtest? (-> arg0 collide-with) (collide-spec water)) + (let ((v1-18 (-> arg0 ignore-process0))) + (if v1-18 + (fill-from-water obj (-> (the-as process-drawable v1-18) water)) + ) + ) + ) + (if (logtest? (-> arg0 collide-with) (collide-spec hit-by-player-list hit-by-others-list player-list)) + (fill-from-fg-boxes obj) + ) + 0 + (none) + ) + ) + +(defmethod fill-using-line-sphere collide-cache ((obj collide-cache) (arg0 collide-query)) + (local-vars (v1-11 uint) (v1-20 float)) + (rlet ((acc :class vf) + (Q :class vf) + (vf0 :class vf) + (vf1 :class vf) + (vf10 :class vf) + (vf11 :class vf) + (vf12 :class vf) + (vf13 :class vf) + (vf14 :class vf) + (vf15 :class vf) + (vf16 :class vf) + (vf17 :class vf) + (vf18 :class vf) + (vf19 :class vf) + (vf2 :class vf) + (vf20 :class vf) + (vf22 :class vf) + (vf23 :class vf) + (vf3 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + (vf8 :class vf) + (vf9 :class vf) + ) + (init-vf0-vector) + (+! (-> *collide-stats* calls) 1) + (let ((v1-3 0)) + (if (< (fabs (-> arg0 move-dist x)) 4096.0) + (+! v1-3 1) + ) + (if (< (fabs (-> arg0 move-dist y)) 4096.0) + (+! v1-3 1) + ) + (if (< (fabs (-> arg0 move-dist z)) 4096.0) + (+! v1-3 1) + ) + (when (< 1 v1-3) + (set-from-point-offset-pad! (-> arg0 bbox) (-> arg0 start-pos) (-> arg0 move-dist) (-> arg0 radius)) + (fill-using-bounding-box obj arg0) + (b! #t cfg-47 :delay (nop!)) + (the-as none 0) + (nop!) + ) + ) + (nop!) + (let ((v1-10 (-> arg0 ignore-pat-s32))) + (nop!) + (let ((a0-14 (-> arg0 ignore-process0))) + (nop!) + (let ((a1-3 (-> arg0 ignore-process1))) + (nop!) + (let ((a2-1 (-> arg0 collide-with-s32))) + (nop!) + (.lvf vf9 (&-> arg0 exit-planes 0 quad)) + (nop!) + (.lvf vf3 (&-> arg0 move-dist quad)) + (nop!) + (.mov.vf vf13 vf0) + (nop!) + (.lvf vf1 (&-> arg0 start-pos quad)) + (.mul.vf vf8 vf3 vf3) + (nop!) + (.add.vf vf2 vf1 vf3) + (set! (-> obj ignore-mask) (the-as pat-surface v1-10)) + (.add.y.vf vf8 vf8 vf8 :mask #b1) + (set! (-> obj num-tris) 0) + (.min.vf vf4 vf1 vf2) + (set! (-> obj num-prims) 0) + (.max.vf vf5 vf1 vf2) + (set! (-> obj collide-with) (the-as collide-spec a2-1)) + ) + (.sub.w.vf vf10 vf0 vf9 :mask #b111) + (set! (-> obj ignore-processes 0) (the-as process a0-14)) + (.add.z.vf vf8 vf8 vf8 :mask #b1) + (set! (-> obj ignore-processes 1) (the-as process a1-3)) + ) + ) + ) + (.sub.w.vf vf4 vf4 vf9 :mask #b111) + (nop!) + (.add.w.vf vf5 vf5 vf9 :mask #b111) + (nop!) + (.ftoi.vf vf15 vf10) + (nop!) + (.isqrt.vf Q vf0 vf8 :fsf #b11 :ftf #b0) + (nop!) + (.add.w.vf vf11 vf0 vf9 :mask #b111) + (nop!) + (nop!) + (nop!) + (nop!) + (.svf (&-> arg0 local-box4w min quad) vf15) + (.ftoi.vf vf6 vf4) + (.svf (&-> obj collide-box min quad) vf4) + (.ftoi.vf vf7 vf5) + (.svf (&-> obj collide-box max quad) vf5) + (nop!) + (.svf (&-> arg0 bbox min quad) vf4) + (nop!) + (.svf (&-> arg0 bbox max quad) vf5) + (nop!) + (.svf (&-> obj collide-box4w min quad) vf6) + (nop!) + (.svf (&-> obj collide-box4w max quad) vf7) + (nop!) + (.svf (&-> arg0 bbox4w min quad) vf6) + (nop!) + (.svf (&-> arg0 bbox4w max quad) vf7) + (.wait.vf) + (nop!) + (.add.vf vf8 vf0 Q :mask #b1) + (nop!) + (.mul.x.vf vf12 vf3 vf8) + (nop!) + (.nop.vf) + (nop!) + (.div.vf Q vf0 vf8 :fsf #b11 :ftf #b0) + (nop!) + (.mul.vf vf22 vf12 vf12) + (nop!) + (.abs.vf vf23 vf12) + (nop!) + (.add.y.vf vf22 vf22 vf22 :mask #b1) + (.mov v1-11 vf23) + (.wait.vf) + (nop!) + (.add.vf vf8 vf0 Q :mask #b1) + (nop!) + (b! (zero? v1-11) cfg-12 :likely-delay (.add.z.vf vf13 vf0 vf12 :mask #b1)) + (.sub.y.vf vf13 vf0 vf12 :mask #b1) + (nop!) + (.isqrt.vf Q vf0 vf22 :fsf #b11 :ftf #b0) + (nop!) + (.add.x.vf vf13 vf0 vf12 :mask #b10) + (nop!) + (.wait.vf) + (nop!) + (.mul.vf vf13 vf13 Q :mask #b11) + (nop!) + (label cfg-12) + (.outer.product.a.vf acc vf12 vf13) + (nop!) + (.add.x.vf vf11 vf11 vf8 :mask #b1) + (nop!) + (.outer.product.b.vf vf14 vf13 vf12 acc) + (nop!) + (.ftoi.vf vf16 vf11) + (nop!) + (.mov.vf vf17 vf12) + (nop!) + (.mov.vf vf18 vf13) + (nop!) + (.mov.vf vf19 vf14) + (nop!) + (.mov.vf vf17 vf0 :mask #b1110) + (.svf (&-> arg0 local-box4w max quad) vf16) + (.mov.vf vf18 vf0 :mask #b1101) + (nop!) + (.mov.vf vf19 vf0 :mask #b1011) + (nop!) + (.add.x.vf vf17 vf17 vf13 :mask #b10) + (nop!) + (.add.y.vf vf18 vf18 vf12 :mask #b1) + (nop!) + (.add.z.vf vf19 vf19 vf12 :mask #b1) + (nop!) + (.add.x.vf vf17 vf17 vf14 :mask #b100) + (nop!) + (.add.y.vf vf18 vf18 vf14 :mask #b100) + (nop!) + (.add.z.vf vf19 vf19 vf13 :mask #b10) + (nop!) + (.mul.x.vf acc vf17 vf1) + (nop!) + (.add.mul.y.vf acc vf18 vf1 acc) + (.svf (&-> arg0 inv-mat quad 0) vf17) + (.add.mul.z.vf vf20 vf19 vf1 acc) + (.svf (&-> arg0 inv-mat quad 1) vf18) + (.sub.vf vf20 vf0 vf20) + (.svf (&-> arg0 inv-mat quad 2) vf19) + (nop!) + (.svf (&-> arg0 inv-mat trans quad) vf20) + (set! (-> arg0 rlength x) (if (= (-> arg0 move-dist x) 0.0) + 0.0 + (/ 1.0 (-> arg0 move-dist x)) + ) + ) + (set! (-> arg0 rlength y) (if (= (-> arg0 move-dist y) 0.0) + 0.0 + (/ 1.0 (-> arg0 move-dist y)) + ) + ) + (set! (-> arg0 rlength z) (if (= (-> arg0 move-dist z) 0.0) + 0.0 + (/ 1.0 (-> arg0 move-dist z)) + ) + ) + (let ((f0-19 1.0)) + (.lvf vf1 (&-> (-> arg0 move-dist) quad)) + (.add.w.vf vf2 vf0 vf0 :mask #b1) + (.mul.vf vf1 vf1 vf1) + (.mul.x.vf acc vf2 vf1 :mask #b1) + (.add.mul.y.vf acc vf2 vf1 acc :mask #b1) + (.add.mul.z.vf vf1 vf2 vf1 acc :mask #b1) + (.mov v1-20 vf1) + (set! (-> arg0 rlength w) (/ f0-19 v1-20)) + ) + (set! (-> arg0 exit-planes 0 x) (if (< 0.0 (-> arg0 move-dist x)) + 0.0 + 100000000000000000000000000000000000000.0 + ) + ) + (set! (-> arg0 exit-planes 0 y) (if (< 0.0 (-> arg0 move-dist y)) + 0.0 + 100000000000000000000000000000000000000.0 + ) + ) + (set! (-> arg0 exit-planes 0 z) (if (< 0.0 (-> arg0 move-dist z)) + 0.0 + 100000000000000000000000000000000000000.0 + ) + ) + (set! (-> arg0 exit-planes 1 x) (if (< (-> arg0 move-dist x) 0.0) + 0.0 + 100000000000000000000000000000000000000.0 + ) + ) + (set! (-> arg0 exit-planes 1 y) (if (< (-> arg0 move-dist y) 0.0) + 0.0 + 100000000000000000000000000000000000000.0 + ) + ) + (set! (-> arg0 exit-planes 1 z) (if (< (-> arg0 move-dist z) 0.0) + 0.0 + 100000000000000000000000000000000000000.0 + ) + ) + (when (logtest? (-> arg0 collide-with) (collide-spec backgnd)) + (fill-from-bg + obj + (method-of-type collide-hash fill-collide-list-from-line-sphere) + collide-list-fill-bg-using-line-sphere + arg0 + ) + (+! (-> *collide-stats* output) (-> obj num-tris)) + ) + (when (logtest? (-> arg0 collide-with) (collide-spec water)) + (let ((a1-5 (-> (the-as process-drawable (-> arg0 ignore-process0)) water))) + (if (nonzero? a1-5) + (fill-from-water obj a1-5) + ) + ) + ) + (if (logtest? (-> arg0 collide-with) (collide-spec hit-by-player-list hit-by-others-list player-list)) + (fill-from-fg-line-sphere obj arg0) + ) + 0 + (label cfg-47) + (none) + ) + ) + +;; definition for method 19 of type collide-cache +;; WARN: Return type mismatch int vs none. +(defmethod fill-from-fg-boxes collide-cache ((obj collide-cache)) + (let ((s5-0 (-> obj collide-with))) + (set! *actor-list-length* 0) + (if (logtest? s5-0 (collide-spec hit-by-others-list)) + (set! *actor-list-length* (fill-actor-list-for-box *actor-hash* (-> obj collide-box) *actor-list* 256)) + ) + (when (logtest? s5-0 (collide-spec player-list)) + (let ((a0-2 (-> *collide-player-list* alive-list next0))) + *collide-player-list* + (let ((v1-13 (-> a0-2 next0))) + (while (!= a0-2 (-> *collide-player-list* alive-list-end)) + (let* ((a0-3 (-> (the-as connection a0-2) param1)) + (a1-1 (-> (the-as collide-shape a0-3) root-prim)) + ) + (when (logtest? s5-0 (-> a1-1 prim-core collide-as)) + (let ((a1-2 (-> a1-1 prim-core))) + (when (and (>= (+ (-> a1-2 world-sphere x) (-> a1-2 world-sphere w)) (-> obj collide-box min x)) + (>= (-> obj collide-box max x) (- (-> a1-2 world-sphere x) (-> a1-2 world-sphere w))) + (>= (+ (-> a1-2 world-sphere y) (-> a1-2 world-sphere w)) (-> obj collide-box min y)) + (>= (-> obj collide-box max y) (- (-> a1-2 world-sphere y) (-> a1-2 world-sphere w))) + (>= (+ (-> a1-2 world-sphere z) (-> a1-2 world-sphere w)) (-> obj collide-box min z)) + (>= (-> obj collide-box max z) (- (-> a1-2 world-sphere z) (-> a1-2 world-sphere w))) + ) + (when (< *actor-list-length* 256) + (set! (-> *actor-list* *actor-list-length*) (the-as collide-shape a0-3)) + (set! *actor-list-length* (+ *actor-list-length* 1)) + ) + ) + ) + ) + ) + (set! a0-2 v1-13) + *collide-player-list* + (set! v1-13 (-> v1-13 next0)) + ) + ) + ) + ) + (when (logtest? s5-0 (collide-spec hit-by-player-list)) + (let ((a0-5 (-> *collide-hit-by-player-list* alive-list next0))) + *collide-hit-by-player-list* + (let ((v1-21 (-> a0-5 next0))) + (while (!= a0-5 (-> *collide-hit-by-player-list* alive-list-end)) + (let* ((a0-6 (-> (the-as connection a0-5) param1)) + (a1-13 (-> (the-as collide-shape a0-6) root-prim)) + ) + (when (logtest? s5-0 (-> a1-13 prim-core collide-as)) + (let ((a1-14 (-> a1-13 prim-core))) + (when (and (>= (+ (-> a1-14 world-sphere x) (-> a1-14 world-sphere w)) (-> obj collide-box min x)) + (>= (-> obj collide-box max x) (- (-> a1-14 world-sphere x) (-> a1-14 world-sphere w))) + (>= (+ (-> a1-14 world-sphere y) (-> a1-14 world-sphere w)) (-> obj collide-box min y)) + (>= (-> obj collide-box max y) (- (-> a1-14 world-sphere y) (-> a1-14 world-sphere w))) + (>= (+ (-> a1-14 world-sphere z) (-> a1-14 world-sphere w)) (-> obj collide-box min z)) + (>= (-> obj collide-box max z) (- (-> a1-14 world-sphere z) (-> a1-14 world-sphere w))) + ) + (when (< *actor-list-length* 256) + (set! (-> *actor-list* *actor-list-length*) (the-as collide-shape a0-6)) + (set! *actor-list-length* (+ *actor-list-length* 1)) + ) + ) + ) + ) + ) + (set! a0-5 v1-21) + *collide-hit-by-player-list* + (set! v1-21 (-> v1-21 next0)) + ) + ) + ) + ) + (dotimes (s4-0 *actor-list-length*) + (let ((v1-26 (-> *actor-list* s4-0))) + (when (logtest? s5-0 (-> v1-26 root-prim prim-core collide-as)) + (let ((a0-13 (-> v1-26 process))) + (if (not (or (= a0-13 (-> obj ignore-processes 0)) (= a0-13 (-> obj ignore-processes 1)))) + (add-fg-prim-using-box (-> v1-26 root-prim) obj) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) +;; definition for method 10 of type collide-shape-prim +;; WARN: Return type mismatch object vs none. +(defmethod add-fg-prim-using-box collide-shape-prim ((obj collide-shape-prim) (arg0 collide-cache)) + (format 0 "ERROR: Illegal collide-shape-prim type passed to collide-shape-prim::add-fg-prim-using-box!~%") + (none) + ) + +;; definition for method 10 of type collide-shape-prim-mesh +;; ERROR: function was not converted to expressions. Cannot decompile. +(defmethod-mips2c "(method 10 collide-shape-prim-mesh)" 10 collide-shape-prim-mesh) + +;; definition for method 10 of type collide-shape-prim-sphere +;; ERROR: function was not converted to expressions. Cannot decompile. +(defmethod-mips2c "(method 10 collide-shape-prim-sphere)" 10 collide-shape-prim-sphere) + +;; definition for method 10 of type collide-shape-prim-group +;; ERROR: function was not converted to expressions. Cannot decompile. +(defmethod-mips2c "(method 10 collide-shape-prim-group)" 10 collide-shape-prim-group) + +;; definition for method 20 of type collide-cache +;; WARN: Return type mismatch int vs none. +(defmethod fill-from-fg-line-sphere collide-cache ((obj collide-cache) (arg0 collide-query)) + (local-vars (v1-9 float)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + ) + (init-vf0-vector) + (let ((s4-0 (-> arg0 collide-with))) + (set! *actor-list-length* 0) + (if (logtest? s4-0 (collide-spec hit-by-others-list)) + (set! *actor-list-length* (fill-actor-list-for-line-sphere + *actor-hash* + (-> arg0 start-pos) + (-> arg0 move-dist) + (-> arg0 radius) + *actor-list* + 256 + -1 + ) + ) + ) + (let ((f30-0 0.0) + (s3-0 (new 'stack-no-clear 'matrix)) + ) + (.lvf vf1 (&-> (-> arg0 move-dist) quad)) + (.add.w.vf vf2 vf0 vf0 :mask #b1) + (.mul.vf vf1 vf1 vf1) + (.mul.x.vf acc vf2 vf1 :mask #b1) + (.add.mul.y.vf acc vf2 vf1 acc :mask #b1) + (.add.mul.z.vf vf1 vf2 vf1 acc :mask #b1) + (.mov v1-9 vf1) + (let ((f0-1 v1-9)) + (if (< 0.0 f0-1) + (set! f30-0 (/ 1.0 f0-1)) + ) + ) + (when (logtest? s4-0 (collide-spec player-list)) + (let ((v1-17 (-> *collide-player-list* alive-list next0))) + *collide-player-list* + (let ((s2-0 (-> v1-17 next0))) + (while (!= v1-17 (-> *collide-player-list* alive-list-end)) + (let* ((s1-0 (-> (the-as connection v1-17) param1)) + (v1-18 (-> (the-as collide-shape s1-0) root-prim)) + ) + (when (logtest? s4-0 (-> v1-18 prim-core collide-as)) + (let ((s0-0 (-> v1-18 prim-core))) + (vector-! (-> s3-0 vector 1) (the-as vector s0-0) (-> arg0 start-pos)) + (let* ((f1-2 (* (vector-dot (-> arg0 move-dist) (-> s3-0 vector 1)) f30-0)) + (f0-6 (fmax 0.0 (fmin 1.0 f1-2))) + ) + (vector+float*! (the-as vector (-> s3-0 vector)) (-> arg0 start-pos) (-> arg0 move-dist) f0-6) + ) + (let ((f0-7 (vector-vector-distance-squared (the-as vector (-> s3-0 vector)) (the-as vector s0-0))) + (f1-5 (+ (-> arg0 radius) (-> s0-0 world-sphere w))) + ) + (when (< f0-7 (* f1-5 f1-5)) + (when (< *actor-list-length* 256) + (set! (-> *actor-list* *actor-list-length*) (the-as collide-shape s1-0)) + (set! *actor-list-length* (+ *actor-list-length* 1)) + ) + ) + ) + ) + ) + ) + (set! v1-17 s2-0) + *collide-player-list* + (set! s2-0 (-> s2-0 next0)) + ) + ) + ) + ) + (when (logtest? s4-0 (collide-spec hit-by-player-list)) + (let ((v1-38 (-> *collide-hit-by-player-list* alive-list next0))) + *collide-hit-by-player-list* + (let ((s2-1 (-> v1-38 next0))) + (while (!= v1-38 (-> *collide-hit-by-player-list* alive-list-end)) + (let* ((s1-1 (-> (the-as connection v1-38) param1)) + (v1-39 (-> (the-as collide-shape s1-1) root-prim)) + ) + (when (logtest? s4-0 (-> v1-39 prim-core collide-as)) + (let ((s0-1 (-> v1-39 prim-core))) + (vector-! (-> s3-0 vector 1) (the-as vector s0-1) (-> arg0 start-pos)) + (let* ((f1-8 (* (vector-dot (-> arg0 move-dist) (-> s3-0 vector 1)) f30-0)) + (f0-11 (fmax 0.0 (fmin 1.0 f1-8))) + ) + (vector+float*! (the-as vector (-> s3-0 vector)) (-> arg0 start-pos) (-> arg0 move-dist) f0-11) + ) + (let ((f0-12 (vector-vector-distance-squared (the-as vector (-> s3-0 vector)) (the-as vector s0-1))) + (f1-11 (+ (-> arg0 radius) (-> s0-1 world-sphere w))) + ) + (when (< f0-12 (* f1-11 f1-11)) + (when (< *actor-list-length* 256) + (set! (-> *actor-list* *actor-list-length*) (the-as collide-shape s1-1)) + (set! *actor-list-length* (+ *actor-list-length* 1)) + ) + ) + ) + ) + ) + ) + (set! v1-38 s2-1) + *collide-hit-by-player-list* + (set! s2-1 (-> s2-1 next0)) + ) + ) + ) + ) + ) + (dotimes (s3-1 *actor-list-length*) + (let ((v1-58 (-> *actor-list* s3-1))) + (when (logtest? s4-0 (-> v1-58 root-prim prim-core collide-as)) + (let ((a0-37 (-> v1-58 process))) + (if (not (or (= a0-37 (-> obj ignore-processes 0)) (= a0-37 (-> obj ignore-processes 1)))) + ((method-of-object (-> v1-58 root-prim) add-fg-prim-using-line-sphere)) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + ) + +;; definition for method 11 of type collide-shape-prim +;; WARN: Return type mismatch object vs none. +(defmethod add-fg-prim-using-line-sphere collide-shape-prim () + (format + 0 + "ERROR: Illegal collide-shape-prim type passed to collide-shape-prim::add-fg-prim-using-line-sphere!~%" + ) + (none) + ) + +;; definition for method 11 of type collide-shape-prim-mesh +;; ERROR: function was not converted to expressions. Cannot decompile. +(defmethod-mips2c "(method 11 collide-shape-prim-mesh)" 11 collide-shape-prim-mesh) + +;; definition for method 11 of type collide-shape-prim-sphere +;; ERROR: function was not converted to expressions. Cannot decompile. +(defmethod-mips2c "(method 11 collide-shape-prim-sphere)" 11 collide-shape-prim-sphere) + +;; definition for method 11 of type collide-shape-prim-group +;; ERROR: function was not converted to expressions. Cannot decompile. +(defmethod-mips2c "(method 11 collide-shape-prim-group)" 11 collide-shape-prim-group) + + +;; definition for method 10 of type collide-cache +(defmethod fill-and-probe-using-line-sphere collide-cache ((obj collide-cache) (arg0 collide-query)) + (fill-using-line-sphere obj arg0) + (probe-using-line-sphere obj arg0) + ) + +;; definition of type collide-puls-work +(deftype collide-puls-work (structure) + ((ignore-pat pat-surface :offset-assert 0) + (bsphere sphere :inline :offset-assert 16) + (move-dist vector :inline :offset-assert 32) + ) + :method-count-assert 9 + :size-assert #x30 + :flag-assert #x900000030 + ) + +;; definition for method 16 of type collide-cache +(defmethod probe-using-line-sphere collide-cache ((obj collide-cache) (arg0 collide-query)) + (rlet ((vf0 :class vf) + (vf2 :class vf) + (vf3 :class vf) + (vf4 :class vf) + ) + (init-vf0-vector) + (let ((s5-0 (new 'stack-no-clear 'collide-cache-tri))) + (.lvf vf4 (&-> arg0 exit-planes 0 quad)) + (.lvf vf3 (&-> arg0 start-pos quad)) + (.lvf vf2 (&-> arg0 move-dist quad)) + (set! (-> s5-0 vertex 0 x) (the-as float (-> arg0 ignore-pat))) + (.mul.w.vf vf3 vf0 vf4 :mask #b1000) + (.svf (&-> s5-0 vertex 2 quad) vf2) + (.svf (&-> s5-0 vertex 1 quad) vf3) + (let ((s4-0 (the-as object (-> obj prims))) + (f30-0 -100000000.0) + ) + (countdown (s3-0 (-> obj num-prims)) + (when (and (logtest? (-> arg0 collide-with) (-> (the-as collide-cache-prim s4-0) prim-core collide-as)) + (logtest? (-> arg0 action-mask) (-> (the-as collide-cache-prim s4-0) prim-core action)) + ) + (cond + ((>= (the-as int (-> (the-as collide-cache-prim s4-0) prim-core prim-type)) 0) + (let ((f0-0 ((method-of-type collide-cache-prim resolve-moving-sphere-tri) + (the-as collide-cache-prim s4-0) + (the-as collide-tri-result arg0) + (the-as collide-prim-core (-> s5-0 vertex 1)) + (-> s5-0 vertex 2) + f30-0 + (collide-action solid) + ) + ) + ) + (if (>= f0-0 0.0) + (set! f30-0 f0-0) + ) + ) + ) + (else + (when (not (logtest? (-> arg0 ignore-pat) + (-> (the-as collide-shape-prim-sphere (-> (the-as collide-cache-prim s4-0) prim)) pat) + ) + ) + (let ((f0-1 ((method-of-type collide-cache-prim resolve-moving-sphere-sphere) + (the-as collide-cache-prim s4-0) + (the-as collide-tri-result arg0) + (the-as collide-prim-core (-> s5-0 vertex 1)) + (-> s5-0 vertex 2) + f30-0 + (collide-action solid) + ) + ) + ) + (if (>= f0-1 0.0) + (set! f30-0 f0-1) + ) + ) + ) + ) + ) + ) + (set! s4-0 (-> (the-as (inline-array collide-cache-prim) s4-0) 1)) + ) + f30-0 + ) + ) + ) + ) + +;; definition of type lsmi-work +(deftype lsmi-work (structure) + ((best-u float :offset-assert 0) + (orig-best-u float :offset-assert 4) + (action uint32 :offset-assert 8) + (cquery collide-query :inline :offset-assert 16) + ) + :method-count-assert 9 + :size-assert #x22c + :flag-assert #x90000022c + ) + +;; definition for method 9 of type collide-cache-prim +;; ERROR: function was not converted to expressions. Cannot decompile. +(defmethod-mips2c "(method 9 collide-cache-prim)" 9 collide-cache-prim) + + +;; definition for method 10 of type collide-cache-prim +;; ERROR: function was not converted to expressions. Cannot decompile. +(defmethod-mips2c "(method 10 collide-cache-prim)" 10 collide-cache-prim) + + +;; definition for method 11 of type collide-cache +(defmethod fill-and-probe-using-spheres collide-cache ((obj collide-cache) (arg0 collide-query)) + (fill-using-spheres obj arg0) + (probe-using-spheres obj arg0) + ) + +;; definition for method 14 of type collide-cache +(defmethod fill-using-spheres collide-cache ((obj collide-cache) (arg0 collide-query)) + (new 'stack-no-clear 'bounding-box) + (set-from-spheres! + (-> arg0 bbox) + (the-as (inline-array sphere) (-> arg0 best-dist)) + (the-as int (-> arg0 num-spheres)) + ) + (fill-using-bounding-box obj arg0) + (none) + ) + +;; definition for method 17 of type collide-cache +;; ERROR: function was not converted to expressions. Cannot decompile. +(defmethod-mips2c "(method 17 collide-cache)" 17 collide-cache) + +;; definition for method 9 of type collide-puss-work +;; ERROR: function was not converted to expressions. Cannot decompile. +(defmethod-mips2c "(method 9 collide-puss-work)" 9 collide-puss-work) + +;; definition for method 10 of type collide-puss-work +;; ERROR: function was not converted to expressions. Cannot decompile. +(defmethod-mips2c "(method 10 collide-puss-work)" 10 collide-puss-work) + + diff --git a/goal_src/jak2/engine/collide/collide-shape-h.gc b/goal_src/jak2/engine/collide/collide-shape-h.gc index 2e1da018a6..f661cca090 100644 --- a/goal_src/jak2/engine/collide/collide-shape-h.gc +++ b/goal_src/jak2/engine/collide/collide-shape-h.gc @@ -14,6 +14,7 @@ (declare-type collide-shape-prim-group basic) (declare-type collide-cache-prim structure) (declare-type collide-shape-prim basic) +(declare-type collide-cache basic) (defenum penetrate :bitfield #t @@ -405,7 +406,7 @@ (:methods (new (symbol type collide-shape uint int) _type_ 0) (debug-draw (_type_) none 9) - (add-fg-prim-using-box () none 10) + (add-fg-prim-using-box (_type_ collide-cache) none 10) (add-fg-prim-using-line-sphere () none 11) (overlaps-others-test (_type_ overlaps-others-params collide-shape-prim) symbol 12) (overlaps-others-group (_type_ overlaps-others-params collide-shape-prim-group) symbol 13) diff --git a/goal_src/jak2/engine/common_objs/powerups.gc b/goal_src/jak2/engine/common_objs/powerups.gc index 968056d68b..c248d4f854 100644 --- a/goal_src/jak2/engine/common_objs/powerups.gc +++ b/goal_src/jak2/engine/common_objs/powerups.gc @@ -7,3 +7,9 @@ ;; DECOMP BEGINS +(defbehavior target-powerup-process target () + (none)) + +(defbehavior target-land-effect target () + (none) + ) \ No newline at end of file diff --git a/goal_src/jak2/engine/game/game-info.gc b/goal_src/jak2/engine/game/game-info.gc index dc3c0ab98e..04cfbfff03 100644 --- a/goal_src/jak2/engine/game/game-info.gc +++ b/goal_src/jak2/engine/game/game-info.gc @@ -468,7 +468,8 @@ ) ) ) - (initialize *bigmap*) + (format 0 "SKIP initialize bigmap~%") + ;(initialize *bigmap*) ) ) (case arg0 diff --git a/goal_src/jak2/engine/gfx/foreground/foreground.gc b/goal_src/jak2/engine/gfx/foreground/foreground.gc index 993a818b81..747adeac42 100644 --- a/goal_src/jak2/engine/gfx/foreground/foreground.gc +++ b/goal_src/jak2/engine/gfx/foreground/foreground.gc @@ -8,4 +8,5 @@ ;; DECOMP BEGINS ;; this is wrong, just a placeholder -(define *default-shadow-settings* (new 'static 'shadow-settings)) \ No newline at end of file +(define *default-shadow-settings* (new 'static 'shadow-settings)) +(define *foreground-draw-engine* (new 'global 'engine 'draw 768 connection)) \ No newline at end of file diff --git a/goal_src/jak2/engine/process-drawable/process-drawable.gc b/goal_src/jak2/engine/process-drawable/process-drawable.gc index 71ff7f72fb..a4b9cab168 100644 --- a/goal_src/jak2/engine/process-drawable/process-drawable.gc +++ b/goal_src/jak2/engine/process-drawable/process-drawable.gc @@ -7,6 +7,20 @@ (declare-type fuel-cell basic) ;; TODO!! +(defun-debug draw-bone-lines ((obj process-drawable)) + "Added in PC port to debug bones" + (dotimes (i (-> obj node-list length)) + (let ((parent (-> obj node-list data i parent))) + (when (and parent (nonzero? parent) (-> parent joint) (-> parent parent)) + (let ((child (vector<-cspace! (new-stack-vector0) (-> obj node-list data i))) + ) + (add-debug-line #t (bucket-id debug2) child (vector<-cspace! (new-stack-vector0) parent) (new 'static 'rgba :g #xff :a #x40) #f (the rgba -1)) + ) + ) + ) + ) + ) + ;; DECOMP BEGINS (defmethod add-to-loading-level skeleton-group ((obj skeleton-group)) @@ -444,6 +458,7 @@ ) ) ) + (draw-bone-lines (-> obj process)) 0 (none) ) @@ -1299,7 +1314,8 @@ (label cfg-45) (let ((a0-26 (-> gp-0 effect))) (if a0-26 - (effect-control-method-9 a0-26) + (format 0 "skip effect control~%") + ;(effect-control-method-9 a0-26) ) ) ) diff --git a/goal_src/jak2/engine/sound/gsound.gc b/goal_src/jak2/engine/sound/gsound.gc index 8635c6c720..ffdf466eaa 100644 --- a/goal_src/jak2/engine/sound/gsound.gc +++ b/goal_src/jak2/engine/sound/gsound.gc @@ -694,6 +694,7 @@ (when (-> obj params) ;; ADDED - the function after this has been removed in jak 2, and calling it will crash. (format 0 "bad case in update! ambient-sound~%") + (return (the-as int #f)) pp (effect-param->sound-spec s5-1 (-> obj params) (-> obj param-count)) ) diff --git a/goal_src/jak2/engine/spatial-hash/spatial-hash-h.gc b/goal_src/jak2/engine/spatial-hash/spatial-hash-h.gc index d02b8dd8cd..e8b9cbe00c 100644 --- a/goal_src/jak2/engine/spatial-hash/spatial-hash-h.gc +++ b/goal_src/jak2/engine/spatial-hash/spatial-hash-h.gc @@ -130,11 +130,11 @@ (:methods (new (symbol type int int) _type_ 0) (add-an-object (_type_ vector hash-object-info) int 34) - (spatial-hash-method-35 (_type_) none 35) + (fill-actor-list-for-box (_type_ bounding-box (pointer collide-shape) int) int 35) (fill-actor-list-for-sphere (_type_ sphere (pointer collide-shape) int) int 36) - (spatial-hash-method-37 (_type_) none 37) - (fill-actor-list-for-vec+r (_type_ vector (pointer collide-shape) int) none 38) - (spatial-hash-method-39 (_type_ object hash-object-info) none 39) + (fill-actor-list-for-line-sphere (_type_ vector vector float (pointer collide-shape) int int) int 37) + (fill-actor-list-for-vec+r (_type_ vector (pointer collide-shape) int) int 38) + (spatial-hash-method-39 (_type_ object hash-object-info) int 39) (validate-objects (_type_) none 40) ) ) diff --git a/goal_src/jak2/engine/spatial-hash/spatial-hash.gc b/goal_src/jak2/engine/spatial-hash/spatial-hash.gc index 35468d364e..56366822ab 100644 --- a/goal_src/jak2/engine/spatial-hash/spatial-hash.gc +++ b/goal_src/jak2/engine/spatial-hash/spatial-hash.gc @@ -885,7 +885,6 @@ (set! (-> v1-0 r) 0.0) (fill-actor-list-for-sphere obj v1-0 arg1 arg2) ) - (none) ) ;; definition for method 40 of type spatial-hash diff --git a/goal_src/jak2/engine/target/target-death.gc b/goal_src/jak2/engine/target/target-death.gc index 3f57b2c94c..548f79d5bd 100644 --- a/goal_src/jak2/engine/target/target-death.gc +++ b/goal_src/jak2/engine/target/target-death.gc @@ -4,6 +4,1620 @@ ;; name: target-death.gc ;; name in dgo: target-death ;; dgos: ENGINE, GAME +(define-extern start-sig-recorder (function none)) +(define-extern intro-play (function none)) +(define-extern find-nearest-entity (function vector type entity)) + ;; DECOMP BEGINS +(define-extern warp-gate type) + +;; definition for symbol *auto-continue*, type symbol +(define *auto-continue* #f) + +;; definition for function next-continue +;; WARN: Return type mismatch object vs continue-point. +(defun next-continue ((arg0 continue-point)) + (let* ((v1-0 #f) + (a1-0 *level-load-list*) + (a2-0 (car a1-0)) + ) + (while (not (null? a1-0)) + (let* ((a2-2 (-> (the-as level-load-info (-> (the-as symbol a2-0) value)) continues)) + (a3-0 (car a2-2)) + ) + (while (not (null? a2-2)) + (if (and v1-0 (logtest? (continue-flags cf17) (-> (the-as continue-point a3-0) flags))) + (return (the-as continue-point a3-0)) + ) + (if (= a3-0 arg0) + (set! v1-0 #t) + ) + (set! a2-2 (cdr a2-2)) + (set! a3-0 (car a2-2)) + ) + ) + (set! a1-0 (cdr a1-0)) + (set! a2-0 (car a1-0)) + ) + ) + (the-as continue-point #f) + ) + +;; failed to figure out what this is: +(defstate target-continue (target) + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (local-vars (v0-0 object)) + (case event-type + (('change-mode) + (case (-> event param 0) + (('grab 'look-around) + #f + ) + (else + (set! (-> self mode-cache) (the-as basic (-> event param 0))) + (set! (-> self mode-param1) (if (>= arg1 2) + (process->handle (the-as process (-> event param 1))) + (the-as handle #f) + ) + ) + (set! (-> self mode-param2) (-> event param 2)) + (set! v0-0 (-> event param 3)) + (set! (-> self mode-param3) (the-as uint v0-0)) + v0-0 + ) + ) + ) + (('want-continue) + (set! v0-0 (-> event param 0)) + (set! (-> self control unknown-word04) (the-as uint v0-0)) + v0-0 + ) + (else + (target-generic-event-handler proc arg1 event-type event) + ) + ) + ) + :exit (behavior () + (set! (-> *level* camera-pos 0 quad) (-> (camera-pos) quad)) + (set! (-> *level* camera-pos 1 quad) (-> *level* camera-pos 0 quad)) + (set! (-> *level* target-pos 0 quad) (-> (target-pos 0) quad)) + (set! (-> *level* target-pos 1 quad) (-> *level* target-pos 0 quad)) + (set! (-> *setting-control* user-default border-mode) (-> *level* play?)) + (set! (-> *setting-control* user-default region-mode) #t) + (remove-setting! 'allow-pause) + (remove-setting! 'allow-progress) + (remove-setting! 'allow-timeout) + (remove-setting! 'bg-a) + (remove-setting! 'music-volume) + (remove-setting! 'sfx-volume) + (remove-setting! 'dialog-volume) + (remove-setting! 'ambient-volume) + (remove-setting! 'music) + (remove-setting! 'region-mode) + (remove-setting! 'border-mode) + (remove-setting! 'allow-continue) + (apply-settings *setting-control*) + (logclear! (-> self focus-status) (focus-status teleporting)) + (set! (-> self mode-cache) #f) + (set! (-> self teleport-time) (-> self clock frame-counter)) + (set! (-> self control last-trans-any-surf quad) (-> self control trans quad)) + (set! (-> self game kiosk-timeout) (the-as uint (-> *display* game-clock frame-counter))) + (none) + ) + :code (behavior ((arg0 continue-point)) + (local-vars (v1-96 symbol)) + (set! *spawn-actors* #f) + (set! (-> self control unknown-word04) (the-as uint #f)) + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self focus-status) (logior (focus-status teleporting) (-> self focus-status))) + (let ((a0-3 (get-continue-by-name (-> self game) (-> arg0 name)))) + (cond + (a0-3 + (set! (-> self game last-continue) a0-3) + ) + ((string= (-> arg0 name) "default") + ) + (else + (format 0 "ERROR: TARGET: attempting to goto continue ~A which is not in level-info~%" (-> arg0 name)) + ) + ) + ) + (if (-> *art-control* reserve-buffer) + (reserve-free *art-control* (-> *art-control* reserve-buffer heap)) + ) + (when (logtest? (-> arg0 flags) (continue-flags cf8 cf11)) + (set! (-> ctywide memory-mode) (load-buffer-mode small-edge)) + 0 + ) + (kill-persister *setting-control* (the-as engine-pers 'fail) 'bg-a) + (when (not (logtest? (-> arg0 flags) (continue-flags cf4))) + (add-setting! 'bg-a 'abs #x3f800000 0) + (set! (-> *setting-control* user-current bg-a) 1.0) + ) + (set-setting! 'sfx-volume 'abs 0 0) + (set-setting! 'ambient-volume 'abs 0 0) + (set-setting! 'dialog-volume 'abs 0 0) + (when (and (not (string= (-> arg0 name) "default")) (not (demo?))) + (let ((v1-37 (lookup-level-info (-> arg0 level)))) + (when (and v1-37 + (!= (-> v1-37 name) 'default-level) + (!= (-> v1-37 music-bank) (-> *setting-control* user-current music)) + (!= (level-status *level* (-> arg0 vis-nick)) 'active) + ) + (set-setting! 'music #f 0 0) + (set-setting! 'music-volume 'abs 0 0) + ) + ) + ) + (set-setting! 'region-mode #f 0 0) + (set-setting! 'border-mode #f 0 0) + (set-setting! 'allow-continue #f 0 0) + (set-setting! 'allow-timeout #f 0 0) + (set! (-> *setting-control* user-default border-mode) #f) + (apply-settings *setting-control*) + (reset-target-state #t) + (target-exit) + (set! (-> self focus-status) (logior (focus-status teleporting) (-> self focus-status))) + (ja-channel-set! 0) + (quaternion-copy! (-> self control quat-for-control) (the-as quaternion (-> arg0 quat))) + (move-to-point! (-> self control) (-> arg0 trans)) + (rot->dir-targ! (-> self control)) + (set! (-> self control camera-pos quad) (-> self control trans quad)) + (if (not (string= (-> arg0 name) "default")) + (set! *external-cam-mode* #f) + ) + (if (not (logtest? (-> arg0 flags) (continue-flags cf4))) + (cam-stop) + ) + (suspend) + (let ((a0-40 (lookup-level-info (-> arg0 vis-nick)))) + (set! (-> *load-state* vis-nick) (if a0-40 + (-> a0-40 name) + ) + ) + ) + (dotimes (v1-74 6) + (set! (-> *load-state* want v1-74 name) (-> arg0 want v1-74 name)) + (set! (-> *load-state* want v1-74 display?) (-> arg0 want v1-74 display?)) + (set! (-> *load-state* want v1-74 force-vis?) #f) + (set! (-> *load-state* want v1-74 force-inside?) #f) + ) + (dotimes (v1-77 3) + (set! (-> *load-state* want-sound v1-77) (-> arg0 want-sound v1-77)) + ) + (add-borrow-levels *load-state*) + (when (not (string= (-> arg0 name) "default")) + (while (begin + (dotimes (s5-0 6) + (when (not (or (not (-> arg0 want s5-0 name)) + (not (-> arg0 want s5-0 display?)) + (= (level-status *level* (-> arg0 want s5-0 name)) 'active) + ) + ) + (set! v1-96 #t) + (goto cfg-63) + ) + ) + (let ((s5-1 *load-state*)) + (dotimes (s4-0 6) + (when (not (or (not (-> s5-1 want s4-0 name)) + (not (-> s5-1 want s4-0 display?)) + (= (level-status *level* (-> s5-1 want s4-0 name)) 'active) + ) + ) + (set! v1-96 #t) + (goto cfg-63) + ) + ) + ) + (set! v1-96 #f) + (label cfg-63) + v1-96 + ) + (suspend) + ) + ) + (remove-setting! 'music) + (remove-setting! 'music-volume) + (let ((s5-2 (-> *level* border?))) + (set! (-> *level* border?) (-> *level* play?)) + (set-setting! 'allow-continue #t 0 0) + (set-setting! 'border-mode #t 0 0) + (apply-settings *setting-control*) + (eval! + (new 'stack 'script-context (the-as basic (process->ppointer self)) self (the-as vector #f)) + '(teleport) + ) + (eval! + (new 'stack 'script-context (the-as basic (process->ppointer self)) self (the-as vector #f)) + (-> arg0 on-goto) + ) + (set-setting! 'allow-continue #f 0 0) + (set-setting! 'border-mode #f 0 0) + (apply-settings *setting-control*) + (set! (-> *level* border?) s5-2) + ) + (set! (-> *ACTOR-bank* birth-max) 1000) + (when (not (logtest? (-> arg0 flags) (continue-flags cf4))) + (new 'stack 'transformq) + (cam-start #t) + (suspend) + (when (not (string= (-> arg0 name) "default")) + (set! (-> *camera-combiner* trans quad) (-> arg0 camera-trans quad)) + (let ((s5-3 (-> *camera-combiner* inv-camera-rot)) + (s4-1 (-> arg0 camera-rot)) + ) + (matrix-identity! s5-3) + (set! (-> s5-3 vector 0 x) (-> s4-1 0 x)) + (set! (-> s5-3 vector 0 y) (-> s4-1 0 y)) + (set! (-> s5-3 vector 0 z) (-> s4-1 0 z)) + (set! (-> s5-3 vector 1 x) (-> s4-1 1 x)) + (set! (-> s5-3 vector 1 y) (-> s4-1 1 y)) + (set! (-> s5-3 vector 1 z) (-> s4-1 1 z)) + (set! (-> s5-3 vector 2 x) (-> s4-1 2 x)) + (set! (-> s5-3 vector 2 y) (-> s4-1 2 y)) + (set! (-> s5-3 vector 2 z) (-> s4-1 2 z)) + ) + ) + (cam-master-activate-slave #t) + ) + (send-event self 'level-enter (-> arg0 level)) + (dotimes (v1-158 (-> *level* length)) + (let ((a0-87 (-> *level* level v1-158))) + (if (= (-> a0-87 status) 'active) + (set! (-> a0-87 all-visible?) 'loading) + ) + ) + ) + (let ((s5-4 (level-get *level* (-> arg0 level)))) + (when s5-4 + (while (and (-> *level* vis?) (-> s5-4 vis-info 0) (= (-> s5-4 all-visible?) 'loading)) + (suspend) + ) + ) + ) + (set! *spawn-actors* #t) + (set! *teleport* #t) + (set! (-> *ACTOR-bank* birth-max) 1000) + (if (not (logtest? (-> arg0 flags) (continue-flags cf4))) + (set-blackout-frames (seconds 0.1)) + ) + (let* ((a0-94 *game-info*) + (t9-53 (method-of-object a0-94 set-continue!)) + (a1-51 (the-as basic (-> self control unknown-spool-anim00))) + ) + (set! a1-51 (cond + ((the-as spool-anim a1-51) + (empty) + a1-51 + ) + (else + arg0 + ) + ) + ) + (t9-53 a0-94 a1-51 #f) + ) + (cond + ((logtest? (-> arg0 flags) (continue-flags cf5)) + (case *kernel-boot-message* + (('kiosk) + (let ((s5-5 (ppointer->handle (auto-save-command 'restore 0 0 *default-pool* #f)))) + (while (handle->process (the-as handle s5-5)) + (suspend) + ) + ) + ) + ) + (let ((s5-6 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s5-6) (seconds 0.05)) + (suspend) + ) + ) + ) + ((logtest? (-> arg0 flags) (continue-flags cf12)) + (go target-title #t) + ) + ((logtest? (-> arg0 flags) (continue-flags cf13)) + (go target-title #f) + ) + ((logtest? (-> arg0 flags) (continue-flags cf8)) + (go target-demo #t) + ) + ((logtest? (-> arg0 flags) (continue-flags cf11)) + (go target-demo #f) + ) + ((logtest? (-> arg0 flags) (continue-flags cf9)) + (intro-play) + ) + ((logtest? (-> arg0 flags) (continue-flags cf10)) + (logior! (-> self game secrets) (game-secrets hero-mode)) + (logior! (-> self game purchase-secrets) (game-secrets hero-mode)) + (intro-play) + ) + ((logtest? (-> arg0 flags) (continue-flags cf7)) + (let ((s5-7 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s5-7) (seconds 0.05)) + (suspend) + ) + ) + (let ((s5-8 (new 'static 'vector)) + (a2-26 (find-nearest-entity (-> arg0 trans) warp-gate)) + ) + (when a2-26 + (set! (-> s5-8 quad) (-> a2-26 extra trans quad)) + (set! (-> s5-8 y) (+ 9011.2 (-> s5-8 y))) + (go target-warp-in s5-8 (-> arg0 trans) (the-as target a2-26)) + ) + ) + ) + ((logtest? (continue-flags cf22) (-> arg0 flags)) + enter-state + (go target-indax-start) + ) + ((logtest? (continue-flags cf18) (-> arg0 flags)) + ) + ((logtest? (continue-flags cf21) (-> arg0 flags)) + (start-sig-recorder) + ) + ((logtest? (continue-flags cf19 cf20) (-> arg0 flags)) + (set! (-> self focus-status) (logior (focus-status pilot) (-> self focus-status))) + (while (not (-> self mode-cache)) + (suspend) + ) + ) + ((logtest? (-> arg0 flags) (continue-flags cf6)) + (go target-grab 'stance) + ) + (else + (let ((s5-9 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s5-9) (seconds 0.05)) + (suspend) + ) + ) + ) + ) + (let* ((a0-122 *game-info*) + (t9-66 (method-of-object a0-122 set-continue!)) + (a1-56 (the-as basic (-> self control unknown-spool-anim00))) + ) + (set! a1-56 (cond + ((the-as spool-anim a1-56) + (empty) + a1-56 + ) + (else + arg0 + ) + ) + ) + (t9-66 a0-122 a1-56 #f) + ) + (when *auto-continue* + (let ((gp-1 (next-continue arg0))) + (when gp-1 + (format 0 "~A ~A ~A~%" (-> gp-1 level) (-> gp-1 name) gp-1) + (inspect global) + (process-spawn-function process (lambda ((arg0 continue-point)) (start 'play arg0)) gp-1) + ) + ) + ) + (ja-channel-set! 1) + (ja :group! (-> self draw art-group data 5)) + (suspend) + (logior! (-> self control status) (collide-status on-surface on-ground touch-surface)) + (when (-> self mode-cache) + (set! (-> self event-hook) target-standard-event-handler) + (send-event + self + 'change-mode + (-> self mode-cache) + (handle->process (-> self mode-param1)) + (-> self mode-param2) + (-> self mode-param3) + ) + (set! (-> self mode-cache) #f) + ) + (go target-stance) + (none) + ) + :post target-no-move-post + ) + +;; definition for symbol *smack-mods*, type surface +(define *smack-mods* (new 'static 'surface + :name 'jump + :tiltv 32768.0 + :tiltvv 131072.0 + :transv-max 40960.0 + :target-speed 40960.0 + :seek0 0.3 + :seek90 0.3 + :seek180 0.3 + :fric 0.05 + :nonlin-fric-dist 1.0 + :slip-factor 1.0 + :slide-factor 1.0 + :slope-up-factor 1.0 + :slope-down-factor 1.0 + :slope-slip-angle 1.0 + :impact-fric 1.0 + :bend-factor 1.0 + :bend-speed 1.0 + :alignv 1.0 + :slope-up-traction 1.0 + :align-speed 1.0 + :tiltvf 150.0 + :tiltvvf 15.0 + :mult-hook (lambda :behavior target + ((arg0 surface) (arg1 object) (arg2 object) (arg3 int)) + (when (= arg3 1) + (let ((f30-0 (-> self control unknown-floatiujh1bnb2n3i1)) + (f28-0 (-> self control force-turn-to-strength)) + ) + (set! (-> arg0 seek0) (lerp (-> arg0 seek0) 409600.0 f28-0)) + (set! (-> arg0 seek90) (lerp (-> arg0 seek90) 409600.0 f28-0)) + (set! (-> arg0 seek180) (lerp (-> arg0 seek180) 409600.0 f28-0)) + (set! (-> arg0 target-speed) (lerp (-> arg0 target-speed) f30-0 f28-0)) + (set! (-> arg0 transv-max) (lerp (-> arg0 transv-max) f30-0 f28-0)) + ) + ) + ) + :mode 'air + :flags (surface-flag air gun-inactive gun-no-twist) + ) + ) + +;; definition for symbol *smack-up-mods*, type surface +(define *smack-up-mods* (new 'static 'surface + :name 'jump + :turnv 131072.0 + :turnvv 32768.0 + :tiltv 32768.0 + :tiltvv 131072.0 + :transv-max 40960.0 + :target-speed 40960.0 + :seek0 0.3 + :seek90 0.3 + :seek180 0.3 + :fric 0.05 + :nonlin-fric-dist 1.0 + :slip-factor 1.0 + :slide-factor 1.0 + :slope-up-factor 1.0 + :slope-down-factor 1.0 + :slope-slip-angle 1.0 + :impact-fric 1.0 + :bend-factor 1.0 + :bend-speed 1.0 + :alignv 1.0 + :slope-up-traction 1.0 + :align-speed 1.0 + :turnvf 30.0 + :turnvvf 30.0 + :tiltvf 150.0 + :tiltvvf 15.0 + :mult-hook (lambda :behavior target + ((arg0 surface) (arg1 object) (arg2 object) (arg3 int)) + (when (= arg3 1) + (let ((f30-0 (-> self control unknown-floatiujh1bnb2n3i1)) + (f28-0 (-> self control force-turn-to-strength)) + ) + (set! (-> arg0 seek0) (lerp (-> arg0 seek0) 409600.0 f28-0)) + (set! (-> arg0 seek90) (lerp (-> arg0 seek90) 409600.0 f28-0)) + (set! (-> arg0 seek180) (lerp (-> arg0 seek180) 409600.0 f28-0)) + (set! (-> arg0 target-speed) (lerp (-> arg0 target-speed) f30-0 f28-0)) + (set! (-> arg0 transv-max) (lerp (-> arg0 transv-max) f30-0 f28-0)) + ) + ) + ) + :mode 'air + :flags (surface-flag no-turn-around turn-to-pad air gun-inactive gun-no-twist) + ) + ) + +;; definition for function velocity-set-to-target! +;; INFO: Used lq/sq +(defbehavior velocity-set-to-target! target ((arg0 vector) (arg1 float) (arg2 attack-info)) + (let* ((v1-1 (-> self control trans)) + (gp-1 (vector-! (new 'stack-no-clear 'vector) arg0 v1-1)) + ) + (set! (-> gp-1 y) 0.0) + (set! (-> self control force-turn-to-direction quad) (-> gp-1 quad)) + (vector-xz-normalize! (-> self control force-turn-to-direction) 1.0) + (set! (-> self control force-turn-to-speed) 1.0) + (set! (-> self control unknown-floatiujh1bnb2n3i1) arg1) + (set! (-> self control force-turn-to-strength) (- 1.0 (-> arg2 control))) + gp-1 + ) + ) + +;; definition for function target-hit-effect +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defbehavior target-hit-effect target ((arg0 attack-info)) + (let ((s5-0 (get-process *default-dead-pool* part-tracker #x4000))) + (when s5-0 + (let ((t9-1 (method-of-type part-tracker activate))) + (t9-1 (the-as part-tracker s5-0) self (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((t9-2 run-function-in-process) + (a0-3 s5-0) + (a1-2 part-tracker-init) + (a2-4 (-> *part-group-id-table* 9)) + (a3-1 0) + (t0-0 #f) + (t1-0 #f) + (t2-0 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> (the-as vector (if (logtest? (-> arg0 mask) (attack-info-mask intersection)) + (-> arg0 intersection) + (the-as vector (-> self control root-prim prim-core)) + ) + ) + quad + ) + ) + ((the-as (function object object object object object object object object none) t9-2) + a0-3 + a1-2 + a2-4 + a3-1 + t0-0 + t1-0 + t2-0 + t3-0 + ) + ) + (-> s5-0 ppointer) + ) + ) + (let ((v1-8 (-> arg0 mode))) + (cond + ((or (= v1-8 'endlessfall) (= v1-8 'instant-death) (= v1-8 'crush)) + ) + ((begin + (target-timed-invulnerable (-> arg0 invinc-time) self 1) + (cpad-set-buzz! (-> *cpad-list* cpads 0) 0 255 (seconds 0.5)) + (logtest? (focus-status indax) (-> self focus-status)) + ) + (let* ((v1-14 (rand-vu-int-count 4)) + (t0-1 (cond + ((zero? v1-14) + "ds176" + ) + ((= v1-14 1) + "ds177" + ) + ((= v1-14 2) + "ds178" + ) + (else + "ds179" + ) + ) + ) + ) + (set! (-> self control unknown-sound-id00) + (gui-control-method-9 *gui-control* *target* (gui-channel daxter) (gui-action play) t0-1 -99.0 0) + ) + ) + (gui-control-method-20 *gui-control* (-> self control unknown-sound-id00) #t -1 100 2) + ) + (else + (case (-> arg0 angle) + (('up) + (sound-play "hit-up") + ) + (else + (sound-play "oof") + ) + ) + ) + ) + ) + (let ((v1-26 (-> arg0 mode))) + (cond + ((or (= v1-26 'burn) (or (= v1-26 'burnup) (= v1-26 'lava))) + (if (not (handle->process (-> self burn-proc))) + (set! (-> self burn-proc) + (ppointer->handle (process-spawn-function process process-drawable-burn-effect 1200 :to self)) + ) + ) + ) + ((= v1-26 'tar) + (sound-play "get-burned") + ) + ) + ) + 0 + (none) + ) + +;; definition for function target-hit-push +;; INFO: Used lq/sq +(defbehavior target-hit-push target ((arg0 vector) (arg1 matrix) (arg2 float) (arg3 float) (arg4 attack-info)) + (case (-> arg4 mode) + (('shock 'shockup 'shock-red 'shock-green) + (when (>= (- (-> *display* game-clock frame-counter) (-> self shock-effect-time)) (seconds 0.03)) + (set! (-> self shock-effect-time) (-> *display* game-clock frame-counter)) + (send-event self 'color-effect 'shock 60) + (case (-> arg4 mode) + (('shock-red) + (process-drawable-shock-effect + self + (-> *lightning-spec-id-table* 3) + lightning-probe-callback + (the-as sparticle-launcher #f) + 0 + 0 + 40960.0 + ) + ) + (('shock-green) + (process-drawable-shock-effect + self + (-> *lightning-spec-id-table* 4) + lightning-probe-callback + (the-as sparticle-launcher #f) + 0 + 0 + 40960.0 + ) + ) + (else + (process-drawable-shock-effect + self + (-> *lightning-spec-id-table* 1) + lightning-probe-callback + (-> *part-id-table* 166) + 0 + 0 + 40960.0 + ) + ) + ) + ) + ) + ) + (case (-> arg4 angle) + (('jump 'up 'up-forward) + (when (and (not (logtest? (focus-status flut pilot mech indax) (-> self focus-status))) + (not (and (= (-> self game mode) 'play) (>= 0.0 (-> self fact-override health)))) + ) + (if (and (cpad-pressed? (-> self control cpad number) circle) (can-feet? #f)) + (go target-attack-air #f) + ) + (if (and (cpad-pressed? (-> self control cpad number) square) + (and (< (vector-dot (-> self control dynam gravity-normal) (-> self control transv)) 26624.0) + (< -61440.0 (vector-dot (-> self control dynam gravity-normal) (-> self control transv))) + (and (>= (- (-> self clock frame-counter) (-> self control last-time-of-stuck)) + (the-as time-frame (-> *TARGET-bank* stuck-timeout)) + ) + (not (logtest? (-> self state-flags) (state-flags prevent-attack))) + (not (logtest? (-> self control current-surface flags) (surface-flag no-attack no-hands))) + (not (and (not (using-gun? self)) (!= (-> self skel top-anim interp) 0.0))) + ) + ) + ) + (go + target-flop + 65502.96 + -163840.0 + (the-as float (if (= (-> *cpad-list* cpads (-> self control cpad number) stick0-speed) 0.0) + 0 + #x47866666 + ) + ) + ) + ) + ) + ) + ) + (when (if (and (< (target-move-dist (-> *TARGET-bank* stuck-time)) (-> *TARGET-bank* stuck-distance)) + (and (>= (- (-> self clock frame-counter) (-> self state-time)) (the-as time-frame (-> *TARGET-bank* stuck-time))) + (not (and *cheat-mode* (cpad-hold? (-> self control cpad number) r2))) + ) + ) + #t + ) + (logior! (-> self control status) (collide-status on-surface)) + (return 'stuck) + ) + (let ((s1-0 (new-stack-vector0))) + (set! (-> s1-0 z) arg2) + (vector-matrix*! s1-0 s1-0 arg1) + (vector+! s1-0 s1-0 arg0) + (cond + ((< (vector-vector-distance arg0 s1-0) (fabs (-> arg4 dist))) + (velocity-set-to-target! s1-0 (fabs arg3) arg4) + #t + ) + (else + (set! (-> self control unknown-floatiujh1bnb2n3i1) 0.0) + (set! (-> self control force-turn-to-strength) (- 1.0 (-> arg4 control))) + #f + ) + ) + ) + ) + +;; definition for function target-hit-orient +(defbehavior target-hit-orient target ((arg0 attack-info) (arg1 vector)) + (let ((s5-0 #f)) + (if (and (!= (-> arg0 angle) 'front) + (!= (-> arg0 angle) 'shove) + (logtest? (-> arg0 mask) (attack-info-mask vector)) + (!= (-> arg0 shove-back) 0.0) + ) + (forward-up-nopitch->quaternion (-> self control dir-targ) arg1 (-> self control dynam gravity-normal)) + ) + (case (-> arg0 angle) + (('back 'air) + (set! s5-0 #t) + ) + (('up-forward) + (set! (-> self control mod-surface) *smack-up-mods*) + ) + (('front) + (if (and (logtest? (-> arg0 mask) (attack-info-mask vector)) (!= (-> arg0 shove-back) 0.0)) + (forward-up-nopitch->quaternion + (-> self control dir-targ) + (vector-negate! (new 'stack-no-clear 'vector) arg1) + (-> self control dynam gravity-normal) + ) + ) + (set! s5-0 #t) + ) + (('jump) + (set! s5-0 #t) + (set! (-> self control mod-surface) *forward-high-jump-mods*) + ) + ) + s5-0 + ) + ) + +;; definition for function target-hit-setup-anim +(defbehavior target-hit-setup-anim target ((arg0 attack-info)) + (let ((v1-0 (-> arg0 angle))) + (cond + ((= v1-0 'back) + (let ((v1-3 (ja-group))) + (when (not (and v1-3 (= v1-3 (-> self draw art-group data 67)))) + (when (using-gun? self) + (set! (-> self gun top-anim-low-high) 0.0) + (push-anim-to-targ + (-> self skel top-anim) + (the-as art-joint-anim (-> self draw art-group data 290)) + 0.0 + 0 + 30 + 1.0 + 0.0 + #f + ) + ) + (ja-channel-push! 1 (seconds 0.075)) + (ja :group! (-> self draw art-group data 67) :num! min) + ) + ) + ) + ((= v1-0 'lava) + (let ((v1-19 (ja-group))) + (when (not (and v1-19 (= v1-19 (-> self draw art-group data 64)))) + (ja-channel-push! 1 (seconds 0.075)) + (ja :group! (-> self draw art-group data 64) :num! min) + ) + ) + ) + ((or (= v1-0 'up) (= v1-0 'up-forward) (= v1-0 'lava)) + (let ((v1-28 (ja-group))) + (when (not (and v1-28 (= v1-28 (-> self draw art-group data 68)))) + (ja-channel-push! 1 (seconds 0.075)) + (ja :group! (-> self draw art-group data 68) :num! min) + ) + ) + ) + ((or (= v1-0 'air) (= v1-0 'jump)) + (ja-channel-push! 1 (seconds 0.05)) + (ja-no-eval :group! (-> self draw art-group data 23) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 23)) frames num-frames) -1))) + :frame-num 0.0 + ) + (when (= (-> arg0 angle) 'air) + (sound-play "smack-surface") + (do-effect (-> self skel effect) 'group-smack-surface 0.0 6) + (do-effect (-> self skel effect) 'group-smack-surface-dizzy 0.0 9) + ) + ) + ((= v1-0 'shove) + (ja-channel-push! 1 (seconds 0.05)) + (ja-no-eval :group! (-> self draw art-group data 71) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 71)) frames num-frames) -1))) + :frame-num 0.0 + ) + (sound-play "smack-surface") + ) + ((rand-vu-percent? 0.5) + (let ((v1-77 (ja-group))) + (when (not (and v1-77 (= v1-77 (-> self draw art-group data 65)))) + (when (using-gun? self) + (set! (-> self gun top-anim-low-high) 0.0) + (push-anim-to-targ + (-> self skel top-anim) + (the-as art-joint-anim (-> self draw art-group data 289)) + 0.0 + 0 + 30 + 1.0 + 0.0 + #f + ) + ) + (ja-channel-push! 1 (seconds 0.075)) + (ja :group! (-> self draw art-group data 65) :num! min) + ) + ) + ) + (else + (let ((v1-93 (ja-group))) + (when (not (and v1-93 (= v1-93 (-> self draw art-group data 66)))) + (when (using-gun? self) + (set! (-> self gun top-anim-low-high) 0.0) + (push-anim-to-targ + (-> self skel top-anim) + (the-as art-joint-anim (-> self draw art-group data 289)) + 0.0 + 0 + 30 + 1.0 + 0.0 + #f + ) + ) + (ja-channel-push! 1 (seconds 0.075)) + (ja :group! (-> self draw art-group data 66) :num! min) + ) + ) + ) + ) + ) + (none) + ) + +;; definition for function target-hit-move +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defbehavior target-hit-move target ((arg0 attack-info) (arg1 symbol) (arg2 (function none :behavior target)) (arg3 float)) + (local-vars (v1-29 symbol) (s1-1 symbol)) + (vector-identity! (-> self control transv)) + (let ((v1-1 (new-stack-vector0))) + (let ((f0-1 (vector-dot (-> self control dynam gravity-normal) (-> self control transv)))) + 0.0 + (vector-! v1-1 (-> self control transv) (vector-float*! v1-1 (-> self control dynam gravity-normal) f0-1)) + ) + (let* ((f0-2 (vector-length v1-1)) + (f1-1 f0-2) + (f2-1 (+ 2048.0 (sqrtf (* 491520.0 (-> arg0 shove-up))))) + ) + (vector+! + (-> self control transv) + (vector-float*! (-> self control transv) (-> self control dynam gravity-normal) f2-1) + (vector-float*! v1-1 v1-1 (/ f0-2 f1-1)) + ) + ) + ) + (let ((s3-0 (new 'stack-no-clear 'vector))) + (set! (-> s3-0 quad) (-> self control trans quad)) + (let ((s2-1 (matrix-rotate-y! (new 'stack-no-clear 'matrix) (+ 32768.0 (vector-y-angle (-> arg0 vector))))) + (f30-1 0.0) + ) + (set-quaternion! (-> self control) (-> self control dir-targ)) + #t + (let ((f28-1 (* 1.05 (/ (* -60.0 arg3) (* (the float (+ (-> (ja-group) frames num-frames) -1)) (ja-step 0)))))) + (until v1-29 + (+! f30-1 (* (-> arg0 shove-back) f28-1 (-> self clock seconds-per-frame))) + (set! s1-1 (target-hit-push s3-0 s2-1 f30-1 (* (-> arg0 shove-back) f28-1) arg0)) + (suspend) + (ja :num! (seek!)) + (set! v1-29 (or (ja-done? 0) (and arg1 (logtest? (-> self control status) (collide-status on-surface))))) + ) + (while (and (or (not (logtest? (-> self control status) (collide-status on-surface))) s1-1) (!= s1-1 'stuck)) + (arg2) + (+! f30-1 (* (-> arg0 shove-back) f28-1 (-> self clock seconds-per-frame))) + (set! s1-1 (target-hit-push s3-0 s2-1 f30-1 (* (-> arg0 shove-back) f28-1) arg0)) + (if (not s1-1) + (logclear! (-> self focus-status) (focus-status hit)) + ) + (suspend) + ) + ) + ) + ) + 0 + (none) + ) + +;; failed to figure out what this is: +(defstate target-hit (target) + :event target-standard-event-handler + :exit (behavior () + (let ((v1-0 (new-stack-vector0)) + (f0-1 (vector-dot (-> self control dynam gravity-normal) (-> self control transv))) + ) + 0.0 + (vector-! v1-0 (-> self control transv) (vector-float*! v1-0 (-> self control dynam gravity-normal) f0-1)) + (let* ((f2-0 (vector-length v1-0)) + (f1-2 f2-0) + ) + (if (< 40960.0 f2-0) + (set! f2-0 40960.0) + ) + (vector+! + (-> self control transv) + (vector-float*! (-> self control transv) (-> self control dynam gravity-normal) f0-1) + (vector-float*! v1-0 v1-0 (/ f2-0 f1-2)) + ) + ) + ) + (when (not (and (-> self next-state) (let ((v1-4 (-> self next-state name))) + (or (= v1-4 'target-death) (= v1-4 'target-hit)) + ) + ) + ) + (logclear! (-> self focus-status) (focus-status dead hit)) + (logclear! (-> self state-flags) (state-flags disable-attacks)) + ) + ((method-of-type focus clear-focused) (the-as focus (-> self gun track-target))) + (target-exit) + (none) + ) + :trans (behavior () + (when (= *cheat-mode* 'debug) + (when (and (not *pause-lock*) (cpad-hold? (-> self control cpad number) r2)) + (set! (-> self control time-of-last-debug-heal) (-> self clock frame-counter)) + (pickup-collectable! (-> self fact-override) (pickup-type health) 100.0 (the-as handle #f)) + (go target-stance) + ) + ) + (none) + ) + :code (behavior ((arg0 symbol) (arg1 attack-info)) + (local-vars (sv-32 attack-info) (sv-36 vector)) + (logclear! (-> self water flags) (water-flags jump-out)) + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self neck flex-blend) 0.0) + (set! sv-32 (-> self attack-info)) + (set! sv-36 (new 'stack-no-clear 'vector)) + (let ((v1-7 sv-32)) + (set! (-> v1-7 attacker) (the-as handle #f)) + (set! (-> v1-7 mode) 'generic) + (set! (-> v1-7 shove-back) 6144.0) + (set! (-> v1-7 shove-up) 4915.2) + (set! (-> v1-7 angle) #f) + (set! (-> v1-7 trans quad) (-> self control trans quad)) + (set! (-> v1-7 control) 0.0) + (set! (-> v1-7 invinc-time) (the-as time-frame (-> *TARGET-bank* hit-invulnerable-timeout))) + (set! (-> v1-7 damage) (-> *FACT-bank* health-default-inc)) + ) + (case arg0 + (('shove) + (let ((v1-10 sv-32)) + (set! (-> v1-10 shove-back) (-> *TARGET-bank* smack-surface-dist)) + (set! (-> v1-10 shove-up) (-> *TARGET-bank* smack-surface-height)) + (set! (-> v1-10 angle) 'shove) + ) + ) + ) + (combine! sv-32 arg1 self) + (when (not (logtest? (-> sv-32 mask) (attack-info-mask vector))) + (vector-z-quaternion! (-> sv-32 vector) (-> self control quat-for-control)) + (vector-xz-normalize! (-> sv-32 vector) (- (fabs (-> sv-32 shove-back)))) + (set! (-> sv-32 vector y) (-> sv-32 shove-up)) + ) + (when (and (logtest? (focus-status dark) (-> self focus-status)) (nonzero? (-> self darkjak))) + (set! (-> sv-32 damage) (fmax 1.0 (ceil (* 0.5 (-> sv-32 damage))))) + (if (< (- (-> self fact-override health) (-> sv-32 damage)) 1.0) + (set! (-> sv-32 damage) (+ -1.0 (-> self fact-override health))) + ) + ) + (set! (-> sv-36 quad) (-> sv-32 vector quad)) + (let ((f0-20 (vector-dot + (vector-normalize-copy! (new 'stack-no-clear 'vector) sv-36 1.0) + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self control quat-for-control)) + ) + ) + ) + (if (not (-> self attack-info angle)) + (set! (-> self attack-info angle) (if (>= 0.0 f0-20) + 'front + 'back + ) + ) + ) + ) + (cond + ((= arg0 'attack) + (send-event (handle->process (-> self notify)) 'notify 'hit (-> sv-32 mode)) + (logior! (-> self focus-status) (focus-status hit)) + (set! (-> self game hit-time) (-> self clock frame-counter)) + (case (-> sv-32 mode) + (('endlessfall) + (cond + ((= (-> self game mode) 'debug) + (let ((gp-1 (new-stack-vector0))) + (set! (-> gp-1 quad) (-> self control last-trans-on-ground quad)) + (ja-channel-set! 0) + (let ((s5-1 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s5-1) (seconds 1)) + (suspend) + ) + ) + (move-to-point! (-> self control) gp-1) + ) + (set! (-> self control camera-pos quad) (-> self control trans quad)) + (send-event *camera* 'teleport) + (go target-stance) + ) + (else + (pickup-collectable! (-> self fact-override) (pickup-type health) -1000.0 (the-as handle #f)) + (go target-death (-> sv-32 mode)) + ) + ) + ) + (('lava 'melt) + (pickup-collectable! (-> self fact-override) (pickup-type health) -1000.0 (the-as handle #f)) + (let ((gp-2 (get-process *default-dead-pool* part-tracker #x4000))) + (when gp-2 + (let ((t9-15 (method-of-type part-tracker activate))) + (t9-15 + (the-as part-tracker gp-2) + *entity-pool* + (symbol->string (-> part-tracker symbol)) + (the-as pointer #x70004000) + ) + ) + (let ((t9-16 run-function-in-process) + (a0-53 gp-2) + (a1-13 part-tracker-init) + (a2-9 (-> *part-group-id-table* 57)) + (a3-3 0) + (t0-0 #f) + (t1-0 #f) + (t2-0 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> self control trans quad)) + ((the-as (function object object object object object object object object none) t9-16) + a0-53 + a1-13 + a2-9 + a3-3 + t0-0 + t1-0 + t2-0 + t3-0 + ) + ) + (-> gp-2 ppointer) + ) + ) + (set! (-> sv-32 angle) 'lava) + (set! (-> sv-32 shove-up) 20480.0) + ) + (('drown-death + 'sharkey + 'dark-eco-pool + 'instant-death + 'crush + 'death + 'grenade + 'bot + 'turret + 'centipede + 'big-explosion + ) + (pickup-collectable! (-> self fact-override) (pickup-type health) -1000.0 (the-as handle #f)) + (if (= (-> self game mode) 'play) + (go target-death (-> sv-32 mode)) + ) + ) + (('explode) + (pickup-collectable! (-> self fact-override) (pickup-type health) (- (-> sv-32 damage)) (the-as handle #f)) + (if (and (= (-> self game mode) 'play) (>= 0.0 (-> self fact-override health))) + (go target-death (-> sv-32 mode)) + ) + ) + (('smush) + (pickup-collectable! (-> self fact-override) (pickup-type health) (- (-> sv-32 damage)) (the-as handle #f)) + (go target-hit-ground-hard (-> *TARGET-bank* fall-far)) + ) + (('shock 'shock-red 'shock-green) + (pickup-collectable! (-> self fact-override) (pickup-type health) (- (-> sv-32 damage)) (the-as handle #f)) + (let* ((v1-123 (-> sv-32 mode)) + (gp-3 (cond + ((= v1-123 'shock-red) + (-> *part-group-id-table* 62) + ) + ((= v1-123 'shock-green) + (-> *part-group-id-table* 61) + ) + (else + (-> *part-group-id-table* 60) + ) + ) + ) + ) + (process-spawn part-tracker :init part-tracker-init gp-3 300 #f #f self 6 :to self) + ) + (let ((gp-4 (-> self post-hook))) + (set! (-> self control mod-surface) *turn-around-mods*) + (set! (-> self post-hook) target-no-stick-post) + (if (using-gun? self) + (push-anim-to-targ + (-> self skel top-anim) + (the-as art-joint-anim (-> self draw art-group data 297)) + 0.0 + 30 + 0 + 1.0 + 0.0 + #f + ) + ) + (let ((v1-141 (new-stack-vector0))) + (let ((f0-31 (vector-dot (-> self control dynam gravity-normal) (-> self control transv)))) + 0.0 + (vector-! + v1-141 + (-> self control transv) + (vector-float*! v1-141 (-> self control dynam gravity-normal) f0-31) + ) + ) + (let* ((f0-32 (vector-length v1-141)) + (f1-7 f0-32) + (f2-0 0.0) + ) + (vector+! + (-> self control transv) + (vector-float*! (-> self control transv) (-> self control dynam gravity-normal) f2-0) + (vector-float*! v1-141 v1-141 (/ f0-32 f1-7)) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! (-> self draw art-group data 64) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 64)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (let ((v1-157 (new-stack-vector0)) + (f0-39 (vector-dot (-> self control dynam gravity-normal) (-> self control transv))) + ) + 0.0 + (vector-! + v1-157 + (-> self control transv) + (vector-float*! v1-157 (-> self control dynam gravity-normal) f0-39) + ) + (let* ((f1-10 (vector-length v1-157)) + (f2-1 f1-10) + (f0-40 (+ f0-39 (* 286720.0 (-> self clock seconds-per-frame)))) + ) + (vector+! + (-> self control transv) + (vector-float*! (-> self control transv) (-> self control dynam gravity-normal) f0-40) + (vector-float*! v1-157 v1-157 (/ f1-10 f2-1)) + ) + ) + ) + (when (>= (- (-> *display* game-clock frame-counter) (-> self shock-effect-time)) (seconds 0.03)) + (set! (-> self shock-effect-time) (-> *display* game-clock frame-counter)) + (send-event self 'color-effect 'shock 60) + (case (-> sv-32 mode) + (('shock-red) + (process-drawable-shock-effect + self + (-> *lightning-spec-id-table* 3) + lightning-probe-callback + (the-as sparticle-launcher #f) + 0 + 0 + 40960.0 + ) + ) + (('shock-green) + (process-drawable-shock-effect + self + (-> *lightning-spec-id-table* 4) + lightning-probe-callback + (the-as sparticle-launcher #f) + 0 + 0 + 40960.0 + ) + ) + (else + (process-drawable-shock-effect + self + (-> *lightning-spec-id-table* 1) + lightning-probe-callback + (-> *part-id-table* 166) + 0 + 0 + 40960.0 + ) + ) + ) + ) + (suspend) + (ja :num! (seek!)) + ) + (set! (-> sv-32 angle) 'back) + (set! (-> self post-hook) gp-4) + ) + ) + (else + (pickup-collectable! (-> self fact-override) (pickup-type health) (- (-> sv-32 damage)) (the-as handle #f)) + ) + ) + (target-hit-effect sv-32) + ) + (else + (case (-> sv-32 mode) + (('burn 'burnup) + (sound-play "get-burned") + ) + ) + ) + ) + (when (and (= (-> self game mode) 'play) (and (>= 0.0 (-> self fact-override health)) (using-gun? self))) + (send-event (ppointer->process (-> self gun gun)) 'die) + (target-gun-end-mode #f) + ) + (set! (-> self control mod-surface) *smack-mods*) + (target-hit-setup-anim sv-32) + (target-hit-move sv-32 (target-hit-orient sv-32 sv-36) target-falling-anim-trans 1.0) + (if (and (and (logtest? (focus-status dark) (-> self focus-status)) (nonzero? (-> self darkjak))) + (>= 1.0 (-> self fact-override health)) + ) + (go target-darkjak-get-off) + ) + (if (and (= (-> self game mode) 'play) (>= 0.0 (-> self fact-override health))) + (go target-death (-> sv-32 mode)) + ) + (go target-hit-ground #f) + (none) + ) + :post target-post + ) + +;; definition for symbol *death-spool-array*, type (array spool-anim) +(define *death-spool-array* + (new 'static 'boxed-array :type spool-anim + (new 'static 'spool-anim :name "jak-death-1" :anim-name "jak-death-1" :parts 1 :command-list '()) + (new 'static 'spool-anim :name "jak-death-2" :anim-name "jak-death-2" :parts 1 :command-list '()) + (new 'static 'spool-anim :name "jak-death-3" :anim-name "jak-death-3" :parts 1 :command-list '()) + (new 'static 'spool-anim :name "jak-death-4" :anim-name "jak-death-4" :parts 1 :command-list '()) + (new 'static 'spool-anim :name "jak-death-5" :anim-name "jak-death-5" :parts 1 :command-list '()) + ) + ) + +;; definition for function death-movie-remap +(defun death-movie-remap ((arg0 int) (arg1 int)) + (let ((v1-0 (/ arg0 arg1))) + (mod + (if (not (logtest? v1-0 1)) + (logxor v1-0 arg0) + (logand #xfffffff (- (logxor v1-0 arg0))) + ) + arg1 + ) + ) + ) + +;; definition of type kill-nearby-enemies-info +(deftype kill-nearby-enemies-info (basic) + ((dist float :offset-assert 4) + (pos vector :inline :offset-assert 16) + ) + :method-count-assert 9 + :size-assert #x20 + :flag-assert #x900000020 + ) + +;; definition for method 3 of type kill-nearby-enemies-info +(defmethod inspect kill-nearby-enemies-info ((obj kill-nearby-enemies-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~1Tdist: ~f~%" (-> obj dist)) + (format #t "~1Tpos: #~%" (-> obj pos)) + (label cfg-4) + obj + ) + +;; definition for symbol *kill-nearby-enemies-info*, type kill-nearby-enemies-info +(define *kill-nearby-enemies-info* (new 'static 'kill-nearby-enemies-info)) + +;; definition for function kill-nearby-enemies +;; INFO: Used lq/sq +(defun kill-nearby-enemies ((arg0 vector) (arg1 float)) + (let ((v1-0 *kill-nearby-enemies-info*)) + (set! (-> v1-0 dist) arg1) + (set! (-> v1-0 pos quad) (-> arg0 quad)) + ) + (iterate-process-tree + *entity-pool* + (lambda ((arg0 process)) + (if (and (logtest? (process-mask enemy) (-> arg0 mask)) + (type? arg0 process-drawable) + (nonzero? (-> (the-as process-drawable arg0) root)) + (>= (-> *kill-nearby-enemies-info* dist) + (vector-vector-distance (-> (the-as process-drawable arg0) root trans) (-> *kill-nearby-enemies-info* pos)) + ) + ) + (process-entity-status! arg0 (entity-perm-status bit-9) #t) + ) + ) + *null-kernel-context* + ) + ) + +;; definition for function target-death-anim-trans +;; WARN: Return type mismatch int vs none. +(defbehavior target-death-anim-trans target () + (send-event *camera* 'joystick 0 -1082130432) + (compute-alignment! (-> self align)) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (when (not (logtest? (-> self align flags) (align-flags disabled))) + (vector-matrix*! gp-0 (the-as vector (-> self align delta)) (-> self control c-R-w)) + (vector-float*! (-> self control transv) gp-0 (-> self clock frames-per-second)) + ) + ) + 0 + (none) + ) + +;; definition for function target-death-anim +;; WARN: Return type mismatch int vs none. +(defbehavior target-death-anim target ((arg0 spool-anim)) + (set! (-> self control mod-surface) *neutral-mods*) + (set! (-> self state-flags) (logior (state-flags lleg-no-ik rleg-no-ik) (-> self state-flags))) + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! (-> self draw art-group data 69) :num! (seek! (ja-aframe 30.0 0)) :frame-num 0.0) + (until (ja-done? 0) + (if arg0 + (gui-control-method-12 + *gui-control* + self + (gui-channel art-load) + (gui-action queue) + (-> arg0 name) + 0 + -99.0 + (new 'static 'sound-id) + ) + ) + (target-death-anim-trans) + (suspend) + (ja :num! (seek! (ja-aframe 30.0 0))) + ) + 0 + (none) + ) + +;; definition for function target-death-main +;; WARN: Return type mismatch int vs none. +(defbehavior target-death-main target ((arg0 symbol)) + (case arg0 + (('tar) + (sound-play "death-drown") + ) + ) + (+! (-> *game-info* death-movie-tick) 1) + (if (= (death-movie-remap (+ (-> *game-info* death-movie-tick) -1) (-> *death-spool-array* length)) + (death-movie-remap (-> *game-info* death-movie-tick) (-> *death-spool-array* length)) + ) + (+! (-> *game-info* death-movie-tick) 1) + ) + (let ((gp-2 + (-> *death-spool-array* (death-movie-remap (-> *game-info* death-movie-tick) (-> *death-spool-array* length))) + ) + ) + (if (or (rand-vu-percent? 0.5) (nonzero? (-> *task-manager-engine* length))) + (set! gp-2 (the-as spool-anim #f)) + ) + (set-setting! 'allow-progress #f 0 0) + (target-death-anim gp-2) + (cond + ((or (not gp-2) (or (or (logtest? (water-flags touch-water) (-> self water flags)) + (logtest? (-> self control status) (collide-status on-water)) + ) + (or (= (-> self control ground-pat material) (pat-material snow)) + (= (-> self control ground-pat material) (pat-material deepsnow)) + (-> *setting-control* user-current spooling) + (let ((v1-44 (file-status *art-control* (-> gp-2 name) 0))) + (not (or (= v1-44 'locked) (= v1-44 'active))) + ) + ) + ) + ) + (ja-no-eval :num! (seek!)) + (while (not (ja-done? 0)) + (target-death-anim-trans) + (suspend) + (ja-eval) + ) + ) + ((string-prefix= "jak" (-> gp-2 name)) + (set! (-> self spool-anim) gp-2) + (set! (-> self post-hook) (lambda () (target-death-anim-trans) (target-no-stick-post) (none))) + (ja-play-spooled-anim + gp-2 + (the-as art-joint-anim (-> self draw art-group data 5)) + (the-as art-joint-anim #f) + (the-as (function process-drawable symbol) false-func) + ) + (set-blackout-frames (seconds 0.1)) + (set! (-> self spool-anim) #f) + ) + ) + ) + 0 + (none) + ) + +;; definition for function target-death-reset +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defbehavior target-death-reset target ((arg0 symbol) (arg1 symbol)) + (let ((v1-1 (-> *task-manager-engine* alive-list next0))) + *task-manager-engine* + (let ((s4-0 (-> v1-1 next0))) + (while (!= v1-1 (-> *task-manager-engine* alive-list-end)) + (let ((a1-1 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-1 from) (process->ppointer self)) + (set! (-> a1-1 num-params) 2) + (set! (-> a1-1 message) 'target) + (set! (-> a1-1 param 0) (the-as uint 'die)) + (set! (-> a1-1 param 1) (the-as uint arg0)) + (let ((v1-2 (send-event-function (the-as process-tree (-> (the-as connection v1-1) param1)) a1-1))) + (case v1-2 + (('wait) + (set! arg1 (the-as symbol v1-2)) + ) + ) + ) + ) + (set! v1-1 s4-0) + *task-manager-engine* + (set! s4-0 (-> s4-0 next0)) + ) + ) + ) + (cond + ((= (the-as object arg1) 'wait) + (set! (-> self trans-hook) #f) + (set! (-> self control unknown-word04) (the-as uint #f)) + (when (not (logtest? (focus-status pilot) (-> self focus-status))) + (set! (-> self post-hook) target-no-ja-move-post) + (ja-post) + ) + (while (not (-> self control unknown-spool-anim00)) + (send-event *camera* 'joystick 0 -1082130432) + (suspend) + ) + ) + (else + (suspend) + 0 + ) + ) + (set! (-> self control transv quad) (the-as uint128 0)) + (initialize! + (-> self game) + (if (= arg0 'bot) + 'try + 'life + ) + (the-as game-save #f) + (the-as string #f) + ) + (set! (-> self state-time) (-> self clock frame-counter)) + (sleep-code) + 0 + (none) + ) + +;; failed to figure out what this is: +(defstate target-death (target) + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (let ((v1-0 event-type)) + (the-as object (cond + ((= v1-0 'end-mode) + (let ((v0-0 (the-as object #t))) + (set! (-> self control unknown-word04) (the-as uint v0-0)) + v0-0 + ) + ) + ((= v1-0 'change-mode) + (case (-> event param 0) + (('grab) + (case (-> event param 1) + (('dead) + #t + ) + (else + #f + ) + ) + ) + ) + ) + ((= v1-0 'notify) + (when (type? proc pov-camera) + (case (-> event param 0) + (('die 'abort-request) + (set! (-> self control unknown-word04) (the-as uint #t)) + (the-as object (set-blackout-frames (seconds 0.2))) + ) + ) + ) + ) + ((= v1-0 'get-pickup) + #f + ) + ((= v1-0 'touched) + #f + ) + (else + (target-generic-event-handler proc arg1 event-type event) + ) + ) + ) + ) + ) + :exit (behavior () + (let ((a0-0 (-> self spool-anim))) + (when (and a0-0 (= (-> *setting-control* user-current spooling) (process->ppointer self))) + (ja-abort-spooled-anim a0-0 (the-as art-joint-anim #f) -1) + (ja-channel-set! 1) + (ja :group! (-> self draw art-group data 5) :num! min) + ) + ) + (logclear! (-> self focus-status) (focus-status dead hit)) + (logclear! (-> self state-flags) (state-flags disable-attacks)) + (target-exit) + (remove-setting! 'process-mask) + (remove-setting! 'allow-progress) + (remove-setting! 'mode-name) + (let ((v1-20 (-> self control root-prim))) + (set! (-> v1-20 prim-core collide-as) (-> self control backup-collide-as)) + (set! (-> v1-20 prim-core collide-with) (-> self control backup-collide-with)) + ) + (set! (-> self control pat-ignore-mask) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1)) + (set! (-> self control dynam gravity-max) (-> self control standard-dynamics gravity-max)) + (set! (-> self control dynam gravity-length) (-> self control standard-dynamics gravity-length)) + (send-event (ppointer->process (-> self gun gun)) 'reset) + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + (none) + ) + :trans (-> target-hit trans) + :code (behavior ((arg0 symbol)) + (while #t + (format 0 "no code~%") + (suspend) + ) + ) + :post target-no-stick-post + ) + + + diff --git a/goal_src/jak2/engine/target/target-util.gc b/goal_src/jak2/engine/target/target-util.gc index 5d7148c870..6a8c44652c 100644 --- a/goal_src/jak2/engine/target/target-util.gc +++ b/goal_src/jak2/engine/target/target-util.gc @@ -7,16 +7,39 @@ ;; DECOMP BEGINS -(defskelgroup skel-jchar jakb jakb-lod0-jg -1 - ((jakb-lod0-mg (meters 999999))) - :bounds (static-spherem 0 0 0 3.2) +; (defskelgroup skel-jchar jakb jakb-lod0-jg -1 +; ((jakb-lod0-mg (meters 999999))) +; :bounds (static-spherem 0 0 0 3.2) +; :longest-edge (meters 1) +; :shadow jakb-shadow-mg +; :texture-level 6 +; :sort 1 +; :origin-joint-index 3 +; :shadow-joint-index 3 +; ) + +(let ((a0-0 (new 'static 'skeleton-group + :name "skel-jchar" + :extra #f + :info #f + :art-group-name "jakb" + :bounds (new 'static 'vector :w 13107.2) :longest-edge (meters 1) - :shadow jakb-shadow-mg - :texture-level 6 + :texture-level #x6 + :version #x7 + :shadow 2 :sort 1 :origin-joint-index 3 :shadow-joint-index 3 ) + ) + ) + (set! (-> a0-0 jgeo) 0) + (set! (-> a0-0 janim) -1) + (set! (-> a0-0 mgeo 0) 1) + (set! (-> a0-0 lod-dist 0) 4095996000.0) + (add-to-loading-level a0-0) + ) (define *target-shadow-control* (new 'static 'shadow-control :settings (new 'static 'shadow-settings diff --git a/goal_src/jak2/engine/ui/hud-classes.gc b/goal_src/jak2/engine/ui/hud-classes.gc index a409419d65..98c59ac355 100644 --- a/goal_src/jak2/engine/ui/hud-classes.gc +++ b/goal_src/jak2/engine/ui/hud-classes.gc @@ -7,3 +7,7 @@ ;; DECOMP BEGINS +(defun activate-hud ((arg0 target)) + (format 0 "no hud~%") + (none) + ) \ No newline at end of file diff --git a/goal_src/jak2/kernel/gkernel-h.gc b/goal_src/jak2/kernel/gkernel-h.gc index 3bbc1dbe1d..554a78962f 100644 --- a/goal_src/jak2/kernel/gkernel-h.gc +++ b/goal_src/jak2/kernel/gkernel-h.gc @@ -489,7 +489,7 @@ (defmacro ppointer->handle (pproc) "convert a ppointer to a handle. assumes the ppointer is valid." `(let ((the-process (the-as (pointer process) ,pproc))) - (new 'static 'handle :process the-process :pid (-> the-process 0 pid)) + (new 'static 'handle :process the-process :pid (if the-process (-> the-process 0 pid))) ) ) diff --git a/test/decompiler/reference/jak2/engine/camera/cam-master_REF.gc b/test/decompiler/reference/jak2/engine/camera/cam-master_REF.gc index f8ccd7f30d..8801b6e6a9 100644 --- a/test/decompiler/reference/jak2/engine/camera/cam-master_REF.gc +++ b/test/decompiler/reference/jak2/engine/camera/cam-master_REF.gc @@ -7,7 +7,7 @@ (v1-4 0) ) (if a2-0 - (set! v1-4 (the-as int (incomplete-bitfield-access (-> a2-0 control pat-ignore-mask)))) + (set! v1-4 (logand (the-as int (-> a2-0 control pat-ignore-mask)) 112)) ) (logior (if arg0 #x9010002 diff --git a/test/decompiler/reference/jak2/engine/collide/collide-cache-h_REF.gc b/test/decompiler/reference/jak2/engine/collide/collide-cache-h_REF.gc index ef8de23ff7..c302f62c28 100644 --- a/test/decompiler/reference/jak2/engine/collide/collide-cache-h_REF.gc +++ b/test/decompiler/reference/jak2/engine/collide/collide-cache-h_REF.gc @@ -66,6 +66,7 @@ (prim-index uint16 :offset 56) (user16 uint16 :offset 58) (user32 uint32 :offset 60) + (clear-flags uint128 :offset 48) ) :method-count-assert 9 :size-assert #x40 @@ -165,7 +166,7 @@ (probe-using-spheres (_type_ collide-query) symbol 17) (fill-from-bg (_type_ (function collide-hash int collide-list collide-query int) (function collide-cache collide-list collide-query none) collide-query) none 18) (fill-from-fg-boxes (_type_) none 19) - (fill-from-fg-line-sphere (_type_) none 20) + (fill-from-fg-line-sphere (_type_ collide-query) none 20) (fill-from-water (_type_ water-control) none 21) (collide-cache-method-22 () none 22) (collide-cache-method-23 () none 23) diff --git a/test/decompiler/reference/jak2/engine/collide/collide-shape-h_REF.gc b/test/decompiler/reference/jak2/engine/collide/collide-shape-h_REF.gc index 14cd3c04b6..4aed4e4cfe 100644 --- a/test/decompiler/reference/jak2/engine/collide/collide-shape-h_REF.gc +++ b/test/decompiler/reference/jak2/engine/collide/collide-shape-h_REF.gc @@ -233,7 +233,7 @@ (:methods (new (symbol type collide-shape uint int) _type_ 0) (debug-draw (_type_) none 9) - (add-fg-prim-using-box () none 10) + (add-fg-prim-using-box (_type_ collide-cache) none 10) (add-fg-prim-using-line-sphere () none 11) (overlaps-others-test (_type_ overlaps-others-params collide-shape-prim) symbol 12) (overlaps-others-group (_type_ overlaps-others-params collide-shape-prim-group) symbol 13) diff --git a/test/decompiler/reference/jak2/engine/spatial-hash/spatial-hash-h_REF.gc b/test/decompiler/reference/jak2/engine/spatial-hash/spatial-hash-h_REF.gc index 647ee810ca..1b1ec17592 100644 --- a/test/decompiler/reference/jak2/engine/spatial-hash/spatial-hash-h_REF.gc +++ b/test/decompiler/reference/jak2/engine/spatial-hash/spatial-hash-h_REF.gc @@ -227,11 +227,11 @@ (:methods (new (symbol type int int) _type_ 0) (add-an-object (_type_ vector hash-object-info) int 34) - (spatial-hash-method-35 (_type_) none 35) + (fill-actor-list-for-box (_type_ bounding-box (pointer collide-shape) int) int 35) (fill-actor-list-for-sphere (_type_ sphere (pointer collide-shape) int) int 36) - (spatial-hash-method-37 (_type_) none 37) - (fill-actor-list-for-vec+r (_type_ vector (pointer collide-shape) int) none 38) - (spatial-hash-method-39 (_type_ object hash-object-info) none 39) + (fill-actor-list-for-line-sphere (_type_ vector vector float (pointer collide-shape) int int) int 37) + (fill-actor-list-for-vec+r (_type_ vector (pointer collide-shape) int) int 38) + (spatial-hash-method-39 (_type_ object hash-object-info) int 39) (validate-objects (_type_) none 40) ) ) diff --git a/test/decompiler/reference/jak2/engine/spatial-hash/spatial-hash_REF.gc b/test/decompiler/reference/jak2/engine/spatial-hash/spatial-hash_REF.gc index 99d3ddc69e..d4f4122d5e 100644 --- a/test/decompiler/reference/jak2/engine/spatial-hash/spatial-hash_REF.gc +++ b/test/decompiler/reference/jak2/engine/spatial-hash/spatial-hash_REF.gc @@ -921,14 +921,12 @@ ;; definition for method 38 of type spatial-hash ;; INFO: Used lq/sq -;; WARN: Return type mismatch int vs none. (defmethod fill-actor-list-for-vec+r spatial-hash ((obj spatial-hash) (arg0 vector) (arg1 (pointer collide-shape)) (arg2 int)) (let ((v1-0 (new 'stack-no-clear 'sphere))) (set! (-> v1-0 quad) (-> arg0 quad)) (set! (-> v1-0 r) 0.0) (fill-actor-list-for-sphere obj v1-0 arg1 arg2) ) - (none) ) ;; definition for method 40 of type spatial-hash @@ -945,7 +943,3 @@ 0 (none) ) - - - -