mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-23 06:34:18 -04:00
196 lines
5.7 KiB
C
196 lines
5.7 KiB
C
#include "ac_sample.h"
|
|
|
|
#include "m_demo.h"
|
|
#include "m_font.h"
|
|
#include "m_msg.h"
|
|
#include "m_mail.h"
|
|
#include "m_rcp.h"
|
|
#include "m_name_table.h"
|
|
#include "m_play.h"
|
|
|
|
static ClObjPipeData_c Ac_Sample_OcInfoData_forStand = {
|
|
{ 0x39, 0x20, ClObj_TYPE_PIPE }, // collision data
|
|
{ 1 }, // element data
|
|
// Pipe specs
|
|
{
|
|
30, // radius
|
|
60, // height
|
|
0, // offset
|
|
|
|
{ 0, 0, 0 } // center
|
|
}
|
|
};
|
|
|
|
static void Ac_Sample_ct_forCorect(ACTOR* actor, GAME* game) {
|
|
GAME_PLAY* play = (GAME_PLAY*)game;
|
|
SAMPLE_ACTOR* sample = (SAMPLE_ACTOR*)actor;
|
|
ClObjPipe_ct(play, &sample->stand);
|
|
ClObjPipe_set5(play, &sample->stand, (ACTOR*)actor, &Ac_Sample_OcInfoData_forStand);
|
|
}
|
|
|
|
static void Ac_Sample_Excute_Corect(SAMPLE_ACTOR* actor, GAME_PLAY* play) {
|
|
ClObjPipe_c* stand = &actor->stand;
|
|
|
|
CollisionCheck_Uty_ActorWorldPosSetPipeC((ACTOR*)actor, stand);
|
|
CollisionCheck_setOC(play, &play->collision_check, (ClObj_c*)stand);
|
|
}
|
|
|
|
static void Ac_Sample_Actor_dt(ACTOR* actor, GAME* game) {
|
|
SAMPLE_ACTOR* sample = (SAMPLE_ACTOR*)actor;
|
|
cKF_SkeletonInfo_R_c* keyframe = &sample->keyframe;
|
|
if (actor->child_actor != NULL) {
|
|
Actor_delete(actor->child_actor);
|
|
}
|
|
|
|
cKF_SkeletonInfo_R_dt(keyframe);
|
|
ClObjPipe_dt((GAME_PLAY*)game, &sample->stand);
|
|
}
|
|
|
|
static void Ac_Sample_Animation_Base(SAMPLE_ACTOR* actor) {
|
|
cKF_SkeletonInfo_R_play(&actor->keyframe);
|
|
}
|
|
|
|
static void Ac_Sample_Actor_wait_demo_ct(ACTOR* actor) {
|
|
// ドリキャス "Dreamcast"
|
|
static u8 str0[16] = { 0xDC, 0xB8, 0x97, 0x8C, 0x9D, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE };
|
|
|
|
// プレステ2 "Playstation 2"
|
|
static u8 str9[5] = { 0xE4, 0xBA, 0x9D, 0xA3, 0x32 };
|
|
|
|
static u8 str_mail[64];
|
|
|
|
mDemo_Set_msg_num(9);
|
|
mMsg_Set_item_str(mMsg_Get_base_window_p(), 0, str0, 6);
|
|
mMsg_Set_item_str(mMsg_Get_base_window_p(), 4, str9, 5);
|
|
mMsg_Set_free_str(mMsg_Get_base_window_p(), 0, str0, 16);
|
|
mMsg_Set_free_str(mMsg_Get_base_window_p(), 9, str9, 5);
|
|
mMsg_Set_mail_str(mMsg_Get_base_window_p(), 0, str_mail, 64);
|
|
}
|
|
|
|
static void Ac_Sample_Actor_main_wait(SAMPLE_ACTOR* actor, GAME_PLAY* play) {
|
|
Ac_Sample_Animation_Base(actor);
|
|
Actor_world_to_eye((ACTOR*)actor, 48.0f);
|
|
Ac_Sample_Excute_Corect(actor, play);
|
|
|
|
if (mDemo_Check(7, (ACTOR*)actor) == FALSE) {
|
|
mDemo_Request(7, (ACTOR*)actor, &Ac_Sample_Actor_wait_demo_ct);
|
|
}
|
|
else {
|
|
actor->main_action = 1;
|
|
}
|
|
}
|
|
|
|
static void Ac_Sample_Actor_main_talk(SAMPLE_ACTOR* actor, GAME_PLAY* play) {
|
|
Ac_Sample_Animation_Base(actor);
|
|
Actor_world_to_eye((ACTOR*)actor, 48.0f);
|
|
Ac_Sample_Excute_Corect(actor, play);
|
|
|
|
if (mDemo_Check(7, (ACTOR*)actor)) {
|
|
s16 angle = add_calc_short_angle2(&actor->actor_class.shape_info.rotation.y, actor->actor_class.player_angle_y, 1.0f, 5000, 100);
|
|
actor->actor_class.world_rotation.y = actor->actor_class.shape_info.rotation.y;
|
|
|
|
if (mDemo_Check_ListenAble() == FALSE && mDemo_Check_DiffAngle_forTalk(angle)) {
|
|
mDemo_Set_ListenAble();
|
|
}
|
|
}
|
|
else {
|
|
actor->main_action = 0;
|
|
}
|
|
}
|
|
|
|
typedef void (*Ac_Sample_Actor_PROC)(SAMPLE_ACTOR*, GAME_PLAY*);
|
|
|
|
static void Ac_Sample_Actor_main(ACTOR* actor, GAME* game) {
|
|
static Ac_Sample_Actor_PROC proc[] = { &Ac_Sample_Actor_main_wait, &Ac_Sample_Actor_main_talk };
|
|
|
|
SAMPLE_ACTOR* sample = (SAMPLE_ACTOR*)actor;
|
|
GAME_PLAY* play = (GAME_PLAY*)game;
|
|
|
|
if (sample->main_action < 0 || sample->main_action >= 2 || proc[sample->main_action] == NULL) {
|
|
return;
|
|
}
|
|
|
|
(*proc[sample->main_action])(sample, play);
|
|
}
|
|
|
|
extern cKF_Skeleton_R_c cKF_bs_r_hnw;
|
|
extern cKF_Animation_R_c cKF_ba_r_hnw_move;
|
|
|
|
static void Ac_Sample_Actor_ct(ACTOR* actor, GAME* game) {
|
|
cKF_SkeletonInfo_R_c* keyframe;
|
|
GAME_PLAY* play = (GAME_PLAY*)game;
|
|
SAMPLE_ACTOR* sample = (SAMPLE_ACTOR*)actor;
|
|
Object_Bank_c* bank;
|
|
|
|
keyframe = &sample->keyframe;
|
|
cKF_SkeletonInfo_R_ct(keyframe, &cKF_bs_r_hnw, &cKF_ba_r_hnw_move, sample->work_area, sample->morph_area);
|
|
cKF_SkeletonInfo_R_init_standard_stop(keyframe, &cKF_ba_r_hnw_move, NULL);
|
|
Ac_Sample_ct_forCorect(actor, game);
|
|
|
|
sample->draw_action = 1;
|
|
bank = &play->object_exchange.banks[actor->data_bank_id];
|
|
sample->obj_bank_ram_start = bank->ram_start;
|
|
}
|
|
|
|
extern u8 hnw_tmem_txt[];
|
|
extern u16 hnw_face[];
|
|
|
|
static void Ac_Sample_Actor_draw_normal(SAMPLE_ACTOR* actor, GAME_PLAY* play) {
|
|
cKF_SkeletonInfo_R_c* keyframe = &actor->keyframe;
|
|
Mtx* m = GRAPH_ALLOC_TYPE(play->game.graph, Mtx, keyframe->skeleton->num_shown_joints);
|
|
|
|
if (m != NULL) {
|
|
GRAPH* g;
|
|
Gfx* gfx;
|
|
_texture_z_light_fog_prim(play->game.graph);
|
|
|
|
g = play->game.graph;
|
|
OPEN_DISP(g);
|
|
gfx = NOW_POLY_OPA_DISP;
|
|
|
|
gDPLoadTextureBlockS(
|
|
gfx++,
|
|
hnw_tmem_txt, G_IM_FMT_I, G_IM_SIZ_8b,
|
|
64, 64,
|
|
0,
|
|
G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP,
|
|
7, 7,
|
|
G_TX_NOLOD, G_TX_NOLOD
|
|
);
|
|
gDPLoadTLUT_pal16(gfx++, 15, hnw_face); // pal is different
|
|
gDPSetTextureLUT(gfx++, G_TT_RGBA16);
|
|
|
|
SET_POLY_OPA_DISP(gfx);
|
|
CLOSE_DISP(g);
|
|
|
|
cKF_Si3_draw_R_SV((GAME*)play, keyframe, m, NULL, NULL, NULL);
|
|
}
|
|
}
|
|
|
|
static void Ac_Sample_Actor_draw(ACTOR* actor, GAME* game) {
|
|
static Ac_Sample_Actor_PROC proc[] = { (Ac_Sample_Actor_PROC)&none_proc2, &Ac_Sample_Actor_draw_normal };
|
|
|
|
SAMPLE_ACTOR* sample = (SAMPLE_ACTOR*)actor;
|
|
GAME_PLAY* play = (GAME_PLAY*)game;
|
|
|
|
if (sample->draw_action < 0 || sample->draw_action >= 2 || proc[sample->draw_action] == NULL) {
|
|
return;
|
|
}
|
|
|
|
(*proc[sample->draw_action])(sample, play);
|
|
}
|
|
|
|
ACTOR_PROFILE Sample_Profile = {
|
|
mAc_PROFILE_SAMPLE,
|
|
ACTOR_PART_BG,
|
|
0,
|
|
MISC_ACTOR_SAMPLE,
|
|
ACTOR_OBJ_BANK_12,
|
|
sizeof(SAMPLE_ACTOR),
|
|
&Ac_Sample_Actor_ct,
|
|
&Ac_Sample_Actor_dt,
|
|
&Ac_Sample_Actor_main,
|
|
&Ac_Sample_Actor_draw,
|
|
NULL
|
|
};
|