link ac_train_door

This commit is contained in:
Prakxo
2023-06-24 15:16:12 +02:00
parent 0aaa5d3cd4
commit 9891e85696
8 changed files with 118 additions and 2 deletions
+4
View File
@@ -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]
+14
View File
@@ -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
+3
View File
@@ -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);
+2
View File
@@ -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);
+1
View File
@@ -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 {
+2
View File
@@ -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
+91
View File
@@ -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);
}
}
+1 -2
View File
@@ -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;