diff --git a/common/goos/Printer.cpp b/common/goos/Printer.cpp index a34bb55a9a..9057f652ea 100644 --- a/common/goos/Printer.cpp +++ b/common/goos/Printer.cpp @@ -46,6 +46,10 @@ goos::Object to_symbol(const std::string& str) { return goos::SymbolObject::make_new(get_pretty_printer_reader().symbolTable, str); } +goos::Object new_string(const std::string& str) { + return goos::StringObject::make_new(str); +} + goos::Object build_list(const std::string& str) { return build_list(to_symbol(str)); } diff --git a/common/goos/Printer.h b/common/goos/Printer.h index 1052b9426e..7d07b4150b 100644 --- a/common/goos/Printer.h +++ b/common/goos/Printer.h @@ -10,6 +10,8 @@ namespace pretty_print { // string -> object (as a symbol) goos::Object to_symbol(const std::string& str); +goos::Object new_string(const std::string& str); + // list with a single symbol from a string goos::Object build_list(const std::string& str); diff --git a/decompiler/analysis/final_output.cpp b/decompiler/analysis/final_output.cpp index ff3d6ff6d1..b58cd66219 100644 --- a/decompiler/analysis/final_output.cpp +++ b/decompiler/analysis/final_output.cpp @@ -27,19 +27,41 @@ void append_body_to_function_definition(goos::Object* top_form, const std::vector& inline_body, const FunctionVariableDefinitions& var_dec, const TypeSpec& ts) { - if (var_dec.local_vars) { - pretty_print::append(*top_form, pretty_print::build_list(*var_dec.local_vars)); + // Some forms like docstrings and local-vars we _always_ want to be at the top level and first (in + // the order added) + std::vector initial_top_level_forms; + + std::vector body_elements; + body_elements.insert(body_elements.end(), inline_body.begin(), inline_body.end()); + // If the first element in the body is a docstring, add it first + if (body_elements.size() > 0 && body_elements.at(0).is_string()) { + initial_top_level_forms.push_back(inline_body.at(0)); + body_elements.erase(body_elements.begin()); } + // add local vars if applicable + if (var_dec.local_vars) { + initial_top_level_forms.push_back(*var_dec.local_vars); + } + + std::vector final_body; + for (const auto& elem : initial_top_level_forms) { + final_body.push_back(elem); + } + // If the form contains the ppointer and isn't a behavior, we need to wrap the body in `with-pp` if (var_dec.had_pp && !ts.try_get_tag("behavior")) { std::vector body_with_pp; body_with_pp.push_back(pretty_print::to_symbol("with-pp")); - body_with_pp.insert(body_with_pp.end(), inline_body.begin(), inline_body.end()); - pretty_print::append(*top_form, - pretty_print::build_list(pretty_print::build_list(body_with_pp))); + body_with_pp.insert(body_with_pp.end(), body_elements.begin(), body_elements.end()); + final_body.push_back(pretty_print::build_list(body_with_pp)); } else { - pretty_print::append(*top_form, pretty_print::build_list(inline_body)); + // otherwise, just construct the form from the body + for (const auto& elem : body_elements) { + final_body.push_back(elem); + } } + + pretty_print::append(*top_form, pretty_print::build_list(final_body)); } } // namespace @@ -113,10 +135,9 @@ std::string final_defun_out(const Function& func, // docstring if available if (dts.symbol_metadata_map.count(func.name()) != 0) { - auto meta = dts.symbol_metadata_map.at(func.name()); + auto& meta = dts.symbol_metadata_map.at(func.name()); if (meta.docstring) { - inline_body.insert(inline_body.begin(), - pretty_print::to_symbol(fmt::format("\"{}\"", meta.docstring.value()))); + inline_body.insert(inline_body.begin(), pretty_print::new_string(meta.docstring.value())); } } @@ -136,8 +157,8 @@ std::string final_defun_out(const Function& func, auto top_form = pretty_print::build_list(top); if (method_info.docstring) { - inline_body.insert(inline_body.begin(), pretty_print::to_symbol(fmt::format( - "\"{}\"", method_info.docstring.value()))); + inline_body.insert(inline_body.begin(), + pretty_print::new_string(method_info.docstring.value())); } append_body_to_function_definition(&top_form, inline_body, var_dec, method_info.type); return pretty_print::to_string(top_form); diff --git a/decompiler/config/jak2/all-types.gc b/decompiler/config/jak2/all-types.gc index 44a53d0508..7cda913871 100644 --- a/decompiler/config/jak2/all-types.gc +++ b/decompiler/config/jak2/all-types.gc @@ -29843,21 +29843,43 @@ ;; mysql-nav-graph ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +++mysql-nav-graph:mysql-save-flag +(defenum mysql-save-flag + :type uint32 + :bitfield #t + (delete 1) + (update 2) + (insert 3) + ) +;; ---mysql-nav-graph:mysql-save-flag +;; +++mysql-nav-graph:nav-node-flag +(defenum nav-node-flag + "This string value is stored in their SQL database" + :type uint32 + :bitfield #t + (visited 0) + (blocked 1) + (pedestrian 2) + (selected 3) + (hidden 4)) +;; ---mysql-nav-graph:nav-node-flag + +(declare-type mysql-nav-edge structure) (deftype mysql-nav-node (structure) - ((mysql-save-flag uint32 :offset-assert 0) + ((mysql-save-flag mysql-save-flag :offset-assert 0) (runtime-id uint32 :offset-assert 4) - (temp-edge-list basic :offset-assert 8) + (temp-edge-list (inline-array mysql-nav-edge) :offset-assert 8) (level-node-index int32 :offset-assert 12) (cam-dist float :offset-assert 16) (visible basic :offset-assert 20) (nav_node_id uint32 :offset-assert 24) (nav_graph_id uint32 :offset-assert 28) (position vector :inline :offset-assert 32) - (level_name basic :offset-assert 48) + (level_name symbol :offset-assert 48) (angle float :offset-assert 52) (radius float :offset-assert 56) - (nav_node_flag uint32 :offset-assert 60) + (nav_node_flag nav-node-flag :offset-assert 60) (nav_mesh_id uint32 :offset-assert 64) ) :pack-me @@ -29865,25 +29887,70 @@ :size-assert #x44 :flag-assert #xb00000044 (:methods - (mysql-nav-node-method-9 () none 9) - (mysql-nav-node-method-10 () none 10) + (exec-sql! + "Executes the respective SQL operation specified by `mysql-save-flag`, return value indicates success" + (_type_) symbol 9) + (temp-edge-size + "Returns the number of [[mysql-nav-edge]] stored in the `temp-edge-list`" + (_type_) int 10) ) ) -#| (deftype mysql-nav-node-array (inline-array-class) - ((length int32 :offset-assert 4) - (allocated-length int32 :offset-assert 8) - (data UNKNOWN :dynamic :offset-assert 16) - ) + ((data mysql-nav-node :dynamic :inline :offset-assert 16)) :method-count-assert 9 :size-assert #x10 :flag-assert #x900000010 ) -|# + +;; +++mysql-nav-graph:nav-directionality +(defenum nav-directionality + :type uint32 + :bitfield #f + (default 0) + (directed 1) + (bi_directional 2)) +;; ---mysql-nav-graph:nav-directionality + +;; +++mysql-nav-graph:nav-clock-mask +(defenum nav-clock-mask + "This string value is stored in their SQL database" + :type uint32 + :bitfield #t + (phase-1 0) + (phase-1a 1) + (phase-2 2) + (phase-2a 3) + (phase-3 4) + (phase-3a 5) + (phase-4 6) + (phase-4a 7)) +;; ---mysql-nav-graph:nav-clock-mask + +;; +++mysql-nav-graph:nav-clock-type +(defenum nav-clock-type + "This string value is stored in their SQL database" + :type uint32 + :bitfield #f + (no-clock 0) + (clock2 1) + (clock3 2) + (clock4 3)) +;; ---mysql-nav-graph:nav-clock-mask + +;; +++mysql-nav-graph:nav-minimap-edge-flag +(defenum nav-minimap-edge-flag + "This string value is stored in their SQL database" + :type int32 + :bitfield #t + (pass-red 0) + (pass-green 1) + (pass-yellow 2) + (pass-blue 3)) +;; ---mysql-nav-graph:nav-minimap-edge-flag (deftype mysql-nav-edge (structure) - ((mysql-save-flag uint32 :offset-assert 0) + ((mysql-save-flag mysql-save-flag :offset-assert 0) (runtime-id uint32 :offset-assert 4) (runtime-node-id-1 int32 :offset-assert 8) (runtime-node-id-2 int32 :offset-assert 12) @@ -29892,39 +29959,34 @@ (nav_graph_id uint32 :offset-assert 24) (nav_node_id_1 uint32 :offset-assert 28) (nav_node_id_2 uint32 :offset-assert 32) - (directionality uint32 :offset-assert 36) + (directionality nav-directionality :offset-assert 36) (speed_limit float :offset-assert 40) (density float :offset-assert 44) (traffic_edge_flag int32 :offset-assert 48) - (nav_clock_mask uint32 :offset-assert 52) - (nav_clock_type uint32 :offset-assert 56) + (nav_clock_mask nav-clock-mask :offset-assert 52) + (nav_clock_type nav-clock-type :offset-assert 56) (width float :offset-assert 60) - (minimap_edge_flag int32 :offset-assert 64) + (minimap_edge_flag nav-minimap-edge-flag :offset-assert 64) ) :pack-me :method-count-assert 10 :size-assert #x44 :flag-assert #xa00000044 (:methods - (mysql-nav-edge-method-9 () none 9) - ) + (exec-sql! + "Executes the respective SQL operation specified by `mysql-save-flag`, return value indicates success" + (_type_) symbol 9)) ) -#| (deftype mysql-nav-edge-array (inline-array-class) - ((length int32 :offset-assert 4) - (allocated-length int32 :offset-assert 8) - (data UNKNOWN :dynamic :offset-assert 16) - ) + ((data mysql-nav-edge :dynamic :inline :offset-assert 16)) :method-count-assert 9 :size-assert #x10 :flag-assert #x900000010 ) -|# -#| (deftype mysql-nav-visnode (structure) - ((mysql-save-flag uint32 :offset-assert 0) + ((mysql-save-flag mysql-save-flag :offset-assert 0) (runtime-node-id int32 :offset-assert 4) (runtime-edge-id int32 :offset-assert 8) (nav_visnode_id uint32 :offset-assert 12) @@ -29936,24 +29998,18 @@ :size-assert #x1c :flag-assert #xa0000001c (:methods - (mysql-nav-visnode-method-9 () none 9) - ) + (exec-sql! + "Executes the respective SQL operation specified by `mysql-save-flag`, return value indicates success" + (_type_) symbol 9)) ) -|# -#| (deftype mysql-nav-visnode-array (inline-array-class) - ((length int32 :offset-assert 4) - (allocated-length int32 :offset-assert 8) - (data UNKNOWN :dynamic :offset-assert 16) - ) + ((data mysql-nav-visnode :dynamic :inline :offset-assert 16)) :method-count-assert 9 :size-assert #x10 :flag-assert #x900000010 ) -|# -#| (deftype mysql-nav-graph-level-info (structure) ((level basic :offset-assert 0) (level-id uint32 :offset-assert 4) @@ -29961,48 +30017,71 @@ (branch-count int32 :offset-assert 12) (to-link-count int32 :offset-assert 16) ) + :allow-misaligned :method-count-assert 9 :size-assert #x14 :flag-assert #x900000014 ) -|# -#| (deftype mysql-nav-graph (basic) ((nav_graph_id uint32 :offset-assert 4) - (node-array basic :offset-assert 8) - (edge-array basic :offset-assert 12) - (visnode-array basic :offset-assert 16) + (node-array mysql-nav-node-array :offset-assert 8) + (edge-array mysql-nav-edge-array :offset-assert 12) + (visnode-array mysql-nav-visnode-array :offset-assert 16) (level-info-array-length int32 :offset-assert 20) (level-info-last-lookup int32 :offset-assert 24) - (level-info-array UNKNOWN 32 :offset-assert 28) + (level-info-array mysql-nav-graph-level-info 32 :inline :offset-assert 28) ) :method-count-assert 21 :size-assert #x41c :flag-assert #x150000041c (:methods - (mysql-nav-graph-method-9 () none 9) - (mysql-nav-graph-method-10 () none 10) - (mysql-nav-graph-method-11 () none 11) - (mysql-nav-graph-method-12 () none 12) - (mysql-nav-graph-method-13 () none 13) - (mysql-nav-graph-method-14 () none 14) - (mysql-nav-graph-method-15 () none 15) - (mysql-nav-graph-method-16 () none 16) - (mysql-nav-graph-method-17 () none 17) - (mysql-nav-graph-method-18 () none 18) - (mysql-nav-graph-method-19 () none 19) - (mysql-nav-graph-method-20 () none 20) + (new (symbol type int string) _type_ 0) + (init-from-sql! + "Query the database and initialize the [[mysql-nav-graph]] and all it's related components" + (_type_ string string) symbol 9) + (exec-sql! (_type_) symbol 10) + (indexof-nav-node + "Iterate through the `node-array` and return the index for the first [[mysql-nav-node]] whom's `nav_node_id` matches the provided id + returns `-1` if none is found" + (_type_ int) int 11) + (indexof-nav-edge + "Iterate through the `edge-array` and return the index for the first [[mysql-nav-edge]] whom's `nav_edge_id` matches the provided id + returns `-1` if none is found" + (_type_ int) int 12) + (alloc-new-node! + "Allocates a new `[[mysql-nav-node]]`, if `node-array`'s `length` exceeds `3000` return `-1` + otherwise, return the new size of the array" + (_type_) int 13) + (alloc-new-edge! + "Allocates a new `[[mysql-nav-edge]]`, if `edge-array`'s `length` exceeds `5000` return `-1` + otherwise, return the new size of the array" + (_type_) int 14) + (indexof-visnode + "Returns the index in the `visnode-array` whom's [[mysql-nav-visnode]] has the provided `runtime-edge-id` and `runtime-node-id` + if none exist, return `-1`" + (_type_ int int) int 15) + (alloc-new-visnode! + "Potentially allocates a new `[[mysql-nav-visnode]]`: + - if `visnode-array`'s `length` exceeds `3000` return `-1` + - otherwise, if the node already exists, TODO + - if the node does not already exist, create it!" + (_type_ int int) int 16) + (mysql-nav-graph-method-17 + (_type_) none 17) + (lookup-level-info2 + "TODO - this was originally called `lookup-level-info` but it clashes with the function defined in `level`" + (_type_ mysql-nav-node symbol) mysql-nav-graph-level-info 18) + (mysql-nav-graph-method-19 (_type_) none 19) + (mysql-nav-graph-method-20 (_type_) none 20) ) ) -|# ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; nav-graph-editor ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype nav-graph-command (structure) ((com-type uint32 :offset-assert 0) (id int32 :offset-assert 4) @@ -30013,19 +30092,13 @@ :size-assert #x20 :flag-assert #x900000020 ) -|# -#| (deftype nav-graph-command-array (inline-array-class) - ((length int32 :offset-assert 4) - (allocated-length int32 :offset-assert 8) - (data UNKNOWN :dynamic :offset-assert 16) - ) + ((data nav-graph-command :dynamic :offset-assert 16)) :method-count-assert 9 :size-assert #x10 :flag-assert #x900000010 ) -|# (deftype nav-graph-editor (process) ((nav-graph basic :offset-assert 128) @@ -30108,12 +30181,12 @@ (nav-graph-editor-method-59 () none 59) (nav-graph-editor-method-60 () none 60) (nav-graph-editor-method-61 () none 61) - (nav-graph-editor-method-62 () none 62) + (nav-graph-editor-method-62 (_type_ symbol symbol) none 62) (nav-graph-editor-method-63 () none 63) ) ) -;; (define-extern *nav-graph-editor* object) +(define-extern *nav-graph-editor* nav-graph-editor) ;; (define-extern nav-graph-editor-init-by-other function) (define-extern run-nav-graph-editor (function symbol none)) (define-extern get-nav-graph-editor (function nav-graph-editor)) diff --git a/decompiler/config/jak2/hacks.jsonc b/decompiler/config/jak2/hacks.jsonc index a6dff9f14e..1409e20c06 100644 --- a/decompiler/config/jak2/hacks.jsonc +++ b/decompiler/config/jak2/hacks.jsonc @@ -64,7 +64,6 @@ "anim-test-anim-list-handler", "anim-test-sequence-list-handler", "anim-tester-get-playing-item", - "(method 9 mysql-nav-graph)", "(method 58 nav-graph-editor)", "(method 120 enemy)", "start-pilot-recorder", @@ -261,7 +260,8 @@ "(method 42 nav-mesh)": [1, 2, 3, 7], "point-poly-distance-min": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], "(method 34 nav-mesh)": [1, 2, 3, 7], - "(method 35 nav-mesh)": [2, 4] + "(method 35 nav-mesh)": [2, 4], + "(method 18 mysql-nav-graph)": [0, 1, 3, 4, 5, 9] }, // Sometimes the game might use format strings that are fetched dynamically, diff --git a/decompiler/config/jak2/type_casts.jsonc b/decompiler/config/jak2/type_casts.jsonc index 45d6435a16..f10367fe2e 100644 --- a/decompiler/config/jak2/type_casts.jsonc +++ b/decompiler/config/jak2/type_casts.jsonc @@ -2095,6 +2095,37 @@ "debug-menu-func-decode": [ [18, "a0", "symbol"] ], + "(method 13 mysql-nav-graph)": [[[15, 37], "gp", "mysql-nav-node"]], + "(method 14 mysql-nav-graph)": [[[16, 31], "v1", "mysql-nav-edge"]], + "(method 15 mysql-nav-graph)": [[[6, 11], "a3", "mysql-nav-visnode"]], + "(method 16 mysql-nav-graph)": [ + [[39, 54], "v1", "mysql-nav-visnode"], + [29, "a1", "mysql-nav-visnode"], + [24, "a1", "mysql-nav-visnode"] + ], + "(method 11 mysql-nav-graph)": [[7, "a2", "mysql-nav-node"]], + "(method 12 mysql-nav-graph)": [[7, "a2", "mysql-nav-edge"]], + "(method 19 mysql-nav-graph)": [ + [[32, 41], "s4", "mysql-nav-node"], + [[42, 62], "a0", "mysql-nav-edge"] + ], + "(method 10 mysql-nav-graph)": [ + [[12, 17], "a0", "mysql-nav-node"], + [[43, 62], "a0", "mysql-nav-edge"], + [[83, 102], "a0", "mysql-nav-visnode"] + ], + "(method 10 mysql-nav-node)": [[4, "v1", "mysql-nav-edge"]], + "(method 9 mysql-nav-graph)": [ + [[96, 261], "s0", "mysql-nav-node"], + [[360, 690], "s1", "mysql-nav-edge"], + [[781, 810], "s1", "mysql-nav-visnode"] + ], + "(method 17 mysql-nav-graph)": [ + [7, "a1", "mysql-nav-node"], + [22, "a1", "mysql-nav-edge"], + [[39, 59], "a1", "mysql-nav-edge"], + [[48, 58], "a2", "mysql-nav-node"] + ], // placeholder "placeholder-do-not-add-below": [] } diff --git a/decompiler/config/jak2/var_names.jsonc b/decompiler/config/jak2/var_names.jsonc index ef914afa01..aa885f5147 100644 --- a/decompiler/config/jak2/var_names.jsonc +++ b/decompiler/config/jak2/var_names.jsonc @@ -963,5 +963,37 @@ "t3-2": ["shader", "adgif-shader"], "t4-1": "dist-past-end" } + }, + "(method 15 mysql-nav-graph)": { + "args": ["obj", "edge-id", "node-id"] + }, + "(method 16 mysql-nav-graph)": { + "args": ["obj", "edge-id", "node-id"] + }, + "(method 11 mysql-nav-graph)": { + "args": ["obj", "node-id"] + }, + "(method 12 mysql-nav-graph)": { + "args": ["obj", "edge-id"] + }, + "(method 19 mysql-nav-graph)": { + "vars": { + "s4-0": ["s4-0", "mysql-nav-node"], + "a0-10": ["a0-10", "mysql-nav-edge"] + } + }, + "(method 10 mysql-nav-graph)": { + "vars": { + "a0-3": ["a0-3", "mysql-nav-node"], + "a0-7": ["a0-7", "mysql-nav-edge"], + "a0-13": ["a0-13", "mysql-nav-visnode"] + } + }, + "(method 9 mysql-nav-graph)": { + "vars": { + "s0-1": ["nav-node", "mysql-nav-node"], + "s1-2": ["nav-edge", "mysql-nav-edge"], + "s1-4": ["nav-visnode", "mysql-nav-visnode"] + } } } diff --git a/goal_src/jak2/engine/debug/default-menu.gc b/goal_src/jak2/engine/debug/default-menu.gc index 3229614f16..512fb253a8 100644 --- a/goal_src/jak2/engine/debug/default-menu.gc +++ b/goal_src/jak2/engine/debug/default-menu.gc @@ -866,7 +866,6 @@ (= (-> *texture-pool* texture-enable-user-menu) arg0) ) - (defun dm-strip-lines-toggle-pick-func ((arg0 int) (arg1 debug-menu-msg)) (if (= arg1 (debug-menu-msg press)) (set! *display-strip-lines* (logxor *display-strip-lines* (the-as uint (/ arg0 8)))) @@ -2662,8 +2661,8 @@ ) ) -;; WARN: Return type mismatch pair vs debug-menu-node. (defun debug-menu-make-task-sub-menu ((arg0 symbol)) + "TODO - need to know more about game-info" (local-vars (sv-16 (function symbol type object object pair)) (sv-32 symbol) @@ -2678,7 +2677,6 @@ (sv-176 type) (sv-192 int) ) - "TODO - need to know more about game-info" (let ((gp-0 '())) (let ((s4-0 (-> *game-info* sub-task-list))) (countdown (s3-0 (-> s4-0 length)) @@ -2753,7 +2751,7 @@ ) (set! sv-16 arg0) (let ((a1-2 (debug-menu-make-task-sub-menu (the-as symbol a0-3)))) - (s2-0 s1-0 (s0-0 sv-16 (the-as pair a1-2))) + (s2-0 s1-0 (s0-0 sv-16 a1-2)) ) ) (set! s3-0 (cdr s3-0)) @@ -4126,76 +4124,54 @@ "Load" (function "Hover Drillmid" #f (lambda () (let ((a0-0 (get-nav-graph-editor))) - (when a0-0 - (let ((t9-1 (method-of-object a0-0 nav-graph-editor-method-62))) - 'hover - 'drillmid - (t9-1) + (if a0-0 + (nav-graph-editor-method-62 a0-0 'hover 'drillmid) ) - ) ) (none) ) ) (function "Hover Forresca" #f (lambda () (let ((a0-0 (get-nav-graph-editor))) - (when a0-0 - (let ((t9-1 (method-of-object a0-0 nav-graph-editor-method-62))) - 'hover - 'forresca - (t9-1) + (if a0-0 + (nav-graph-editor-method-62 a0-0 'hover 'forresca) ) - ) ) (none) ) ) (function "Hover Forest" #f (lambda () (let ((a0-0 (get-nav-graph-editor))) - (when a0-0 - (let ((t9-1 (method-of-object a0-0 nav-graph-editor-method-62))) - 'hover - 'forest - (t9-1) + (if a0-0 + (nav-graph-editor-method-62 a0-0 'hover 'forest) ) - ) ) (none) ) ) (function "Hover Under" #f (lambda () (let ((a0-0 (get-nav-graph-editor))) - (when a0-0 - (let ((t9-1 (method-of-object a0-0 nav-graph-editor-method-62))) - 'hover - 'under - (t9-1) + (if a0-0 + (nav-graph-editor-method-62 a0-0 'hover 'under) ) - ) ) (none) ) ) (function "Traffic" #f (lambda () (let ((a0-0 (get-nav-graph-editor))) - (when a0-0 - (let ((t9-1 (method-of-object a0-0 nav-graph-editor-method-62))) - 'traffic - (t9-1) + (if a0-0 + (nav-graph-editor-method-62 a0-0 'traffic #f) ) - ) ) (none) ) ) (function "Minimap" #f (lambda () (let ((a0-0 (get-nav-graph-editor))) - (when a0-0 - (let ((t9-1 (method-of-object a0-0 nav-graph-editor-method-62))) - 'minimap - (t9-1) + (if a0-0 + (nav-graph-editor-method-62 a0-0 'minimap #f) ) - ) ) (none) ) diff --git a/goal_src/jak2/engine/debug/nav/mysql-nav-graph.gc b/goal_src/jak2/engine/debug/nav/mysql-nav-graph.gc index fa0851d20d..785d714503 100644 --- a/goal_src/jak2/engine/debug/nav/mysql-nav-graph.gc +++ b/goal_src/jak2/engine/debug/nav/mysql-nav-graph.gc @@ -5,58 +5,1145 @@ ;; name in dgo: mysql-nav-graph ;; dgos: ENGINE, GAME +;; +++mysql-save-flag +(defenum mysql-save-flag + :type uint32 + :bitfield #t + (delete 1) + (update 2) + (insert 3) + ) +;; ---mysql-save-flag + +;; +++nav-node-flag +(defenum nav-node-flag + "This string value is stored in their SQL database" + :type uint32 + :bitfield #t + (visited 0) + (blocked 1) + (pedestrian 2) + (selected 3) + (hidden 4)) +;; ---nav-node-flag + +;; +++nav-directionality +(defenum nav-directionality + :type uint32 + :bitfield #f + (default 0) + (directed 1) + (bi_directional 2)) +;; ---nav-directionality + +;; +++nav-clock-mask +(defenum nav-clock-mask + "This string value is stored in their SQL database" + :type uint32 + :bitfield #t + (phase-1 0) + (phase-1a 1) + (phase-2 2) + (phase-2a 3) + (phase-3 4) + (phase-3a 5) + (phase-4 6) + (phase-4a 7)) +;; ---nav-clock-mask + +;; +++nav-clock-type +(defenum nav-clock-type + "This string value is stored in their SQL database" + :type uint32 + :bitfield #f + (no-clock 0) + (clock2 1) + (clock3 2) + (clock4 3)) +;; ---nav-clock-mask + +;; +++nav-minimap-edge-flag +(defenum nav-minimap-edge-flag + "This string value is stored in their SQL database" + :type int32 + :bitfield #t + (pass-red 0) + (pass-green 1) + (pass-yellow 2) + (pass-blue 3)) +;; ---nav-minimap-edge-flag + +(declare-type mysql-nav-edge structure) + +;; og:ignore-form:defmethod mysql-nav-graph-method-19 mysql-nav-graph +;; og:ignore-form:defmethod exec-sql! mysql-nav-graph + ;; DECOMP BEGINS +;; this file is debug only +(declare-file (debug)) +(when *debug-segment* (deftype mysql-nav-node (structure) - ((mysql-save-flag uint32 :offset-assert 0) - (runtime-id uint32 :offset-assert 4) - (temp-edge-list basic :offset-assert 8) - (level-node-index int32 :offset-assert 12) - (cam-dist float :offset-assert 16) - (visible basic :offset-assert 20) - (nav_node_id uint32 :offset-assert 24) - (nav_graph_id uint32 :offset-assert 28) - (position vector :inline :offset-assert 32) - (level_name basic :offset-assert 48) - (angle float :offset-assert 52) - (radius float :offset-assert 56) - (nav_node_flag uint32 :offset-assert 60) - (nav_mesh_id uint32 :offset-assert 64) + ((mysql-save-flag mysql-save-flag :offset-assert 0) + (runtime-id uint32 :offset-assert 4) + (temp-edge-list (inline-array mysql-nav-edge) :offset-assert 8) + (level-node-index int32 :offset-assert 12) + (cam-dist float :offset-assert 16) + (visible basic :offset-assert 20) + (nav_node_id uint32 :offset-assert 24) + (nav_graph_id uint32 :offset-assert 28) + (position vector :inline :offset-assert 32) + (level_name symbol :offset-assert 48) + (angle float :offset-assert 52) + (radius float :offset-assert 56) + (nav_node_flag nav-node-flag :offset-assert 60) + (nav_mesh_id uint32 :offset-assert 64) ) :pack-me :method-count-assert 11 :size-assert #x44 :flag-assert #xb00000044 (:methods - (mysql-nav-node-method-9 () none 9) - (mysql-nav-node-method-10 () none 10) + (exec-sql! (_type_) symbol 9) + (temp-edge-size (_type_) int 10) ) ) + +(deftype mysql-nav-node-array (inline-array-class) + ((data mysql-nav-node :inline :dynamic :offset-assert 16) + ) + :method-count-assert 9 + :size-assert #x10 + :flag-assert #x900000010 + ) + + +(set! (-> mysql-nav-node-array heap-base) (the-as uint 80)) + (deftype mysql-nav-edge (structure) - ((mysql-save-flag uint32 :offset-assert 0) - (runtime-id uint32 :offset-assert 4) - (runtime-node-id-1 int32 :offset-assert 8) - (runtime-node-id-2 int32 :offset-assert 12) - (temp-next-edge mysql-nav-edge :offset-assert 16) - (nav_edge_id uint32 :offset-assert 20) - (nav_graph_id uint32 :offset-assert 24) - (nav_node_id_1 uint32 :offset-assert 28) - (nav_node_id_2 uint32 :offset-assert 32) - (directionality uint32 :offset-assert 36) - (speed_limit float :offset-assert 40) - (density float :offset-assert 44) - (traffic_edge_flag int32 :offset-assert 48) - (nav_clock_mask uint32 :offset-assert 52) - (nav_clock_type uint32 :offset-assert 56) - (width float :offset-assert 60) - (minimap_edge_flag int32 :offset-assert 64) + ((mysql-save-flag mysql-save-flag :offset-assert 0) + (runtime-id uint32 :offset-assert 4) + (runtime-node-id-1 int32 :offset-assert 8) + (runtime-node-id-2 int32 :offset-assert 12) + (temp-next-edge mysql-nav-edge :offset-assert 16) + (nav_edge_id uint32 :offset-assert 20) + (nav_graph_id uint32 :offset-assert 24) + (nav_node_id_1 uint32 :offset-assert 28) + (nav_node_id_2 uint32 :offset-assert 32) + (directionality nav-directionality :offset-assert 36) + (speed_limit float :offset-assert 40) + (density float :offset-assert 44) + (traffic_edge_flag int32 :offset-assert 48) + (nav_clock_mask nav-clock-mask :offset-assert 52) + (nav_clock_type nav-clock-type :offset-assert 56) + (width float :offset-assert 60) + (minimap_edge_flag nav-minimap-edge-flag :offset-assert 64) ) :pack-me :method-count-assert 10 :size-assert #x44 :flag-assert #xa00000044 (:methods - (mysql-nav-edge-method-9 () none 9) + (exec-sql! (_type_) symbol 9) ) ) + + +(deftype mysql-nav-edge-array (inline-array-class) + ((data mysql-nav-edge :inline :dynamic :offset-assert 16) + ) + :method-count-assert 9 + :size-assert #x10 + :flag-assert #x900000010 + ) + + +(set! (-> mysql-nav-edge-array heap-base) (the-as uint 80)) + +(deftype mysql-nav-visnode (structure) + ((mysql-save-flag mysql-save-flag :offset-assert 0) + (runtime-node-id int32 :offset-assert 4) + (runtime-edge-id int32 :offset-assert 8) + (nav_visnode_id uint32 :offset-assert 12) + (nav_graph_id uint32 :offset-assert 16) + (nav_node_id uint32 :offset-assert 20) + (nav_edge_id uint32 :offset-assert 24) + ) + :method-count-assert 10 + :size-assert #x1c + :flag-assert #xa0000001c + (:methods + (exec-sql! (_type_) symbol 9) + ) + ) + + +(deftype mysql-nav-visnode-array (inline-array-class) + ((data mysql-nav-visnode :inline :dynamic :offset-assert 16) + ) + :method-count-assert 9 + :size-assert #x10 + :flag-assert #x900000010 + ) + + +(set! (-> mysql-nav-visnode-array heap-base) (the-as uint 32)) + +(deftype mysql-nav-graph-level-info (structure) + ((level basic :offset-assert 0) + (level-id uint32 :offset-assert 4) + (node-count int32 :offset-assert 8) + (branch-count int32 :offset-assert 12) + (to-link-count int32 :offset-assert 16) + ) + :allow-misaligned + :method-count-assert 9 + :size-assert #x14 + :flag-assert #x900000014 + ) + + +(deftype mysql-nav-graph (basic) + ((nav_graph_id uint32 :offset-assert 4) + (node-array mysql-nav-node-array :offset-assert 8) + (edge-array mysql-nav-edge-array :offset-assert 12) + (visnode-array mysql-nav-visnode-array :offset-assert 16) + (level-info-array-length int32 :offset-assert 20) + (level-info-last-lookup int32 :offset-assert 24) + (level-info-array mysql-nav-graph-level-info 32 :inline :offset-assert 28) + ) + :method-count-assert 21 + :size-assert #x41c + :flag-assert #x150000041c + (:methods + (new (symbol type int string) _type_ 0) + (init-from-sql! (_type_ string string) symbol 9) + (exec-sql! (_type_) symbol 10) + (indexof-nav-node (_type_ int) int 11) + (indexof-nav-edge (_type_ int) int 12) + (alloc-new-node! (_type_) int 13) + (alloc-new-edge! (_type_) int 14) + (indexof-visnode (_type_ int int) int 15) + (alloc-new-visnode! (_type_ int int) int 16) + (mysql-nav-graph-method-17 (_type_) none 17) + (lookup-level-info2 (_type_ mysql-nav-node symbol) mysql-nav-graph-level-info 18) + (mysql-nav-graph-method-19 (_type_) none 19) + (mysql-nav-graph-method-20 (_type_) none 20) + ) + ) + + +;; WARN: Return type mismatch object vs mysql-nav-graph. +(defmethod new mysql-nav-graph ((allocation symbol) (type-to-make type) (arg0 int) (arg1 string)) + (let ((gp-0 (object-new allocation type-to-make (the-as int (-> type-to-make size))))) + (if (zero? gp-0) + (return (the-as mysql-nav-graph 0)) + ) + (set! (-> gp-0 node-array) (new 'debug 'mysql-nav-node-array 3000)) + (set! (-> gp-0 node-array length) 0) + (set! (-> gp-0 edge-array) (new 'debug 'mysql-nav-edge-array 5000)) + (set! (-> gp-0 edge-array length) 0) + (set! (-> gp-0 visnode-array) (new 'debug 'mysql-nav-visnode-array 3000)) + (set! (-> gp-0 visnode-array length) 0) + (let ((s4-0 (clear *temp-string*))) + (format *temp-string* "select nav_graph_id from nav_graph where name='~S'" arg0) + (let ((a2-6 (sql-query s4-0))) + (when (!= (-> a2-6 error) 'select) + (format 0 "ERROR: sql: select error ~A for ~A~%" a2-6 gp-0) + (return (the-as mysql-nav-graph #f)) + ) + (set! (-> gp-0 nav_graph_id) (the-as uint (string->int (the-as string (-> a2-6 data 0))))) + ) + ) + gp-0 + ) + ) + +(defmethod alloc-new-node! mysql-nav-graph ((obj mysql-nav-graph)) + "Allocates a new `[[mysql-nav-node]]`, if `node-array`'s `length` exceeds `3000` return `-1` + otherwise, return the new size of the array" + (cond + ((>= (-> obj node-array length) 3000) + (format #t "mysql-nav-graph : nodes buffer too small, increase NAV_GRAPH_EDITOR_NODE_COUNT~%") + -1 + ) + (else + (let ((gp-0 (-> obj node-array data (-> obj node-array length))) + (s5-0 (-> obj node-array length)) + ) + (+! (-> obj node-array length) 1) + (set! (-> gp-0 mysql-save-flag) (mysql-save-flag)) + (logior! (-> gp-0 mysql-save-flag) (mysql-save-flag insert)) + (set! (-> gp-0 runtime-id) (the-as uint s5-0)) + (set! (-> gp-0 nav_graph_id) (-> obj nav_graph_id)) + (set! (-> gp-0 level_name) (-> (level-get-target-inside *level*) name)) + s5-0 + ) + ) + ) + ) + +(defmethod alloc-new-edge! mysql-nav-graph ((obj mysql-nav-graph)) + "Allocates a new `[[mysql-nav-edge]]`, if `edge-array`'s `length` exceeds `5000` return `-1` + otherwise, return the new size of the array" + (cond + ((>= (-> obj edge-array length) 5000) + (format #t "mysql-nav-graph : edges buffer too small, increase NAV_GRAPH_EDITOR_EDGE_COUNT~%") + -1 + ) + (else + (let ((v1-5 (the-as mysql-nav-edge (+ (+ (* 80 (-> obj edge-array length)) 12) (the-as int (-> obj edge-array))))) + (v0-1 (-> obj edge-array length)) + ) + (+! (-> obj edge-array length) 1) + (set! (-> v1-5 mysql-save-flag) (mysql-save-flag)) + (logior! (-> v1-5 mysql-save-flag) (mysql-save-flag insert)) + (set! (-> v1-5 runtime-id) (the-as uint v0-1)) + (set! (-> v1-5 nav_graph_id) (-> obj nav_graph_id)) + (set! (-> v1-5 directionality) (nav-directionality default)) + v0-1 + ) + ) + ) + ) + +(defmethod indexof-visnode mysql-nav-graph ((obj mysql-nav-graph) (edge-id int) (node-id int)) + "Returns the index in the `visnode-array` whom's [[mysql-nav-visnode]] has the provided `runtime-edge-id` and `runtime-node-id` + if none exist, return `-1`" + (dotimes (v1-0 (-> obj visnode-array length)) + (let ((a3-2 (-> obj visnode-array data v1-0))) + (if (and (= (-> a3-2 runtime-edge-id) edge-id) (= (-> a3-2 runtime-node-id) node-id)) + (return v1-0) + ) + ) + ) + -1 + ) + +(defmethod alloc-new-visnode! mysql-nav-graph ((obj mysql-nav-graph) (edge-id int) (node-id int)) + "Potentially allocates a new `[[mysql-nav-visnode]]`: + - if `visnode-array`'s `length` exceeds `3000` return `-1` + - otherwise, if the node already exists, TODO + - if the node does not already exist, create it!" + (cond + ((>= (-> obj visnode-array length) 3000) + (format #t "mysql-nav-graph : visnodes buffer too small, increase NAV_GRAPH_EDITOR_VISNODE_COUNT~%") + -1 + ) + (else + (let ((v1-3 (indexof-visnode obj edge-id node-id))) + (when (>= v1-3 0) + (set! (-> (the-as mysql-nav-visnode (+ (the-as uint (-> obj visnode-array)) (* v1-3 32))) nav_visnode_id) + (logand -3 + (-> (the-as mysql-nav-visnode (+ (the-as uint (-> obj visnode-array)) (* v1-3 32))) nav_visnode_id) + ) + ) + (return v1-3) + ) + ) + (let ((v1-9 (-> obj visnode-array data (-> obj visnode-array length))) + (v0-1 (-> obj visnode-array length)) + ) + (+! (-> obj visnode-array length) 1) + (set! (-> v1-9 mysql-save-flag) (mysql-save-flag)) + (logior! (-> v1-9 mysql-save-flag) (mysql-save-flag insert)) + (set! (-> v1-9 runtime-edge-id) edge-id) + (set! (-> v1-9 runtime-node-id) node-id) + (set! (-> v1-9 nav_graph_id) (-> obj nav_graph_id)) + v0-1 + ) + ) + ) + ) + +(defmethod exec-sql! mysql-nav-node ((obj mysql-nav-node)) + "Executes the respective SQL operation specified by `mysql-save-flag`, return value indicates success" + (if (and (logtest? (-> obj mysql-save-flag) (mysql-save-flag insert)) + (logtest? (-> obj mysql-save-flag) (mysql-save-flag delete)) + ) + (return #t) + ) + (if (and (logtest? (-> obj mysql-save-flag) (mysql-save-flag insert)) + (logtest? (-> obj mysql-save-flag) (mysql-save-flag update)) + ) + (logclear! (-> obj mysql-save-flag) (mysql-save-flag update)) + ) + (let ((s5-0 (clear *temp-string*))) + (case (-> obj mysql-save-flag) + (((mysql-save-flag insert)) + (format s5-0 "insert nav_node set ") + ) + (((mysql-save-flag update)) + (format s5-0 "update nav_node set ") + ) + (((mysql-save-flag delete)) + (format s5-0 "delete from nav_node where ") + ) + ) + (case (-> obj mysql-save-flag) + ((8 4) + (format s5-0 "nav_graph_id=~D," (-> obj nav_graph_id)) + (format s5-0 "x=~M," (-> obj position x)) + (format s5-0 "y=~M," (-> obj position y)) + (format s5-0 "z=~M," (-> obj position z)) + (format s5-0 "level_name='~S'," (-> obj level_name)) + (format s5-0 "angle=~R," (-> obj angle)) + (format s5-0 "radius=~M," (-> obj radius)) + (format s5-0 "nav_node_flag='") + (let ((v1-20 #t)) + (when (logtest? (-> obj nav_node_flag) (nav-node-flag visited)) + (if (not v1-20) + (format s5-0 ",") + ) + (format s5-0 "visited") + (set! v1-20 #f) + ) + (when (logtest? (-> obj nav_node_flag) (nav-node-flag blocked)) + (if (not v1-20) + (format s5-0 ",") + ) + (format s5-0 "blocked") + (set! v1-20 #f) + ) + (when (logtest? (-> obj nav_node_flag) (nav-node-flag pedestrian)) + (if (not v1-20) + (format s5-0 ",") + ) + (format s5-0 "pedestrian") + (set! v1-20 #f) + ) + (when (logtest? (-> obj nav_node_flag) (nav-node-flag selected)) + (if (not v1-20) + (format s5-0 ",") + ) + (format s5-0 "selected") + (set! v1-20 #f) + ) + (when (logtest? (-> obj nav_node_flag) (nav-node-flag hidden)) + (if (not v1-20) + (format s5-0 ",") + ) + (format s5-0 "hidden") + ) + ) + (format s5-0 "',") + (format s5-0 "nav_mesh_id=~D" (-> obj nav_mesh_id)) + (if (logtest? (-> obj mysql-save-flag) (mysql-save-flag update)) + (format s5-0 " where nav_node_id=~D" (-> obj nav_node_id)) + ) + (let ((a2-9 (sql-query s5-0))) + (when (!= (-> a2-9 error) 'modify) + (format 0 "ERROR: sql: modify error ~A for ~A~%" a2-9 obj) + (return #f) + ) + ) + (when (logtest? (-> obj mysql-save-flag) (mysql-save-flag insert)) + (let ((v1-40 (sql-query "select LAST_INSERT_ID()"))) + (if (= (-> v1-40 error) 'select) + (set! (-> obj nav_node_id) (the-as uint (string->int (the-as string (-> v1-40 data 0))))) + ) + ) + ) + ) + (((mysql-save-flag delete)) + (format s5-0 "nav_node_id=~D" (-> obj nav_node_id)) + (let ((a2-11 (sql-query s5-0))) + (when (!= (-> a2-11 error) 'modify) + (format 0 "ERROR: sql: modify error ~A for ~A~%" a2-11 obj) + (return #f) + ) + ) + ) + ) + ) + (logclear! (-> obj mysql-save-flag) (mysql-save-flag insert)) + (logclear! (-> obj mysql-save-flag) (mysql-save-flag update)) + #t + ) + +(defmethod exec-sql! mysql-nav-edge ((obj mysql-nav-edge)) + "Executes the respective SQL operation specified by `mysql-save-flag`, return value indicates success" + (if (and (logtest? (-> obj mysql-save-flag) (mysql-save-flag insert)) + (logtest? (-> obj mysql-save-flag) (mysql-save-flag delete)) + ) + (return #t) + ) + (if (and (logtest? (-> obj mysql-save-flag) (mysql-save-flag insert)) + (logtest? (-> obj mysql-save-flag) (mysql-save-flag update)) + ) + (logclear! (-> obj mysql-save-flag) (mysql-save-flag update)) + ) + (let ((s5-0 (clear *temp-string*))) + (case (-> obj mysql-save-flag) + (((mysql-save-flag insert)) + (format s5-0 "insert nav_edge set ") + ) + (((mysql-save-flag update)) + (format s5-0 "update nav_edge set ") + ) + (((mysql-save-flag delete)) + (format s5-0 "delete from nav_edge where ") + ) + ) + (case (-> obj mysql-save-flag) + ((8 4) + (format s5-0 "nav_graph_id=~D," (-> obj nav_graph_id)) + (format s5-0 "nav_node_id_1=~D," (-> obj nav_node_id_1)) + (format s5-0 "nav_node_id_2=~D," (-> obj nav_node_id_2)) + (let ((t9-7 format) + (a0-21 s5-0) + (a1-8 "directionality='~S',") + (v1-20 (-> obj directionality)) + ) + (t9-7 a0-21 a1-8 (cond + ((= v1-20 (nav-directionality directed)) + "directed" + ) + ((= v1-20 (nav-directionality bi_directional)) + "bi_directional" + ) + (else + "default" + ) + ) + ) + ) + (format s5-0 "speed_limit=~M," (-> obj speed_limit)) + (format s5-0 "density=~F," (-> obj density)) + (format s5-0 "traffic_edge_flag='") + (let ((v1-21 #t)) + (when (logtest? (-> obj traffic_edge_flag) 1) + (if (not v1-21) + (format s5-0 ",") + ) + (format s5-0 "pedestrian") + ) + ) + (format s5-0 "',") + (format s5-0 "nav_clock_mask='") + (let ((v1-24 #t)) + (when (logtest? (-> obj nav_clock_mask) (nav-clock-mask phase-1)) + (if (not v1-24) + (format s5-0 ",") + ) + (format s5-0 "phase-1") + (set! v1-24 #f) + ) + (when (logtest? (-> obj nav_clock_mask) (nav-clock-mask phase-1a)) + (if (not v1-24) + (format s5-0 ",") + ) + (format s5-0 "phase-1a") + (set! v1-24 #f) + ) + (when (logtest? (-> obj nav_clock_mask) (nav-clock-mask phase-2)) + (if (not v1-24) + (format s5-0 ",") + ) + (format s5-0 "phase-2") + (set! v1-24 #f) + ) + (when (logtest? (-> obj nav_clock_mask) (nav-clock-mask phase-2a)) + (if (not v1-24) + (format s5-0 ",") + ) + (format s5-0 "phase-2a") + (set! v1-24 #f) + ) + (when (logtest? (-> obj nav_clock_mask) (nav-clock-mask phase-3)) + (if (not v1-24) + (format s5-0 ",") + ) + (format s5-0 "phase-3") + (set! v1-24 #f) + ) + (when (logtest? (-> obj nav_clock_mask) (nav-clock-mask phase-3a)) + (if (not v1-24) + (format s5-0 ",") + ) + (format s5-0 "phase-3a") + (set! v1-24 #f) + ) + (when (logtest? (-> obj nav_clock_mask) (nav-clock-mask phase-4)) + (if (not v1-24) + (format s5-0 ",") + ) + (format s5-0 "phase-4") + (set! v1-24 #f) + ) + (when (logtest? (-> obj nav_clock_mask) (nav-clock-mask phase-4a)) + (if (not v1-24) + (format s5-0 ",") + ) + (format s5-0 "phase-4a") + ) + ) + (format s5-0 "',") + (let ((t9-32 format) + (a0-82 s5-0) + (a1-33 "nav_clock_type='~S',") + (v1-41 (-> obj nav_clock_type)) + ) + (t9-32 a0-82 a1-33 (cond + ((= v1-41 (nav-clock-type clock2)) + "clock2" + ) + ((= v1-41 (nav-clock-type clock3)) + "clock3" + ) + ((= v1-41 (nav-clock-type clock4)) + "clock4" + ) + (else + "no-clock" + ) + ) + ) + ) + (format s5-0 "width=~M," (-> obj width)) + (format s5-0 "minimap_edge_flag='") + (let ((v1-42 #t)) + (when (logtest? (-> obj minimap_edge_flag) (nav-minimap-edge-flag pass-red)) + (if (not v1-42) + (format s5-0 ",") + ) + (format s5-0 "pass-red") + (set! v1-42 #f) + ) + (when (logtest? (-> obj minimap_edge_flag) (nav-minimap-edge-flag pass-green)) + (if (not v1-42) + (format s5-0 ",") + ) + (format s5-0 "pass-green") + (set! v1-42 #f) + ) + (when (logtest? (-> obj minimap_edge_flag) (nav-minimap-edge-flag pass-yellow)) + (if (not v1-42) + (format s5-0 ",") + ) + (format s5-0 "pass-yellow") + (set! v1-42 #f) + ) + (when (logtest? (-> obj minimap_edge_flag) (nav-minimap-edge-flag pass-blue)) + (if (not v1-42) + (format s5-0 ",") + ) + (format s5-0 "pass-blue") + ) + ) + (format s5-0 "'") + (if (logtest? (-> obj mysql-save-flag) (mysql-save-flag update)) + (format s5-0 " where nav_edge_id=~D" (-> obj nav_edge_id)) + ) + (let ((a2-14 (sql-query s5-0))) + (when (!= (-> a2-14 error) 'modify) + (format 0 "ERROR: sql: modify error ~A for ~A~%" a2-14 obj) + (return #f) + ) + ) + (when (logtest? (-> obj mysql-save-flag) (mysql-save-flag insert)) + (let ((v1-60 (sql-query "select LAST_INSERT_ID()"))) + (if (= (-> v1-60 error) 'select) + (set! (-> obj nav_edge_id) (the-as uint (string->int (the-as string (-> v1-60 data 0))))) + ) + ) + ) + ) + (((mysql-save-flag delete)) + (format s5-0 "nav_edge_id=~D" (-> obj nav_edge_id)) + (let ((a2-16 (sql-query s5-0))) + (when (!= (-> a2-16 error) 'modify) + (format 0 "ERROR: sql: modify error ~A for ~A~%" a2-16 obj) + (return #f) + ) + ) + ) + ) + ) + (logclear! (-> obj mysql-save-flag) (mysql-save-flag insert)) + (logclear! (-> obj mysql-save-flag) (mysql-save-flag update)) + #t + ) + +(defmethod exec-sql! mysql-nav-visnode ((obj mysql-nav-visnode)) + "Executes the respective SQL operation specified by `mysql-save-flag`, return value indicates success" + (if (and (logtest? (-> obj mysql-save-flag) (mysql-save-flag insert)) + (logtest? (-> obj mysql-save-flag) (mysql-save-flag delete)) + ) + (return #t) + ) + (if (and (logtest? (-> obj mysql-save-flag) (mysql-save-flag insert)) + (logtest? (-> obj mysql-save-flag) (mysql-save-flag update)) + ) + (logclear! (-> obj mysql-save-flag) (mysql-save-flag update)) + ) + (let ((s5-0 (clear *temp-string*))) + (case (-> obj mysql-save-flag) + (((mysql-save-flag insert)) + (format s5-0 "insert nav_visible_nodes set ") + ) + (((mysql-save-flag update)) + (format s5-0 "update nav_visible_nodes set ") + ) + (((mysql-save-flag delete)) + (format s5-0 "delete from nav_visible_nodes where ") + ) + ) + (case (-> obj mysql-save-flag) + ((8 4) + (format s5-0 "nav_graph_id=~D," (-> obj nav_graph_id)) + (format s5-0 "nav_edge_id=~D," (-> obj nav_edge_id)) + (format s5-0 "nav_node_id=~D" (-> obj nav_node_id)) + (let ((a2-3 (sql-query s5-0))) + (when (!= (-> a2-3 error) 'modify) + (format 0 "ERROR: sql: modify error ~A for ~A~%" a2-3 obj) + (return #f) + ) + ) + ) + (((mysql-save-flag delete)) + (format s5-0 "nav_graph_id=~D and " (-> obj nav_graph_id)) + (format s5-0 "nav_edge_id=~D and " (-> obj nav_edge_id)) + (format s5-0 "nav_node_id=~D" (-> obj nav_node_id)) + (let ((a2-7 (sql-query s5-0))) + (when (!= (-> a2-7 error) 'modify) + (format 0 "ERROR: sql: modify error ~A for ~A~%" a2-7 obj) + (return #f) + ) + ) + ) + ) + ) + (logclear! (-> obj mysql-save-flag) (mysql-save-flag insert)) + (logclear! (-> obj mysql-save-flag) (mysql-save-flag update)) + #t + ) + +(defmethod indexof-nav-node mysql-nav-graph ((obj mysql-nav-graph) (node-id int)) + "Iterate through the `node-array` and return the index for the first [[mysql-nav-node]] whom's `nav_node_id` matches the provided id + returns `-1` if none is found" + (dotimes (v1-0 (-> obj node-array length)) + (if (= node-id (-> (the-as mysql-nav-node (-> obj node-array data v1-0)) nav_node_id)) + (return v1-0) + ) + ) + -1 + ) + +(defmethod indexof-nav-edge mysql-nav-graph ((obj mysql-nav-graph) (edge-id int)) + "Iterate through the `edge-array` and return the index for the first [[mysql-nav-edge]] whom's `nav_edge_id` matches the provided id + returns `-1` if none is found" + (dotimes (v1-0 (-> obj edge-array length)) + (if (= edge-id (-> (the-as mysql-nav-edge (+ (+ (* 80 v1-0) 12) (the-as int (-> obj edge-array)))) nav_edge_id)) + (return v1-0) + ) + ) + -1 + ) + +;; WARN: new jak 2 until loop case, check carefully +;; WARN: new jak 2 until loop case, check carefully +;; WARN: new jak 2 until loop case, check carefully +;; WARN: new jak 2 until loop case, check carefully +;; WARN: new jak 2 until loop case, check carefully +;; WARN: new jak 2 until loop case, check carefully +;; WARN: new jak 2 until loop case, check carefully +(defmethod init-from-sql! mysql-nav-graph ((obj mysql-nav-graph) (arg0 string) (arg1 string)) + "Query the database and initialize the [[mysql-nav-graph]] and all it's related components" + (local-vars (sv-16 string) (sv-32 int) (sv-48 int) (sv-64 int)) + (set! (-> obj node-array length) 0) + (set! (-> obj edge-array length) 0) + (set! (-> obj visnode-array length) 0) + (let ((s3-0 (clear *temp-string*))) + (format s3-0 "select nav_graph_id from nav_graph where name='~S'" arg0) + (let ((a2-2 (sql-query s3-0))) + (when (!= (-> a2-2 error) 'select) + (format 0 "ERROR: sql: select error ~A for ~A~%" a2-2 obj) + (return #f) + ) + (set! (-> obj nav_graph_id) (the-as uint (string->int (the-as string (-> a2-2 data 0))))) + ) + ) + (format #t "Loading nodes ...~%") + (let ((s4-1 0) + (s3-1 256) + ) + (until #f + (let ((s2-0 (clear *temp-string*))) + (format + s2-0 + "select nav_node_id,x,y,z,level_name,angle,radius,nav_node_flag,nav_mesh_id,nav_graph_id from nav_node" + ) + (if arg1 + (format s2-0 " where level_name='~S'" arg1) + ) + (format s2-0 " limit ~D,~D" s4-1 s3-1) + (let ((s2-1 (sql-query s2-0))) + (when (!= (-> s2-1 error) 'select) + (format 0 "ERROR: sql: select error ~A for ~A~%" s2-1 obj) + (return #f) + ) + (let ((s1-0 0)) + (while (< s1-0 (-> s2-1 len)) + (when (= (string->int (the-as string (-> s2-1 data (+ s1-0 9)))) (-> obj nav_graph_id)) + (let ((nav-node (-> obj node-array data (-> obj node-array length)))) + (set! (-> nav-node mysql-save-flag) (mysql-save-flag)) + (set! (-> nav-node runtime-id) (the-as uint (-> obj node-array length))) + (set! (-> nav-node nav_graph_id) (-> obj nav_graph_id)) + (set! (-> nav-node nav_node_id) (the-as uint (string->int (the-as string (-> s2-1 data s1-0))))) + (set! (-> nav-node position x) (* 4096.0 (string->float (the-as string (-> s2-1 data (+ s1-0 1)))))) + (set! (-> nav-node position y) (* 4096.0 (string->float (the-as string (-> s2-1 data (+ s1-0 2)))))) + (set! (-> nav-node position z) (* 4096.0 (string->float (the-as string (-> s2-1 data (+ s1-0 3)))))) + (set! (-> nav-node level_name) (string->symbol (the-as string (-> s2-1 data (+ s1-0 4))))) + (set! (-> nav-node angle) (* 182.04445 (string->float (the-as string (-> s2-1 data (+ s1-0 5)))))) + (set! (-> nav-node radius) (* 4096.0 (string->float (the-as string (-> s2-1 data (+ s1-0 6)))))) + (set! (-> nav-node nav_node_flag) (nav-node-flag)) + (set! sv-16 (new 'global 'string 0 (the-as string (-> s2-1 data (+ s1-0 7))))) + (copy-string<-string sv-16 (the-as string (-> s2-1 data (+ s1-0 7)))) + (until #f + (cond + ((string-prefix= "visited" sv-16) + (logior! (-> nav-node nav_node_flag) (nav-node-flag visited)) + ) + ((string-prefix= "blocked" sv-16) + (logior! (-> nav-node nav_node_flag) (nav-node-flag blocked)) + ) + ((string-prefix= "pedestrian" sv-16) + (logior! (-> nav-node nav_node_flag) (nav-node-flag pedestrian)) + ) + ((string-prefix= "selected" sv-16) + (logior! (-> nav-node nav_node_flag) (nav-node-flag selected)) + ) + ((string-prefix= "hidden" sv-16) + (logior! (-> nav-node nav_node_flag) (nav-node-flag hidden)) + ) + (else + #t + (goto cfg-27) + ) + ) + (let ((a1-16 (string-skip-to-char (-> sv-16 data) (the-as uint 44)))) + (if (= (-> a1-16 0) 44) + (set! a1-16 (&-> a1-16 1)) + ) + (string-suck-up! sv-16 a1-16) + ) + ) + #f + (label cfg-27) + (set! (-> nav-node nav_mesh_id) (the-as uint (string->int (the-as string (-> s2-1 data (+ s1-0 8)))))) + ) + (+! (-> obj node-array length) 1) + ) + (+! s1-0 10) + ) + ) + (when (< (-> s2-1 len) (* 10 s3-1)) + #t + (goto cfg-34) + ) + ) + ) + (+! s4-1 s3-1) + ) + ) + #f + (label cfg-34) + (format #t "~D nodes.~%" (-> obj node-array length)) + (format #t "Loading edges ...~%") + (let ((s5-1 0) + (s4-2 256) + ) + (until #f + (let ((s3-2 (clear *temp-string*))) + (format + s3-2 + "select nav_edge_id,nav_node_id_1,nav_node_id_2,directionality,speed_limit,density,traffic_edge_flag,nav_clock_mask,nav_clock_type,width,minimap_edge_flag,nav_graph_id from nav_edge limit ~D,~D" + s5-1 + s4-2 + ) + (let ((s3-3 (sql-query s3-2))) + (when (!= (-> s3-3 error) 'select) + (format 0 "ERROR: sql: select error ~A for ~A~%" s3-3 obj) + (return #f) + ) + (let ((s2-2 0)) + (while (< s2-2 (-> s3-3 len)) + (when (= (string->int (the-as string (-> s3-3 data (+ s2-2 11)))) (-> obj nav_graph_id)) + (let ((s0-2 (string->int (the-as string (-> s3-3 data (+ s2-2 1)))))) + (set! sv-32 (string->int (the-as string (-> s3-3 data (+ s2-2 2))))) + (set! sv-48 (indexof-nav-node obj s0-2)) + (set! sv-64 (indexof-nav-node obj sv-32)) + (let ((nav-edge + (the-as mysql-nav-edge (+ (+ (* 80 (-> obj edge-array length)) 12) (the-as int (-> obj edge-array)))) + ) + ) + (when (and (!= sv-48 -1) (!= sv-64 -1)) + (set! (-> nav-edge nav_graph_id) (-> obj nav_graph_id)) + (set! (-> nav-edge nav_edge_id) (the-as uint (string->int (the-as string (-> s3-3 data s2-2))))) + (set! (-> nav-edge nav_node_id_1) (the-as uint s0-2)) + (set! (-> nav-edge nav_node_id_2) (the-as uint sv-32)) + (set! (-> nav-edge mysql-save-flag) (mysql-save-flag)) + (set! (-> nav-edge runtime-id) (the-as uint (-> obj edge-array length))) + (set! (-> nav-edge runtime-node-id-1) sv-48) + (set! (-> nav-edge runtime-node-id-2) sv-64) + (let ((s0-3 (-> s3-3 data (+ s2-2 3)))) + (cond + ((string= "default" (the-as string s0-3)) + (set! (-> nav-edge directionality) (nav-directionality default)) + 0 + ) + ((string= "directed" (the-as string s0-3)) + (set! (-> nav-edge directionality) (nav-directionality directed)) + ) + ((string= "bi_directional" (the-as string s0-3)) + (set! (-> nav-edge directionality) (nav-directionality bi_directional)) + ) + ) + ) + (set! (-> nav-edge speed_limit) (* 4096.0 (string->float (the-as string (-> s3-3 data (+ s2-2 4)))))) + (set! (-> nav-edge density) (string->float (the-as string (-> s3-3 data (+ s2-2 5))))) + (set! (-> nav-edge traffic_edge_flag) 0) + (let ((s0-4 (new 'global 'string 0 (the-as string (-> s3-3 data (+ s2-2 6)))))) + (copy-string<-string s0-4 (the-as string (-> s3-3 data (+ s2-2 6)))) + (until #f + (cond + ((string-prefix= "pedestrian" s0-4) + (logior! (-> nav-edge traffic_edge_flag) 1) + ) + (else + #t + (goto cfg-58) + ) + ) + (let ((a1-30 (string-skip-to-char (-> s0-4 data) (the-as uint 44)))) + (if (= (-> a1-30 0) 44) + (set! a1-30 (&-> a1-30 1)) + ) + (string-suck-up! s0-4 a1-30) + ) + ) + ) + #f + (label cfg-58) + (set! (-> nav-edge nav_clock_mask) (nav-clock-mask)) + (let ((s0-5 (new 'global 'string 0 (the-as string (-> s3-3 data (+ s2-2 7)))))) + (copy-string<-string s0-5 (the-as string (-> s3-3 data (+ s2-2 7)))) + (until #f + (cond + ((string-prefix= "phase-1a" s0-5) + (logior! (-> nav-edge nav_clock_mask) (nav-clock-mask phase-1a)) + ) + ((string-prefix= "phase-1" s0-5) + (logior! (-> nav-edge nav_clock_mask) (nav-clock-mask phase-1)) + ) + ((string-prefix= "phase-2a" s0-5) + (logior! (-> nav-edge nav_clock_mask) (nav-clock-mask phase-2a)) + ) + ((string-prefix= "phase-2" s0-5) + (logior! (-> nav-edge nav_clock_mask) (nav-clock-mask phase-2)) + ) + ((string-prefix= "phase-3a" s0-5) + (logior! (-> nav-edge nav_clock_mask) (nav-clock-mask phase-3a)) + ) + ((string-prefix= "phase-3" s0-5) + (logior! (-> nav-edge nav_clock_mask) (nav-clock-mask phase-3)) + ) + ((string-prefix= "phase-4a" s0-5) + (logior! (-> nav-edge nav_clock_mask) (nav-clock-mask phase-4a)) + ) + ((string-prefix= "phase-4" s0-5) + (logior! (-> nav-edge nav_clock_mask) (nav-clock-mask phase-4)) + ) + (else + #t + (goto cfg-80) + ) + ) + (let ((a1-42 (string-skip-to-char (-> s0-5 data) (the-as uint 44)))) + (if (= (-> a1-42 0) 44) + (set! a1-42 (&-> a1-42 1)) + ) + (string-suck-up! s0-5 a1-42) + ) + ) + ) + #f + (label cfg-80) + (let ((s0-6 (-> s3-3 data (+ s2-2 8)))) + (cond + ((string= "no-clock" (the-as string s0-6)) + (set! (-> nav-edge nav_clock_type) (nav-clock-type no-clock)) + 0 + ) + ((string= "clock2" (the-as string s0-6)) + (set! (-> nav-edge nav_clock_type) (nav-clock-type clock2)) + ) + ((string= "clock3" (the-as string s0-6)) + (set! (-> nav-edge nav_clock_type) (nav-clock-type clock3)) + ) + ((string= "clock4" (the-as string s0-6)) + (set! (-> nav-edge nav_clock_type) (nav-clock-type clock4)) + ) + ) + ) + (set! (-> nav-edge width) (* 4096.0 (string->float (the-as string (-> s3-3 data (+ s2-2 9)))))) + (set! (-> nav-edge minimap_edge_flag) (nav-minimap-edge-flag)) + (let ((s0-7 (new 'global 'string 0 (the-as string (-> s3-3 data (+ s2-2 10)))))) + (copy-string<-string s0-7 (the-as string (-> s3-3 data (+ s2-2 10)))) + (until #f + (cond + ((string-prefix= "pass-red" s0-7) + (logior! (-> nav-edge minimap_edge_flag) (nav-minimap-edge-flag pass-red)) + ) + ((string-prefix= "pass-green" s0-7) + (logior! (-> nav-edge minimap_edge_flag) (nav-minimap-edge-flag pass-green)) + ) + ((string-prefix= "pass-yellow" s0-7) + (logior! (-> nav-edge minimap_edge_flag) (nav-minimap-edge-flag pass-yellow)) + ) + ((string-prefix= "pass-blue" s0-7) + (logior! (-> nav-edge minimap_edge_flag) (nav-minimap-edge-flag pass-blue)) + ) + (else + #t + (goto cfg-102) + ) + ) + (let ((a1-54 (string-skip-to-char (-> s0-7 data) (the-as uint 44)))) + (if (= (-> a1-54 0) 44) + (set! a1-54 (&-> a1-54 1)) + ) + (string-suck-up! s0-7 a1-54) + ) + ) + ) + #f + (label cfg-102) + (+! (-> obj edge-array length) 1) + ) + ) + ) + ) + (+! s2-2 12) + ) + ) + (when (< (-> s3-3 len) (* 12 s4-2)) + #t + (goto cfg-109) + ) + ) + ) + (+! s5-1 s4-2) + ) + ) + #f + (label cfg-109) + (format #t "~D edges.~%" (-> obj edge-array length)) + (format #t "Loading visnodes ...~%") + (let ((s5-2 0) + (s4-3 256) + ) + (until #f + (let ((s3-4 (clear *temp-string*))) + (format s3-4 "select nav_edge_id,nav_node_id,nav_graph_id from nav_visible_nodes limit ~D,~D" s5-2 s4-3) + (let ((s3-5 (sql-query s3-4))) + (when (!= (-> s3-5 error) 'select) + (format 0 "ERROR: sql: select error ~A for ~A~%" s3-5 obj) + (return #f) + ) + (let ((s2-3 0)) + (while (< s2-3 (-> s3-5 len)) + (when (= (string->int (the-as string (-> s3-5 data (+ s2-3 2)))) (-> obj nav_graph_id)) + (let ((nav-visnode (-> obj visnode-array data (-> obj visnode-array length)))) + (set! (-> nav-visnode mysql-save-flag) (mysql-save-flag)) + (set! (-> nav-visnode nav_graph_id) (-> obj nav_graph_id)) + (set! (-> nav-visnode nav_edge_id) (the-as uint (string->int (the-as string (-> s3-5 data s2-3))))) + (set! (-> nav-visnode nav_node_id) (the-as uint (string->int (the-as string (-> s3-5 data (+ s2-3 1)))))) + (set! (-> nav-visnode runtime-edge-id) (indexof-nav-edge obj (the-as int (-> nav-visnode nav_edge_id)))) + (set! (-> nav-visnode runtime-node-id) (indexof-nav-node obj (the-as int (-> nav-visnode nav_node_id)))) + ) + (+! (-> obj visnode-array length) 1) + ) + (+! s2-3 3) + ) + ) + (when (< (-> s3-5 len) (* 3 s4-3)) + #t + (goto cfg-122) + ) + ) + ) + (+! s5-2 s4-3) + ) + ) + #f + (label cfg-122) + (format #t "~D visnodes.~%" (-> obj visnode-array length)) + #t + ) + +(defmethod temp-edge-size mysql-nav-node ((obj mysql-nav-node)) + "Returns the number of [[mysql-nav-edge]] stored in the `temp-edge-list`" + (let ((v0-0 0)) + (let ((v1-0 (the-as object (-> obj temp-edge-list)))) + (while v1-0 + (+! v0-0 1) + (set! v1-0 (-> (the-as mysql-nav-edge v1-0) temp-next-edge)) + ) + ) + v0-0 + ) + ) + +;; WARN: Return type mismatch int vs none. +(defmethod mysql-nav-graph-method-17 mysql-nav-graph ((obj mysql-nav-graph)) + (dotimes (v1-0 (-> obj node-array length)) + (set! (-> (the-as mysql-nav-node (-> obj node-array data v1-0)) temp-edge-list) + (the-as (inline-array mysql-nav-edge) #f) + ) + ) + (dotimes (v1-3 (-> obj edge-array length)) + (set! (-> (the-as mysql-nav-edge (+ (+ (* 80 v1-3) 12) (the-as int (-> obj edge-array)))) temp-next-edge) #f) + ) + (countdown (v1-7 (-> obj edge-array length)) + (let ((a1-17 (the-as mysql-nav-edge (+ (+ (* 80 v1-7) 12) (the-as int (-> obj edge-array)))))) + (when (zero? (logand (-> a1-17 mysql-save-flag) (mysql-save-flag delete))) + (let ((a2-8 (-> obj node-array data (-> a1-17 runtime-node-id-1)))) + (when (zero? (logand (-> a2-8 mysql-save-flag) (mysql-save-flag delete))) + (cond + ((-> a2-8 temp-edge-list) + (set! (-> a1-17 temp-next-edge) (the-as mysql-nav-edge (-> a2-8 temp-edge-list))) + (set! (-> a2-8 temp-edge-list) (the-as (inline-array mysql-nav-edge) a1-17)) + ) + (else + (set! (-> a2-8 temp-edge-list) (the-as (inline-array mysql-nav-edge) a1-17)) + ) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; WARN: Return type mismatch int vs none. + +;; WARN: Return type mismatch int vs none. +(defmethod mysql-nav-graph-method-20 mysql-nav-graph ((obj mysql-nav-graph)) + (mysql-nav-graph-method-17 obj) + (mysql-nav-graph-method-19 obj) + 0 + (none) + ) + + +) + + + diff --git a/goal_src/jak2/engine/debug/nav/nav-graph-editor.gc b/goal_src/jak2/engine/debug/nav/nav-graph-editor.gc index fd25ce226a..68231a7190 100644 --- a/goal_src/jak2/engine/debug/nav/nav-graph-editor.gc +++ b/goal_src/jak2/engine/debug/nav/nav-graph-editor.gc @@ -94,7 +94,7 @@ (nav-graph-editor-method-59 () none 59) (nav-graph-editor-method-60 () none 60) (nav-graph-editor-method-61 () none 61) - (nav-graph-editor-method-62 () none 62) + (nav-graph-editor-method-62 (_type_ symbol symbol) none 62) (nav-graph-editor-method-63 () none 63) ) ) diff --git a/scripts/update_decomp_reference.py b/scripts/update_decomp_reference.py index dc6f6f7c6c..b3af43b6ed 100644 --- a/scripts/update_decomp_reference.py +++ b/scripts/update_decomp_reference.py @@ -9,6 +9,8 @@ import shutil ## update reference like this ## python3 ../scripts/update_decomp_reference.py ./failures ../test/decompiler/reference +## TODO - this has a bug and isn't properly game specific + def get_goal_files(root_dir): return [f for file in os.walk(root_dir) for f in glob.glob(os.path.join(file[0], '*.gc'))] diff --git a/test/decompiler/reference/jak1/engine/debug/debug_REF.gc b/test/decompiler/reference/jak1/engine/debug/debug_REF.gc index b6e5acfb9f..3ab7339e88 100644 --- a/test/decompiler/reference/jak1/engine/debug/debug_REF.gc +++ b/test/decompiler/reference/jak1/engine/debug/debug_REF.gc @@ -938,8 +938,8 @@ ;; definition (debug) for function add-debug-circle ;; INFO: Used lq/sq (defun-debug add-debug-circle ((arg0 symbol) (arg1 bucket-id) (arg2 vector) (arg3 float) (arg4 rgba) (arg5 matrix)) - (local-vars (sv-48 int) (sv-64 vector) (sv-80 vector)) "note: you may pass #f for orientation" + (local-vars (sv-48 int) (sv-64 vector) (sv-80 vector)) (if (not arg0) (return #f) ) @@ -1064,8 +1064,8 @@ (arg6 rgba) (arg7 matrix) ) - (local-vars (sv-48 vector) (sv-64 vector) (sv-80 int) (sv-96 vector) (sv-112 vector)) "note: you may pass #f for orientation" + (local-vars (sv-48 vector) (sv-64 vector) (sv-80 int) (sv-96 vector) (sv-112 vector)) (if (not arg0) (return #f) ) diff --git a/test/decompiler/reference/jak2/engine/debug/debug-sphere_REF.gc b/test/decompiler/reference/jak2/engine/debug/debug-sphere_REF.gc index 9282c1f258..d6140611ff 100644 --- a/test/decompiler/reference/jak2/engine/debug/debug-sphere_REF.gc +++ b/test/decompiler/reference/jak2/engine/debug/debug-sphere_REF.gc @@ -98,7 +98,3 @@ (none) ) ) - - - - diff --git a/test/decompiler/reference/jak2/engine/debug/debug_REF.gc b/test/decompiler/reference/jak2/engine/debug/debug_REF.gc index 4e0e2733a8..107318da4d 100644 --- a/test/decompiler/reference/jak2/engine/debug/debug_REF.gc +++ b/test/decompiler/reference/jak2/engine/debug/debug_REF.gc @@ -1236,8 +1236,8 @@ ;; definition (debug) for function add-debug-circle ;; INFO: Used lq/sq (defun-debug add-debug-circle ((enable symbol) (bucket bucket-id) (position vector) (radius float) (color rgba) (orientation matrix)) - (local-vars (i int) (sv-64 vector) (sv-80 vector)) "note: you may pass #f for orientation" + (local-vars (i int) (sv-64 vector) (sv-80 vector)) (if (not enable) (return #f) ) @@ -1390,8 +1390,8 @@ (color rgba) (orientation matrix) ) - (local-vars (line-start vector) (line-end vector) (i int) (sv-96 vector) (sv-112 vector)) "note: you may pass #f for orientation" + (local-vars (line-start vector) (line-end vector) (i int) (sv-96 vector) (sv-112 vector)) (if (not enable) (return #f) ) diff --git a/test/decompiler/reference/jak2/engine/debug/default-menu_REF.gc b/test/decompiler/reference/jak2/engine/debug/default-menu_REF.gc index 939348e189..6cd3ea5edc 100644 --- a/test/decompiler/reference/jak2/engine/debug/default-menu_REF.gc +++ b/test/decompiler/reference/jak2/engine/debug/default-menu_REF.gc @@ -2782,6 +2782,7 @@ ;; definition for function debug-menu-make-task-sub-menu ;; INFO: Used lq/sq (defun debug-menu-make-task-sub-menu ((arg0 symbol)) + "TODO - need to know more about game-info" (local-vars (sv-16 (function symbol type object object pair)) (sv-32 symbol) @@ -2796,7 +2797,6 @@ (sv-176 type) (sv-192 int) ) - "TODO - need to know more about game-info" (let ((gp-0 '())) (let ((s4-0 (-> *game-info* sub-task-list))) (countdown (s3-0 (-> s4-0 length)) @@ -4258,76 +4258,54 @@ "Load" (function "Hover Drillmid" #f (lambda () (let ((a0-0 (get-nav-graph-editor))) - (when a0-0 - (let ((t9-1 (method-of-object a0-0 nav-graph-editor-method-62))) - 'hover - 'drillmid - (t9-1) + (if a0-0 + (nav-graph-editor-method-62 a0-0 'hover 'drillmid) ) - ) ) (none) ) ) (function "Hover Forresca" #f (lambda () (let ((a0-0 (get-nav-graph-editor))) - (when a0-0 - (let ((t9-1 (method-of-object a0-0 nav-graph-editor-method-62))) - 'hover - 'forresca - (t9-1) + (if a0-0 + (nav-graph-editor-method-62 a0-0 'hover 'forresca) ) - ) ) (none) ) ) (function "Hover Forest" #f (lambda () (let ((a0-0 (get-nav-graph-editor))) - (when a0-0 - (let ((t9-1 (method-of-object a0-0 nav-graph-editor-method-62))) - 'hover - 'forest - (t9-1) + (if a0-0 + (nav-graph-editor-method-62 a0-0 'hover 'forest) ) - ) ) (none) ) ) (function "Hover Under" #f (lambda () (let ((a0-0 (get-nav-graph-editor))) - (when a0-0 - (let ((t9-1 (method-of-object a0-0 nav-graph-editor-method-62))) - 'hover - 'under - (t9-1) + (if a0-0 + (nav-graph-editor-method-62 a0-0 'hover 'under) ) - ) ) (none) ) ) (function "Traffic" #f (lambda () (let ((a0-0 (get-nav-graph-editor))) - (when a0-0 - (let ((t9-1 (method-of-object a0-0 nav-graph-editor-method-62))) - 'traffic - (t9-1) + (if a0-0 + (nav-graph-editor-method-62 a0-0 'traffic #f) ) - ) ) (none) ) ) (function "Minimap" #f (lambda () (let ((a0-0 (get-nav-graph-editor))) - (when a0-0 - (let ((t9-1 (method-of-object a0-0 nav-graph-editor-method-62))) - 'minimap - (t9-1) + (if a0-0 + (nav-graph-editor-method-62 a0-0 'minimap #f) ) - ) ) (none) ) diff --git a/test/decompiler/reference/jak2/engine/debug/editable_REF.gc b/test/decompiler/reference/jak2/engine/debug/editable_REF.gc index c6cb0e5f5f..78776a97e7 100644 --- a/test/decompiler/reference/jak2/engine/debug/editable_REF.gc +++ b/test/decompiler/reference/jak2/engine/debug/editable_REF.gc @@ -1206,6 +1206,7 @@ ;; WARN: Return type mismatch number vs float. (defmethod edit-get-distance editable-face ((a0-0 editable-face) (a1-0 vector)) + "Returns the distance from the camera to the [[editable]], or -1.0" (local-vars (v0-0 vector) (v0-1 vector) @@ -1275,7 +1276,6 @@ (f0-0 float) (f1-0 float) ) - "Returns the distance from the camera to the [[editable]], or -1.0" (when (begin (set! gp-0 (new 'stack-no-clear 'vector)) (set! a0-1 a0-0) @@ -1944,6 +1944,7 @@ ;; ERROR: failed type prop at 64: add failed: structure (defmethod edit-get-distance editable-plane ((a0-0 editable-plane) (a1-0 vector)) + "Returns the distance from the camera to the [[editable]], or -1.0" (local-vars (v0-0 vector) (v0-1 vector) @@ -2019,7 +2020,6 @@ (f0-0 float) (f1-0 float) ) - "Returns the distance from the camera to the [[editable]], or -1.0" (when (begin (set! gp-0 (new 'stack-no-clear 'vector)) (set! a0-1 a0-0) diff --git a/test/decompiler/reference/jak2/engine/debug/nav/mysql-nav-graph_REF.gc b/test/decompiler/reference/jak2/engine/debug/nav/mysql-nav-graph_REF.gc new file mode 100644 index 0000000000..ef0b0cbbed --- /dev/null +++ b/test/decompiler/reference/jak2/engine/debug/nav/mysql-nav-graph_REF.gc @@ -0,0 +1,1309 @@ +;;-*-Lisp-*- +(in-package goal) + +;; this file is debug only +(declare-file (debug)) +(when *debug-segment* +;; definition of type mysql-nav-node +(deftype mysql-nav-node (structure) + ((mysql-save-flag mysql-save-flag :offset-assert 0) + (runtime-id uint32 :offset-assert 4) + (temp-edge-list (inline-array mysql-nav-edge) :offset-assert 8) + (level-node-index int32 :offset-assert 12) + (cam-dist float :offset-assert 16) + (visible basic :offset-assert 20) + (nav_node_id uint32 :offset-assert 24) + (nav_graph_id uint32 :offset-assert 28) + (position vector :inline :offset-assert 32) + (level_name symbol :offset-assert 48) + (angle float :offset-assert 52) + (radius float :offset-assert 56) + (nav_node_flag nav-node-flag :offset-assert 60) + (nav_mesh_id uint32 :offset-assert 64) + ) + :pack-me + :method-count-assert 11 + :size-assert #x44 + :flag-assert #xb00000044 + (:methods + (exec-sql! (_type_) symbol 9) + (temp-edge-size (_type_) int 10) + ) + ) + +;; definition for method 3 of type mysql-nav-node +(defmethod inspect mysql-nav-node ((obj mysql-nav-node)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'mysql-nav-node) + (format #t "~1Tmysql-save-flag: ~D~%" (-> obj mysql-save-flag)) + (format #t "~1Truntime-id: ~D~%" (-> obj runtime-id)) + (format #t "~1Ttemp-edge-list: ~A~%" (-> obj temp-edge-list)) + (format #t "~1Tlevel-node-index: ~D~%" (-> obj level-node-index)) + (format #t "~1Tcam-dist: ~f~%" (-> obj cam-dist)) + (format #t "~1Tvisible: ~A~%" (-> obj visible)) + (format #t "~1Tnav_node_id: ~D~%" (-> obj nav_node_id)) + (format #t "~1Tnav_graph_id: ~D~%" (-> obj nav_graph_id)) + (format #t "~1Tposition: #~%" (-> obj position)) + (format #t "~1Tlevel_name: ~A~%" (-> obj level_name)) + (format #t "~1Tangle: ~f~%" (-> obj angle)) + (format #t "~1Tradius: ~f~%" (-> obj radius)) + (format #t "~1Tnav_node_flag: ~D~%" (-> obj nav_node_flag)) + (format #t "~1Tnav_mesh_id: ~D~%" (-> obj nav_mesh_id)) + (label cfg-4) + obj + ) + +;; definition of type mysql-nav-node-array +(deftype mysql-nav-node-array (inline-array-class) + ((data mysql-nav-node :inline :dynamic :offset-assert 16) + ) + :method-count-assert 9 + :size-assert #x10 + :flag-assert #x900000010 + ) + +;; definition for method 3 of type mysql-nav-node-array +(defmethod inspect mysql-nav-node-array ((obj mysql-nav-node-array)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~1Tlength: ~D~%" (-> obj length)) + (format #t "~1Tallocated-length: ~D~%" (-> obj allocated-length)) + (format #t "~1Tdata[0] @ #x~X~%" (-> obj data)) + (label cfg-4) + obj + ) + +;; failed to figure out what this is: +(set! (-> mysql-nav-node-array heap-base) (the-as uint 80)) + +;; definition of type mysql-nav-edge +(deftype mysql-nav-edge (structure) + ((mysql-save-flag mysql-save-flag :offset-assert 0) + (runtime-id uint32 :offset-assert 4) + (runtime-node-id-1 int32 :offset-assert 8) + (runtime-node-id-2 int32 :offset-assert 12) + (temp-next-edge mysql-nav-edge :offset-assert 16) + (nav_edge_id uint32 :offset-assert 20) + (nav_graph_id uint32 :offset-assert 24) + (nav_node_id_1 uint32 :offset-assert 28) + (nav_node_id_2 uint32 :offset-assert 32) + (directionality nav-directionality :offset-assert 36) + (speed_limit float :offset-assert 40) + (density float :offset-assert 44) + (traffic_edge_flag int32 :offset-assert 48) + (nav_clock_mask nav-clock-mask :offset-assert 52) + (nav_clock_type nav-clock-type :offset-assert 56) + (width float :offset-assert 60) + (minimap_edge_flag nav-minimap-edge-flag :offset-assert 64) + ) + :pack-me + :method-count-assert 10 + :size-assert #x44 + :flag-assert #xa00000044 + (:methods + (exec-sql! (_type_) symbol 9) + ) + ) + +;; definition for method 3 of type mysql-nav-edge +(defmethod inspect mysql-nav-edge ((obj mysql-nav-edge)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'mysql-nav-edge) + (format #t "~1Tmysql-save-flag: ~D~%" (-> obj mysql-save-flag)) + (format #t "~1Truntime-id: ~D~%" (-> obj runtime-id)) + (format #t "~1Truntime-node-id-1: ~D~%" (-> obj runtime-node-id-1)) + (format #t "~1Truntime-node-id-2: ~D~%" (-> obj runtime-node-id-2)) + (format #t "~1Ttemp-next-edge: #~%" (-> obj temp-next-edge)) + (format #t "~1Tnav_edge_id: ~D~%" (-> obj nav_edge_id)) + (format #t "~1Tnav_graph_id: ~D~%" (-> obj nav_graph_id)) + (format #t "~1Tnav_node_id_1: ~D~%" (-> obj nav_node_id_1)) + (format #t "~1Tnav_node_id_2: ~D~%" (-> obj nav_node_id_2)) + (format #t "~1Tdirectionality: ~D~%" (-> obj directionality)) + (format #t "~1Tspeed_limit: ~f~%" (-> obj speed_limit)) + (format #t "~1Tdensity: ~f~%" (-> obj density)) + (format #t "~1Ttraffic_edge_flag: ~D~%" (-> obj traffic_edge_flag)) + (format #t "~1Tnav_clock_mask: ~D~%" (-> obj nav_clock_mask)) + (format #t "~1Tnav_clock_type: ~D~%" (-> obj nav_clock_type)) + (format #t "~1Twidth: ~f~%" (-> obj width)) + (format #t "~1Tminimap_edge_flag: ~D~%" (-> obj minimap_edge_flag)) + (label cfg-4) + obj + ) + +;; definition of type mysql-nav-edge-array +(deftype mysql-nav-edge-array (inline-array-class) + ((data mysql-nav-edge :inline :dynamic :offset-assert 16) + ) + :method-count-assert 9 + :size-assert #x10 + :flag-assert #x900000010 + ) + +;; definition for method 3 of type mysql-nav-edge-array +(defmethod inspect mysql-nav-edge-array ((obj mysql-nav-edge-array)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~1Tlength: ~D~%" (-> obj length)) + (format #t "~1Tallocated-length: ~D~%" (-> obj allocated-length)) + (format #t "~1Tdata[0] @ #x~X~%" (-> obj data)) + (label cfg-4) + obj + ) + +;; failed to figure out what this is: +(set! (-> mysql-nav-edge-array heap-base) (the-as uint 80)) + +;; definition of type mysql-nav-visnode +(deftype mysql-nav-visnode (structure) + ((mysql-save-flag mysql-save-flag :offset-assert 0) + (runtime-node-id int32 :offset-assert 4) + (runtime-edge-id int32 :offset-assert 8) + (nav_visnode_id uint32 :offset-assert 12) + (nav_graph_id uint32 :offset-assert 16) + (nav_node_id uint32 :offset-assert 20) + (nav_edge_id uint32 :offset-assert 24) + ) + :method-count-assert 10 + :size-assert #x1c + :flag-assert #xa0000001c + (:methods + (exec-sql! (_type_) symbol 9) + ) + ) + +;; definition for method 3 of type mysql-nav-visnode +(defmethod inspect mysql-nav-visnode ((obj mysql-nav-visnode)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'mysql-nav-visnode) + (format #t "~1Tmysql-save-flag: ~D~%" (-> obj mysql-save-flag)) + (format #t "~1Truntime-node-id: ~D~%" (-> obj runtime-node-id)) + (format #t "~1Truntime-edge-id: ~D~%" (-> obj runtime-edge-id)) + (format #t "~1Tnav_visnode_id: ~D~%" (-> obj nav_visnode_id)) + (format #t "~1Tnav_graph_id: ~D~%" (-> obj nav_graph_id)) + (format #t "~1Tnav_node_id: ~D~%" (-> obj nav_node_id)) + (format #t "~1Tnav_edge_id: ~D~%" (-> obj nav_edge_id)) + (label cfg-4) + obj + ) + +;; definition of type mysql-nav-visnode-array +(deftype mysql-nav-visnode-array (inline-array-class) + ((data mysql-nav-visnode :inline :dynamic :offset-assert 16) + ) + :method-count-assert 9 + :size-assert #x10 + :flag-assert #x900000010 + ) + +;; definition for method 3 of type mysql-nav-visnode-array +(defmethod inspect mysql-nav-visnode-array ((obj mysql-nav-visnode-array)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~1Tlength: ~D~%" (-> obj length)) + (format #t "~1Tallocated-length: ~D~%" (-> obj allocated-length)) + (format #t "~1Tdata[0] @ #x~X~%" (-> obj data)) + (label cfg-4) + obj + ) + +;; failed to figure out what this is: +(set! (-> mysql-nav-visnode-array heap-base) (the-as uint 32)) + +;; definition of type mysql-nav-graph-level-info +(deftype mysql-nav-graph-level-info (structure) + ((level basic :offset-assert 0) + (level-id uint32 :offset-assert 4) + (node-count int32 :offset-assert 8) + (branch-count int32 :offset-assert 12) + (to-link-count int32 :offset-assert 16) + ) + :allow-misaligned + :method-count-assert 9 + :size-assert #x14 + :flag-assert #x900000014 + ) + +;; definition for method 3 of type mysql-nav-graph-level-info +(defmethod inspect mysql-nav-graph-level-info ((obj mysql-nav-graph-level-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'mysql-nav-graph-level-info) + (format #t "~1Tlevel: ~A~%" (-> obj level)) + (format #t "~1Tlevel-id: ~D~%" (-> obj level-id)) + (format #t "~1Tnode-count: ~D~%" (-> obj node-count)) + (format #t "~1Tbranch-count: ~D~%" (-> obj branch-count)) + (format #t "~1Tto-link-count: ~D~%" (-> obj to-link-count)) + (label cfg-4) + obj + ) + +;; definition of type mysql-nav-graph +(deftype mysql-nav-graph (basic) + ((nav_graph_id uint32 :offset-assert 4) + (node-array mysql-nav-node-array :offset-assert 8) + (edge-array mysql-nav-edge-array :offset-assert 12) + (visnode-array mysql-nav-visnode-array :offset-assert 16) + (level-info-array-length int32 :offset-assert 20) + (level-info-last-lookup int32 :offset-assert 24) + (level-info-array mysql-nav-graph-level-info 32 :inline :offset-assert 28) + ) + :method-count-assert 21 + :size-assert #x41c + :flag-assert #x150000041c + (:methods + (new (symbol type int string) _type_ 0) + (init-from-sql! (_type_ string string) symbol 9) + (exec-sql! (_type_) symbol 10) + (indexof-nav-node (_type_ int) int 11) + (indexof-nav-edge (_type_ int) int 12) + (alloc-new-node! (_type_) int 13) + (alloc-new-edge! (_type_) int 14) + (indexof-visnode (_type_ int int) int 15) + (alloc-new-visnode! (_type_ int int) int 16) + (mysql-nav-graph-method-17 (_type_) none 17) + (lookup-level-info2 (_type_ mysql-nav-node symbol) mysql-nav-graph-level-info 18) + (mysql-nav-graph-method-19 (_type_) none 19) + (mysql-nav-graph-method-20 (_type_) none 20) + ) + ) + +;; definition for method 3 of type mysql-nav-graph +(defmethod inspect mysql-nav-graph ((obj mysql-nav-graph)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~1Tnav_graph_id: ~D~%" (-> obj nav_graph_id)) + (format #t "~1Tnode-array: ~A~%" (-> obj node-array)) + (format #t "~1Tedge-array: ~A~%" (-> obj edge-array)) + (format #t "~1Tvisnode-array: ~A~%" (-> obj visnode-array)) + (format #t "~1Tlevel-info-array-length: ~D~%" (-> obj level-info-array-length)) + (format #t "~1Tlevel-info-last-lookup: ~D~%" (-> obj level-info-last-lookup)) + (format #t "~1Tlevel-info-array[32] @ #x~X~%" (-> obj level-info-array)) + (label cfg-4) + obj + ) + +;; definition for method 0 of type mysql-nav-graph +;; WARN: Return type mismatch object vs mysql-nav-graph. +(defmethod new mysql-nav-graph ((allocation symbol) (type-to-make type) (arg0 int) (arg1 string)) + (let ((gp-0 (object-new allocation type-to-make (the-as int (-> type-to-make size))))) + (if (zero? gp-0) + (return (the-as mysql-nav-graph 0)) + ) + (set! (-> gp-0 node-array) (new 'debug 'mysql-nav-node-array 3000)) + (set! (-> gp-0 node-array length) 0) + (set! (-> gp-0 edge-array) (new 'debug 'mysql-nav-edge-array 5000)) + (set! (-> gp-0 edge-array length) 0) + (set! (-> gp-0 visnode-array) (new 'debug 'mysql-nav-visnode-array 3000)) + (set! (-> gp-0 visnode-array length) 0) + (let ((s4-0 (clear *temp-string*))) + (format *temp-string* "select nav_graph_id from nav_graph where name='~S'" arg0) + (let ((a2-6 (sql-query s4-0))) + (when (!= (-> a2-6 error) 'select) + (format 0 "ERROR: sql: select error ~A for ~A~%" a2-6 gp-0) + (return (the-as mysql-nav-graph #f)) + ) + (set! (-> gp-0 nav_graph_id) (the-as uint (string->int (the-as string (-> a2-6 data 0))))) + ) + ) + gp-0 + ) + ) + +;; definition for method 13 of type mysql-nav-graph +(defmethod alloc-new-node! mysql-nav-graph ((obj mysql-nav-graph)) + "Allocates a new `[[mysql-nav-node]]`, if `node-array`'s `length` exceeds `3000` return `-1` + otherwise, return the new size of the array" + (cond + ((>= (-> obj node-array length) 3000) + (format #t "mysql-nav-graph : nodes buffer too small, increase NAV_GRAPH_EDITOR_NODE_COUNT~%") + -1 + ) + (else + (let ((gp-0 (-> obj node-array data (-> obj node-array length))) + (s5-0 (-> obj node-array length)) + ) + (+! (-> obj node-array length) 1) + (set! (-> gp-0 mysql-save-flag) (mysql-save-flag)) + (logior! (-> gp-0 mysql-save-flag) (mysql-save-flag insert)) + (set! (-> gp-0 runtime-id) (the-as uint s5-0)) + (set! (-> gp-0 nav_graph_id) (-> obj nav_graph_id)) + (set! (-> gp-0 level_name) (-> (level-get-target-inside *level*) name)) + s5-0 + ) + ) + ) + ) + +;; definition for method 14 of type mysql-nav-graph +(defmethod alloc-new-edge! mysql-nav-graph ((obj mysql-nav-graph)) + "Allocates a new `[[mysql-nav-edge]]`, if `edge-array`'s `length` exceeds `5000` return `-1` + otherwise, return the new size of the array" + (cond + ((>= (-> obj edge-array length) 5000) + (format #t "mysql-nav-graph : edges buffer too small, increase NAV_GRAPH_EDITOR_EDGE_COUNT~%") + -1 + ) + (else + (let ((v1-5 (the-as mysql-nav-edge (+ (+ (* 80 (-> obj edge-array length)) 12) (the-as int (-> obj edge-array))))) + (v0-1 (-> obj edge-array length)) + ) + (+! (-> obj edge-array length) 1) + (set! (-> v1-5 mysql-save-flag) (mysql-save-flag)) + (logior! (-> v1-5 mysql-save-flag) (mysql-save-flag insert)) + (set! (-> v1-5 runtime-id) (the-as uint v0-1)) + (set! (-> v1-5 nav_graph_id) (-> obj nav_graph_id)) + (set! (-> v1-5 directionality) (nav-directionality default)) + v0-1 + ) + ) + ) + ) + +;; definition for method 15 of type mysql-nav-graph +(defmethod indexof-visnode mysql-nav-graph ((obj mysql-nav-graph) (edge-id int) (node-id int)) + "Returns the index in the `visnode-array` whom's [[mysql-nav-visnode]] has the provided `runtime-edge-id` and `runtime-node-id` + if none exist, return `-1`" + (dotimes (v1-0 (-> obj visnode-array length)) + (let ((a3-2 (-> obj visnode-array data v1-0))) + (if (and (= (-> a3-2 runtime-edge-id) edge-id) (= (-> a3-2 runtime-node-id) node-id)) + (return v1-0) + ) + ) + ) + -1 + ) + +;; definition for method 16 of type mysql-nav-graph +(defmethod alloc-new-visnode! mysql-nav-graph ((obj mysql-nav-graph) (edge-id int) (node-id int)) + "Potentially allocates a new `[[mysql-nav-visnode]]`: + - if `visnode-array`'s `length` exceeds `3000` return `-1` + - otherwise, if the node already exists, TODO + - if the node does not already exist, create it!" + (cond + ((>= (-> obj visnode-array length) 3000) + (format #t "mysql-nav-graph : visnodes buffer too small, increase NAV_GRAPH_EDITOR_VISNODE_COUNT~%") + -1 + ) + (else + (let ((v1-3 (indexof-visnode obj edge-id node-id))) + (when (>= v1-3 0) + (set! (-> (the-as mysql-nav-visnode (+ (the-as uint (-> obj visnode-array)) (* v1-3 32))) nav_visnode_id) + (logand -3 + (-> (the-as mysql-nav-visnode (+ (the-as uint (-> obj visnode-array)) (* v1-3 32))) nav_visnode_id) + ) + ) + (return v1-3) + ) + ) + (let ((v1-9 (-> obj visnode-array data (-> obj visnode-array length))) + (v0-1 (-> obj visnode-array length)) + ) + (+! (-> obj visnode-array length) 1) + (set! (-> v1-9 mysql-save-flag) (mysql-save-flag)) + (logior! (-> v1-9 mysql-save-flag) (mysql-save-flag insert)) + (set! (-> v1-9 runtime-edge-id) edge-id) + (set! (-> v1-9 runtime-node-id) node-id) + (set! (-> v1-9 nav_graph_id) (-> obj nav_graph_id)) + v0-1 + ) + ) + ) + ) + +;; definition for method 9 of type mysql-nav-node +(defmethod exec-sql! mysql-nav-node ((obj mysql-nav-node)) + "Executes the respective SQL operation specified by `mysql-save-flag`, return value indicates success" + (if (and (logtest? (-> obj mysql-save-flag) (mysql-save-flag insert)) + (logtest? (-> obj mysql-save-flag) (mysql-save-flag delete)) + ) + (return #t) + ) + (if (and (logtest? (-> obj mysql-save-flag) (mysql-save-flag insert)) + (logtest? (-> obj mysql-save-flag) (mysql-save-flag update)) + ) + (logclear! (-> obj mysql-save-flag) (mysql-save-flag update)) + ) + (let ((s5-0 (clear *temp-string*))) + (case (-> obj mysql-save-flag) + (((mysql-save-flag insert)) + (format s5-0 "insert nav_node set ") + ) + (((mysql-save-flag update)) + (format s5-0 "update nav_node set ") + ) + (((mysql-save-flag delete)) + (format s5-0 "delete from nav_node where ") + ) + ) + (case (-> obj mysql-save-flag) + ((8 4) + (format s5-0 "nav_graph_id=~D," (-> obj nav_graph_id)) + (format s5-0 "x=~M," (-> obj position x)) + (format s5-0 "y=~M," (-> obj position y)) + (format s5-0 "z=~M," (-> obj position z)) + (format s5-0 "level_name='~S'," (-> obj level_name)) + (format s5-0 "angle=~R," (-> obj angle)) + (format s5-0 "radius=~M," (-> obj radius)) + (format s5-0 "nav_node_flag='") + (let ((v1-20 #t)) + (when (logtest? (-> obj nav_node_flag) (nav-node-flag visited)) + (if (not v1-20) + (format s5-0 ",") + ) + (format s5-0 "visited") + (set! v1-20 #f) + ) + (when (logtest? (-> obj nav_node_flag) (nav-node-flag blocked)) + (if (not v1-20) + (format s5-0 ",") + ) + (format s5-0 "blocked") + (set! v1-20 #f) + ) + (when (logtest? (-> obj nav_node_flag) (nav-node-flag pedestrian)) + (if (not v1-20) + (format s5-0 ",") + ) + (format s5-0 "pedestrian") + (set! v1-20 #f) + ) + (when (logtest? (-> obj nav_node_flag) (nav-node-flag selected)) + (if (not v1-20) + (format s5-0 ",") + ) + (format s5-0 "selected") + (set! v1-20 #f) + ) + (when (logtest? (-> obj nav_node_flag) (nav-node-flag hidden)) + (if (not v1-20) + (format s5-0 ",") + ) + (format s5-0 "hidden") + ) + ) + (format s5-0 "',") + (format s5-0 "nav_mesh_id=~D" (-> obj nav_mesh_id)) + (if (logtest? (-> obj mysql-save-flag) (mysql-save-flag update)) + (format s5-0 " where nav_node_id=~D" (-> obj nav_node_id)) + ) + (let ((a2-9 (sql-query s5-0))) + (when (!= (-> a2-9 error) 'modify) + (format 0 "ERROR: sql: modify error ~A for ~A~%" a2-9 obj) + (return #f) + ) + ) + (when (logtest? (-> obj mysql-save-flag) (mysql-save-flag insert)) + (let ((v1-40 (sql-query "select LAST_INSERT_ID()"))) + (if (= (-> v1-40 error) 'select) + (set! (-> obj nav_node_id) (the-as uint (string->int (the-as string (-> v1-40 data 0))))) + ) + ) + ) + ) + (((mysql-save-flag delete)) + (format s5-0 "nav_node_id=~D" (-> obj nav_node_id)) + (let ((a2-11 (sql-query s5-0))) + (when (!= (-> a2-11 error) 'modify) + (format 0 "ERROR: sql: modify error ~A for ~A~%" a2-11 obj) + (return #f) + ) + ) + ) + ) + ) + (logclear! (-> obj mysql-save-flag) (mysql-save-flag insert)) + (logclear! (-> obj mysql-save-flag) (mysql-save-flag update)) + #t + ) + +;; definition for method 9 of type mysql-nav-edge +(defmethod exec-sql! mysql-nav-edge ((obj mysql-nav-edge)) + "Executes the respective SQL operation specified by `mysql-save-flag`, return value indicates success" + (if (and (logtest? (-> obj mysql-save-flag) (mysql-save-flag insert)) + (logtest? (-> obj mysql-save-flag) (mysql-save-flag delete)) + ) + (return #t) + ) + (if (and (logtest? (-> obj mysql-save-flag) (mysql-save-flag insert)) + (logtest? (-> obj mysql-save-flag) (mysql-save-flag update)) + ) + (logclear! (-> obj mysql-save-flag) (mysql-save-flag update)) + ) + (let ((s5-0 (clear *temp-string*))) + (case (-> obj mysql-save-flag) + (((mysql-save-flag insert)) + (format s5-0 "insert nav_edge set ") + ) + (((mysql-save-flag update)) + (format s5-0 "update nav_edge set ") + ) + (((mysql-save-flag delete)) + (format s5-0 "delete from nav_edge where ") + ) + ) + (case (-> obj mysql-save-flag) + ((8 4) + (format s5-0 "nav_graph_id=~D," (-> obj nav_graph_id)) + (format s5-0 "nav_node_id_1=~D," (-> obj nav_node_id_1)) + (format s5-0 "nav_node_id_2=~D," (-> obj nav_node_id_2)) + (let ((t9-7 format) + (a0-21 s5-0) + (a1-8 "directionality='~S',") + (v1-20 (-> obj directionality)) + ) + (t9-7 a0-21 a1-8 (cond + ((= v1-20 (nav-directionality directed)) + "directed" + ) + ((= v1-20 (nav-directionality bi_directional)) + "bi_directional" + ) + (else + "default" + ) + ) + ) + ) + (format s5-0 "speed_limit=~M," (-> obj speed_limit)) + (format s5-0 "density=~F," (-> obj density)) + (format s5-0 "traffic_edge_flag='") + (let ((v1-21 #t)) + (when (logtest? (-> obj traffic_edge_flag) 1) + (if (not v1-21) + (format s5-0 ",") + ) + (format s5-0 "pedestrian") + ) + ) + (format s5-0 "',") + (format s5-0 "nav_clock_mask='") + (let ((v1-24 #t)) + (when (logtest? (-> obj nav_clock_mask) (nav-clock-mask phase-1)) + (if (not v1-24) + (format s5-0 ",") + ) + (format s5-0 "phase-1") + (set! v1-24 #f) + ) + (when (logtest? (-> obj nav_clock_mask) (nav-clock-mask phase-1a)) + (if (not v1-24) + (format s5-0 ",") + ) + (format s5-0 "phase-1a") + (set! v1-24 #f) + ) + (when (logtest? (-> obj nav_clock_mask) (nav-clock-mask phase-2)) + (if (not v1-24) + (format s5-0 ",") + ) + (format s5-0 "phase-2") + (set! v1-24 #f) + ) + (when (logtest? (-> obj nav_clock_mask) (nav-clock-mask phase-2a)) + (if (not v1-24) + (format s5-0 ",") + ) + (format s5-0 "phase-2a") + (set! v1-24 #f) + ) + (when (logtest? (-> obj nav_clock_mask) (nav-clock-mask phase-3)) + (if (not v1-24) + (format s5-0 ",") + ) + (format s5-0 "phase-3") + (set! v1-24 #f) + ) + (when (logtest? (-> obj nav_clock_mask) (nav-clock-mask phase-3a)) + (if (not v1-24) + (format s5-0 ",") + ) + (format s5-0 "phase-3a") + (set! v1-24 #f) + ) + (when (logtest? (-> obj nav_clock_mask) (nav-clock-mask phase-4)) + (if (not v1-24) + (format s5-0 ",") + ) + (format s5-0 "phase-4") + (set! v1-24 #f) + ) + (when (logtest? (-> obj nav_clock_mask) (nav-clock-mask phase-4a)) + (if (not v1-24) + (format s5-0 ",") + ) + (format s5-0 "phase-4a") + ) + ) + (format s5-0 "',") + (let ((t9-32 format) + (a0-82 s5-0) + (a1-33 "nav_clock_type='~S',") + (v1-41 (-> obj nav_clock_type)) + ) + (t9-32 a0-82 a1-33 (cond + ((= v1-41 (nav-clock-type clock2)) + "clock2" + ) + ((= v1-41 (nav-clock-type clock3)) + "clock3" + ) + ((= v1-41 (nav-clock-type clock4)) + "clock4" + ) + (else + "no-clock" + ) + ) + ) + ) + (format s5-0 "width=~M," (-> obj width)) + (format s5-0 "minimap_edge_flag='") + (let ((v1-42 #t)) + (when (logtest? (-> obj minimap_edge_flag) (nav-minimap-edge-flag pass-red)) + (if (not v1-42) + (format s5-0 ",") + ) + (format s5-0 "pass-red") + (set! v1-42 #f) + ) + (when (logtest? (-> obj minimap_edge_flag) (nav-minimap-edge-flag pass-green)) + (if (not v1-42) + (format s5-0 ",") + ) + (format s5-0 "pass-green") + (set! v1-42 #f) + ) + (when (logtest? (-> obj minimap_edge_flag) (nav-minimap-edge-flag pass-yellow)) + (if (not v1-42) + (format s5-0 ",") + ) + (format s5-0 "pass-yellow") + (set! v1-42 #f) + ) + (when (logtest? (-> obj minimap_edge_flag) (nav-minimap-edge-flag pass-blue)) + (if (not v1-42) + (format s5-0 ",") + ) + (format s5-0 "pass-blue") + ) + ) + (format s5-0 "'") + (if (logtest? (-> obj mysql-save-flag) (mysql-save-flag update)) + (format s5-0 " where nav_edge_id=~D" (-> obj nav_edge_id)) + ) + (let ((a2-14 (sql-query s5-0))) + (when (!= (-> a2-14 error) 'modify) + (format 0 "ERROR: sql: modify error ~A for ~A~%" a2-14 obj) + (return #f) + ) + ) + (when (logtest? (-> obj mysql-save-flag) (mysql-save-flag insert)) + (let ((v1-60 (sql-query "select LAST_INSERT_ID()"))) + (if (= (-> v1-60 error) 'select) + (set! (-> obj nav_edge_id) (the-as uint (string->int (the-as string (-> v1-60 data 0))))) + ) + ) + ) + ) + (((mysql-save-flag delete)) + (format s5-0 "nav_edge_id=~D" (-> obj nav_edge_id)) + (let ((a2-16 (sql-query s5-0))) + (when (!= (-> a2-16 error) 'modify) + (format 0 "ERROR: sql: modify error ~A for ~A~%" a2-16 obj) + (return #f) + ) + ) + ) + ) + ) + (logclear! (-> obj mysql-save-flag) (mysql-save-flag insert)) + (logclear! (-> obj mysql-save-flag) (mysql-save-flag update)) + #t + ) + +;; definition for method 9 of type mysql-nav-visnode +(defmethod exec-sql! mysql-nav-visnode ((obj mysql-nav-visnode)) + "Executes the respective SQL operation specified by `mysql-save-flag`, return value indicates success" + (if (and (logtest? (-> obj mysql-save-flag) (mysql-save-flag insert)) + (logtest? (-> obj mysql-save-flag) (mysql-save-flag delete)) + ) + (return #t) + ) + (if (and (logtest? (-> obj mysql-save-flag) (mysql-save-flag insert)) + (logtest? (-> obj mysql-save-flag) (mysql-save-flag update)) + ) + (logclear! (-> obj mysql-save-flag) (mysql-save-flag update)) + ) + (let ((s5-0 (clear *temp-string*))) + (case (-> obj mysql-save-flag) + (((mysql-save-flag insert)) + (format s5-0 "insert nav_visible_nodes set ") + ) + (((mysql-save-flag update)) + (format s5-0 "update nav_visible_nodes set ") + ) + (((mysql-save-flag delete)) + (format s5-0 "delete from nav_visible_nodes where ") + ) + ) + (case (-> obj mysql-save-flag) + ((8 4) + (format s5-0 "nav_graph_id=~D," (-> obj nav_graph_id)) + (format s5-0 "nav_edge_id=~D," (-> obj nav_edge_id)) + (format s5-0 "nav_node_id=~D" (-> obj nav_node_id)) + (let ((a2-3 (sql-query s5-0))) + (when (!= (-> a2-3 error) 'modify) + (format 0 "ERROR: sql: modify error ~A for ~A~%" a2-3 obj) + (return #f) + ) + ) + ) + (((mysql-save-flag delete)) + (format s5-0 "nav_graph_id=~D and " (-> obj nav_graph_id)) + (format s5-0 "nav_edge_id=~D and " (-> obj nav_edge_id)) + (format s5-0 "nav_node_id=~D" (-> obj nav_node_id)) + (let ((a2-7 (sql-query s5-0))) + (when (!= (-> a2-7 error) 'modify) + (format 0 "ERROR: sql: modify error ~A for ~A~%" a2-7 obj) + (return #f) + ) + ) + ) + ) + ) + (logclear! (-> obj mysql-save-flag) (mysql-save-flag insert)) + (logclear! (-> obj mysql-save-flag) (mysql-save-flag update)) + #t + ) + +;; definition for method 11 of type mysql-nav-graph +(defmethod indexof-nav-node mysql-nav-graph ((obj mysql-nav-graph) (node-id int)) + "Iterate through the `node-array` and return the index for the first [[mysql-nav-node]] whom's `nav_node_id` matches the provided id + returns `-1` if none is found" + (dotimes (v1-0 (-> obj node-array length)) + (if (= node-id (-> (the-as mysql-nav-node (-> obj node-array data v1-0)) nav_node_id)) + (return v1-0) + ) + ) + -1 + ) + +;; definition for method 12 of type mysql-nav-graph +(defmethod indexof-nav-edge mysql-nav-graph ((obj mysql-nav-graph) (edge-id int)) + "Iterate through the `edge-array` and return the index for the first [[mysql-nav-edge]] whom's `nav_edge_id` matches the provided id + returns `-1` if none is found" + (dotimes (v1-0 (-> obj edge-array length)) + (if (= edge-id (-> (the-as mysql-nav-edge (+ (+ (* 80 v1-0) 12) (the-as int (-> obj edge-array)))) nav_edge_id)) + (return v1-0) + ) + ) + -1 + ) + +;; definition for method 9 of type mysql-nav-graph +;; INFO: Used lq/sq +;; WARN: new jak 2 until loop case, check carefully +;; WARN: new jak 2 until loop case, check carefully +;; WARN: new jak 2 until loop case, check carefully +;; WARN: new jak 2 until loop case, check carefully +;; WARN: new jak 2 until loop case, check carefully +;; WARN: new jak 2 until loop case, check carefully +;; WARN: new jak 2 until loop case, check carefully +(defmethod init-from-sql! mysql-nav-graph ((obj mysql-nav-graph) (arg0 string) (arg1 string)) + "Query the database and initialize the [[mysql-nav-graph]] and all it's related components" + (local-vars (sv-16 string) (sv-32 int) (sv-48 int) (sv-64 int)) + (set! (-> obj node-array length) 0) + (set! (-> obj edge-array length) 0) + (set! (-> obj visnode-array length) 0) + (let ((s3-0 (clear *temp-string*))) + (format s3-0 "select nav_graph_id from nav_graph where name='~S'" arg0) + (let ((a2-2 (sql-query s3-0))) + (when (!= (-> a2-2 error) 'select) + (format 0 "ERROR: sql: select error ~A for ~A~%" a2-2 obj) + (return #f) + ) + (set! (-> obj nav_graph_id) (the-as uint (string->int (the-as string (-> a2-2 data 0))))) + ) + ) + (format #t "Loading nodes ...~%") + (let ((s4-1 0) + (s3-1 256) + ) + (until #f + (let ((s2-0 (clear *temp-string*))) + (format + s2-0 + "select nav_node_id,x,y,z,level_name,angle,radius,nav_node_flag,nav_mesh_id,nav_graph_id from nav_node" + ) + (if arg1 + (format s2-0 " where level_name='~S'" arg1) + ) + (format s2-0 " limit ~D,~D" s4-1 s3-1) + (let ((s2-1 (sql-query s2-0))) + (when (!= (-> s2-1 error) 'select) + (format 0 "ERROR: sql: select error ~A for ~A~%" s2-1 obj) + (return #f) + ) + (let ((s1-0 0)) + (while (< s1-0 (-> s2-1 len)) + (when (= (string->int (the-as string (-> s2-1 data (+ s1-0 9)))) (-> obj nav_graph_id)) + (let ((nav-node (-> obj node-array data (-> obj node-array length)))) + (set! (-> nav-node mysql-save-flag) (mysql-save-flag)) + (set! (-> nav-node runtime-id) (the-as uint (-> obj node-array length))) + (set! (-> nav-node nav_graph_id) (-> obj nav_graph_id)) + (set! (-> nav-node nav_node_id) (the-as uint (string->int (the-as string (-> s2-1 data s1-0))))) + (set! (-> nav-node position x) (* 4096.0 (string->float (the-as string (-> s2-1 data (+ s1-0 1)))))) + (set! (-> nav-node position y) (* 4096.0 (string->float (the-as string (-> s2-1 data (+ s1-0 2)))))) + (set! (-> nav-node position z) (* 4096.0 (string->float (the-as string (-> s2-1 data (+ s1-0 3)))))) + (set! (-> nav-node level_name) (string->symbol (the-as string (-> s2-1 data (+ s1-0 4))))) + (set! (-> nav-node angle) (* 182.04445 (string->float (the-as string (-> s2-1 data (+ s1-0 5)))))) + (set! (-> nav-node radius) (* 4096.0 (string->float (the-as string (-> s2-1 data (+ s1-0 6)))))) + (set! (-> nav-node nav_node_flag) (nav-node-flag)) + (set! sv-16 (new 'global 'string 0 (the-as string (-> s2-1 data (+ s1-0 7))))) + (copy-string<-string sv-16 (the-as string (-> s2-1 data (+ s1-0 7)))) + (until #f + (cond + ((string-prefix= "visited" sv-16) + (logior! (-> nav-node nav_node_flag) (nav-node-flag visited)) + ) + ((string-prefix= "blocked" sv-16) + (logior! (-> nav-node nav_node_flag) (nav-node-flag blocked)) + ) + ((string-prefix= "pedestrian" sv-16) + (logior! (-> nav-node nav_node_flag) (nav-node-flag pedestrian)) + ) + ((string-prefix= "selected" sv-16) + (logior! (-> nav-node nav_node_flag) (nav-node-flag selected)) + ) + ((string-prefix= "hidden" sv-16) + (logior! (-> nav-node nav_node_flag) (nav-node-flag hidden)) + ) + (else + #t + (goto cfg-27) + ) + ) + (let ((a1-16 (string-skip-to-char (-> sv-16 data) (the-as uint 44)))) + (if (= (-> a1-16 0) 44) + (set! a1-16 (&-> a1-16 1)) + ) + (string-suck-up! sv-16 a1-16) + ) + ) + #f + (label cfg-27) + (set! (-> nav-node nav_mesh_id) (the-as uint (string->int (the-as string (-> s2-1 data (+ s1-0 8)))))) + ) + (+! (-> obj node-array length) 1) + ) + (+! s1-0 10) + ) + ) + (when (< (-> s2-1 len) (* 10 s3-1)) + #t + (goto cfg-34) + ) + ) + ) + (+! s4-1 s3-1) + ) + ) + #f + (label cfg-34) + (format #t "~D nodes.~%" (-> obj node-array length)) + (format #t "Loading edges ...~%") + (let ((s5-1 0) + (s4-2 256) + ) + (until #f + (let ((s3-2 (clear *temp-string*))) + (format + s3-2 + "select nav_edge_id,nav_node_id_1,nav_node_id_2,directionality,speed_limit,density,traffic_edge_flag,nav_clock_mask,nav_clock_type,width,minimap_edge_flag,nav_graph_id from nav_edge limit ~D,~D" + s5-1 + s4-2 + ) + (let ((s3-3 (sql-query s3-2))) + (when (!= (-> s3-3 error) 'select) + (format 0 "ERROR: sql: select error ~A for ~A~%" s3-3 obj) + (return #f) + ) + (let ((s2-2 0)) + (while (< s2-2 (-> s3-3 len)) + (when (= (string->int (the-as string (-> s3-3 data (+ s2-2 11)))) (-> obj nav_graph_id)) + (let ((s0-2 (string->int (the-as string (-> s3-3 data (+ s2-2 1)))))) + (set! sv-32 (string->int (the-as string (-> s3-3 data (+ s2-2 2))))) + (set! sv-48 (indexof-nav-node obj s0-2)) + (set! sv-64 (indexof-nav-node obj sv-32)) + (let ((nav-edge + (the-as mysql-nav-edge (+ (+ (* 80 (-> obj edge-array length)) 12) (the-as int (-> obj edge-array)))) + ) + ) + (when (and (!= sv-48 -1) (!= sv-64 -1)) + (set! (-> nav-edge nav_graph_id) (-> obj nav_graph_id)) + (set! (-> nav-edge nav_edge_id) (the-as uint (string->int (the-as string (-> s3-3 data s2-2))))) + (set! (-> nav-edge nav_node_id_1) (the-as uint s0-2)) + (set! (-> nav-edge nav_node_id_2) (the-as uint sv-32)) + (set! (-> nav-edge mysql-save-flag) (mysql-save-flag)) + (set! (-> nav-edge runtime-id) (the-as uint (-> obj edge-array length))) + (set! (-> nav-edge runtime-node-id-1) sv-48) + (set! (-> nav-edge runtime-node-id-2) sv-64) + (let ((s0-3 (-> s3-3 data (+ s2-2 3)))) + (cond + ((string= "default" (the-as string s0-3)) + (set! (-> nav-edge directionality) (nav-directionality default)) + 0 + ) + ((string= "directed" (the-as string s0-3)) + (set! (-> nav-edge directionality) (nav-directionality directed)) + ) + ((string= "bi_directional" (the-as string s0-3)) + (set! (-> nav-edge directionality) (nav-directionality bi_directional)) + ) + ) + ) + (set! (-> nav-edge speed_limit) (* 4096.0 (string->float (the-as string (-> s3-3 data (+ s2-2 4)))))) + (set! (-> nav-edge density) (string->float (the-as string (-> s3-3 data (+ s2-2 5))))) + (set! (-> nav-edge traffic_edge_flag) 0) + (let ((s0-4 (new 'global 'string 0 (the-as string (-> s3-3 data (+ s2-2 6)))))) + (copy-string<-string s0-4 (the-as string (-> s3-3 data (+ s2-2 6)))) + (until #f + (cond + ((string-prefix= "pedestrian" s0-4) + (logior! (-> nav-edge traffic_edge_flag) 1) + ) + (else + #t + (goto cfg-58) + ) + ) + (let ((a1-30 (string-skip-to-char (-> s0-4 data) (the-as uint 44)))) + (if (= (-> a1-30 0) 44) + (set! a1-30 (&-> a1-30 1)) + ) + (string-suck-up! s0-4 a1-30) + ) + ) + ) + #f + (label cfg-58) + (set! (-> nav-edge nav_clock_mask) (nav-clock-mask)) + (let ((s0-5 (new 'global 'string 0 (the-as string (-> s3-3 data (+ s2-2 7)))))) + (copy-string<-string s0-5 (the-as string (-> s3-3 data (+ s2-2 7)))) + (until #f + (cond + ((string-prefix= "phase-1a" s0-5) + (logior! (-> nav-edge nav_clock_mask) (nav-clock-mask phase-1a)) + ) + ((string-prefix= "phase-1" s0-5) + (logior! (-> nav-edge nav_clock_mask) (nav-clock-mask phase-1)) + ) + ((string-prefix= "phase-2a" s0-5) + (logior! (-> nav-edge nav_clock_mask) (nav-clock-mask phase-2a)) + ) + ((string-prefix= "phase-2" s0-5) + (logior! (-> nav-edge nav_clock_mask) (nav-clock-mask phase-2)) + ) + ((string-prefix= "phase-3a" s0-5) + (logior! (-> nav-edge nav_clock_mask) (nav-clock-mask phase-3a)) + ) + ((string-prefix= "phase-3" s0-5) + (logior! (-> nav-edge nav_clock_mask) (nav-clock-mask phase-3)) + ) + ((string-prefix= "phase-4a" s0-5) + (logior! (-> nav-edge nav_clock_mask) (nav-clock-mask phase-4a)) + ) + ((string-prefix= "phase-4" s0-5) + (logior! (-> nav-edge nav_clock_mask) (nav-clock-mask phase-4)) + ) + (else + #t + (goto cfg-80) + ) + ) + (let ((a1-42 (string-skip-to-char (-> s0-5 data) (the-as uint 44)))) + (if (= (-> a1-42 0) 44) + (set! a1-42 (&-> a1-42 1)) + ) + (string-suck-up! s0-5 a1-42) + ) + ) + ) + #f + (label cfg-80) + (let ((s0-6 (-> s3-3 data (+ s2-2 8)))) + (cond + ((string= "no-clock" (the-as string s0-6)) + (set! (-> nav-edge nav_clock_type) (nav-clock-type no-clock)) + 0 + ) + ((string= "clock2" (the-as string s0-6)) + (set! (-> nav-edge nav_clock_type) (nav-clock-type clock2)) + ) + ((string= "clock3" (the-as string s0-6)) + (set! (-> nav-edge nav_clock_type) (nav-clock-type clock3)) + ) + ((string= "clock4" (the-as string s0-6)) + (set! (-> nav-edge nav_clock_type) (nav-clock-type clock4)) + ) + ) + ) + (set! (-> nav-edge width) (* 4096.0 (string->float (the-as string (-> s3-3 data (+ s2-2 9)))))) + (set! (-> nav-edge minimap_edge_flag) (nav-minimap-edge-flag)) + (let ((s0-7 (new 'global 'string 0 (the-as string (-> s3-3 data (+ s2-2 10)))))) + (copy-string<-string s0-7 (the-as string (-> s3-3 data (+ s2-2 10)))) + (until #f + (cond + ((string-prefix= "pass-red" s0-7) + (logior! (-> nav-edge minimap_edge_flag) (nav-minimap-edge-flag pass-red)) + ) + ((string-prefix= "pass-green" s0-7) + (logior! (-> nav-edge minimap_edge_flag) (nav-minimap-edge-flag pass-green)) + ) + ((string-prefix= "pass-yellow" s0-7) + (logior! (-> nav-edge minimap_edge_flag) (nav-minimap-edge-flag pass-yellow)) + ) + ((string-prefix= "pass-blue" s0-7) + (logior! (-> nav-edge minimap_edge_flag) (nav-minimap-edge-flag pass-blue)) + ) + (else + #t + (goto cfg-102) + ) + ) + (let ((a1-54 (string-skip-to-char (-> s0-7 data) (the-as uint 44)))) + (if (= (-> a1-54 0) 44) + (set! a1-54 (&-> a1-54 1)) + ) + (string-suck-up! s0-7 a1-54) + ) + ) + ) + #f + (label cfg-102) + (+! (-> obj edge-array length) 1) + ) + ) + ) + ) + (+! s2-2 12) + ) + ) + (when (< (-> s3-3 len) (* 12 s4-2)) + #t + (goto cfg-109) + ) + ) + ) + (+! s5-1 s4-2) + ) + ) + #f + (label cfg-109) + (format #t "~D edges.~%" (-> obj edge-array length)) + (format #t "Loading visnodes ...~%") + (let ((s5-2 0) + (s4-3 256) + ) + (until #f + (let ((s3-4 (clear *temp-string*))) + (format s3-4 "select nav_edge_id,nav_node_id,nav_graph_id from nav_visible_nodes limit ~D,~D" s5-2 s4-3) + (let ((s3-5 (sql-query s3-4))) + (when (!= (-> s3-5 error) 'select) + (format 0 "ERROR: sql: select error ~A for ~A~%" s3-5 obj) + (return #f) + ) + (let ((s2-3 0)) + (while (< s2-3 (-> s3-5 len)) + (when (= (string->int (the-as string (-> s3-5 data (+ s2-3 2)))) (-> obj nav_graph_id)) + (let ((nav-visnode (-> obj visnode-array data (-> obj visnode-array length)))) + (set! (-> nav-visnode mysql-save-flag) (mysql-save-flag)) + (set! (-> nav-visnode nav_graph_id) (-> obj nav_graph_id)) + (set! (-> nav-visnode nav_edge_id) (the-as uint (string->int (the-as string (-> s3-5 data s2-3))))) + (set! (-> nav-visnode nav_node_id) (the-as uint (string->int (the-as string (-> s3-5 data (+ s2-3 1)))))) + (set! (-> nav-visnode runtime-edge-id) (indexof-nav-edge obj (the-as int (-> nav-visnode nav_edge_id)))) + (set! (-> nav-visnode runtime-node-id) (indexof-nav-node obj (the-as int (-> nav-visnode nav_node_id)))) + ) + (+! (-> obj visnode-array length) 1) + ) + (+! s2-3 3) + ) + ) + (when (< (-> s3-5 len) (* 3 s4-3)) + #t + (goto cfg-122) + ) + ) + ) + (+! s5-2 s4-3) + ) + ) + #f + (label cfg-122) + (format #t "~D visnodes.~%" (-> obj visnode-array length)) + #t + ) + +;; definition for method 10 of type mysql-nav-node +(defmethod temp-edge-size mysql-nav-node ((obj mysql-nav-node)) + "Returns the number of [[mysql-nav-edge]] stored in the `temp-edge-list`" + (let ((v0-0 0)) + (let ((v1-0 (the-as object (-> obj temp-edge-list)))) + (while v1-0 + (+! v0-0 1) + (set! v1-0 (-> (the-as mysql-nav-edge v1-0) temp-next-edge)) + ) + ) + v0-0 + ) + ) + +;; definition for method 17 of type mysql-nav-graph +;; WARN: Return type mismatch int vs none. +(defmethod mysql-nav-graph-method-17 mysql-nav-graph ((obj mysql-nav-graph)) + (dotimes (v1-0 (-> obj node-array length)) + (set! (-> (the-as mysql-nav-node (-> obj node-array data v1-0)) temp-edge-list) + (the-as (inline-array mysql-nav-edge) #f) + ) + ) + (dotimes (v1-3 (-> obj edge-array length)) + (set! (-> (the-as mysql-nav-edge (+ (+ (* 80 v1-3) 12) (the-as int (-> obj edge-array)))) temp-next-edge) #f) + ) + (countdown (v1-7 (-> obj edge-array length)) + (let ((a1-17 (the-as mysql-nav-edge (+ (+ (* 80 v1-7) 12) (the-as int (-> obj edge-array)))))) + (when (zero? (logand (-> a1-17 mysql-save-flag) (mysql-save-flag delete))) + (let ((a2-8 (-> obj node-array data (-> a1-17 runtime-node-id-1)))) + (when (zero? (logand (-> a2-8 mysql-save-flag) (mysql-save-flag delete))) + (cond + ((-> a2-8 temp-edge-list) + (set! (-> a1-17 temp-next-edge) (the-as mysql-nav-edge (-> a2-8 temp-edge-list))) + (set! (-> a2-8 temp-edge-list) (the-as (inline-array mysql-nav-edge) a1-17)) + ) + (else + (set! (-> a2-8 temp-edge-list) (the-as (inline-array mysql-nav-edge) a1-17)) + ) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 18 of type mysql-nav-graph +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; definition for method 19 of type mysql-nav-graph +;; WARN: Return type mismatch int vs none. +(defmethod mysql-nav-graph-method-19 mysql-nav-graph ((obj mysql-nav-graph)) + (set! (-> obj level-info-array-length) 0) + (set! (-> obj level-info-last-lookup) 0) + (dotimes (v1-0 32) + (let ((a0-3 (-> obj level-info-array v1-0))) + (set! (-> a0-3 level) #f) + (set! (-> a0-3 level-id) (the-as uint v1-0)) + (set! (-> a0-3 node-count) 0) + (set! (-> a0-3 branch-count) 0) + (set! (-> a0-3 to-link-count) 0) + ) + 0 + ) + (dotimes (s5-0 (-> obj node-array length)) + (let ((s4-0 (-> obj node-array data s5-0))) + (when (zero? (logand (-> s4-0 mysql-save-flag) (mysql-save-flag delete))) + (let ((v1-10 (lookup-level-info2 obj s4-0 #t))) + (set! (-> s4-0 level-node-index) (-> v1-10 node-count)) + (+! (-> v1-10 node-count) 1) + (let ((a0-10 (the-as mysql-nav-edge (-> s4-0 temp-edge-list)))) + (while a0-10 + (when (zero? (logand (-> a0-10 mysql-save-flag) (mysql-save-flag delete))) + (if (!= (-> v1-10 level) (-> obj node-array data (-> a0-10 runtime-node-id-2) level_name)) + (+! (-> v1-10 to-link-count) 1) + ) + (+! (-> v1-10 branch-count) 1) + ) + (set! a0-10 (-> a0-10 temp-next-edge)) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 20 of type mysql-nav-graph +;; WARN: Return type mismatch int vs none. +(defmethod mysql-nav-graph-method-20 mysql-nav-graph ((obj mysql-nav-graph)) + (mysql-nav-graph-method-17 obj) + (mysql-nav-graph-method-19 obj) + 0 + (none) + ) + +;; definition for method 10 of type mysql-nav-graph +(defmethod exec-sql! mysql-nav-graph ((obj mysql-nav-graph)) + (format #t "Saving nodes ...~%") + (dotimes (s5-0 (-> obj node-array length)) + (let ((a0-3 (-> obj node-array data s5-0))) + (set! (-> a0-3 nav_graph_id) (-> obj nav_graph_id)) + (if (not (exec-sql! a0-3)) + (return #f) + ) + ) + ) + (format #t "Done.~%") + (format #t "Saving edges ...~%") + (dotimes (s5-1 (-> obj edge-array length)) + (let ((a0-7 (the-as mysql-nav-edge (+ (+ (* 80 s5-1) 12) (the-as int (-> obj edge-array)))))) + (set! (-> a0-7 nav_graph_id) (-> obj nav_graph_id)) + (set! (-> a0-7 nav_node_id_1) (-> obj node-array data (-> a0-7 runtime-node-id-1) nav_node_id)) + (set! (-> a0-7 nav_node_id_2) (-> obj node-array data (-> a0-7 runtime-node-id-2) nav_node_id)) + (exec-sql! a0-7) + ) + ) + (format #t "Done.~%") + (format #t "Saving visible nodes ...~%") + (dotimes (s5-2 (-> obj visnode-array length)) + (let ((a0-11 (-> obj visnode-array data s5-2))) + (set! (-> a0-11 nav_graph_id) (-> obj nav_graph_id)) + (set! (-> a0-11 nav_node_id) (-> obj node-array data (-> a0-11 runtime-node-id) nav_node_id)) + (set! (-> a0-11 nav_edge_id) + (l.wu (+ (the-as uint (-> obj edge-array)) (* 80 (-> a0-11 runtime-edge-id)) 32)) + ) + (if (not (exec-sql! a0-11)) + (return #f) + ) + ) + ) + (format #t "Done.~%") + #t + ) + +) diff --git a/test/decompiler/reference/jak2/engine/ui/text_REF.gc b/test/decompiler/reference/jak2/engine/ui/text_REF.gc index 8ff1795e60..6304d83e04 100644 --- a/test/decompiler/reference/jak2/engine/ui/text_REF.gc +++ b/test/decompiler/reference/jak2/engine/ui/text_REF.gc @@ -94,8 +94,8 @@ ;; definition for function convert-korean-text (defun convert-korean-text ((arg0 game-text)) - (local-vars (v1-21 int)) "Converts the provided [[game-text]] into korean. Returns a [[string]]" + (local-vars (v1-21 int)) (let ((gp-0 (&-> arg0 text))) *expanded-text-line0* (let ((s4-0 0)) @@ -431,6 +431,7 @@ ;; WARN: Stack slot offset 20 signed mismatch ;; WARN: Stack slot offset 56 signed mismatch (defun print-game-text ((arg0 string) (arg1 font-context) (arg2 symbol) (arg3 int) (arg4 int)) + "Print text." (local-vars (sv-16 float) (sv-20 float) @@ -453,7 +454,6 @@ (sv-112 int) (sv-120 int) ) - "Print text." (cond ((< 0.1 (-> arg1 scale)) (set! sv-16 (-> arg1 origin x)) diff --git a/test/decompiler/reference/jak2/engine/util/smush-control-h_REF.gc b/test/decompiler/reference/jak2/engine/util/smush-control-h_REF.gc index 31e2fa176f..d28887b1f0 100644 --- a/test/decompiler/reference/jak2/engine/util/smush-control-h_REF.gc +++ b/test/decompiler/reference/jak2/engine/util/smush-control-h_REF.gc @@ -132,7 +132,3 @@ ) obj ) - - - - diff --git a/test/offline/config/jak2/config.jsonc b/test/offline/config/jak2/config.jsonc index eda19f12dd..27b6e20cc9 100644 --- a/test/offline/config/jak2/config.jsonc +++ b/test/offline/config/jak2/config.jsonc @@ -124,6 +124,10 @@ // texture "(method 9 texture-page-dir)", // asm + // mysql-nav-graph + "(method 18 mysql-nav-graph)", // asm / dead-code + "(method 10 mysql-nav-graph)", + "i-hopefully-will-never-exist-dont-add-anything-after-me-please" ],