#ifndef M_COLLISION_OBJ_H #define M_COLLISION_OBJ_H #include "types.h" #include "m_actor_type.h" #include "sys_math3d.h" #include "m_play_h.h" #ifdef __cplusplus extern "C" { #endif enum collision_type { ClObj_TYPE_JNT_SPH, ClObj_TYPE_PIPE, ClObj_TYPE_TRIS, ClObj_TYPE_NUM }; enum weight{ MASS_IMMOVABLE, MASS_HEAVY, MASS_NORMAL }; #define MASSTYPE_IMMOVABLE 0xFF #define MASSTYPE_HEAVY 0xFE typedef struct collision_obj_s { ACTOR* owner_actor; // actor which owns this collision object ACTOR* collided_actor; // actor which the owner collided with or NULL u8 collision_flags0; u8 collision_flags1; u8 collision_type; } ClObj_c; typedef struct collision_elem_s { u8 flags; } ClObjElem_c; typedef struct collision_pipe_attribute_s { Math3D_pipe_c pipe; } ClObjPipeAttr_c; typedef struct collision_pipe_s { ClObj_c collision_obj; ClObjElem_c element; ClObjPipeAttr_c attribute; } ClObjPipe_c; /* static data */ typedef struct collision_obj_data_s { u8 collision_flags0; u8 collision_flags1; u8 type; } ClObjData_c; typedef struct collision_obj_elem_data_s { u8 flags; } ClObjElemData_c; typedef struct collision_obj_pipe_attr_data_s { Math3D_pipe_c pipe; } ClObjPipeAttrData_c; typedef struct collision_obj_pipe_data_s { ClObjData_c collision_data; ClObjElemData_c element_data; ClObjPipeAttrData_c attribute_data; } ClObjPipeData_c; typedef struct collision_check_tris_element_attr_data_s{ xyz_t vtx[3]; }ClObjTrisElemAttrData_c; typedef struct collision_check_tris_element_data_s{ ClObjElemData_c element; ClObjTrisElemAttrData_c data; }ClObjTrisElemData_c; typedef struct collision_check_tris_element_s{ Math3D_triangle_c tri; xyz_t t; }ClObjTrisElemAttr_c; typedef struct collision_tris_elem_s{ ClObjElem_c element; ClObjTrisElemAttr_c attribute; }ClObjTrisElem_c; typedef struct collision_tris_s { ClObj_c collision_obj; int count; ClObjTrisElem_c* elements; } ClObjTris_c; typedef struct ClObjTris_Init { ClObjData_c data; int count; ClObjTrisElemData_c* elem_data; } ClObjTrisData_c; typedef struct collision_obj_joint_sphere_elem_attribute_s{ Math3D_sphere_c s1; Math3D_sphere_c s2; f32 unk8; u8 unk14; }ClObjJntSphElemAttr_c; typedef struct collision_joint_sphere_elem_s{ ClObjElem_c element; ClObjJntSphElemAttr_c attribute; }ClObjJntSphElem_c; typedef struct collision_joint_sphere_s { ClObj_c collision_obj; int count; ClObjJntSphElem_c* elements; }ClObjJntSph_c; #define Cl_COLLIDER_NUM 50 typedef struct collision_check_s { u16 flags; int collider_num; ClObj_c* collider_table[Cl_COLLIDER_NUM]; } CollisionCheck_c; /* This appears to again be copy-paste from OoT? */ typedef struct status_s { xyz_t collision_vec; s16 radius; s16 height; s16 offset; u8 weight; u8 hp; u8 damage; u8 damage_effect; u8 at_hit_effect; u8 ac_hit_effect; } Status_c; typedef struct status_data_s { u8 health; // assuming this is inherited from OoT, seems largely unused s16 radius; s16 height; s16 offset; u8 weight; } StatusData_c; typedef struct mco_work_s { int count; ClObj_c* colliders[10]; } McoWork; extern McoWork mco_work; typedef void (*CollisionOCFunction)(GAME*, CollisionCheck_c*, ClObj_c*,ClObj_c*); typedef int (*CollisionOCClear)(GAME*, ClObj_c*); typedef int (*CollisionClearFunction)(GAME*, ClObj_c*); extern void CollisionCheck_workTrisElemCenter(ClObjTrisElem_c *, xyz_t *); extern int ClObj_ct(GAME *, ClObj_c *); extern int ClObj_dt(GAME *, ClObj_c *); extern int ClObj_set4(GAME *, ClObj_c *, ACTOR *, ClObjData_c *); extern void ClObj_OCClear(GAME *, ClObj_c *); extern int ClObjElem_ct(ClObjElem_c *); extern int ClObjElem_set(ClObjElem_c *, ClObjElemData_c *); extern void ClObjElem_OCClear(GAME *, ClObjElem_c *); extern int ClObjJntSphElem_OCClear(GAME *, ClObjJntSphElem_c *); extern int ClObjJntSph_OCClear(GAME *, ClObj_c *); extern int ClObjPipeAttr_ct(GAME *, ClObjPipeAttr_c *); extern int ClObjPipeAttr_dt(GAME *, ClObjPipeAttr_c *); extern int ClObjPipeAttr_set(GAME *, ClObjPipeAttr_c *, ClObjPipeAttr_c *); extern int ClObjPipe_ct(GAME *, ClObjPipe_c *); extern int ClObjPipe_dt(GAME *, ClObjPipe_c *); extern int ClObjPipe_set5(GAME *, ClObjPipe_c *, ACTOR *, ClObjPipeData_c *); extern int ClObjPipe_OCClear(GAME *, ClObj_c *); extern int ClObjTrisElemAttr_ct(GAME *, ClObjTrisElemAttr_c *); extern int ClObjTrisElemAttr_dt(GAME *, ClObjTrisElemAttr_c *); extern int ClObjTrisElemAttr_set(GAME *, ClObjTrisElemAttr_c *, ClObjTrisElemAttrData_c *); extern int ClObjTrisElem_ct(GAME *, ClObjTrisElem_c *); extern int ClObjTrisElem_dt(GAME *, ClObjTrisElem_c *); extern int ClObjTrisElem_set(GAME *, ClObjTrisElem_c *, ClObjTrisElemData_c *); extern int ClObjTrisElem_OCClear(GAME *, ClObjTrisElem_c *); extern int ClObjTris_ct(GAME *, ClObjTris_c *); extern int ClObjTris_dt_nzf(GAME *, ClObjTris_c *); extern int ClObjTris_set5_nzm(GAME *, ClObjTris_c *, ACTOR *, ClObjTrisData_c *, ClObjTrisElem_c *); extern int ClObjTris_OCClear(GAME *, ClObj_c *); extern void CollisionCheck_ct(GAME *, CollisionCheck_c *); extern void CollisionCheck_dt(GAME *, CollisionCheck_c *); extern void CollisionCheck_clear(GAME *, CollisionCheck_c *); extern int CollisionCheck_setOC(GAME *, CollisionCheck_c *, ClObj_c *); extern int get_type(u8); extern void CollisionCheck_setOC_HitInfo(ClObj_c *, ClObjElem_c *, xyz_t *, ClObj_c *, ClObjElem_c *, xyz_t *, f32); extern void CollisionCheck_OC_JntSph_Vs_JntSph(GAME *, CollisionCheck_c *, ClObj_c *, ClObj_c *); extern void CollisionCheck_OC_JntSph_Vs_Pipe(GAME *, CollisionCheck_c *, ClObj_c *, ClObj_c *); extern void CollisionCheck_OC_Pipe_Vs_JntSph(GAME *, CollisionCheck_c *, ClObj_c *, ClObj_c *); extern void CollisionCheck_OC_Pipe_Vs_Pipe(GAME *, CollisionCheck_c *, ClObj_c *, ClObj_c *); extern int CollisionCheck_Check1ClObjNoOC(ClObj_c *); extern int CollisionCheck_Check2ClObjNoOC(ClObj_c *, ClObj_c *); extern void CollisionCheck_OC(GAME *, CollisionCheck_c *); extern void CollisionCheck_setOCC_HitInfo(GAME *, ClObj_c *, ClObjTrisElem_c *, xyz_t *, ClObj_c *, ClObjElem_c *, xyz_t *, xyz_t *); extern void CollisionCheck_OCC_Tris_Vs_JntSph(GAME *, CollisionCheck_c *, ClObjTris_c *, ClObjJntSph_c *); extern void CollisionCheck_OCC_Tris_Vs_Pipe(GAME *, CollisionCheck_c *, ClObjTris_c *, ClObjPipe_c *); extern int CollisionCheck_Check1ClObjNoOCC(ClObj_c *); extern void CollisionCheck_OCC(GAME *, CollisionCheck_c *); extern int ClObjTrisElem_OCCClear(GAME *, ClObjTrisElem_c *); extern int ClObj_OCCClear(GAME *, ClObj_c *); extern int ClObjTris_OCCClear(GAME *, ClObj_c *); extern int CollisionCheck_setOCC(GAME *, CollisionCheck_c *, ClObj_c *); extern void CollisionCheck_Status_ct(Status_c *); extern void CollisionCheck_Status_Clear(Status_c *); extern void CollisionCheck_Status_set3(Status_c *, StatusData_c *); extern int CollisionCheck_Uty_ActorWorldPosSetPipeC(ACTOR *, ClObjPipe_c *); #ifdef __cplusplus } #endif #endif