Merge pull request #262 from Cuyler36:ac_museum_fossil

Implement & link ac_museum_fossil
This commit is contained in:
Cuyler36
2024-02-27 21:04:11 -05:00
committed by GitHub
5 changed files with 240 additions and 97 deletions
+5
View File
@@ -426,6 +426,11 @@ ac_haniwa.c:
.text: [0x80427624, 0x80428F64]
.rodata: [0x806440B8, 0x806440F8]
.data: [0x80683D08, 0x80683E98]
ac_museum_fossil.c:
.text: [0x8042EDC0, 0x8042F170]
.rodata: [0x806442A0, 0x806442D0]
.data: [0x80684D48, 0x80684E38]
.bss: [0x812FBE60, 0x812FBE70]
ac_museum_picture.c:
.text: [0x8042F170, 0x8042F7FC]
.rodata: [0x806442D0, 0x80644330]
+6 -1
View File
@@ -8,6 +8,12 @@
extern "C" {
#endif
typedef struct museum_fossil_actor_s {
ACTOR actor_class;
s16 target_angle;
int msg_no;
} MUSEUM_FOSSIL_ACTOR;
extern ACTOR_PROFILE Museum_Fossil_Profile;
#ifdef __cplusplus
@@ -15,4 +21,3 @@ extern ACTOR_PROFILE Museum_Fossil_Profile;
#endif
#endif
+95 -95
View File
@@ -9,95 +9,95 @@
#define mRmTp_FTR_UNIT_MAX 4
enum {
mRmTp_FTRSIZE_1x1, /* x */
mRmTp_FTRSIZE_1x2, /* yy OR y */
/* y */
mRmTp_FTRSIZE_2x2, /* zz */
/* zz */
mRmTp_FTRSIZE_NUM
mRmTp_FTRSIZE_1x1, /* x */
mRmTp_FTRSIZE_1x2, /* yy OR y */
/* y */
mRmTp_FTRSIZE_2x2, /* zz */
/* zz */
mRmTp_FTRSIZE_NUM
};
enum birth_type {
mRmTp_BIRTH_TYPE_GRP_A = 0,
mRmTp_BIRTH_TYPE_GRP_B = 1,
mRmTp_BIRTH_TYPE_GRP_C = 2,
mRmTp_BIRTH_TYPE_EVENT = 3,
mRmTp_BIRTH_TYPE_BIRTHDAY = 4,
mRmTp_BIRTH_TYPE_HALLOWEEN = 5,
mRmTp_BIRTH_TYPE_HANIWA = 6,
mRmTp_BIRTH_TYPE_LOTTERY = 7,
mRmTp_BIRTH_TYPE_FTR_CLOTH = 8,
mRmTp_BIRTH_TYPE_FTR_UMBRELLA = 9,
mRmTp_BIRTH_TYPE_FTR_INSECT = 10,
mRmTp_BIRTH_TYPE_FTR_FISH = 11,
mRmTp_BIRTH_TYPE_SINGLE_FOSSIL = 12,
mRmTp_BIRTH_TYPE_MULTI_FOSSIL = 13,
mRmTp_BIRTH_TYPE_XMAS = 14,
mRmTp_BIRTH_TYPE_SANTA = 15,
mRmTp_BIRTH_TYPE_UNOBTAINABLE = 16,
mRmTp_BIRTH_TYPE_SNOWMAN = 17,
mRmTp_BIRTH_TYPE_HALLOWEEN_TRICK = 18,
mRmTp_BIRTH_TYPE_POST_OFFICE = 19,
mRmTp_BIRTH_TYPE_MARK_ROOM = 20,
mRmTp_BIRTH_TYPE_SONCHO = 21,
mRmTp_BIRTH_TYPE_JONASON = 22,
mRmTp_BIRTH_TYPE_UNUSED_23 = 23,
mRmTp_BIRTH_TYPE_FAMICOM_EREADER = 24,
mRmTp_BIRTH_TYPE_ISLAND = 25,
mRmTp_BIRTH_TYPE_FAMICOM_ISLAND = 26,
mRmTp_BIRTH_TYPE_MY_ORIGINAL = 27,
mRmTp_BIRTH_TYPE_FAMICOM_CODE = 28,
mRmTp_BIRTH_TYPE_MUSEUM = 29,
mRmTp_BIRTH_TYPE_SONCHO_LIGHTHOUSE_QUEST = 30,
mRmTp_BIRTH_TYPE_FTR_DIARY = 31,
mRmTp_BIRTH_TYPE_GROUNDHOG = 32,
mRmTp_BIRTH_TYPE_KAMAKURA = 33,
mRmTp_BIRTH_TYPE_NINTENDO_CODE = 34,
mRmTp_BIRTH_TYPE_HARVEST_FESTIVAL = 35,
mRmTp_BIRTH_TYPE_UNUSED_36 = 36,
mRmTp_BIRTH_TYPE_SUMMER_CAMPER = 37,
mRmTp_BIRTH_TYPE_GRP_A = 0,
mRmTp_BIRTH_TYPE_GRP_B = 1,
mRmTp_BIRTH_TYPE_GRP_C = 2,
mRmTp_BIRTH_TYPE_EVENT = 3,
mRmTp_BIRTH_TYPE_BIRTHDAY = 4,
mRmTp_BIRTH_TYPE_HALLOWEEN = 5,
mRmTp_BIRTH_TYPE_HANIWA = 6,
mRmTp_BIRTH_TYPE_LOTTERY = 7,
mRmTp_BIRTH_TYPE_FTR_CLOTH = 8,
mRmTp_BIRTH_TYPE_FTR_UMBRELLA = 9,
mRmTp_BIRTH_TYPE_FTR_INSECT = 10,
mRmTp_BIRTH_TYPE_FTR_FISH = 11,
mRmTp_BIRTH_TYPE_SINGLE_FOSSIL = 12,
mRmTp_BIRTH_TYPE_MULTI_FOSSIL = 13,
mRmTp_BIRTH_TYPE_XMAS = 14,
mRmTp_BIRTH_TYPE_SANTA = 15,
mRmTp_BIRTH_TYPE_UNOBTAINABLE = 16,
mRmTp_BIRTH_TYPE_SNOWMAN = 17,
mRmTp_BIRTH_TYPE_HALLOWEEN_TRICK = 18,
mRmTp_BIRTH_TYPE_POST_OFFICE = 19,
mRmTp_BIRTH_TYPE_MARK_ROOM = 20,
mRmTp_BIRTH_TYPE_SONCHO = 21,
mRmTp_BIRTH_TYPE_JONASON = 22,
mRmTp_BIRTH_TYPE_UNUSED_23 = 23,
mRmTp_BIRTH_TYPE_FAMICOM_EREADER = 24,
mRmTp_BIRTH_TYPE_ISLAND = 25,
mRmTp_BIRTH_TYPE_FAMICOM_ISLAND = 26,
mRmTp_BIRTH_TYPE_MY_ORIGINAL = 27,
mRmTp_BIRTH_TYPE_FAMICOM_CODE = 28,
mRmTp_BIRTH_TYPE_MUSEUM = 29,
mRmTp_BIRTH_TYPE_SONCHO_LIGHTHOUSE_QUEST = 30,
mRmTp_BIRTH_TYPE_FTR_DIARY = 31,
mRmTp_BIRTH_TYPE_GROUNDHOG = 32,
mRmTp_BIRTH_TYPE_KAMAKURA = 33,
mRmTp_BIRTH_TYPE_NINTENDO_CODE = 34,
mRmTp_BIRTH_TYPE_HARVEST_FESTIVAL = 35,
mRmTp_BIRTH_TYPE_UNUSED_36 = 36,
mRmTp_BIRTH_TYPE_SUMMER_CAMPER = 37,
mRmTp_BIRTH_TYPE_NUM
mRmTp_BIRTH_TYPE_NUM
};
enum {
mRmTp_DIRECT_SOUTH,
mRmTp_DIRECT_EAST,
mRmTp_DIRECT_NORTH,
mRmTp_DIRECT_WEST,
mRmTp_DIRECT_SOUTH,
mRmTp_DIRECT_EAST,
mRmTp_DIRECT_NORTH,
mRmTp_DIRECT_WEST,
mRmTp_DIRECT_NUM
mRmTp_DIRECT_NUM
};
enum {
mRmTp_FTR_SE_NONE,
mRmTp_FTR_SE_SOFT_CHAIR,
mRmTp_FTR_SE_HARD_CHAIR,
mRmTp_FTR_SE_BUBU_CHAIR,
mRmTp_FTR_SE_TOILET_CHAIR,
mRmTp_FTR_SE_NONE,
mRmTp_FTR_SE_SOFT_CHAIR,
mRmTp_FTR_SE_HARD_CHAIR,
mRmTp_FTR_SE_BUBU_CHAIR,
mRmTp_FTR_SE_TOILET_CHAIR,
mRmTp_FTR_SE_NUM
mRmTp_FTR_SE_NUM
};
enum {
mRmTp_CHAIR_ACTION_SIT,
mRmTp_CHAIR_ACTION_STAND,
mRmTp_CHAIR_ACTION_SIT,
mRmTp_CHAIR_ACTION_STAND,
mRmTp_CHAIR_ACTION_NUM
mRmTp_CHAIR_ACTION_NUM
};
typedef struct room_type_place_info_one_s {
int exists;
int ut_x;
int ut_z;
int exists;
int ut_x;
int ut_z;
} mRmTp_FtrPlaceInfoOne_t;
#define FTR_NUM 1266
#define FTR_GET_ROTATION(f) ((f) & 3)
#define FTR_GET_ROTATION(f) ((f)&3)
#define FTR_IDX_2_NO(f) ((f) >> 2)
#define FTR_NO_2_IDX(f) ((f) << 2)
#define FTR_NO_ROT_2_IDX(f, rot) (FTR_NO_2_IDX(f) | ((rot) & 3))
#define FTR_NO_ROT_2_IDX(f, rot) (FTR_NO_2_IDX(f) | ((rot)&3))
// TEMPORARY. Should be generated with .decl files
#define ITEM0_NO_START 0x0000
@@ -106,41 +106,41 @@ typedef struct room_type_place_info_one_s {
#define FTR0_NO_START 0x1000
#define ITEM1_NO_START 0x2000
#define ITEM1_0_NO_START ITEM0_1_NO_START // paper
#define ITEM1_1_NO_START ITEM1_NO_START + 0x100 // money
#define ITEM1_2_NO_START ITEM1_NO_START + 0x200 // tools
#define ITEM1_3_NO_START ITEM1_NO_START + 0x300 // fish
#define ITEM1_4_NO_START ITEM1_NO_START + 0x400 // clothing
#define ITEM1_5_NO_START ITEM1_NO_START + 0x500 // etc
#define ITEM1_6_NO_START ITEM1_NO_START + 0x600 // carpets
#define ITEM1_7_NO_START ITEM1_NO_START + 0x700 // wallpaper
#define ITEM1_8_NO_START ITEM1_NO_START + 0x800 // food
#define ITEM1_9_NO_START ITEM1_NO_START + 0x900 // seeds
#define ITEM1_A_NO_START ITEM1_NO_START + 0xA00 // mini disks
#define ITEM1_B_NO_START ITEM1_NO_START + 0xB00 // diaries
#define ITEM1_C_NO_START ITEM1_NO_START + 0xC00 // tickets
#define ITEM1_D_NO_START ITEM1_NO_START + 0xD00 // insects
#define ITEM1_E_NO_START ITEM1_NO_START + 0xE00 // hukubukuro
#define ITEM1_F_NO_START ITEM1_NO_START + 0xF00 // kabu
#define ITEM1_0_NO_START ITEM0_1_NO_START // paper
#define ITEM1_1_NO_START ITEM1_NO_START + 0x100 // money
#define ITEM1_2_NO_START ITEM1_NO_START + 0x200 // tools
#define ITEM1_3_NO_START ITEM1_NO_START + 0x300 // fish
#define ITEM1_4_NO_START ITEM1_NO_START + 0x400 // clothing
#define ITEM1_5_NO_START ITEM1_NO_START + 0x500 // etc
#define ITEM1_6_NO_START ITEM1_NO_START + 0x600 // carpets
#define ITEM1_7_NO_START ITEM1_NO_START + 0x700 // wallpaper
#define ITEM1_8_NO_START ITEM1_NO_START + 0x800 // food
#define ITEM1_9_NO_START ITEM1_NO_START + 0x900 // seeds
#define ITEM1_A_NO_START ITEM1_NO_START + 0xA00 // mini disks
#define ITEM1_B_NO_START ITEM1_NO_START + 0xB00 // diaries
#define ITEM1_C_NO_START ITEM1_NO_START + 0xC00 // tickets
#define ITEM1_D_NO_START ITEM1_NO_START + 0xD00 // insects
#define ITEM1_E_NO_START ITEM1_NO_START + 0xE00 // hukubukuro
#define ITEM1_F_NO_START ITEM1_NO_START + 0xF00 // kabu
#define FTR1_NO_START 0x3000
enum {
mRmTp_LIGHT_SWITCH_HOUSE0_MAIN_UPPER,
mRmTp_LIGHT_SWITCH_HOUSE0_BASEMENT,
mRmTp_LIGHT_SWITCH_HOUSE1_MAIN_UPPER,
mRmTp_LIGHT_SWITCH_HOUSE1_BASEMENT,
mRmTp_LIGHT_SWITCH_HOUSE2_MAIN_UPPER,
mRmTp_LIGHT_SWITCH_HOUSE2_BASEMENT,
mRmTp_LIGHT_SWITCH_HOUSE3_MAIN_UPPER,
mRmTp_LIGHT_SWITCH_HOUSE3_BASEMENT,
mRmTp_LIGHT_SWITCH_COTTAGE_MY,
mRmTp_LIGHT_SWITCH_9,
mRmTp_LIGHT_SWITCH_NPC,
mRmTp_LIGHT_SWITCH_LIGHTHOUSE,
mRmTp_LIGHT_SWITCH_TENT,
mRmTp_LIGHT_SWITCH_HOUSE0_MAIN_UPPER,
mRmTp_LIGHT_SWITCH_HOUSE0_BASEMENT,
mRmTp_LIGHT_SWITCH_HOUSE1_MAIN_UPPER,
mRmTp_LIGHT_SWITCH_HOUSE1_BASEMENT,
mRmTp_LIGHT_SWITCH_HOUSE2_MAIN_UPPER,
mRmTp_LIGHT_SWITCH_HOUSE2_BASEMENT,
mRmTp_LIGHT_SWITCH_HOUSE3_MAIN_UPPER,
mRmTp_LIGHT_SWITCH_HOUSE3_BASEMENT,
mRmTp_LIGHT_SWITCH_COTTAGE_MY,
mRmTp_LIGHT_SWITCH_9,
mRmTp_LIGHT_SWITCH_NPC,
mRmTp_LIGHT_SWITCH_LIGHTHOUSE,
mRmTp_LIGHT_SWITCH_TENT,
mRmTp_LIGHT_SWITCH_NUM
mRmTp_LIGHT_SWITCH_NUM
};
extern int mRmTp_ItemNo2FtrSize(mActor_name_t item_no);
@@ -160,7 +160,7 @@ extern mActor_name_t mRmTp_GetPlayerRoomCollisionIdx(mActor_name_t field_id, mAc
extern int mRmTp_FurnitureIdx2FurnitureKind(int ftr_idx);
extern void mRmTp_CopyWallData(u8* dst, int wall_no);
extern void mRmTp_CopyFloorData(u8* dst, int floor_no);
extern int mRmTp_CheckTalkAble(s16* rot, xyz_t* pos, f32 max_dist, int required_dir, GAME_PLAY* play);
extern int mRmTp_CheckTalkAble(s16* rot, xyz_t* pos, int required_dir, f32 max_dist, GAME_PLAY* play);
extern int mRmTp_CheckWallIsMyOriginalInThisScene();
extern int mRmTp_CheckFloorIsMyOriginalInThisScene();
extern int mRmTp_GetEntranceBasePosition(xyz_t* pos);
+133
View File
@@ -0,0 +1,133 @@
#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;
}
}
}
}
}
+1 -1
View File
@@ -2154,7 +2154,7 @@ extern void mRmTp_CopyFloorData(u8* dst, int floor_no) {
}
}
extern int mRmTp_CheckTalkAble(s16* rot, xyz_t* pos, f32 max_dist, int required_dir, GAME_PLAY* play) {
extern int mRmTp_CheckTalkAble(s16* rot, xyz_t* pos, int required_dir, f32 max_dist, GAME_PLAY* play) {
static int direct_table[16] = { mRmTp_DIRECT_NORTH, -1, -1, mRmTp_DIRECT_WEST,
mRmTp_DIRECT_WEST, -1, -1, mRmTp_DIRECT_SOUTH,
mRmTp_DIRECT_SOUTH, -1, -1, mRmTp_DIRECT_EAST,