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