Last active
May 31, 2025 22:56
-
-
Save ammaraskar/bac2dd8c14b01ec276360052c7608a39 to your computer and use it in GitHub Desktop.
Auto generate tww decomp dCcD_Src structs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
Automatically writes source structs for colliders. | |
""" | |
from dataclasses import dataclass | |
from pathlib import Path | |
import collections | |
import json | |
import re | |
import struct | |
import textwrap | |
PROJ_DIR = Path(__file__).parent.parent | |
ASM_DIR = PROJ_DIR / 'build' / 'GZLE01' | |
INCLUDE_DIR = PROJ_DIR / 'include' | |
SRC_DIR = PROJ_DIR / 'src' | |
def strip_namespace_mangled_name(name): | |
# Convert `m_sph_src__13daObj_Ikada_c` to `m_sph_src`. | |
# `body_co_cyl_src$6067` to `body_co_cyl_src`. | |
# `M_sph_data__10daObjHha_c` to `m_sph_data`. | |
return name.split('__')[0].split('$')[0].lower() | |
def read_src_objects_from_asm_files() -> dict[str, bytes]: | |
objects = collections.defaultdict(bytearray) | |
for asm_file in ASM_DIR.glob('**/*.s'): | |
with asm_file.open('r') as f: | |
obj_name = None | |
for line in f: | |
if line.startswith('.obj '): | |
obj_name = line.split()[1].replace(',', '').strip() | |
# Quick filter to skip non-collider objects. | |
if ('src' not in obj_name) and ('sph' not in obj_name) and ('cyl' not in obj_name): | |
obj_name = None | |
continue | |
obj_name = strip_namespace_mangled_name(obj_name) | |
obj_name = asm_file.stem + '::' + obj_name | |
continue | |
elif line.startswith('.endobj '): | |
obj_name = None | |
continue | |
if obj_name is None: | |
continue | |
if not line.startswith('\t.4byte '): | |
continue | |
hex_value = line.split()[-1] | |
hex_value = int(hex_value, 16) | |
objects[obj_name].extend(hex_value.to_bytes(4, 'big')) | |
return objects | |
def main(): | |
collider_src_obj_bytes = read_src_objects_from_asm_files() | |
# Maps class and namespace names to their corresponding header files. | |
class_to_src_file = {} | |
# Maps source file names like `d_a_bst` to their corresponding source files. | |
src_file_names = {} | |
for header_file in INCLUDE_DIR.glob('**/*.h'): | |
with header_file.open('r', encoding='utf8') as f: | |
src_file = header_file.relative_to(INCLUDE_DIR).with_suffix('.cpp') | |
src_file = SRC_DIR / src_file | |
for line in f: | |
if line.startswith('namespace '): | |
namespace_name = line.split()[1] | |
class_to_src_file[namespace_name] = src_file | |
if line.startswith('class '): | |
class_name = line.split()[1] | |
class_to_src_file[class_name] = src_file | |
for src_file in SRC_DIR.glob('**/*.cpp'): | |
src_file_names[src_file.stem] = src_file | |
collider_set_calls = json.loads(GHIDRA_DATA) | |
for call in collider_set_calls: | |
src_obj = call['src_obj'] | |
type = call['type'] | |
caller = call['caller'] | |
# Find the source file for this caller. | |
caller_class = caller.split('::')[0] | |
if caller_class in class_to_src_file: | |
src_file = class_to_src_file[caller_class] | |
elif caller_class in src_file_names: | |
src_file = src_file_names[caller_class] | |
else: | |
raise ValueError(f"Could not find source file for caller: {caller_class}") | |
print(src_file) | |
# Skip this file, it has it defined through an include. | |
if 'd_a_bomb' in src_file.stem: | |
continue | |
# A $ in the src object name just means that it was defined within the | |
# function instead of just floating around in the file. | |
src_obj_name = src_obj.split('$')[0] | |
# Skip any collider source objects that are already defined. | |
with src_file.open('r', encoding='utf8') as f: | |
src = f.read() | |
if src_obj_name in src: | |
print(f"Skipping {src_obj} in {caller} as it is already defined.") | |
continue | |
# Okay, looks like we need to generate the src object. | |
src_obj_lookup_name = src_file.stem + '::' + src_obj_name | |
if src_obj_lookup_name not in collider_src_obj_bytes: | |
print(f"Collider source object {src_obj_lookup_name} not found.") | |
continue | |
src_obj_data = collider_src_obj_bytes[src_obj_lookup_name] | |
struct = generate_src_object(src_obj_name, type, src_obj_data) | |
add_struct_to_file(src_file, caller, src_obj, struct) | |
print(f"[+] Added {src_obj} to {caller} in {src_file.stem}") | |
def add_struct_to_file(src_file: Path, caller: str, src_obj_name: str, struct: str): | |
with src_file.open('r', encoding='utf8') as f: | |
src = f.read() | |
new_src = modify_source_for_file(src, caller, src_obj_name, struct) | |
with src_file.open('w', encoding='utf8') as f: | |
new_src = '\n'.join(new_src) | |
# If the file ends with a newline, we want to keep it. | |
if src.endswith('\n'): | |
new_src += '\n' | |
f.write(new_src) | |
def modify_source_for_file(src: str, caller: str, src_obj_name: str, struct: str) -> list[str]: | |
new_src = src.splitlines() | |
last_include_line = None | |
for i, line in enumerate(src.splitlines()): | |
if line.startswith('#include '): | |
last_include_line = i | |
# Check if the include is already present, if not, add it. | |
if '#include "d/d_cc_d.h"' not in src: | |
new_src.insert(last_include_line + 1, '#include "d/d_cc_d.h"') | |
last_include_line += 1 | |
# If there isn't a dollar in the src_obj_name, we just add it after the | |
# includes. | |
if '$' not in src_obj_name: | |
struct = f'\n{struct}\n' | |
new_src[last_include_line + 1:last_include_line + 1] = struct.splitlines() | |
return new_src | |
func_line = None | |
# First, look for the line that the function is defined in. | |
for i, line in enumerate(new_src): | |
match = re.search(r"^.* (\S*)\(.*\) {", line) | |
if match and match.group(1) == caller: | |
func_line = i | |
break | |
# Okay, let's try just the function name without the namespaces. | |
if func_line is None: | |
func_name = caller.split('::')[-1] | |
for i, line in enumerate(new_src): | |
match = re.search(r"^.* (\S*)\(.*\) {", line) | |
if match and match.group(1) == func_name: | |
func_line = i | |
break | |
if func_line is None: | |
raise ValueError(f"Could not find function {caller}") | |
# Check if the next line is a nonmatching statement, if so we want to | |
# insert after that. | |
if 'nonmatching' in new_src[func_line + 1].lower(): | |
func_line += 1 | |
struct = textwrap.indent(struct, ' ') | |
new_src[func_line + 1:func_line + 1] = struct.splitlines() | |
return new_src | |
@dataclass | |
class dCcD_SrcGObjInf: | |
Flags: int # Flags | |
SrcObjAt_Type: int # SrcObjAt Type | |
SrcObjAt_Atp: int # SrcObjAt Atp | |
SrcObjAt_SPrm: int # SrcObjAt SPrm | |
SrcObjTg_Type: int # SrcObjTg Type | |
SrcObjTg_SPrm: int # SrcObjTg SPrm | |
SrcObjCo_SPrm: int # SrcObjCo SPrm | |
SrcGObjAt_Se: int # SrcGObjAt Se | |
SrcGObjAt_HitMark: int # SrcGObjAt HitMark | |
SrcGObjAt_Spl: int # SrcGObjAt Spl | |
SrcGObjAt_Mtrl: int # SrcGObjAt Mtrl | |
SrcGObjAt_SPrm: int # SrcGObjAt SPrm | |
SrcGObjTg_Se: int # SrcGObjTg Se | |
SrcGObjTg_HitMark: int # SrcGObjTg HitMark | |
SrcGObjTg_Spl: int # SrcGObjTg Spl | |
SrcGObjTg_Mtrl: int # SrcGObjTg Mtrl | |
SrcGObjTg_SPrm: int # SrcGObjTg SPrm | |
SrcGObjCo_SPrm: int # SrcGObjCo SPrm | |
def _from_bytes(b: bytes): | |
return dCcD_SrcGObjInf( | |
*struct.unpack( | |
( | |
'>' # big-endian | |
'I' # flags, u32 | |
'I' # at_type, u32 | |
'b' # at_atp, u8 | |
'xxx' # three padding bytes | |
'I' # at_sprm, u32 | |
'I' # tg_type, u32 | |
'I' # tg_sprm, u32 | |
'I' # co_sprm, u32 | |
'B' # at_se, u8 | |
'B' # at_hitmark, u8 | |
'B' # at_spl, u8 | |
'B' # at_mtrl, u8 | |
'I' # at_sprm, u32 | |
'B' # tg_se, u8 | |
'B' # tg_hitmark, u8 | |
'B' # tg_spl, u8 | |
'B' # tg_mtrl, u8 | |
'I' # tg_sprm, u32 | |
'I' # co_sprm, u32 | |
), | |
b | |
) | |
) | |
class BitMask: | |
JOINT_VALUES = {} | |
@classmethod | |
def to_bitmask(cls, value: int, allow_zero: bool = False): | |
if value == 0 and not allow_zero: | |
raise ValueError(f"Value for {cls} cannot be zero.") | |
if value == 0: | |
return '0' | |
# First see if any joint values apply, | |
if value in cls.JOINT_VALUES: | |
return cls.JOINT_VALUES[value] | |
bit_values = [] | |
bit_string = bin(value)[2:] # Get binary representation without '0b' prefix | |
for i, bit in enumerate(reversed(bit_string), start=1): | |
if bit == '1': | |
if i not in cls.ENUM_VALS: | |
raise ValueError(f"Bit position {i} not defined in {cls}.") | |
bit_values.append(cls.ENUM_VALS[i]) | |
return ' | '.join(bit_values) | |
# enum cCcD_AtSPrm_e - Possible values for `SrcObjAt SPrm` | |
class AtSprm_enum(BitMask): | |
ENUM_VALS = { | |
1: 'cCcD_AtSPrm_Set_e', | |
2: 'cCcD_AtSPrm_VsEnemy_e', | |
3: 'cCcD_AtSPrm_VsPlayer_e', | |
4: 'cCcD_AtSPrm_VsOther_e', | |
5: 'cCcD_AtSPrm_NoTgHitInfSet_e' | |
} | |
JOINT_VALUES = { | |
0xE: 'cCcD_AtSPrm_GrpAll_e' | |
} | |
# enum cCcD_TgSPrm_e - Possible values for `SrcObjTg SPrm` | |
class TgSprm_enum(BitMask): | |
ENUM_VALS = { | |
1: 'cCcD_TgSPrm_Set_e', | |
2: 'cCcD_TgSPrm_IsEnemy_e', | |
3: 'cCcD_TgSPrm_IsPlayer_e', | |
4: 'cCcD_TgSPrm_IsOther_e', | |
5: 'cCcD_TgSPrm_NoAtHitInfSet_e' | |
} | |
JOINT_VALUES = { | |
0xE: 'cCcD_TgSPrm_GrpAll_e' | |
} | |
# enum cCcD_CoSPrm_e - Possible values for `SrcObjCo SPrm` | |
class CoSprm_enum(BitMask): | |
ENUM_VALS = { | |
1: 'cCcD_CoSPrm_Set_e', | |
2: 'cCcD_CoSPrm_IsEnemy_e', | |
3: 'cCcD_CoSPrm_IsPlayer_e', | |
4: 'cCcD_CoSPrm_IsOther_e', | |
5: 'cCcD_CoSPrm_VsEnemy_e', | |
6: 'cCcD_CoSPrm_VsPlayer_e', | |
7: 'cCcD_CoSPrm_VsOther_e', | |
8: 'cCcD_CoSPrm_Sph3DCrr_e', | |
9: 'cCcD_CoSPrm_NoCrr_e', | |
10: 'cCcD_CoSPrm_NoCoHitInfSet_e' | |
} | |
JOINT_VALUES = { | |
0xE: 'cCcD_CoSPrm_IGrpAll_e', | |
0x70: 'cCcD_CoSPrm_VsGrpAll_e', | |
} | |
# enum dCcG_AtSPrm_e - Possible values for `SrcGObjAt SPrm` | |
class G_AtSPrm_enum(BitMask): | |
ENUM_VALS = { | |
1: 'dCcG_AtSPrm_NoConHit_e', | |
2: 'dCcG_AtSPrm_NoHitMark_e', | |
3: 'dCcG_AtSPrm_StopNoConHit_e', | |
4: 'dCcG_AtSPrm_NoMass_e', | |
} | |
# enum dCcG_TgSPrm_e - Possible values for `SrcGObjTg SPrm` | |
class G_TgSprm_enum(BitMask): | |
ENUM_VALS = { | |
1: 'dCcG_TgSPrm_Shield_e', | |
2: 'dCcG_TgSPrm_NoConHit_e', | |
3: 'dCcG_TgSPrm_NoHitMark_e', | |
4: 'dCcG_TgSPrm_ShieldFrontRange_e', | |
} | |
# enum dCcD_ObjAtType | |
class ObjAtType_enum(BitMask): | |
ENUM_VALS = { | |
2: 'AT_TYPE_SWORD', | |
4: 'AT_TYPE_UNK8', | |
6: 'AT_TYPE_BOMB', | |
7: 'AT_TYPE_BOOMERANG', | |
8: 'AT_TYPE_BOKO_STICK', | |
9: 'AT_TYPE_WATER', | |
10: 'AT_TYPE_FIRE', | |
11: 'AT_TYPE_MACHETE', | |
12: 'AT_TYPE_UNK800', | |
13: 'AT_TYPE_SPIKE', | |
14: 'AT_TYPE_UNK2000', | |
15: 'AT_TYPE_NORMAL_ARROW', | |
16: 'AT_TYPE_HOOKSHOT', | |
17: 'AT_TYPE_SKULL_HAMMER', | |
18: 'AT_TYPE_UNK20000', | |
19: 'AT_TYPE_FIRE_ARROW', | |
20: 'AT_TYPE_ICE_ARROW', | |
21: 'AT_TYPE_LIGHT_ARROW', | |
22: 'AT_TYPE_WIND', | |
23: 'AT_TYPE_UNK400000', | |
24: 'AT_TYPE_LIGHT', | |
25: 'AT_TYPE_STALFOS_MACE', | |
26: 'AT_TYPE_UNK2000000', | |
27: 'AT_TYPE_DARKNUT_SWORD', | |
28: 'AT_TYPE_GRAPPLING_HOOK', | |
29: 'AT_TYPE_MOBLIN_SPEAR', | |
30: 'AT_TYPE_PGANON_SWORD', | |
} | |
class ObjAtType_negated_enum(BitMask): | |
ENUM_VALS = { | |
k: f"~{v}" | |
for k, v in ObjAtType_enum.ENUM_VALS.items() | |
} | |
def attack_type_mask(type: int) -> str: | |
"""Return damage/collision type as a string.""" | |
if type == 0: | |
return '0' | |
if type == 0xFFFFFFFF: | |
return 'AT_TYPE_ALL' | |
# 27 total attack types. As a heuristic if more than 17 are in use we | |
# negate from AT_TYPE_ALL instead. | |
if bin(type).count('1') <= 17: | |
return ObjAtType_enum.to_bitmask(type) | |
negated_type = 0xFFFFFFFF & ~type | |
bit_mask = ObjAtType_negated_enum.to_bitmask(negated_type).replace('|', '&') | |
return 'AT_TYPE_ALL & ' + bit_mask | |
# enum dCcG_hitSe | |
hitSe_enum = { | |
0: '0', | |
1: 'dCcG_SE_UNK1', | |
2: 'dCcG_SE_UNK2', | |
4: 'dCcG_SE_UNK4', | |
5: 'dCcG_SE_UNK5', | |
6: 'dCcG_SE_UNK6', | |
7: 'dCcG_SE_ARROW', | |
8: 'dCcG_SE_HOOKSHOT', | |
0x23: 'dCcG_SE_UNK23', | |
0x25: 'dCcG_SE_UNK25', | |
} | |
# enum CcG_At_HitMark | |
At_HitMark_enum = { | |
0: 'dCcG_AtHitMark_None_e', | |
1: 'dCcG_AtHitMark_Unk1_e', | |
0xD: 'dCcG_AtHitMark_Nrm_e', | |
0xF: 'dCcG_AtHitMark_Big_e', | |
} | |
# enum CcG_Tg_HitMark | |
Tg_HitMark_enum = { | |
0: '0', | |
1: 'dCcG_TgHitMark_Unk1_e', | |
0xC: 'dCcg_TgHitMark_Purple_e', | |
0xD: 'dCcG_TgHitMark_Nrm_e', | |
0xFF: 'dCcG_TgHitMark_Unk255_e', # Added by us. | |
} | |
# enum dCcG_At_Spl | |
At_Spl_enum = { | |
0: 'dCcG_At_Spl_UNK0', | |
1: 'dCcG_At_Spl_UNK1', | |
2: 'dCcG_At_Spl_UNK2', # Added by us. | |
3: 'dCcG_At_Spl_UNK3', | |
5: 'dCcG_At_Spl_UNK5', | |
6: 'dCcG_At_Spl_UNK6', | |
7: 'dCcG_At_Spl_UNK7', | |
8: 'dCcG_At_Spl_UNK8', | |
9: 'dCcG_At_Spl_UNK9', | |
0xA: 'dCcG_At_Spl_UNKA', | |
0xB: 'dCcG_At_Spl_UNKB', | |
} | |
# enum dCcG_Tg_Spl | |
Tg_Spl_enum = { | |
0: 'dCcG_Tg_Spl_UNK0', | |
1: 'dCcG_Tg_Spl_UNK1', | |
} | |
TYPE_STRUCT_MAP = { | |
'dCcD_Sph': 'dCcD_SrcSph', | |
'dCcD_Cps': 'dCcD_SrcCps', | |
'dCcD_Cyl': 'dCcD_SrcCyl', | |
'dCcD_Tri': 'dCcD_SrcTri', | |
} | |
def generate_src_object(src_obj_name, type, src_obj_data): | |
primary: dCcD_SrcGObjInf = dCcD_SrcGObjInf._from_bytes(src_obj_data[:0x30]) | |
if type == 'dCcD_Sph': | |
secondary_struct = generate_sphere_struct(src_obj_data[0x30:]) | |
elif type == 'dCcD_Cps': | |
secondary_struct = generate_capsule_struct(src_obj_data[0x30:]) | |
elif type == 'dCcD_Cyl': | |
secondary_struct = generate_cylinder_struct(src_obj_data[0x30:]) | |
elif type == 'dCcD_Tri': | |
secondary_struct = generate_tri_struct(src_obj_data[0x30:]) | |
else: | |
raise NotImplementedError(f"Unsupported collider type: {type}") | |
# These always seem to be 0. Let's assert it and hardcode the value. | |
assert primary.Flags == 0 | |
assert primary.SrcGObjAt_Mtrl == 0 | |
assert primary.SrcGObjTg_Mtrl == 0 | |
assert primary.SrcGObjCo_SPrm == 0 | |
assert primary.SrcGObjAt_Se in hitSe_enum | |
primary.SrcGObjAt_Se = hitSe_enum[primary.SrcGObjAt_Se] | |
assert primary.SrcGObjAt_HitMark in At_HitMark_enum | |
primary.SrcGObjAt_HitMark = At_HitMark_enum[primary.SrcGObjAt_HitMark] | |
assert primary.SrcGObjAt_Spl in At_Spl_enum | |
primary.SrcGObjAt_Spl = At_Spl_enum[primary.SrcGObjAt_Spl] | |
assert primary.SrcGObjTg_Se in hitSe_enum | |
primary.SrcGObjTg_Se = hitSe_enum[primary.SrcGObjTg_Se] | |
assert primary.SrcGObjTg_HitMark in Tg_HitMark_enum | |
primary.SrcGObjTg_HitMark = Tg_HitMark_enum[primary.SrcGObjTg_HitMark] | |
assert primary.SrcGObjTg_Spl in Tg_Spl_enum | |
primary.SrcGObjTg_Spl = Tg_Spl_enum[primary.SrcGObjTg_Spl] | |
return f"""\ | |
static {TYPE_STRUCT_MAP[type]} {src_obj_name} = {{ | |
// dCcD_SrcGObjInf | |
{{ | |
/* Flags */ 0, | |
/* SrcObjAt Type */ {attack_type_mask(primary.SrcObjAt_Type)}, | |
/* SrcObjAt Atp */ {primary.SrcObjAt_Atp}, | |
/* SrcObjAt SPrm */ {AtSprm_enum.to_bitmask(primary.SrcObjAt_SPrm, allow_zero=True)}, | |
/* SrcObjTg Type */ {attack_type_mask(primary.SrcObjTg_Type)}, | |
/* SrcObjTg SPrm */ {TgSprm_enum.to_bitmask(primary.SrcObjTg_SPrm, allow_zero=True)}, | |
/* SrcObjCo SPrm */ {CoSprm_enum.to_bitmask(primary.SrcObjCo_SPrm, allow_zero=True)}, | |
/* SrcGObjAt Se */ {primary.SrcGObjAt_Se}, | |
/* SrcGObjAt HitMark */ {primary.SrcGObjAt_HitMark}, | |
/* SrcGObjAt Spl */ {primary.SrcGObjAt_Spl}, | |
/* SrcGObjAt Mtrl */ 0, | |
/* SrcGObjAt SPrm */ {G_AtSPrm_enum.to_bitmask(primary.SrcGObjAt_SPrm, allow_zero=True)}, | |
/* SrcGObjTg Se */ {primary.SrcGObjTg_Se}, | |
/* SrcGObjTg HitMark */ {primary.SrcGObjTg_HitMark}, | |
/* SrcGObjTg Spl */ {primary.SrcGObjTg_Spl}, | |
/* SrcGObjTg Mtrl */ 0, | |
/* SrcGObjTg SPrm */ {G_TgSprm_enum.to_bitmask(primary.SrcGObjTg_SPrm, allow_zero=True)}, | |
/* SrcGObjCo SPrm */ 0, | |
}}, | |
{secondary_struct} | |
}}; | |
""" | |
@dataclass | |
class dCcD_Sphere: | |
x: float | |
y: float | |
z: float | |
radius: float | |
def _from_bytes(b: bytes): | |
return dCcD_Sphere(*struct.unpack('>fff f', b)) | |
def generate_sphere_struct(sphere_data): | |
sphere = dCcD_Sphere._from_bytes(sphere_data) | |
return f"""\ | |
// cM3dGSphS | |
{{ | |
/* Center */ {sphere.x}f, {sphere.y}f, {sphere.z}f, | |
/* Radius */ {sphere.radius}f, | |
}},""" | |
@dataclass | |
class dCcD_Capsule: | |
p0_x: float | |
p0_y: float | |
p0_z: float | |
p1_x: float | |
p1_y: float | |
p1_z: float | |
height: float | |
def _from_bytes(b: bytes): | |
return dCcD_Capsule(*struct.unpack('>fff fff f', b)) | |
def generate_capsule_struct(capsule_data): | |
cap = dCcD_Capsule._from_bytes(capsule_data) | |
return f"""\ | |
// cM3dGCpsS | |
{{ | |
/* P0 */ {cap.p0_x}f, {cap.p0_y}f, {cap.p0_z}f, | |
/* P1 */ {cap.p1_x}f, {cap.p1_y}f, {cap.p1_z}f, | |
/* Height */ {cap.height}f, | |
}},""" | |
@dataclass | |
class dCcD_Cylinder: | |
center_x: float | |
center_y: float | |
center_z: float | |
radius: float | |
height: float | |
def _from_bytes(b: bytes): | |
return dCcD_Cylinder(*struct.unpack('>fff f f', b)) | |
def generate_cylinder_struct(cylinder_data): | |
cylinder = dCcD_Cylinder._from_bytes(cylinder_data) | |
return f"""\ | |
// cM3dGCylS | |
{{ | |
/* Center */ {cylinder.center_x}f, {cylinder.center_y}f, {cylinder.center_z}f, | |
/* Radius */ {cylinder.radius}f, | |
/* Height */ {cylinder.height}f, | |
}},""" | |
@dataclass | |
class dCcD_Triangle: | |
a_x: float | |
a_y: float | |
a_z: float | |
b_x: float | |
b_y: float | |
b_z: float | |
c_x: float | |
c_y: float | |
c_z: float | |
def _from_bytes(b: bytes): | |
return dCcD_Triangle(*struct.unpack('>fff fff fff', b)) | |
def generate_tri_struct(tri_data): | |
tri: dCcD_Triangle = dCcD_Triangle._from_bytes(tri_data) | |
return f"""\ | |
// cM3dGTriS | |
{{ | |
/* a */ {tri.a_x}f, {tri.a_y}f, {tri.a_z}f, | |
/* b */ {tri.b_x}f, {tri.b_y}f, {tri.b_z}f, | |
/* c */ {tri.c_x}f, {tri.c_y}f, {tri.c_z}f, | |
}},""" | |
GHIDRA_DATA = """ | |
... | |
""" | |
if __name__ == "__main__": | |
main() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Dump all collider structs in the current program. | |
#@ammar2 | |
#@category #Decomp | |
#@keybinding | |
#@menupath | |
#@toolbar | |
import json | |
from ghidra.app.decompiler import DecompileOptions | |
from ghidra.app.decompiler import DecompInterface | |
from ghidra.util.task import ConsoleTaskMonitor | |
COLLIDER_FUNC_NAMES = set([ | |
'dCcD_Cps::Set', | |
'dCcD_Tri::Set', | |
'dCcD_Cyl::Set', | |
'dCcD_Sph::Set', | |
]) | |
fm = currentProgram.getFunctionManager() | |
collider_funcs = [] | |
# Get all the collider functions by name. | |
for func in fm.getFunctions(True): | |
if str(func) in COLLIDER_FUNC_NAMES: | |
collider_funcs.append(func) | |
assert len(collider_funcs) == len(COLLIDER_FUNC_NAMES) | |
call_sites = {} | |
# Look for xrefs to each collider function. | |
for func in collider_funcs: | |
for xref in getReferencesTo(func.getEntryPoint()): | |
caller = fm.getFunctionContaining(xref.getFromAddress()) | |
caller_name = str(caller) | |
if caller not in call_sites: | |
call_sites[caller] = [] | |
call_sites[caller].append((func, xref.getFromAddress())) | |
def trace_varnode(varnode): | |
"""Gets an integer address from a varnode.""" | |
mnemonic = varnode.getMnemonic() | |
if mnemonic == 'PTRSUB': | |
# Check if the first argument is itself a PTRSUB. | |
input0 = varnode.getInput(0) | |
if input0 is not None and input0.getDef() is not None and input0.getDef().getMnemonic() == 'PTRSUB': | |
return input0.getDef().getInput(1).getOffset() + varnode.getInput(1).getOffset() | |
return varnode.getInput(1).getOffset() | |
elif mnemonic == 'CAST': | |
return trace_varnode(varnode.getInput(0).getDef()) | |
elif mnemonic == 'INT_ADD': | |
return trace_varnode(varnode.getInput(0).getDef()) | |
elif mnemonic == 'COPY': | |
return varnode.getInput(0).getOffset() | |
else: | |
raise NotImplementedError("Unexpected p-code operation: " + mnemonic) | |
# Set up cruft for the decompiler. | |
options = DecompileOptions() | |
monitor = ConsoleTaskMonitor() | |
ifc = DecompInterface() | |
ifc.setOptions(options) | |
ifc.openProgram(currentProgram) | |
dump = [] | |
already_seen = set() | |
# Go over the decompiled p-code for each call-site and find the collider | |
# src argument in the Set call. | |
for caller in call_sites.keys(): | |
print(caller) | |
res = ifc.decompileFunction(caller, 60, monitor) | |
high_func = res.getHighFunction() | |
for target_func, call_addr in call_sites[caller]: | |
pcodeops = high_func.getPcodeOps(call_addr) | |
op = pcodeops.next() | |
inputs = op.getInputs() | |
src_arg = inputs[2].getDef() | |
src_arg = trace_varnode(src_arg) | |
src_arg_addr = toAddr(src_arg) | |
src_label = None | |
# Probe around the src argument address, sometimes the ghidra labels | |
# aren't in exactly the right place. | |
for i in range(-4, 5): | |
probe_addr = src_arg_addr.add(i) | |
labels = currentProgram.getSymbolTable().getSymbols(probe_addr) | |
for label in labels: | |
label = label.getName() | |
label_lower = label.lower() | |
if ('src' in label_lower) or ('sph' in label_lower) or ('cyl' in label_lower): | |
src_label = label | |
break | |
if src_label is None: | |
print("Warning: No source label found for " + str(caller) + " (src_arg=" + str(src_arg_addr) + ")") | |
continue | |
dedup_key = (src_label, caller.getName(True),) | |
if dedup_key in already_seen: | |
continue | |
already_seen.add(dedup_key) | |
dump.append({ | |
'caller': caller.getName(True), | |
'type': target_func.getParentNamespace().getName(), | |
'src_obj': src_label, | |
'src_obj_addr': src_arg, | |
}) | |
# Sort by the src_obj addresses in reverse order since the script inserts stuff | |
# in reverse order. | |
dump.sort(key=lambda x: x['src_obj_addr'], reverse=True) | |
# Remove the src_obj_addr | |
for entry in dump: | |
del entry['src_obj_addr'] | |
out_dump = json.dumps(dump, indent=2) | |
#print(out_dump) | |
# Copy to clipboard | |
from docking.dnd import GClipboard | |
from java.awt.datatransfer import Clipboard, StringSelection | |
clipboard = GClipboard.getSystemClipboard() | |
data = StringSelection(out_dump) | |
clipboard.setContents(data, None) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[ | |
{ | |
"src_obj": "ball_co_sph_src$7092", | |
"type": "dCcD_Sph", | |
"caller": "d_a_wz::daWZ_Create" | |
}, | |
{ | |
"src_obj": "body_co_cyl_src$7074", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_wz::daWZ_Create" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daWindMill_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daWindMill_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daWindMill_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_tri_src", | |
"type": "dCcD_Tri", | |
"caller": "daWall_c::set_tri" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daTori_Flag_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daToge_c::Create" | |
}, | |
{ | |
"src_obj": "defence_sph_src$9557", | |
"type": "dCcD_Sph", | |
"caller": "d_a_tn::daTn_Create" | |
}, | |
{ | |
"src_obj": "wepon2_sph_src$9556", | |
"type": "dCcD_Sph", | |
"caller": "d_a_tn::daTn_Create" | |
}, | |
{ | |
"src_obj": "wepon_sph_src$9555", | |
"type": "dCcD_Sph", | |
"caller": "d_a_tn::daTn_Create" | |
}, | |
{ | |
"src_obj": "head_sph_src$9554", | |
"type": "dCcD_Sph", | |
"caller": "d_a_tn::daTn_Create" | |
}, | |
{ | |
"src_obj": "tg_cyl_src$9553", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_tn::daTn_Create" | |
}, | |
{ | |
"src_obj": "co_cyl_src$9552", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_tn::daTn_Create" | |
}, | |
{ | |
"src_obj": "cyl_check_src", | |
"type": "dCcD_Cyl", | |
"caller": "daTagRet::Act_c::_create" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daSwProp_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daSwItem_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daSwAt_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daSteamTag_c::CreateInit" | |
}, | |
{ | |
"src_obj": "wepon_sph_src$7695", | |
"type": "dCcD_Sph", | |
"caller": "d_a_st::daSt_Create" | |
}, | |
{ | |
"src_obj": "body_sph_src$7694", | |
"type": "dCcD_Sph", | |
"caller": "d_a_st::daSt_Create" | |
}, | |
{ | |
"src_obj": "head_sph_src$7693", | |
"type": "dCcD_Sph", | |
"caller": "d_a_st::daSt_Create" | |
}, | |
{ | |
"src_obj": "m_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daPz_c::createInit" | |
}, | |
{ | |
"src_obj": "kantera_co_sph_src$6935", | |
"type": "dCcD_Sph", | |
"caller": "d_a_pw::daPW_Create" | |
}, | |
{ | |
"src_obj": "body_co_cyl_src$6934", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_pw::daPW_Create" | |
}, | |
{ | |
"src_obj": "at_sph_src$6127", | |
"type": "dCcD_Sph", | |
"caller": "d_a_pt::daPt_Create" | |
}, | |
{ | |
"src_obj": "cc_sph_src$6126", | |
"type": "dCcD_Sph", | |
"caller": "d_a_pt::daPt_Create" | |
}, | |
{ | |
"src_obj": "body_co_sph_src$6493", | |
"type": "dCcD_Sph", | |
"caller": "d_a_ph::daPH_Create" | |
}, | |
{ | |
"src_obj": "tg_hit_puropera_co_cyl$6492", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_ph::daPH_Create" | |
}, | |
{ | |
"src_obj": "at_hit_puropera_co_cyl$6491", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_ph::daPH_Create" | |
}, | |
{ | |
"src_obj": "m_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daOship_c::createInit" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjZouk::Act_c::_create" | |
}, | |
{ | |
"src_obj": "M_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daObjVyasi::Act_c::_create" | |
}, | |
{ | |
"src_obj": "M_cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daObjVyasi::Act_c::_create" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjVyasi::Act_c::_create" | |
}, | |
{ | |
"src_obj": "M_co_cyl_data", | |
"type": "dCcD_Cyl", | |
"caller": "daObjVtil_c::init_co" | |
}, | |
{ | |
"src_obj": "cyl_check_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjVolcano::Act_c::Create" | |
}, | |
{ | |
"src_obj": "cyl_src_base", | |
"type": "dCcD_Cyl", | |
"caller": "daObjVmc::Act_c::CreateInit" | |
}, | |
{ | |
"src_obj": "cyl_check_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjVfan::Act_c::Create" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjTry::Act_c::init_cc" | |
}, | |
{ | |
"src_obj": "l_daObjTrap_cyl_data", | |
"type": "dCcD_Cyl", | |
"caller": "daObjTrap_c::_create" | |
}, | |
{ | |
"src_obj": "l_tri_src", | |
"type": "dCcD_Tri", | |
"caller": "daObjTnTrap_c::_create" | |
}, | |
{ | |
"src_obj": "l_tri_src", | |
"type": "dCcD_Tri", | |
"caller": "daObjTapestry_c::init_cc" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjRflw_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjPlant_c::CreateInit" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjPaper::Act_c::_create" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjOspbox::Act_c::Create" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjMtest::Act_c::Create" | |
}, | |
{ | |
"src_obj": "M_cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daObjMmrr::Act_c::init_cc" | |
}, | |
{ | |
"src_obj": "M_tri_src", | |
"type": "dCcD_Tri", | |
"caller": "daObjMmrr::Act_c::init_cc" | |
}, | |
{ | |
"src_obj": "sph_check_src", | |
"type": "dCcD_Sph", | |
"caller": "daObjMkiek::Act_c::Create" | |
}, | |
{ | |
"src_obj": "M_tri_src", | |
"type": "dCcD_Tri", | |
"caller": "daObjMkie::Act_c::init_cc" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjLight::Act_c::init_collision" | |
}, | |
{ | |
"src_obj": "l_cps_src_huta", | |
"type": "dCcD_Cps", | |
"caller": "daObjKanoke_c::createInit" | |
}, | |
{ | |
"src_obj": "l_cps_src_body", | |
"type": "dCcD_Cps", | |
"caller": "daObjKanoke_c::createInit" | |
}, | |
{ | |
"src_obj": "M_cps_srcS", | |
"type": "dCcD_Cps", | |
"caller": "daObjHomen::Act_c::_create" | |
}, | |
{ | |
"src_obj": "M_cps_srcL", | |
"type": "dCcD_Cps", | |
"caller": "daObjHomen::Act_c::_create" | |
}, | |
{ | |
"src_obj": "M_sph_srcL", | |
"type": "dCcD_Sph", | |
"caller": "daObjHomen::Act_c::_create" | |
}, | |
{ | |
"src_obj": "M_sph_srcS", | |
"type": "dCcD_Sph", | |
"caller": "daObjHomen::Act_c::_create" | |
}, | |
{ | |
"src_obj": "M_sph_data", | |
"type": "dCcD_Sph", | |
"caller": "daObjHha_c::init_co" | |
}, | |
{ | |
"src_obj": "M_cyl_data", | |
"type": "dCcD_Cyl", | |
"caller": "daObjHha_c::init_co" | |
}, | |
{ | |
"src_obj": "l_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daObjHcbh_c::_create" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjHcbh_c::_create" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjHat_c::createInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjGtaki_c::CreateInit" | |
}, | |
{ | |
"src_obj": "M_cyl_srcW", | |
"type": "dCcD_Cyl", | |
"caller": "daObjFtree::Act_c::_create" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjFtree::Act_c::_create" | |
}, | |
{ | |
"src_obj": "M_cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daObjFlame::Act_c::_create" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjFirewall_c::_create" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjFigure_c::createInit" | |
}, | |
{ | |
"src_obj": "M_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daObjFerris::Act_c::_create" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjFerris::Act_c::_create" | |
}, | |
{ | |
"src_obj": "sph_check_src", | |
"type": "dCcD_Sph", | |
"caller": "daObjEskban::Act_c::Create" | |
}, | |
{ | |
"src_obj": "cyl_camera_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjEskban::Act_c::Create" | |
}, | |
{ | |
"src_obj": "cyl_check_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjEskban::Act_c::Create" | |
}, | |
{ | |
"src_obj": "cyl_check_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjEkskz::Act_c::Create" | |
}, | |
{ | |
"src_obj": "sph_check_src", | |
"type": "dCcD_Sph", | |
"caller": "daObjEbomzo::Act_c::Create" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjDrift::Act_c::Create" | |
}, | |
{ | |
"src_obj": "sph_check_src", | |
"type": "dCcD_Sph", | |
"caller": "daObjDragonhead_c::CreateInit" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjBuoyflag::Act_c::_create" | |
}, | |
{ | |
"src_obj": "l_daObjAjav_hint_cyl_data", | |
"type": "dCcD_Cyl", | |
"caller": "daObjAjav::Act_c::_create" | |
}, | |
{ | |
"src_obj": "l_daObjAjav_cyl_data", | |
"type": "dCcD_Cyl", | |
"caller": "daObjAjav::Act_c::_create" | |
}, | |
{ | |
"src_obj": "l_daObjAjav_sph_data", | |
"type": "dCcD_Sph", | |
"caller": "daObjAjav::Act_c::_create" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjItnak::Act_c::_create" | |
}, | |
{ | |
"src_obj": "body_cyl_src$7378", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_nz::daNZ_CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Sarace_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Rsh1_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daNpcRoten_c::createInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src2", | |
"type": "dCcD_Cyl", | |
"caller": "daNpcPhoto_c::createInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_P1_c::_create" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Os_c::init" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Kg2_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Kg1_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_kam_at_cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daNpc_kam_c::init" | |
}, | |
{ | |
"src_obj": "l_tg_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daNpc_kam_c::init" | |
}, | |
{ | |
"src_obj": "l_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daNpc_kam_c::init" | |
}, | |
{ | |
"src_obj": "l_cpsAt_src", | |
"type": "dCcD_Cps", | |
"caller": "daNpc_Ji1_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cylAt_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Ji1_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl2_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Ji1_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Ji1_c::CreateInit" | |
}, | |
{ | |
"src_obj": "dNpc_hr_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Hr_c::init" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Ds1_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Btsw2_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Btsw_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Bs1_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Bmsw_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Bms1_c::CreateInit" | |
}, | |
{ | |
"src_obj": "eye_sph_src$7568", | |
"type": "dCcD_Sph", | |
"caller": "d_a_mt::daMt_Create" | |
}, | |
{ | |
"src_obj": "sph_src$7567", | |
"type": "dCcD_Sph", | |
"caller": "d_a_mt::daMt_Create" | |
}, | |
{ | |
"src_obj": "cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daMozo_c::CreateInit" | |
}, | |
{ | |
"src_obj": "defence_sph_src$8698", | |
"type": "dCcD_Sph", | |
"caller": "d_a_mo2::daMo2_Create" | |
}, | |
{ | |
"src_obj": "wepon2_sph_src$8697", | |
"type": "dCcD_Sph", | |
"caller": "d_a_mo2::daMo2_Create" | |
}, | |
{ | |
"src_obj": "wepon_sph_src$8696", | |
"type": "dCcD_Sph", | |
"caller": "d_a_mo2::daMo2_Create" | |
}, | |
{ | |
"src_obj": "head_sph_src$8695", | |
"type": "dCcD_Sph", | |
"caller": "d_a_mo2::daMo2_Create" | |
}, | |
{ | |
"src_obj": "tg_cyl_src$8694", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_mo2::daMo2_Create" | |
}, | |
{ | |
"src_obj": "co_cyl_src$8693", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_mo2::daMo2_Create" | |
}, | |
{ | |
"src_obj": "mesh_cc_sph_src$4869", | |
"type": "dCcD_Sph", | |
"caller": "d_a_mant::daMant_Create" | |
}, | |
{ | |
"src_obj": "wind_cc_sph_src$4868", | |
"type": "dCcD_Sph", | |
"caller": "d_a_mant::daMant_Create" | |
}, | |
{ | |
"src_obj": "l_sph_src_col", | |
"type": "dCcD_Sph", | |
"caller": "daMachine_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_sph_src_at", | |
"type": "dCcD_Sph", | |
"caller": "daMachine_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daLlift_c::CreateInit" | |
}, | |
{ | |
"src_obj": "p_co_cyl_src$4723", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_klft::daKlft_Create" | |
}, | |
{ | |
"src_obj": "utiwa_sph_src$4722", | |
"type": "dCcD_Sph", | |
"caller": "d_a_klft::daKlft_Create" | |
}, | |
{ | |
"src_obj": "utiwa_sph_src$4715", | |
"type": "dCcD_Sph", | |
"caller": "d_a_kita::daKita_Create" | |
}, | |
{ | |
"src_obj": "body_co_cyl$4396", | |
"type": "dCcD_Cyl", | |
"caller": "dDoor_ssk_sub_c::init" | |
}, | |
{ | |
"src_obj": "co_sph_src$7224", | |
"type": "dCcD_Sph", | |
"caller": "d_a_kb::daKb_Create" | |
}, | |
{ | |
"src_obj": "l_cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daGy_c::createInit" | |
}, | |
{ | |
"src_obj": "l_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daGy_c::createInit" | |
}, | |
{ | |
"src_obj": "l_sph_head_src", | |
"type": "dCcD_Sph", | |
"caller": "daGy_c::createInit" | |
}, | |
{ | |
"src_obj": "wepon_sph_src$7601", | |
"type": "dCcD_Sph", | |
"caller": "d_a_gnd::daGnd_Create" | |
}, | |
{ | |
"src_obj": "chest_sph_src$7600", | |
"type": "dCcD_Sph", | |
"caller": "d_a_gnd::daGnd_Create" | |
}, | |
{ | |
"src_obj": "head_sph_src$7599", | |
"type": "dCcD_Sph", | |
"caller": "d_a_gnd::daGnd_Create" | |
}, | |
{ | |
"src_obj": "cc_cyl_src$7598", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_gnd::daGnd_Create" | |
}, | |
{ | |
"src_obj": "wind_co_cyl_src$7788", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_gm::daGM_Create" | |
}, | |
{ | |
"src_obj": "wing_co_cyl_src$7787", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_gm::daGM_Create" | |
}, | |
{ | |
"src_obj": "body_co_cyl_src$7786", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_gm::daGM_Create" | |
}, | |
{ | |
"src_obj": "weapon_co_sph_src$7785", | |
"type": "dCcD_Sph", | |
"caller": "d_a_gm::daGM_Create" | |
}, | |
{ | |
"src_obj": "m_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daFm_c::createInit" | |
}, | |
{ | |
"src_obj": "m_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daFm_c::createInit" | |
}, | |
{ | |
"src_obj": "at_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daFire_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_co_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daFire_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daFire_c::CreateInit" | |
}, | |
{ | |
"src_obj": "at_sph_src$4613", | |
"type": "dCcD_Sph", | |
"caller": "d_a_fgmahou::daFgmahou_Create" | |
}, | |
{ | |
"src_obj": "tg_sph_src$4612", | |
"type": "dCcD_Sph", | |
"caller": "d_a_fgmahou::daFgmahou_Create" | |
}, | |
{ | |
"src_obj": "ball_at_sph_src$8273", | |
"type": "dCcD_Sph", | |
"caller": "d_a_fganon::daFganon_Create" | |
}, | |
{ | |
"src_obj": "ball_tg_sph_src$8272", | |
"type": "dCcD_Sph", | |
"caller": "d_a_fganon::daFganon_Create" | |
}, | |
{ | |
"src_obj": "wepon_sph_src$8271", | |
"type": "dCcD_Sph", | |
"caller": "d_a_fganon::daFganon_Create" | |
}, | |
{ | |
"src_obj": "cc_cyl_src$8270", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_fganon::daFganon_Create" | |
}, | |
{ | |
"src_obj": "l_cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daFan_c::Create" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daDekuItem_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daDaiocta_Eye_c::createInit" | |
}, | |
{ | |
"src_obj": "m_cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daDaiocta_c::createInit" | |
}, | |
{ | |
"src_obj": "m_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daDaiocta_c::createInit" | |
}, | |
{ | |
"src_obj": "hs_sph_src$5302", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bwds::daBwds_Create" | |
}, | |
{ | |
"src_obj": "body_sph_src$5301", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bwds::daBwds_Create" | |
}, | |
{ | |
"src_obj": "cc_sph_src$5300", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bwds::daBwds_Create" | |
}, | |
{ | |
"src_obj": "bero_co_sph_src$7714", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bwd::daBwd_Create" | |
}, | |
{ | |
"src_obj": "bero_sph_src$7713", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bwd::daBwd_Create" | |
}, | |
{ | |
"src_obj": "body_sph_src$7712", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bwd::daBwd_Create" | |
}, | |
{ | |
"src_obj": "hand_cyl_src$7433", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_btd::daBtd_Create" | |
}, | |
{ | |
"src_obj": "sibuki_sph_src$7432", | |
"type": "dCcD_Sph", | |
"caller": "d_a_btd::daBtd_Create" | |
}, | |
{ | |
"src_obj": "fire_sph_src$7431", | |
"type": "dCcD_Sph", | |
"caller": "d_a_btd::daBtd_Create" | |
}, | |
{ | |
"src_obj": "eye_sph_src$7430", | |
"type": "dCcD_Sph", | |
"caller": "d_a_btd::daBtd_Create" | |
}, | |
{ | |
"src_obj": "at_sph_src$7429", | |
"type": "dCcD_Sph", | |
"caller": "d_a_btd::daBtd_Create" | |
}, | |
{ | |
"src_obj": "beam_sph_src$8108", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bst::daBst_Create" | |
}, | |
{ | |
"src_obj": "eye_sph_src$8107", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bst::daBst_Create" | |
}, | |
{ | |
"src_obj": "finger_sph_src$8106", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bst::daBst_Create" | |
}, | |
{ | |
"src_obj": "core_cyl_src$8105", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_bst::daBst_Create" | |
}, | |
{ | |
"src_obj": "cc_cyl_src$8104", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_bst::daBst_Create" | |
}, | |
{ | |
"src_obj": "damage_ball_co_sph_src$9036", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bpw::damage_ball_create_init" | |
}, | |
{ | |
"src_obj": "kantera_co_sph_src$8996", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bpw::kantera_create_init" | |
}, | |
{ | |
"src_obj": "body_at_sph_src$8901", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bpw::body_create_init" | |
}, | |
{ | |
"src_obj": "body_co_sph_src$8900", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bpw::body_create_init" | |
}, | |
{ | |
"src_obj": "body_cyl_src$6433", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_bo::daBO_Create" | |
}, | |
{ | |
"src_obj": "foot_co_sph_src$6432", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bo::daBO_Create" | |
}, | |
{ | |
"src_obj": "head_co_sph_src$6431", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bo::daBO_Create" | |
}, | |
{ | |
"src_obj": "cc_sph_src$5121", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bmdhand::daBmdhand_Create" | |
}, | |
{ | |
"src_obj": "cc_sph_src$5008", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bmdfoot::daBmdfoot_Create" | |
}, | |
{ | |
"src_obj": "co_cyl_src$6387", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_bmd::daBmd_Create" | |
}, | |
{ | |
"src_obj": "core_sph_src$6386", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bmd::daBmd_Create" | |
}, | |
{ | |
"src_obj": "body_sph_src$6385", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bmd::daBmd_Create" | |
}, | |
{ | |
"src_obj": "body_co_sph_src$6329", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bl::daBL_Create" | |
}, | |
{ | |
"src_obj": "defence_sph_src$9860", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bk::daBk_Create" | |
}, | |
{ | |
"src_obj": "wepon_sph_src$9859", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bk::daBk_Create" | |
}, | |
{ | |
"src_obj": "head_sph_src$9858", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bk::daBk_Create" | |
}, | |
{ | |
"src_obj": "tg_cyl_src$9857", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_bk::daBk_Create" | |
}, | |
{ | |
"src_obj": "co_cyl_src$9856", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_bk::daBk_Create" | |
}, | |
{ | |
"src_obj": "core_sph_src$6133", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bgn3::daBgn3_Create" | |
}, | |
{ | |
"src_obj": "cc_sph_src$6132", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bgn3::daBgn3_Create" | |
}, | |
{ | |
"src_obj": "core_sph_src$5826", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bgn2::daBgn2_Create" | |
}, | |
{ | |
"src_obj": "cc_sph_src$5825", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bgn2::daBgn2_Create" | |
}, | |
{ | |
"src_obj": "core_sph_src$8368", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bgn::daBgn_Create" | |
}, | |
{ | |
"src_obj": "cc_sph_src$8367", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bgn::daBgn_Create" | |
}, | |
{ | |
"src_obj": "hahen_sph_src$4970", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bdkobj::daBdkobj_Create" | |
}, | |
{ | |
"src_obj": "cc_cyl_src$4966", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_bdkobj::daBdkobj_Create" | |
}, | |
{ | |
"src_obj": "eff_sph_src$8619", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bdk::daBdk_Create" | |
}, | |
{ | |
"src_obj": "kamen_sph_src$8618", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bdk::daBdk_Create" | |
}, | |
{ | |
"src_obj": "wind_at_sph_src$8617", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bdk::daBdk_Create" | |
}, | |
{ | |
"src_obj": "foot_cc_sph_src$8616", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bdk::daBdk_Create" | |
}, | |
{ | |
"src_obj": "body_cc_sph_src$8615", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bdk::daBdk_Create" | |
}, | |
{ | |
"src_obj": "tosaka_tg_sph_src$8614", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bdk::daBdk_Create" | |
}, | |
{ | |
"src_obj": "head_tg_sph_src$8613", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bdk::daBdk_Create" | |
}, | |
{ | |
"src_obj": "head_at_sph_src$8612", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bdk::daBdk_Create" | |
}, | |
{ | |
"src_obj": "body_co_sph_src$6695", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bb::daBb_Create" | |
}, | |
{ | |
"src_obj": "body_tg_sph_src$6694", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bb::daBb_Create" | |
}, | |
{ | |
"src_obj": "head_tg_sph_src$6693", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bb::daBb_Create" | |
}, | |
{ | |
"src_obj": "head_at_sph_src$6692", | |
"type": "dCcD_Sph", | |
"caller": "d_a_bb::daBb_Create" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daAleaf_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daWindTag::daWindTag_c::CreateInit" | |
}, | |
{ | |
"src_obj": "bm_sph_src$5252", | |
"type": "dCcD_Sph", | |
"caller": "d_a_sss::daSss_Create" | |
}, | |
{ | |
"src_obj": "tg_sph_src$5251", | |
"type": "dCcD_Sph", | |
"caller": "d_a_sss::daSss_Create" | |
}, | |
{ | |
"src_obj": "tg_sph_src$5414", | |
"type": "dCcD_Sph", | |
"caller": "d_a_ss::daSs_Create" | |
}, | |
{ | |
"src_obj": "bm_sph_src$5154", | |
"type": "dCcD_Sph", | |
"caller": "d_a_sitem::daSitem_Create" | |
}, | |
{ | |
"src_obj": "tg_sph_src$5153", | |
"type": "dCcD_Sph", | |
"caller": "d_a_sitem::daSitem_Create" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daSie_Flag_c::CreateInit" | |
}, | |
{ | |
"src_obj": "sph_src$9559", | |
"type": "dCcD_Sph", | |
"caller": "daShip_c::create" | |
}, | |
{ | |
"src_obj": "cyl_src$9558", | |
"type": "dCcD_Cyl", | |
"caller": "daShip_c::create" | |
}, | |
{ | |
"src_obj": "bm_sph_src$4968", | |
"type": "dCcD_Sph", | |
"caller": "d_a_shand::daShand_Create" | |
}, | |
{ | |
"src_obj": "tg_cyl_src$4967", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_shand::daShand_Create" | |
}, | |
{ | |
"src_obj": "m_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daSaku_c::setCol" | |
}, | |
{ | |
"src_obj": "tama_tg_co_sph_src$6070", | |
"type": "dCcD_Sph", | |
"caller": "d_a_oq::daOQ_Create" | |
}, | |
{ | |
"src_obj": "tama_at_co_sph_src$6069", | |
"type": "dCcD_Sph", | |
"caller": "d_a_oq::daOQ_Create" | |
}, | |
{ | |
"src_obj": "body_at_cyl_src$6068", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_oq::daOQ_Create" | |
}, | |
{ | |
"src_obj": "body_co_cyl_src$6067", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_oq::daOQ_Create" | |
}, | |
{ | |
"src_obj": "M_tri_src", | |
"type": "dCcD_Tri", | |
"caller": "daObjSwlight::Act_c::init_cc" | |
}, | |
{ | |
"src_obj": "M_cyl_src_tg", | |
"type": "dCcD_Cyl", | |
"caller": "daObjSwhammer::Act_c::Create" | |
}, | |
{ | |
"src_obj": "M_cyl_src_co", | |
"type": "dCcD_Cyl", | |
"caller": "daObjSwhammer::Act_c::Create" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjSwflat::Act_c::Create" | |
}, | |
{ | |
"src_obj": "cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daObj_Stair_c::_create" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObj_MjDoor_c::CreateInit" | |
}, | |
{ | |
"src_obj": "m_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daObj_Canon_c::createInit" | |
}, | |
{ | |
"src_obj": "l_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daBemos_c::CreateInit1" | |
}, | |
{ | |
"src_obj": "l_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daBemos_c::CreateInit2" | |
}, | |
{ | |
"src_obj": "l_cylGuard_src", | |
"type": "dCcD_Cyl", | |
"caller": "daBemos_c::CreateInit3" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daBemos_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_tg_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjBarrier_c::_create" | |
}, | |
{ | |
"src_obj": "l_cyl_at_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjBarrier_c::_create" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daBalancelift_c::CreateInit" | |
}, | |
{ | |
"src_obj": "body_cyl_src$4506", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_nzg::daNZG_Create" | |
}, | |
{ | |
"src_obj": "m_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daNpc_So_c::createInit" | |
}, | |
{ | |
"src_obj": "l_wind_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Md_c::init" | |
}, | |
{ | |
"src_obj": "l_fan_light_cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daNpc_Md_c::init" | |
}, | |
{ | |
"src_obj": "l_light_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Md_c::init" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Md_c::init" | |
}, | |
{ | |
"src_obj": "l_wind_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Cb1_c::init" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Cb1_c::init" | |
}, | |
{ | |
"src_obj": "himo_cyl_src$4995", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_mflft::daMflft_Create" | |
}, | |
{ | |
"src_obj": "body_co_sph_src$5586", | |
"type": "dCcD_Sph", | |
"caller": "d_a_ks::daKS_Create" | |
}, | |
{ | |
"src_obj": "at_sph_src$4748", | |
"type": "dCcD_Sph", | |
"caller": "d_a_kantera::daKantera_Create" | |
}, | |
{ | |
"src_obj": "co_sph_src$5588", | |
"type": "dCcD_Sph", | |
"caller": "d_a_kamome::daKamome_Create" | |
}, | |
{ | |
"src_obj": "l_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daHys_c::Create" | |
}, | |
{ | |
"src_obj": "l_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daHmlif_c::Create" | |
}, | |
{ | |
"src_obj": "sph2_src$4840", | |
"type": "dCcD_Sph", | |
"caller": "d_a_himo3::daHimo3_Create" | |
}, | |
{ | |
"src_obj": "sph_src$4839", | |
"type": "dCcD_Sph", | |
"caller": "d_a_himo3::daHimo3_Create" | |
}, | |
{ | |
"src_obj": "cc_cyl_src$4837", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_himo3::daHimo3_Create" | |
}, | |
{ | |
"src_obj": "cc_sph_src$4533", | |
"type": "dCcD_Sph", | |
"caller": "d_a_ff::daFf_Create" | |
}, | |
{ | |
"src_obj": "m_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daFallRock_c::create" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daDai_c::CreateInit" | |
}, | |
{ | |
"src_obj": "body_co_cyl$7109", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_cc::daCC_Create" | |
}, | |
{ | |
"src_obj": "canon_cyl2_src", | |
"type": "dCcD_Cyl", | |
"caller": "daCanon_c::_create" | |
}, | |
{ | |
"src_obj": "canon_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daCanon_c::_create" | |
}, | |
{ | |
"src_obj": "at_cps_src$5308", | |
"type": "dCcD_Cps", | |
"caller": "daBoko_c::create" | |
}, | |
{ | |
"src_obj": "sph_src$5307", | |
"type": "dCcD_Sph", | |
"caller": "daBoko_c::create" | |
}, | |
{ | |
"src_obj": "cps2_src", | |
"type": "dCcD_Cps", | |
"caller": "daBeam_c::CreateInit" | |
}, | |
{ | |
"src_obj": "cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daBeam_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daAmiProp_c::CreateInit" | |
}, | |
{ | |
"src_obj": "sword_co_cyl_src$5876", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_am2::daAM2_Create" | |
}, | |
{ | |
"src_obj": "body_co_cyl_src$5875", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_am2::daAM2_Create" | |
}, | |
{ | |
"src_obj": "week_co_sph_src$5874", | |
"type": "dCcD_Sph", | |
"caller": "d_a_am2::daAM2_Create" | |
}, | |
{ | |
"src_obj": "eye_co_sph_src$5873", | |
"type": "dCcD_Sph", | |
"caller": "d_a_am2::daAM2_Create" | |
}, | |
{ | |
"src_obj": "sword_co_cyl_src$5631", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_am::daAM_Create" | |
}, | |
{ | |
"src_obj": "body_co_cyl_src$5630", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_am::daAM_Create" | |
}, | |
{ | |
"src_obj": "mouth_co_sph_src$5629", | |
"type": "dCcD_Sph", | |
"caller": "d_a_am::daAM_Create" | |
}, | |
{ | |
"src_obj": "eye_co_sph_src$5628", | |
"type": "dCcD_Sph", | |
"caller": "d_a_am::daAM_Create" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daTsubo::Act_c::create_init_cc" | |
}, | |
{ | |
"src_obj": "l_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daTama_c::createInit" | |
}, | |
{ | |
"src_obj": "M_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daTagLight::Act_c::_create" | |
}, | |
{ | |
"src_obj": "sph_check_src", | |
"type": "dCcD_Sph", | |
"caller": "daTagAttention::Act_c::_create" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daSwhit0_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daSwhit0_c::CreateInit" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daStone2::Act_c::Create" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daStone::Act_c::_create" | |
}, | |
{ | |
"src_obj": "body_co_cyl$4403", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_ssk::daSsk_Create" | |
}, | |
{ | |
"src_obj": "body_co_sph_src$4288", | |
"type": "dCcD_Sph", | |
"caller": "d_a_sk::daSk_Create" | |
}, | |
{ | |
"src_obj": "m_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daRd_c::createInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daRaceItem_c::CreateInit" | |
}, | |
{ | |
"src_obj": "m_cyl_huta_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObj_Warpt_c::initCollision" | |
}, | |
{ | |
"src_obj": "m_cyl_body_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObj_Warpt_c::initCollision" | |
}, | |
{ | |
"src_obj": "m_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjTpost_c::createInit" | |
}, | |
{ | |
"src_obj": "M_cyl_src_gap_co", | |
"type": "dCcD_Cyl", | |
"caller": "daObjShmrgrd_c::_create" | |
}, | |
{ | |
"src_obj": "M_cyl_src_tg", | |
"type": "dCcD_Cyl", | |
"caller": "daObjShmrgrd_c::_create" | |
}, | |
{ | |
"src_obj": "M_cyl_src_at", | |
"type": "dCcD_Cyl", | |
"caller": "daObjShmrgrd_c::_create" | |
}, | |
{ | |
"src_obj": "M_cyl_src_co", | |
"type": "dCcD_Cyl", | |
"caller": "daObjShmrgrd_c::_create" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjMshokki_c::_create" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjMovebox::Act_c::Create" | |
}, | |
{ | |
"src_obj": "l_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daObjLeaves_c::_create" | |
}, | |
{ | |
"src_obj": "m_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daObj_Ikada_c::createInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjIce_c::_create" | |
}, | |
{ | |
"src_obj": "l_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daObjHfuck1_c::_create" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjDoguu_c::CreateInit" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjBarrel2::Act_c::_create" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daObjBarrel::Act_c::_create" | |
}, | |
{ | |
"src_obj": "himo_cyl_src$4336", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_msw::daMsw_Create" | |
}, | |
{ | |
"src_obj": "sph_src$4291", | |
"type": "dCcD_Sph", | |
"caller": "d_a_lamp::daLamp_Create" | |
}, | |
{ | |
"src_obj": "co_sph_src$5878", | |
"type": "dCcD_Sph", | |
"caller": "d_a_ki::daKi_Create" | |
}, | |
{ | |
"src_obj": "tg_sph_src$5877", | |
"type": "dCcD_Sph", | |
"caller": "d_a_ki::daKi_Create" | |
}, | |
{ | |
"src_obj": "at_sph_src$5876", | |
"type": "dCcD_Sph", | |
"caller": "d_a_ki::daKi_Create" | |
}, | |
{ | |
"src_obj": "cyl_src$4889", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_kanban::daKanban_Create" | |
}, | |
{ | |
"src_obj": "co_sph_src$4248", | |
"type": "dCcD_Sph", | |
"caller": "d_a_jbo::daJBO_Create" | |
}, | |
{ | |
"src_obj": "cc_sph_src$4028", | |
"type": "dCcD_Sph", | |
"caller": "d_a_hitobj::daHitobj_Create" | |
}, | |
{ | |
"src_obj": "co_cyl_src$5156", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_ep::daEp_Create" | |
}, | |
{ | |
"src_obj": "sph_src$5145", | |
"type": "dCcD_Sph", | |
"caller": "d_a_ep::daEp_Create" | |
}, | |
{ | |
"src_obj": "M_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daComing3::Act_c::collision_init" | |
}, | |
{ | |
"src_obj": "himo_cyl_src$5817", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_bridge::CreateInit" | |
}, | |
{ | |
"src_obj": "body_cyl_src$4366", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_bita::daBita_Create" | |
}, | |
{ | |
"src_obj": "l_sph_src2", | |
"type": "dCcD_Sph", | |
"caller": "daBFlower_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daBFlower_c::actDead" | |
}, | |
{ | |
"src_obj": "l_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daBFlower_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daBFlower_c::CreateInit" | |
}, | |
{ | |
"src_obj": "bm_sph_src$4160", | |
"type": "dCcD_Sph", | |
"caller": "d_a_att::daAtt_Create" | |
}, | |
{ | |
"src_obj": "cc_cyl_src$4159", | |
"type": "dCcD_Cyl", | |
"caller": "d_a_att::daAtt_Create" | |
}, | |
{ | |
"src_obj": "sita_sph_src$4156", | |
"type": "dCcD_Sph", | |
"caller": "d_a_att::daAtt_Create" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daAgbsw0_c::create" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpcSv_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Pf1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Ym1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Ko1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Ob1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpcAuction_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Kk1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpcPeople_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_P2_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Uk_c::init" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Co1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Pm1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Ls1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Kf1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Zk1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Gk1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Zl1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpcMt_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Hr_c::init" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_So_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daTbox_c::CreateInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Kp1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpcRoten_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpcPhoto_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpcMn_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Aj1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Ho_c::init" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Ba1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Bm1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Ac1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpcAh_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Bj1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Gp1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Km1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Mk_c::init" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Tc_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpcBmcon_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Tt_c::init" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Yw1_c::createInit" | |
}, | |
{ | |
"src_obj": "dNpc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Hi1_c::createInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daSpcItem01_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_fan_wind_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daPy_lk_c::playerInit" | |
}, | |
{ | |
"src_obj": "l_fan_wind_cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daPy_lk_c::playerInit" | |
}, | |
{ | |
"src_obj": "l_at_cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daPy_lk_c::playerInit" | |
}, | |
{ | |
"src_obj": "l_at_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daPy_lk_c::playerInit" | |
}, | |
{ | |
"src_obj": "l_wind_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daPy_lk_c::playerInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daPy_lk_c::playerInit" | |
}, | |
{ | |
"src_obj": "cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daObj_Search::Act_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNpc_Fa1_c::createInit" | |
}, | |
{ | |
"src_obj": "l_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daNh_c::init" | |
}, | |
{ | |
"src_obj": "m_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daItem_c::CreateInit" | |
}, | |
{ | |
"src_obj": "m_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "daIball_c::CreateInit" | |
}, | |
{ | |
"src_obj": "l_at_cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daHookshot_c::create" | |
}, | |
{ | |
"src_obj": "sph_src$5934", | |
"type": "dCcD_Sph", | |
"caller": "d_a_himo2::daHimo2_Create" | |
}, | |
{ | |
"src_obj": "l_at_cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daBoomerang_c::create" | |
}, | |
{ | |
"src_obj": "M_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daBomb2::Act_c::cc_init" | |
}, | |
{ | |
"src_obj": "l_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daBomb_c::create_init" | |
}, | |
{ | |
"src_obj": "fire_at_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "c_damagereaction::enemy_fire" | |
}, | |
{ | |
"src_obj": "cc_cyl_src", | |
"type": "dCcD_Cyl", | |
"caller": "c_damagereaction::enemy_ice" | |
}, | |
{ | |
"src_obj": "m_co_sph_src", | |
"type": "dCcD_Sph", | |
"caller": "daArrow_c::createInit" | |
}, | |
{ | |
"src_obj": "m_at_cps_src", | |
"type": "dCcD_Cps", | |
"caller": "daArrow_c::createInit" | |
} | |
] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment