diff --git a/common/goal_constants.h b/common/goal_constants.h index 81f5a46fb..f0cf906cd 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 83cf941bb..af05b22de 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 4196ddf28..debee3b13 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 000000000..d2a66df64 --- /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& forms, + FormPool& pool, + const Env& env) { + assert(forms.size() == 7); + // lump object + // name + // 'interp + // -1000000000.0 = DEFAULT_RES_TIME + // default value + // tag pointer + // *res-static-buf* + + // get the res-lump. This can be anything. + Form* lump_object = forms.at(0); + + // get the name of the the thing we're looking up. This can be anything. + Form* property_name = forms.at(1); + + // get the mode. It must be interp. + auto mode_atom = form_as_atom(forms.at(2)); + if (!mode_atom || !mode_atom->is_sym_ptr("interp")) { + fmt::print("fail: bad mode {}\n", forms.at(2)->to_string(env)); + return nullptr; + } + + // get the time. It must be DEFAULT_RES_TIME + auto lookup_time = forms.at(3)->try_as_element(); + if (!lookup_time || lookup_time->value() != DEFAULT_RES_TIME) { + fmt::print("fail: bad time {}\n", forms.at(3)->to_string(env)); + return nullptr; + } + + // get the default value. It can be anything... + Form* default_value = forms.at(4); + // but let's see if it's 0, because that's the default in the macro + auto default_value_float = default_value->try_as_element(); + if (default_value_float && default_value_float->value() == 0) { + default_value = nullptr; + } + + // get the tag pointer. It can be anything... + Form* tag_pointer = forms.at(5); + // but let's see if it's (the-as (pointer res-tag) #f) + if (tag_pointer->to_string(env) == "(the-as (pointer res-tag) #f)") { + tag_pointer = nullptr; + } + + // get the buffer. It should be *res-static-buf* + auto buf_atom = form_as_atom(forms.at(6)); + if (!buf_atom || !buf_atom->is_sym_val("*res-static-buf*")) { + return nullptr; + } + + // (lump name &key (tag-ptr (the-as (pointer res-tag) #f)) &key (default 0.0)) + std::vector macro_args; + macro_args.push_back(lump_object); + macro_args.push_back(property_name); + if (default_value) { + macro_args.push_back(pool.form(":default")); + macro_args.push_back(default_value); + } + + if (tag_pointer) { + macro_args.push_back(pool.form(":tag-ptr")); + macro_args.push_back(tag_pointer); + } + + GenericOperator op = + GenericOperator::make_function(pool.form("res-lump-float")); + return pool.alloc_element(op, macro_args); +} + +namespace { +FormElement* handle_get_property_data_or_structure(const std::vector& forms, + FormPool& pool, + const Env& env, + ResLumpMacroElement::Kind kind, + const std::string& expcted_default, + const TypeSpec& default_type) { + // (-> obj entity) + // 'water-anim-fade-dist + // 'interp + // -1000000000.0 + // (the-as pointer #f) + // (the-as (pointer res-tag) #f) + // *res-static-buf* + + // get the res-lump. This can be anything. + Form* lump_object = forms.at(0); + + // get the name of the the thing we're looking up. This can be anything. + Form* property_name = forms.at(1); + + // get the mode. It must be interp. + auto mode_atom = form_as_atom(forms.at(2)); + if (!mode_atom || !mode_atom->is_sym_ptr("interp")) { + fmt::print("fail data: bad mode {}\n", forms.at(2)->to_string(env)); + return nullptr; + } + + // get the time. It can be anything, but there's a default. + auto time = forms.at(3); + auto lookup_time = time->try_as_element(); + if (lookup_time && lookup_time->value() == DEFAULT_RES_TIME) { + time = nullptr; + } + + // get the default value. It must be (the-as pointer #f) + Form* default_value = forms.at(4); + // but let's see if it's 0, because that's the default in the macro + if (default_value->to_string(env) != expcted_default) { + fmt::print("fail data: bad default {}\n", default_value->to_string(env)); + return nullptr; + } + + // get the tag pointer. It can be anything... + Form* tag_pointer = forms.at(5); + // but let's see if it's (the-as (pointer res-tag) #f) + if (tag_pointer->to_string(env) == "(the-as (pointer res-tag) #f)") { + tag_pointer = nullptr; + } + + // get the buffer. It should be *res-static-buf* + auto buf_atom = form_as_atom(forms.at(6)); + if (!buf_atom || !buf_atom->is_sym_val("*res-static-buf*")) { + return nullptr; + } + + return pool.alloc_element(kind, lump_object, property_name, + nullptr, // default, must be #f + tag_pointer, time, default_type); +} +} // namespace + +FormElement* handle_get_property_data(const std::vector& forms, + FormPool& pool, + const Env& env) { + return handle_get_property_data_or_structure(forms, pool, env, ResLumpMacroElement::Kind::DATA, + "(the-as pointer #f)", TypeSpec("pointer")); +} + +FormElement* handle_get_property_struct(const std::vector& forms, + FormPool& pool, + const Env& env) { + return handle_get_property_data_or_structure(forms, pool, env, ResLumpMacroElement::Kind::STRUCT, + "#f", TypeSpec("structure")); +} + +FormElement* handle_get_property_value(const std::vector& forms, + FormPool& pool, + const Env& env) { + // get the res-lump. This can be anything. + Form* lump_object = forms.at(0); + + // get the name of the the thing we're looking up. This can be anything. + Form* property_name = forms.at(1); + + // get the mode. It must be interp. + auto mode_atom = form_as_atom(forms.at(2)); + if (!mode_atom || !mode_atom->is_sym_ptr("interp")) { + fmt::print("fail data: bad mode {}\n", forms.at(2)->to_string(env)); + return nullptr; + } + + // get the time. It can be anything, but there's a default. + auto time = forms.at(3); + auto lookup_time = time->try_as_element(); + if (lookup_time && lookup_time->value() == DEFAULT_RES_TIME) { + time = nullptr; + } + + // get the default value. It can be whatever. + Form* default_value = forms.at(4); + // but let's see if it's 0, because that's the default in the macro + if (default_value->to_string(env) == "(the-as uint128 0)") { + default_value = nullptr; + } + + // get the tag pointer. It can be anything... + Form* tag_pointer = forms.at(5); + // but let's see if it's (the-as (pointer res-tag) #f) + if (tag_pointer->to_string(env) == "(the-as (pointer res-tag) #f)") { + tag_pointer = nullptr; + } + + // get the buffer. It should be *res-static-buf* + auto buf_atom = form_as_atom(forms.at(6)); + if (!buf_atom || !buf_atom->is_sym_val("*res-static-buf*")) { + return nullptr; + } + + return pool.alloc_element(ResLumpMacroElement::Kind::VALUE, lump_object, + property_name, default_value, tag_pointer, time, + TypeSpec("uint128")); +} +} // namespace decompiler \ No newline at end of file diff --git a/decompiler/IR2/ExpressionHelpers.h b/decompiler/IR2/ExpressionHelpers.h new file mode 100644 index 000000000..34bdf5099 --- /dev/null +++ b/decompiler/IR2/ExpressionHelpers.h @@ -0,0 +1,24 @@ +#pragma once + +#include + +namespace decompiler { +class FormElement; +class Form; +class Env; +class FormPool; + +FormElement* handle_get_property_value_float(const std::vector& forms, + FormPool& pool, + const Env& env); +FormElement* handle_get_property_data(const std::vector& forms, + FormPool& pool, + const Env& env); +FormElement* handle_get_property_struct(const std::vector& forms, + FormPool& pool, + const Env& env); + +FormElement* handle_get_property_value(const std::vector& forms, + FormPool& pool, + const Env& env); +} // namespace decompiler diff --git a/decompiler/IR2/Form.cpp b/decompiler/IR2/Form.cpp index ae5a1b5de..c22360a62 100644 --- a/decompiler/IR2/Form.cpp +++ b/decompiler/IR2/Form.cpp @@ -2904,6 +2904,135 @@ goos::Object DefstateElement::to_form_internal(const Env& env) const { return pretty_print::build_list(forms); } +//////////////////////////////// +// ResLumpMacroElement +//////////////////////////////// + +ResLumpMacroElement::ResLumpMacroElement(Kind kind, + Form* lump_object, + Form* property_name, + Form* default_arg, + Form* tag_ptr, + Form* time, + const TypeSpec& result_type) + : m_kind(kind), + m_lump_object(lump_object), + m_property_name(property_name), + m_default_arg(default_arg), + m_tag_ptr(tag_ptr), + m_time(time), + m_result_type(result_type) { + m_lump_object->parent_element = this; + m_property_name->parent_element = this; + if (m_default_arg) { + m_default_arg->parent_element = this; + } + if (m_tag_ptr) { + m_tag_ptr->parent_element = this; + } + if (m_time) { + m_time->parent_element = this; + } +} + +void ResLumpMacroElement::apply(const std::function& f) { + f(this); + m_lump_object->apply(f); + m_property_name->apply(f); + if (m_default_arg) { + m_default_arg->apply(f); + } + if (m_tag_ptr) { + m_tag_ptr->apply(f); + } + if (m_time) { + m_time->apply(f); + } +} + +void ResLumpMacroElement::apply_form(const std::function& f) { + m_lump_object->apply_form(f); + m_property_name->apply_form(f); + if (m_default_arg) { + m_default_arg->apply_form(f); + } + if (m_tag_ptr) { + m_tag_ptr->apply_form(f); + } + if (m_time) { + m_time->apply_form(f); + } +} + +void ResLumpMacroElement::collect_vars(RegAccessSet& vars, bool recursive) const { + if (recursive) { + m_lump_object->collect_vars(vars, recursive); + m_property_name->collect_vars(vars, recursive); + if (m_default_arg) { + m_default_arg->collect_vars(vars, recursive); + } + if (m_tag_ptr) { + m_tag_ptr->collect_vars(vars, recursive); + } + if (m_time) { + m_time->collect_vars(vars, recursive); + } + } +} + +void ResLumpMacroElement::get_modified_regs(RegSet& regs) const { + m_lump_object->get_modified_regs(regs); + m_property_name->get_modified_regs(regs); + if (m_default_arg) { + m_default_arg->get_modified_regs(regs); + } + if (m_tag_ptr) { + m_tag_ptr->get_modified_regs(regs); + } + if (m_time) { + m_time->get_modified_regs(regs); + } +} + +goos::Object ResLumpMacroElement::to_form_internal(const Env& env) const { + std::vector forms; + + switch (m_kind) { + case Kind::DATA: + forms.push_back(pretty_print::to_symbol("res-lump-data")); + break; + case Kind::STRUCT: + forms.push_back(pretty_print::to_symbol("res-lump-struct")); + break; + case Kind::VALUE: + forms.push_back(pretty_print::to_symbol("res-lump-value")); + break; + default: + assert(false); + } + + forms.push_back(m_lump_object->to_form(env)); + forms.push_back(m_property_name->to_form(env)); + + forms.push_back(pretty_print::to_symbol(m_result_type.print())); + + if (m_default_arg) { + forms.push_back(pretty_print::to_symbol(":default")); + forms.push_back(m_default_arg->to_form(env)); + } + + if (m_tag_ptr) { + forms.push_back(pretty_print::to_symbol(":tag-ptr")); + forms.push_back(m_tag_ptr->to_form(env)); + } + + if (m_time) { + forms.push_back(pretty_print::to_symbol(":time")); + forms.push_back(m_time->to_form(env)); + } + + return pretty_print::build_list(forms); +} //////////////////////////////// // Utilities //////////////////////////////// diff --git a/decompiler/IR2/Form.h b/decompiler/IR2/Form.h index b1b5624e5..82d0de752 100644 --- a/decompiler/IR2/Form.h +++ b/decompiler/IR2/Form.h @@ -1628,6 +1628,38 @@ class DefstateElement : public FormElement { bool m_is_virtual = false; }; +class ResLumpMacroElement : public FormElement { + public: + enum class Kind { DATA, STRUCT, VALUE, INVALID }; + ResLumpMacroElement(Kind kind, + Form* lump_object, + Form* property_name, + Form* default_arg, + Form* tag_ptr, + Form* time, + const TypeSpec& result_type); + goos::Object to_form_internal(const Env& env) const override; + void apply(const std::function& f) override; + void apply_form(const std::function& f) override; + void collect_vars(RegAccessSet& vars, bool recursive) const override; + void update_from_stack(const Env& env, + FormPool& pool, + FormStack& stack, + std::vector* result, + bool allow_side_effects) override; + void get_modified_regs(RegSet& regs) const override; + void apply_cast(const TypeSpec& new_type) { m_result_type = new_type; } + + private: + Kind m_kind = Kind::INVALID; + Form* m_lump_object = nullptr; + Form* m_property_name = nullptr; + Form* m_default_arg = nullptr; // may be null + Form* m_tag_ptr = nullptr; // may be null + Form* m_time = nullptr; // may be null + TypeSpec m_result_type; +}; + /*! * A Form is a wrapper around one or more FormElements. * This is done for two reasons: @@ -1789,6 +1821,14 @@ class FormPool { return form; } + template + Form* form(Args&&... args) { + auto elt = new T(std::forward(args)...); + m_elements.emplace_back(elt); + auto form = alloc_single_form(nullptr, elt); + return form; + } + Form* alloc_single_form(FormElement* parent, FormElement* elt) { auto form = new Form(parent, elt); m_forms.push_back(form); diff --git a/decompiler/IR2/FormExpressionAnalysis.cpp b/decompiler/IR2/FormExpressionAnalysis.cpp index ee9eab664..720867044 100644 --- a/decompiler/IR2/FormExpressionAnalysis.cpp +++ b/decompiler/IR2/FormExpressionAnalysis.cpp @@ -8,6 +8,7 @@ #include "decompiler/IR2/bitfields.h" #include "common/util/BitUtils.h" #include "common/type_system/state.h" +#include "decompiler/IR2/ExpressionHelpers.h" /* * TODO @@ -85,6 +86,12 @@ Form* try_cast_simplify(Form* in, return in; // no need to cast again, it already has it! } + auto in_as_reslump = in->try_as_element(); + if (in_as_reslump) { + in_as_reslump->apply_cast(new_type); + return in; + } + if (new_type == TypeSpec("meters")) { auto fc = get_goal_float_constant(in); @@ -554,22 +561,6 @@ void SimpleExpressionElement::update_from_stack_identity(const Env& env, result->push_back(pool.alloc_element(str)); } else { // look for a label hint: - /* - auto kv = env.label_types().find(lab.name); - if (kv != env.label_types().end()) { - auto type_name = kv->second.type_name; - // the actual decompilation is deferred until later, once static lambdas are done. - if (type_name == "_auto_") { - result->push_back(pool.alloc_element(lab)); - } else if (type_name == "_lambda_") { - result->push_back(this); - } else { - result->push_back(pool.alloc_element(lab, kv->second)); - } - } else { - result->push_back(this); - } - */ const auto& hint = env.file->label_db->lookup(lab.name); if (!hint.known) { throw std::runtime_error( @@ -2935,6 +2926,32 @@ void FunctionCallElement::update_from_stack(const Env& env, auto type_source_form = match_result.maps.forms.at(type_source); + if (name == "get-property-value-float" && type_source_form->to_string(env) == "res-lump") { + auto as_macro = handle_get_property_value_float(arg_forms, pool, env); + if (as_macro) { + result->push_back(as_macro); + return; + } + } else if (name == "get-property-data" && type_source_form->to_string(env) == "res-lump") { + auto as_macro = handle_get_property_data(arg_forms, pool, env); + if (as_macro) { + result->push_back(as_macro); + return; + } + } else if (name == "get-property-struct" && type_source_form->to_string(env) == "res-lump") { + auto as_macro = handle_get_property_struct(arg_forms, pool, env); + if (as_macro) { + result->push_back(as_macro); + return; + } + } else if (name == "get-property-value" && type_source_form->to_string(env) == "res-lump") { + auto as_macro = handle_get_property_value(arg_forms, pool, env); + if (as_macro) { + result->push_back(as_macro); + return; + } + } + // if the type is the exact type of the argument, we want to build it into a method call if (type_source_form->to_string(env) == first_arg_type.base_type() && name != "new") { if (env.dts->ts.should_use_virtual_methods(tp_type.method_from_type(), @@ -2996,6 +3013,7 @@ void FunctionCallElement::update_from_stack(const Env& env, auto gop = GenericOperator::make_function(method_op); result->push_back(pool.alloc_element(gop, arg_forms)); + return; } } @@ -5236,6 +5254,15 @@ void DefstateElement::update_from_stack(const Env&, result->push_back(this); } +void ResLumpMacroElement::update_from_stack(const Env&, + FormPool&, + FormStack&, + std::vector* result, + bool) { + mark_popped(); + result->push_back(this); +} + void LabelDerefElement::update_from_stack(const Env& env, FormPool& pool, FormStack& stack, diff --git a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc index 4b0abd55e..83026d1b0 100644 --- a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc @@ -603,18 +603,10 @@ // FACT-H "(method 0 fact-info-enemy)": [ - [[3, 92], "gp", "fact-info-enemy"], - [16, "v0", "float"], - [28, "v0", "float"], - [40, "v0", "float"], - [52, "v0", "float"], - [64, "v0", "float"], - [76, "v0", "float"], - [88, "v0", "float"] + [[3, 92], "gp", "fact-info-enemy"] ], "(method 0 fact-info)": [ - [81, "v0", "float"], //[16, "t9", "(function string none)"], ["_stack_", 16, "res-tag"], [[32, 43], "v1", "(pointer int32)"], @@ -1872,7 +1864,8 @@ ], "(method 25 water-anim)": [ - [[27, 45], "v1", "transform"] + [25, "v0", "(pointer float)"], + ["_stack_", 16, "res-tag"] ], "(method 22 rigid-body-platform)": [ @@ -1910,7 +1903,7 @@ ], "(method 22 mud)": [ - [[37, 41], "v1", "ripple-control"] + [35, "v0", "(pointer float)"] ], "(method 11 twister)": [ diff --git a/game/fake_iso.txt b/game/fake_iso.txt index e6eeab6b9..92999e952 100644 --- a/game/fake_iso.txt +++ b/game/fake_iso.txt @@ -12,4 +12,5 @@ SCREEN1.USA resources/SCREEN1.USA 0COMMON.TXT out/iso/0COMMON.TXT 5COMMON.TXT out/iso/5COMMON.TXT 0TEST.TXT out/iso/0TEST.TXT -VI1.DGO out/iso/VI1.DGO \ No newline at end of file +VI1.DGO out/iso/VI1.DGO +VI3.DGO out/iso/VI3.DGO \ No newline at end of file diff --git a/goal_src/dgos/vi3.gd b/goal_src/dgos/vi3.gd new file mode 100644 index 000000000..01be98499 --- /dev/null +++ b/goal_src/dgos/vi3.gd @@ -0,0 +1,37 @@ +("VI3.DGO" + ("villagep-obs.o" "villagep-obs") + ("oracle.o" "oracle") + ("village3-part.o" "village3-part") + ("village3-obs.o" "village3-obs") + ("minecart.o" "minecart") + ("miners.o" "miners") + ("assistant-village3.o" "assistant-village3") + ("sage-village3.o" "sage-village3") + ("tpage-1208.go" "tpage-1208") + ("tpage-1210.go" "tpage-1210") + ("tpage-1209.go" "tpage-1209") + ("tpage-1194.go" "tpage-1194") + ("assistant-village3-ag.go" "assistant-village3") + ("cavegem-ag.go" "cavegem") + ("evilbro-village3-ag.go" "evilbro-village3") + ("evilsis-village3-ag.go" "evilsis-village3") + ("gondola-ag.go" "gondola") + ("gondolacables-ag.go" "gondolacables") + ("lavaspoutdrip-ag.go" "lavaspoutdrip") + ("medres-finalboss-ag.go" "medres-finalboss") + ("medres-ogre-ag.go" "medres-ogre") + ("medres-ogre2-ag.go" "medres-ogre2") + ("medres-ogre3-ag.go" "medres-ogre3") + ("minecartsteel-ag.go" "minecartsteel") + ("minershort-ag.go" "minershort") + ("minertall-ag.go" "minertall") + ("oracle-ag-VI3.go" "oracle") + ("pistons-ag.go" "pistons") + ("sage-village3-ag.go" "sage-village3") + ("vil3-bridge-36-ag.go" "vil3-bridge-36") + ("village-cam-ag-VI3.go" "village-cam") + ("warp-gate-switch-ag-VI1-VI3.go" "warp-gate-switch") + ("warpgate-ag.go" "warpgate") + ("water-anim-village3-ag.go" "water-anim-village3") + ("village3-vis.go" "village3-vis") + ) \ No newline at end of file diff --git a/goal_src/engine/camera/camera.gc b/goal_src/engine/camera/camera.gc index 746ddc3a7..068708aab 100644 --- a/goal_src/engine/camera/camera.gc +++ b/goal_src/engine/camera/camera.gc @@ -22,18 +22,7 @@ (set! s3-0 (-> arg0 quat)) ) (else - (set! - s3-0 - ((method-of-type res-lump get-property-struct) - arg0 - arg2 - 'interp - -1000000000.0 - #f - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) + (set! s3-0 (res-lump-struct arg0 arg2 structure)) ) ) (let ((s2-0 (method-of-type res-lump get-property-struct))) @@ -70,21 +59,10 @@ ;; definition for function cam-slave-get-flags (defun cam-slave-get-flags ((arg0 entity) (arg1 symbol)) - (let - ((gp-0 - ((method-of-type res-lump get-property-value) - arg0 - arg1 - 'interp - -1000000000.0 - (the-as uint128 0) - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - (s3-0 (method-of-type res-lump get-property-value)) - (s2-0 arg0) - ) + (let ((gp-0 (res-lump-value arg0 arg1 uint128)) + (s3-0 (method-of-type res-lump get-property-value)) + (s2-0 arg0) + ) (format (clear *res-key-string*) "~S~S" arg1 '-on) (let ((s3-1 @@ -122,20 +100,9 @@ ;; definition for function cam-slave-get-float (defun cam-slave-get-float ((arg0 entity) (arg1 symbol) (arg2 float)) - (let - ((f30-0 - ((method-of-type res-lump get-property-value-float) - arg0 - arg1 - 'interp - -1000000000.0 - arg2 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - (s4-0 (method-of-type res-lump get-property-value-float)) - ) + (let ((f30-0 (res-lump-float arg0 arg1 :default arg2)) + (s4-0 (method-of-type res-lump get-property-value-float)) + ) (format (clear *res-key-string*) "~S~S" arg1 '-offset) (+ f30-0 @@ -154,20 +121,9 @@ ;; definition for function cam-slave-get-fov (defun cam-slave-get-fov ((arg0 entity)) - (let - ((f30-0 - ((method-of-type res-lump get-property-value-float) - arg0 - 'fov - 'interp - -1000000000.0 - 0.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - (s5-0 (method-of-type res-lump get-property-value-float)) - ) + (let ((f30-0 (res-lump-float arg0 'fov)) + (s5-0 (method-of-type res-lump get-property-value-float)) + ) (format (clear *res-key-string*) "~S~S" 'fov '-offset) (let ((f0-0 @@ -192,20 +148,9 @@ ;; definition for function cam-slave-get-intro-step (defun cam-slave-get-intro-step ((arg0 entity)) - (let - ((f30-0 - ((method-of-type res-lump get-property-value-float) - arg0 - 'intro-time - 'interp - -1000000000.0 - 0.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - (s5-0 (method-of-type res-lump get-property-value-float)) - ) + (let ((f30-0 (res-lump-float arg0 'intro-time)) + (s5-0 (method-of-type res-lump get-property-value-float)) + ) (format (clear *res-key-string*) "~S~S" 'intro-time '-offset) (let ((f0-1 @@ -233,20 +178,9 @@ ;; definition for function cam-slave-get-interp-time (defun cam-slave-get-interp-time ((arg0 entity)) - (let - ((f30-0 - ((method-of-type res-lump get-property-value-float) - arg0 - 'interpTime - 'interp - -1000000000.0 - 0.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - (s5-0 (method-of-type res-lump get-property-value-float)) - ) + (let ((f30-0 (res-lump-float arg0 'interpTime)) + (s5-0 (method-of-type res-lump get-property-value-float)) + ) (format (clear *res-key-string*) "~S~S" 'interpTime '-offset) (let ((f0-1 @@ -315,26 +249,10 @@ ((not arg0) (the-as state #f) ) - (((method-of-type res-lump get-property-struct) - arg0 - 'pivot - 'interp - -1000000000.0 - #f - (the-as (pointer res-tag) #f) - *res-static-buf* - ) + ((res-lump-struct arg0 'pivot structure) cam-circular ) - (((method-of-type res-lump get-property-struct) - arg0 - 'align - 'interp - -1000000000.0 - #f - (the-as (pointer res-tag) #f) - *res-static-buf* - ) + ((res-lump-struct arg0 'align structure) cam-standoff-read-entity ) ((get-curve-data! arg0 s5-0 'campath 'campath-k -1000000000.0) @@ -416,7 +334,7 @@ ;; definition for function third-power (defun third-power ((arg0 float)) - (* (* arg0 arg0) arg0) + (* arg0 arg0 arg0) ) ;; definition for function parameter-ease-sqr-clamp @@ -474,17 +392,7 @@ (the-as uint (cam-slave-get-flags arg1 (string->symbol *res-key-string*))) ) (let - ((s3-2 - ((method-of-type res-lump get-property-data) - arg1 - arg0 - 'interp - -1000000000.0 - (the-as pointer #f) - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) + ((s3-2 (res-lump-data arg1 arg0 pointer)) (s0-1 (method-of-type res-lump get-property-struct)) ) (set! sv-32 format) @@ -649,10 +557,7 @@ (- (-> obj summed-len) (-> obj point arg0 tp-length)) ) (vector-! - (the-as - vector - (+ (the-as uint (-> obj point 0 direction)) (the-as uint (* 48 arg0))) - ) + (the-as vector (+ (the-as uint (-> obj point 0 direction)) (* 48 arg0))) (the-as vector (-> obj point v1-11)) (the-as vector (-> obj point arg0)) ) @@ -660,10 +565,7 @@ (set! (-> obj point arg0 tp-length) (vector-normalize-ret-len! - (the-as - vector - (+ (the-as uint (-> obj point 0 direction)) (the-as uint (* 48 arg0))) - ) + (the-as vector (+ (the-as uint (-> obj point 0 direction)) (* 48 arg0))) 1.0 ) ) @@ -758,16 +660,13 @@ (vector-dot (the-as vector - (+ - (the-as uint (-> obj point 0 direction)) - (the-as uint (* 48 v1-15)) - ) + (+ (the-as uint (-> obj point 0 direction)) (* 48 v1-15)) ) (the-as vector (+ (the-as uint (the-as vector (-> obj point 0 direction))) - (the-as uint (* 48 a0-14)) + (* 48 a0-14) ) ) ) @@ -822,16 +721,13 @@ (vector-dot (the-as vector - (+ - (the-as uint (-> obj point 0 direction)) - (the-as uint (* 48 s4-1)) - ) + (+ (the-as uint (-> obj point 0 direction)) (* 48 s4-1)) ) (the-as vector (+ (the-as uint (the-as vector (-> obj point 0 direction))) - (the-as uint (* 48 v1-11)) + (* 48 v1-11) ) ) ) @@ -862,20 +758,14 @@ (s2-0 (-> obj end-point)) ) (vector-! - (the-as - vector - (+ (the-as uint (-> obj point 0 direction)) (the-as uint (* 48 s2-0))) - ) + (the-as vector (+ (the-as uint (-> obj point 0 direction)) (* 48 s2-0))) arg0 (the-as vector (-> obj point s2-0)) ) (set! (-> obj point s2-0 tp-length) (vector-normalize-ret-len! - (the-as - vector - (+ (the-as uint (-> obj point 0 direction)) (the-as uint (* 48 s2-0))) - ) + (the-as vector (+ (the-as uint (-> obj point 0 direction)) (* 48 s2-0))) 1.0 ) ) @@ -1035,18 +925,12 @@ (let ((s1-0 (-> obj point v1-8 next))) (vector-! s2-0 - (the-as - vector - (+ (the-as uint (-> obj point 0 direction)) (the-as uint (* 48 s1-0))) - ) - (the-as - vector - (+ (the-as uint (-> obj point 0 direction)) (the-as uint (* 48 v1-8))) - ) + (the-as vector (+ (the-as uint (-> obj point 0 direction)) (* 48 s1-0))) + (the-as vector (+ (the-as uint (-> obj point 0 direction)) (* 48 v1-8))) ) (let* ((f0-4 (vector-normalize-ret-len! s2-0 1.0)) (f0-5 (* 0.5 f0-4)) - (f26-0 (* (* (fmin 1.0 f0-5) f30-0) (vector-dot arg0 s2-0))) + (f26-0 (* (fmin 1.0 f0-5) f30-0 (vector-dot arg0 s2-0))) ) (let ((f2-7 (vector-dot s2-0 s3-0))) (cond @@ -1876,7 +1760,7 @@ (set! f0-3 1.0) ) ) - (let ((f30-0 (* (* 364.0889 (-> *display* time-adjust-ratio)) f0-3))) + (let ((f30-0 (* 364.0889 (-> *display* time-adjust-ratio) f0-3))) (matrix->quaternion s4-0 arg0) (matrix->quaternion s2-0 arg3) (quaternion-conjugate! gp-0 s4-0) @@ -1886,8 +1770,8 @@ (quaternion-negate! gp-0 gp-0) ) (let ((f28-0 (acos (-> gp-0 w)))) - (if (< (* (* 0.25 (-> *display* time-adjust-ratio)) f28-0) f30-0) - (set! f30-0 (* (* 0.25 (-> *display* time-adjust-ratio)) f28-0)) + (if (< (* 0.25 (-> *display* time-adjust-ratio) f28-0) f30-0) + (set! f30-0 (* 0.25 (-> *display* time-adjust-ratio) f28-0)) ) (cond ((< (-> gp-0 w) 0.9999999) @@ -2054,7 +1938,6 @@ ) ) ) - ; ;; definition for function slave-set-rotation! ; ;; INFO: Return type mismatch int vs none. ; ;; WARN: Unsupported inline assembly instruction kind - [mula.s f0, f3] diff --git a/goal_src/engine/data/res.gc b/goal_src/engine/data/res.gc index f2f50cfa1..ab0f54f01 100644 --- a/goal_src/engine/data/res.gc +++ b/goal_src/engine/data/res.gc @@ -442,33 +442,7 @@ This is updated from the entity system used in Crash 2, which had most of these default ) -(defmacro res-lump-data (lump name type &key (tag-ptr (the-as (pointer res-tag) #f)) &key (time -1000000000.0)) - "Helper macro to get data from a res-lump without interpolation." - `(the-as ,type ((method-of-type res-lump get-property-data) - ,lump - ,name - 'interp - ,time - (the-as pointer #f) - ,tag-ptr - *res-static-buf* - ) - ) - ) -(defmacro res-lump-data-exact (lump name type &key (tag-ptr (the-as (pointer res-tag) #f))) - "Helper macro to get start of data from a res-lump." - `(the-as ,type ((method-of-type res-lump get-property-data) - ,lump - ,name - 'exact - 0.0 - (the-as pointer #f) - ,tag-ptr - *res-static-buf* - ) - ) - ) (defmethod get-property-struct res-lump ((obj res-lump) (name symbol) (mode symbol) (time float) (default structure) (tag-addr (pointer res-tag)) (buf-addr pointer)) "Returns a given struct property's value at a specific time stamp, or default on error. @@ -499,31 +473,7 @@ This is updated from the entity system used in Crash 2, which had most of these default ) -(defmacro res-lump-struct (lump name type &key (tag-ptr (the-as (pointer res-tag) #f))) - `(the-as ,type ((method-of-type res-lump get-property-struct) - ,lump - ,name - 'interp - -1000000000.0 - (the-as structure #f) - ,tag-ptr - *res-static-buf* - ) - ) - ) -(defmacro res-lump-struct-exact (lump name type &key (tag-ptr (the-as (pointer res-tag) #f))) - `(the-as ,type ((method-of-type res-lump get-property-struct) - ,lump - ,name - 'exact - 0.0 - (the-as structure #f) - ,tag-ptr - *res-static-buf* - ) - ) - ) (defmethod get-property-value res-lump ((obj res-lump) (name symbol) (mode symbol) (time float) (default uint128) (tag-addr (pointer res-tag)) (buf-addr pointer)) "Returns a given value property's value at a specific time stamp, or default on error. @@ -578,19 +528,6 @@ This is updated from the entity system used in Crash 2, which had most of these default ) -(defmacro res-lump-value (lump name type &key (tag-ptr (the-as (pointer res-tag) #f))) - "Helper macro to get a value from a res-lump with no interpolation." - `(the-as ,type ((method-of-type res-lump get-property-value) - ,lump - ,name - 'interp - -1000000000.0 - (the-as uint128 0) - ,tag-ptr - *res-static-buf* - ) - ) - ) (defmethod get-property-value-float res-lump ((obj res-lump) (name symbol) (mode symbol) (time float) (default float) (tag-addr (pointer res-tag)) (buf-addr pointer)) "same as get-property-value but float type is checked first?" @@ -641,19 +578,6 @@ This is updated from the entity system used in Crash 2, which had most of these default ) -(defmacro res-lump-float (lump name &key (tag-ptr (the-as (pointer res-tag) #f)) &key (default 0.0)) - "Helper macro to get a float from a res-lump with no interpolation." - `((method-of-type res-lump get-property-value-float) - ,lump - ,name - 'interp - -1000000000.0 - ,default - ,tag-ptr - *res-static-buf* - ) - ) - (defmethod sort! res-lump ((obj res-lump)) "Sort all tags based on name, then key-frame." @@ -999,3 +923,89 @@ This is updated from the entity system used in Crash 2, which had most of these (define *res-static-buf* (malloc 'global 128)) +;; There are four common types of lookup: +;; data. This is something like (pointer int32) or (inline-array vector), it should have a size. +;; struct. This will get a GOAL struct or basic. Like a string. +;; value. This will get a value. Possibly even a 128-bit value, though this does not appear to work properly. +;; float. This will get a float. If the value stored is an int, it will converted to a float. + +(defmacro res-lump-data (lump name type &key (tag-ptr (the-as (pointer res-tag) #f)) &key (time -1000000000.0)) + "Helper macro to get data from a res-lump without interpolation." + `(the-as ,type ((method-of-type res-lump get-property-data) + ,lump + ,name + 'interp + ,time + (the-as pointer #f) + ,tag-ptr + *res-static-buf* + ) + ) + ) + +(defmacro res-lump-data-exact (lump name type &key (tag-ptr (the-as (pointer res-tag) #f))) + "Helper macro to get start of data from a res-lump." + `(the-as ,type ((method-of-type res-lump get-property-data) + ,lump + ,name + 'exact + 0.0 + (the-as pointer #f) + ,tag-ptr + *res-static-buf* + ) + ) + ) + +(defmacro res-lump-struct (lump name type &key (tag-ptr (the-as (pointer res-tag) #f))) + `(the-as ,type ((method-of-type res-lump get-property-struct) + ,lump + ,name + 'interp + -1000000000.0 + (the-as structure #f) + ,tag-ptr + *res-static-buf* + ) + ) + ) + +(defmacro res-lump-struct-exact (lump name type &key (tag-ptr (the-as (pointer res-tag) #f))) + `(the-as ,type ((method-of-type res-lump get-property-struct) + ,lump + ,name + 'exact + 0.0 + (the-as structure #f) + ,tag-ptr + *res-static-buf* + ) + ) + ) + +(defmacro res-lump-value (lump name type &key (tag-ptr (the-as (pointer res-tag) #f)) &key (default (the-as uint128 0))) + "Helper macro to get a value from a res-lump with no interpolation." + `(the-as ,type ((method-of-type res-lump get-property-value) + ,lump + ,name + 'interp + -1000000000.0 + ,default + ,tag-ptr + *res-static-buf* + ) + ) + ) + +(defmacro res-lump-float (lump name &key (tag-ptr (the-as (pointer res-tag) #f)) &key (default 0.0)) + "Helper macro to get a float from a res-lump with no interpolation." + `((method-of-type res-lump get-property-value-float) + ,lump + ,name + 'interp + -1000000000.0 + ,default + ,tag-ptr + *res-static-buf* + ) + ) \ No newline at end of file diff --git a/goal_src/engine/entity/actor-link-h.gc b/goal_src/engine/entity/actor-link-h.gc index 9e1de1618..fdc9ac0e6 100644 --- a/goal_src/engine/entity/actor-link-h.gc +++ b/goal_src/engine/entity/actor-link-h.gc @@ -27,20 +27,7 @@ (set! sv-16 (new 'static 'res-tag)) ;; look up the reference - (let ((v1-1 (the-as (pointer uint32) - (get-property-data - lump - name - 'interp - -1000000000.0 - (the-as pointer #f) - (& sv-16) - *res-static-buf* - ) - ) - ) - ) - + (let ((v1-1 (res-lump-data lump name (pointer uint32) :tag-ptr (& sv-16)))) (the-as entity-actor ;; check in range, and lookup succesful (when (and v1-1 (< idx (the-as int (-> sv-16 elt-count)))) @@ -59,15 +46,7 @@ This works on more than just next/prev." (local-vars (tag res-tag)) (set! tag (new 'static 'res-tag)) - (if (get-property-data - res - name - 'interp - -1000000000.0 - (the-as pointer #f) - (& tag) - *res-static-buf* - ) + (if (res-lump-data res name pointer :tag-ptr (& tag)) (the-as int (-> tag elt-count)) 0 ) diff --git a/goal_src/engine/nav/navigate-h.gc b/goal_src/engine/nav/navigate-h.gc index 2734caff1..f43e5edd4 100644 --- a/goal_src/engine/nav/navigate-h.gc +++ b/goal_src/engine/nav/navigate-h.gc @@ -297,16 +297,7 @@ ;; now construct the engine, looking up the size from the res-lump. (set! (-> entity-nav-mesh user-list) (new 'process-level-heap 'engine 'nav-engine - (the int ((method-of-type res-lump get-property-value) - (the-as res-lump ent) - 'nav-max-users - 'interp - -1000000000.0 - (the-as uint128 32) - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) + (res-lump-value ent 'nav-max-users int :default (the-as uint128 32)) ) ) @@ -346,54 +337,34 @@ ) ) -;; todo fix up this (defmethod new nav-control ((allocation symbol) (type-to-make type) (shape collide-shape) (sphere-count int) (nearest-y-threshold-default float)) - (with-pp - (let ((obj (object-new allocation type-to-make - (the-as int (+ (-> type-to-make size) (* sphere-count 16))) - ) - ) - ) - ;; check for alloc fail. - (when (zero? obj) - (go process-drawable-art-error "memory") - (set! obj (the-as nav-control 0)) - (goto cfg-4) - ) - ;; set up fields - (set! (-> obj max-spheres) sphere-count) - (set! (-> obj flags) (nav-control-flags bit8 bit13)) - ;; connect things - (set! (-> obj mesh) (nav-mesh-connect (-> shape process) shape obj)) - - ;; get the nearest-y-threshold - (let ((ent (-> shape process entity))) - (set! (-> obj nearest-y-threshold) - ((method-of-type res-lump get-property-value-float) - (the-as res-lump ent) - 'nearest-y-threshold - 'interp - -1000000000.0 - nearest-y-threshold-default - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - ) - (set! (-> obj shape) shape) - (set! (-> obj process) (-> shape process)) - (set! (-> obj gap-event) #f) - (set! (-> obj current-poly) #f) - (set! (-> obj next-poly) #f) - (set! (-> obj target-poly) #f) - (set! (-> obj user-poly) #f) - (set! (-> obj portal 0) #f) - (set! (-> obj portal 1) #f) - (set! (-> obj nav-cull-radius) 40960.0) - (label cfg-4) - (the-as nav-control obj) - ) + (let ((obj (object-new allocation type-to-make (the-as int (+ (-> type-to-make size) (* sphere-count 16)))))) + (when (zero? obj) + (go process-drawable-art-error "memory") + (set! obj (the-as nav-control 0)) + (goto cfg-4) ) + (set! (-> obj max-spheres) sphere-count) + (set! (-> obj flags) (nav-control-flags bit8 bit13)) + (set! (-> obj mesh) (nav-mesh-connect (-> shape process) shape obj)) + (let ((ent (-> shape process entity))) + (set! (-> obj nearest-y-threshold) + (res-lump-float ent 'nearest-y-threshold :default nearest-y-threshold-default) + ) + ) + (set! (-> obj shape) shape) + (set! (-> obj process) (-> shape process)) + (set! (-> obj gap-event) #f) + (set! (-> obj current-poly) #f) + (set! (-> obj next-poly) #f) + (set! (-> obj target-poly) #f) + (set! (-> obj user-poly) #f) + (set! (-> obj portal 0) #f) + (set! (-> obj portal 1) #f) + (set! (-> obj nav-cull-radius) 40960.0) + (label cfg-4) + (the-as nav-control obj) + ) ) @@ -425,17 +396,6 @@ the res-lump." (the-as symbol - (or (-> arg0 nav-mesh) ;; has it loaded already - ;; has it in the res-lump - ((method-of-type res-lump get-property-struct) - arg0 - 'nav-mesh-actor - 'interp - -1000000000.0 - #f - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) + (or (-> arg0 nav-mesh) (res-lump-struct arg0 'nav-mesh-actor structure)) ) ) diff --git a/goal_src/engine/nav/path-h.gc b/goal_src/engine/nav/path-h.gc index 0fd853c43..24be19b08 100644 --- a/goal_src/engine/nav/path-h.gc +++ b/goal_src/engine/nav/path-h.gc @@ -80,18 +80,7 @@ ;; look up the curve data (set! tag (new 'static 'res-tag)) - (let ((data ((method-of-type res-lump get-property-data) - (the-as res-lump ent) - name - 'interp - time - (the-as pointer #f) - (& tag) - *res-static-buf* - ) - ) - ) - + (let ((data (res-lump-data ent name pointer :tag-ptr (& tag) :time time))) (cond (data ;; success, we got some data diff --git a/goal_src/engine/util/sync-info.gc b/goal_src/engine/util/sync-info.gc index 792dc0e29..9a5e14a30 100644 --- a/goal_src/engine/util/sync-info.gc +++ b/goal_src/engine/util/sync-info.gc @@ -106,17 +106,7 @@ the specified defaults." (local-vars (sv-16 res-tag)) (set! sv-16 (new 'static 'res-tag)) - (let ((v1-1 ((method-of-type res-lump get-property-data) - (-> proc entity) - 'sync - 'interp - -1000000000.0 - (the-as pointer #f) - (& sv-16) - *res-static-buf* - ) - ) - ) + (let ((v1-1 (res-lump-data (-> proc entity) 'sync pointer :tag-ptr (& sv-16)))) (cond (v1-1 ;; res lookup succeeded, we should have two values: a period (not yet in seconds) and a phase. @@ -143,17 +133,7 @@ If res lookup totally fails, will return #f and use all defaults." (local-vars (sv-16 res-tag)) (set! sv-16 (new 'static 'res-tag)) - (let ((v1-1 ((method-of-type res-lump get-property-data) - (-> proc entity) - 'sync - 'interp - -1000000000.0 - (the-as pointer #f) - (& sv-16) - *res-static-buf* - ) - ) - ) + (let ((v1-1 (res-lump-data (-> proc entity) 'sync pointer :tag-ptr (& sv-16)))) (cond (v1-1 ;; we may not get all the parameters @@ -187,17 +167,7 @@ "Load and setup a sync-info-paused." (local-vars (sv-16 res-tag)) (set! sv-16 (new 'static 'res-tag)) - (let ((v1-1 ((method-of-type res-lump get-property-data) - (-> proc entity) - 'sync - 'interp - -1000000000.0 - (the-as pointer #f) - (& sv-16) - *res-static-buf* - ) - ) - ) + (let ((v1-1 (res-lump-data (-> proc entity) 'sync pointer :tag-ptr (& sv-16)))) (cond (v1-1 (if (>= (-> sv-16 elt-count) (the-as uint 4)) diff --git a/goal_src/game.gp b/goal_src/game.gp index e2bced669..ff715948d 100644 --- a/goal_src/game.gp +++ b/goal_src/game.gp @@ -210,6 +210,7 @@ "out/iso/KERNEL.CGO" "out/iso/GAME.CGO" "out/iso/VI1.DGO" + "out/iso/VI3.DGO" ) @@ -287,6 +288,51 @@ "village1-vis" ) +;;;;;;;;;;;;;;;;;;;;; +;; Village 3 +;;;;;;;;;;;;;;;;;;;;; + +;; the definition for the DGO file. +(cgo "VI3.DGO""vi3.gd") + +;; the code +(goal-src-sequence + "levels/" + :deps ;; no idea what these depend on, make it depend on the whole engine + ("out/obj/default-menu.o") + "village3/village3-part.gc" + "village3/village3-obs.gc" + "village3/minecart.gc" + "village3/miners.gc" + "village3/assistant-village3.gc" + "village3/sage-village3.gc" + ) + +(copy-textures 1208 1210 1209 1194) + +(copy-gos + "assistant-village3-ag" + "cavegem-ag" + "evilbro-village3-ag" + "evilsis-village3-ag" + "gondola-ag" + "gondolacables-ag" + "lavaspoutdrip-ag" + "medres-finalboss-ag" + "medres-ogre-ag" + "medres-ogre2-ag" + "medres-ogre3-ag" + "minecartsteel-ag" + "minershort-ag" + "minertall-ag" + "oracle-ag-VI3" + "pistons-ag" + "sage-village3-ag" + "vil3-bridge-36-ag" + "village-cam-ag-VI3" + "water-anim-village3-ag" + "village3-vis" + ) ;;;;;;;;;;;;;;;;;;;;; ;; Game Engine Code diff --git a/goal_src/levels/common/basebutton.gc b/goal_src/levels/common/basebutton.gc index d4fa9dfac..9369d6685 100644 --- a/goal_src/levels/common/basebutton.gc +++ b/goal_src/levels/common/basebutton.gc @@ -607,14 +607,12 @@ (set! (-> obj button-id) -1) (let ((v1-4 - ((method-of-type res-lump get-property-value) + (res-lump-value (-> obj entity) 'extra-id - 'interp - -1000000000.0 + uint128 + :default (the-as uint128 -1) - (the-as (pointer res-tag) #f) - *res-static-buf* ) ) ) @@ -624,24 +622,8 @@ ) (when (or - (get-property-struct - arg0 - 'next-actor - 'interp - -1000000000.0 - #f - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - (get-property-struct - arg0 - 'prev-actor - 'interp - -1000000000.0 - #f - (the-as (pointer res-tag) #f) - *res-static-buf* - ) + (res-lump-struct arg0 'next-actor structure) + (res-lump-struct arg0 'prev-actor structure) ) (set! (-> obj link) (new 'process 'actor-link-info obj)) (if (< (-> obj button-id) 0) @@ -661,18 +643,7 @@ (set! (-> obj down?) v1-16) ) (set! (-> obj notify-actor) (entity-actor-lookup arg0 'alt-actor 0)) - (set! - (-> obj timeout) - (get-property-value-float - arg0 - 'timeout - 'interp - -1000000000.0 - 0.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) + (set! (-> obj timeout) (res-lump-float arg0 'timeout)) (if (not (-> obj spawned-by-other?)) (nav-mesh-connect obj (-> obj root-override) (the-as nav-control #f)) ) diff --git a/goal_src/levels/common/water-anim.gc b/goal_src/levels/common/water-anim.gc index 855143925..06d7382fc 100644 --- a/goal_src/levels/common/water-anim.gc +++ b/goal_src/levels/common/water-anim.gc @@ -1838,62 +1838,30 @@ ;; definition for method 25 of type water-anim ;; Used lq/sq (defmethod TODO-RENAME-25 water-anim ((obj water-anim)) - (local-vars (sv-16 int)) + (local-vars (sv-16 res-tag)) (set! (-> obj play-ambient-sound?) #t) - (set! - (-> obj look) - (the-as - int - ((method-of-type res-lump get-property-value) - (-> obj entity) - 'look - 'interp - -1000000000.0 - (the-as uint128 -1) - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) + (set! (-> obj look) + (res-lump-value (-> obj entity) 'look int :default (the-as uint128 -1)) ) - (set! sv-16 0) + (set! sv-16 (new 'static 'res-tag)) (let ((v1-3 - (the-as - object - ((method-of-type res-lump get-property-data) - (-> obj entity) - 'trans-offset - 'interp - -1000000000.0 - (the-as pointer #f) - (the-as (pointer res-tag) (& sv-16)) - *res-static-buf* - ) + (res-lump-data + (-> obj entity) + 'trans-offset + (pointer float) + :tag-ptr + (& sv-16) ) ) ) - (when (the-as pointer v1-3) - (+! (-> obj root trans x) (-> (the-as transform v1-3) trans x)) - (+! (-> obj root trans y) (-> (the-as transform v1-3) trans y)) - (set! - (-> (the-as transform (-> obj root)) rot y) - (+ (-> obj root trans z) (-> (the-as transform v1-3) trans z)) - ) + (when v1-3 + (+! (-> obj root trans x) (-> v1-3 0)) + (+! (-> obj root trans y) (-> v1-3 1)) + (+! (-> obj root trans z) (-> v1-3 2)) ) ) - (let - ((f0-6 - ((method-of-type res-lump get-property-value-float) - (-> obj entity) - 'rotoffset - 'interp - -1000000000.0 - 0.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - ) + (let ((f0-6 (res-lump-float (-> obj entity) 'rotoffset))) (if (!= f0-6 0.0) (quaternion-rotate-y! (-> obj root quat) (-> obj root quat) f0-6) ) diff --git a/goal_src/levels/misty/misty-warehouse.gc b/goal_src/levels/misty/misty-warehouse.gc index 070ea66a3..dc2782dda 100644 --- a/goal_src/levels/misty/misty-warehouse.gc +++ b/goal_src/levels/misty/misty-warehouse.gc @@ -260,15 +260,7 @@ (set! (-> obj anim-limit) (* - (get-property-value-float - arg0 - 'distance - 'interp - -1000000000.0 - 1.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) + (res-lump-float arg0 'distance :default 1.0) (the float (+ diff --git a/goal_src/levels/misty/mud.gc b/goal_src/levels/misty/mud.gc index 9053353d7..c0b55ccc5 100644 --- a/goal_src/levels/misty/mud.gc +++ b/goal_src/levels/misty/mud.gc @@ -61,29 +61,12 @@ (set! (-> gp-0 waveform) ripple-for-mud) (let ((v1-9 - (the-as - object - ((method-of-type res-lump get-property-data) - (-> obj entity) - 'water-anim-fade-dist - 'interp - -1000000000.0 - (the-as pointer #f) - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) + (res-lump-data (-> obj entity) 'water-anim-fade-dist (pointer float)) ) ) - (when (the-as pointer v1-9) - (set! - (-> gp-0 close-fade-dist) - (-> (the-as ripple-control v1-9) global-scale) - ) - (set! - (-> gp-0 far-fade-dist) - (-> (the-as ripple-control v1-9) last-frame-scale) - ) + (when v1-9 + (set! (-> gp-0 close-fade-dist) (-> v1-9 0)) + (set! (-> gp-0 far-fade-dist) (-> v1-9 1)) ) ) (case (-> obj look) diff --git a/goal_src/levels/village_common/oracle.gc b/goal_src/levels/village_common/oracle.gc index 3c4feba16..f52bad8ea 100644 --- a/goal_src/levels/village_common/oracle.gc +++ b/goal_src/levels/village_common/oracle.gc @@ -623,21 +623,7 @@ ) ) (set! (-> obj first-task) (the-as uint (-> arg0 extra perm task))) - (set! - (-> obj second-task) - (the-as - uint - (get-property-value - arg0 - 'alt-task - 'interp - -1000000000.0 - (the-as uint128 0) - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - ) + (set! (-> obj second-task) (res-lump-value arg0 'alt-task uint)) (set! (-> obj tasks) (get-task-control (the-as game-task (-> obj first-task))) diff --git a/test/decompiler/reference/decompiler-macros.gc b/test/decompiler/reference/decompiler-macros.gc index d0fd7ac95..8bc82d7cb 100644 --- a/test/decompiler/reference/decompiler-macros.gc +++ b/test/decompiler/reference/decompiler-macros.gc @@ -439,3 +439,58 @@ (defmacro .sra (result in sa) `(set! ,result (sext32 (sar (logand #xffffffff (the-as int ,in)) ,sa))) ) + +(defmacro res-lump-float (lump name &key (tag-ptr (the-as (pointer res-tag) #f)) &key (default 0.0)) + "Helper macro to get a float from a res-lump with no interpolation." + `((method-of-type res-lump get-property-value-float) + ,lump + ,name + 'interp + -1000000000.0 + ,default + ,tag-ptr + *res-static-buf* + ) + ) + +(defmacro res-lump-data (lump name type &key (tag-ptr (the-as (pointer res-tag) #f)) &key (time -1000000000.0)) + "Helper macro to get data from a res-lump without interpolation." + `(the-as ,type ((method-of-type res-lump get-property-data) + ,lump + ,name + 'interp + ,time + (the-as pointer #f) + ,tag-ptr + *res-static-buf* + ) + ) + ) + + +(defmacro res-lump-struct (lump name type &key (tag-ptr (the-as (pointer res-tag) #f))) + `(the-as ,type ((method-of-type res-lump get-property-struct) + ,lump + ,name + 'interp + -1000000000.0 + (the-as structure #f) + ,tag-ptr + *res-static-buf* + ) + ) + ) + +(defmacro res-lump-value (lump name type &key (tag-ptr (the-as (pointer res-tag) #f)) &key (default (the-as uint128 0))) + "Helper macro to get a value from a res-lump with no interpolation." + `(the-as ,type ((method-of-type res-lump get-property-value) + ,lump + ,name + 'interp + -1000000000.0 + ,default + ,tag-ptr + *res-static-buf* + ) + ) + ) \ No newline at end of file diff --git a/test/decompiler/reference/engine/camera/camera_REF.gc b/test/decompiler/reference/engine/camera/camera_REF.gc index e7e9d297d..788202988 100644 --- a/test/decompiler/reference/engine/camera/camera_REF.gc +++ b/test/decompiler/reference/engine/camera/camera_REF.gc @@ -18,18 +18,7 @@ (set! s3-0 (-> arg0 quat)) ) (else - (set! - s3-0 - ((method-of-type res-lump get-property-struct) - arg0 - arg2 - 'interp - -1000000000.0 - #f - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) + (set! s3-0 (res-lump-struct arg0 arg2 structure)) ) ) (let ((s2-0 (method-of-type res-lump get-property-struct))) @@ -66,21 +55,10 @@ ;; definition for function cam-slave-get-flags (defun cam-slave-get-flags ((arg0 entity) (arg1 symbol)) - (let - ((gp-0 - ((method-of-type res-lump get-property-value) - arg0 - arg1 - 'interp - -1000000000.0 - (the-as uint128 0) - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - (s3-0 (method-of-type res-lump get-property-value)) - (s2-0 arg0) - ) + (let ((gp-0 (res-lump-value arg0 arg1 uint128)) + (s3-0 (method-of-type res-lump get-property-value)) + (s2-0 arg0) + ) (format (clear *res-key-string*) "~S~S" arg1 '-on) (let ((s3-1 @@ -118,20 +96,9 @@ ;; definition for function cam-slave-get-float (defun cam-slave-get-float ((arg0 entity) (arg1 symbol) (arg2 float)) - (let - ((f30-0 - ((method-of-type res-lump get-property-value-float) - arg0 - arg1 - 'interp - -1000000000.0 - arg2 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - (s4-0 (method-of-type res-lump get-property-value-float)) - ) + (let ((f30-0 (res-lump-float arg0 arg1 :default arg2)) + (s4-0 (method-of-type res-lump get-property-value-float)) + ) (format (clear *res-key-string*) "~S~S" arg1 '-offset) (+ f30-0 @@ -150,20 +117,9 @@ ;; definition for function cam-slave-get-fov (defun cam-slave-get-fov ((arg0 entity)) - (let - ((f30-0 - ((method-of-type res-lump get-property-value-float) - arg0 - 'fov - 'interp - -1000000000.0 - 0.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - (s5-0 (method-of-type res-lump get-property-value-float)) - ) + (let ((f30-0 (res-lump-float arg0 'fov)) + (s5-0 (method-of-type res-lump get-property-value-float)) + ) (format (clear *res-key-string*) "~S~S" 'fov '-offset) (let ((f0-0 @@ -188,20 +144,9 @@ ;; definition for function cam-slave-get-intro-step (defun cam-slave-get-intro-step ((arg0 entity)) - (let - ((f30-0 - ((method-of-type res-lump get-property-value-float) - arg0 - 'intro-time - 'interp - -1000000000.0 - 0.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - (s5-0 (method-of-type res-lump get-property-value-float)) - ) + (let ((f30-0 (res-lump-float arg0 'intro-time)) + (s5-0 (method-of-type res-lump get-property-value-float)) + ) (format (clear *res-key-string*) "~S~S" 'intro-time '-offset) (let ((f0-1 @@ -229,20 +174,9 @@ ;; definition for function cam-slave-get-interp-time (defun cam-slave-get-interp-time ((arg0 entity)) - (let - ((f30-0 - ((method-of-type res-lump get-property-value-float) - arg0 - 'interpTime - 'interp - -1000000000.0 - 0.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - (s5-0 (method-of-type res-lump get-property-value-float)) - ) + (let ((f30-0 (res-lump-float arg0 'interpTime)) + (s5-0 (method-of-type res-lump get-property-value-float)) + ) (format (clear *res-key-string*) "~S~S" 'interpTime '-offset) (let ((f0-1 @@ -311,26 +245,10 @@ ((not arg0) (the-as state #f) ) - (((method-of-type res-lump get-property-struct) - arg0 - 'pivot - 'interp - -1000000000.0 - #f - (the-as (pointer res-tag) #f) - *res-static-buf* - ) + ((res-lump-struct arg0 'pivot structure) cam-circular ) - (((method-of-type res-lump get-property-struct) - arg0 - 'align - 'interp - -1000000000.0 - #f - (the-as (pointer res-tag) #f) - *res-static-buf* - ) + ((res-lump-struct arg0 'align structure) cam-standoff-read-entity ) ((get-curve-data! arg0 s5-0 'campath 'campath-k -1000000000.0) @@ -469,20 +387,9 @@ (-> obj flags) (the-as uint (cam-slave-get-flags arg1 (string->symbol *res-key-string*))) ) - (let - ((s3-2 - ((method-of-type res-lump get-property-data) - arg1 - arg0 - 'interp - -1000000000.0 - (the-as pointer #f) - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - (s0-1 (method-of-type res-lump get-property-struct)) - ) + (let ((s3-2 (res-lump-data arg1 arg0 pointer)) + (s0-1 (method-of-type res-lump get-property-struct)) + ) (set! sv-32 format) (let ((a0-7 (clear *res-key-string*)) (a1-4 "~S~S") diff --git a/test/decompiler/reference/engine/entity/actor-link-h_REF.gc b/test/decompiler/reference/engine/entity/actor-link-h_REF.gc index dfb62a52e..a3cbb0896 100644 --- a/test/decompiler/reference/engine/entity/actor-link-h_REF.gc +++ b/test/decompiler/reference/engine/entity/actor-link-h_REF.gc @@ -7,22 +7,7 @@ (defun entity-actor-lookup ((lump res-lump) (name symbol) (idx int)) (local-vars (sv-16 res-tag)) (set! sv-16 (new 'static 'res-tag)) - (let - ((v1-1 - (the-as - (pointer uint32) - (get-property-data - lump - name - 'interp - -1000000000.0 - (the-as pointer #f) - (& sv-16) - *res-static-buf* - ) - ) - ) - ) + (let ((v1-1 (res-lump-data lump name (pointer uint32) :tag-ptr (& sv-16)))) (the-as entity-actor (when (and v1-1 (< idx (the-as int (-> sv-16 elt-count)))) @@ -43,16 +28,7 @@ (defun entity-actor-count ((res res-lump) (name symbol)) (local-vars (tag res-tag)) (set! tag (new 'static 'res-tag)) - (if - (get-property-data - res - name - 'interp - -1000000000.0 - (the-as pointer #f) - (& tag) - *res-static-buf* - ) + (if (res-lump-data res name pointer :tag-ptr (& tag)) (the-as int (-> tag elt-count)) 0 ) diff --git a/test/decompiler/reference/engine/game/effect-control-h_REF.gc b/test/decompiler/reference/engine/game/effect-control-h_REF.gc index 3a1f0fcbe..7b8e1d88e 100644 --- a/test/decompiler/reference/engine/game/effect-control-h_REF.gc +++ b/test/decompiler/reference/engine/game/effect-control-h_REF.gc @@ -46,15 +46,7 @@ effect-control ((allocation symbol) (type-to-make type) (arg0 process-drawable)) (cond - (((method-of-type res-lump get-property-struct) - (-> arg0 draw jgeo extra) - 'effect-name - 'interp - -1000000000.0 - #f - (the-as (pointer res-tag) #f) - *res-static-buf* - ) + ((res-lump-struct (-> arg0 draw jgeo extra) 'effect-name structure) (let ((v0-1 (object-new allocation type-to-make (the-as int (-> type-to-make size))) diff --git a/test/decompiler/reference/engine/game/fact-h_REF.gc b/test/decompiler/reference/engine/game/fact-h_REF.gc index bc396e1b4..181947c99 100644 --- a/test/decompiler/reference/engine/game/fact-h_REF.gc +++ b/test/decompiler/reference/engine/game/fact-h_REF.gc @@ -258,18 +258,7 @@ (set! tag (new 'static 'res-tag)) (let ((v1-6 - (the-as - (pointer int32) - ((method-of-type res-lump get-property-data) - ent - 'eco-info - 'interp - 0.0 - (the-as pointer #f) - (& tag) - *res-static-buf* - ) - ) + (res-lump-data ent 'eco-info (pointer int32) :tag-ptr (& tag) :time 0.0) ) ) (cond @@ -295,45 +284,11 @@ ) ) ) - (set! - (-> obj options) - (the-as - uint - ((method-of-type res-lump get-property-value) - ent - 'options - 'interp - -1000000000.0 - (the-as uint128 0) - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - ) + (set! (-> obj options) (res-lump-value ent 'options uint)) (if (logtest? #x80200 (-> obj options)) (set! (-> obj fade-time) - (the-as - uint - (the - int - (* - 300.0 - (the-as - float - ((method-of-type res-lump get-property-value-float) - ent - 'timeout - 'interp - -1000000000.0 - 0.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - ) - ) - ) + (the-as uint (the int (* 300.0 (res-lump-float ent 'timeout)))) ) ) ) @@ -369,110 +324,24 @@ ) ) (let ((entity (-> obj process entity))) - (set! - (-> obj speed) - (the-as - float - ((method-of-type res-lump get-property-value-float) - entity - 'speed - 'interp - -1000000000.0 - 1.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - ) + (set! (-> obj speed) (res-lump-float entity 'speed :default 1.0)) (set! (-> obj idle-distance) - (the-as - float - ((method-of-type res-lump get-property-value-float) - entity - 'idle-distance - 'interp - -1000000000.0 - 327680.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) + (res-lump-float entity 'idle-distance :default 327680.0) ) (set! (-> obj notice-top) - (the-as - float - ((method-of-type res-lump get-property-value-float) - entity - 'notice-top - 'interp - -1000000000.0 - 4096000.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) + (res-lump-float entity 'notice-top :default 4096000.0) ) (set! (-> obj notice-bottom) - (the-as - float - ((method-of-type res-lump get-property-value-float) - entity - 'notice-bottom - 'interp - -1000000000.0 - 4096000.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - ) - (set! - (-> obj cam-horz) - (the-as - float - ((method-of-type res-lump get-property-value-float) - entity - 'cam-horz - 'interp - -1000000000.0 - 0.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - ) - (set! - (-> obj cam-vert) - (the-as - float - ((method-of-type res-lump get-property-value-float) - entity - 'cam-vert - 'interp - -1000000000.0 - 0.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) + (res-lump-float entity 'notice-bottom :default 4096000.0) ) + (set! (-> obj cam-horz) (res-lump-float entity 'cam-horz)) + (set! (-> obj cam-vert) (res-lump-float entity 'cam-vert)) (set! (-> obj cam-notice-dist) - (the-as - float - ((method-of-type res-lump get-property-value-float) - entity - 'cam-notice-dist - 'interp - -1000000000.0 - -4096.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) + (res-lump-float entity 'cam-notice-dist :default -4096.0) ) ) obj diff --git a/test/decompiler/reference/engine/nav/navigate-h_REF.gc b/test/decompiler/reference/engine/nav/navigate-h_REF.gc index 13972e2bf..9712a401d 100644 --- a/test/decompiler/reference/engine/nav/navigate-h_REF.gc +++ b/test/decompiler/reference/engine/nav/navigate-h_REF.gc @@ -481,14 +481,12 @@ (set! sv-32 'nav-engine) (let ((a3-1 - ((method-of-type res-lump get-property-value) + (res-lump-value ent 'nav-max-users - 'interp - -1000000000.0 + uint128 + :default (the-as uint128 32) - (the-as (pointer res-tag) #f) - *res-static-buf* ) ) ) @@ -561,14 +559,11 @@ (let ((ent (-> shape process entity))) (set! (-> obj nearest-y-threshold) - ((method-of-type res-lump get-property-value-float) + (res-lump-float ent 'nearest-y-threshold - 'interp - -1000000000.0 + :default nearest-y-threshold-default - (the-as (pointer res-tag) #f) - *res-static-buf* ) ) ) @@ -615,17 +610,6 @@ (defun has-nav-mesh? ((arg0 entity-actor)) (the-as symbol - (or - (-> arg0 nav-mesh) - ((method-of-type res-lump get-property-struct) - arg0 - 'nav-mesh-actor - 'interp - -1000000000.0 - #f - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) + (or (-> arg0 nav-mesh) (res-lump-struct arg0 'nav-mesh-actor structure)) ) ) diff --git a/test/decompiler/reference/engine/nav/path-h_REF.gc b/test/decompiler/reference/engine/nav/path-h_REF.gc index 417fd6123..dd33c5ce7 100644 --- a/test/decompiler/reference/engine/nav/path-h_REF.gc +++ b/test/decompiler/reference/engine/nav/path-h_REF.gc @@ -99,19 +99,7 @@ ) ) (set! tag (new 'static 'res-tag)) - (let - ((data - ((method-of-type res-lump get-property-data) - ent - name - 'interp - time - (the-as pointer #f) - (& tag) - *res-static-buf* - ) - ) - ) + (let ((data (res-lump-data ent name pointer :tag-ptr (& tag) :time time))) (cond (data (set! (-> obj cverts) (the-as (inline-array vector) data)) diff --git a/test/decompiler/reference/engine/sound/gsound_REF.gc b/test/decompiler/reference/engine/sound/gsound_REF.gc index f94f833a9..b9546b89f 100644 --- a/test/decompiler/reference/engine/sound/gsound_REF.gc +++ b/test/decompiler/reference/engine/sound/gsound_REF.gc @@ -702,18 +702,7 @@ ) (set! sv-48 - (the-as - (pointer float) - ((method-of-type res-lump get-property-data) - (the-as res-lump arg0) - 'cycle-speed - 'interp - -1000000000.0 - (the-as pointer #f) - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) + (res-lump-data (the-as res-lump arg0) 'cycle-speed (pointer float)) ) (set! sv-16 *ambient-spec*) (set! sv-64 (new 'static 'res-tag)) diff --git a/test/decompiler/reference/engine/util/sync-info_REF.gc b/test/decompiler/reference/engine/util/sync-info_REF.gc index 9bf33ca4a..45c168016 100644 --- a/test/decompiler/reference/engine/util/sync-info_REF.gc +++ b/test/decompiler/reference/engine/util/sync-info_REF.gc @@ -130,18 +130,7 @@ (local-vars (sv-16 res-tag)) (set! sv-16 (new 'static 'res-tag)) (let - ((v1-1 - ((method-of-type res-lump get-property-data) - (-> proc entity) - 'sync - 'interp - -1000000000.0 - (the-as pointer #f) - (& sv-16) - *res-static-buf* - ) - ) - ) + ((v1-1 (res-lump-data (-> proc entity) 'sync pointer :tag-ptr (& sv-16)))) (cond (v1-1 (setup-params! @@ -176,18 +165,7 @@ (local-vars (sv-16 res-tag)) (set! sv-16 (new 'static 'res-tag)) (let - ((v1-1 - ((method-of-type res-lump get-property-data) - (-> proc entity) - 'sync - 'interp - -1000000000.0 - (the-as pointer #f) - (& sv-16) - *res-static-buf* - ) - ) - ) + ((v1-1 (res-lump-data (-> proc entity) 'sync pointer :tag-ptr (& sv-16)))) (cond (v1-1 (if (>= (-> sv-16 elt-count) (the-as uint 4)) @@ -231,18 +209,7 @@ (local-vars (sv-16 res-tag)) (set! sv-16 (new 'static 'res-tag)) (let - ((v1-1 - ((method-of-type res-lump get-property-data) - (-> proc entity) - 'sync - 'interp - -1000000000.0 - (the-as pointer #f) - (& sv-16) - *res-static-buf* - ) - ) - ) + ((v1-1 (res-lump-data (-> proc entity) 'sync pointer :tag-ptr (& sv-16)))) (cond (v1-1 (if (>= (-> sv-16 elt-count) (the-as uint 4)) diff --git a/test/decompiler/reference/levels/common/basebutton_REF.gc b/test/decompiler/reference/levels/common/basebutton_REF.gc index 9f048d54a..46c248246 100644 --- a/test/decompiler/reference/levels/common/basebutton_REF.gc +++ b/test/decompiler/reference/levels/common/basebutton_REF.gc @@ -621,14 +621,12 @@ (set! (-> obj button-id) -1) (let ((v1-4 - ((method-of-type res-lump get-property-value) + (res-lump-value (-> obj entity) 'extra-id - 'interp - -1000000000.0 + uint128 + :default (the-as uint128 -1) - (the-as (pointer res-tag) #f) - *res-static-buf* ) ) ) @@ -638,24 +636,8 @@ ) (when (or - (get-property-struct - arg0 - 'next-actor - 'interp - -1000000000.0 - #f - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - (get-property-struct - arg0 - 'prev-actor - 'interp - -1000000000.0 - #f - (the-as (pointer res-tag) #f) - *res-static-buf* - ) + (res-lump-struct arg0 'next-actor structure) + (res-lump-struct arg0 'prev-actor structure) ) (set! (-> obj link) (new 'process 'actor-link-info obj)) (if (< (-> obj button-id) 0) @@ -675,18 +657,7 @@ (set! (-> obj down?) v1-16) ) (set! (-> obj notify-actor) (entity-actor-lookup arg0 'alt-actor 0)) - (set! - (-> obj timeout) - (get-property-value-float - arg0 - 'timeout - 'interp - -1000000000.0 - 0.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) + (set! (-> obj timeout) (res-lump-float arg0 'timeout)) (if (not (-> obj spawned-by-other?)) (nav-mesh-connect obj (-> obj root-override) (the-as nav-control #f)) ) diff --git a/test/decompiler/reference/levels/common/water-anim_REF.gc b/test/decompiler/reference/levels/common/water-anim_REF.gc index 5dd170a0b..faa2281c3 100644 --- a/test/decompiler/reference/levels/common/water-anim_REF.gc +++ b/test/decompiler/reference/levels/common/water-anim_REF.gc @@ -1847,62 +1847,31 @@ ;; definition for method 25 of type water-anim ;; Used lq/sq (defmethod TODO-RENAME-25 water-anim ((obj water-anim)) - (local-vars (sv-16 int)) + (local-vars (sv-16 res-tag)) (set! (-> obj play-ambient-sound?) #t) (set! (-> obj look) - (the-as - int - ((method-of-type res-lump get-property-value) - (-> obj entity) - 'look - 'interp - -1000000000.0 - (the-as uint128 -1) - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) + (res-lump-value (-> obj entity) 'look int :default (the-as uint128 -1)) ) - (set! sv-16 0) + (set! sv-16 (new 'static 'res-tag)) (let ((v1-3 - (the-as - object - ((method-of-type res-lump get-property-data) - (-> obj entity) - 'trans-offset - 'interp - -1000000000.0 - (the-as pointer #f) - (the-as (pointer res-tag) (& sv-16)) - *res-static-buf* - ) + (res-lump-data + (-> obj entity) + 'trans-offset + (pointer float) + :tag-ptr + (& sv-16) ) ) ) - (when (the-as pointer v1-3) - (+! (-> obj root trans x) (-> (the-as transform v1-3) trans x)) - (+! (-> obj root trans y) (-> (the-as transform v1-3) trans y)) - (set! - (-> (the-as transform (-> obj root)) rot y) - (+ (-> obj root trans z) (-> (the-as transform v1-3) trans z)) - ) + (when v1-3 + (+! (-> obj root trans x) (-> v1-3 0)) + (+! (-> obj root trans y) (-> v1-3 1)) + (+! (-> obj root trans z) (-> v1-3 2)) ) ) - (let - ((f0-6 - ((method-of-type res-lump get-property-value-float) - (-> obj entity) - 'rotoffset - 'interp - -1000000000.0 - 0.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - ) + (let ((f0-6 (res-lump-float (-> obj entity) 'rotoffset))) (if (!= f0-6 0.0) (quaternion-rotate-y! (-> obj root quat) (-> obj root quat) f0-6) ) diff --git a/test/decompiler/reference/levels/misty/misty-warehouse_REF.gc b/test/decompiler/reference/levels/misty/misty-warehouse_REF.gc index 345f76512..b1fdcdeaa 100644 --- a/test/decompiler/reference/levels/misty/misty-warehouse_REF.gc +++ b/test/decompiler/reference/levels/misty/misty-warehouse_REF.gc @@ -257,15 +257,7 @@ (set! (-> obj anim-limit) (* - (get-property-value-float - arg0 - 'distance - 'interp - -1000000000.0 - 1.0 - (the-as (pointer res-tag) #f) - *res-static-buf* - ) + (res-lump-float arg0 'distance :default 1.0) (the float (+ diff --git a/test/decompiler/reference/levels/misty/mud_REF.gc b/test/decompiler/reference/levels/misty/mud_REF.gc index 170f80015..b2d45d38c 100644 --- a/test/decompiler/reference/levels/misty/mud_REF.gc +++ b/test/decompiler/reference/levels/misty/mud_REF.gc @@ -65,29 +65,12 @@ (set! (-> gp-0 waveform) ripple-for-mud) (let ((v1-9 - (the-as - object - ((method-of-type res-lump get-property-data) - (-> obj entity) - 'water-anim-fade-dist - 'interp - -1000000000.0 - (the-as pointer #f) - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) + (res-lump-data (-> obj entity) 'water-anim-fade-dist (pointer float)) ) ) - (when (the-as pointer v1-9) - (set! - (-> gp-0 close-fade-dist) - (-> (the-as ripple-control v1-9) global-scale) - ) - (set! - (-> gp-0 far-fade-dist) - (-> (the-as ripple-control v1-9) last-frame-scale) - ) + (when v1-9 + (set! (-> gp-0 close-fade-dist) (-> v1-9 0)) + (set! (-> gp-0 far-fade-dist) (-> v1-9 1)) ) ) (case (-> obj look) diff --git a/test/decompiler/reference/levels/village_common/oracle_REF.gc b/test/decompiler/reference/levels/village_common/oracle_REF.gc index e48d48e83..e0b759ef0 100644 --- a/test/decompiler/reference/levels/village_common/oracle_REF.gc +++ b/test/decompiler/reference/levels/village_common/oracle_REF.gc @@ -629,21 +629,7 @@ ) ) (set! (-> obj first-task) (the-as uint (-> arg0 extra perm task))) - (set! - (-> obj second-task) - (the-as - uint - (get-property-value - arg0 - 'alt-task - 'interp - -1000000000.0 - (the-as uint128 0) - (the-as (pointer res-tag) #f) - *res-static-buf* - ) - ) - ) + (set! (-> obj second-task) (res-lump-value arg0 'alt-task uint)) (set! (-> obj tasks) (get-task-control (the-as game-task (-> obj first-task)))