[decompiler] handle types without inspects better in all-types (#1735)

* [decompiler] handle types without inspects better in all-types

* move a few types I missed
This commit is contained in:
water111
2022-08-06 12:17:24 -04:00
committed by GitHub
parent a72b6e5e01
commit 666a19dd96
5 changed files with 556 additions and 194 deletions
+12 -1
View File
@@ -201,7 +201,18 @@ class ObjectFileDB {
// symbol-name : type-name
std::unordered_map<std::string, std::string> symbol_types;
std::vector<std::string> type_defs;
struct TypeInfo {
bool from_inspect_method = false; // does this come from an inspect method?
// if from inspect method:
std::string type_definition; // the deftype generated from the inspect method.
// if not from inspect method:
u32 flags = 0;
std::string parent;
};
std::vector<std::string> type_names_in_order;
std::unordered_map<std::string, TypeInfo> type_info;
std::string symbol_defs;
};
void ir2_analyze_all_types(const fs::path& output_file,
+12 -4
View File
@@ -328,9 +328,16 @@ void ObjectFileDB::ir2_analyze_all_types(const fs::path& output_file,
for_each_function_def_order_in_obj(data, [&](Function& f, int seg) {
if (seg != TOP_LEVEL_SEGMENT) {
if (f.is_inspect_method && bad_types.find(f.guessed_name.type_name) == bad_types.end()) {
object_result.type_defs.push_back(
auto deftype_from_inspect =
inspect_inspect_method(f, f.guessed_name.type_name, dts, data.linked_data,
previous_game_ts, ti_cache, object_result));
previous_game_ts, ti_cache, object_result);
bool already_seen = object_result.type_info.count(f.guessed_name.type_name) > 0;
if (!already_seen) {
object_result.type_names_in_order.push_back(f.guessed_name.type_name);
}
auto& info = object_result.type_info[f.guessed_name.type_name];
info.from_inspect_method = true;
info.type_definition = deftype_from_inspect;
} else {
// no inspect methods
// - can we solve custom print methods in a generic way? ie `entity-links`
@@ -351,8 +358,9 @@ void ObjectFileDB::ir2_analyze_all_types(const fs::path& output_file,
result += fmt::format(";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n");
result += fmt::format(";; {:30s} ;;\n", obj.object_name);
result += fmt::format(";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n");
for (auto& t : obj.type_defs) {
result += t;
for (const auto& type_name : obj.type_names_in_order) {
auto& info = obj.type_info.at(type_name);
result += info.type_definition;
result += "\n";
}
result += obj.symbol_defs;
+216 -16
View File
@@ -31,7 +31,9 @@ bool is_set_reg_to_int(AtomicOp* op, Register dst, s64 value) {
return true;
}
bool is_set_reg_to_symbol_value(AtomicOp* op, Register dst, const std::string& value) {
bool is_set_reg_to_symbol_value(AtomicOp* op,
std::optional<Register> dst,
const std::string& value) {
// should be a set reg to int math 2 ir
auto set = dynamic_cast<SetVarOp*>(op);
if (!set) {
@@ -39,9 +41,11 @@ bool is_set_reg_to_symbol_value(AtomicOp* op, Register dst, const std::string& v
}
// destination should be a register
auto dest = set->dst();
if (dst != dest.reg()) {
return false;
if (dst) {
auto dest = set->dst();
if (dst != dest.reg()) {
return false;
}
}
auto math = set->src();
@@ -58,7 +62,7 @@ bool is_set_reg_to_symbol_value(AtomicOp* op, Register dst, const std::string& v
return true;
}
bool is_set_reg_to_symbol_ptr(AtomicOp* op, Register dst, const std::string& value) {
bool is_set_reg_to_symbol_ptr(AtomicOp* op, std::optional<Register> dst, const std::string& value) {
// should be a set reg to int math 2 ir
auto set = dynamic_cast<SetVarOp*>(op);
if (!set) {
@@ -66,9 +70,11 @@ bool is_set_reg_to_symbol_ptr(AtomicOp* op, Register dst, const std::string& val
}
// destination should be a register
auto dest = set->dst();
if (dst != dest.reg()) {
return false;
if (dst) {
auto dest = set->dst();
if (dst != dest.reg()) {
return false;
}
}
auto math = set->src();
@@ -85,6 +91,131 @@ bool is_set_reg_to_symbol_ptr(AtomicOp* op, Register dst, const std::string& val
return true;
}
std::optional<std::string> get_set_reg_to_symbol_ptr(AtomicOp* op, std::optional<Register> dst) {
// should be a set reg to int math 2 ir
auto set = dynamic_cast<SetVarOp*>(op);
if (!set) {
return {};
}
// destination should be a register
if (dst) {
auto dest = set->dst();
if (dst != dest.reg()) {
return {};
}
}
auto math = set->src();
if (SimpleExpression::Kind::IDENTITY != math.kind()) {
return {};
}
auto arg = math.get_arg(0);
if (!arg.is_sym_ptr()) {
return {};
}
return arg.get_str();
}
std::optional<std::string> get_set_reg_to_symbol_value(AtomicOp* op, std::optional<Register> dst) {
// should be a set reg to int math 2 ir
auto set = dynamic_cast<SetVarOp*>(op);
if (!set) {
return {};
}
// destination should be a register
if (dst) {
auto dest = set->dst();
if (dst != dest.reg()) {
return {};
}
}
auto math = set->src();
if (SimpleExpression::Kind::IDENTITY != math.kind()) {
return {};
}
auto arg = math.get_arg(0);
if (!arg.is_sym_val()) {
return {};
}
return arg.get_str();
}
bool is_set_reg_to_load(AtomicOp* op, Register dst, int offset) {
auto lvo = dynamic_cast<LoadVarOp*>(op);
if (!lvo) {
return false;
}
// destination should be a register
auto dest = lvo->get_set_destination();
if (dst != dest.reg()) {
return false;
}
if (lvo->kind() != LoadVarOp::Kind::UNSIGNED) {
return false;
}
if (lvo->size() != 4) {
return false;
}
IR2_RegOffset ro;
if (!get_as_reg_offset(lvo->src(), &ro)) {
return false;
}
if (ro.offset != offset) {
return false;
}
return true;
}
std::optional<u64> get_set_reg_to_u64_load(AtomicOp* op,
Register dst,
const LinkedObjectFile& file) {
auto lvo = dynamic_cast<LoadVarOp*>(op);
if (!lvo) {
return false;
}
// destination should be a register
auto dest = lvo->get_set_destination();
if (dst != dest.reg()) {
return false;
}
if (lvo->src().kind() != SimpleExpression::Kind::IDENTITY) {
return false;
}
if (lvo->size() != 8) {
return false;
}
const auto& s = lvo->src().get_arg(0);
if (!s.is_label()) {
return false;
}
auto lab = file.labels.at(s.label());
auto& low = file.words_by_seg.at(lab.target_segment).at(lab.offset / 4);
auto& hi = file.words_by_seg.at(lab.target_segment).at((lab.offset / 4) + 1);
if (low.kind() != LinkedWord::PLAIN_DATA || hi.kind() != LinkedWord::PLAIN_DATA) {
return false;
}
return ((u64)low.data) | (((u64)hi.data) << 32);
}
std::optional<std::string> get_string_loaded_to_reg(AtomicOp* op,
Register reg,
LinkedObjectFile& file) {
@@ -1275,11 +1406,11 @@ std::string get_label_type_name(LinkedObjectFile& file, std::string label_name)
}
}
std::string inspect_top_level_for_metadata(Function& top_level,
LinkedObjectFile& file,
DecompilerTypeSystem& dts,
DecompilerTypeSystem& previous_game_ts,
ObjectFileDB::PerObjectAllTypeInfo& objectFile) {
void inspect_top_level_for_metadata(Function& top_level,
LinkedObjectFile& file,
DecompilerTypeSystem& dts,
DecompilerTypeSystem& previous_game_ts,
ObjectFileDB::PerObjectAllTypeInfo& objectFile) {
// State as a method:
/*
lui v1, L267 ;; [ 77] (set! gp-0 L267) [] -> [gp: <uninitialized> ]
@@ -1297,9 +1428,10 @@ std::string inspect_top_level_for_metadata(Function& top_level,
sw v1, target-roll(s7) ;; [355] (s.w! target-roll v1-38) [v1: <uninitialized> ] -> []
*/
if (!top_level.ir2.atomic_ops) {
return "";
return;
}
std::string result;
// Check for non-method states
std::string last_seen_label = "";
// TODO - safely increment op number
for (int i = 0; i < top_level.ir2.atomic_ops->ops.size(); i++) {
@@ -1352,7 +1484,75 @@ std::string inspect_top_level_for_metadata(Function& top_level,
objectFile.state_methods[type_match][method_id] = state_name;
}
}
return "";
// Check for types
// if there's no inspect method, we can use just use the call to the type's new method
// to find the type
const auto& env = top_level.ir2.env;
for (int i = 0; i < ((int)top_level.ir2.atomic_ops->ops.size()) - 5; i++) {
// lw v1, type(s7) ;; [ 20] (set! v1-10 type) [] -> [v1: <the etype type> ]
const auto& aop_0 = top_level.ir2.atomic_ops->ops.at(i);
if (!is_set_reg_to_symbol_value(aop_0.get(), {}, "type")) {
continue;
}
fmt::print("got 1\n");
// lwu t9, 16(v1) ;; [ 21] (set! t9-0 (l.wu (+ v1-10 16)))
// ;; [v1: <the etype type> ] -> [t9: (function symbol type int type)
const auto& aop_1 = top_level.ir2.atomic_ops->ops.at(i + 1);
if (!is_set_reg_to_load(aop_1.get(), Register(Reg::GPR, Reg::T9), 16)) {
fmt::print("fail1\n");
continue;
}
// daddiu a0, s7, float-type ;; [ 22] (set! a0-0 'float-type) [] -> [a0: symbol ]
const auto& aop_2 = top_level.ir2.atomic_ops->ops.at(i + 2);
auto type_name = get_set_reg_to_symbol_ptr(aop_2.get(), Register(Reg::GPR, Reg::A0));
if (!type_name) {
fmt::print("fail2\n");
continue;
}
// lw a1, uint32(s7) ;; [ 23] (set! a1-0 uint32) [] -> [a1: <the etype uint32> ]
const auto& aop_3 = top_level.ir2.atomic_ops->ops.at(i + 3);
auto parent_name = get_set_reg_to_symbol_value(aop_3.get(), Register(Reg::GPR, Reg::A1));
if (!parent_name) {
fmt::print("fail3\n");
continue;
}
// ld a2, L117(fp) ;; [ 24] (set! a2-0 (l.d L117)) [] -> [a2: uint ]
const auto& aop_4 = top_level.ir2.atomic_ops->ops.at(i + 4);
auto flags = get_set_reg_to_u64_load(aop_4.get(), Register(Reg::GPR, Reg::A2), file);
if (!flags) {
fmt::print("fail3\n");
continue;
}
// jalr ra, t9 ;; [ 25] (call! a0-0 a1-0 a2-0)
const auto& aop_5 = top_level.ir2.atomic_ops->ops.at(i + 5);
if (!dynamic_cast<CallOp*>(aop_5.get())) {
fmt::print("fial4\n");
continue;
}
if (objectFile.type_info.count(*type_name) == 0) {
objectFile.type_names_in_order.push_back(*type_name);
}
auto& info = objectFile.type_info[*type_name];
if (!info.from_inspect_method) {
// no inspect method! generate a deftype.
info.type_definition = fmt::format(
";; (deftype {} ({})\n"
";; ()\n"
";; :flag-assert #x{:x}\n"
";; )\n",
*type_name, *parent_name, *flags);
}
info.parent = *parent_name;
info.flags = *flags;
}
}
std::string inspect_top_level_symbol_defines(Function& top_level,
+5 -5
View File
@@ -44,11 +44,11 @@ std::string inspect_inspect_method(Function& inspect_method,
TypeInspectorCache& ti_cache,
ObjectFileDB::PerObjectAllTypeInfo& object_file_meta);
std::string inspect_top_level_for_metadata(Function& top_level,
LinkedObjectFile& file,
DecompilerTypeSystem& dts,
DecompilerTypeSystem& previous_game_ts,
ObjectFileDB::PerObjectAllTypeInfo& object_file_meta);
void inspect_top_level_for_metadata(Function& top_level,
LinkedObjectFile& file,
DecompilerTypeSystem& dts,
DecompilerTypeSystem& previous_game_ts,
ObjectFileDB::PerObjectAllTypeInfo& object_file_meta);
std::string inspect_top_level_symbol_defines(Function& top_level,
LinkedObjectFile& file,
+311 -168
View File
@@ -7471,6 +7471,18 @@
)
|#
#|
(deftype drawable-inline-array-node (drawable-inline-array)
()
:method-count-assert 17
:size-assert #x44
:flag-assert #x1100000044
;; Failed to read fields.
(:methods
)
)
|#
#|
(deftype draw-node-dma (structure)
((banka draw-node 32 :offset-assert 4) ;; guessed by decompiler
@@ -7487,6 +7499,16 @@
;; drawable-tree-h ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (deftype drawable-tree (drawable-group)
;; ()
;; :flag-assert #x1100000020
;; )
;; (deftype drawable-tree-array (drawable-group)
;; ()
;; :flag-assert #x1100000020
;; )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; drawable-actor-h ;;
@@ -7504,6 +7526,16 @@
)
|#
;; (deftype drawable-tree-actor (drawable-tree)
;; ()
;; :flag-assert #x1100000020
;; )
;; (deftype drawable-inline-array-actor (drawable-inline-array)
;; ()
;; :flag-assert #x1100000044
;; )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; region-h ;;
@@ -7567,6 +7599,11 @@
)
|#
;; (deftype drawable-inline-array-region-prim (drawable-inline-array)
;; ()
;; :flag-assert #x1100000044
;; )
#|
(deftype drawable-region-sphere (drawable-region-prim)
()
@@ -7808,16 +7845,6 @@
)
|#
#|
(deftype gsf-vertex-array (UNKNOWN)
((vtx gsf-vertex :dynamic :offset-assert 0) ;; guessed by decompiler
)
:method-count-assert 0
:size-assert #x0
:flag-assert #x0
)
|#
#|
(deftype gsf-fx-vertex (structure)
((clr vector4ub :inline :offset-assert 0)
@@ -7829,16 +7856,6 @@
)
|#
#|
(deftype gsf-fx-vertex-array (UNKNOWN)
((data gsf-fx-vertex :dynamic :offset-assert 0) ;; guessed by decompiler
)
:method-count-assert 0
:size-assert #x0
:flag-assert #x0
)
|#
#|
(deftype gsf-header (structure)
((num-strips uint8 :offset-assert 0)
@@ -8046,6 +8063,26 @@
)
|#
#|
(deftype gsf-vertex-array (UNKNOWN)
((vtx gsf-vertex :dynamic :offset-assert 0) ;; guessed by decompiler
)
:method-count-assert 0
:size-assert #x0
:flag-assert #x0
)
|#
#|
(deftype gsf-fx-vertex-array (UNKNOWN)
((data gsf-fx-vertex :dynamic :offset-assert 0) ;; guessed by decompiler
)
:method-count-assert 0
:size-assert #x0
:flag-assert #x0
)
|#
;; (define-extern *gsf-buffer* object) ;; gsf-buffer
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -9137,6 +9174,11 @@
)
|#
;; (deftype joint-anim-matrix (joint-anim)
;; ()
;; :flag-assert #x900000010
;; )
#|
(deftype joint-anim-transformq (joint-anim)
()
@@ -9253,6 +9295,11 @@
)
|#
;; (deftype art-mesh-anim (art-element)
;; ()
;; :flag-assert #xd00000020
;; )
#|
(deftype art-joint-anim (art-element)
((speed float :offset-assert 20)
@@ -9273,6 +9320,30 @@
)
|#
#|
(deftype art-group (art)
()
:method-count-assert 15
:size-assert #x20
:flag-assert #xf00000020
;; Failed to read fields.
(:methods
(art-group-method-13 () none 13) ;; (link-art! (_type_) art-group 13)
(art-group-method-14 () none 14) ;; (unlink-art! (_type_) int 14)
)
)
|#
;; (deftype art-mesh-geo (art-element)
;; ()
;; :flag-assert #xd00000020
;; )
;; (deftype art-joint-geo (art-element)
;; ()
;; :flag-assert #xd00000020
;; )
#|
(deftype art-joint-anim-manager-slot (structure)
((anim basic :offset-assert 0)
@@ -9908,6 +9979,16 @@
)
|#
#|
(deftype merc-blend-data (UNKNOWN)
((int8-data int8 :dynamic :offset-assert 0) ;; guessed by decompiler
)
:method-count-assert 0
:size-assert #x0
:flag-assert #x0
)
|#
;; (define-extern merc-fragment-fp-data function) ;; (function merc-fragment merc-fp-header)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -10666,6 +10747,11 @@
;; memcard-h ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (deftype mc-handle (int32)
;; ()
;; :flag-assert #x900000004
;; )
#|
(deftype mc-file-info (structure)
((present int32 :offset-assert 0)
@@ -10940,6 +11026,34 @@
)
|#
#|
(deftype gui-control (basic)
()
:method-count-assert 25
:size-assert #xcd0
:flag-assert #x1900000cd0
;; Failed to read fields.
(:methods
(gui-control-method-9 () none 9)
(gui-control-method-10 () none 10)
(gui-control-method-11 () none 11)
(gui-control-method-12 () none 12)
(gui-control-method-13 () none 13)
(gui-control-method-14 () none 14)
(gui-control-method-15 () none 15)
(gui-control-method-16 () none 16)
(gui-control-method-17 () none 17)
(gui-control-method-18 () none 18)
(gui-control-method-19 () none 19)
(gui-control-method-20 () none 20)
(gui-control-method-21 () none 21)
(gui-control-method-22 () none 22)
(gui-control-method-23 () none 23)
(gui-control-method-24 () none 24)
)
)
|#
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ambient-h ;;
@@ -13439,6 +13553,11 @@
;; generic-obs-h ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (deftype manipy (process-drawable)
;; ()
;; :flag-assert #x1501000174
;; )
#|
(deftype part-spawner (process)
((root trsqv :offset-assert 124) ;; guessed by decompiler
@@ -13798,6 +13917,11 @@
;; collide-target-h ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (deftype control-info (collide-shape-moving)
;; ()
;; :flag-assert #x4400001910
;; )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; collide-touch-h ;;
@@ -14276,6 +14400,11 @@
)
|#
;; (deftype drawable-tree-collide-fragment (drawable-tree)
;; ()
;; :flag-assert #x1100000020
;; )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; collide-hash-h ;;
@@ -15100,6 +15229,16 @@
)
|#
;; (deftype drawable-inline-array-instance-shrub (drawable-inline-array)
;; ()
;; :flag-assert #x1100000074
;; )
;; (deftype drawable-tree-instance-shrub (drawable-tree)
;; ()
;; :flag-assert #x1100000020
;; )
#|
(deftype generic-shrub-fragment (drawable)
((textures (inline-array adgif-shader) :offset-assert 4) ;; guessed by decompiler
@@ -15121,6 +15260,28 @@
)
|#
#|
(deftype prototype-shrubbery (drawable-inline-array)
()
:method-count-assert 17
:size-assert #x44
:flag-assert #x1100000044
;; Failed to read fields.
(:methods
)
)
|#
;; (deftype prototype-trans-shrubbery (prototype-shrubbery)
;; ()
;; :flag-assert #x1100000044
;; )
;; (deftype prototype-generic-shrub (drawable-group)
;; ()
;; :flag-assert #x1100000020
;; )
#|
(deftype shrubbery-matrix (structure)
((mat matrix :inline :offset-assert 0)
@@ -15298,6 +15459,18 @@
)
|#
#|
(deftype drawable-inline-array-instance-tie (drawable-inline-array)
()
:method-count-assert 17
:size-assert #x64
:flag-assert #x1100000064
;; Failed to read fields.
(:methods
)
)
|#
#|
(deftype drawable-tree-instance-tie (drawable-tree)
()
@@ -15310,6 +15483,19 @@
)
|#
#|
(deftype prototype-tie (drawable-inline-array)
()
:method-count-assert 17
:size-assert #x64
:flag-assert #x1100000064
;; Failed to read fields.
(:methods
)
)
|#
#|
(deftype tie-matrix (structure)
((mat matrix :inline :offset-assert 0)
@@ -15637,6 +15823,43 @@
)
|#
#|
(deftype drawable-inline-array-tfrag (drawable-inline-array)
()
:method-count-assert 17
:size-assert #x64
:flag-assert #x1100000064
;; Failed to read fields.
(:methods
)
)
|#
;; (deftype drawable-inline-array-tfrag-trans (drawable-inline-array-tfrag)
;; ()
;; :flag-assert #x11000000b4
;; )
;; (deftype drawable-inline-array-tfrag-water (drawable-inline-array-tfrag)
;; ()
;; :flag-assert #x11000000b4
;; )
;; (deftype drawable-tree-tfrag (drawable-tree)
;; ()
;; :flag-assert #x1100000020
;; )
;; (deftype drawable-tree-tfrag-trans (drawable-tree-tfrag)
;; ()
;; :flag-assert #x1100000020
;; )
;; (deftype drawable-tree-tfrag-water (drawable-tree-tfrag-trans)
;; ()
;; :flag-assert #x1100000020
;; )
#|
(deftype tfrag-dists (structure)
((data uint32 16 :offset-assert 0) ;; guessed by decompiler
@@ -16076,6 +16299,64 @@
)
|#
(deftype entity (res-lump)
((pad uint32 5))
:method-count-assert 27
:size-assert #x34
:flag-assert #x1b00000034
;; Failed to read fields.
(:methods
(entity-method-22 () none 22) ;; (birth! (_type_) _type_ 22)
(entity-method-23 () none 23) ;; (kill! (_type_) _type_ 23)
(entity-method-24 () none 24) ;; (add-to-level! (_type_ level-group level actor-id) none 24)
(entity-method-25 () none 25) ;; (remove-from-level! (_type_ level-group) _type_ 25)
(entity-method-26 () none 26) ;; (get-level (_type_) level 26)
)
)
;; (deftype entity-camera (entity)
;; ()
;; :flag-assert #x1b00000050
;; )
#|
(deftype entity-nav-mesh (entity)
()
:method-count-assert 29
:size-assert #x38
:flag-assert #x1d00000038
;; Failed to read fields.
(:methods
(entity-nav-mesh-method-27 () none 27)
(entity-nav-mesh-method-28 () none 28)
)
)
|#
;; (deftype entity-race-mesh (entity)
;; ()
;; :flag-assert #x1d00000038
;; )
(declare-type entity-actor entity)
#|
(deftype entity-actor (entity)
()
:method-count-assert 33
:size-assert #x50
:flag-assert #x2100000050
;; Failed to read fields.
(:methods
(entity-actor-method-27 () none 27) ;; (next-actor (_type_) entity-actor 27)
(entity-actor-method-28 () none 28) ;; (prev-actor (_type_) entity-actor 28)
(entity-actor-method-29 () none 29) ;; (debug-print (_type_ symbol type) none 29)
(entity-actor-method-30 () none 30) ;; (dummy-30 (_type_ entity-perm-status symbol) none 30)
(entity-actor-method-31 () none 31)
(entity-actor-method-32 () none 32)
)
)
|#
#|
(deftype actor-reference (structure)
((actor basic :offset-assert 0)
@@ -18864,6 +19145,11 @@
;; spatial-hash-h ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (deftype grid-hash-word (uint8)
;; ()
;; :flag-assert #x900000001
;; )
#|
(deftype grid-hash-box (structure)
((min UNKNOWN 3 :offset-assert 0)
@@ -19247,19 +19533,6 @@
;; joint ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#|
(deftype art-group (art)
()
:method-count-assert 15
:size-assert #x20
:flag-assert #xf00000020
;; Failed to read fields.
(:methods
(art-group-method-13 () none 13) ;; (link-art! (_type_) art-group 13)
(art-group-method-14 () none 14) ;; (unlink-art! (_type_) int 14)
)
)
|#
;; (define-extern joint-anim-login function) ;; (function joint-anim-drawable joint-anim-drawable)
;; (define-extern joint-anim-inspect-elt function) ;; (function joint-anim float joint-anim)
@@ -20533,35 +20806,12 @@
;; draw-node ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#|
(deftype drawable-inline-array-node (drawable-inline-array)
()
:method-count-assert 17
:size-assert #x44
:flag-assert #x1100000044
;; Failed to read fields.
(:methods
)
)
|#
;; (define-extern draw-node-cull function) ;; (function pointer pointer (inline-array draw-node) int none)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; shrubbery ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#|
(deftype prototype-shrubbery (drawable-inline-array)
()
:method-count-assert 17
:size-assert #x44
:flag-assert #x1100000044
;; Failed to read fields.
(:methods
)
)
|#
#|
(deftype dma-test (structure)
@@ -20622,18 +20872,6 @@
;; tfrag ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#|
(deftype drawable-inline-array-tfrag (drawable-inline-array)
()
:method-count-assert 17
:size-assert #x64
:flag-assert #x1100000064
;; Failed to read fields.
(:methods
)
)
|#
;; (define-extern *tfrag-display-stats* object) ;; symbol
;; (define-extern tfrag-vu1-block object) ;; vu-function
;; (define-extern tfrag-data-setup function) ;; (function tfrag-data int none)
@@ -20688,29 +20926,6 @@
;; tie ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#|
(deftype drawable-inline-array-instance-tie (drawable-inline-array)
()
:method-count-assert 17
:size-assert #x64
:flag-assert #x1100000064
;; Failed to read fields.
(:methods
)
)
|#
#|
(deftype prototype-tie (drawable-inline-array)
()
:method-count-assert 17
:size-assert #x64
:flag-assert #x1100000064
;; Failed to read fields.
(:methods
)
)
|#
#|
(deftype tie-consts (structure)
@@ -21208,34 +21423,6 @@
)
|#
#|
(deftype gui-control (basic)
()
:method-count-assert 25
:size-assert #xcd0
:flag-assert #x1900000cd0
;; Failed to read fields.
(:methods
(gui-control-method-9 () none 9)
(gui-control-method-10 () none 10)
(gui-control-method-11 () none 11)
(gui-control-method-12 () none 12)
(gui-control-method-13 () none 13)
(gui-control-method-14 () none 14)
(gui-control-method-15 () none 15)
(gui-control-method-16 () none 16)
(gui-control-method-17 () none 17)
(gui-control-method-18 () none 18)
(gui-control-method-19 () none 19)
(gui-control-method-20 () none 20)
(gui-control-method-21 () none 21)
(gui-control-method-22 () none 22)
(gui-control-method-23 () none 23)
(gui-control-method-24 () none 24)
)
)
|#
;; (define-extern drawable-load function) ;; (function drawable kheap drawable)
;; (define-extern art-load function) ;; (function string kheap art)
;; (define-extern art-group-load-check function) ;; (function string kheap int art-group)
@@ -25676,55 +25863,6 @@
|#
(deftype entity (res-lump)
((pad uint32 5))
:method-count-assert 27
:size-assert #x34
:flag-assert #x1b00000034
;; Failed to read fields.
(:methods
(entity-method-22 () none 22) ;; (birth! (_type_) _type_ 22)
(entity-method-23 () none 23) ;; (kill! (_type_) _type_ 23)
(entity-method-24 () none 24) ;; (add-to-level! (_type_ level-group level actor-id) none 24)
(entity-method-25 () none 25) ;; (remove-from-level! (_type_ level-group) _type_ 25)
(entity-method-26 () none 26) ;; (get-level (_type_) level 26)
)
)
#|
(deftype entity-nav-mesh (entity)
()
:method-count-assert 29
:size-assert #x38
:flag-assert #x1d00000038
;; Failed to read fields.
(:methods
(entity-nav-mesh-method-27 () none 27)
(entity-nav-mesh-method-28 () none 28)
)
)
|#
(declare-type entity-actor entity)
#|
(deftype entity-actor (entity)
()
:method-count-assert 33
:size-assert #x50
:flag-assert #x2100000050
;; Failed to read fields.
(:methods
(entity-actor-method-27 () none 27) ;; (next-actor (_type_) entity-actor 27)
(entity-actor-method-28 () none 28) ;; (prev-actor (_type_) entity-actor 28)
(entity-actor-method-29 () none 29) ;; (debug-print (_type_ symbol type) none 29)
(entity-actor-method-30 () none 30) ;; (dummy-30 (_type_ entity-perm-status symbol) none 30)
(entity-actor-method-31 () none 31)
(entity-actor-method-32 () none 32)
)
)
|#
#|
(deftype debug-actor-info (basic)
((name basic :offset-assert 4)
@@ -32230,6 +32368,11 @@
)
|#
;; (deftype predator-edge (structure)
;; ()
;; :flag-assert #x900000004
;; )
#|
(deftype predator-graph (structure)
((node-count uint16 :offset-assert 0)