diff --git a/config/rel_slices.yml b/config/rel_slices.yml index b3815710..6b7f0a28 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -171,6 +171,10 @@ ac_set_ovl_insect.c: .rodata: [0x80644E00, 0x80644E28] .data: [0x8068CDE8, 0x8068E3C0] .bss: [0x812FD048, 0x812FD270] +ac_train_door.c: + .text: [0x804AC2D8, 0x804AC510] + .rodata: [0x80645F98, 0x80645FA8] + .data: [0x8068F5C0, 0x8068F600] m_huusui_room_ovl.c: .text: [0x804D1BBC, 0x804D2164] .rodata: [0x80646558, 0x806465C8] diff --git a/include/ac_train_door.h b/include/ac_train_door.h index df3dc59a..59d630fd 100644 --- a/include/ac_train_door.h +++ b/include/ac_train_door.h @@ -3,11 +3,25 @@ #include "types.h" #include "m_actor.h" +#include "c_keyframe.h" #ifdef __cplusplus extern "C" { #endif + +typedef struct traindoor_s { + ACTOR actor_class; + u8 pad [0x17C - 0x174]; + cKF_SkeletonInfo_R_c keyframe; + u8 pad2 [0x210 - 0x1ed]; + s_xyz work; + u8 pad3 [0x22e - 0x216]; + s_xyz target; + u8 pad4[0x24c - 0x234]; + int idle; +}TRAINDOOR_ACTOR; + extern ACTOR_PROFILE TrainDoor_Profile; #ifdef __cplusplus diff --git a/include/audio.h b/include/audio.h index 54e53971..9228515f 100644 --- a/include/audio.h +++ b/include/audio.h @@ -3,6 +3,7 @@ #include "types.h" #include "audio_defs.h" +#include "m_lib.h" #ifdef __cplusplus extern "C" { @@ -22,6 +23,8 @@ extern void sAdo_SysLevStart(u8 id); extern void sAdo_SysTrgStart(u16 id); +extern void sAdo_OngenTrgStart(u16 id, xyz_t* pos); + extern void sAdos_KishaStatusLevel(f32 speed, u32 ongenNum1, u16 angle1, f32 distance1, u32 ongenNum2, u16 angle2, f32 distance2); extern void sAdos_KishaStatusTrg(u8 state); diff --git a/include/c_keyframe.h b/include/c_keyframe.h index 13f7f8f5..fee2dbbd 100644 --- a/include/c_keyframe.h +++ b/include/c_keyframe.h @@ -89,6 +89,8 @@ typedef int (*cKF_draw_callback)(GAME*, cKF_SkeletonInfo_R_c*, int, Gfx**, u8*, #define cKF_FRAMETIME (1.0f / cKF_FRAMERATE) #define cKF_EPSILON 0.008f +extern int cKF_FrameControl_passCheck_now(cKF_FrameControl_c* fc, f32 current); + extern f32 cKF_HermitCalc(f32 t, f32 tension, f32 p0, f32 p1, f32 m0, f32 m1); extern void cKF_SkeletonInfo_subRotInterpolation(f32 t, s16* out, s16 rot1, s16 rot2); diff --git a/include/m_actor.h b/include/m_actor.h index 9406b0ed..a3b5a1db 100644 --- a/include/m_actor.h +++ b/include/m_actor.h @@ -21,6 +21,7 @@ typedef void (*mActor_proc)(ACTOR*, GAME*); #define ACTOR_OBJ_BANK_NONE 0 #define ACTOR_OBJ_BANK_3 3 /* TODO: rename, also likely an enum */ #define ACTOR_OBJ_BANK_7 7 +#define ACTOR_OBJ_BANK_11 11 #define ACTOR_OBJ_BANK_12 12 enum actor_part { diff --git a/include/m_name_table.h b/include/m_name_table.h index cee631f9..53d56bbe 100644 --- a/include/m_name_table.h +++ b/include/m_name_table.h @@ -478,6 +478,8 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define MISC_ACTOR_START 0x9000 #define MISC_ACTOR_SAMPLE MISC_ACTOR_START +#define TRAIN_DOOR 0xA011 + #define SP_NPC_START 0xD000 #define SP_NPC_ARTIST (SP_NPC_START + 0) // D000 #define SP_NPC_BROKER (SP_NPC_START + 1) // D001 diff --git a/rel/ac_train_door.c b/rel/ac_train_door.c new file mode 100644 index 00000000..97d9d687 --- /dev/null +++ b/rel/ac_train_door.c @@ -0,0 +1,91 @@ +#include "ac_train_door.h" + +#include "audio.h" +#include "m_rcp.h" +#include "m_name_table.h" + +static void aTRD_actor_ct(ACTOR* actor, GAME* game); +static void aTRD_actor_dt(ACTOR* actor, GAME* game); +static void aTRD_actor_move(ACTOR* actor, GAME* game); +static void aTRD_actor_draw(ACTOR* actor, GAME* game); + +ACTOR_PROFILE TrainDoor_Profile = { + mAc_PROFILE_TRAINDOOR, + ACTOR_PART_BG, + ACTOR_STATE_NO_DRAW_WHILE_CULLED | ACTOR_STATE_NO_MOVE_WHILE_CULLED, + TRAIN_DOOR, + ACTOR_OBJ_BANK_11, + sizeof(TRAINDOOR_ACTOR), + &aTRD_actor_ct, + &aTRD_actor_dt, + &aTRD_actor_move, + &aTRD_actor_draw, + NULL +}; + +extern cKF_Skeleton_R_c cKF_bs_r_obj_romtrain_door; +extern cKF_Animation_R_c cKF_ba_r_obj_romtrain_door; + +static void aTRD_actor_ct(ACTOR* actor, GAME* game){ + TRAINDOOR_ACTOR* traindoor = (TRAINDOOR_ACTOR*)actor; + + cKF_SkeletonInfo_R_ct(&traindoor->keyframe, &cKF_bs_r_obj_romtrain_door, NULL, &traindoor->work, &traindoor->target); + cKF_SkeletonInfo_R_init(&traindoor->keyframe,traindoor->keyframe.skeleton, &cKF_ba_r_obj_romtrain_door,1.0f,51.0f,1.0f, + 0.0f,0.0f,0,NULL); + traindoor->keyframe.morph_counter = 0.0f; + cKF_SkeletonInfo_R_play(&traindoor->keyframe); +} + +static void aTRD_actor_dt(ACTOR* actor, GAME* game){ + TRAINDOOR_ACTOR* traindoor = (TRAINDOOR_ACTOR*)actor; + + cKF_SkeletonInfo_R_dt(&traindoor->keyframe); +} + +static void aTRD_set_door_SE(ACTOR* actor){ + TRAINDOOR_ACTOR* traindoor = (TRAINDOOR_ACTOR*)actor; + + static f32 chk_pat[] = {2.0f, 27.0f}; + static u16 se_no[] = {1042, 1043,0, 0,0,0, 0,0,0}; + int i; + + for(i = 0; i < 2; i++){ + + if(cKF_FrameControl_passCheck_now(&traindoor->keyframe.frame_control,chk_pat[i]) != 0){ + sAdo_OngenTrgStart(se_no[i], &traindoor->actor_class.world_position); + return; + } + } +} + +static void aTRD_actor_move(ACTOR* actor, GAME* game){ + TRAINDOOR_ACTOR* traindoor = (TRAINDOOR_ACTOR*)actor; + + if(traindoor->idle == 1){ + traindoor->idle = 0; + traindoor->keyframe.frame_control.speed = 0.5f; + } + + if(cKF_SkeletonInfo_R_play(&traindoor->keyframe) == 1){ + traindoor->keyframe.frame_control.current_frame = traindoor->keyframe.frame_control.start_frame; + traindoor->keyframe.frame_control.speed = 0.0f; + } + aTRD_set_door_SE(actor); +} + +static void aTRD_actor_draw(ACTOR* actor, GAME* game){ + TRAINDOOR_ACTOR* traindoor = (TRAINDOOR_ACTOR*)actor; + + cKF_SkeletonInfo_R_c* keyf = &traindoor->keyframe; + Gfx* mtx; + Mtx* mtxp; + + mtx = GRAPH_ALLOC(game->graph, (u32) keyf->skeleton->num_shown_joints * 64); + + mtxp = (Mtx*)mtx; + if(mtxp != NULL){ + _texture_z_light_fog_prim(game->graph); + texture_z_light_prim_xlu_disp(game->graph); + cKF_Si3_draw_R_SV(game,keyf, mtxp, NULL,NULL,NULL); + } +} \ No newline at end of file diff --git a/rel/c_keyframe.c b/rel/c_keyframe.c index 2abbc888..cfc0836a 100644 --- a/rel/c_keyframe.c +++ b/rel/c_keyframe.c @@ -59,8 +59,7 @@ static int cKF_FrameControl_passCheck(cKF_FrameControl_c* fc, f32 current, return 0; } -extern int cKF_FrameControl_passCheck_now(cKF_FrameControl_c* fc, f32 current, - f32* out) { +extern int cKF_FrameControl_passCheck_now(cKF_FrameControl_c* fc, f32 current) { f32 cur = fc->current_frame; f32 speed; int ret = 0;