Skip to content

Instantly share code, notes, and snippets.

@ammaraskar
Last active May 31, 2025 22:56
Show Gist options
  • Save ammaraskar/bac2dd8c14b01ec276360052c7608a39 to your computer and use it in GitHub Desktop.
Save ammaraskar/bac2dd8c14b01ec276360052c7608a39 to your computer and use it in GitHub Desktop.
Auto generate tww decomp dCcD_Src structs
"""
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()
# 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)
[
{
"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