From c2c6d3ba460a330134fa401379c8b42666849e3b Mon Sep 17 00:00:00 2001 From: water111 <48171810+water111@users.noreply.github.com> Date: Tue, 31 Aug 2021 15:01:54 -0400 Subject: [PATCH] [decompiler] detect res-lump macros (#796) * support res lump float * handle data macro * rest of res macros * add vi3 to the build system * missing close paren --- common/goal_constants.h | 2 + decompiler/CMakeLists.txt | 1 + decompiler/IR2/AtomicOp.h | 6 + decompiler/IR2/ExpressionHelpers.cpp | 203 ++++++++++++++++++ decompiler/IR2/ExpressionHelpers.h | 24 +++ decompiler/IR2/Form.cpp | 129 +++++++++++ decompiler/IR2/Form.h | 40 ++++ decompiler/IR2/FormExpressionAnalysis.cpp | 59 +++-- .../jak1_ntsc_black_label/type_casts.jsonc | 15 +- game/fake_iso.txt | 3 +- goal_src/dgos/vi3.gd | 37 ++++ goal_src/engine/camera/camera.gc | 187 +++------------- goal_src/engine/data/res.gc | 162 +++++++------- goal_src/engine/entity/actor-link-h.gc | 25 +-- goal_src/engine/nav/navigate-h.gc | 96 +++------ goal_src/engine/nav/path-h.gc | 13 +- goal_src/engine/util/sync-info.gc | 36 +--- goal_src/game.gp | 46 ++++ goal_src/levels/common/basebutton.gc | 41 +--- goal_src/levels/common/water-anim.gc | 62 ++---- goal_src/levels/misty/misty-warehouse.gc | 10 +- goal_src/levels/misty/mud.gc | 25 +-- goal_src/levels/village_common/oracle.gc | 16 +- .../decompiler/reference/decompiler-macros.gc | 55 +++++ .../reference/engine/camera/camera_REF.gc | 137 ++---------- .../engine/entity/actor-link-h_REF.gc | 28 +-- .../engine/game/effect-control-h_REF.gc | 10 +- .../reference/engine/game/fact-h_REF.gc | 151 +------------ .../reference/engine/nav/navigate-h_REF.gc | 28 +-- .../reference/engine/nav/path-h_REF.gc | 14 +- .../reference/engine/sound/gsound_REF.gc | 13 +- .../reference/engine/util/sync-info_REF.gc | 39 +--- .../reference/levels/common/basebutton_REF.gc | 41 +--- .../reference/levels/common/water-anim_REF.gc | 59 ++--- .../levels/misty/misty-warehouse_REF.gc | 10 +- .../reference/levels/misty/mud_REF.gc | 25 +-- .../levels/village_common/oracle_REF.gc | 16 +- 37 files changed, 846 insertions(+), 1018 deletions(-) create mode 100644 decompiler/IR2/ExpressionHelpers.cpp create mode 100644 decompiler/IR2/ExpressionHelpers.h create mode 100644 goal_src/dgos/vi3.gd diff --git a/common/goal_constants.h b/common/goal_constants.h index 81f5a46fbe..f0cf906cdf 100644 --- a/common/goal_constants.h +++ b/common/goal_constants.h @@ -37,3 +37,5 @@ constexpr double METER_LENGTH = 4096.0; constexpr double DEGREES_PER_ROT = 65536.0; constexpr double DEGREES_LENGTH = DEGREES_PER_ROT / 360.0; constexpr u64 TICKS_PER_SECOND = 300.0; + +constexpr float DEFAULT_RES_TIME = -1000000000.0; \ No newline at end of file diff --git a/decompiler/CMakeLists.txt b/decompiler/CMakeLists.txt index 83cf941bbe..af05b22dee 100644 --- a/decompiler/CMakeLists.txt +++ b/decompiler/CMakeLists.txt @@ -44,6 +44,7 @@ add_library( IR2/AtomicOpTypeAnalysis.cpp IR2/bitfields.cpp IR2/Env.cpp + IR2/ExpressionHelpers.cpp IR2/Form.cpp IR2/FormExpressionAnalysis.cpp IR2/FormStack.cpp diff --git a/decompiler/IR2/AtomicOp.h b/decompiler/IR2/AtomicOp.h index 4196ddf284..debee3b134 100644 --- a/decompiler/IR2/AtomicOp.h +++ b/decompiler/IR2/AtomicOp.h @@ -152,7 +152,13 @@ class SimpleAtom { bool is_int() const { return m_kind == Kind::INTEGER_CONSTANT; }; bool is_int(s64 integer) const { return is_int() && get_int() == integer; } bool is_sym_ptr() const { return m_kind == Kind::SYMBOL_PTR; }; + bool is_sym_ptr(const std::string& str) const { + return m_kind == Kind::SYMBOL_PTR && m_string == str; + } bool is_sym_val() const { return m_kind == Kind::SYMBOL_VAL; }; + bool is_sym_val(const std::string& str) const { + return m_kind == Kind::SYMBOL_VAL && m_string == str; + } bool is_empty_list() const { return m_kind == Kind::EMPTY_LIST; }; bool is_static_addr() const { return m_kind == Kind::STATIC_ADDRESS; }; Kind get_kind() const { return m_kind; } diff --git a/decompiler/IR2/ExpressionHelpers.cpp b/decompiler/IR2/ExpressionHelpers.cpp new file mode 100644 index 0000000000..d2a66df643 --- /dev/null +++ b/decompiler/IR2/ExpressionHelpers.cpp @@ -0,0 +1,203 @@ +#include "ExpressionHelpers.h" +#include "decompiler/IR2/Form.h" +#include "decompiler/IR2/Env.h" +#include "common/goal_constants.h" + +namespace decompiler { + +FormElement* handle_get_property_value_float(const std::vector