Files
ac-decomp/src/ac_museum_fossil.c
T
2024-02-27 21:03:56 -05:00

134 lines
5.2 KiB
C

#include "ac_museum_fossil.h"
#include "m_camera2.h"
#include "m_demo.h"
#include "m_name_table.h"
#include "m_museum_display.h"
#include "m_name_table.h"
#include "sys_matrix.h"
#include "m_player_lib.h"
#include "m_room_type.h"
#include "m_msg.h"
#include "m_common_data.h"
typedef struct {
s16 x;
s16 z;
} aMF_pos_c;
typedef struct {
aMF_pos_c pos;
int direct;
} aMF_fossil_data_c;
static void Museum_Fossil_Actor_ct(ACTOR* actorx, GAME* game);
static void Museum_Fossil_Actor_dt(ACTOR* actorx, GAME* game);
static void Museum_Fossil_Actor_move(ACTOR* actorx, GAME* game);
static void Museum_Fossil_Actor_draw(ACTOR* actorx, GAME* game);
ACTOR_PROFILE Museum_Fossil_Profile = {
mAc_PROFILE_MUSEUM_FOSSIL,
ACTOR_PART_BG,
ACTOR_STATE_CAN_MOVE_IN_DEMO_SCENES | ACTOR_STATE_NO_DRAW_WHILE_CULLED | ACTOR_STATE_NO_MOVE_WHILE_CULLED,
EMPTY_NO,
ACTOR_OBJ_BANK_KEEP,
sizeof(MUSEUM_FOSSIL_ACTOR),
&Museum_Fossil_Actor_ct,
&Museum_Fossil_Actor_dt,
&Museum_Fossil_Actor_move,
&Museum_Fossil_Actor_draw,
NULL,
};
static aMF_fossil_data_c aMF_fossil_data_table[mMmd_FOSSIL_NUM] = {
{ 6, 3, mRmTp_DIRECT_SOUTH }, { 2, 3, mRmTp_DIRECT_SOUTH }, { 4, 3, mRmTp_DIRECT_SOUTH },
{ 9, 3, mRmTp_DIRECT_SOUTH }, { 13, 3, mRmTp_DIRECT_SOUTH }, { 11, 3, mRmTp_DIRECT_SOUTH },
{ 6, 11, mRmTp_DIRECT_SOUTH }, { 2, 11, mRmTp_DIRECT_SOUTH }, { 4, 11, mRmTp_DIRECT_SOUTH },
{ 10, 6, mRmTp_DIRECT_SOUTH }, { 13, 6, mRmTp_DIRECT_SOUTH }, { 11, 6, mRmTp_DIRECT_SOUTH },
{ 6, 6, mRmTp_DIRECT_WEST }, { 6, 5, mRmTp_DIRECT_WEST }, { 6, 7, mRmTp_DIRECT_WEST },
{ 9, 11, mRmTp_DIRECT_SOUTH }, { 11, 11, mRmTp_DIRECT_SOUTH }, { 13, 11, mRmTp_DIRECT_SOUTH },
{ 3, 8, mRmTp_DIRECT_EAST }, { 3, 6, mRmTp_DIRECT_EAST }, { 6, 8, mRmTp_DIRECT_SOUTH },
{ 7, 8, mRmTp_DIRECT_SOUTH }, { 8, 8, mRmTp_DIRECT_SOUTH }, { 9, 8, mRmTp_DIRECT_SOUTH },
{ 10, 8, mRmTp_DIRECT_SOUTH },
};
static void Museum_Fossil_Actor_ct(ACTOR* actorx, GAME* game) {
// nothing
}
static void Museum_Fossil_Actor_dt(ACTOR* actorx, GAME* game) {
// nothing
}
static void Museum_Fossil_Actor_draw(ACTOR* actorx, GAME* game) {
// nothing
}
static void aMF_SetTalkInfo(ACTOR* actorx) {
static rgba_t aMP_window_color = { 255, 255, 205, 255 };
MUSEUM_FOSSIL_ACTOR* museum_fossil = (MUSEUM_FOSSIL_ACTOR*)actorx;
mDemo_Set_msg_num(museum_fossil->msg_no);
mDemo_Set_talk_display_name(FALSE);
mDemo_Set_ListenAble();
mDemo_Set_camera(CAMERA2_PROCESS_NORMAL);
mDemo_Set_use_zoom_sound(TRUE);
mDemo_Set_talk_window_color(&aMP_window_color);
mMsg_Set_continue_msg_num(mMsg_Get_base_window_p(), -1);
}
static void Museum_Fossil_Actor_move(ACTOR* actorx, GAME* game) {
static u8 item_name[mIN_ITEM_NAME_LEN];
MUSEUM_FOSSIL_ACTOR* museum_fossil = (MUSEUM_FOSSIL_ACTOR*)actorx;
if (mDemo_Check(mDemo_TYPE_SPEAK, actorx)) {
PLAYER_ACTOR* player = GET_PLAYER_ACTOR((GAME_PLAY*)game);
s_xyz angle = player->actor_class.shape_info.rotation;
add_calc_short_angle2(&angle.y, museum_fossil->target_angle, 1.0f - sqrtf(0.7), 0x800, 0);
GET_PLAYER_ACTOR_NOW()->Set_force_position_angle_proc(gamePT, NULL, &angle, mPlayer_FORCE_POSITION_ANGLE_ROTY);
} else if (chkTrigger(BUTTON_A) && mDemo_Get_talk_actor() == NULL) {
xyz_t pos;
s16 angle;
int i;
for (i = 0; i < mMmd_FOSSIL_NUM; i++) {
int donator = mMmd_FossilInfo(i);
int res;
pos.x = (aMF_fossil_data_table[i].pos.x & 0xF) * 40.0f + 20.0f;
pos.z = (aMF_fossil_data_table[i].pos.z & 0xF) * 40.0f + 20.0f;
pos.y = 40.0f;
res = mRmTp_CheckTalkAble(&angle, &pos, aMF_fossil_data_table[i].direct, 42.5f, (GAME_PLAY*)game);
if (res != FALSE) {
museum_fossil->msg_no = (donator == mMmd_DONATOR_NONE)
? 0x2FA1
: ((donator == mMmd_DONATOR_DELETED_PLAYER) ? 0x2FA0 : 0x2F9F);
museum_fossil->target_angle = angle;
if (mDemo_Request(mDemo_TYPE_SPEAK, actorx, &aMF_SetTalkInfo)) {
if (mMmd_IS_DONATED(donator)) {
mActor_name_t item = (i >= 0 && i < mMmd_FOSSIL_NUM)
? (mActor_name_t)(FTR_DINO_START + (mActor_name_t)(i << 2))
: FTR_DINO_START;
/* Copy the art item's name */
mIN_copy_name_str(item_name, item);
mMsg_Set_item_str_art(mMsg_Get_base_window_p(), mMsg_ITEM_STR0, item_name, mIN_ITEM_NAME_LEN,
mIN_get_item_article(item));
/* If the donator still lives in town we need to copy their name */
if (mMmd_DONATOR_EXISTS(donator)) {
mMsg_Set_free_str(mMsg_Get_base_window_p(), mMsg_FREE_STR0,
Save_Get(private[mMmd_DONATOR_PLR_IDX(donator)]).player_ID.player_name,
PLAYER_NAME_LEN);
}
}
break;
}
}
}
}
}